论程序设计Test,关于“ASCII码”和“键盘扫描码”的基础应用?

这篇博客探讨了一道程序设计题,涉及键盘输入与ASCII码的关系。当用户按下键盘上的字母、功能键或方向键时,程序会根据输入转化为相应的输出。对于26个字母,大小写会自动转换;F1~F12及方向键则需通过特定处理。通过`getch()`函数获取键盘扫描码,并将其转换为ASCII码,实现特定键位的字符输出。例如,'UpArrow'的扫描码0x48转化为十进制72,对应ASCII码为'上'。
摘要由CSDN通过智能技术生成

题目如下:

某用户有一个新的键盘,他想知道这个键盘键帽的字符有没有印错。按下一个按键,在屏幕上显示其对应正确字符就没有印错。

输入格式&输出格式:

本题的输入即等于输出,假如按下‘A’按键,就显示‘A’

a~z 26个小写字母,A~Z 26个大写字母,F1~F12 12个按键,LeftArrow、RightArrow、UpArrow、DnArrow 四个按键

  • 敲击的26个小写字母会自动转化为26个大写字母

  • 敲击的26个大写字母和 F1~F12 保持原来

  • 敲击的LeftArrow、RightArrow、UpArrow、DnArrow分别显示“左”、“右”、“上”、“下”

附源码:

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

int main (int argc, char const *argv[])
{
    char in;
    int i = 0; 
	
    while ( 1 )
    {
        in = getch();
		
	if ( in == -32 || in == 0 )
	{
	    in = getch();
			
	    if ( in == 72 )
	    {
                printf ("上");
	    }
	    else if ( in == 80 )
	    {
		printf ("下");
	    }
	    else if ( in == 75 )
	    {
		printf ("左");
	    }
	    else if ( in == 77 )
	    {
		printf ("右");
	    }
	    else if ( in > 58 && in < 69 )
	    {
		for ( i = 0 ; i < 12 ; i++ )
		{
		    if (( in - 58 ) == ( i + 1 ))
		    {
		        printf ("F%d", i+1);
		    }
		}
	    }
	    else if ( in == -123 )
	    {
		printf ("F11");
	    }
	    else if ( in==-122 )
	    {
		printf ("F12");
	    }
	}
	else 
	{
    	    if ( in > 64 && in < 91 )
	    {
		printf ("%c", in);
	    }
	    else if ( in > 96 && in < 123 )
	    {
		printf ("%c", in-32);
	    }
	}
    }
    return 0;
}

关于这道题的解析,如下:

  1. 首先,使用了一个的头文件:<conio.h> —— “Console Input / Output” ,表示:“控制台的输入输出”。可以理解为打开一个实时的操作窗口,让用户可以通过敲击键盘来产生相应的操作!?                                    "~%?…,# *'☆&℃$︿★?"

  2. ,使用“int getch()”函数。该函数可以从控制台读取一个字符并同时不用敲击回车,但是这个字符不会在敲击的同时显示在屏幕上。于是有了类似“getchar()”的用法:

    char in;
    in = getch();

     

  3. 对于26个英文字母的大小写形式,用一个char的字符变量是可以读,但是像F1~F12LeftArrow就需要通过“getch()”的特殊功能来实现了:键入键盘上无法显示在屏幕上的按键,getch()会返回‘0’或者‘-32’的值(这是个int函数,会有返回值!)。然后,在这个if判断语句的内部,再次调用“getch()”函数,其会返回(笔者认为说白了就是读出来)这个无法显示在屏幕上的按键键盘扫描码(扫描码是十六进制的)。即便是十六进制的数字,在字符中还是按照ASCII码来储存。于是,这个扫描码又再次转化为了ASCII码。通过科学计算器将十六进制的扫描码转化成十进制数字,就能通过“else if ()”括号中的给定的条件进行输出了!

例如:“UpArrow”的扫描码是“0x48”,转化为十进制是“72”,第72个ASCII码,所以在“printf”上稍微做了点手脚,就出现了“上”。

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

int main (int argc, char const *argv[])
{
    char in;
    int i = 0; 
	
    while ( 1 )
    {
        in = getch();
		
	if ( in == -32 || in == 0 )
	{
	    in = getch();
			
	    if ( in == 72 )
	    {
		printf ("上");
	    }
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值