当前位置: 代码迷 >> C语言 >> 菜鸟初次做东西  请高手指点迷津
  详细解决方案

菜鸟初次做东西  请高手指点迷津

热度:275   发布时间:2005-05-06 11:07:00.0
晕,windows的API可不是那么好玩的~!
----------------解决方案--------------------------------------------------------
“看了您的程序我咋发现switch不如IF好使呢   您可真是高手啊!!!”

你是在说这一段吧...
if(Key==75)Xcursor=Xcursor>start+3?Xcursor-Xsize:Xcursor ;
if(Key==77)Xcursor=Xcursor<start+3+(a-1)*Xsize?Xcursor+Xsize:Xcursor ;
if(Key==72)Ycursor=Ycursor>start+12?Ycursor-Ysize:Ycursor ;
if(Key==80)Ycursor=Ycursor<start+12+(b-1)*Ysize?Ycursor+Ysize:Ycursor ;

你不是在讽刺我们的Knocker达人吧

----------------解决方案--------------------------------------------------------

----------------解决方案--------------------------------------------------------

大侠  又有问题了  请帮帮忙啊: #include "Conio.h" #include "dos.h" #include "stdio.h" #include "graphics.h" #include "ctype.h" #define closegr closegraph #define DIGITLEN 1000 #define MAXLINE 50 void cursor(); void initgr(void); void matrix(int ,int,int,int,int); int Xcursor,Ycursor ; int mem[50][50]; char m[100]; int main(void) { int a,b ; int i,j,k=0 ; int Xsize=50,Ysize=24 ; int Xstart,Ystart; int start=50 ; int Key=0 ,digit;

printf("line:"); scanf("%d",&a); printf("row:"); scanf("%d",&b); initgr(); matrix(start,Xsize,Ysize,a,b) ; Xstart=start; Ystart=start; Xcursor=Xstart; Ycursor=Ystart; cursor(); while(Key!=25) { while(bioskey(1)==0) cursor(); Key=bioskey(0); if ((Key<<8)>>8==27) break;

if(Key&0xff) /*如果不是方向键*/ /*这里加入接收部分,可以用getch(),outtextxy()等函数来处理,并根据所处的屏幕x,y值来对应矩阵的数组*/ { digit=(Key<<8)>>8; do { if (isdigit(digit)) { setfillstyle(0, 5); bar(Xcursor+1,Ycursor+1,Xcursor+Xsize-1,Ycursor+Ysize-1); setcolor(WHITE); m[k++]=digit; m[k]='\0'; outtextxy(Xcursor+3,Ycursor+Ysize/2,m); mem[(Ycursor-Ystart)/Ysize][(Xcursor-Xstart)/Xsize]=atoi(m);

} else { printf("\7"); break;

}

} while ((digit=getch())!=13);

}

else /*是方向键*/ { Key>>=8 ; if(Key==75)Xcursor=Xcursor>start?Xcursor-Xsize:Xcursor+(a-1)*Xsize; if(Key==77)Xcursor=Xcursor<start+(a-1)*Xsize?Xcursor+Xsize:Xcursor-(a-1)*Xsize ; if(Key==72)Ycursor=Ycursor>start?Ycursor-Ysize:Ycursor+(b-1)*Ysize ; if(Key==80)Ycursor=Ycursor<start+(b-1)*Ysize?Ycursor+Ysize:Ycursor-(b-1)*Ysize ;

for (k=0;k<=100;k++) m[k]=0; k=0; } } moveto(300,100); printf("what's u have input is :\n"); for (i=0;i<=b-1;i++) { for (j=0;j<=a-1;j++) printf("%d,",mem[i][j]); printf("\n"); } getch(); closegr(); return 0 ; } /* BGI初始化 */ void initgr(void) { int gd=DETECT,gm=0 ; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver); /* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd,&gm,""); } /*光标*/ void cursor() { setlinestyle(0,0,2) ; setcolor(WHITE); line(Xcursor+3,Ycursor+21,Xcursor+3,Ycursor+4); delay(3500); setcolor(BLACK); line(Xcursor+3,Ycursor+21,Xcursor+3,Ycursor+4); delay(3500); }

void matrix(int start,int Xsize,int Ysize,int a,int b) { int i; for(i=0;i<=a;i++) { line(start+i*Xsize,start,start+i*Xsize,start+b*Ysize); /*画竖线*/ } for(i=0;i<=b;i++) { line(start,start+i*Ysize,start+a*Xsize,start+i*Ysize);

}

} 为什么矩阵数组的mem[0][0]总是0?我试过了  一行一列时输入数字后按回车之后如果不按方向键就没问题  按了方向键就会为○? 当我把86行改成 for (;k>=0,k--) m[k]=0; k=0; 就都没问题了,虽然问题解决了 可是不知为什么会出现这种情况??我冥思苦想了半天了   百思不得其解,,郁闷死了,请大侠帮我分析下?感激不尽!!!!


----------------解决方案--------------------------------------------------------
这个垃圾代码是knocker负责的哦~~
插手不了了
----------------解决方案--------------------------------------------------------
看了一下,没调试,根据这三句:

                       m[k++]=digit;
                        m[k]='\0';
                        outtextxy(Xcursor+3,Ycursor+Ysize/2,m);

你的

for (;k&gt;=0,k--)
         m[k]=0;//这个for好象是没有必要的或者可以用 m[0]='\0' 代替
k=0 ;  / /k清零是必须,你的K值不能在不同的输入上累计吧?^_^
----------------解决方案--------------------------------------------------------
for (k=0;k&lt;=100;k++)
                m[k]=0;


换成这样试试

m[k=0]='\0';




----------------解决方案--------------------------------------------------------
感谢两位大侠  不过我更不明白了  您的  m[k=0]='\0';  只把m[0]给赋成'\0'了  如果我第一格输入的是123    您的  m[k=0]='\0';  只把m[0]给赋成'\0'了 ,而m[1]==2,,,m[2]==3,,,,,m[3]='\0', 下次 我在另一个格里输入数字9时,,,,m[]不就等于923了嘛??





而且我的for (k=0;k&lt;=100;k++)
                m[k]=0;

为啥会造成只要一按方向键就会给mem[0][0]清零呢?为什么for (;k&gt;=0,k--)
         m[k]=0;  就行呢?



望大侠不要嫌麻烦啊   救救我啊
----------------解决方案--------------------------------------------------------
1.for (k=0;k&lt;=100;k++)
                m[k]=0;//这是错的,没有k[100],你将&lt;=改成&lt;再看看是否还有mem][0]清零的情况

2.m[0]='\0';在你的程序其它部分无问题且输入无“异常”(---按照计设者的思路)情况下也是可以不要的,但k=0是必需的。这里的m[0]='\0'从程式的鲁棒性上考虑的。


3。我注意到你的定义

int mem[50][50];
char m[100];
你用什么编译器?mem[0][0]清零问题应该是 1 造成的,可以在这两个定义之间加入tmp[10][10],tmp1[5]再试试
----------------解决方案--------------------------------------------------------
1.不愧是大侠 果然是越界造成的   可是越界应该警告啊  他怎么给清零了?又为什么只给mem[0][0]清零  其它正常?? 我用的这个论坛上介绍的WIN-TC 1.8  编译器不太懂~   

2.我认为给char m[]  这个数组清零应该是必要的吧?要不然如果前一个数字是四位如1234后一个是三位如987   那么不会影响后一个的输出嘛?(9874);  不过经我调试果然如大侠所说  只要k=0就行了  这是为什么?
----------------解决方案--------------------------------------------------------