Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования (пособие).doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
965 Кб
Скачать
☆

3.5.1 Простой вложенный цикл

Выведем на экран четырьмя способами картинку, изображенную на рис. 9.

Рисунок 9. Квадрат из звездочек

Способ 1. Написать cout десять раз.

cout << "**********\n"; cout << "**********\n";

cout << "**********\n"; cout << "**********\n";

cout << "**********\n"; cout << "**********\n";

cout << "**********\n"; cout << "**********\n";

cout << "**********\n"; cout << "**********\n";

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

Внесем небольшое усовершенствование:

int size = 10;

for (int row=1; row<=size; row++) {

cout << "**********\n";

}

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

Тем не менее, недостаток есть и в этом коде. Пока в каждой строке присутствует по 10 звездочек, и, если потребуется изменить это количество, то придется переписывать программу. Это также делает невозможным ввод количества звездочек в строке с клавиатуры. Решить рассмотренную проблему можно, заменив разовый вывод 10 звездочек на цикл, который окажется вложенным:

int n_rows = 5, n_stars = 15;

for (int row=1; row<=n_rows; row++) {

for (int star=1; star<= n_stars; star++) {

cout << "*";

}

cout << "\n";

}

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

3.5.2Вынесение вложенного цикла в функцию

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

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

void drawStars(int n_stars) {

for (int star=1; star<=n_stars; star++) {

cout << "*";

}

}

void newLine() {

cout << "\n";

}

С использованием созданных функций (точнее, процедур) разработанная программа примет значительно более понятный вид.

int n_rows = 5, n_stars=15;

for (int row=1; row<=n_rows; row++) {

drawStars(n_stars);

newLine();

}

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