Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

Ну что, попробуем наши знания на практике? Рассмотрим такую игру. Имеется 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 <iostream.h>

#include <time.h>

#include <stdlib.h>

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";

do {

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<m) m=S;

S-=m;

cout<<"I have taken "<<m<<" subjects. There were "<<S<<" subjects.\n\n";

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

}

} while (S>0);

}

Цикл 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*j;

Данный цикл проведет две итерации, после которых значение счетчика 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)