字符旋转

题目:

编写一个程序,要求输入两个整数(>=)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循环结束语句,当然不再往下执行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值