Вопрос 6. Примеры использования.

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

Вопрос 1. Оператор цикла for.

 

На прошлом уроке было рассмотрено такое понятие как цикл и рассмотрены некоторые из конструкций, представляющих циклы в языке C / C ++. А, именно - while и do while. Сейчас рассмотрим ещё одну разновидность цикла - оператор цикла for.
     Данный оператор теоретически является полной аналогией оператора while, но в практическом направлении позволяет организовать цикл с более удобным управлением.

Оператор цикла for имеет следующий общий вид:

 

for(инициализация; проверка условия; коррекция)

тело цикла

 

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

Вместе с ключевым словом for они образуют так называемый заголовок цикла for.

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

Оператор for - цикл с предусловием. Тело цикла может представлять собой как простой, так и сложный (составной) оператор.

 

Пример:

 

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

 printf("%d %d\n", n, 2*n+1);

 

В выражениях заголовка цикла for может использоваться операция «запятая». Операция «запятая» связывает два выражения в одно и гарантирует, что самое левое выражение будет вычисляться первым. Обычно она используется для включения дополнительной информации в заголовок цикла for.

Пример:

 

for(step=2,fargo=0;fargo<1000;step*=2)

 fargo+=step;

 

Замечания:

1.Операция «запятая» может быть включена в корректирующую или в  

инициализирующую части оператора for , но не в проверяющую.

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

но нельзя опускать точку с запятой, которые разделяют три

составляющие цикла.

 

Пример:

 

#include <windows.h>

#include <stdio.h>

 

int main()

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int num=1;

 for(; num<5; num++)

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

 printf("Для продолжения <ENTER>\n");

 getchar();

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

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

 

Вопрос 2. Рекомендации по выбору цикла.

 

Когда решено, что цикл необходим, возникает вопрос: какой из них должен использоваться?

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

Исследователи в области вычислительной техники считают циклы с предусловием более удачными по нескольким причинам.

- Во-первых, в общем случае условие лучше проверять до выполнения итерации, а   

не после неё.

- Во-вторых, программа проще для восприятия, если условие цикла находится в

начале цикла.

- В-третьих, во многих ситуациях важно, чтобы цикл был пропущен полностью,

если условие изначально не удовлетворяется.

    При организации меню лучше использовать цикл с постусловием.

Предположим, что требуется цикл с предусловием. Это должен быть цикл for или же цикл while?

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

 

for ( ; условие проверки ; )

 

эквивалентен циклу

 

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

 

Чтобы придать циклу while вид, подобный for, предварите его инициализацией и предусмотрите внутри тела операторы для обновления значений. Например:

инициализация;

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

 {

тело цикла;

 обновление;

 }

 

эквивалентно

 

for (инициализация; условие-проверки; обновление(корректировка))

 тело цикла;

 

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

Цикл while целесообразно применять для следующего условия:

 

while(scanf("%ld", &num) == 1)

 

Цикл for является более естественным выбором, когда реализуется подсчет для какого-нибудь индекса:

 

for(count=1; count<=100; count++)

 

Вопрос 3. Оператор break .

 

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

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

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

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main()

{

 system("cls");

 

 int x=1;

 for(;;x++)

 {

if(x==4)

break; // если x стал равен 4 - выйти из цикла

cout<<x<<endl;

 } 

 cout << "Bye!" << endl;

 cout << "Bye!" << "\n";//эквивалентно предшествующей строке

 return 0;

}

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

 

Комментарии к примеру.

1. Согласно правилу, условие цикла всегда истинно, так как его просто нет.

2. При значениях 1,2 и 3 переменной x условие оператора if выполняться не

будет. break, естественно, не сработает, так как находится в теле if. Между тем,

на экран последовательно будут выводиться числа 1,2,3.

3. Когда х станет равно 4, программа попадет в тело if и выполнится break. Цикл

сразу же будет остановлен, а выполнение программы перейдет на следующую

строчку за закрывающейся фигурной скобкой оператора for.

4. На экране появится надпись Bye!

5. Цифра 4 на экране никогда не появится, так как, если сработал break, все, что

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

Замечание: break может быть использован только либо в цикле, либо

      в операторе switch. Любое другое размещение приводит к

      ошибке на этапе компиляции.

 

Вопрос 4. Оператор continue.

 

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

 

