| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5214 人关注过本帖
标题:刚学c语言,老师让编打字游戏,无奈啊。。。。。。。。
只看楼主 加入收藏
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
回复 49楼 zcfyxw
貌似挺麻烦啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-31 16:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有45楼这个就清楚了。textcolor()是设置文本的前景色,textbackground()是文本的背景色,gotoxy()是定位光标。现在说接收键盘输入:

用getch(),不要使用什么'\n'之类的东西。getch()是即时返回当前按键的扫描码,对Enter键,它返回0x0D,不是什么'\n',像TAB、SPACE、BACKSPACE这样直接的按键,它返回通常是ASCII码值,但一定要注意像Home、End、PgUp、PgDn这类的按键,一次getch()是不行的,这种按键有两个码,要调用两次getch()才能读完。也就是说,对任何键盘的按键,会出现两种情况,一种是一个码的,一种是两个码的,那么问题就在这里了,你的程序其实是不知道用户到底按了什么的,如果他按了两个码的键,但程序当一个码收了去判断,那么必定出错!查这个帮助,看返回两个码的情况,第一个必定是特殊的代码(在Win32API中是0xE0),因此,你必须每getch()一次,就检查它是不是0xE0,如果是,就需要再调用一次getch(),把真正的键码读进来,如果不是,就意味着下面是另外一次按键。这个逻辑必须要搞清楚。

那么,有人会说,我程序中不需要处理那种编辑键,可以不考虑,这是错的。你不需要处理编辑键是一回事,而用户是否真的按了这些键又是另一回事,他按了,你就必须把他按过的这些键检测到并抛弃掉,如果你不知道他到底按了什么键,就必定会把那些键当普通按键处理,从而输出错误的字符,那些乱码就是这样来的!

授人以渔,不授人以鱼。
2012-12-31 16:58
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
程序代码:
 #include<stdio.h>
#include<string.h>
#include<time.h>
main()
{
    char a[5][5],b[5][5];
    int i,j,m,n=0;
    long t1,t2;
    t1=time(NULL);



        for(j=0,i=1;j<5;j++,i+=2,gotoxy(1,i))
        {
            for(m=0;m<5;m++) {
            a[j][m]=97+rand()%26;
            printf("%c",a[j][m]);}
        }


    gotoxy(1,2);



        for(j=0,i=1;j<5;j++,i+=2,gotoxy(1,i+1))
            for(m=0;m<5;m++){
            if((b[j][m]=getch())=='\n'){fflush(stdin);break;}
            if(b[j][m]==a[j][m])
                cprintf("%c",b[j][m]);
            else{
            textcolor(4);
                cprintf("%c",b[j][m]);
                textcolor(7);
            }                     }

        t2=time(NULL);
        printf("mei fen zhong da zi %d ge .",(m*j)/((int)(t2-t1)));
getch();
}
又改了下

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-31 17:05
zcfyxw
Rank: 1
等 级:新手上路
帖 子:68
专家分:7
注 册:2012-12-26
收藏
得分:0 
回复 52楼 TonyDeng
似乎知道什么意思,但是还是有点懵。。。。。。。。。。那你说的这个问题稍后再处理吧,先实现课题的要求,然后再趋于完好吧
2012-12-31 17:06
zcfyxw
Rank: 1
等 级:新手上路
帖 子:68
专家分:7
注 册:2012-12-26
收藏
得分:0 
回复 51楼 yaobao
我又改了,可以实现打错变颜色了,还有你加的那个清除缓冲,但是我还是不明白到底为啥他就自动变到输入的第二行了,神奇
2012-12-31 17:08
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
刚才的代码符合要求吗?

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-31 17:09
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
呃呃呃,对了,最后输出的那个是每秒的敲击键盘次数,不是每分钟的

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-31 17:10
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
我要去吃饭了 啊,会来在聊啊,

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-31 17:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
每接收一次按键ch = getch(),先排除它不是编辑键,而且判断ch是普通的字符,那么就用putch(ch)把这个字符输出到屏幕上光标的位置处,如果要变色,就在putch()之前变,变过之后,对以后的输出字符起作用,什么时候要变,就什么时候设。

要输出回车换行,必须输出两个字符!
putch(0x0D);
putch(0x0A);
这是一个两编码字符,亦即所谓的'\n'。这就是前面告诉你,千万不要用'\n'来判断字符的原因。在conio环境中,'\n'是一个被特殊处理的字符,它会随着平台的不同而不同,在Windows中,它往往是'\r'+'\n'(0x0D0A),而在Unix/Linux中,才是'\n'(0x0D)。输出putch(0x0D),仅仅是回车,光标返回行头,但不会跳到下一行,输出putch(0x0A),是仅仅换行,但光标不返回行头,必须两个字符一起输出,才是正常的回车换行动作(顺序无关紧要,可以颠倒,效果是一样的)。如果输出putch('\n'),则系统会根据平台来处理,在Windows下,执行回车换行动作。看到没有,三种是不一样的!这种情况,同样会出现在文件读写处理的'\n'符中,当某个文件要移植到不同的平台下时,这个'\n'往往会引起怪异现象,通常标准库的流读写函数自己检测平台执行转换处理,但如果你要自己处理每一个字节,问题就在这里出现了。

不知道这个的人,就总爱用ASCII来取代字符,根本是不怕死的。须知字符就是字符,不是什么整数,人的逻辑区分这是不同的数据类型,不是你学过什么底层之后就可以随便混起来写的,学C就是这一点学坏人,非常不好的习惯。

[ 本帖最后由 TonyDeng 于 2012-12-31 17:21 编辑 ]

授人以渔,不授人以鱼。
2012-12-31 17:13
zcfyxw
Rank: 1
等 级:新手上路
帖 子:68
专家分:7
注 册:2012-12-26
收藏
得分:0 
回复 56楼 yaobao
离成功越来越近了,我改了个,
#include<stdio.h>
#include<string.h>
#include<time.h>
main()
 {
     char a[5][5],b[5][5];
     int i,j,m,n=0;
     long t1,t2;
     t1=NULL;
        for(j=0,i=1;j<5;j++,i+=2,gotoxy(1,i))
         {
             for(m=0;m<5;m++) {
             a[j][m]=97+rand()%26;
             printf("%c",a[j][m]);}
         }
 

    gotoxy(1,2);


        for(j=0,i=1;j<5;j++,i+=2,gotoxy(1,i+1))
             for(m=0;m<5;m++){
             if((b[j][m]=getch())=='\n'){fflush(stdin);break;}
             if(b[j][m]==a[j][m])
                {n=n+1;
                 printf("%c",b[j][m]);}
             else
                 {
                 textcolor(5);
                 cprintf("%c",b[j][m]);
                 }
             }
             t2=NULL;
             printf("%d",n/(t2-t1));
 

 getch();
 }但是出不来结果,是一闪而过,看见一个dirve什么的,不知道为什么啊????
大神好好吃饭啊,吃饱了好教我,哈哈
2012-12-31 17:15
快速回复:刚学c语言,老师让编打字游戏,无奈啊。。。。。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.115405 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved