摘要:在程序设计教学中,程序一旦挂起,学生便感觉无从下手。本文分析了程序挂起的常见错误及相应的解决办法,以提高学习者的编程效率。
关键词:C程序设计;程序挂起;解决策略
中图分类号:文献标识码:
0引言
“C语言程序设计”是计算机专业的一门重要的专业基础课,一般院校都把它放在大一第一学期学习,由于学生在中学阶段几乎没有接触过程序设计课程,再加上C语言涉及数据类型多、基本概念多、运算符丰富、运算规则繁多,学生在上机实验时经常遇到编辑的程序调试运行时出错,甚至挂起,不再运行。鉴于此,本文在讨论说明C语言程序常见的挂起错误基础上,结合实例给出各种挂起错误的解决策略。
1程序的挂起错误及解决策略
1.1程序中有死循环
死循环是程序进行循环判断的条件永远为真,或使程序退出循环的判断条件永远为假造成的,这样机器将无数次地执行同一段程序代码,出现死循环,造成程序的挂起。例如下面一段程序:
for(a=0;a<10;++a)
{
for(b=0;b<10;++a)
{array[a][b]=0;
}
}
在本段程序中,第二个循环本应在变量b增加到10后结束,但在第二个循环的第三部分却增加变量a的值,这样变量b的值始终小于10,因此第二个for循环会一直进行下去。
再如:voidmain()
{inta=7;
while(a<10)
{==a;
a/=2;
}
}
尽管每次循环中变量a的值要增加,但与此同事它又被减小了一半,因此变量a的值永远不会增加到10,While循环的条件始终为真,循环也永远不会结束。
解决策略:程序出现死循环,一种解决策略是重新阅读程序,注意循环条件中循环控制变量是否使循环条件始终为真;另一种解决策略是调试程序时可以在每个循环体内增加输出语句,观察变量值的变化,从而找出错误。
1.2程序运行时间比期望的时间长
在有些情况下,程序并没有被完全“锁死”,但它的运行时间比期望时间长。
intfib(inti)
{if(i<3)
return1;
else
returnfib(i-1)+fib(i-2);
}
表面看,上述程序是定义斐波那契数的一段程序代码,程序简洁短小,看上去执行时间不会太长。但事实上计算时第一步是2个子问题,第二步是4个子问题,第三步是8个子问题,如此继续,结果是子问题的数目以步数为指数不断增长。要计算第40个斐波那契数的过程中,函数fib()将被调用2亿多次。
解决策略:在编程之初,仔细设计解决问题的算法,尽量避免出现假死锁现象。
1.3程序在等待正确的输入
有时程序停止运行是因为在等待正确的输入信息。程序等待用户输入信息,而程序没有输出相应的提示信息,用户不知要输入信息,或者输入的信息不完全正确,程序看上去好像锁住了。
main()
{
FILE*in=fopen("num.dat","r");
inttotal=0,n;
while(fscanf(in,"%d",&n)!=EOF)
{total+=n;}
printf("thetotalis%dn",total);
fclose(in);
}
如果文件num.dat中只包含整数,程序能正常运行,如果文件中包含整数以外的数据,当程序遇到一个不为整数的值时,它不会读入这个值,而是返回一个错误代码,而此时程序并未读到文件尾,与EOF比较的值为假,这样循环继续进行,n取某个未定义的值,程序再次读文件,再次遇到刚才的错误数据,这样程序就会无休止地执行下去。
解决策略:如果遇到程序中需要输入数据,就在相应的输入函数前,加入相应的提示信息;如果遇到从文件中读取数据的,尽量先去测试读入的数据是否正确。
还有许多其它原因会使程序挂起,但总的来说,它们都属于上述三种类型中的一种。如果实在不能确定程序挂起的原因也可先检查程序的总体结构,然后按照程序的执行顺序依次查看程序的各个部分能否正确运行。如果各组成部分都能正确运行,再检查各部分是否带回正确的数值。
#include"stdio.h"
#include"stdlib.h"
intA(),B(int),C(int,int);
/*函数A(),B(int),C(int,int)的定义均在其它模块*/
main()
{
intv1,v2,v3;
v1=A();
v2=B(v1);
v3=C(v1,v2);
printf("theresultis%dn",v3);
return0;
}
在调试程序时,先检查函数A()是否把控制权返回给了主函数,可以在调用函数A()的语句后面加上exit()命令,或者用注释符号把对函数B(),C()的调用括起来,然后重新编译并运行程序,如果程序运行并退出,可以判断是程序的其它部分挂起。用同样的方法测试程序的每一部分,直到发现使程序挂起的部分;如果使程序挂起的函数本身正确,就需要检查函数接受的所有值,像上例中在调用A()函数后,输出变量v1的值,以确认v1是否在函数B()所能接受的值的范围内。
2结束语
程序的调试应该是一个有序的过程,需要很多的技巧,但只要掌握调试技巧,最终总能使程序正常运行,得到正确的结果。
参考文献:
[1]谭浩强.C语言程序设计.北京:清华大学出版社.2005
[2]张芳妮,吕波.C语言编程常见问题.北京:清华大学出版社.2001
[3]何钦铭.C语言程序设计.北京:高等教育出版社.2007
搜论文知识网致力于为需要刊登论文的人士提供相关服务,提供迅速快捷的论文发表、写作指导等服务。具体发表流程为:客户咨询→确定合作,客户支付定金→文章发送并发表→客户接收录用通知,支付余款→杂志出版并寄送客户→客户确认收到。鸣网系学术网站,对所投稿件无稿酬支付,谢绝非学术类稿件的投递!