Вопрос 3. Операторы break, continue. Дополнительные сведения и примеры



Изложение вопросов.

Вопрос 1. Общие вопросы. Понятие о вложенной конструкции.

На прошлых занятиях вы познакомились с конструкцией под названием цикл и вариантами реализации цикла в языке C/C++. Как вы уже успели заметить, цикл является одной из основополагающих конструкций программирования. С его помощью решается огромное количество задач. Также, вы уже столкнулись с тем, что в цикл можно вкладывать конструкции логического выбора, такие, как if и switch. Однако, не будем останавливаться на достигнутом, и попробуем вложить в цикл подобную ему конструкцию, т. е. - другой цикл. Рассмотрим простой пример:

 

#include <iostream>

#include <windows.h>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int i = 0, j;

 while(i<3)

 {

cout << "\nВнешний!!!\n";

j = 0;

while (j<3)

{

cout << "\nВнутренний!!!\n";

j++;

}

i++;

 }

 cout << "\nОкончание!!!\n";

SetConsoleCP(i1);

SetConsoleOutputCP(i1);

return 0;

}

 

Проанализируем данный пример:

1. Программа проверяет условие i<3, так как 0 меньше 3 условие

является истинным и программа входит во внешний цикл.

2. Осуществляется показ на экран Внешний!!!

3. Обнуляется переменная j.

4. Теперь проверяется условие j<3, так как 0 меньше 3 условие

является истинным и программа входит во внутренний цикл.

5. Осуществляется показ на экран Внутренний!!!

6. Осуществляется изменение управляющей переменной j.

7. Снова проверяется условие j<3, так как 1 меньше 3 условие

является истинным и программа входит во внутренний цикл.

8. Осуществляется показ на экран Внутренний!!!

9. Осуществляется изменение управляющей переменной j.

10. Снова проверяется условие j<3, так как 2 меньше 3 условие

является истинным и программа входит во внутренний цикл.

11. Осуществляется показ на экран Внутренний!!!

12. Осуществляется изменение управляющей переменной j.

13. Снова проверяется условие j<3, так как 3 не меньше 3 условие

является ложным и программа выходит из внутреннего цикла.

Далее код возвращается к пункту 1. Все вышеописанные действия

(1-13) повторятся 3 раза, т. е. до тех пор пока i не станет равно значению

3. После этого программа выйдет из внешнего цикла и на экран выведется

Окончание!!!

Результаты работы программы имеют следующий вид:

 

Из рассмотрения данного примера следует вывод:

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

 

Вопрос 2. Практические примеры использования.

Пример 1:

Постановка задачи:

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

Код реализации :

 

#include <windows.h>

#include <iostream>

#include <iomanip>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

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

 cout.fill('-');

 cout << setw(70);

 cout << "\n";

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

 {

for (int j = 1; j < 10; j++)

{

cout << i * j << "\t";

}

cout << "\n\n";

 }

 cout << setw(70);

 cout << "\n";

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

Комментарий к коду:

1. Управляющие переменные внешнего и внутреннего циклов

осуществляют функции множителей.

2. Управляющая переменная i создается и инициализируется

значением 1.

3. Программа проверяет условие i<10, так как 1 меньше 10 условие

является истинным и программа входит во внешний цикл.

4. Управляющая переменная j создается и инициализируется

значением 1.

5. Программа проверяет условие j<10, так как 1 меньше 10 условие

является истинным и программа входит во внутренний цикл.

6. Осуществляется показ на экран произведения i на j - 1

7. Осуществляется изменение управляющей переменной j.

8. Снова проверяется условие j<10, так как 2 меньше 10 условие

является истинным и программа снова входит во внутренний цикл.

6. Осуществляется показ на экран произведения i на j - 2

7. Осуществляется изменение управляющей переменной j.

. . .

Действия с 5 по 7 повторяются до тех пор пока j не становится равно

10, при этом текущее значение i (1) умножается на каждое значение j (от 1

до 9 включительно), результат показывается на экран. Получается строка

таблицы умножения на 1.

Затем программа выходит из внутреннего цикла и переводит

экранный курсор на две строки вниз. После этого, осуществляется

увеличение переменной i на единицу и снова вход во внутренний цикл.

Теперь уже для вывода цепочки умножения на 2.

Таким образом, в конце концов на экране появляется вся таблица умножения.

 

Пример 2:

Постановка задачи:

Вывести на экран прямоугольник из символов 20 на 20.

Код реализации :

 

#include <windows.h>

#include <iostream>

