我必须编写一个在2D数组中显示以下模式的程序:

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

我的代码:
    #include <iostream>
    #include<iomanip>

    using namespace std;
    #define SIZE 5

     int main()
     {
         int i, j, n, x;
         int array[SIZE][SIZE];
         int left, top;

         left = 0;
         n    = 1;

         cout<<"Enter dimension of array pattern:";
         cin>>x;
         while(x<1||x>6){
             cout<<"Invalid entry. Enter a number greater than 0 and less than 6";
cin>>x;
         }

         top  = x-1;

         for(i=1;i<=x/2;i++,left++,top--){

            for(j=left;j<=top;j++,n++)
            array[left][j]=n;

            for(j=left+1;j<top;j++,n++)
             array[j][top]=n;

            for(j=top;j>left;j--,n++)
            array[top][j]=n;

            for(j=top;j>left;j--,n++)
            array[j][left]=n;

         }

         for(i=0; i<x; i++)
         {
             for(j=0; j<x; j++)
             {
                 cout<<setw(3)<<array[i][j];

             }
        cout<<endl;

         }

    system("pause");
    return 0;
    }

它对于偶数输入也可以正常工作,但为奇数给出最后一个值作为垃圾。
\ n
\ n
输入值
5

输出量

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

任何帮助将不胜感激。

最佳答案

对于奇数,您永远不会更改中心值,因此它不会被初始化。然后将其读出是未定义的行为,通常表现为获取垃圾值。您可以通过扩展循环使其在该中心字段上运行来解决此问题:

for (i = 1; i <= (x / 2)+1; i++, left++, top--) {

或者,由于很容易弄清楚它将具有什么值,因此您可以在循环后手动填充它:
if (x%2 == 1)
    array[x/2][x/2] = x * x;

另外,当用户输入无效的数字时,请不要忘记读一个新的数字:
while (x < 1 || x>6) {
    cout << "Invalid entry. Enter a number greater than 0 and less than 6";
    cin >> x;
}

09-07 03:51