Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
61
Добавлен:
09.05.2015
Размер:
130.69 Кб
Скачать

Урок 7: Циклы.

Основная цель урока.

1.Изучить работу циклов.

2.Научиться использовать сокращённые формы записи инкремента\декремента.

3.Продолжить изучение режима отладки.

4.Продолжить изучение работы с классом Random.

Краткая справка.

Цикл — управляющая конструкция, предназначенная для организации многократного исполнения набора инструкций.

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

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

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

Цикл с предусловием (while)

Цикл с предусловием— цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

Общий синтаксис цикла while выглядит следующим образом:

while (<логическое выражение>)

{

//операторы

}

Пример: нахождение суммы чисел от 1 до 100.

int i = 1; int sum = 0; while (i<=100)

{

sum = sum + i; i = i + 1;

}

При первом входе в цикл (1-ая итерация) переменная i равна 1, а переменная sum равна 0. После увеличения переменной sum на число, хранящееся в переменной i и увеличения переменной i на единицу переменная sum будет равна 1,

а переменная i будет равна 2. Ниже приведена таблица, иллюстрирующая алгоритм работы примера.

Номер итерации

Действия

 

 

1

sum = 0 + 1 = 1

 

i = 1+1=2

 

 

2

sum = 1 + 2 = 3

 

i = 2+1=3

 

 

3

sum = 3 + 3 = 6

 

i = 3+1=4

 

 

4

sum = 6 + 4 = 10

 

i = 4+1=5

 

 

6

sum = 10 + 5 = 15

 

i = 5+1=6

 

 

 

 

100

sum = 4950+ 100 = 5050

 

i = 100+1=101

 

 

После 100-ой итерации переменная i становится равна 101 и логическое

выражение i<=100 становится ложным – цикл завершается.

Обычно в циклах часто используют операции инкремента и декремента, это

сокращённые формы записи изменения переменных на некоторое число.

Инкремент (увеличение) — операция увеличения на единицу или же, в

некоторых случаях, на изменяемую величину. Обратную операцию называют

декремент (уменьшение). Ниже приведена таблица, демонстрирующая разные формы записи, показанные на переменной i (может быть использовано любое другое имя переменной).

Сокращённая форма записи

Полная форма записи

 

 

i++;

i = i + 1;

 

 

i--;

i = i – 1;

 

 

i+=5;

i = i + 5;

 

 

i-=32;

i = i - 32;

Для операций ++ и – существуют префиксные(++i,--i) и постфиксные(i++, i--)

формы записи. И тот и другой вариант одинаково увеличивают/уменьшают значение переменной, разница видна только при использовании в выражениях.

Переменная b в нижеприведённом коде будет равна true, т.к. x++ увеличит значение переменной x на единицу и вернёт старое значение переменной x.

int x = 0;

bool b = x++ == 0; //x = 1, b = true

В варианте с постфиксным инкрементом ++x вернёт новое значение

переменной x, а так как 1 не равен 0 переменная b будет равна false.

int x = 0;

bool b = ++x == 0; //x = 1, b = false

С учётом всего вышесказанного пример для цикла while можно переписать следующим образом:

int i = 1; int sum = 0; while (i<=100)

{

sum += i; i++;

}

Цикл с постусловием (do…while).

Цикл с постусловием — цикл, в котором условие проверяется после

выполнения тела цикла. Отсюда следует, что тело всегда выполняется хотя бы

один раз.

Общий синтаксис цикла do…while выглядит следующим образом:

do

{

//операторы

}while (<логическое выражение>);

Цикл со счётчиком (for).

Цикл со счётчиком — цикл, в котором некоторая переменная(счётчик) изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом, и для каждого значения этой переменной тело цикла выполняется один раз.

Циклы со счётчиком используются, когда количество повторений заранее известно.

Общий синтаксис цикла for.

for(<инициализация счётчика>;<условие продолжения>;<изменение счётчика>)

{

//операторы

}

Пример: нахождение суммы чисел от 1 до 100.

int sum = 0;

for(int i=1;i<=100;i++)

{

sum += i;

}

Однострочный вариант.

int sum = 0;

for(int i=1;i<=100;i++) sum += i;

Если шаг цикла изменить с 1(i++) на 2(i+=2), то получим сумму всех нечётных

чисел.

int sum = 0;

for(int i=1;i<=100;i+=2) sum += i;