#include <iomanip>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int str;

 int star_count;

 int length = 20;

 str = 1;

 

 cout << "Прямоугольник" << endl << endl;

 cout.fill('-');

 cout << setw(25);

 cout << "\n";

 while (str <= length)

 {

star_count = 1;

while (star_count <= length)

{

cout << "*";

star_count++;

}

cout << "\n";

str++;

 }

 cout << setw(25);

 cout << "\n";

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

Комментарий к коду:

1. Управляющая переменная внешнего цикла - str контролирует

количество строк в прямоугольнике.

2. Управляющая переменная внутреннего цикла - star_count

контролирует количество символов в каждой строке.

3. length - длина стороны прямоугольника

4. После отрисовки каждой строки, во внешнем цикле

осуществляется переход на следующую строчку прямоугольника.

5. Результат таков:

 

Примечание: Обратите внимание, что несмотря на то, что количество

                    строк соответствует количеству символов в строке - на экране не

                    квадрат! Это связано с тем, что высота и ширина символа разные.

 

Пример 3:

Постановка задачи:

Разработать программу, осуществляющую определение простых чисел в некотором пределе. Простое число - это такое  натуральное число, которое делится нацело только на 1 и само на себя. Первыми простыми числами будут 2, 3, 5, 7 и 11.

Самый легкий способ узнать, является ли число простым, состоит в делении его на все числа между 1 и им самим. Если оно делится нацело на какое-нибудь число из этого ряда, то оно - не простое. Мы воспользуемся операцией деления по модулю (%) для проверки, выполнялось ли деление нацело. (Вы не забыли еще, конечно, операцию деления по модулю? Ее результатом является остаток от деления первого операнда на второй. Если одно число делится на другое нацело, результатом операции деления по модулю будет 0.) При обнаружении какого-нибудь одного делителя числа дальнейшие проверки потеряют смысл. Поэтому в программе процесс проверки данного числа завершается после того, как найден его делитель.

Код реализации:

 

#include <stdio.h>

#include <windows.h>

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int number, divisor, limit;

 int count = 0;

 printf("Укажите верхний предел для поиска простых чисел \n");

 printf("Верхний предел должен быть 2 или больше: \n");

 scanf_s("%d", &limit);

 while (limit < 2)

 {

printf("Невнимательны! Попробуйте еще раз.\n");

scanf_s("%d", &limit);

 }

 printf("Сейчас будут печататься простые числа!\n");

 for (number = 2; number <= limit; number++)

 {

for (divisor = 2; number % divisor != 0; divisor++)

;

if (divisor == number)

{

printf("%5d", number);

if (++count % 10 == 0)

printf("\n");

}

 }

 printf("\nВот и всё\n");

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

Комментарий к коду:

Во внешнем цикле каждое число, начиная с 2 и кончая величиной limit, последовательно берется для проверки. Указанная проверка осуществляется во внутреннем цикле. Мы использовали переменную count для хранения счетчика получаемых простых чисел. При печати каждое одиннадцатое простое число мы начинаем с новой строки. Ниже приводится пример результатов, получаемых с помощью такой программы:

 

 

Вот и всё! Теперь у вас имеется полная информация о циклах, их

разновидностях и принципах работы.

 

Вопрос 3. Операторы break, continue. Дополнительные сведения и примеры

Использования.

 

Обычно после входа в тело цикла программа выполняет все находящиеся там

операторы, прежде чем проводить очередную проверку условия цикла. Операторы

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

Оператор continue .

 

Этот оператор может использоваться во всех трех формах циклов, но не в операторе switch.  Когда он встречается, он вызывает пропуск оставшейся части итерации и начало новой итерации. Для циклов while или for вслед за этим начинается новый шаг, а для цикла do while проверяется условие на выходе, и затем, если оно оказывается истинным, выполняется следующая итерация. Если оператор continue указан внутри вложенной структуры, он воздействует только на самую внутреннюю структуру, содержащую его.

Приведём пример использования оператора continue в следующей игровой программе, где последовательно вводятся некоторые числа, считается их количество, определяется их максимум и минимум, и их среднее арифметическое. Ввод прекращается, если вводится не числовое значение.

 

Код реализации:

#include <stdio.h>

#include <windows.h>

 

int main(void);

 

int main(void)

