Образец может быть выведен с использованием только одного цикла.
Вот демонстративная программа.
#include <iostream>
#include <iomanip>
int main()
{
while (true)
{
const char c = '*';
std::cout << "Enter non-negative number (0 - exit): ";
unsigned int n;
if (!(std::cin >> n) || n == 0) break;
std::cout << '\n';
for (unsigned int i = 1; i < 2 * n; i++)
{
unsigned int w = i <= n ? i : 2 * n - i;
std::cout << std::setfill(c) << std::setw(w + 1) << '\n';
}
std::cout << std::endl;
}
return 0;
}
Если ввести последовательно
5 4 3 2 1 0
то вывод программы будет выглядеть следующим образом
Enter non-negative number (0 - exit): 5
*
**
***
****
*****
****
***
**
*
Enter non-negative number (0 - exit): 4
*
**
***
****
***
**
*
Enter non-negative number (0 - exit): 3
*
**
***
**
*
Enter non-negative number (0 - exit): 2
*
**
*
Enter non-negative number (0 - exit): 1
*
Enter non-negative number (0 - exit): 0
Используя те же переменные этого хорошо структурированной программы в качестве параметров функции вы можете написать отдельную функцию, которая выводит шаблон.
Здесь вы находитесь.
#include <iostream>
#include <iomanip>
std::ostream & pattern(unsigned int n, char c = '*', std::ostream &os = std::cout)
{
for (unsigned int i = 1; i < 2 * n; i++)
{
unsigned int w = i <= n ? i : 2 * n - i;
os << std::setfill(c) << std::setw(w + 1) << '\n';
}
return os;
}
int main()
{
while (true)
{
std::cout << "Enter non-negative number (0 - exit): ";
unsigned int n;
if (!(std::cin >> n) || n == 0) break;
std::cout << '\n';
pattern(n);
std::cout << std::endl;
}
return 0;
}
Примите во внимание, что, например, это плохая идея использовать стандартный класс std::string
для вывода шаблона, так как программа будет неэффективной из-за распределения и перераспределения динамической памяти для объекта класса.
Если вы не используете стандартные манипуляторы потока, вы можете использовать стандартный алгоритм std::fill_n
, чтобы скрыть внутренний цикл. В этом случае программа также будет иметь только один явный цикл.
Например
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
while (true)
{
const char c = '*';
std::cout << "Enter non-negative number (0 - exit): ";
unsigned int n;
if (!(std::cin >> n) || n == 0) break;
std::cout << '\n';
for (unsigned int i = 1; i < 2 * n; i++)
{
unsigned int w = i <= n ? i : 2 * n - i;
*std::fill_n(std::ostream_iterator<char>(std::cout), w, c) = '\n';
}
std::cout << std::endl;
}
return 0;
}
Добавить, если заявление первого контура с двумя внутренними петлями, первая из которых используется для увеличения части второй для уменьшения. – phil13131
Вы заинтересованы в написании лучшего кода или недопустимый код, который использует 3 цикла, является хорошим ответом? – nwp
@nwp: Если есть способ получить результат, уменьшив количество циклов, это будет оценено. – TheEvilGuardian