Пример 1:

 

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

 {

if(ch == " ") /*пробел*/

continue;

putchar(ch);

chcount++;

 }

 

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

 

Пример 2:

Показать на экран все нечётные целые числа, в диапазоне от нуля до 25

включительно.

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main()

{

 system("cls");

 

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

 {

if(i % 2 == 0)// если число делится на два без остатка

{

continue;// остановить итерацию цикла и перейти к i++

}

cout << i << "\n";

 }

 return 0;

}

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

Комментарии к примеру.

1. Цикл начинает свое движение с нуля и проходит итерации до 25 включительно.

2. Внутри цикла предусмотрено условие: если число i - чётное, нужно

остановить текущий шаг цикла (continue;) и перейти к конструкции i++.

3. То, что располагается ниже сработавшего оператора continue на текущем шаге

уже не выполнится.

4. Если условие if не выполняется, значит число i нечетное; if будет

проигнорирован, а число отображено на экране.

 

Вопрос 5. Оператор goto.

 

Оператор goto имеет следующую общую форму записи:

 

goto метка;

метка: оператор;

 

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

 

Пример:

 

top:ch=getchar();

if(ch != 'y')

 goto top;

             …

Замечание : Стиль хорошего программирования предусматривает

      написание кода без использования goto . Язык C / C ++

      способствует написанию программ без goto .

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

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

 

for (…)

 for (…)

 {

if(abs)

goto error;

 }

error:

{

 ликвидация ошибки;

}

 

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

Теперь, когда рассмотрены теоретические материалы урока,

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

 

Вопрос 6. Примеры использования.

 

Пример 1.

 

Условие задачи.

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

которая подсчитает, сколько раз пробьют часы за 12 часов.

 

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

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int sum=0;

 for(int bom=1; bom<=12; bom++)

 {

sum += bom;// накопление суммы ударов

 }

 cout << "Часы пробили " << sum << " раз.\n\n";

    

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

 

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

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

1. Изначально объявляется переменная sum равная нулю.

2. Цикл формируется из трех конструкций int bom=1; - начальная инициализация,

bom<=12; - проверочное условие, bom++ - изменение управляющей переменной  

(коррекция).

3. Внутри тела цикла накапливается сумма ударов путем прибавления

управляющей переменной к значению общей суммы.

4. Когда bom достигнет значения 13, цикл остановится и на экран покажется

результат.

 

Пример 2.

 

Условие задачи.

Пользователь с клавиатуры последовательно вводит целые числа. Как только

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

 

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

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int digit, sum = 0;

 for(;;)

 {

// реализация бесконечного цикла

cout << "Введите число:";

cin >> digit; // ввод числа

if(digit == 0) // если введен 0

break; //остановить цикл

sum += digit; // накопление суммы

 }

 // показ результата

 cout << " Сумма чисел = " << sum << "\n\n";

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

 

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

 

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

1. В программе реализован условно бесконечный цикл. То есть остановка цикла

происходит искусственным путём за счёт использования оператора break.

2. На каждой итерации пользователь вводит число.

3. Осуществляется проверка, если это число - 0, значит пора остановить цикл, если   

не 0, необходимо прибавить число к общей сумме.

4. После того, как отработает оператор break и цикл прекратит работу, на экран  

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

 

Пример 3.

 

Условие задачи.

Написать программу, которая показывает все числа, которым кратно число,

введённое с клавиатуры.

 

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

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main(void)

{

 system("cls");

 int i1=GetConsoleCP();

 SetConsoleCP(1251);

 SetConsoleOutputCP(1251);

 

 int digit;

 cout << "Введите число:";

 cin >> digit;

 // цикл перебирает числа от 2 до введенного числа

 for(int i=2; i<digit; i++)

 {

// если число не делится на текущее

// значение i без остатка остановить

// данный шаг и перейти к

// следующему

if(digit%i != 0)

continue;

// показать i на экран

cout << i << "\n";

 }

 

 SetConsoleCP(i1);

 SetConsoleOutputCP(i1);

 return 0;

}

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

 

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

1. Пользователь вводит число для анализа.

2. Цикл последовательно перебирает все числа от 2 до исходного.

3. Осуществляется проверка: если исходное число на текущее без остатка не  

делится, необходимо прервать данный шаг цикла и перейти к части i++.

(используется оператор continue).

4. Если исходное число на текущее без остатка делится, то на экран показывается

текущее число.

 


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

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




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