《C++程序设计》中职教学中的易错分析

2019-03-15 13:31胡玲洁
电脑知识与技术 2019年2期
关键词:语法错误

胡玲洁

摘要:C++是现今最重要的编程语言之一,但中职学生在学习中容易遇到很多细节问题,不仅影响学生的学习效率,甚至导致学生的厌学情绪。作者结合多年的C++教学经验,梳理了学生经常出现的一些问题,包括语法错误和逻辑错误,并提出针对性的解决方法。

关键词:C++;语法错误;逻辑错误

中图分类号:G424        文献标识码:A        文章编号:1009-3044(2019)02-0133-02

《C++程序设计》作为理工科学生的一门专业基础课,影响着学生后续专业课程的逻辑思维方式和程序设计思想的建立,是现今最重要的编程语言之一,在国内外得到了广泛的使用。C++知识点多,灵活性强,还包含很多零散的知识点,有些基本概念问题容易产生混淆甚至误解,加上中职学生零基础,学习理解能力不是很强,导致很多学生学习起来很困难,难以掌握本课程的精髓。根据自己的教学经验,作者在此提出了一些教学中学生常见的错误问题并予以分析说明。

1 常见语法错误

1.1 运算符的混淆

C++中,“=”与“==”两个运算符是学生使用中最容易混淆的,因为习惯于“等于”就是“=”,导致在使用中一不小心就发生错误,如下判断题:

若有int i=10, j=0; 则执行完语句if (j=0) i++; else i--; i的值为 11。很多学生会直接判断此题是对的,也就是把条件j=0理解为“j等于0”,而实际是“j赋成0,条件表达式的值为0,也就是假”,这样执行的是else分支,结果是9。

1.2 数据的非法运算

“%”求余和“/”相除两个运算符在使用过程中,学生往往忽略了一些运算特点,如下填空题:若有 int a=4; float b=14.70; 则 a/5 的值为    ,能正确表示a+b对a取余的表达式是     。很多学生会直接填上答案:0.8和(a+b)%a,而正确答案应该是:0和int(a+b)%a,正是因为忽视了“整型/整型”,结果还是整型,以及“%”求余运算的两个操作数必须都是整型。

1.3 逻辑表达式的模糊

教学中,学生对逻辑运算符&&和||的使用,也经常模糊不清,不会灵活运用,比如,写出判断一个字符是字母的逻辑表达式,很多学生知道字母包括大写字母和小写字母,也知道ASCII表中字母排放的规则,可书写表达式时就是没有思路,一方面是区间的交集,另一方面是区间的并集。此时引导学生从数轴图入手,从A≤ch≤Z,演变到ch>=A&&ch<=Z,再扩展到(ch>=A&&ch<=Z)||( ch>=a&&ch<=z),这样讲解会比较清晰。

同样的一个表达式,判断某一年是否是闰年,也经常难倒学生,条件是年份year能被400整除或year能被4整除但不能被100整除:首先确定大逻辑结构,是由两个条件的并集组成,一个是简单的year%400==0,另一个是复杂的两個要求相并,year%4==0&&year%100!=0,最后再由||运算符组合成完整的表达式year%400==0|| (year%4==0&&year%100!=0)。为了更清楚地表示逻辑关系,建议学生在书写时对那些复杂条件的完整表示加上(),帮助理解和记忆。

1.4 逻辑运算符的智能性

&&和||是两个具有智能性的运算符,有不少场合并不需要做完表达式中每一个运算。因为0&&×结果是0,1||×结果是1,×部分的结果不影响整个表达式的结果,所以根本就不需要做了,也就是当&&运算符的左侧是0,则右侧的表达式就不做,同理,||运算符的左侧是1,则右侧也不做,比如:

设有int i; 则表达式i=1,++i;++i||++i,i 的值为3,而不是4,因为此逗号表达式中的第三个只做||的左侧,右侧智能化地不做了。

1.5 数据范围的溢出

C++中每一种数据类型都是指定的长度,也就有明确的数据范围,如果忽视了这一点,程序的结果也常常会出现意想不到的错误,如编程求1~30的阶乘之和s:

Int  f=1,n,s=0;

for(n=1;n<=30;n++)

{ f=f*n;s=s+f;}

cout<

学生会习惯性地将变量都定义为int 型,程序没有任何语法和逻辑错误,可调试执行时,结果却显示一负数。这是由于数据溢出了有效范围而导致的,学生很少会意识到这个原因,这题只要将变量定义为float型就可以了。

1.6 ++、--的灵活运用

C++中,自增++、自减--的运用非常灵活,目标代码的执行效率也高,但学生在使用时很容易出错。教学中需要强调注意以下几点:

1)++、--只能作用于某个变量,不能是常量或表达式

例:++x   y--  都是合法表达式

++(x+y)    5--  都是不合法表达式

运算要能清楚地告知是哪个变量值增1或减1,同时强调结果还是要送回原本的那个变量,而常量是不能改变值的,表达式也不能明确新值的存放位置,所以都不能用于++、--。

2)注意++、--在变量中的应用位置是前置还是后置

后置i++、i--,运算时先去掉++、--进行运算,再对i自增或自减:前置++i、--i,运算时先对i自增或自减,然后去掉++、--再进行运算;

