Цикл с параметром (счетчиком, с управляющей переменной)
Переключатель
Используется для выбора одного из многих путей.
6.3.1. Формат записи в Паскале:
Case S of
K1:ОператорныйБлок1;
K2: ОператорныйБлок2;
. . .
Kn: ОператорныйБлокn;
Else ОператорныйБлок;
End;
Здесь S – селектор, любое выражение порядкового типа; К1, К2, …, Кn – константы выбора, константа, тип которой совпадает с типом селектора.
Принцип работы оператора: вычисляется выражение селектора. Вычисленное значение последовательно сравнивается с константами альтернатив и передается управление оператору константа выбора, которого совпадает с вычисленным значением селектора. Выполняется оператор и передается управление за пределы оператора выбора. Если вычисленное значение селектора не совпадает ни с одной из констант, то управление передается на ветвь Else,наличие которой, не обязательно в этом случаеуправление передается за пределы оператора выбора.
Структуру оператора выбора можно реализовать с помощью вложенных условных операторов, но это ухудшает наглядность программы. Рекомендуется не более 2-3 уровней вложений.
Пример. Составить программу вычисления функции y для заданного значения x.
где: a=2,8; ; 0< x < 0.5; Dx=0,01.
Текст программы
program gcase;
uses crt;
var
a,b,x,y :real;
n :integer;
begin
clrscr;
a:=2.8; b:=5.1E-2;
writeln('Результат':20);
writeln('n':3,'x':10,'y':15);
x:=0;
repeat
n:=trunc(10*x+1);
write(n:3);
case n of
1:y:=1+exp(a*x);
2:y:=a+ln(a+b);
3:y:=b*sqr(x);
4:y:=a-sqrt(abs(a*b/2));
5:y:=1+a*b*x;
end;
writeln(' ':10,x:5:3,' ':5,y:9);
x:=x+0.05;
until x>=0.5;
Readln;
end.
6.3.1. Формат записи в С++:
switch (условие)
{
case константа: инструкции
case константа: инструкции
case константа: инструкции
…
case константа: инструкции
default: инструкции
}
Каждая ветвь case может быть помечена одной или несколькими целочисленными константами или же константными выражениями. Выполняется та ветвь case, для которой константа (выражение) совпала с условием, указанным в начале переключателя switch. Если выяснилось, что ни одна из констант не подходит, то выполняется ветвь default. Если этой ветви нет, то ничего не выполняется.
Условие, следующее за ключевым словом switch в круглых скобках, может быть любым выражением, допустимыми в языке программирования С, значение которого должно быть целым.
Значение этого выражения является ключевым для выбора из нескольких вариантов. Тело оператора switch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным выражением. Константное выражение может быть одно или их может быть несколько, кроме того, возможно использование целочисленных констант. Следует отметить, что использование целого константного выражения является существенным недостатком, присущим рассмотренному оператору.
Так как константное выражение вычисляется во время компиляции, оно не может содержать переменные или вызовы функций. Обычно в качестве константного выражения используются целые или символьные константы.
Все константные выражения в операторе switch должны быть уникальны. Ветвь default может отсутствовать. Ветви case и default могут располагаться в любом порядке.
Список операторов (инструкций) может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.
Отметим также, что в операторе switch можно использовать свои локальные переменные, объявления которых находятся перед первым ключевым словом case, однако в объявлениях не должна использоваться инициализация.
Схема выполнения оператора switch следующая:
- вычисляется выражение в круглых скобках;
- вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;
- если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словом case;
- если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.
В конце каждой ветви достаточно часто ставится инструкция break. Это связано с тем, что после выполнения одной ветви программа проверяет возможность выполнения остальных "ниже" находящихся ветвей. Инструкция break вызывает немедленный выход из переключателя switch.
Для того, чтобы выполнить одни и те же действия для различных значений выражения, можно пометить один и тот же оператор несколькими ключевыми словами case.
Рассмотрим работу оператора switch на примерах.
Пример 1.
Условие задачи: написать программу, которая складывает, вычитает, умножает, делит два числа введенных с клавиатуры.
| #include <iostream>
int main()
{
int count; // переменная для выбора в switch
double a,b; // переменные для хранения операндов
cout << "Vvedite pervoe chislo: "; cin >> a;
cout << "Vvedite vtoroe chislo: "; cin >> b;
cout << "Vibirite deistvie: 1-+; 2- -; 3-*; 4- /";
cin >> count;
switch (count) // начало оператора switch
{
case 1: // если count = 1
{// выполнить сложение
cout << a << " + " << b << " = " << a + b << endl;
break;
}
case 2: // если count = 2
{// выполнить вычитание
cout << a << " - " << b << " = " << a - b << endl;
break;
}
case 3: // если count = 3
{// выполнить умножение
cout << a << " * " << b << " = " << a * b << endl;
break;
}
case 4: // если count = 4
{// выполнить деление
cout << a << " / " << b << " = " << a / b << endl;
break;
}
default: // если count равно любому другому значению
cout << "Nepravilni vvod" << endl;
}
return 0;
}
|
Пример 2.
# include <iostream>
# include <clocale>
using namespace std;
int main ()
{
cout << "Введите количество пирожков: ";
int n;
cin >> n;
cout << "Я собираюсь съесть: " << n;
cout << " пирожков" << endl;
cin.get();
cin.get();
}
Результатом выше приведенной программы будет:
при n = 5 - "Я собираюсь съесть: 5 пирожков"
при n = 2 - "Я собираюсь съесть: 2 пирожков"
попробуем это исправить, для этого используем оператор % - для получения остатка вводимого количества пирожков, оператор switch для создания правильных вариантов склонения, и оператор if - для указания условий выбора.
# include <iostream>
using namespace std;
int main ()
{
cout << "Введите количество пирожков: ";
int n;
cin >> n;
cout << "Я собираюсь съесть: " << n;
int o = n % 100; // получение остатка
if ((o > 10)&& (o < 20))
cout << " пирожков";
else
{
switch (o % 10)
{
case 0:
cout << " пирожков.";
break;
case 1:
cout << " пирожок.";
break;
case 2:
case 3:
case 4:
cout << " пирожка.";
break;
case 5:
case 6:
case 7:
case 8:
case 9:
cout << " пирожков.";
break;
}
}
cout << endl;
cin.get();
cin.get();
Структуры циклов
Цикл - это конструкция языка программирования, которая используется для выполнения каких-либо действий определенное количество раз.
Любой цикл состоит из следующих элементов:
- Точки входа
- Тела цикла, которое содержит операторы, выполняемые за один проход
- Точки выхода
- Условного выражения, определяющего момент окончания цикла
- Дополнительно используемых операторов break и continue
Цикл с параметром (счетчиком, с управляющей переменной)
Вариант циклического вычислительного процесса, характерные особенности которого состоят в том, что:
· число повторений цикла известно к началу его выполнения;
· управление циклом осуществляется с помощью переменной порядкового типа, которая в этом циклическом процессе принимает последовательные значения от заданного начального до заданного конечного значений.
Для компактного задания подобного рода вычислительных процессов и служит оператор цикла с параметром.
На Паскале
Синтаксис:
For V:= E1 to E2 do S,
В некоторых случаях бывает удобно, чтобы параметр цикла Паскаля принимал последовательные, но не возрастающие, а убывающие значения. Для таких случаев в Паскале предусмотрен оператор цикла с параметром следующего вида:
For V:= E1 downto E2 do S,
При этом значения выражений Е1 и Е2 вычисляются один раз, при входе в оператор цикла, а значение параметра цикла V не должно изменяться в результате выполнения оператора S. Если заданное конечное значение меньше начального значения (что допустимо), то оператор S не выполняется ни разу. Для обоих вариантов записи цикла с параметром справедливо: если начальное и конечное значения равны, то тело цикла (оператор S) выполнится один раз.
7.1.2. На С++
Синтаксис цикла for таков:
for (начальное значение; условие выполнения; приращение)
{
Операторы;
}
В скобках после ключевого слова for находятся три выражения:
· Инициализирующее. Оно предназначено для инициализации счётчика цикла.
· Условие проверки цикла. Здесь, как правило, находится операция отношения. Если она возвращает единицу, то выполняется тело цикла, если возвращает ноль, то выполняется первый оператор стоящий за закрывающей фигурной скобкой.
· Выражение инкрементирования (декрментирования) счётчика цикла. В этом выражении мы можем изменить значение счётчика. Можно использовать инкрементное выражение с любым параметром инкремента, например:
For (int і = 0; і <= GetNumberOfElements(); і += 2) {...}
for(int i = 0; i < 100; i += 10) {...}
Как работает цикл:
· Инициализация счётчика
· Проверка счётчика
· Выполнение тела цикла
· Инкремент (декремент) счётчика
· Проверка счётчика
· Выполнение тела цикла
И так, до тех пор, пока условное выражение не вернёт ноль.
В качестве условного выражения допустимо любое выражение С++, результатом которого может быть true. Ниже приведены примеры правильной записи условных выражений:
For (int і = 0; і < 100; i++) {...}
For (int і = 1; і == numberOfElements; i++) {...}
Любой из трех параметров цикла for может быть опущен.
Если опустить первый и третий операторы, то цикл for будет подобен циклу while, рассматриваемому далее.
Пример:
int cycle = 0; // объявляем переменную cycle типа int
for( ; cycle < 5; ) // опускаем 1-й и 3-й параметр
{
cycle++; // увеличиваем значение переменной на 1
cout << "Yes!"; // выводим на экран слово Yes!
}
cout << "\nCycle: << cycle << ".\n";// после цикла выводим значение переменной
В результате выполнения программы на консоль будет выведен текст
Yes!Yes!Yes!Yes!Yes!
Cycle:5.
Если опустить все три параметра, организуем бесконечный цикл.
for(;;)
{
printf("A"); // печатаем букву A
}
Итерационные циклы
Итерационные циклы отличаются от циклов с параметром тем, что в них заранее неизвестно число повторений.
Пусть мы отправляемся за грибами и возвращаемся домой, когда корзина наполнится. Все грибники делятся на 2 категории:
· Смотрят, есть ли место в корзине, а уже потом срывают грибы, если их можно поместить в корзину. (Правда, в жизни таких грибников встречать не приходилось)
· Сначала срывают грибы, а уже потом думают, как их положить в корзину.
Отсюда получаются два варианта реализации итерационных циклов: с предусловием и с постусловием.
В цикле с предусловием сначала проверяется условие, а потом делается шаг. Грибник придет с полной или почти полной корзиной. В цикле с постусловием – сначала шаг, а потом проверка. Как всякий нормальный грибник, этот принесет полную или слегка переполненную корзину.
Какой алгоритм выбрать зависит от конкретной задачи.
Нужно проанализировать событие, которое ожидается. Если оно может случиться до первого шага, то нужен цикл с предусловием. А если событие не может случиться до первого шага, то нужен цикл с постусловием.
Заметим, что оператор цикла с постусловием является более общим, чем оператор цикла с параметром — любой циклический процесс, задаваемый с помощью цикла с параметром можно представить в виде цикла с постусловием. Обратное утверждение неверно.
Оператор цикла с предусловием можно считать наиболее универсальным – с использованием таких операторов можно задать и циклические процессы, определяемые операторами цикла с параметром и постусловием.
Циклы с предусловием
Довольно часто встречаются такие циклические процессы, когда число повторений цикла тоже неизвестно заранее, но при некоторых значениях исходных данных предусмотренные в цикле действия вообще не должны выполняться, и даже однократное выполнение этих действий может привести к неверным или неопределенным результатам. Для их программирования предназначены циклы с предусловием.
Синтаксис в Паскале:
While B do S;
где while (пока), do (делать, выполнять) – служебные слова, В – логическое выражение, S – оператор или набор операторов (в этом случае не следует забывать об операторных скобках). Здесь оператор S выполняется ноль или более раз, но перед каждым очередным его выполнением вычисляется значение выражения В, и оператор S выполняется только в том случае, когда значение выражения В true. Выполнение оператора цикла завершается, когда выражение В впервые принимает значение false. Если это значение выражение В принимает при первом же его вычислении, то оператор S не выполнится ни разу.
Синтаксис в С++
while (условие выполнения цикла)
{
Операторы;
}
По структуре этот цикл точно такой же как, и цикл for, только выражения инициализации и инкрементирования расположены в разных местах. Инициализирующее выражение ставится програмистом за пределами цикла (до начала цикла). Выражение, изменяющее условие выхода ставится программистом, как правило, в конце тела цикла.
Циклы с постусловием
В случае оператора цикла Паскаля с постусловием входящая в него последовательность операторов заведомо будет выполняться хотя бы один раз. Синтаксис в Паскале:
Repeat S1; S2;…; Si until B,
где repeat (повторять) и until (до) – служебные слова, через Si обозначен любой оператор Паскаля, а через В – логическое выражение.
Синтаксис в С++
do
{
оператор 1;
оператор 2;
...
оператор n;
}
while (условие выполнения цикла); //не забывайте про точку с запятой!!!
При выполнении этого оператора цикла последовательность операторов, находящихся между словами repeat и until, выполнится один или более раз. Этот процесс завершается, когда после очередного выполнения заданной последовательности операторов логическое выражение В примет (впервые) значение true. Таким образом, с помощью логического выражения В задается условие завершения выполнения оператора цикла. Поскольку в данном случае проверка условия производится после выполнения последовательности операторов (тела цикла), этот оператор цикла и называется оператором цикла с постусловием.
Вложенные циклы
Оператор, который выполняется в цикле, сам может быть циклом. Это относится ко всем видам циклов. В результате получаются вложенные циклы.
Механизм работы вложенных циклов удобнее всего рассмотреть на примере вложенных циклов с параметром. Пусть нам нужно описать работу электронных часов, начиная с момента времени 0 часов, 0 минут, 0 секунд. Значение минут станет равным 1 только после того, как секунды «пробегут» все последовательные значения от 0 до 59. Часы изменят свое значение на 1 только после того, как минуты «пробегут» все последовательные значения от 0 до 59. Таким образом, вывод всех значений времени от начала суток до конца суток может быть представлен следующим фрагментом программы (на Паскале):
For h:=0 to 23 do
For m:=0 to 59 do
For s:=0 to 59 do
Writeln(h,’:’,m,’:’,s);
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|