【问题标题】:How to print numbers in N x (N+1) rectangles?如何在 N x (N+1) 个矩形中打印数字?
【发布时间】:2019-06-20 12:42:21
【问题描述】:

程序应该从用户那里获取一个整数并打印如下所示的模式。 如果 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;
}

我得到了正确的模式,但在某些地方,有一些垃圾值(或其他东西)

【问题讨论】:

  • 简化!首先,实际上向我们展示对于n 的特定值,您将获得什么输出。其次,在程序中修复n 的值(使用const int n = 42),而不是从std::cin 读取。然后你可以放弃对你的程序需要做什么的复杂解释,只需替换为“我正在绘制一个固定大小的正方形,边框为一个值,并填充了增加值的行”,然后向我们展示你的特定 n 的所需输出。
  • 这里是for (j = 1;j &lt; n - 2;j++),应该是for (j = 1;j &lt; n - 1;j++)。你只是忘记了一个元素

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


【解决方案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 or 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

【讨论】:

    【解决方案2】:

    你是在正确的方式!一些简单的改变就会给出正确的答案。

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

    【讨论】:

      【解决方案3】:

      我认为你把事情复杂化了——绝对不需要二维数组和所有循环。

      您可以只使用基本的辅助函数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 */ 
      }
      

      【讨论】:

      • 如有必要,&lt;&lt; '\t' 可以添加到唯一带有 if 的行的末尾之前。但是问题的示例输出没有选项卡(atm)。
      【解决方案4】:

      其实并不需要定义一个数组来输出模式。

      你只需要两个循环。

      这是一个演示程序。

      #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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-24
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 2019-05-15
        • 2013-02-08
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多