
- •Глава 2 Условия, выбор и циклы
- •Структура условия
- •Структура множественного выбора
- •Конструкция цикла for
- •Цикл с предусловием
- •Цикл с постусловием
- •Типовые примеры
- •Подсчет суммы цифр в числе
- •Анализ четности пары чисел
- •Построение треугольников из отрезков
- •Подсчет по условию
- •Возможность построения прямоугольного треугольника
- •Представление слова с учетом падежа
- •Формирование таблицы стоимости товаров
- •Поиск чисел
- •Анализ чисел
Конструкция цикла for
В программе часто требуется повторять определенные действия. Такое повторение называется циклом. А сама последовательность выполняемых команд представляет собой тело цикла. Наиболее простая и в то же время часто встречающаяся ситуация связана со случаем, когда число повторений цикла известно заранее. На языке С/С++ для реализации такого алгоритма действий используется операторfor.
Подсчет количества выполняемых действий осуществляется при помощи специальной переменной — счетчика. Синтаксис цикла выглядит следующим образом:
for ( i = 1; i < B ; i++)
оператор,
где i = 1— начальное значение счетчика, аi < B— условие выполнение цикла.
В данном случае после очередного выполнения тела цикла значение счетчика увеличивается на единицу (i++). Далее это новое значение сравнивается с условием. Если условие выполняется, то цикл повторяется опять (выполняется оператор после конструкции for). Таких проходов цикла может быть очень много. Но как только условие не будет выполнено, выполнение цикла прекращается.
Рассмотрим сначала пример, связанный с последовательным увеличением счетчика. Наша задача заключается в том, чтобы обеспечить ввод с экрана десяти оценок студентов по определенной дисциплине. После этого программа должна подсчитать средний балл по введенным оценкам и вывести его на экран. Текст разработки приведен в листинге 2.9.
Листинг 2.9. Расчет среднего балла по дисциплине
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
void main()
{ int A,J;
float Srednee;
Srednee=0.0;
for (J=1;J<=10;J++)
{
cout << "Ввести оценку";
cin >> A;
Srednee=Srednee+A;
}
Srednee=Srednee/10;
cout <<"\n"<<Srednee;
_getch();
}
Здесь переменная Jявляется счетчиком цикла. Для отражения описанных действий в блок-схеме имеется необходимый элемент. Его функциональность мы поясним на примере блок-схемы только что рассмотренного алгоритма расчета среднего балла (рис. 2.6). Новый элемент (под названием "подготовка") внешне представляет собой шестиугольник, который описывает организацию цикла. Внутри шестиугольника указывается конструкция, включающая счетчик и три числа. Первым после счетчика цикла располагается число, представляющее для него начальное значение, следующее число — это конечное значение для счетчика, а последнее — шаг цикла (с каким шагом изменяется счетчик цикла). Левый вход в этот блок определяет возврат к началу после очередного прохождения тела цикла, а правый выход определяет переход после выхода из цикла (когда значение счетчика вышло за пределы своего конечного значения).
Рис. 2.6. Блок-схема к программе листинга 2.11
Рассмотрим пример программы, которая вычисляет отдельно сумму четных чисел и сумму нечетных чисел в исходной последовательности целых чисел от 1 до N. Значение N вводится с клавиатуры, а вычисленные суммы чисел должны выводиться на экран. В листинге 2.10 приведен текст программы, а на рис. 2.7 приведена блок-схема алгоритма решения данной задачи.
Рис. 2.7. Блок-схема к программе листинга 2.10
Листинг 2.10. Расчет сумм четных и нечетных чисел
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
void main()
{ int N,J,Summa1,Summa2;
cout << "Введите целое положительное число";
cin >> N;
Summa1=0;
Summa2=0;
for (J= 1 ; J <=N; J++)
{
if ((J % 2) == 1 )
Summa1= Summa1+J;
else
Summa2= Summa2+J;
}
cout << "Сумма нечетных чисел равна "<<Summa1;
cout << "\nСумма четных чисел равна"<<Summa2;
_getch();
}
Рассмотрим теперь построение следующего алгоритма: требуется по введенному с клавиатуры целому положительному числу выдать заключение — является ли оно простым.
Простымисчитаются целые положительные числа, которые делятся без остатка только на себя и на единицу.
Идея алгоритма заключается в анализе ситуаций, когда остаток от деления исходного числа N на числа в интервале от 1 до N равен 0. Если таких случаев будет больше двух, то число не простое. В противном случае число является простым. Блок-схема алгоритма приведена на рис. 2.8, а текст программы представлен в листинге 2.11.
Листинг 2.11. Проверка, является ли введенное число простым
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
void main()
{ int N,J,Summa;
cout << "Введите целое положительное число";
cin >> N;
Summa=0;
for (J= 1 ; J <=N; J++)
{
if ((N % J) == 0 )
Summa= Summa+1;
}
if (Summa > 2)
cout << "Число не простое";
else
cout << "\nЧисло простое";
_getch();
}
Рис. 2.8. Блок-схема к программе листинга 2.11
Однако рассмотренный алгоритм не является оптимальным с точки зрения вычислительных действий. Очевидно, что проверку "является ли число простым" можно организовать более эффективным способом. А именно: если мы найдем в интервале от 2 до N-1 хотя бы одно число, на которое N делится без остатка, то из этого уже следует, что N не является простым.
Для реализации этой идеи в виде программной разработки нам потребуется новый оператор. Это — break, прерывающий выполнение цикла и передающий управление оператору, который должен выполняться после окончания цикла. И в листинге 2.12 показана программа, которая делает рассмотренную проверку чисел более эффективной. Алгоритм поясняет блок-схема, которая представлена на рис. 2.9. Мы ввели переменнуюFlag, которая играет роль индикатора. В начале программы эта переменная устанавливается в ноль. Если в процессе анализа находится значение, на которое исходное число делится без остатка, то происходит установка переменнойFlag в единицу и цикл завершается. В заключительной части программы в зависимости от значенияFlag производится вывод соответствующего сообщения.
Рис. 2.9. Блок-схема к программе листинга 2.12
Листинг 2.12. Более эффективный алгоритм анализа простых чисел
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
void main()
{ int N,J,Flag;
cout << "Введите целое положительное число";
cin >> N;
Flag=0;
for (J= 2 ; J <=(N-1); J++)
{
if ((N % J) == 0 )
{
Flag=1;
break;
}
}
if (Flag == 1)
cout << "\n Число не простое";
else
cout << "\n Число простое";
_getch();
}
Все рассмотренные примеры касались использования счетчика цикла на увеличение. Однако, имеется возможность использования forc организацией уменьшения счетчика. Рассмотрим пример на эту тему.
Задана числовая последовательность Exp(N)*N, гдеNизменяется от 1 до 50. Необходимо найти такое максимальноеN, при котором значение элемента этой последовательности меньше 10 000. В данном случае мы организуем цикл в направлении уменьшенияNот 50 до 1. При нахождении искомого числа цикл завершается.
В листинге 2.13 приведена программа, которая решает поставленную задачу. Алгоритм поясняет блок-схема, представленная на рис. 2.10.
Листинг 2.13. Пример организации счетчика на уменьшение
#include <iostream>
using namespace std;
#include <conio.h>
#include <math.h>
void main()
{ int N,Nmin;
float Func;
Nmin=0;
for (N= 50; N >=1; N--)
{
Func=exp((float)N)*N;
if (Func < 10000. )
{
Nmin=N;
break;
}
}
cout << "N="<<Nmin;
_getch();
}
Рис. 2.10. Блок-схема к программе листинга 2.15