开发者社区> 贺利坚> 正文

《C语言及程序设计》实践项目——敲了哪一个键?

简介: 返回:贺老师课程教学链接 【项目2-敲了哪一个键?】 在应用中,常需要检测键盘上敲了哪一个键。每个输入的键都对应一个键值(我们熟悉的字母、数字等,键值就是其ASCII码)。在一些游戏、控制程序中,常用到的,诸如上下左右方向键、PgDn和PgUp这样的翻页键,以及ESC退出键等。用getch()捕获键盘输入,若输入的是PgDn(下一页,键值161)、PgUp(上一页,键值1
+关注继续查看

返回:贺老师课程教学链接

【项目2-敲了哪一个键?】
在应用中,常需要检测键盘上敲了哪一个键。每个输入的键都对应一个键值(我们熟悉的字母、数字等,键值就是其ASCII码)。在一些游戏、控制程序中,常用到的,诸如上下左右方向键、PgDn和PgUp这样的翻页键,以及ESC退出键等。用getch()捕获键盘输入,若输入的是PgDn(下一页,键值161)、PgUp(上一页,键值153),就给出提示,若是其他键,将输出符号及其对应的键值,直到输入ESC(键值27)后,程序结束。

#include <stdio.h>
#include <conio.h>
int main()
{
    int ch;
    do{
        ch=getch();  //从键盘读入
        //若关于键盘管理的知识积累不够,请暂时不必搞懂这个if语句中的处理
        if ( ch == 0xe0 )    
        {
            ch=getch();
            ch+=80; 
        }
        //从下面开始读懂程序
        if ( ch == 161 )
            printf("PageDown\n");
        else if ( ch == 153 )
            printf("PageUp\n");
        else
            printf("ch=%c keyValue=%d\n", ch, ch);
    } while (ch != 27 ); //ESC 退出
    return 0;
}

(1)请运行程序,记录下用于控制光标的八个键(→↑↓←四个方向键,以及Home、End、PgDn、PgUp)的键值。
(2)改造上面的程序,使其在输入控制光标的八个键后,能够提示相关的信息(对应在游戏和控制程序中,用于完成相应的动作,如游戏中,按→,将发动攻击)。要求:在程序中,直接写出ch == 161之类的代码,程序的可读性太差了,请自定义并使用枚举类型,编写出“专业”的程序来。

[参考解答]

#include <stdio.h>
#include <conio.h>

enum keys {HOME=151, UP, PGUP, LEFT=155, RIGHT=157, END=159, DOWN, PGDN};  //定义枚举类型

int main()
{
    int ch;
    do
    {
        ch=getch();
        if ( ch == 0xe0 )
        {
            ch=getch();
            ch+=80; 
        }
        switch(ch)
        {
        case UP:   //改善了可读性,意义非凡
            printf("Up\n");
            break;
        case DOWN:
            printf("Down\n");
            break;
        case LEFT:
            printf("Left\n");
            break;
        case RIGHT:
            printf("Right\n");
            break;
        case HOME:
            printf("Home\n");
            break;
        case END:
            printf("End\n");
            break;
        case PGUP:
            printf("PageUp\n");
            break;
        case PGDN:
            printf("PageDown\n");
            break;
        default:
            printf("ch=%c KeyValue=%d\n",ch,ch);
        }
    }
    while (ch != 27 );   //ESC 退出
    return 0;
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C语言及程序设计实践项目-递归和多文件组织
【项目1——递归求解】 (1)立方累加和:用递归函数求f(n)=1 3 +2 3 +...+n 3  f(n)=1^3+2^3+...+n^3,要求先将f(n)数学表达式表示成递归的形式,然后再编程序实现。 (2)写出求1*3*…*n的递归式,并编写出递归函数求解。 (3)编程序,用递归函数求出两个数的最大公约数。(包括编main函数,调用定义的递归函数) 参考解答
1192 0
《C语言及程序设计》实践项目——文件操作
返回:贺老师课程教学链接 【项目1 - 小玩文件】 1、下面程序的功能是统计文本文件abc.txt中的字符个数,请填空将程序补充完整。 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { FILE *fp; if((fp=fopen("abc.txt",_______))==
1175 0
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include<stdio.h> enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1025 0
《C语言及程序设计》实践项目——链表初步
返回:贺老师课程教学链接 【项目1-链表的合并】 输入一个整数m,表示A链表的长度,再输入m个数作为A链表中的m个数据元素,建立链表A,其头指针为heada。输入一个整数n,表示B链表的长度,再输入n个数表示B链表中的n个数据元素,建立链表B,其头指针为headb。输入i、len、j,将要从单链表A中删除自第i个元素起的共len个元素,然后将单链表A插入到单链表B的第j个
1219 0
《C语言及程序设计》实践项目——结构体应用
返回:贺老师课程教学链接 【项目1-学生成绩统计】 每位同学的信息学号、姓名、C、高数、英语成绩。定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[13])、姓名(name)、三门课的成绩(grade)、总分(score)、均分(average))。 (1)从键盘上输入N名学生的信息(N定义为常变量); (2)求出每名同学的总分和均分,并存储在结
1289 0
《C语言及程序设计》实践项目——初练结构体
返回:贺老师课程教学链接 【项目1-复数结构体】 编写一个程序,首先定义一个复数数据类型,即结构类型。然后按照复数的运算规则进行计算,并按照复数表示的格式进行输出,请将程序补充完整。 #include <stdio.h> struct complex { int re; int im; }; int main() { stru
1476 0
《C语言及程序设计》实践项目——递归函数
返回:贺老师课程教学链接 【项目-递归函数】 (1)立方累加和:用递归函数求f(n)=1 3 +2 3 +...+n 3  f(n)=1^3+2^3+...+n^3,要求先将f(n) f(n)数学表达式表示成递归的形式,然后再编程序实现。 (2)写出求1∗3∗...∗n 1*3*...*n的递归式,并编写出递归函数求解。 (3)编程序,用递归函数求出两个数的最大公约数
976 0
《C语言及程序设计》实践项目——程序的多文件组织
返回:贺老师课程教学链接 【项目1-程序的多文件组织】请将下面的程序中的代码分别保存在两个文件中,利用多文件的方式组织。 * main.c(也可以是别的名字) #include <stdio.h> int max(int x,int y); int min(int x,int y); int main( ) { int a,b,c1,c2;
916 0
《C语言及程序设计》实践项目——动态数组
返回:贺老师课程教学链接 【项目1-学生人数没个准】输入学生成绩,输出高于平均成绩的学生序号和成绩。其中学生人数不定,可能10个,可能1000。在录入成绩之前,学生人数由键盘输入。由于要先求出平均成绩,然后才能确定输出哪些学生的信息,所以需要一个数组先将学生信息保存下来。考虑学生人数不定,用动态数组是个更适合的方案下面的程序结构供参考:#include<stdio.h> #i
1155 0
《C语言及程序设计》实践项目——main函数的参数
返回:贺老师课程教学链接 【项目1-用命令行运行程序】下面的程序,用于复制命令行中给出的文件。请利用命令行的方式运行程序。#include&lt;stdio.h&gt; #include&lt;string.h&gt; int main(int argc,char *argv[]) { FILE *p1,*p2; int c; p1=fopen(argv[1], "r
1095 0
+关注
贺利坚
烟台大学计算机学院教师,建设系列学习资源,改革教学方法,为IT菜鸟建跑道,让大一的孩子会编程,为迷茫的大学生出主意,一起追求快乐的大学。 著书《逆袭大学:传给IT学子的正能量》,帮助处于迷茫中的大学
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
为什么要学函数式编程?
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载