Цикл while




Скачать 145.92 Kb.
НазваниеЦикл while
Дата публикации07.09.2013
Размер145.92 Kb.
ТипДокументы
uchebilka.ru > Информатика > Документы


УРОК4-5

Цикл while


В 60-х годах исследование Бома и Джакопини показало, что все программы могут быть написаны с использованием всего трех управляющих структур, названных структура следования, структура выбора и структура повторения.

Структура следования встроена в С++. Пока не указано иное, компьютер выполняет операторы С++ один за другим в той последовательности, в которой они записаны. Со структурами выбора мы познакомились в прошлый раз. Напомним еще раз. С++ обеспечивает три типа структур выбора альтернатив:

структура с единственным выбором if (ЕСЛИ) выполняет некоторое действие, если проверяемое условие истинно, или пропускает его, если ложно; структура с двойным выбором if/else (ЕСЛИ-ИНАЧЕ), выполняет одно действие, если условие истинно и другое действие, если оно ложно; структура с множественным выбором switch (ВЫБОР), выполняет одно из множества действий в зависимости от значения проверяемого выражения.

Сегодня, мы познакомимся со структурами повторения. С++ обеспечивает три типа структур повторения (циклов), называемых while (ПОКА), do-while (ЦИКЛ-ПОКА) и for (ЦИКЛ).

Любая программа на С++ формируется из такого количества комбинаций каждого типа управляющих структур, которое нужно для осуществления соответствующего алгоритма. А теперь, как и обещано, давайте поближе познакомся со структурами повторения.

Структура повторения позволяет программисту определить действие, которое должно повторяться, пока некоторое условие остается истинным. Например, предложение

ПОКА имеются незачеркнутые элементы в моем списке покупок

Сделать следующую покупку и вычеркнуть ее из списка

описывает повторные действия при посещении магазина. Условие "имеются незачеркнутые элементы в моем списке покупок" может быть истинным или ложным. Если оно истинно, то осуществляется действие "Сделать следующую покупку и вычеркнуть ее из списка". Это действие будет повторяться до тех пор, пока условие остается истинным. Оператор (или операторы), записанные в цикле while (ПОКА) составляют тело while, которое может быть отдельным или составным оператором. Очевидно, что когда-нибудь условие станет ложным (когда будет осуществлена и вычеркнута из списка последняя покупка). Начиная с этого момента повторение прерывается и выполняется первое действие, следующее за структурой повторения.

Обобщенная форма цикла while:

while ( выражение ) оператор;

Вначале вычисляется выражение. Если результат отличен от нуля (true), тогда выполняется оператор и управление переходит обратно к началу цикла while. Это приводит к выполнению тела цикла while, а именно оператора, который будет выполняться до тех пор, пока выражение не станет равным нулю (false). Затем управление передается следующему оператору. Таким образом, цикл может выполняться ноль или более раз. Например:

/* Пример выводит на экрон 5 строк типа "Строка" + "индекс" +

"выводится в цикле", где "индекс" меняется от 0 до 4 */
#include < iostream.h >

void main()

{

int i = 0; /*Объявление и инициализация переменной i*/

cout << "\n Начало цикла";

while (i != 5) /*Проверяется выражение (i != 5),

если результат - истина, выполняется операторы тела цикла,

в противном случае управление передается оператору, следующему за циклом. */

{

cout << "Строка " << i << "выводится в цикле \n";

i++;

}

cout << "\n Оператор, следующий за циклом";

}

Чтобы материал стал более понятным рассмотрим еще такой пример:

/*Программа выводит на экран данные таблицы умножения на 2*/
#include < iostream.h >

void main()

{

int i = 0;

cout << "Таблица умножения на 2 \n";

while ( i ++ < 10)

cout << i << " * 2 = " << i * 2 << '\n';

cout << "\n Все";

}
Давайте остановимся на операторе while в данном примере и по шагам посмотрим, как он работает.

while ( i ++ < 10)

cout << i << " * 2 = " << i * 2 << '\n';

Цикл состоит из двух частей: условие цикла и тело цикла. Обратите внимание на условие цикла - это выражение i++ < 10 . Условие гласит, что тело цикла будет выполняться пока выполняется условие i < 10 . ПОСЛЕ проверки этого условия значение переменной i увеличивается на 1 (об этом говорит оператор i++). Тело цикла состоит всего из одного оператора, а именно:

cout << i << " * 2 = " << i * 2 << '\n';

