题目:
编写一个程序,要求输入两个整数(>=)M,N,生成一个 M*N的矩阵,在矩阵中元素取值A至Z的26个字母中任意一个,
A在左上角,其余个数顺时针方向选装前进,一次递增放置,当超过26时又从A开始填充。
c语言程序:
#include <stdio.h>
#define RIGHT 1//便于表达将各个方向用数字表示
#define DOWN 2
#define LEFT 3
#define UP 4
int pri(int M,int N)
{
int i=0,j=0,k=0;
int dir=RIGHT;
char a[10][10];//由于C99才支持可变长数组,C90的编译器不支持,此处直接定义为较大的数组,但不用那么多
for(i=0;i<10;i++)
for(j=0;j<10;j++)
a[i][j]=0;
i=0;
j=0;
// printf("%d\n",M);
// printf("%d\n",N);//测试M,N输入问题
if(M<1|| N<1)
{
printf("您输入的矩阵不符合标准。\n");
return -1;
}
while(i<M*N)
{
a[j][k]='A'+ i % 26;
if(i+1==M*N)
{
printf("程序输出结束。\n");
break;
}
turn:
switch(dir)
{
case RIGHT: if(k+1==N||a[j][k+1]!=0)//之所以用k+1是指下一个的意思
{
dir=DOWN;
goto turn;
}
k++;
break;
case DOWN: if(j+1==M||a[j+1][k]!=0)//之所以用k+1是指下一个的意思
{
dir=LEFT;
goto turn;
}
j++;
break;
case LEFT: if(k==0||a[j][k-1]!=0)//之所以用k+1是指下一个的意思
{
dir=UP;
goto turn;
}
k--;
break;
case UP: if(j==0||a[j-1][k]!=0)//之所以用k+1是指下一个的意思
{
dir=RIGHT;
goto turn;
}
j--;
break;
}
i++;//控制字母一次输出
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%2c",a[i][j]);
printf("\n");
}
printf("\n");
return 0;
}
int main()
{
int M,N;
printf("请输入您要的矩阵规格:(要求小于10*10矩阵)\n");
scanf("%d,%d",&M,&N);
pri(M,N);
return 0;
}
运行结果:
遇到的问题总结:
1.C语言程序,VC编译器报错,error C2143: syntax error : missing ')' before 'constant
原因:函数的参数,与预定义(宏)等重名了,解决方法就是修改预定义宏、函数参数中的任何一个,使其不重名即可。
2.数组维数不能确定,需要程序执行的时候输入,在定义的时候如何处理?
原因:C99才支持可变长数组,C90的编译器不支持
3.(M<1|| N<1)//奇怪输入的数字明显不符合要求,为什么就输出了哪?
{
printf("您输入的矩阵不符合标准。\n");
return -1;
}
问题:在键盘上按3空格4,之后直接运行此if语句
解决办法:在if之前加入两个printf语句发现M正常输出,但N不能正常输出,后来在键盘输入3逗号(,)4,再执行,就正常了。
4. while( i+1 < M*N)下程序最后一个字母打印不出来,但改成 while( i < M*N)后程序一个都不打印了?
问题图:
解决办法:在while循环中加入 if(i+1==M*N)
{
printf("程序输出结束。\n");
break;
}
结束其循环。没有while循环结束语句,当然不再往下执行了。