For ( выражение 1 ; выражение 2 ; выражение 3 ) оператор

      Комментарии к записи For ( выражение 1 ; выражение 2 ; выражение 3 ) оператор отключены

Лабораторная работа №2

Программирование циклических процессов на языке С++

Цель: Изучение алгоритмов работы циклов и принципы их программирования на языке С++.

Основные сведения

Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Основная цель циклов – сократить размер текста программы, когда в ходе вычислений требуется многократное выполнение некоторых инструкций, например обработка нескольких результатов опыта по одному и тому же алгоритму или перебор записей в базе данных для поиска по заданному условию. Циклический процесс можно реализовать без использования специализированных операторов, применяя условный оператор ifи оператор безусловного перехода goto. Однако такой подход является неэффективным, поскольку использование оператора goto нарушает иерархическую структуру программы и затрудняет понимание написанного кода. В языке С++ для реализации циклических вычислительных процессов используются операторы while, do whileиfor.

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

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

В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая (рис.1):

1. Вычисляется выражение.

2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.

3. Процесс повторяется с пункта 1.

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

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

int Sum=0, x; //в Sum будем накапливать сумму, в x хранить

//очередное введенное число

cinx; //вводим первое число

while (x!=0) //пока x не равно нулю, можно короче: while(x)

{

Sum+=x; //складываем очередное введенное число с суммой

cinx; //ввод следующего числа

}

cout

Если первое введенное пользователем число будет равно нулю, тело цикла не будет выполнено ни разу. Количество шагов цикла заранее неизвестно и зависит от ввода пользователя.

Оператор do while

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

do {тело} while (выражение);

Схема выполнения оператора do while (рис.2):

1. Выполняется тело цикла (которое может быть составным оператором).

2. Вычисляется выражение.

3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.

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

int Sum=0, x; //в Sum будем накапливать сумму, в x хранить

//очередное введенное число

do

{

cinx; //ввод числа

Sum+=x; //складываем очередное введенное число с суммой

}

while (x!=0) //пока x не равно нулю, можно короче: while(x)

cout

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

Операторы while и do while могут быть вложенными.

Пример:

int i,j,k;

i=0; j=0; k=0;

do { i++;

j—;

while (a[k]i) k++;

}