Итак, 1-й шаг цикла
1.1 Значение переменной i равно 0 (так она была проинициализирована).

1.2 Проверка условия i < 10 дает истина (т.к. 0 < 10)

1.3 Значение переменной i увеличивается на 1, теперь i = 1.

1.4 Так как проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 1 * 2 = 2

1.5 Далее управление передается циклу while

2-й шаг цикла
2.1 Значение переменной i равно 1.

2.2 Результат проверки условия цикла - истина (1 < 10)

2.3 Значение переменной i увеличивается на 1, теперь i = 2.

2.4 Так как проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 2 * 2 = 4

2.5 Далее управление передается циклу while

. . .

9-й шаг цикла
9.1 Значение переменной i равно 8.

9.2 Результат проверки условия цикла - истина (8 < 10)

9.3 Значение переменной i увеличивается на 1, теперь i = 9.

9.4 Так проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 9 * 2 = 18

9.5 Далее управление передается циклу while

10-й шаг цикла
10.1 Значение переменной i равно 9.

10.2 Результат проверки условия цикла - истина ( 9 < 10)

10.3 Значение переменной i увеличивается на 1, теперь i = 10.

10.4 Так проверка условия цикла дала значение истина управление

передается оператору тела цикла, т.е. на экран выводится строка 10 * 2 = 20

10.5 Далее управление передается циклу while

11-й шаг цикла
11.1 Значение переменной i равно 10.

11.2 Результат проверки условия цикла - ложь ( 10 равно 10, а не меньше!)

11.3 Значение переменной i увеличивается на 1, теперь i = 11.

11.4 Так проверка условия цикла дала значение ложь, управление

НЕ передается в тело цикла, т.е. выполнение цикла заканчивается,

и управление переходит к оператору, следующему за while,

т.е. к cout << "\n Все";

В данном примере, мы рассмотрели случай с заранее определенным числом повторений, однако характеру оператора while наиболее соотвествуют ситуации, когда заранее неизвестно, количество повторений цикла.
^

Цикл do-while


Структура повторения do/while похожа на структуру while. В структуре while условие продолжения циклов проверяется в начале цикла, до того, как выполняется тело цикла. В структуре do/while проверка условия продолжения циклов производится после того, как тело цикла выполнено, следовательно, тело цикла будет выполнено по крайней мере один раз. Когда do/while завершается, выполнение программы продолжается с оператора, следующего за предложением while . Отметим, что в структуре do/while нет необходимости использовать фигурные скобки, если тело состоит только из одного оператора. Но фигурные скобки обычно все же ставят, чтобы избежать путаницы между структурами while и do/while . Например,
while (условие)

обычно рассматривается как заголовок структуры while. Структура do/while без фигурных скобок и с единственным оператором в теле имеет вид
do

оператор

while (условие);

что может привести к путанице. Последняя строка - while(условие); может ошибочно интерпритироваться как заголовок структуры while, содержащий пустой оператор. Таким образом, чтобы избежать путаницы, структура do/while даже с одним оператором часто записывается в виде:
do {

оператор

} while (условие);

Итак, как же работает оператор do/while? Рассмотрим конструкцию вида
do

оператор

while (условие);

следующий оператор;

Сначала выполняется оператор, затем вычисляется выражение. Если его результат отличен от нуля (true), тогда управление переходит обратно к началу оператора do, процесс повторяется. Когда значение выражения - ноль (false), тогда управление переходит к следующему оператору.

Например, предположим, что необходимо прочитать положительное целое число, и убедиться в том, что это целое число положительно. Это вьшолняет следующий код:

do {

cout << "\n Введите положительное целое число: ";

cin >> n;

} while (n <= 0);

Пользователю предлагается ввести положительное целое число. Отрицательное значение или ноль заставляют цикл выполняться снова, и пользователь должен вводить другое значение. Управление выходит из цикла только после того, как пользователь вводит положительное целое число.
^

Практический пример


Ну что, попробуем наши знания на практике? Рассмотрим такую игру. Имеется 20 предметов. Два игрока по очереди берут какое-то количество предметов из этой кучи (от 1 до 5). Выигрывает тот, кто забирает последний предмет. Давайте напишем электронный вариант этой игры, в которой пользователь будет играть против машины.

В программе используются следующие данные:

S - оставшееся количество предметов, m - ход игрока

В этой версии игры компьютер играет весьма примитивно: он генерирует случайное целое число в промежутке от 1 до 5 с помощью команды rand(), которая находится в библиотеке stdlib.h.