[比如:int i=4; y=i++; 比如:int i=4; y=++i; 执行流程:int i=4;, 执行流程:int i=4;, y=i;   //先运算 i=i+1;  //先自增 i=i+1;  //后自增 y=i;  //后运算 结果:  y=4  i=5 结果:i=5  y=5 ]

再如下更复杂的表达式:设 int  i=1;

[表达式(i++)+(i++)+(i++) 表达式结果为3,i的值为4 因为是后置,所以先执行i+i+i,即1+1+1=3,再i三次自增,i变成4 表达式 (++i)+(++i)+(++i) 表达式结果为12,i的值为4 因为是前置,所以先执行i三次自增,i变成4,再执行i+i+i,即4+4+4=12 表达式 (++i)+(i++)+(i++) 表达式结果为6,i的值为4 其中一个前置,所以i先自增一次,变成2,然后执行 2+2+2=6,两个后置,i再自增两次,变成4 ]

由此可见,当同一个表达式中出现前置后置运算符时,系统先执行前置运算符,把得出来的值作为表达式中所有该变量的值,计算出表达式的结果,最后执行后置运算符,得到对应的变量值,即在优先级上是:++i>i>i++,--也是如此。

3)++、--优先级高,结合方向为右结合

当表达式中同时出现多个运算符时,运算符优先级和结合性就显得尤为重要,这也是考核学生基本功的一个重点。++、--是单目运算符,优先级仅次于()等运算符,结合方向为自右向左。 比如:int  x=10,y=6;则表达式x+++y的值是16,执行完后x值为11,y的值为6,因为是右结合,相当于(x++)+y。

2 常见逻辑错误

2.1 输入/输出逻辑错误

对于初学者来说,往往对编程无从下手的一个原因是搞不清程序的入口和出口,比如,完成一个分段函数的编程:

学生定义了变量x、y,紧跟着会cin>>x>>y,盲目地认为变量都要从键盘输入数据,这样的问题看似简单,但实际教学中经常发生,所以在编程前,一定要对程序的功能和执行流程进行清晰的分析,结合数学逻辑和流程图,理清思路后再开始编写。

2.2 多分支结构中的常见错误

1)if-else的匹配

if-else的匹配原则是else总是与它前面最近的还没有配对的if进行配对。教学中,学生碰到if嵌套,特别是内嵌的if省略了else部分时,出错率特别高,这种情况下,培养学生根据匹配原则先画出流程图,画的同时注意花括号构成的复合语句,在流程图基础上再来执行各分支的功能,效果会比较好。

2)switch中break的灵活设计

Switch语句中一旦找到一个开关入口,程序会执行其case后的相应语句,并且会不加判断地执行下一个case语句,此时需要用break来中断,跳出switch。当开关中有多个连续的case入口执行相同的語句时,可以省略前面的所有case后的语句,只保留最后一个case后的语句。学生在编程时经常会省略出错,把不改省的语句省掉,可以省的不省,此时建议学生可以利用表格,逐一列举各分支,尤其是临界点的数据容易出错,列举清晰后再设计case各开关情况,最后再去掉可以省略的部分,不要直接一步到位。

2.3 循环结构中的常见错误

1)误用赋值=来表达逻辑判断==

比如:统计输入所有成绩的和,输入以0结束:

int  x;

cin>>x;

while(i=0) {…}

此循环一次也不执行,因为i直接赋成0,条件一开始就不成立。

2)缺少对循环条件的修改

比如:输出10个*:

int  i=1;

while(i<=10)  cout<<*;

无修改循环变量的语句,条件永远成立,导致产生死循环。

3)循环体模糊(花括号放错位置)

复合语句作为循环体时,需要用{}括出,如果没有,循环体仅为一条语句,

比如:输出10个*,排成一列:

for(i=0;i<=10;i++)

cout<<*;

cout<

此时输出的10个*是排成一行,而不是一列,循环体仅是第一个cout语句。而题目要求循环体包括两个动作:输出*+换行,所以需要把上面两个输出语句用{}构成复合语句,才是正确的输出。此情况在循环嵌套中学生经常出错。

4)忽略空语句

比如:要输出1~10

for(i=1;i<=10;i++); cout<

结果仅输出一个11,其原因就是循环体仅是一条空语句,真正的输出语句不是循环体。

以上是笔者在教学过程中的一些经验,遇到的问题远不止这些。C++程序设计出现的错误各种各样,主要是语法错误和逻辑错误。编程是一门严谨的课程,需要学习者有深厚的兴趣,认真负责的态度,反复实践和探索的精神,掌握扎实的基本功,多阅读多思考,多动手多实践,善于总结,尽量避免错误,编写高质量程序。

参考文献:

[1] 周正德,侯正昌 C++程序设计[M].3版,北京:电子工业出版社,2013.

猜你喜欢
语法错误
从美国学生的中文语法错误看中美文化差异
批判性思维在翻译实践中的运用
基于XML Schema XML文档验证算法
中学英语教学中学生常见错误的探索与分析
高中生英语写作语法错误分析
英语翻译常见错误及对策探析
汉语负迁移对英语写作的影响及启示
高中英语写作中的语法错误分析