c语言数组输出问题
要如何输出一个螺旋数组比如12345671819202122238172827262524916151413121110说详细点怎么弄...
要如何输出一个螺旋数组 比如
1 2 3 4 5 6 7
18 19 20 21 22 23 8
17 28 27 26 25 24 9
16 15 14 13 12 11 10
说详细点 怎么弄 展开
1 2 3 4 5 6 7
18 19 20 21 22 23 8
17 28 27 26 25 24 9
16 15 14 13 12 11 10
说详细点 怎么弄 展开
8个回答
展开全部
补充:可能我误解你的意思了,我写的这个是产生一个螺旋形输出。如果是将这样一个二维数组输出的话,根据这种思路,就变得更简单了。只需将
a[j][i++] = b[q++]; 改为 b[q++]= a[j][i++]; ,
void Output(int (*a)[X],int b[]) 改为void Output(int (*a)[X],int *b)
即可。
/* 对一维顺序数组进行螺旋输出(不是顺序的话就先进行排序)
主要思想:对用拥有X*Y个元素的数组分为Y行输出,每行X个数。
将螺旋输出的结果看做一个坐标系,将输出看做很多个不同大小的“口”,注意到一个规律:
输出“口”的上部分时,Y坐标不变,X坐标递增;输出右部分时,X坐标不变,Y坐标递增;以此类推...
可见输出一个“口”便是一个循环,那么就可以用这个循环来输出整个数组。
方法:定义四个变量记录“口”形的大小,xmax=X-1,ymax=Y-1,xmin=0,ymin=0,他们分别表示每个“口”的
最大x、y值和最小x、y值。
现在,我们控制了“口”行的大小以及位置,接下来不停的将原一维数组输出到一个二维数组就可以了。再将
二维数组顺序列出就得到最终的螺旋输出了。
感觉这个方法比较笨拙,不知道有没有公式能直接计算出元素的位置,这样效率也许会快一点
*/
#include<stdio.h>
#define X 11 //定义列数,改变这两行得到不同输出
#define Y 12 //定义行数
void Output(int (*a)[X],int b[])
{ int xmax=X-1,ymax=Y-1;
int xmin=0,ymin=0;
int i,j,q=0,all_n = X*Y;
while(q < all_n) //不停的顺时针循环输出“口”形到二维数组,直到数组b的最后一个元素
{ i = xmin,j = ymin; //i为行坐标,j为纵坐标
//一下四个while分别输出一次循环的四边
while(i <= xmax && q < all_n)//这个while是输出上边的,下面的以此类推。注意边界控制
a[j][i++] = b[q++];
i = xmax;
j = ++ymin;
while(j <= ymax && q < all_n)
a[j++][i] = b[q++];
j = ymax;
i = --xmax;
while(i >= xmin && q < all_n)
a[j][i--] = b[q++];
i =xmin;
j = --ymax;
while(j >= ymin && q < all_n)
a[j--][i] = b[q++];
++xmin;
}
}
void main()
{
int a[Y][X];
int b[Y*X];
int p = Y*X;
for(int k=0;k<p;k++)
b[k]=k+1;
//------------------
Output(a,b);
//------------------
for(int i=0;i<Y;i++)
{ for(int j=0;j<X;j++)
printf("%-3d ",a[i][j]);
printf("\n");
}
}
a[j][i++] = b[q++]; 改为 b[q++]= a[j][i++]; ,
void Output(int (*a)[X],int b[]) 改为void Output(int (*a)[X],int *b)
即可。
/* 对一维顺序数组进行螺旋输出(不是顺序的话就先进行排序)
主要思想:对用拥有X*Y个元素的数组分为Y行输出,每行X个数。
将螺旋输出的结果看做一个坐标系,将输出看做很多个不同大小的“口”,注意到一个规律:
输出“口”的上部分时,Y坐标不变,X坐标递增;输出右部分时,X坐标不变,Y坐标递增;以此类推...
可见输出一个“口”便是一个循环,那么就可以用这个循环来输出整个数组。
方法:定义四个变量记录“口”形的大小,xmax=X-1,ymax=Y-1,xmin=0,ymin=0,他们分别表示每个“口”的
最大x、y值和最小x、y值。
现在,我们控制了“口”行的大小以及位置,接下来不停的将原一维数组输出到一个二维数组就可以了。再将
二维数组顺序列出就得到最终的螺旋输出了。
感觉这个方法比较笨拙,不知道有没有公式能直接计算出元素的位置,这样效率也许会快一点
*/
#include<stdio.h>
#define X 11 //定义列数,改变这两行得到不同输出
#define Y 12 //定义行数
void Output(int (*a)[X],int b[])
{ int xmax=X-1,ymax=Y-1;
int xmin=0,ymin=0;
int i,j,q=0,all_n = X*Y;
while(q < all_n) //不停的顺时针循环输出“口”形到二维数组,直到数组b的最后一个元素
{ i = xmin,j = ymin; //i为行坐标,j为纵坐标
//一下四个while分别输出一次循环的四边
while(i <= xmax && q < all_n)//这个while是输出上边的,下面的以此类推。注意边界控制
a[j][i++] = b[q++];
i = xmax;
j = ++ymin;
while(j <= ymax && q < all_n)
a[j++][i] = b[q++];
j = ymax;
i = --xmax;
while(i >= xmin && q < all_n)
a[j][i--] = b[q++];
i =xmin;
j = --ymax;
while(j >= ymin && q < all_n)
a[j--][i] = b[q++];
++xmin;
}
}
void main()
{
int a[Y][X];
int b[Y*X];
int p = Y*X;
for(int k=0;k<p;k++)
b[k]=k+1;
//------------------
Output(a,b);
//------------------
for(int i=0;i<Y;i++)
{ for(int j=0;j<X;j++)
printf("%-3d ",a[i][j]);
printf("\n");
}
}
展开全部
大概你的原意是这样:
main()
{int
i,a[10];
for(i=0;i<=9;i++)
{
a[i]=i;
printf("%d\n",a[i]);
}
getch();
}
是不是?
如果按你的程序分析,是先执行完
for(i=0;i<=9;i++)
a[i]=i;
才接着执行
printf("%d\n",a[i]);
这行语句,所以并不是输出整个数组,而是输出数组中下标为i的那个元素。
更严重的问题是,执行完for语句之后,i的值已经为10,所以你的这个语句:
printf("%d\n",a[i])是输出a[10],然而a[10]是没有初始化的,是一个随机的数值,所以-28没有任何意义,这次输出-28,下次输出什么谁都不知道。
改成我的代码试试。
main()
{int
i,a[10];
for(i=0;i<=9;i++)
{
a[i]=i;
printf("%d\n",a[i]);
}
getch();
}
是不是?
如果按你的程序分析,是先执行完
for(i=0;i<=9;i++)
a[i]=i;
才接着执行
printf("%d\n",a[i]);
这行语句,所以并不是输出整个数组,而是输出数组中下标为i的那个元素。
更严重的问题是,执行完for语句之后,i的值已经为10,所以你的这个语句:
printf("%d\n",a[i])是输出a[10],然而a[10]是没有初始化的,是一个随机的数值,所以-28没有任何意义,这次输出-28,下次输出什么谁都不知道。
改成我的代码试试。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我写的这个是N×N的,允许用户自己输入N,有较好的通用性。如果行和列是不相同的,你自己也可以改一改。不懂再问
#include<stdio.h>
void main()
{
int m=2,n;
int a[10][10]={1};
int dir=0;
int i=0,j=0;
printf("Please input N:");
scanf("%d", &n);
while(m<=n*n)
{
switch(dir)
{
case 0:/*先向下输出*/
while(i<n-1 && a[i+1][j]==0) a[++i][j]=m++;
break;
case 1:/*再向右*/
while(j<n-1 && a[i][j+1]==0) a[i][++j]=m++;
break;
case 2:/*向上*/
while(i>0 && a[i-1][j]==0) a[--i][j]=m++;
break;
case 3:/*向左*/
while(j>0 && a[i][j-1]==0) a[i][--j]=m++;
break;
default:break;
}
dir=(dir+1)%4;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
#include<stdio.h>
void main()
{
int m=2,n;
int a[10][10]={1};
int dir=0;
int i=0,j=0;
printf("Please input N:");
scanf("%d", &n);
while(m<=n*n)
{
switch(dir)
{
case 0:/*先向下输出*/
while(i<n-1 && a[i+1][j]==0) a[++i][j]=m++;
break;
case 1:/*再向右*/
while(j<n-1 && a[i][j+1]==0) a[i][++j]=m++;
break;
case 2:/*向上*/
while(i>0 && a[i-1][j]==0) a[--i][j]=m++;
break;
case 3:/*向左*/
while(j>0 && a[i][j-1]==0) a[i][--j]=m++;
break;
default:break;
}
dir=(dir+1)%4;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/* 程序名称:螺旋数组 */
/* 程序目的:输出螺旋数组 */
/* ===================================================================== */
/* --------------------------------------------------------------------- */
/* */
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
/* 主程序:输入数组大小,返回正逆一种 */
/* --------------------------------------------------------------------- */
#include<stdio.h>
#define N 20
void main()
{ int i,j,row,col,t=1,n,a[N][N]={0},b[N][N]={0},z;
while(1)
{ printf("\n\n input the num n(1--20):");
scanf("%d",&n);
if(n<1||n>20)break;
printf("\n\n input clockwise,1or2:");
scanf("%d",&z);
printf("\n");
t=1;
for(i=1;i<=n/2;i++)
{ row=i;
for(col=i;col<=n-i;col++)a[row][col]=t++;/*按住行不动,列输出*/
col=n+1-i;
for(row=i;row<=n-i;row++)a[row][col]=t++;/*按住列不动,行输出*/
row=n+1-i;
for(col=n+1-i;col>=i+1;col--)a[row][col]=t++;
col=i;
for(row=n+1-i;row>=i+1;row--)a[row][col]=t++;
}
if(n%2==1)a[n/2+1][n/2+1]=t;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
{b[j](i)=a(i)[j];}
}
if(z==1)
{ for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a(i)[j]);
printf("\n");
}}
printf("\n");
if(z==2)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",b(i)[j]);
printf("\n");
}}
}
/* 程序目的:输出螺旋数组 */
/* ===================================================================== */
/* --------------------------------------------------------------------- */
/* */
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
/* 主程序:输入数组大小,返回正逆一种 */
/* --------------------------------------------------------------------- */
#include<stdio.h>
#define N 20
void main()
{ int i,j,row,col,t=1,n,a[N][N]={0},b[N][N]={0},z;
while(1)
{ printf("\n\n input the num n(1--20):");
scanf("%d",&n);
if(n<1||n>20)break;
printf("\n\n input clockwise,1or2:");
scanf("%d",&z);
printf("\n");
t=1;
for(i=1;i<=n/2;i++)
{ row=i;
for(col=i;col<=n-i;col++)a[row][col]=t++;/*按住行不动,列输出*/
col=n+1-i;
for(row=i;row<=n-i;row++)a[row][col]=t++;/*按住列不动,行输出*/
row=n+1-i;
for(col=n+1-i;col>=i+1;col--)a[row][col]=t++;
col=i;
for(row=n+1-i;row>=i+1;row--)a[row][col]=t++;
}
if(n%2==1)a[n/2+1][n/2+1]=t;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
{b[j](i)=a(i)[j];}
}
if(z==1)
{ for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%4d",a(i)[j]);
printf("\n");
}}
printf("\n");
if(z==2)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%4d",b(i)[j]);
printf("\n");
}}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这个程序输出可以不用循环,改写如下:#include
<stdio.h>
main()
{
int
a[2][2]={1,2,3,4};
printf("%3d",a[0][0]);
printf("%3d",a[0][1]);
printf("\n");
printf("%3d",a[1][0]);
printf("%3d",a[1][1]);
}
但是如果数据量大的话,应该用循环
<stdio.h>
main()
{
int
a[2][2]={1,2,3,4};
printf("%3d",a[0][0]);
printf("%3d",a[0][1]);
printf("\n");
printf("%3d",a[1][0]);
printf("%3d",a[1][1]);
}
但是如果数据量大的话,应该用循环
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询