, но мне действительно тяжело встраивать несколько циклов друг в друга.
Судя по всему, вам трудно писать эффективные циклы и просто не обратите внимание, пока вы не попытались их вложить. Посмотрите на ваши циклы, используя j
в качестве управляющей переменной l oop:
for(j = 0; j < 1; j++)
Технически, это оператор цикла. Однако он устанавливает j
в 0
, запускает l oop один раз , затем увеличивает j
до 1
и выходит из l oop. Трудно считать это реальным l oop, когда всегда есть только одна итерация. Если бы вы пропустили оператор for
и просто задали j = 0
.
, у вас было бы меньше работы, но все же есть проблема с тем, как вы вложили циклы. Ваши циклические структуры (игнорируя другие операторы в телах l oop) следующие:
for(i = 0; i <= size; i++){
for(j = 0; j < 1; j++){
for(j = 0; j < 1; j++){
Обратите внимание, что в среднем и самом внутреннем циклах используется j
? Это катастрофа, ожидающая случиться. Не используйте вложенную переменную l oop с управляющей переменной l oop, содержащей l oop.
Еще лучше, старайтесь избегать циклов вложенности. Подумайте о том, что вы хотите, чтобы происходило с каждой итерацией al oop, а затем передайте эту функцию другой функции. Например, ваш самый внешний l oop может выглядеть так:
for(i = 0; i <= size; i++)
printSection(i, size);
Тогда вы могли бы написать функцию printSection
для обработки каждой секции здания. Это было бы намерением вашего среднего l oop, верно? (Если нет, измените детали в соответствии с вашими намерениями. Смысл в том, чтобы не путать много шагов в один кусок кода.) Вы можете легко протестировать эту функцию самостоятельно. Пусть ваша основная функция, например, вызовет printSection(1,2);
вместо использования al oop, и убедитесь, что вывод соответствует тому, что в описании вашей проблемы. Повторите эти действия для printSection(2,2);
и для других примеров, чтобы убедиться, что эта функция работает должным образом.
// Print section number `section` for a building with `size` sections.
void printSection(int section, int size)
{
for(int i = 0; i <= section; i++) {
// Handle the indent here, since it is the same throughout the section.
cout << setw(size - section) << ' ';
// Delegate the floor details to another function.
printFloor(i, section);
// End the line. Alternatively, this could be delegated to printFloor.
cout << '\n';
}
}
Вы можете заметить, что я использовал i
в обоих циклах. Разве я не говорил, что это проблема? Это было бы, если бы петли были непосредственно вложенными. Однако они находятся в отдельных функциях, поэтому проблем нет.
Далее вы должны написать функцию printFloor
. Я бы начал просто; у printFloor(int floor, int section)
изначально просто пишется символ канала ('|'
), за которым следуют 2*section + 2
двоеточия, за которым следует еще один символ канала. Как только вы это заработаете, вы можете беспокоиться о Х через здание. Начните с малого, разделяйте и властвуйте, и убедитесь, что каждый кусок работает, прежде чем объединять вещи.