while (i

Оператор for представляет самые мощные средства организации цикла в языке Си++. Он имеет следующий формат:

for ( выражение 1 ; выражение 2 ; выражение 3 ) оператор

Выражение 1 предназначено для выполнения предвычислений, вычисляется однократно до начала цикла. Обычно используется для установления начальных значений переменных, управляющих циклом. Выражение 2 — это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 – итерационное, вычисляется после выполнения каждого шага цикла. Обычно определяет изменение переменных, управляющих циклом.

Схема выполнения оператора for (рис.3):

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется оператор тела цикла (если необходимо циклически выполнить совокупность операторов, они оформляются в составной оператор), вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

Оператор цикла вида for (выражение 1; выражение 2; выражение 3) тело цикла ; может быть заменен оператором while следующим образом:

выражение 1;

while (выражение 2)

{ тело цикла;

выражение 3;

}

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

int x, Sum;

cinx; //вводим первое число

for (Sum = 0; x!=0; )

(

Sum += x; //складываем очередное введенное число с суммой

cinx; //ввод следующего числа

}

cout

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

int i,b;

for (i=1; i

cout

В этом примере вычисляются и выводятся на экран квадраты чисел от 1 до 9. Переменная i выполняет роль счетчика цикла, начальное значение ей присваивается в выражении 1 оператора for, модификация (увеличение на 1) производится в выражении 3, а проверка на достижения предельного значения – в выражении 2. Таким образом, строка вида

for (cчетчик_цикла=начальное_значение; счетчик_циклапредельное_значение+1; счетчик_цикла+=шаг_изменения)

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

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

Пример:

int main()

{ int top, bot;

char string[100], temp;

for ( top=0, bot=100 ; topbot ; top++, bot—)

{ temp=string[top];

string[bot]=temp;

}

return 0;

}

В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько выражений, записанных через запятую, и выполняемых последовательно.

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

unsigned int n, f;

cinn;

for (unsigned int i=2, f=1; i

cout

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

Еще один пример с использованием пустого оператора в теле цикла for.

for (i=0; t[i]

В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.

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

for (;;)

{ …

if (условие окончания цикла) break;

}

Оператор break предназначен для принудительного завершения охватывающего оператора. Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch, do while, for, while. После выполнения оператора break управление передается оператору, следующему за прерванным.

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

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

int pr=1, val, i;

for (i=1; i

{

cinval; //вводим очередное число

if (val==1) continue; //если ввели единицу – к следующему числу

if (val==0) //если ввели 0

{pr=0;break;} //обнуляем произведение, выходим из цикла

pr*=val; //домножаем текущее произведение на введенное число

}

cout

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

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

int pr=1, val, i;

for (i=1; i

//прекращаем цикл

{

cinval; //вводим очередное число

if (val!=1)//если ввели единицу – к следующему числу

pr*=val; //домножаем текущее произведение на введенное число

}

cout

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

1. Какие операторы цикла языка Си++ вам известны?

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

3. Чем оператор цикла for отличается от оператора while?

4. Как сформулировать несколько условий продолжения/выхода из цикла?

5. Как принудительно завершить работу циклического оператора?

6. *Как можно организовать итерационный вычислительный процесс, не используя операторов цикла?

Порядок выполнения работы

1. Ознакомьтесь с теоретическими основами программирования циклических процессов на языке С++ в настоящих указаниях и конспектах лекций.

2. Получите вариант задания у преподавателя.

3. Составьте алгоритм решения задачи согласно варианту задания, оформите его в графической форме.

4. Используя разработанный алгоритм, напишите программу .

5. Отладьте разработанную программу и покажите результаты работы программы преподавателю.

6. Составьте отчет по лабораторной работе.

7. Отчитайте работу преподавателю.

Содержание отчета

Отчет по лабораторной работе должен содержать следующие сведения:

-название и цель работы;

-вариант задания;

-ответы на контрольные вопросы;

-графическую схему алгоритма решения задачи;

-листинг разработанной программы с комментариями;

-результаты работы программы.

Пример оформления отчета:

Вариант№11(пример)

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

#include

#include

#include

using namespace std;

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP (1251);

int x=0,c=0,n=4,first,otric=0,bol=0,i;

system(“cls”);

cout

cinfirst;

if (first

for (i=2;i

{

cout

cinx;

if (x

if (xfirst) bol++;

}

cout

cout

system(“pause”);

return 0;

}

Дана последовательность чисел. Определить количество чисел, две последних цифры которых кратны 3.

#include

#include

#include

using namespace std;

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP (1251);

int x,c,n,i,count=0;

system(“cls”);

do

{

cout

cinx;

c=x%100;

n=c/10;

i=c%10;

if (x9n%3==0i%3==0) count++;

}

while(x!=0);

cout

system(“puase”);

return 0;

}

Варианты заданий

Вариант№1

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

2.Дана последовательность чисел. Посчитать сумму цифр всех отрицательных чисел.

Вариант№2

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

2.Дана последовательность чисел. Посчитать сумму цифр всех чётных чисел.

Вариант№3

1.Дана последовательность целых чисел. Известно, что среди них несколько раз встречаются два подряд идущих нуля. Определить, сколько раз встречается эта ситуация.

2.Дана последовательность чисел. Посчитать произведение цифр последнего числа, кратного 5.

Вариант№4

1.Дана последовательность целых чисел до 0. Найти сумму целых чисел, которые одновременно больше 20, меньше 100 и кратны 3.

2.Дана последовательность чисел. Посчитать произведение цифр первого числа, кратного 3.

Статьи к прочтению:

Javascript-джедай #3 — Выражения и операторы


Похожие статьи: