第八题
程序设计(满分15分)
方阵的主对角线之上称为“上三角”。
请你设计一个用于填充n阶方阵的上三角区域的程序。填充的规则是:使用1,2,3….的自然数列,从左上角开始,按照顺时针方向螺旋填充。
例如:当n=3时,输出:
1 2 3
6 4
5
当n=4时,输出:
1 2 3 4
9 10 5
8 6
7
当n=5时,输出:
1 2 3 4 5
12 13 14 6
11 15 7
10 8
9
程序运行时,要求用户输入整数n(3~20)
程序输出:方阵的上三角部分。
要求格式:每个数据宽度为4,右对齐。
要求考生把所有函数写在一个文件中。调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。相关的工程文件不要拷入。
对于编程题目,要求选手给出的解答完全符合ANSI C标准,不能使用c++特性;不能使用诸如绘图、中断调用等硬件相关或操作系统相关的API。
写完这个代码我只想说卧槽条件贼多 ,只有你想不到
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int sum1(int n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum+=i;
}
return sum;
}
//该函数用来求1+2+...+n;因为每个倒三角都有这么多个数 所以我在这里写到函数里了
int main()
{
int n,sum=0,k=1,i=1,j=1,t;//ij用来遍历矩阵 sum是填充数字的个数 t用来记录n n是倒三角的行数
cin>>n;
sum = sum1(n);//输入这个n求出和放进sum中
//cout<<sum;
int num[n+1][n+1];//定义数组 因为我的数组下表想从1开始 所以定义了n+1个
t=n;//此时t中存放了n 因为下文中我的n值会变化所以用t保存起来
memset(num,0,sizeof(num));//整个数组清零 因为后面输出不输出下三角 也就是为0的都不输出
while(k<=sum&&n>0)//k记录每次放进去的值 比如从1开始放 每次放进数组k都要++ 直到k>sum了就不放进去了 n>0
//这个条件是我测试程序的时候得到的。。因为写代码过程中出现了死循环 所以我输出了所有的值 发现n是负值
//当我加上这个条件整个程序就对了
{
while(j<=n&&k<=sum&&num[i][j]==0)//第一行的赋值 num[i][j]==0这个条件一定要加 不然他会覆盖你赋值过的
{
num[i][j]=k,k++,j++;//k++ j++保证数组向后移动 此时i不变
// cout<<i<<" "<<j<<" "<<k<<endl;
}
j=j-2,i++;
while(j+i==n+1&&i<=n&&k<=sum&&num[i][j]==0)//这个是斜对角线 j+i==n+1是条件 画个数组看一下就知道了
{
num[i][j]=k;
k++,i++,j--;
}
i=i-2;
j++;
while(i>j&&k<=sum&&num[i][j]==0)//竖着的那个数组
{
num[i][j]=k;
i--;
k++;
}
i++;//这些条件画个数组看吧 不好描述
j++;
n=n-1;
//cout<<i<<" "<<j<<" "<<n<<endl;
}
//这时候就用到t了 因为在上面我们n的值已经被修改过了
for(int l=1;l<=t;l++)
{
for(int p=1;p<=t&&num[l][p]!=0;p++)
{
cout<<num[l][p]<<"\t";
}
cout<<endl;
}
}