По сути, все ваши потребности в коде - это небольшие изменения.
Первая проблема, ваш вывод, который вы произвели :
Проблема с вашим выводом проста - ничего при этом l oop не выводить. Когда l oop закончится, затем увидят, что произвел массив строк. Распечатывая промежуточный вывод в l oop, вы искажаете то, что фактически производится.
Второй выпуск: используйте std::vector<std::string>
.
Как уже упоминалось динамический массив c в C ++ объявляется с помощью std::vector<std::string>
.
Объявление массивов с использованием значения времени выполнения для обозначения размера, т.е. string s[rows];
- это не C ++, а расширение, предлагаемое компилятором, который вы используете.
Советуем не использовать этот синтаксис - он не является стандартным, он не распознается другими компиляторами (например, Visual C ++), если rows
достаточно велик, вы может исчерпать стековую память, и т. д. c.
Если мы решим эти две проблемы, то получим следующее:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int space, rows = 4;
std::vector<std::string> s(rows);
for (int i = 1, k = 0, m = 0; i <= rows; ++i, k = 0, m++)
{
for (space = 1; space <= rows - i; ++space)
{
s[m] += " ";
}
while (k != 2 * i - 1)
{
s[m] += "*";
k++;
}
}
// Output the results
for (auto& v : s)
std::cout << v << "\n";
return 0;
}
Вывод:
*
***
*****
*******
Итак, вы видите, как только ненужный вывод удаляется из while
l oop и перемещается за пределы обработки, вы приближаетесь к нужному выводу.
Так что не так? Проблема проста - просто добавьте пробел к "*"
в while
l oop:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int space, rows = 4;
std::vector<std::string> s(rows);
for (int i = 1, k = 0, m = 0; i <= rows; ++i, k = 0, m++)
{
for (space = 1; space <= rows - i; ++space)
{
s[m] += " ";
}
while (k != 2 * i - 1)
{
s[m] += "* "; // <-- This simple change is all that is done
k++;
}
}
for (auto& v : s)
std::cout << v << "\n";
return 0;
}
Вывод:
*
* * *
* * * * *
* * * * * * *