Бесконечные (безусловные) циклы.

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

Пример – программа, запрашивающая у пользователя пару чисел и отображающая их сумму. Программа будет постоянно запрашивать новые числа и вычислять сумму, пока пользователь не закроет её.

while (true)

{

int num1 = Convert.ToInt32(Console.ReadLine()); int num2 = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Сумма чисел равна {0}",num1+num2);

}

И, то же самое для цикла for.

for (;;)

{

int num1 = Convert.ToInt32(Console.ReadLine()); int num2 = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Сумма чисел равна {0}", num1 + num2);

}

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

Пример, та же самая программа, но если пользователь введёт первое число равным 0, то цикл завершится.

for (;;)

{

int num1 = Convert.ToInt32(Console.ReadLine()); if (num1 == 0) break;

int num2 = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Сумма чисел равна {0}", num1 + num2);

}

Пример для оператора continue. При вводе 0 в качестве второго числа,

программа проигнорирует все последующие строки (т.е. строчку Console.WriteLine) и

перейдет в следующей итерации (т.е. опять будет запрашивать 2 числа).

for (;;)

{

int num1 = Convert.ToInt32(Console.ReadLine()); int num2 = Convert.ToInt32(Console.ReadLine()); if (num2 == 0) continue;

Console.WriteLine("Сумма чисел равна {0}", num1 + num2);

}

Учебное задание 1.8.

Создать приложение – « Угадай число» ( больше-меньше). Компьютер загадывает целое число от 0 до 100, игрок пытается его угадать.

В случае ошибки выдаётся подсказка – « число больше» или « число меньше».

Когда пользователь угадал число, выводится поздравление и количество использованных попыток.

Технология выполнения учебного задания 1.8.

Шаг 1. Создайте новый проект консольного приложения, назовите его Lab18.

Шаг 2. Для получения случайного числа в диапазоне от 0 до 100 воспользуется классом Random.

Для учёта попыток объявим целочисленную переменную tryCount, она будет равна 1 (т.е. минимально можно угадать с 1-ой попытки).

Далее запрашиваем у пользователя число (1-ая попытка).

После этого идёт цикл while, который выполняется, пока пользователь не угадает число. Т.е. условие userNum != secretNum истинно, пока загаданное число и число игрока не совпадают.

В цикле мы увеличиваем количество попыток на 1 и отображаем подсказку (см.

листинг 1).

static void Main(string[] args)

{

Random rnd = new Random();

//генерируем случайное число от 0 до 100 int secretNum = rnd.Next(0, 100);

//в переменной tryCount будем хранить количество попыток //с которых пользователь угадывает число

int tryCount = 1;

//переменная userNum будет хранить число, //которое пытается угадать пользователь int userNum;

Console.WriteLine("Я загадал число от 0 до 100"); //пользователь вводит число...

userNum = Convert.ToInt32(Console.ReadLine()); //пока пользователь не угадал число...

while (userNum != secretNum)

{

//увеличеваем кол-во попыток на 1 tryCount++;

//если загаданное число больше того что ввёл пользователь...

if (secretNum > userNum)

{

Console.WriteLine("Моё число больше...");

}

else//иначе - меньше...

{

Console.WriteLine("Моё число меньше...");

}

//запрашиваем следующее число у пользователя userNum = Convert.ToInt32(Console.ReadLine());

}

Console.WriteLine("Поздравляю! Вы угадали с {0} попытки", tryCount); Console.ReadKey();

}

Листинг 1.

Шаг 3. Запустите программу, нажав клавишу F5. Убедитесь, что программа

работает.

Шаг 4. Модифицируем программу так, чтобы после того, как игрок угадал число,

программа давала ему выбор играть ещё раз или завершить программу. Для этого воспользуемся циклом с постусловием do…while, т.к. нам нужно, чтобы этот цикл выполнился хотя бы один раз, а затем уже всё зависит от выбора игрока. Цикл while

здесь не подойдёт, т.к. нелогично будет спрашивать игрока, только что запустившего программу – хочет ли он сыграть. Реализация этого цикла показана в листинге 2.

Random rnd = new Random();

//генерируем случайное число от 0 до 100 int secretNum = rnd.Next(0, 100);

//в переменной tryCount будем хранить количество попыток //с которых пользователь угадывает число

int tryCount = 1;

//переменная userNum будет хранить число, //которое пытается угадать пользователь int userNum;

do

