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

3.5.3Зависимость вложенных циклов

Рассмотрим теперь, как вывести на экран картинку, изображенную на рис. 10.

Рисунок 10. Треугольник из звездочек

В данном случае количество звездочек в строке зависит от номера строки, точнее, равно номеру строки. Значит, в качестве аргумента процедуры drawStars() нужно передать номер строки:

int n_rows = 7;

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

drawStars(row);

newLine();

}

Если не использовать созданные нами процедуры, то программа примет вид

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

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

cout << "*";

}

cout << "\n";

}

На этом фрагменте кода видно, что внутренний цикл зависит от внешнего. Для «переворота» картинки (рис. 11) достаточно внести одно изменение:

int n_rows = 7;

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

drawStars(n_rows-row);

newLine();

}

Рисунок 11. Перевернутый треугольник из звездочек

А можно сделать нечто похожее на медиа-плейер (рис. 12), выводя случайное число звездочек на каждой строке:

int n_rows = 7;

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

drawStars(1+rand()%n_rows);

newLine();

}

Рисунок 12. Медиаплейер

3.5.4 Два цикла, вложенные в третий

Рассмотрим похожую, но требующую чуть более сложного кода картинку (рис. 13).

Рисунок 13. Еще один треугольник из звездочек

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

void drawSpaces(int n_spaces) {

for (int space=1; space<=n_spaces; space++) {

cout << " ";

}

}

Затем применим ее в своей программе:

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

drawSpaces(n_rows-row);

drawStars(row);

newLine();

}

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

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

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

cout << " ";

}

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

cout << "*";

}

cout << "\n";

}

3.5.5Понятие api

Созданные функции drawStars(), drawSpaces() и newline() образуют прикладной программный интерфейс, хотя и совсем небольшой. С помощью него можно довольно легко рисовать всевозможные картинки. Например, изображенную на рис. 14.

int n=10;

drawSpaces(n+1);

drawStars(1);

newLine();

int spaces1 = n;

int spaces2 = 1;

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

drawSpaces(spaces1);

drawStars(1);

drawSpaces(spaces2);

drawStars(1);

newLine();

spaces1--;

spaces2+=2;

}

drawStars(2*n+3);

Рисунок 14. Треугольник без внутренности

Можно перевернуть этот треугольник (рис. 15).

int n=10;

drawStars(2*n+3);

newLine();

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

drawSpaces(row);

drawStars(1);

drawSpaces(2*n-2*row+1);

drawStars(1);

newLine();

}

drawSpaces(n+1);

drawStars(1);

Рисунок 15. Перевернутый треугольник без внутренности

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