Операторы управления программой
Оператор “выражение”
Любое выражение, завершающееся точкой с запятой, рассматривается как оператор, выполнение которого заключается в вычислении выражения. Частным случаем выражения является пустой оператор ; (он используется, когда по синтаксису оператор требуется; а по смыслу — нет). Примеры:
i++; // выполняется операция инкремента
а* = b + с; // выполняется умножение с присваиванием
fund(k); // выполняется вызов функции
На схеме алгоритма
Операторы выбора
Оператор if
Стандартная форма оператора ifследующая:
if (выражение) оператор;
[else оператор;]
где оператор может простым, или составным. Надо помнить, что в языке С составной оператор – это группа операторов, заключенных в фигурные скобки. Оператор else не обязателен.
Если выражение истинно (любое значение, кроме 0), выполняется блок операторов, следующий за if; иначе выполняется блок операторов, следующий за else. Всегда выполняется код, ассоциированный или с if, или с else, но никогда не выполняются оба кода одновременно.
На схеме алгоритма
Пример. написать программу проверяющую попадает ли точка с координатами (х,у) в заштрихованную область
-2
Запишем условие попадания в виде неравенств
х2+у2<=1 или{х<=0 и у<=0 и х+у>=-2
#include <stdio.h>
int main(void)
{
float x,y;
printf(“Введите ваше числa: “);
scanf(“%f%f”, &x,&y);
if(x*x+y*y<=1 || x<=0 && y<=0 && x+y>=-2) printf(“Попадает”);
else printf(“Не попадает”);
return 0;
}
ВНИМАНИЕ!
Распространенная ошибка при записи условных операторов — использование в выраженияхвместо проверки на равенство(==) простого присваивания (=), например,
if(a=-l)b=0;
Синтаксической ошибки нет, так как операция присваивания формирует результат, которыйи оценивается на равенство/неравенство нулю. В данном примере присваивание переменной b будет выполнено независимо от значения переменной а.
Вторая ошибка — неверная запись проверкина принадлежность диапазону.Например, чтобыпроверить условие 0<х<1. нельзя записать его в условном операторе непосредственно, так как будет выполнено сначаласравнение 0<х, а его результат (true или false, преобразованное в int) будет сравниваться с 1. Правильный способ записи: if(0<x && х<1)„
Вложенные if. Под вложенным if подразумевается оператор if, имеющий еще один ifили else., проблематичность вложенности операторов if заключается в трудностях идентификации: какое else соответствует какому if. Например:
if (x)
if (y) printf(“1”);
else printf(“2”);
Какому ifсоответствует какое else?
Для разрешения такого рода проблем существует правило: В С else соответствует ближайшему предшествующему if (на том же уровне видимости), еще не имеющему оператора else. В данном случае else связан с оператором if(y). Для того, чтобы связать else с оператором if(x), следует использовать фигурные скобки, как показано ниже:
if (x) {
if (y) printf(“1”);
}
else printf(“2”);
Лесенка if-else-if. Типичной программистской конструкцией является лесенка if-else-if. Она выглядит следующим образом:
if(выражение)
оператор;
else if(выражение)
оператор;
else if(выражение)
оператор;
.
.
.
[else
оператор;]
Условия вычисляются сверху вниз. Когда обнаруживается истинное условие, то выполняется оператор, связанный с этим условием, а остальная часть конструкции игнорируется. Если не найдено ни одного истинного условия, выполняется оператор, соответствующий последнему else. Последний оператор else часто играет роль оператора, выполняемого по умолчанию, то есть, если все условия ложны, то выполняется оператор, соответствующий последнему else. Если последний оператор else отсутствует, то не выполняется никаких действий в случае ложности всех условий.
#include <stdio.h>
/* программа «угадай число 4» */
int main(void)
{
int magic = 123; /* искомое число */
int guess;
printf(“Введите ваше число: “);
scanf(“%d”, &guess);
if(guess == magic) {
printf(“Правильно”);
printf(“%d есть угаданное число”,magic);
}
else if(guess > magic) {
printf(“Неправильно. Больше”);
else printf(“Неправильно. Меньше”);
return 0;
}
Оператор ?. Оператор ? может использоваться для замены стандартной конструкции if/else:
Ограничением в данном случае является использование единственного выражения как после if, так и после else.
Оператор ? называется триадным (тернарным) оператором, поскольку ему требуется три операнда и имеет следующий вид:
выражение_1 ? выражение_2 : выражение_3
где выражение_1, выражение_2 и выражение_3 – это выражения.
Оператор ? работает следующим образом. Вычисляется выражение_1. Если оно истинно, вычисляется выражение_2 и вся конструкция получает вычисленное выражение. Если выражение_1 ложно, вычисляется выражение_3 и вся конструкция получает вычисленное выражение. Например:
x = 10;
y = x>9 ? 100 : 200;
В данном примере у получает значение 100. Если бы х было меньше 9, то у получило бы значение 200. Ниже приведен фрагмент программы, выполняющий такие же действия, но с использованием операторов if/else:
x = 10;
if(x>9) y = 100;
else y = 200;
Оператор принятия решений switch
Хотя конструкция if-else-if может выполнять многочисленные проверки, она не очень элегантна. Код очень труден для восприятия. С этой целью язык С++ имеет оператор принятия решений switch, выполняющий действия, основываясь на сравнении значения со списком констант символов или целых чисел. При обнаружении выполняется оператор или операторы, ассоциированные с данным значением. Оператор switch имеет следующий вид:
switch (выражение) {
case константа_1 :
последовательность_операторов
break;
case константа_2 :
последовательность_операторов
break;
case константа_3 :
последовательность_операторов
break;
.
.
[default :
последовательность_операторов]
}
Оператор default выполняется, если не найдено соответствий. default необязателен и, если его нет, то в случае отсутствия совпадений ничего не происходит. Когда обнаруживается совпадение, операторы, ассоциированные с соответствующим case, выполняются до тех пор, пока не встретится оператор break. В случае default (или последнего case, если отсутствует default), оператор switch заканчивает работу при обнаружении конца.
Следует знать о трех важных моментах оператора switch:
1) switch отличается от if тем, что он может выполнять операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
2) Не может быть двух констант в одном операторе switch, имеющих одинаковые значения, но константы должны иметь один тип. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
3) Если в операторе switch используются символьные константы, они автоматически преобразуются к символьным значениям.
4) если выходbreak из switch явно не указан, последовательно выполняются все остальные ветви.
Пример
#include <stdio.h>
#include <conio.h>
void main(void)
{
int a,b,z;
char znak;
printf(“Введите значение а операцию(+,-,*,/,%)и b, \n”);
scanf("%d%c%d",&a,&znak,&b);
switch(znak) {
case ‘+’:z=a+b;break;
case ‘-’:z=a-b;break;
case ‘*’:z=a*b;break;
case ‘/’:z=a/b;break;
case ‘%’:z=a%b;break;
default :printf(“НеДопустимая операция”);
}
if ((znak=='+')||(znak=='-')||(znak=='*')||(znak=='/')||(znak=='%'))
printf("a %c b = %d",znak,z);
}
Если необходимо выполнить одни и те же действия при нескольких различных значения констант, метки перечисляются одна за одной:
#include <stdio.h>
#include <conio.h>
void main(void)
{
int key;
printf(“Нажмите одну из курсорных клавиш\n”);
key=getch();key=getch();
switch(key) {
case 77: case 75:case 72:case 80: printf(“Strelki”);break;
default :printf(“ Ne strelki”);
}
}
Вложенные операторы switch. Один оператор switch может иметь среди последовательности операторов другой оператор switch. Даже если константы caseвнутреннего и внешнего операторов имеют одинаковые значения, не возникнет никакого конфликта. Следующий фрагмент программы совершенно корректен:
switch (x) {
case 1:
switch (y) {
case 0: printf(“Ошибка. Деление на ноль.”);
break;
case 1: process(x, y);
}
break;
case 2:
.
Операторы цикла
В языке С и в других современных языках программирования операторы цикла (итераций) позволяют выполнять набор инструкций до тех пор, пока не выполнится некоторое условие.
Оператор цикла for
Стандартный вид цикла for следующий:
for(инициализация; условие; Модификации) тело цикла;
Оператор for имеет три главные части:
1) Инициализация – это место, где обычно находится оператор присваивания, используемый для установки начального значения переменной цикла.
2) Условие – это место, где находится выражение, определяющее условие работы цикла.
3) Модификации выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла.
Эти три важные части разделяются точкой с запятой. Цикл for работает до тех пор, пока условие истинно. Когда условие становится ложным, выполнение программы продолжается с оператора, следующего за циклом for.
На схеме алгоритма
Пример (программа печатает таблицу значений функции y=х2+l во введенном диапазоне):
finclude <stdio.h>
int main()
{
float Xn, Xk, Dx. X;
printf("BBedite диапазон и шаг изменения аргумента: ");
scanf(“%f%f%f”, &Хn, &Xk, &Dx);
printf(“| X | У |\n);
for (X = Xn; X<=Xk: X += Dx)
printf('| %5.2f | %5.2f |\n", X, X*X + 1);
return 0;
}
В программе переменная x изначально установлена в Xn. Поскольку x меньше Xk, вызывается функция printf()для вывода текущего значения x,y, после чего x увеличивается на Dx и проверяется условие: по-прежнему ли x меньше либо равно Dx. Данный процесс продолжается до тех пор, пока x не станет больше Dx, и в этот момент цикл прервется. В данном примере x является переменной цикла, которая изменяется и проверяется на каждой итерации цикла.
Ниже приведен пример цикла for, повторяющего сразу несколько операторов:
for(x=100; x!=65; x-=5)
{ z = sqrt(x);
printf(“Корень квадратный из %d равен %f\n);
}
Как sqrt(), так и printf(), вызываются и выполняются, пока x не равно 65. Следует обратить внимание, что в цикле переменная x уменьшается: сначала она получает значение 100 и на каждой итерации цикла происходит уменьшение на 5.
Дата добавления: 2017-01-13; просмотров: 1040;