Небольшая проблема с выравниванием чисел по правому краю. C++

121
22 апреля 2022, 02:10

У меня есть последовательность чисел, которая разбивается на строки. Кол-во строк зависит от кол-ва чисел(выбирается рандомно в диапазоне от 1 до 10) в одной строке. И все эти числа нужно выровнять по правому краю. Я узнал, как это реализовать - с помощью setw(). Но у меня некорректно выравниваются числа. В чем ошибка, подскажите, пожалуйста.

Код C++:

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <cmath>
    #include <ctime>
    #include <fstream>
    #include <iomanip>
    
    using namespace std;
    
    void Number1(int n, int m)
    {
    
        int x = n / m;
        int y = n % m;
    
        if (y == 0) {
            for (int i = 0; i < x; ++i)
            {
                cout << endl;
                for (int j = 0; j < m; ++j)
                {
                    cout << setw(230) << rand() % 201 - 100 << " ";
                }
            }
        }
        else {
            for (int i = 0; i < x; ++i)
            {
                cout << endl;
                for (int j = 0; j < m; ++j)
                {
                    cout << setw(230) << rand() % 201 - 100 << " ";
                }
            }
            cout << endl;
            for (int k = 0; k < y; k++)
            {
                cout << setw(230) << rand() % 201 - 100 << " ";
            }
            cout << endl;
        }
    }
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(0));
    //Number1
    int n;
    cout << "Введите кол-во чисел = ";
    cin >> n;
    cout << endl;
    int m = rand() % 11;
    cout << "Кол-во чисел в строке = " << m << endl;
    cout << endl;
    Number1(n, m);
}

Скриншот результата:

Они как-то косо расположены :(

Answer 1
std::ostringstream line;
for (int j = 0; j < m; ++j) {
    line << (j? " " : "") << rand() % 201 - 100;
}
std::cout << std::setw(230) << line.str() << '\n';

(j? " " : ""), в принципе, можно заменить на один безусловный пробел, это я уж для красоты добавил.

Answer 2
void Number1(int n, int m)
{
    int x = n / m;
    int y = n % m;
    if (y == 0) {
        for (int i = 0; i < x; ++i)
        {
            cout << endl;
            for (int j = 0; j < m; ++j)
            {
                cout << setw(230) << rand() % 201 - 100 << endl;
            }
        }
    }
    else {
            for (int j = 0; j < m; ++j)
            {
                cout << setw(230) << rand() % 201 - 100 << endl;
            }
        cout << endl;
        for (int k = 0; k < y; k++)
        {
            cout << setw(230) << rand() % 201 - 100 << endl;
        }
        cout << endl;
    }
}
READ ALSO
Как реализовать циклический сдвиг слова в C++

Как реализовать циклический сдвиг слова в C++

Допустим имеется слово "элемент"(слово может быть любым), нужно циклически сдвинуть слово вправо на "n" символовНапример, на 3 символа...

88
Зачем в коде нужна строчка? C++

Зачем в коде нужна строчка? C++

Есть вот такой кодНемного непонятно, что делает второй цикл while

109
работа класса с другим классом(С++, ООП) [закрыт]

работа класса с другим классом(С++, ООП) [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

177
C++ Вопрос по реализации UDP чата

C++ Вопрос по реализации UDP чата

Нужно реализовать клиент-серверное приложение для обмена сообщениями между компьютерами (простой чат), используя при этом UDP пакеты и только...

198