c++大作业 求解答

(第1小题):输入n,(0 < n <= 20),建立n*n二维数组,按照下图规则把1~n*n个数放在n*n二维数组中,然后按行优先顺序输出。
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
------------------------------------------------------------------------------------------------------------------------------
输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<=20),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出该二维数组,该二维数组按行输出,行中数据之间有一个空格,每个数据占3个字符位置,左对齐,注意每行的最后一个元素后面没有空格,每个测试例子后面有空行。
1 2 3 4

12 13 14 5

11 16 15 6
10 9 8 7

根据你的问题描述编写C++代码如下:

#include <iostream>
#include <iomanip>
using namespace std;

#define MAXSIZE 20 //最大测试实例数-1(可根据需要修改,减一表示去掉n=0输入数据结束的情况)

//-------------------------------------
//函数声明
int setNum(int n,int **matrix2D);
int printNum(int n,int **matrix2D);

int main()
{
int index = 0;
int n[MAXSIZE] = {0};//用于存储测试实例n
int temp = 0;

cout<<"请输入测试实例n(0<n<=20):";
cin>>temp;
while(temp != 0)//如果输入0,则退出while循环
{
n[index] = temp;
index ++;
cout<<"请继续输入测试实例n(0<n<=20):";
cin>>temp;
}
if (index >= MAXSIZE)
{
cout<<"Sorry,已超出最大实例数"<<MAXSIZE-1<<endl;
return 0;
}

//------------------------------------
//循环处理每个测试实例
for (int x = 0;x<index;x++)
{
//------------------------------------
//动态创建二维数组
int **matrix2D = new int*[n[x]];
for (int r = 0; r < n[x]; r++)
{
matrix2D[r] = new int[n[x]];
}

setNum(n[x],matrix2D);
printNum(n[x],matrix2D);
if (x<index - 1)
{
cout<<endl;
}

//释放二维数组
for (r = 0; r < n[x]; r++)
{
delete matrix2D[r];      
matrix2D[r] = NULL;
}
delete matrix2D;
matrix2D[r] = NULL;
}
return 0;
}

//---------------------------------------------
//二维数组计算赋值
int setNum(int n,int **matrix2D)
{
//定义二维数组上、下、左、右边界,并初始化
int up = 0,down = n -1,left = 0,right = n -1;

int number = 0,col; 

while(1) //此循环实现顺时针螺旋顺序存入数据
{
//由左到右存入上边的一行数值
for (col = left ; col <= right ; col++)
{
matrix2D[up][col] = ++number;
}
//上边界+1
up++;

//判断数值是否完成,完成则退出while循环
if (number >= (n*n))
{
break; 
}

//由上到下存入最右边的一列数值
for (col = up; col <= down ; col++)
{
matrix2D[col][right] = ++number;
}
//右边界-1
right--;

//由右到左存入最下边的一行数值
for (col = right ; col >= left ; col--)
{
matrix2D[down][col] = ++number;
}
//下边界-1
down--;

//判断数值是否完成,完成则退出while循环
if (number >= (n*n)) 
{
break;
}

//由下到上存入最左边的一列数值
for (col = down ; col >= up ; col--)
{
matrix2D[col][left] = ++number;
}
//左边界+1
left++;
}
return 0;
}

//---------------------------------------------
//打印二维数组
int printNum(int n,int **matrix2D)
{
for (int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n; j++)
{
cout<<setw(3)<<setiosflags(ios::left)<<matrix2D[i][j];
if (j < n - 1)
{
cout<<" ";
}
}
cout<<endl;
}
return 0;
}

运行结果如下(其中n=0时输入数据结束):

望采纳!

温馨提示:答案为网友推荐,仅供参考
相似回答