Слайд 1Простые и составные операторы
Если ветвь условной конструкции или тело цикла
содержит несколько операторов, то они объединяются в составной оператор при
помощи “{“ и “}”.
Begin в Паскале соответствует “{“ в Си, End - “}”.
Слайд 2Пример. Нахождение суммы первых 20 натуральных чисел и вывод сумм
на экран.
#include
#include
using namespace std;
int main()
{int sum=0; //сумма
int c=0;
//счетчик
while (c++<20) //увеличение после сравнения
{
sum=sum+c; // или sum+=c
printf ("sum=%d\n", sum);
}
return 0;
}
Слайд 3Условная конструкция.
Различают три формы условной конструкции :
простейшая (в Паскале -
if … then… );
расширенная (в Паскале - if … then
… else … );
выбор (в Паскале - case … of… ).
Слайд 4Простейшая условная конструкция.
Псевдокод :
если то
все
Си
if ()
В отличие
от Паскаля выражение может иметь любой тип. 0, ‘\0’ и
NULL считаются ложью, остальные значения - истиной.
Слайд 5Расширенная условная конструкция
Псевдокод :
если то
иначе
все
Си
if()
else
Слайд 6Примеры.
if(a>b&&b>c)
f=x*x-1;
else
f=x+1;
‘;’ перед else является частью оператора присваивания в ветви if.
if(x>5||x
else
{
n++;
z[n]=x;
}
Слайд 7Отличия от Паскаля:
1. Выражение обязательно заключается в скобки.
2. ”;” ставится перед
else, если только нет составного оператора. (“;”- часть ).
3. Другой приоритет
вычисления логического выражения
- сначала операции отношения
- затем логические операции !, &&, || (не, и, или).
Приоритет операций отношения меньше, чем у операций “+” и “-” и больше, чем у операции присваивания:
х>у+2 то же, что и х>(у+2).
Слайд 8 Допускается вложенность операторов if. Если нет составного оператора, else относится
к ближайшему if.
Рассмотрим пример.
if (number>6)
if (number
printf ("Конец игры!\n");
else
printf ("Потеря хода!\n");
Слайд 9 Если необходимо, чтобы else соответствовал первому if, добавим { }.
Рассмотрим пример.
if (number>6)
{
if (number
("Конец игры!\n");
}
else
printf ("Потеря хода!\n");
Слайд 10Операция условия - сокращённый способ записи if- else (тернарная).
В общем
виде условное выражение записывается следующим образом:
Например:
x=(y
х=y;
Условное выражение удобно использовать в тех случаях, когда некоторой переменной надо присвоить одно из двух возможных значений, например:
max = (а > b)?a:b;
(<условие>)?<значение если истинно>:<значение если ложно>;
Слайд 11Множественный выбор: switch и break
switch () /*выражение может быть
типа int или char*/
{
case : //операторы могут
отсутствовать
case <константа 2>: <операторы 2> //константы типа int или char
…
default: <операторы>
//ветвь не обязательна
}
Если значение выражения совпадает с одной из констант, выполняются операторы, расположенные после соответствующей константы.
Если подходящей метки не найдется, то, если существует строка с меткой "default", будет выполняться оператор, помеченный этой меткой. В противном случае произойдет переход к оператору, расположенно-му за оператором switch.
Слайд 12В каждой последовательности операторов последним должен быть оператор break.
Выполнение
оператора break осуществляет выход из оператора switch и переход к
следующему за ним оператору.
При отсутствии оператора break будут выполнены все операторы, начиная с помеченного данной меткой и заканчивая оператором default.
char ch='1';
switch (ch)
{
case '1': printf ("один\n");
case '2': printf ("два \n");
default : printf ("три \n");
}
один
два
три
Слайд 13В качестве меток-констант используются выражения типа int или char.
В качестве
метки запрещается использовать переменную.
Можно пометить оператор несколькими метками одновременно. Например,
case
'E':
case 'е': printf ("ель\n"); break;
Слайд 14Пример. Игра в города
#include
#include
using namespace std;
int main()
{setlocale(LC_ALL, "RUS");
char
ch;
printf (“Введите букву а, б или в. \n");
printf ("Я назову
город на эту букву\n");
scanf("%c", &ch);
switch (ch)
{case 'a': printf ("\n Ашхабад"); break;
case ‘б': printf ("\n Белгород"); break;
case 'в': printf ("\n Воронеж"); break;
default: printf ("\n неизвестная буква"); break;
}
return 0;
}
Слайд 15Правила выбора условных операторов
Выбор из двух возможностей - выполнить оператор
или пропустить его - оператор if.
Выбор одного из двух вариантов
- if...else.
Выбор одного из нескольких - else-if, switch.
Если выбор вариантов основывается на вычислении значения переменной или выражения типа float, то switch применить нельзя.
Если значения переменной попадают в некоторый диапазон, использовать switch неудобно. Лучше записать:
if (i <1000 && i>2).
Слайд 16Циклы
Существует три базовых структуры цикла:
цикл-пока (с
предусловием)
(в Паскале - while … do…);
цикл-до (с постусловием)
(в
Паскале – repeat …until …);
цикл от … до (со счетчиком)
(в Паскале - for … to/downto do …).
Слайд 17Цикл-пока (while)
Псевдокод
цикл-пока
кц
Си
while ()
, где
- любого типа.
Пока значение
выражения отлично от 0 (т.е.истинно), повторяется выполнение операторов в теле
цикла.
Оператор может быть простым или составным.
while является циклом с предусловием, поэтому возможно, что он не выполнится ни разу.
Слайд 18Пример 1. Напечатать целые числа от 1 до 100 и
их квадраты.
/*Здесь и в следующих примерах пропущены операторы
#include
#include
using
namespace std;
*/
int main()
{
setlocale(LC_ALL,"RUS");
int n=0;
printf("число квадрат");
while(n++<100)
printf("%6d %6d\n",n,n*n);
return 0;
}
Слайд 19Пример 2. Сколько членов гармонического ряда S=1+1/2+1/3+...+1/n надо взять, чтобы
получить сумму, большую числа dano?
int main()
{
int i=0;
float dano, S=0.0;
printf ("введите
число"); scanf("%f",&dano);
while (dano<=0.0)
{
printf("повторите ввод");
scanf ("%f", &dano);
}
while (S<=dano)
S+=1.0/(float)(++i);
printf (“число членов ряда=%d\n",i);
return 0;
}
Слайд 20Цикл for
Псевдокод
цикл от i:= до [ шаг ]
кц
Си
for
(; ; )
Слайд 21,где
– инициализирующее: вычисляется один раз до начала
цикла;
– проверяемое: вычисляется перед каждым выполнением оператора. Тело
цикла выполняется, если значение проверяемого выражения истина (или не равно нулю);
<выражение 3> – корректирующее: вычисляется после каждого выполнения тела цикла.
Перед первым выполнением цикла проверяется <выражение 2>, т.е. тело цикла может не выполниться ни разу!
Любое выражение, а также оператор может отсутствовать, но точка с запятой сохраняется.
Слайд 22Оператор for эквивалентен следующей последовательности операторов:
;
while()
{
;
}
Слайд 23Пример 1. Найти сумму n членов гармонического ряда S=1+1/2+1/3+...+1/n.
Операция «запятая»
связывает два выражения в одно и гарантирует, что самое левое
будет вычисляться первым. Обычно используется для включения дополнительной информации в спецификацию цикла for, например:
<выражение 1>, < выражение 2>
Значением всего выражения является значение <выражения 2> .
a) s=0.0;
for(i=1;i<=n;i++)
S=S+1.0/(float)i;
b) for (i=1, S=0.0; i<=n; i++)
S+=1.0/(float)i;
Слайд 24 Пример 2. Найти минимальное n, при котором S=1+1/2+1/3+...+1/n >
dano.
for (n=0, S=0.0; S
обязательно использует параметр цикла.
c) for (i=1, S=0.0; i<=n; S+=1.0/(float)i++);
//Здесь пустой цикл.
Это не очень хороший стиль программирования - лучше не смешивать процесс изменения переменной цикла с алгебраическими вычислениями.
Слайд 25Пример 3. Счет в порядке убывания
for(n=10;n>0;n--)
printf ("%d секунд
!\n", n);
printf("пуск!\n");
Можно использовать любое значение шага цикла, например:
for(n=2; n
printf("%d\n",n);
На экране получим 2 15 28 41 54.
Слайд 26Пример 4. Переменная цикла может быть не только числом, но
и символом.
for(ch='a';ch
При выполнении этого оператора будут выведены на печать все буквы от а до z и их коды ASCII.
Пример 5. Можно пропустить одно или более выражений, но при этом нельзя пропустить символ “;”.
ans=2; for (n=3; ans<=25;) ans=ans*n;
for(;;) printf ("работаю\n");
Тело этого цикла будет выполняться бесконечное число раз, поскольку пустое условие всегда считается истинным.
Слайд 27Следующие записи эквивалентны:
while ()
и
for (; ;)
Применение операторов
for или while -дело вкуса. Цикл for предпочтительнее, когда в
цикле используется инициализация и коррекция переменной, в остальных случаях лучше использовать while.
Возможно изменение параметров, входящих в проверяемое и корректирующее выражения, в теле цикла.
Слайд 28Пример 6. Вложенные циклы.
Вычислить все совершенные числа, меньшие или равные
заданному числу smax.
Совершенное число равно сумме своих делителей, исключая
делитель, равный самому числу.
6=1+2+3.
Слайд 29int main()
{int n, sum, del, smax;
printf ("введите предел");
scanf
("%d", &smax);
printf ("совершенное число\n");
for(n=6; n
sum= 1;
for(del=2; del if(n%del==0) sum+=del;
if (sum==n) printf(“%5d”,n);
}
return 0;
}
Слайд 30Цикл с постусловием do…while
Псевдокод
цикл
до
кц
Си
do
while()
Тело цикла всегда выполняется хотя
бы один раз. Выполнение цикла продолжается до тех пор, пока
выражение не станет ложным (равным 0).
В Паскале - наоборот, цикл продолжается пока выражение не станет истинным.
Слайд 31Пример.Найти минимальное число членов гармонического ряда с S > dano
i
= 0; S=0.0;
do
S+=1.0/(float)++i;
while (S< = dano);
При
помощи этого цикла можно организовать ввод данных с проверкой их правильности, например.
do {
printf ("введите положительное число");
scanf("%f”, &dano);
}
while (dano < =0);
Слайд 32Управляющие операторы
break, continue, goto
По возможности следует избегать их использования.
Все эти операторы предназначены для безусловного перехода.
Частое применение этих операторов
- признак низкой квалификации программиста и слабого владения структурным программированием.
Слайд 33break - выход из ближайшего цикла любого вида или switch
и переход к следующему оператору программы.
do {…
for(...)
{… while( … )
{ …
if (…) break; /*выход из цикла while*/
…
}
<оператор 1>
if(…) break; /*выход из цикла for*/
…
}
<оператор 2>;
if (…) break; /*выход из цикла do while*/
…
} while(…);
<оператор 3 >
Слайд 34continue - окончание текущей итерации данного цикла.
В циклах while
и do … while происходит переход к проверке условия продолжения
цикла.
В цикле for – переход к вычислению корректирующего выражения, а затем к проверке.
for (<выражение 1>;
< выражение2>; <выражение3>)
{
while(…)
{…
continue;
…
}
…
continue;
}
Слайд 35 Оператор goto
goto метка;
Метка должна быть
идентификатором, например: goto m1;
Допускается использовать в одном случае - выход
из вложенного набора циклов при обнаружении каких-либо ошибок.
for (…)
for (…)
for (…)
{
if (<ошибка>)
goto Code; <операторы>
}
…
Code:<операторы для исправления ошибки>