{

//Очищаем экран, выводим сообщение Console.Clear();

Console.WriteLine("Я загадал число от 0 до 100"); //пользователь вводит число...

userNum = Convert.ToInt32(Console.ReadLine()); //пока пользователь не угадал число...

while (userNum != secretNum)

{

//увеличеваем кол-во попыток на 1 tryCount++;

//если загаданное число больше того что ввёл пользователь...

if (secretNum > userNum)

{

Console.WriteLine("Моё число больше...");

}

else//иначе - меньше...

{

Console.WriteLine("Моё число меньше...");

}

//запрашиваем следующее число у пользователя userNum = Convert.ToInt32(Console.ReadLine());

}

Console.WriteLine("Поздравляю! Вы угадали с {0} попытки", tryCount); Console.WriteLine("Нажмите [1], если хотите попробовать ещё раз");

} while (Console.ReadKey().KeyChar == '1');

Листинг 2.

Шаг 5. Таким образом, мы обернули уже существующий код новым циклом do…while, который выполняется, пока пользователь нажимает цифру 1 после окончания очередной игры. Так как цикл while (userNum != secretNum) стал вложенным по отношению к циклу do… while (Console.ReadKey().KeyChar == '1'),

вложенный цикл необходимо сдвинуть на одну табуляцию вправо (как показано в листинге 2). Если у вас, вложенный цикл while находится на том же уровне табуляции, что и цикл do…while, выделите цикл while и нажмите Tab/Shift+Tab, пока не получите результат показанный на листинге 2.

Шаг 6. Запустите программу, нажав клавишу F5. Убедитесь, что программа

работает.

Шаг 7. Проведём рефакторинг получившейся программы. Первое, что бросается в глаза это строчка

userNum = Convert.ToInt32(Console.ReadLine());

она дублируется 2 раза – при объявлении переменной (1-ая попытка) и в цикле (все последующие попытки). Такое дублирование кода нежелательно, т.к. увеличивает объём кода и потенциальное количество ошибок. В цикле while можно объединить операцию присваивания и операцию сравнения следующим образом:

while ((userNum = Convert.ToInt32(Console.ReadLine())) != secretNum)

Далее – отображение информации о том, что число больше/меньше можно представить сокращённым оператором if.

Console.WriteLine("Моё число {0}...",secretNum > userNum ? "больше":"меньше");

После всех улучшений цикл do...while будет выглядеть следующим образом

(листинг 3).

do

{

//Очищаем экран, выводим сообщение Console.Clear();

Console.WriteLine("Я загадал число от 0 до 100"); //пользователь вводит число, пока не угадает...

while ((userNum = Convert.ToInt32(Console.ReadLine())) != secretNum)

{

//увеличеваем кол-во попыток на 1 tryCount++;

//выводим подсказку...

Console.WriteLine("Моё число {0}...",

secretNum > userNum ? "больше":"меньше");

}

Console.WriteLine("Поздравляю! Вы угадали с {0} попытки", tryCount); Console.WriteLine("Нажмите [1], если хотите попробовать ещё раз");

} while (Console.ReadKey().KeyChar == '1');

Листинг 3.

Контрольные вопросы.

1.Что называется циклом?

2.Что называется телом цикла?

3.Что такое итерация?

4.Чем отличаются циклы с предусловием от циклов с постусловием?

5.Какие виды циклов вы знаете?

6.Что такое операция инкремента? Декремента?

7.Чем отличаются префиксные и постфиксные операции инкремента?

8.Как можно реализовать бесконечный цикл?

9.Для чего используется оператор break?

10.Чем отличается break от continue?

11.Чему равно значение логического выражения x-- < 3, если до выполнения операции x был равен 3?

Самостоятельное задание 1.8.

Измените учебное задание, реализовав следующие улучшения:

Игроку давалось не более 7 попыток, чтобы угадать число.

В случае если игрок угадывает число с 1-ой попытки выводить особое сообщение, например « Невероятно, вы угадали с первой попытки!» ( текст может быть другим).

Примечание: так как вероятность угадать число с первой попытки при сдаче работы слишком мала – нужно подсмотреть загаданное число через отладчик и « угадать» его с первой попытки.

Если игрок не угадывает с 4-ой попытки, давать дополнительные подсказки вида « моё число кратно/не кратно N», где N – случайное число от 2 до 9.

Соседние файлы в папке Методичка (1 сем)