
- •Программирование на языках высокого уровня. Алгоритмические языки
- •Содержание
- •Разработка (проектирование) одномодульных программ
- •Представление информации в языке Си
- •Массивы
- •УказатеЛи
- •Выражения и операции
- •Управляющие операторы
- •Функции
- •Типы данных, определяемые пользователем
- •Приемы программирования
- •Приложение 2. Арифметические основы компьютеров
- •Литература
Управляющие операторы
В простейшей программе операторы выполняются последовательно, т.е. ровно один раз и в том порядке, как они встречаются в тексте программы. Однако в реальных программах операторы могут повторяться или выполняться только при определенном условии. Для создания программ нелинейной структуры используются управляющие операторы.
К управляющим операторам относятся следующие операторы:
Операторы ветвления:
условный оператор – if else – реализует алгоритмические структуры АЛЬТЕРНАТИВА и ВЫБОР (см. Приложение 1);
оператор выбора – switch – частично реализует алгоритмическую структуру ВЫБОР (см. Приложение 1);
Операторы цикла:
цикл с предусловием – while – реализует алгоритмическую структуру ЦИКЛ С ПРЕДУСЛОВИЕМ (см. Приложение 1);
цикл с постусловием – do while – реализует алгоритмическую структуру ЦИКЛ С ПОСТУСЛОВИЕМ (см. Приложение 1);
цикл с параметром – for – реализует алгоритмическую структуру ПАРАМЕТРИЧЕСКИЙ ЦИКЛ (см. Приложение 1).
Условный оператор (if else)
Условный оператор if используется для разветвления процесса вычислений на два направления, соответственно он реализует алгоритмическую структуру АЛЬТЕРНАТИВА, блок-схема которой выглядит следующим образом:
|
|
Формат оператора:
if(<Условие>) { <Оператор 1> } else { <Оператор 2> } |
if(<Условие>) { <Оператор 1> }
|
Если <Условие> истинно, то выполняется <Оператор 1>, иначе выполняется <Оператор 2>.
Пример использования условного оператора для разветвления процесса вычислений на два направления:
// Вычисление модуля y= |x|
int x, y;
if(x < 0) { y= -x; }
else { y= x; }
Оператор if также используется для реализации алгоритмической структуры ВЫБОР (см. блок-схему ниже), когда невозможно использовать оператор выбора switch (об этом далее).
Использование уловного оператора для реализации алгоритмической структуры ВЫБОР:
if(<Условие 1>) { <Оператор 1> } if(<Условие 2>) { <Оператор 2> } ............... if(<Условие M>) { <Оператор M> } |
if(<Условие 1>) { <Оператор 1> } else if(<Условие 2>) { <Оператор 2> } ............... else if(<Условие M>) { <Оператор M> } else { <Оператор M+1> } |
Пример использования условного оператора для реализации алгоритмической структуры ВЫБОР:
// Вычисление y= sign(x) – более простой способ реализации
if(x < 0) { y= -1; }
if(x == 0) { y= 0; }
if(x > 0) { y= 1; }
// Вычисление y= sign(x) – более эффективный способ реализации
if (x < 0) { y= -1; }
else if(x == 0) { y= 0; }
else if(x > 0) { y= 1; }
Оператор выбора (switch) + оператор прерывания (break)
Оператор switch (выбор) предназначен для разветвления процесса вычислений на несколько направлений. Данный оператор реализует алгоритмическую структуру ВЫБОР. Однако он имеет ограниченное применение, т.к. в нем нельзя задавать произвольные условия. Условия в операторе switch имеют следующую структуру <Выражение> == <Константа>.
Формат оператора:
switch(<Выражение>)
{
case <Константа 1>:
<Оператор 1>
break;
case <Константа 2>:
<Оператор 2>
break;
...
case <Константа M>:
<Оператор M>
break;
default:
<Оператор M+1>
}
Если <Выражение> принимает значение равное <Константа 1>, то выполняется <Оператор 1>; если <Выражение> принимает значение равное <Константа 2>, то выполняется <Оператор 2> и т.д. Если <Выражение> принимает значение отличное от указанных констант, то выполняется <Оператор M+1>.
Пример использования оператора выбора:
// Анализ ответа пользователя
char Answer;
scanf(“%с”, &Answer);
switch(Answer)
{
case ‘1’:
printf(“\nВы нажали 1”);
break;
case ‘2’:
printf(“\nВы нажали 2”);
break;
default:
printf(“\nВы нажали что-то не то”);
}
Оператор break прерывает выполнение оператора switch. Если бы его не было, то все операторы внутри switch выполнялись бы последовательно друг за другом. Например, так:
// Анализ ответа пользователя
char Answer;
scanf(“%с”, &Answer);
switch(Answer)
{
case ‘1’:
printf(“\nВы нажали 1”);
case ‘2’:
printf(“\nВы нажали 2”);
default:
printf(“\nВы нажали что-то не то”);
}
При вводе пользователем символа ‘2’ на экране появятся два сообщения:
“Вы нажали 2”
“Вы нажали что-то не то”
Окончание занятия №16 (лекция) |
Оператор цикла с предусловием (while)
Оператор используется для организации многократно повторяющихся вычислений, которые могут не выполниться ни разу. Оператор while реализует алгоритмическую структуру ЦИКЛ С ПРЕДУСЛОВИЕМ, блок-схема которой приведена ниже. Данная алгоритмическая структура используется, когда заранее неизвестно количество итераций (повторений), и возможно отсутствие повторений.
Формат оператора:
while(<Условие>)
{
<Оператор>
}
Сначала проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор> до тех пор, пока <Условие> не станет ложным. Если <Условие> стало ложным, то управление передается оператору, следующему за циклом. <Условие> – это условие продолжения цикла, <Оператор> – это тело цикла (повторяющееся действие + действие для выхода из цикла).
Замечание. <Оператор> может не выполниться ни разу, если <Условие> изначально ложно.
Пример использования оператора с предусловием:
// Подсчитать количество символов в строке String
char String[]= “Это пример”;
int Count;
Count = 0; // подготовка
while(String [Count]!=‘\0’) // условие продолжения
{ Count++; } // тело цикла (повторяющееся действие +
// действие для выхода из цикла)
В данном примере цикл не выполнится ни разу, если строка String будет пустой.
Рассмотрим еще один пример, в котором используется оператор while, но правильнее использовать оператор do while:
// Ввод русской буквы
char RussianLetter;
scanf(“%c”, &RussianLetter); // подготовка
while((RussianLetter < ‘A’) ||
(RussianLetter > ‘я’)) // условие продолжения
{ scanf(“%c”, &RussianLetter); } // тело цикла (повторяющееся действие + // действие для выхода из цикла)
Оператор цикла с постусловием (do while)
Оператор используется для организации многократно повторяющихся вычислений, которые выполняются хотя бы один раз. Оператор do while реализует алгоритмическую структуру ЦИКЛ С ПОСТУСЛОВИЕМ, блок-схема которой приведена ниже. Данная алгоритмическая структура используется, когда заранее неизвестно количество итераций, но хотя бы одна итерация выполняется всегда (например, если в цикле производится ввод данных).
Формат оператора:
do
{
<Оператор>
}
while(<Условие>);
Сначала выполняется <Оператор>, затем проверяется <Условие>. Если <Условие> истинно, то снова выполняется <Оператор>. Это продолжается до тех пор, пока <Условие> не станет ложным.
Замечание. <Оператор> всегда выполняется хотя бы один раз.
Пример использования цикла с постусловием:
// Запрашиваем у пользователя число от 0 до 10
// подготовка отсутствует
do
{ scanf(“%d”, &Number); } // тело цикла (повторяющееся действие +
// действие для выхода из цикла)
while((Number < 0)||(Number > 10)); // условие продолжения
В примере используется цикл do while, т.к. число сначала вводится, а затем осуществляется его проверка.
Обратите внимание, что после оператора while ставится точка с запятой ;.
Оператор цикла с параметром (for)
Оператор используется для организации многократно повторяющихся вычислений и по своей сути аналогичен циклу while, но имеет более компактную запись. Оператор for реализует алгоритмическую структуру ПАРАМЕТРИЧЕСКИЙ ЦИКЛ, блок-схемы которой приведены ниже. Данная алгоритмическая структура используется, когда заранее известно количество итераций.
|
|
Формат оператора:
for(<Оператор инициализации>; <Условие>; <Оператор модификации>)
{
<Оператор>
}
Сначала выполняется <Оператор инициализации> и проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор>. Затем выполняется <Оператор модификации> и снова проверяется <Условие>. Если <Условие> истинно, то выполняется <Оператор> и т.д. Цикл завершается, когда <Условие> становится ложным.
Замечание. Цикл for как и цикл while может не выполниться ни разу.
Пример использования цикла с параметром:
// Вычисление факториала y = n!
int n= 5;
int y;
int i;
y = 1; // подготовка
for(i= 1; i <= n; i++) // оператор инициал.; условие; оператор модификации
{ y= y*i; } // тело цикла (повторяющееся действие)
В данном примере еще до выполнения цикла известно, что переменная i должна изменяться в диапазоне от 1 до n.
А теперь рассмотрим, как та же задача решается с использованием цикла while:
// Вычисление факториала y = n!
int n = 5;
int y;
int i;
y = 1; // подготовка
i= 1; // подготовка (оператор инициализации)
while(i <= n) // условие продолжения
{
y= y*i; // повторяющееся действие
i++; // действие для выхода из цикла (оператор модификации)
}
Данный пример показывает, что использование цикла while усложняет код программы, а потому предпочтительнее использовать цикл for, когда заранее известно количество выполняемых итераций.
Окончание занятия №17 (лекция) |