c语言 一道题 求解!谢谢!
题目是这样的:输入图形行数N和中心字符,输出如图所示回形方阵。例如,输入:5Z输出如下图形:XXXXXXYYYXXYZYXXYYYXXXXXX注:N<24,且N是奇数。我...
题目是这样的:输入图形行数N和中心字符,输出如图所示回形方阵。
例如,输入:5 Z
输出如下图形:
X X X X X
X Y Y Y X
X Y Z Y X
X Y Y Y X
X X X X X
注:N<24,且N是奇数。
我写的程序:问题在程序中已标注出!谢谢了!
#include<stdio.h>
void main()
{
char a[24][24],z;
int n,i,j,k,fk;
scanf("%d %c",&n,&z);
for(k=1;k<(n+1)/2;k++)
{
z=z-1;
if(z<'A')
{
z='Z';
}
if(z>'Z'&&z<'a')
{
z='z';
}
}
for(k=(n+1)/2;k>0;k--)
{
fk=0-k;
for(i=fk;i<=k;i++)
{
for(j=fk;j<=k;j++)
{
a[(n-1)/2+i][(n-1)/2+j]=z;/*调试时会发现这里的fk会各种变化~~~为什么啊~~~求解~~谢谢了!*/
}
}
z=z+1;
if(z>'Z'&&z<'a');
{
z='A';
}
if(z>'z')
{
z='a';
}
}
a[(n-1)/2][(n-1)/2]=z;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%c ",a[i][j]);
}
printf("%c\n",a[i][n-1]);
}
}
k的值是一直减小的…所以fk是增大的…怎么会出现a的下标出现负值的情况呢? 展开
例如,输入:5 Z
输出如下图形:
X X X X X
X Y Y Y X
X Y Z Y X
X Y Y Y X
X X X X X
注:N<24,且N是奇数。
我写的程序:问题在程序中已标注出!谢谢了!
#include<stdio.h>
void main()
{
char a[24][24],z;
int n,i,j,k,fk;
scanf("%d %c",&n,&z);
for(k=1;k<(n+1)/2;k++)
{
z=z-1;
if(z<'A')
{
z='Z';
}
if(z>'Z'&&z<'a')
{
z='z';
}
}
for(k=(n+1)/2;k>0;k--)
{
fk=0-k;
for(i=fk;i<=k;i++)
{
for(j=fk;j<=k;j++)
{
a[(n-1)/2+i][(n-1)/2+j]=z;/*调试时会发现这里的fk会各种变化~~~为什么啊~~~求解~~谢谢了!*/
}
}
z=z+1;
if(z>'Z'&&z<'a');
{
z='A';
}
if(z>'z')
{
z='a';
}
}
a[(n-1)/2][(n-1)/2]=z;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%c ",a[i][j]);
}
printf("%c\n",a[i][n-1]);
}
}
k的值是一直减小的…所以fk是增大的…怎么会出现a的下标出现负值的情况呢? 展开
展开全部
fk使用时会导致数组a下标越界,数组a的下标有可能为负值,还有变量z在使用的时候会改变,a[(n-1)/2][(n-1)/2]=z;这里应该是z-1赋给最中间的变量,另外循环赋值的时候看不懂你的思路,这是我改写的。
#include<stdio.h>
void main()
{
char a[24][24],z,zh;
int n,i,j,k;
scanf("%d %c",&n,&z);
zh=z;
for(k=1;k<(n+1)/2;k++)
{
z=z-1;
if(z<'A')
{
z='Z';
}
if(z>'Z'&&z<'a')
{
z='z';
}
}
for(k=1;k<(n+1)/2;k++)
{
for(i=k-1;i<=(n-k);i++)
a[k-1][i]=z;
for(i=k;i<=(n-k);i++)
a[i][n-k]=z;
for(i=(n-1-k);i>=(k-1);i--)
a[n-k][i]=z;
for(i=(n-1-k);i>(k-1);i--)
a[i][k-1]=z;
z=z+1;
if(z>'Z'&&z<'a')
{
z='A';
}
if(z>'z')
{
z='a';
}
}
a[(n-1)/2][(n-1)/2]=zh;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%c ",a[i][j]);
}
printf("%c\n",a[i][n-1]);
}
}
#include<stdio.h>
void main()
{
char a[24][24],z,zh;
int n,i,j,k;
scanf("%d %c",&n,&z);
zh=z;
for(k=1;k<(n+1)/2;k++)
{
z=z-1;
if(z<'A')
{
z='Z';
}
if(z>'Z'&&z<'a')
{
z='z';
}
}
for(k=1;k<(n+1)/2;k++)
{
for(i=k-1;i<=(n-k);i++)
a[k-1][i]=z;
for(i=k;i<=(n-k);i++)
a[i][n-k]=z;
for(i=(n-1-k);i>=(k-1);i--)
a[n-k][i]=z;
for(i=(n-1-k);i>(k-1);i--)
a[i][k-1]=z;
z=z+1;
if(z>'Z'&&z<'a')
{
z='A';
}
if(z>'z')
{
z='a';
}
}
a[(n-1)/2][(n-1)/2]=zh;
for(i=0;i<n;i++)
{
for(j=0;j<n-1;j++)
{
printf("%c ",a[i][j]);
}
printf("%c\n",a[i][n-1]);
}
}
展开全部
应该是你的fk=0-k; 这里的错误 假设我的n输入是5 的话 那么fk= -3 对吧
接着在数组赋值的时候a[-1][-1]可能把fk的地址覆盖了可能之类的吧
接着在数组赋值的时候a[-1][-1]可能把fk的地址覆盖了可能之类的吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for(k=(n+1)/2;k>0;k--)
{
fk=0-k;
for(i=fk;i<=k;i++)
{
for(j=fk;j<=k;j++)
{
a[(n-1)/2+i][(n-1)/2+j]=z; }
}
请看以上的语句,fk的值取决于k的值。在第一个循环语句for(k=(n+1)/2;k>0;k--)中,k的值是逐渐减一的,所以fk的值也会随之变化。所以在下面的子for循环和孙for循环中,fk的值也会随之变化。
{
fk=0-k;
for(i=fk;i<=k;i++)
{
for(j=fk;j<=k;j++)
{
a[(n-1)/2+i][(n-1)/2+j]=z; }
}
请看以上的语句,fk的值取决于k的值。在第一个循环语句for(k=(n+1)/2;k>0;k--)中,k的值是逐渐减一的,所以fk的值也会随之变化。所以在下面的子for循环和孙for循环中,fk的值也会随之变化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询