сгенерировать пирамиду из строки и перенести ее в массив строк - PullRequest
0 голосов
/ 25 апреля 2020

Я пишу программу, которая запрашивает у пользователя необходимое количество строк пирамиды, основываясь на входных данных, которые сгенерированная ниже пирамида должна быть перенесена в массив строк ie. строка s [1] должна иметь первую строку пирамиды ниже, s [2] должна иметь 2-ю строку пирамиды и т. д.

        *
      * * *
    * * * * *
  * * * * * * *

Мой код ниже показывает этот вывод, пожалуйста. предложить, где я иду не так.

Enter number of rows: 4
0      *1    *1    **1    ***2  *2  **2  ***2  ****2  *****3*3**3***3****3*****3******3*******
int main()
{
    int space,rows,m;
    cout <<"Enter number of rows: ";
    cin >> rows;
    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] += "*";
            cout<< m<<s[m];
            k++;
       }
        s[m] +='\n';
    }

    return 0;
}

1 Ответ

1 голос
/ 25 апреля 2020

По сути, все ваши потребности в коде - это небольшие изменения.

Первая проблема, ваш вывод, который вы произвели :

Проблема с вашим выводом проста - ничего при этом 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;
}

Вывод:

      * 
    * * * 
  * * * * * 
* * * * * * * 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...