C++程序问题,输入正整数n,在n×n的矩阵内按下表规律填数并输出:(以3×3为例) 7 8 1 6 9 2 5 4 3

#include<stdio.h>intmain(){voidf(int);intn;printf("请输入一个正整数:\n");scanf("%d",&n);f(n);... #include<stdio.h>
int main()
{
void f(int);
int n;
printf("请输入一个正整数:\n");
scanf("%d",&n);
f(n);
return 0;
}
void f(int n)
{
int b,i=1,j,k=0,l=0,m=1;
if(n>0&&n<=100)
{
b=(n+1)/2;
int a[n][n];
while(i<=b)
{
j=0;
while(j<=n-2)
{
a[i+j-1][n-i]=m++;
j++;
}
j=0;
while(j<=n-2)
{
a[n-i][n-j-1]=m++;
j++;
}
j=0;
while(j<=n-2)
{
a[n-j-1][i-1]=m++;
j++;
}
j=0;
while(j<=n-2)
{
a[i-1][i+j-1]=m++;
j++;
}
i++;
if(n%2==1&&i==b)
{
a[b][b]=n*n;
goto c;
}
}
c:while(k<=n-1)
{
while(l<=n-1)
{
printf("%4d",a[k][l]);
}
printf("\n");
}
}
else printf("输入错误!\n");
}
数阵是:
7 8 1
6 9 2
5 4 3
问题是这个程序错在哪儿。
展开
 我来答
ok洛阳水席
推荐于2016-05-15 · TA获得超过1839个赞
知道小有建树答主
回答量:580
采纳率:50%
帮助的人:527万
展开全部

你的程序应该这样改:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    void f(int);
    int n;
    printf("请输入一个正整数:\n");
    scanf("%d",&n);
    f(n);
    return 0;
}
void f(int n)
{
    int b,i=1,j,k=0,l=0,m=1;
int **a;
a = (int **)malloc(sizeof(int*)*n);
for(i=0;i<n;i++)
a[i] = (int*)malloc(sizeof(int)*n);
i=1;
    if(n<0||n>=100)
{
printf("输入错误!\n");
return;
}
b=(n+1)/2;
while(i<=b)
{
 j=0;
 while(j<n-2*i+1)
 {
 a[i+j-1][n-i]=m++;
 j++;
 }
 j=0;
 while(j<n-2*i+1)
 {
 a[n-i][n-j-i]=m++;
 j++;
 }
 j=0;
 while(j<n-2*i+1)
 {
 a[n-j-i][i-1]=m++;
 j++;
 }
 j=0;
 while(j<n-2*i+1)
 {
 a[i-1][i+j-1]=m++;
 j++;
 }
 i++;
 if(n%2==1&&i==b)
 {
 a[b-1][b-1]=n*n;
 break;//这里用break就可以跳出循环,不需要使用goto
 }
}
while(k<=n-1)
{
  l=0;
  while(l<=n-1)
  {
  printf("%4d",a[k][l]);
  l++;
  }
  printf("\n");
  k++;
  }
}

你对循环的控制有问题,每次循环的步数应为n-2*i+1:

第一次循环的步数为n-1,第二次为n-3……以此类推,又因为i初始值为1,所以循环步数为n-2*i+1


另外就是  int a[n][n];C语言里不能这样写,定义数组必须是定长的,即数组大小必须是固定的。

你要创建你需要的大小的数组就要使用动态数组。如果你不用动态数组,就要声明一个数组,它的大小尽可能达到最大,然后再抹去那些不必要的元素。但是,如果过度使用这种方法,会导致内存的操作环境变慢。


这里推荐使用动态数组。创建row*col大小的数组步骤如下:

int **array;

array = (int **) malloc(sizeof(int *)*row);

for(int i=0 ; i !=row ; i++)

array[i]=(int *) malloc(sizeof(int )*col);

在C++中使用new创建动态数组,你学C,用的是malloc,不懂可以百度malloc。


再来就是goto ,不到万不得已,不要使用goto语句!goto语句使程序的静态结构和动态结构不一致,从而使程序难以理解,难以查错。


其他无错。

追问
我是初学者,刚刚接触C++语言,所以实在是没接触过二维动态数组,百度也看不懂。
另外,我用的教材上说,数组大小定义时可以是从实参传来的一个确定的值,从这句话来看,此程序这一点应该无错啊,望高手解答。
追答
在有的编译器中数组在定义时用的必须是常量,不能是变量。在有的编译器里其实也可以用变量的,只是不推荐使用,好像C99通过了数组定义时用变量。理论上来说我建议使用动态数组,程序的兼容性更好。你是用变量来定义数组的话就算你的编译器能运行,放在别人的电脑上就不行了,那你的程序也没有价值了。一般来说使用C式的malloc函数或者C++式的new函数来在堆上动态分配内存,这样长度是完全可以自定的,完全满足你对数组大小可变的要求。
匿名用户
2013-06-05
展开全部
其实我没看懂,下面是我以前弄的,方向不一样,参考一下吧,我也听人说过,回旋数,一个人写的别人看不懂,或者是蛇形填数

#include<stdio.h>
#include<math.h>
int main(void)
{
int n1,n2,i,j,n12,ni,nj,flag=0;
int a[][2]={{0,1},{1,0},{0,-1},{-1,0}};
int an=0,nn[100][100];
printf("\n回旋矩阵,输入两个数\n\t一个行数:");
scanf("%d",&n1);
printf("\t一个列数:");
scanf("%d",&n2);
if(n1<0||n2<0||n1>99||n2>99)return 1;
printf("输入的行数为 %d,列数为 %d\n",n1,n2);
for(j=0;j<n1;j++)
for(i=0;i<n2;i++)
nn[j][i]=0;
nn[0][n2]=-1;
nn[n1-1][n2]=-1;
n12=n1*n2;;

nj=j=0;
ni=i=n2-1;
while(an<n12)
{
ni=i+a[flag][1];
nj=j+a[flag][0];
if((ni<0||nj<0)||(nn[nj][ni]!=0||nn[nj][ni]==-1))
(++flag)%=4;
else
{
nn[j][i]=++an;
j=nj;
i=ni;
}

if(an>=n12-1)
break;
}
nn[j][i]=n12;
for(i=0;i<n1;i++)
{
printf("\n");
for(j=0;j<n2;j++)
printf("%4d",nn[i][j]);
}
printf("\n");

return 0;
}
更多追问追答
追问
谢谢回答,但题目是这个程序错在哪儿,怎么改正。
追答
我看了好长时间,没看懂,总觉得设计思路有问题,可是找不到关键的点,让下面这位朋友帮你看看吧,我没找出来
这是别人提的问,以前有高人回答的
http://zhidao.baidu.com/question/350191920.html
非常明显错误只找到一个

c:while(k<=n-1)
{
while(l<=n-1)
{
printf("%4d",a[k][l]);
}
printf("\n");
}

goto去的地方明显是死循环,k和l都没有步进,可是改了还是不对,就是内部赋值算法的问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cjj796
2013-06-05 · TA获得超过8709个赞
知道大有可为答主
回答量:1.3万
采纳率:68%
帮助的人:3474万
展开全部
没有看出是什么规律呀
追问

追答
嘿嘿,明白了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式