- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第39讲模拟输入库函数
第39讲 模拟输入库函数,将数字字符串转换为十进制整数
类型 开拓思路题
趣味性**
难度**
小知识:理解PC机中的键盘工作原理:
(摘自《PC技术内幕》第8版,清华大学出版社Peter Norton 著 张琦等译P245页)
由键盘(按下或松开某个键后)送入PC机的信息经过特别分配的键盘串行输入口进入PC机的主机。从那儿,信息就就到了我们所定义的“键盘控制器”( 何勤注,即键盘的输入输出接口电路)。
PC机系统单元的键盘控制器可以是一个微小的嵌入式计算机,它有自己的微处理器、带有固化程序的ROM和一些RAM,“键盘控制器”也可由主板芯片组的一部分来完成。
通过键盘,键盘控制器获得了有关键被按下或释放的信息。每当它得到这样的信息,键盘控制器都会发出两个动作。第一个动作是将代表了击键信息的扫描码放入缓冲区中(一小块RAM,它通常处于主存的低地址区)。第二个动作是引发一个硬件中断,中断号为9(何勤注:有关中断的简要介绍,请读者参见《轻松学习C程序设计》一书的第9章,9.5节)。
必须理解这样一个十分重要的事实:扫描码对应的是你所按下的键,而不是你所想输入的字符。于是a和A的扫描码是相同的。扫描码比须根据三种击键和换档(字母、数字、Ctrl键和Alt键)中的每一种以及三种换档锁定键(caps键、数字键和scroll键)的当前状态来确定使用者的击键动作的含义是什么。
(何勤注:这就是为何按下一个键有时候程序(这可能是一个字处理程序)在屏幕上显示一个字符,有时侯代表的却是一个游戏程序中按下的一个快捷键的根本原因。)
(在PC机上此过程实际上比较复杂:先由键盘接口电路将此按键的扫描码存放到输入缓冲区中,然后键盘接口电路向CPU发出一个中断信号,此中断信号如果最后是调用DOS中的9号中断处理程序进行处理的话,则会将此按键所对应的ASCII码(但还要判断上档键shift是否按下)存放在键盘输入缓冲区中。不过很多DOS下的游戏程序会用自己的9号中断处理程序去取代DOS中的9号中断处理程序?。这样一来,你在运行游戏程序时按下的键就很可能被当作游戏中的某个快捷键了?)
讨论:人们在PC机的键盘上连续敲击数字键时,键盘输入输出接口电路(即键盘控制器)会把相应数字字符按键的扫描码(此扫描码与ASCII码有着对应关系,参见上述的小知识)存放到内存中的一个固定区域——即键盘输入缓冲区中(并发出9号中断信号,参见第8章9.5节)。那么,C语言中的输入函数最后是如何把这些一个一个输入的ASCII码形式(至于如何由键盘扫描码得到对应按键的ASCII码本书不作深入讨论,读者可参考《PC技术内幕》第8版,清华大学出版社Peter . Norton 著 张琦等译?。在DOS操作系统控制?PC机的情况下,这是由9号中断处理程序来处理此事的)的数字字符串转换为整数或实数(实际上最终应转换成二进制形式的整数或实数)的呢?这就是本讲所要研究的内容。
算法分析:首先来研究如何把字符串中的单个数字字符转换成一个十进制的数值。
这个数字字符用str[i]来表示(开始时i=0),str被定义为字符数组,转换后的十进制数值用整型变量n来表示。因为字符在C语言的程序中出现的形式虽然是用单引号括住的单个字符,但是,这种字符变量或字符常量可以出现在算术表达式或布尔表达式中,这个字符变量或常量的值就是相应字符的ASCII码值。
因此整型变量 n的值可按如下的赋值语句求出(查看ASCII码表可知,10个数字字符在表中是连续在一起的,‘0’的ASCII码值最小,‘9’的最大)。
n=str[i]-‘0’; (5.3)
再进一步讨论,如果要转换的位数为两个的话(即几十几),因为字符串(即字符数组)中下标号由小到大表示的是由高位到低位的数字(即str[0]如果表示的是百位数,那么str[1]表示的就是十位数,str[2] 表示的就是个位数),那么只要将式(5.3)改为: n=n*10+str[i]-‘0’; (5.4)
即可,右边表达式中的n是变量的老值(十位数上的值),新读入的str[i]-‘0’是个位数的值。
如果是多位数,仍然可以采用式(5.4),也就是说,式(5.4)就是对于此问题通用的式子。
一级算法:
(1)读入待转换的数字字符串→str
(2)i=0;
(3)n=0;
(4)while( str[i]!=‘\0’ )
{
n=n*10+str[i]-‘0’;
i++;
}
(5)打印n的值
转换成C语言程序如下:
1 #includestdio.h
2 int main()
文档评论(0)