Мы с вами успели познакомиться с тремя конструкциями повторения в языке программирования C++. Это циклы for, while и do while. Если вы обратили внимание, вложение конструкций логического выбора if и else в циклы уже применялось. Сейчас же мы рассмотрим вложенные циклы – это когда в теле одного цикла (внешнего) размещается другой цикл (внутренний). Таких вложенных циклов во внешнем цикле может быть несколько.
По своей структуре, вложенные циклы напоминают мне коробки разных размеров, как на нашем рисунке. Эти коробки легко можно сложить друг в друга и поместить в одну большую коробку. Так и с циклами. Программе, чтобы добраться к вложенному циклу, необходимо сначала приступить к выполнению внешнего цикла (открыть крышку большой коробки), выполнить, то что прописано в коде до вложенного цикла и потом уже приступить к выполнению этого цикла.
Есть один интересный распространённый пример, для демонстрации работы вложенных циклов. Рассмотрим его: применяя циклы, необходимо нарисовать прямоугольник размером 5 х 15 из символов @.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> using namespace std; int main() { for (int i = 0; i < 5; i++) // этот цикл отвечает за кол-во строк { for (int j = 0; j < 15; j++) // этот - за кол-во символов в каждой строке { cout << '@'; } cout << endl; // переход на строку ниже } return 0; } |
Сначала начинает выполняться цикл for в строке 6. Так как в его теле ничего не прописано до второго цикла, программа сразу приступает к выполнению этого вложенного цикла – строки 8 – 11. В результате его выполнения, на экране в одной строке отображаются 15 символов @ и происходит выход из него. Тут сработает cout в строке 12, управляющая переменная i увеличится на единицу и продолжится выполнение главного и вложенного циклов. То есть снова 15 символов на экране и переход на строку ниже. Так будет сделано 5 раз, после чего программа завершит работу. На экране видим то, что было в условии:
Можно эту задачу немного усложнить. Теперь пусть символ для печати фигуры выбирает пользователь, посредством ввода с клавиатуры. Он же выберет размер – ширину и высоту. Еще одно новшество – фигура должна быть пустой, а не заполненной, как в нашем предыдущем примере. То есть она должна состоять только из контура. Вот наше решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "rus"); int lines = 0; int symbInLines = 0; char symbol = 0; cout << "Введите символ: "; cin >> symbol; cout << "Количество строк: "; cin >> lines; cout << "Количество символов в строке: "; cin >> symbInLines; cout << endl; for (int i = 1; i <= lines; i++) { if (i == 1 || i == lines) // 1-я и последняя строка { for (int j = 1; j <= symbInLines; j++) { cout << symbol; // сплошная из символов } } else // все строки между первой и заключительной { cout << symbol; // показать один символ for (int j = 1; j <= symbInLines - 2; j++) { cout << ' '; // пробелы в строке (symbInLines - 2) раз } cout << symbol; // показать ещё один символ } cout << endl; // новая строка } cout << endl; return 0; } |
Результат зависит от введенных данных, которые задаст пользователь. У меня получился черный квадрат из вопросов :)
Еще один пример: печать таблицы умножения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <iostream> using namespace std; int main() { for (int f = 2; f <= 9; f++) { for (int s = 1; s <= 9; s++) { cout << f << " * " << s << " = " << f * s; cout << endl; } cout << endl; } cout << endl; return 0; } |
В результате увидим таблицу умножения:
.
.
.
.
.
.
.
.
.
На рисунках показаны только начало и конец таблицы.
Надеюсь урок был для вас полезен. Вложенные конструкции в программировании на C++ встречаются достаточно часто. Обязательно рассмотрите задачи, которые мы приготовили. Если у вас остались какие-то вопросы по теме – ждем их в комментариях.
Какие основные правила их организации?
Трудно сказать что вы подразумеваете под основными правилами?
Основные правила:
– циклы должны быть вложены по принципу “матрёшки”: каждый внутренний цикл должен **полностью** помещаться внутрь охватывающего;
– никогда не изменяйте параметр (переменную) внешнего цикла во внутреннем;
– никогда не выходите из вложенных циклов оператором goto;
Скажите, чем отличается принцип вложенных циклов в C++ от C#
В принципе, ни чем.
Хотя C# … это отстой, и к обсуждениям на этом сайте не имеет никакого отношения.
Почему отстой?
Скажите, данное решение примера из вашего урока с квадратом из символов, эквивалентно вашему решению приведённому в уроке? Или же ваш вариант всё таки имеет преимущество? Если да то в чём? Спасибо.
Решение любой задачи можно записать многими, часто многими десятками, разными способами.
Критерием правильности программы является только результат её выполнения – запустите и убедитесь.
А как сделать: пользователь вводит радиус и рисуется круг с таким радиусом
P.s. Извиняюсь если есть ошибки( я школьник:) )
Идентичное решение с возможностью выбора:
#include
using namespace std;
int main()
{
int lines, columns;
char sym;
cout <> sym;
cout <> lines;
cout <> columns;
for (int i = 1; i <= lines; i++)
{
for (int j = 1; j <= columns; j++)
{
if (j == 1 || i == 1)
{
cout << sym;
continue;
}
else
{
if (i == lines || j == columns)
{
cout << sym;
if (j == columns)
{
break;
}
}
else
{
cout << " ";
}
}
}
cout << endl;
}
return 0;
}
Артём, как ты так смог код вставить в комментарии?
to Asker:
“рисуется круг” – это задача из области графики, она не имеет ни малейшего отношения к языку программирования C++, и на 100% определяется тем, какими графическими библиотеками (фреймворком: MFC, Qt, GTK, wxWidgets и др.) вы пользуетесь + в какой операционной системе.
Друг дал такое задание на с++ : )
“круг” нельзя “рисовать” на C++.
“круг” можно “рисовать” только функциями из разных графических библиотек … которые могут вызываться, в том числе, и из кода на C++.
Но непосредственно к C++ это не имеет никакого отношения.
P.S. Передайте это своему другу.
здравствуйте, можете ответить на мой вопрос ниже
Как сделать
ДВОЙНОЙ ЦИКЛ:РАСПЕЧАТАТЬ
******
******
******
кто знает как можно сделать так чтобы, в задании с пустым квадратом, стороны были двойные?
ниже написал
Наверное так
#include
using namespace std;
int main()
{
setlocale(LC_ALL, “rus”);
system(“cls”);
double sredn = 0;
int exit = 0, a = 0, b = 0;
cout << "Введите длину и высоту сторон: " <> a;
cin >> b;
for (int i=0; i < a;i++)
{
for (int j=0 ; j < b; j++)
{
if ( j == 0 || j==a-1 || j == 1 || j == a – 2)
cout << "q";
else if (i == 0 || i == b – 1 || i == 1 || i == b – 2)
cout << "q";
else cout << " ";
}
cout << endl;
}
return 0;
}
как сделать
00000
00000
00800
08880
88888