функция rand()%n возвращает псевдослучайное целое число в диапазоне от 0 до (n-1). Для более грамотной работы эту функцию необходимо инициализировать строкой srand( time( NULL ) ).В противном случае все сессии программы будут проходить с одним и тем же набором ходов;команда srand находится также в библиотеке stdlib.h , a команда time - в библиотеке time.h. Вам нужно подключить эти библиотеки с помощью директивы компилятора #include.

//Программа ИГРА
#include

#include

#include

void main()

{

srand( time( NULL ) );

int S=20,m;

cout<<"Rules of game. Is given S=20 of subjects. \n";

cout<<"For one course it is possible to take from 1 up to 5 subjects.\n";

cout<<"Benefits the one who has taken the last subject.\n\n";
while (S>0) {

cout<<"Your course. How many subjects you take? ";

cin>>m;

S-=m;

if (S==0) {

cout<<"You have won!";

}

else {

m=rand()%5+1;

if (S
S-=m;

cout<<"I have taken "<
if (S==0) cout<<"I'm win!\n\n\n";

}

}

}

^

Домашнее задание


Найти сумму всех целых чисел в диапазоне, указанном пользователе.



Разработайте программу, которая выводит на экран таблицу умножения.



Дано натуральное число n. Написать программу, которая вычисляет факториал неотрицательных целых чисел n (т.е. число целое и больше 0). Формула вычисления факториала приведена ниже.

n! = 1*2*3*....*n, (формула вычисления факториала числа n)

0! = 1 (факториал 0 равен 1 (по определению факториала))

Цикл for


Цикл for используется для организации циклов - повторения каких-либо однородных действий. Например, если вам нужно посчитать сумму чисел от 1 до 10, то вы должны сложить 1 и 2, полученную сумму сложить с 3, полученную сумму сложить с 4 и так далее, пока не получим сумму предыдущих чисел с 10. В итоге получили последовательность повторяющихся действий: к сумме предыдущих чисел прибавляем следующее число. Вот для организации таких действий и используются циклы, в частности цикл for.

Вот общий вид цикла for:
for (начальная_инструкция; условие; выражение)

{

инструкции;

}
Семантика (смысл) цикла for такова, что сначала выполняется начальная_инструкция; она инициализует переменную, используемую в цикле. Затем проверяется условие. Если оно истинно, то выполняются инструкции, вычисляется выражение, и управление передается обратно в начало цикла for с той разницей, что начальная_инструкция уже не выполняется. Это продолжается до тех пор, пока условие не станет ложно, после чего управление передается следующей_инструкции. Каждый проход цикла называется итерацией цикла.

Начальной_инструкцией может быть инструкция-выражение или просто объявление.

Цикл for является итерационной инструкцией, используемой обычно с увеличивающейся или уменьшающейся переменной. Например, в следующем коде инструкция for используется для сложения целых чисел от 1 до 10.

sum = 0;
for (i = 1; i <= 10; ++i)
sum += i;

Когда инструкция for начинает выполняться, управляющей переменной i задается начальное значение 1. Затем проверяется условие продолжения цикла i <= 10. Поскольку начальное значение i равно 1, это условие удовлетворяется, так что оператор тела инструкции суммирует к значению переменной sum, равному 0, значение счетчика i, равное 1. Затем управляющая переменная i увеличивается на единицу в выражении ++i и цикл опять начинается с проверки условия его продолжения. Поскольку значение i теперь 2, предельная величина не превышена, так что программа снова выполняет тело цикла. Этот процесс продолжается, пока управляющая переменная i не увеличится до 11 — это приведет к тому, что условие продолжения цикла нарушится и повторение прекратится. Выполнение программы продолжится с первого оператора, расположенного после цикла for.

Другой пример показывает, как оператор запятая может быть использован для инициализации более одной переменной.

for (sum = 0,i = 1; i <= 10; ++i)

sum += i;

Основное назначение использования оператора запятая — помочь программисту использовать несколько выражений задания начальных значений и (или) несколько выражений приращения переменных. Например, в одной структуре for может быть несколько управляющих переменных, которым надо задавать начальное значение и которые надо изменять. Например:

for(i=0,j=0;i<3,j<`4;i++,j+=2)
cout<
Данный цикл проведет две итерации, после которых значение счетчика i станет равным 2, а значение счетчика j = 4. При этом условие для второго счетчик не выполняется (т.к. j строго должен быть меньше 4) и цикл будет прерван. На экране будет выведено 02.

В цикле for может присутствовать локальное объявление переменной управления циклом, как в следующем примере.

for (int i = 0; i < N; ++i)

sum += i*i;

Целая переменная i теперь является объявленной в программе. Это может вносить путаницу, поэтому лучше объявлять все программные переменные в начале блока.

В большинстве случаев инсрукцию for можно представить при помощи инструкции while:
начальная_инструкция;
while (условие) {
инструкция;
выражение;
}
следующая_инструкция;
Любое или все выражения в инструкции for могут отсутствовать, но две точки с запятой должны быть обязательно. Если пропущена начальная_инструкция, то никакая инициализация в цикле for не выполняется. Если пропущено выражение, то не производится приращение, а в случае отсутствия условия не производится проверка. Есть специальное правило для тех случаев, когда пропущено условие; в такой ситуации компилятор будет считать условие выполненным всегда. Так, цикл for в следующем фрагменте бесконечен.

for (i = 1, sum = 0 ; ; sum += i++ )

cout << sum << endl;

Размещение точки с запятой сразу после правой закрывающей скобки заголовка for делает тело структуры пустым оператором. Обычно это логическая ошибка.

“Приращение” инструкции for может быть отрицательным (в этом случае в действительности происходит не приращение, а уменьшение переменной, управляющей циклом).

Если условие продолжения цикла с самого начала не удовлетворяется, то операторы тела инструкции for не выполняются и управление передается оператору, следующему за for.

Управляющая переменная иногда печатается или используется в вычислениях в теле инструкции for, но обычно это делается без изменений ее величины. Чаще управляющая переменная используется только для контроля числа повторений и никогда не упоминается в теле инструкции.

Хотя управляющая переменная может изменяться в теле цикла for, избегайте делать это, так как такая практика приводит к неявным, неочевидным ошибкам.

Давайте рассмотрим несколько вариантов применения цикла for:

а) Изменение управляющей переменной от 1 до 100 с шагом 1.
for (int i = 1; i <= 100; i++)

b) Изменение управляющей переменной от 100 до 1 с шагом -1

(с уменьшением на 1).
for (int i = 100; i >= 1; i--)

Распространенная ошибка при программировании, это использование несоответствующей операции отношения в условии продолжения цикла при счете циклов сверху вниз (например, использование i <= 1 при счете циклов сверху до 1 не включая).

c) Изменение управляющей переменной от 7 до 77 с шагом 7.
for (int i = 0; i <= 77; i += 7)

d) Изменение управляющей переменной от 20 до 2 с шагом -2.
for (int i = 20; i >= 2; i -= 2)

e) Изменение управляющей переменной в следующей последовательности:

2, 5, 8, 11, 14.
for (int j = 2;j <= 14; j += 3)

f) Изменение управляющей переменной в следующей последовательности:

99, 88, 77, 66, 55, 44, 33, 22, 11, 0.
for (int j = 99; j >= 0; j -= 11)
^

Практический пример


Разработаем приложение "Счастливый билет". Но, вначале, договримся, что именно мы подразумеваем под счастливым билетом. Будем называть счастливым тот билет, в номере которого сумма четных цифр равна сумме нечетных цифр. Найти вероятность того, что купленный билет окажется счастливым.

Используем самую простую идею для решения данной задачи, а именно: переберем все подряд билеты и подсчитаем количество "счастливых". Затем поделим количество этих билетов на общее количество и получим искомую вероятность.

Используем следующие переменные: S - общее количество билетов; H - количество "счастливых" билетов; a,b,c,d - цифры нашего билета; ver - искомая вероятность.

//Программа вычисляет вероятность приобретения "счастливого" билета

#include
void main()

{

int a,b,c,d,S=0,H=0;

float ver;

for (a=0;a<10;a++)

for (b=0;b<10;b++)

for (c=0;c<10;c++)

for (d=0;d<10;d++) {

S++;

if (a+c==b+d) {

H++;

}

}

ver=(float) H/S*100;
// Вывод результатов на экран

cout<<"Yuor ver. is "<
}
^

break и continue


Чтобы прервать нормальное выполнение цикла, программист может использовать две специальные инструкции:

break; и continue;

Инструкция break кроме использования в циклах может применяться в инструкции switch. Она вызывает выход из тела цикла или инструкции switch.

Следующий пример иллюстрирует использование инструкции break. Производится проверка на отрицательное значение, и если условие выполняется (значение отрицательно), инструкция break вызывает выход из цикла for. Управление программой перескакивает к инструкции, следующей сразу за циклом.

for (i = 0; i < 10; ++i)
{ cin >> x;
if (x < 0.0) {
cout << "That’s all!" << endl;
break; //выход из цикла,
//если значение отрицательно
}
cout << sqrt(x) << endl;
}
//break прыгает сюда

Это типичное применение инструкции break. Когда выполняется специальное условие, производится соответствующее действие и выход из цикла.

Инструкция continue вызывает остановку текущей итерации цикла и немедленный переход к началу очередной итерации. Следующий фрагмент обрабатывает все символы, кроме цифр. В случае ввода с клавиатуры любого символа - не цифры происходит обработка символа, а в случае ввода цифры обработка будет проигнорирована.

for (i = 0; i < MAX; ++i) {
cin >> c ;
if (isdigit(c)) continue;
..... //обработка других символов
//continue прыгает сюда
}

В этом фрагменте программы вы встретились с нововведением – функцией isdigit, которая равна true, если символ в скобках является цифрой, и false, если символ в скобках не является цифрой. Для использования этой функции необходимо подключить библиотеку ctype.h.

Когда выполняется инструкция continue, управление перепрыгивает в точку перед закрывающей фигурной скобкой, что приводит к выполнению цикла с головы. Обратите внимание, что continue завершает текущую итерацию, в то время как инструкция break заканчивает цикл.

Инструкция break может встречаться только внутри тела инструкций for, while, do или switch. Инструкция continue может использоваться только внутри тела инструкций for, while или do.
^

Домашнее задание



Разработать программу, которая выводит на экран горизонтальную линию из звездочек. Число звездочек указывает пользователь.



Разработать программу, которая выводит на экран вертикальную линию из звездочек. Число звездочек указывает пользователь.



Создать программу, которая выводит на экран простые числа в диапазоне от 2 до 1000. (Число называется простым, если оно делится только на 1 и на само себя без остатка; причем числа 1 и 2 простыми не считаются).



Дано произвольное целое число n. Написать программу, которая разбивает число n на цифры и выводит их на экран; подсчитывает сколько цифр в числе n; находит сумму цифр числа n; меняет порядок цифр числа n на обратный

Добавить документ в свой блог или на сайт

Похожие:

Цикл while iconВокальный цикл «Из поэзии И. Уткина» Виталия Губаренко: исполнительский аспект
В. Сосюры «Простягни долоні» (ор. 26, 1977), вокальный цикл на слова Д. Пав­личко «Осінні сонети» (ор. 35, 1983). Этот список органично...

Цикл while iconИспользование cbr-подхода для баз знаний ситуационных центров
По определению, процесс состоит из 4-х этапов, образующих так называемый цикл рассуждения на основе прецедентов или cbr-цикл [1]

Цикл while iconТема Загальні відомості про розробку програм. Формалізація та алгоритмізація...
Жизненный цикл программных изделий, это этапы создания, использования и утилизации программ. Экономистам понимание жизненного цикла...

Цикл while iconТема Загальні відомості про розробку програм. Формалізація та алгоритмізація...
Жизненный цикл программных изделий, это этапы создания, использования и утилизации программ. Экономистам понимание жизненного цикла...

Цикл while iconВсе виды продукции, технологии и услуг имеют определенный жизненный...
Различают жизненный цикл продукции, отдельной компании и даже в целом целой отрасли, который, по сути, является суммарной величиной...

Цикл while iconТекущий этап эволюции планеты Земля
Первый этап соответствует физическому развитию организма, он прошел давным-давно по человеческим меркам, и это случилось в Первой...

Цикл while iconЦикл лекций в учебных заведениях района
Ьнянской црб совместно с Центром семьи и молодежи организован и проводится цикл лекций в учебных заведения района с использованием...

Цикл while iconРасписание на сентябрь 2012 01 сентября, 12: 00 – цикл лекций «История...
Представляем лекцию «Возникновение фотографии», открывающую цикл лекций «История фотографии с Викторией Мироненко»

Цикл while iconСпецкурс (9 семестр) Специальность «Экономическая кибернетика» из...
ПО) лежит понятие его жизненного цикла (ЖЦ). Жизненный цикл является моделью создания и использования по, отражающей его различные...

Цикл while iconНеобходимо поблагодарить автора, Таквор Оганесяна, за цикл статей, Морская держава?
Необходимо поблагодарить автора, Таквор Оганесяна, за цикл статей, «Морская держава? Скорее страна у моря», в газетах «Слово», «Моряк...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<