Самой простой базовой структурой является цепочка – последовательность операторов присваивания.
Цепочку можно представить следующей схемой:
Основное свойство цепочки – очередной оператор цепочки будет выполнен после выполнения всех предыдущих операторов, то есть все операторы цепочки выполняются последовательно друг за другом.
Алгоритм циклического обмена в этом случае будет выглядеть следующим образом:
Переменные a и b обмениваются своими значениями через переменную x.
По этому алгоритму можно написать последовательность операторов на Си:
x = a;
a = b;
b = x;
Одним из достоинств компьютеров является их способность делать выбор пути решения задачи в зависимости от выполнения заданных условий.
Выбор пути решения осуществляется в алгоритмических языках ветвлениями, которые могут быть представлены в двух формах:
· альтернатива,
· переключатель.
Альтернатива является простейшей формой ветвлений. Она предполагает выбор одного из двух путей решения задачи, причем этот выбор зависит от выполнения заданных условий:
истина (да)ложь (нет)
Альтернативу можно описать словесно:
В альтернативе может отсутствовать часть (ветвь) ИНАЧЕ, тогда она приобретает вид усеченной альтернативы:
В альтернативе в качестве условия используется логическое выражение, которое, как известно, может быть истинным или ложным.
Действие альтернативы:
1. проверяется выполнение условия,
2. если условие истинно, то выполняется следующая за ним цепочка-1, а цепочка-2, если она имеется, не выполняется,
3. если условие ложно, то выполняется цепочка-2, если она имеется.
В Си альтернатива реализуется условным оператором:
где условие – это любое логическое выражение (обязательно ставится в скобки).
В каждой ветке альтернативы может следовать только один оператор языка, причем перед else точка с запятой ставитсяобязательно.
Примеры:
1. определить значения переменной z после выполнения операторов:
z = 3;
if (x – z > 0) в данном случае условиеложно, поэтому
z = z – 1; будетвыполняться ветвь else, и, значит,
else z = z + 1; z = 4
2. определить наибольшую из двух переменных a и b, присвоив ее значение переменной с:
данет
Словесное описание алгоритма:
ЕСЛИ (a > b)
ТО c = a
ИНАЧЕ c = b;
Реализуем этот алгоритм на Си:
if (a > b)
c = a;
else c = b;
3. решить эту же задачу сокращенной альтернативой:
а)двумя сокращенными альтернативами:
if (a > b)
c = a;
if (b > a)
c = b;
б)одной сокращенной альтернативой:
c = b;
if (a > b)
c = a;
Реализация альтернативы усложняется, если в каждой ее ветви имеется не по одному оператору, а по цепочке операторов. В этом случае цепочки заключаются в фигурные скобки:
sin c,если c < 2,5
a =
cos c,если c ≥ 2,5
| c |,если c < 2,5
b = 1/c, если c ≥ 2,5
На Си:
if (c < 2.5) Внимание!Перед служебным словом
{ elseставится точка с запятой!
a=sin(c);
b=fabs(c);
}
{
a=cos(c);
b=1.0/c;
}
Еще раз необходимо обратить внимание на то, что в Си после закрывающей фигурной скобки точка с запятой не ставится, а перед ней – обязательно.
В каждой ветви условного оператора if могут в свою очередь стоять новые операторы if , что дает возможность использовать вложение операторов if до любого уровня:
Примеры:
1. определить наибольшую из трех переменных x, y,z и присвоить ее значение переменной s:
а) с использованием полной альтернативы:
ЕСЛИ (x > y) if (x > y)
ТО ЕСЛИ (x > z) if (x > z)
ТО s = x s=x;
ИНАЧЕ s = z else s=z;
ИНАЧЕ ЕСЛИ (y > z) else if (y > z)
ТО s = y s=y;
ИНАЧЕ s = z; else s=z;
б) с использованием усеченной альтернативы: вариант 1
s = z; s = z;
ЕСЛИ (x > y) if (x > y)
ТО ЕСЛИ (x > z) if (x > z)
ТО s = x; s=x;
ЕСЛИ (y > x) if (y >x)
ТО ЕСЛИ (y > z) if (y > z)
ТО s = y; s=y;
вариант 2 – с использованием операции конъюнкции
s = z; s = z;
ЕСЛИ (x > y) & (x > z) if ((x > y) && (x > z))
ТО s = x; s=x;
ЕСЛИ (y > x) & (y > z) if ((y >x) && (y > z))
ТО s = y; s=y;
2. по заданной дате (день, месяц, год) определить день недели, приходящийся на нее:
#include <stdio.h>
#include <conio.h>
#include <math.h>
{
printf(“\nВведите день: ”);
scanf(“%d”, &day);
printf(“\nВведите месяц: ”);
scanf(“%d”, &month);
printf(“\nВведите год: ”);
scanf(“%d”, &year);
c=0;
y1=year/100;
y2=year-y1*100;
if ((y2==0) && (y1%4==0))
c=1;
if ((y2!=0) && (y2%4)==0))
c=1;
if ((c==1) && (month==1) ||(month==2))
if ((c==0) && (month==1) || month==2))
c=ceil(365.25*y2) + ceil(30.56*month) + day + kl;
c %= 7;
c += 3;
if (c==1)
printf(“\nЭто понедельник”);
if (c==2)
printf(“\nЭто вторник”);
if (c==3)
printf(“\nЭто среда”);
if (c==4)
printf(“\nЭто четверг”);
if (c==5)
printf(“\nЭто пятница”);
if (c==6)
printf(“\nЭто суббота”);
if (c==7)
printf(“\nЭто воскресенье”);
}
По принятому в Си соглашению, ветвь else всегда относится к ближайшему предшествующему ему незанятому if:
if (n>0)
if (m % n > 2)
else m += n;
else m %= n;
В данном случае ветвь else m += n относится к if (m % n > 2), а ветвь else m %= n относится к if (n > 0).
При переходе с Паскаля на Си программисты часто допускают ошибки при формировании условия в операторе if, путая две операции:
= присваивания и
== сравнения:
if (a==b)
printf(“\nЭти величины равны между собой”);
else printf(“\nЭти величины не равны между собой”);
Это правильное сравнение значений двух переменных.
Перепишем это сравнение с ошибкой (компилятором не определяется):
if (a=b)
printf(“\nЭти величины равны между собой”);
else printf(“\nЭти величины не равны между собой”);
В этом случае сначала переменной a будет присвоено значение переменной b, а потом будет проверено, какое именно значение присвоено. Если это значение отлично от нуля (неложь), то выведется сообщение:
Если это значение равно нулю (ложь) – то сообщение: