资源描述:
《c语言教学中几个问题的分析与解决》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、C语言教学中几个问题的分析与解决第23卷2OO6年12月华东交通大学JournalofEastChinaJiaotongUniversityV01.23Dec.,2OO6文章编号:1005一O523(20O6)综合一0144—03C语言教学中几个问题的分析与解决毛丽娜(华东交通大学高职学院,江西南昌330013)摘要:对《高级程序设计语言c》授课过程中遇到的问题进行了分析,解决.从而为初学者尽快掌握c语言,提高程序设计水平提供借鉴.关键词:垃圾;比较运算;悬挂;指针;有参宏展开中图分类号:G641文献标识码:AC
2、语言作为计算机程序设计类基础课程,是一门语法灵活应用广泛的高级程序设计语言,但是,C语言又是一门语法要求比较严格,较抽象难以理解的编程语言,而且由于授课对象都是初次接触程序设计的大学低年级学生,在实际教学中常常会出现很多问题学生易产生错误.1scanf()和getchar()留下的垃圾seanf()和getchar()这两个函数在C语言编程中经常用到,它们在接收数据输入时都可以用回车来结束.但实际上,在回车之前,用户可能输人了很多的数据,而函数仅取走了它们想要的数据.多余的数据还留在缓冲区中,留给了后面的函数,但
3、很难保证这些遗留的数据对下一个函数是适合的,因此极有可能产生错误,这就是"垃圾".实际上,即使输入的数据没有多余,这两个函数也同样会在缓冲区中留下垃圾,一个换行符(,n).例如:撑include"stdio.h"main(){inta;charch;scarf("%d",&a);seanf("%c",&ch);printf("%d,%dn",a,ch);}上机输,K:20/A则输出为:20,10(10是回车的ASCII码)原本意要a=20ch='A'但由于20给a后,回车进入ch变量解决此问题办法
4、:方法1.输入应为:20A则输出20,A方法2.输入仍为:20/A/,加getchar()将回车符接收,清除缓冲区的垃圾.则输出20,A是正确的.#include"stdio.h"main(){inta;charoh;"%d",&a);getchar();seanf("%c",&ch);p~tf("%d,%d,n",a,ch);}收稿日期:2OO6—10—28作者简介:毛丽娜(1957一),女,华东交通大学讲师,从事计算机软件的教学,研究工作.综合毛丽娜:C语言教学中几个问题的分析与毹决1452忽
5、略砸ntf()函数的求值顺序如:main(){im5:printf("%d,%d,%d",++i,i一一,i+2);}程序的结果很容易误判为:6,6,7而Turhoc在执行prinff()函数时,参数自右向左依次压入栈中,即先压入i+2参数的值,再压入i一一的值,最后将参数++i的值压入,弹出时则依次为++i,i一一,i+2,即当prinff()函数中出现多项表达式输出项时,prinff()按照从右到左顺序计算各表达式的值,然后再输出结果.因此以上程序的正确结果应为:5,5,73比较运算符在C语言中比较运算符
6、应用得很广,但有些比较运算符在应用中一定要注意.例如判别ch中输入的是否是小写字符,若是则输出此字符.程序如下:chareh;eh=getchar();if('a'<=eh<='z')prlntf("%c",ch);从数学的角度,这个程序看起来没有什么错误,但是仔细考虑后会发现假设输入字符B,先计算'a'<='B',结果为0(假),然后再计算0<='z',结果为1(真),则表达式'a'<=eh<='z',值为l(真),即if条件成立,打印输出此字符.显然这样做是不符合题意,所以
7、最后语句应该为if('a'<=eh&&eh<='z')prinff("%C".eh);这是在学习过程中学生一直不太理解的.4"悬挂''else引发的问题c语言允许if语句分别以if…和if…else…两种方式运用,同时允许多层嵌套使用.所谓悬挂即内层的else的缺省(else的漏写亦类似),这个问题虽然已经为人熟知,而且也并非C语言所独有,但即使是有多年经验的C程序员也常常在此失误过.先来看看下面的程序片段:if(a>b)if(a<c)x=C;elseif(b>c)x
8、:b:elseX=C;这段代码中编程者的本意是:使X取a,b,C三数中的最大值.然而,这段代码实际上所做的却与编程者的意图相去甚远.原因在于C语言中有这样的规则,else始终与同一对括号内最近的未匹配的if结合.如果我们按照上面这段程序实际上被执行的逻辑是第一个else与第二个if配对,第二个else与第三个if配对.程序的实际效果是:当b<a<c时x=c;a