Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

Теперь при первом взгляде на код сразу можно определить, к какому if относится else. Еще один пример:

i n t a=6,b=4,c=5;

i f( a< b)

 

i f (Ь<с)

 

i f (с<3)

 

а=Ь+с;

 

e l s e

 

b++;

 

с — ;

Ответ: а = 6, Ъ= 4, с = 4.

Здесь else относится к if(с <Ъ). Для того чтобы else относился к оператору if(b < с) или if(a < b), нужно соответствующим обра­ зом расставить фигурные скобки:

i n t а=6, Ь=4, с=5;

int a=6,b=4,c=5;

i f (а<Ь)

if(a<b)

i f (Ь<с)

{ if(b<c)

{ i f( c< 3)

if(с<3)

a=b+c;

а=Ь+с;

}

}

e l s e

e l s e

b++;

b++;

с — ;

с— ;

Ответ: а —6, b = 4, с = 4.

Ответ: а = 6, Ъ= 5, с = 4.

Рассмотрим применение такой конструкции:

if (условие 1) действие 1; if (условие 2) действие 2; if (условие 3) действие 3;

дальнейший код

Если сработает, например, условие 7, то выполнится дейст­ вие 1. После этого пойдет проверка остальных условий, и, наконец, программа перейдет на дальнейший код. Однако, если проверка

всех последующих условий по смыслу решаемой задачи не нужна, то можно применить конструкцию if-else-if:

if (условие 1) действие 1;

else if (условие 2) действие 2; else if (условие 3) действие 3;

else if (условие N) действие N; дальнейший код

Теперь при срабатывании условия 1 выполнится действие 7, однако благодаря наличию ветки else проверка остальных условий не будет выполнена и программа сразу перейдет на дальнейший код. Таким образом, применение конструкции if-else-if позволит несколько сэкономить время выполнения программы.

Пример. Решить квадратное алгебраическое уравнение.

#include<conio.h>

#include<stdio.h>

#include<math.h> main()

{float a,b,c; //коэффициенты уравнения

float D,xl,x2; //дискриминант и корни уравнения printf("Введите a, b, с: ");

scanf("%f%f%f",&a, &b, &c) ;

D= b*b-4*a*c;

if (D<0) printf("Решения нет");

else i f (D==0) {xl = -b/(2*a);

printf("xl=x2=%f"/xl);

}

else

{xl = ( - b - s q r t ( D ) ) / (2 * a ); x2 = ( - b + s q r t( D ) ) / (2 * a );

p r i n t f ("xl=%f\nx2=%f" rx l , x2);

}

getch();

return 0;

}

Отметим, что в данном примере третий вариант получается методом исключения (если D < 0 ложно и если D == 0 ложно, то D > 0), поэтому достаточно написать else вместо else if(D > 0).

В качестве условия также может использоваться выражение.

if(sqrt(a+b) > х*у)

{а += pow(x/y); b *= а;

}

Варианты условий

if (a)

if(sqrt(S +P))

if(pow(x+y,3)+sin(x-y) )

b += 2;

b += 2;

b += 2;

следует читать так: если выражение в круглых скобках равно 0 (например, sqrt(S+P) ), то условие ложно, т.е. Ь+ = 2 не выполня­ ется (иначе - выполняется).

4.2.Операции отношения и логические операции

Операции отношения используются для сравнения. Полный список операций отношения в языке Си следующий:

<меньше

<= меньше ши равно

>больше

>= больше ши равно

==равно

!= не равно

Вязыке Си имеются три логические операции:

&&и

||ши

Логическое и означает, что все условие истинно только тогда, когда каждое из условных выражений истинно.

int a=3,b=2;

if (а!=5 && Ь>=4)

с=2;

В данном примере условное выражение а ! = 5 истинно, так как а = 3, но условное выражение b >= 4 ложно, поэтому в целом условие if(а != 5 && Ь>= 4) тоже будет ложно и действие с = 2 выполнено не будет.

Логическое или означает, что все условие истинно только то­ гда, когда хотя бы одно из условных выражений истинно.

int a=3,b=2;

if (а!=5 || Ь>=4)

с=2;

Условное выражение а != 5 истинно, а условное выражение Ъ >= 4 ложно, т.е. хотя бы одно из условных выражений истинно, поэтому в целом условие if(а !—5 || b >= 4) тоже будет истинно и действие с = 2 будет выполнено.

Логическое не означает, что условие в целом ложно, если ус­ ловное выражение было истинным, и, наоборот, условие в целом истинно, если условное выражение было ложным.

int a=2,b=5;

if (Iа)

Ь++;

Переменная а отлична от нуля, поэтому условное выражение истинно, но оператор ! меняет его на противоположное. Таким об­ разом, условие ifp.a) ложно и действие 6++ не будет выполнено.

int а=2,Ь=5;

i f (!(а-2))

Ь++;

Выражение а - 2 равно нулю, т.е. ложно, но оператор ! меняет его на противоположное. Таким образом, условие if(\(a - 2)) ис­ тинно и действие 6++ будет выполнено.

Все рассмотренные нами операции, включая арифметические, имеют следующий приоритет:

(тип)

I

* / %

+

