Как напечатать числа в N x (N + 1) прямоугольниках? - PullRequest
0 голосов
/ 20 июня 2019

программа должна получить целое число от пользователя и распечатать шаблон, как показано ниже. если n = 3, то

 333
 313
 323
 333

если n = 4, то

4444
4114
4224
4334
4444

если n = 5, то

55555
51115
52225
53335
54445
55555

и т. Д.

Вот то, что пытались.

#include<iostream>
using namespace std;
int main()
{
    int pattern[10][10], i, j, n;
    cout << "Enter dimension of square matrix: ";
    cin >> n;
    for (i = 0;i <= n;i++)
    {
        pattern[i][0] = n;
        pattern[i][n - 1] = n;
    }
    for (j = 1;j < n - 2;j++)
    {
        pattern[0][j] = n;
        pattern[n][j] = n;
    }
    for (i = 1;i < n - 1;i++)
    {
        for (j = 1;j < n - 2;j++)
        {
            pattern[i][j] = i;
        }
    }
    for (i = 0;i <=n;i++)
    {
        for (j = 0;j < n;j++)
        {
            cout << pattern[i][j];
            cout << "\t";
        }
        cout << "\n";
    }
    return 0;
}

Я получаю правильный шаблон, но в некоторых местах есть какое-то мусорное значение (или что-то еще)

Ответы [ 4 ]

1 голос
/ 20 июня 2019

Довольно просто сделать ясно, кратко:

#include<iostream>

int main()
{
    int n = 0;
    std::cout << "Enter dimension of square matrix: ";
    std::cin >> n;

    for (int i = 0; i < n + 1; ++i) {
        for (int j = 0; j < n; ++j) {
            // if on the first or last column/row: print n, else: print i
            std::cout << ((i == 0 || j == 0 || i == n || j == n-1) ? n : i) << '\t';
        }
        std::cout << '\n';
    }

    return 0;
}

Пример вывода:

Enter dimension of square matrix: 5
5   5   5   5   5
5   1   1   1   5
5   2   2   2   5
5   3   3   3   5
5   4   4   4   5
5   5   5   5   5
0 голосов
/ 20 июня 2019

На самом деле нет необходимости определять массив для вывода шаблона.

Все, что вам нужно, это две петли.

Вот демонстрационная программа.

#include <iostream> 

int main() 
{
    while ( true )
    {
        const unsigned int MAX_VALUE = 10;

        std::cout << "Enter a non-negative number less than " 
                  << MAX_VALUE << " (0 - exit): ";

        unsigned int n;

        if ( not ( std::cin >> n ) or ( n == 0 ) ) break;

        if ( MAX_VALUE - 1 < n ) n = MAX_VALUE - 1;

        std::cout << '\n';

        for ( unsigned int i = 0; i < n + 1; i++ )
        {
            for ( unsigned int j = 0; j < n; j++ )
            {
                if ( j == 0 || j == n - 1 )
                {
                    std::cout << n;
                }
                else if ( i == 0 || i == n )
                {
                    std::cout << n;
                }
                else
                {
                    std::cout << i;
                }                    
            }

            std::cout << '\n';
        }

        std::cout << '\n';
    }
} 

Его вывод может выглядеть как

Enter a non-negative number less than 10 (0 - exit): 1

1
1

Enter a non-negative number less than 10 (0 - exit): 2

22
22
22

Enter a non-negative number less than 10 (0 - exit): 3

333
313
323
333

Enter a non-negative number less than 10 (0 - exit): 4

4444
4114
4224
4334
4444

Enter a non-negative number less than 10 (0 - exit): 5

55555
51115
52225
53335
54445
55555

Enter a non-negative number less than 10 (0 - exit): 6

666666
611116
622226
633336
644446
655556
666666

Enter a non-negative number less than 10 (0 - exit): 7

7777777
7111117
7222227
7333337
7444447
7555557
7666667
7777777

Enter a non-negative number less than 10 (0 - exit): 8

88888888
81111118
82222228
83333338
84444448
85555558
86666668
87777778
88888888

Enter a non-negative number less than 10 (0 - exit): 9

999999999
911111119
922222229
933333339
944444449
955555559
966666669
977777779
988888889
999999999

Enter a non-negative number less than 10 (0 - exit): 0

То есть вы можете заменить все ваши циклы, которые заполняют массив, на операторы if в одной паре циклов, которые выводят шаблон.

Операторы if могут быть заменены условным оператором следующим образом

for ( unsigned int i = 0; i < n + 1; i++ )
{
    for ( unsigned int j = 0; j < n; j++ )
    {
        std::cout << ( i % n == 0 || j % ( n - 1 ) == 0 ? n : i );
    }         
    std::cout << '\n';
}

Ограничение на вывод шаблона только для чисел [1, 9] является искусственным.

Было бы более разумно установить диапазон по крайней мере [1, 255], где 255 - максимальное значение, которое может храниться в объекте типа unsigned char.

Вы можете получить значение через выражение

std::numeric_limits<unsigned char>::max() 

Для выравнивания выводимых столбцов вы можете использовать стандартную функцию std::setw, которая устанавливает ширину выводимого поля.

Учитывая все это, программа может выглядеть следующим образом.

#include <iostream>
#include <iomanip>
#include <limits>

int main()
{
    while ( true )
    {
        const unsigned int Base = 10;
        const unsigned int MAX_VALUE = std::numeric_limits<unsigned char>::max();

        std::cout << "Enter a non-negative number less than or equal to " 
                  << MAX_VALUE << " (0 - exit): ";

        unsigned int n = 0;

        if ( not ( std::cin >> n ) || ( n == 0 ) ) break;

        if ( MAX_VALUE < n ) n = MAX_VALUE;

        //  Calculating the width of numbers plus one space between them.
        int number_width = 1;

        unsigned int tmp = n;
        do { ++number_width; } while ( tmp /= Base );

        std::cout << '\n';

        for ( unsigned int i = 0; i < n + 1; i++ )
        {
            for ( unsigned int j = 0; j < n; j++ )
            {
                std::cout << std::setw( number_width )
                          << ( i % n == 0 || j % ( n - 1 ) == 0 ? n : i );
            }
            std::cout << '\n';
        }

        std::cout << '\n';
    }
}

Вывод программы может выглядеть как

Enter a non-negative number less than 255 (0 - exit): 20

 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
 20  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 20
 20  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 20
 20  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3 20
 20  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4 20
 20  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5  5 20
 20  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6  6 20
 20  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7  7 20
 20  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8  8 20
 20  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9  9 20
 20 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 20
 20 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 20
 20 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 20
 20 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 20
 20 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 20
 20 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 20
 20 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 20
 20 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 20
 20 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 20
 20 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20
 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

Enter a non-negative number less than 255 (0 - exit): 0

Что касается вашего кода, то для начала вам следует проверить, ввел ли пользователь число, которое больше 9

И, например, в этой паре петель

for (i = 1;i < n - 1;i++)
{
    for (j = 1;j < n - 2;j++)
    {
        pattern[i][j] = i;
    }
}

условия должны выглядеть как минимум

for (i = 1; i < n; i++)
{
    for (j = 1; j < n - 1; j++ )
    {
        pattern[i][j] = i;
    }
}

, потому что высота шаблона равна n + 1, а ширина равна n. Поэтому, если вы хотите исключить последнюю строку и последний столбец, вы должны соответственно использовать выражения n и n - 1 в условиях циклов.

0 голосов
/ 20 июня 2019

Я думаю, что вы слишком усложняете вещи - абсолютно не нужен двумерный массив и все циклы.

Вы можете просто использовать базовую вспомогательную функцию printer, которая печатает версию с вложенным числом i и выполняет ее в цикле от 1 до последнего числа, например 5.

#include <cstdio>
#include <iostream>

int main() {

    unsigned user_input = 5; // change to ask for actual user input

    // Helper function, i.e. for 3 it prints 53335
    auto printer = [](unsigned i) {
        for (unsigned n = 0; n < user_input; ++n) {
            if (n == 0 || n + 1 == user_input) std::cout << user_input;
            else std::cout << i;
        }
        std::cout << '\n';
    };

    printer(user_input); // print 55555

    // print the rest 51115, 52225 ... up to 55555 again
    for (unsigned i = 1; i <= user_input; ++i) printer(i);
}

Если вы считаете, что вам нужна функция printer в другом месте или вы не хотите использовать лямбду, вы, конечно, можете просто переместить ее и поставить такую ​​подпись:

void printer(unsigned i, unsigned user_input) { 
    /* copy-paste the code from printer */ 
}
0 голосов
/ 20 июня 2019

Вы на правильном пути! Некоторое простое изменение даст правильный ответ.

#include<iostream>
using namespace std;
int main()
{
    int pattern[10][10], i, j, n;
    cout << "Enter dimension of square matrix: ";
    cin >> n;
    for (i = 0;i <= n;i++)
    {
        pattern[i][0] = n;
        pattern[i][n - 1] = n;
    }
    for (j = 1;j <n ;j++)
    {
        pattern[0][j] = n;
        pattern[n][j] = n;
    }
    for (i = 1;i < n ;i++)
    {
        for (j = 1;j < n -1;j++)
        {
            pattern[i][j] = i;
        }
    }
    for (i = 0;i <=n;i++)
    {
        for (j = 0;j < n;j++)
        {
            cout << pattern[i][j];
            cout << "\t";
        }
        cout << "\n";
    }
    return 0;
}
...