{

 system("cls");

 int i1 = GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 const float MIN = 0.0;

 const float MAX = 100.0;

 float score;

 float total = 0.0;

 int n = 0;

 float min = MAX;

 float max = MIN;

 printf("Введите результат первой игры (или q для завершения): ");

 while (scanf_s("%f", &score) == 1)

 {

if (score < MIN || score > MAX)

{

printf("%f - недопустимое значение. Повторите попытку: ", score);

continue; // переход к условию проверки цикла while

}

printf("Принимается %10.3f:\n", score);

min = (score < min) ? score : min;

max = (score > max) ? score : max;

total += score;

n++;

printf("Введите результат следующей игры (или q для завершения): ");

 }

 if (n > 0)

 {

printf("Среднее значение %d результатов равно %10.3f\n", n, total / n);

printf("Минимальное = %10.3f, максимальное = %10.3f\n", min, max);

 }

 else

printf("Не было введено ни одного допустимого результата.\n");

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

 

Комментарий к коду :

 

В данном коде цикл while читает входные данные до тех пор, пока не будет введено нечисловое значение. Оператор if внутри цикла отсеивает недопустимые значения результатов. Если вы, скажем, вводите число 188, программа сообщает о том, что оно является недопустимым. Затем оператор continue заставляет программу пропустить оставшуюся часть цикла, которая предназначена для обработки допустимого входного значения. Взамен программа начинает новую итерацию, считывая очередное входное значение.

Результат работы программы имеет следующий вид:

 

Рассмотрим ещё один небольшой пример:

 

#include <windows.h>

#include <stdio.h>

 

int main(void);

 

int main(void)

{

 system("cls");

 int i1 = GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 char ch;

 int chcount = 0;

 

 while ((ch = getchar()) != EOF)

 {

if (ch == ' ' || ch == '\n' || ch == '\t') /*пробел, новая строка, табуляция*/

continue;

putchar(ch);

putchar('\n');

chcount++;

 }

 printf("chcount= %d\n", chcount);

 

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 return 0;

}

Результат работы программы:

В этом программе осуществляется эхо-печать читаемых символов и подсчитывается число символов, отличных от пустых символов.

Оператор break .

 

Оператор break можно использовать внутри любого из трех операторов цикла и конструкции switch. Его выполнение приводит к тому, что управление программой, минуя оставшуюся часть тела цикла или конструкцию switch, содержащую данный оператор, передается на следующую (за этим циклом или за конструкцией switch) команду. Если оператор break находится внутри вложенных

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

котором он содержится.

В качестве примера приведём программу, которая содержит цикл

для вычисления площади прямоугольника. Цикл прекращается при вводе нечислового значения для длины или ширины прямоугольника.

 

Код реализации:

 

#include <stdio.h>

#include <windows.h>

 

int main(void);

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 float length, width;

 printf("Введите длину прямоугольника:\n");

 while (scanf("%f", &length) == 1)

 {

printf("Длинa = %0.2f:\n", length);

printf("Введите ширину прямоугольника: \n");

if (scanf("%f", &width) != 1)

break;

printf("Ширина=%10.3f\n", width);

printf("Площадь = %10.3f\n", length * width);

printf("Введите длину прямоугольника:\n");

 }

 printf("Программа завершена.\n");

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

Результат работы программы:

Комментарий к коду:

 

Цикл можно было бы реализовать следующим образом:

 

while (scanf("%f %f", &length, &width) == 2)

 

Однако применение оператора break существенно упрощает логику осуществления ввода значений.

    Как уже было сказано выше оператор break, помещённый внутрь

вложенного цикла, приводит к выходу только из внутреннего цикла; для выхода из

внешнего цикла необходим еще один оператор break.

    Рассмотрим следующий пример:

 

#include <stdio.h>

#include <windows.h>

 

int main(void);

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 double p, q;

 printf("Введите значение p=");

 while(scanf("%lf", &p)!=1)

 {

printf("Требуется ввести числовое значение. Будьте внимательны!!! Повторите ввод:\n");

  getchar();

 }

 while (p > 0)

 {

printf("Введенное значение p=%.2lf\n", p);

printf("Введите значение q=");

while(scanf("%lf", &q)!=1)

{

printf("Требуется ввести числовое значение. Будьте внимательны!!! Повторите ввод:\n");

getchar();

}

while(q > 0)

{

printf("Произведение p*q=%.2lf\n", p * q);

if (q > 100)

break; // выход из внутреннего цикла

printf("Введите значение q=");

while(scanf("%lf", &q)!=1)

{

printf("Требуется ввести числовое значение. Будьте внимательны!!! Повторите ввод:\n");

getchar();

}

}

if (q > 100)

break; // выход из внешнего цикла

printf("Введите значение p=");

while(scanf("%lf", &p)!=1)

{

printf("Требуется ввести числовое значение. Будьте внимательны!!! Повторите ввод:\n");

 getchar();

}

 }

 printf("Программа завершена.\n");

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

Результат работы программы:

 


Дата добавления: 2021-07-19; просмотров: 108; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!