> > = < < =

&&

I I

=*= /= %= += -=

Основные ошибки и недостатки при работе

слогическими операциями и операциями отношений

1.Не используют логические операции && и ||. Например, необходимо запрограммировать условие а <Ъ < с.

Вариант

1: if(a<b<c)

//ОШИБКА!

Вариант

2: if(a<b,b<c)

//ОШИБКА!

Вариант

3: if(a<b && b<c)

//ПРАВИЛЬНО!

2. Не используют другие операции

отношения. Например,

нужно проверить, попадает ли заданное число а в диапазон от 20 до 23.

Вариант 1: if(а==20 || а==21 || а==22 || а==23)

Вариант 2: if(a>=20 && а<=23)

Вариант 1 правильный, но слишком длинный, вариант 2 го­ раздо лучше.

3. Вместо логического равно = = используют присваивание =.

Вариант 1: int x=3,b=10;

i f (х=20)

Ь++;

Вариант 2: i n t x = 3 ,b = 1 0 ; if ( x = = 2 0 ) b++;

В варианте 1 вместо проверки на равенство переменной х бу­ дет присвоено 20, поскольку условное выражение отлично от нуля (х = 20, а не 0), то оно истинно, а значит, выполнится действие 6++, чего быть не должно. Вариант 2 правильный.

Если у вас возникают трудности в понимании того, какой из этих операторов нужно использовать в том или ином месте про­ граммы, то применение оператора = можно мысленно заменить фразой «присвоить», а оператора = = фразой «равно ли?».

 

4.3. Операция «условие»

? :

Операция

«условие» -

единственная

операция языка Си,

имеющая три операнда. Она имеет вид

 

условие

? выражение 1

выражение 2

Сначала проверяется условие. Если условие истинно, то вы­ числяется выражение 1. Если ложно, то вычисляется выражение 2. Операцию «условие» удобно применять для нахождения наиболь­ шего из двух чисел:

int max,х=5,у=4;

шах = х>у ? х: у;

или для нахождения абсолютной величины числа:

abs = х>=0 ? х: -х;

Если второй и третий операнды являются переменными, то им можно присваивать значения прямо в операции ?

Пример. Наибольшее из двух чисел заменить значением 4.

int х=15, у=19;

х>у ? х=4

у=4;

printf("%d %d",х,у);

Оператор switch позволяет провести анализ некоторого выра­ жения и в зависимости от его значения выполнить те или иные действия. Формат записи оператора switch следующий:

switch(выражение выбора) {case значение 1:

действие 1; break;

case значение 2: действие 2; break;

case значение N: действие N; break;

default: действие по умолчанию;

)

Сначала вычисляется выражение выбора в скобках за ключе­ вым словом switch. Затем просматривается список значений. Если найдено значение, равное выражению выбора, то выполняется действие, следующее за двоеточием. Если выражение выбора не соответствует ни одному из значений, то выполняется действие, следующее за ключевым словом default (от англ, по умолчанию). Программист сам решает, нужно ли ему действие по умолчанию,

т.е. строки default: действие по умолчанию; может не быть.

Выражение выбора должно быть целочисленным ти­

пом (int или char). Нельзя использовать выражения, возвра­ щающие действительные числа или строки.

Тип char, по сути, тоже является целочисленным, поскольку любой символ имеет свой код из целых чисел (например, символ ‘s’ в кодировке Windows имеет код 115).

Пример. Определить, какая клавиша была нажата.

Решение через if-elae

#include<conio.h>

#include<stdio.h> main()

{char a;

puts("Нажмите s, d или t"); a=getche();

p u t s ; //перевод курсора в новую строку

if (а == ’s ’)

s");

puts("Вы нажали

else i f (а == 1d*)

puts("Вы нажали

d");

else if(a == 1t 1)

puts("Вы нажали

t");

else

другую клавишу");

puts("Вы нажали

getch() ; return 0;

}

Решение через switch

#include<conio.h>

#include<stdio.h>

main() {char a;

puts("Нажмите s, d или t"); a=getche();

puts(""); //перевод курсора в новую строку switch(а)

{case 1s 1:

puts("Вы нажали s"); break;

case *d 1:

puts("Вы нажали d"); break;

case 11 *:

puts("Вы нажали t"); break;

default:

puts("Вы нажали другую клавишу");

}

getch();

return 0;

}

Оператор break осуществляет прерывание выполнения опера­ тора switch. Без оператора break эта конструкция будет работать неправильно. Исправьте предыдущий пример и посмотрите, как стала работать программа.

#include<conio.h>

#include<stdio.h>

main() {char a;

puts("Nagmite s, d ili t"); a=getche();

puts(""); //перевод курсора в новую строку

switch(а) {case *s *:

puts("Вы нажали s"); case 'd' :

puts("Вы нажали d"); case 1t 1:

puts("Вы нажали t"); default:

puts("Вы нажали другую клавишу");

getch() ;

return 0;

}

Если нажать s, то программа напечатает

Вы нажали s

Вы нажали d

Вы нажали t

Вы нажали другую клавишу

хотя мы ожидали, что программа напечатает только

Вы нажали s

Блок-схема: оператор switch с оператором break: