如何在N x(N + 1)个矩形中打印数字?

时间:2019-06-20 12:42:21

标签: c++ loops for-loop if-statement

该程序应从用户处获取一个整数,并如下所示打印图案。 如果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 个答案:

答案 0 :(得分:1)

以清晰,简洁的方式做的非常简单:

#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

答案 1 :(得分:0)

您的方法正确!一些简单的更改将给出正确的答案。

#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;
}

答案 2 :(得分:-1)

我认为您正在使事情变得过于复杂-绝对不需要二维数组和所有循环。

您可以只使用基本的辅助函数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函数或不想使用lambda,则当然可以将其移动并给它一个签名:

void printer(unsigned i, unsigned user_input) { 
    /* copy-paste the code from printer */ 
}

答案 3 :(得分:-1)

实际上,无需定义数组即可输出模式。

您需要的只是两个循环。

这是一个演示程序。

#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。因此,如果要排除最后一行和最后一列,则必须在循环条件下分别使用表达式nn - 1