资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,学习程序设计需要注意规律性的东西,同一个问题可以采用不同的解决方案,不同的解决方案具有不同的效率,2,第八部分 基本程序设计技术,3,本部分内容,基本程序设计技术,循环程序设计,解决问题的一些思路,数据的精度,程序调试,4,循环的常用机制,+,-,将,变量值,加,/,减,1,。,有前,/,后置写法:,+x x+,将,x,的值加,1,-x x-,将,x,的值减,1,建议不要写难以理解的语句,如,:,Sum=(+a)+(+a);,Printf(“%d%d%d”,a,a+,a+);,1.,增,/,减量运算,5,形式:,表达式,1,,,表达式,2,,,表达式,3,,,表达式,4,执行时先求值,表达式,1,,后求值,表达式,2,,以,表达式,n,的值作为整个逗号表达式的值。,优先级最低(低于赋值),从左向右结合。,主要用在,for,头部做变量初置和更新,用于做多个变量赋值或更新。例(求平方和):,for(,sum=0,n=1,;n=100;+n),sum=sum+n*n;,2.,逗号运算符,(a=3*5,a*4),a+5,20,x=(a=3,6*a),a=3 x=18,6,3.,实现二元运算符操作的赋值运算符,常见“,sum=sum+n*n;,”,形式的赋值。,C,语言为许多二元运算符提供了,(,复合)赋值符。算术运算符都有对应赋值运算符:,+=-=*=/=%=,x+=y;,相当于,x=x+(y);x*=y+z;,?,赋值运算符使用的例子(求平方和):,for(sum=0,n=1;n=100;n+),sum+=n*n,;,这些运算符的优先级与结合方式与普通赋值相同。,sum=sum+n*n,7,4.,循环中的几种变量,循环中常出现几类变量,注意这些有助于对循环的思考和分析。,1,),循环控制变量,(,循环变量,),:循环前设初值,循环中递增,/,递减,达到,/,超过界限时循环结束。它们控制循环的进行,/,结束。,for,中常有这类变量。,for(n=0;n=0;-n).,for(n=2;n 52;n+=4).,这种循环是,固定次数,的循环。,8,2,),累积变量,:循环中常用,+=,或*,=,等更新。初值常用运算的单位元(加用,0,;乘用,1,为初值)。循环结束时变量终值被作为循环计算结果。,sum+=t;,3,),递推变量:,对变量,x1,、,x2,、,x3,,循环体可能有序列:,x1=x2;,x2=x3;,x3=.x1.x2.;,9,写循环时要考虑和解决问题,:,循环涉及到哪些变量,需引进哪些临时性变量?,循环如何开始?循环开始前给变量什么初值?循环中变量的值如何改变?,什么情况下继续(或终止)循环?,循环终止后如何得到所需结果?,用哪种结构实现循环,等等。,工作方式,:分析问题,发掘线索,最终完成程序。,10,只有在程序设计实践中才能学好程序设计:,1,)模仿好的范例;,2,)自己动手动脑,反复实践从问题出发做出程序的整个过程;,3,)多想想自己的程序做得怎么样,能不能做得更好。,只有学会怎样,做好,小程序,才能,做出,大程序,11,学习程序设计需要注意规律性的东西。,三种流程模式是重要总结。,本节主要内容:,循环程序设计进阶,顺序模式最简单,选择模式:要确定判断条件及不同情况下的动作,难点是实现重复执行的循环。,8.1,循环程序设计,12,13,8.1,循环程序设计,写循环首先要发现循环。,重复动作的常见实例:,一批类似数据做同样加工处理,累积一批可按规律算出的数据(累加等),反复从一个结果算出下一结果(递推),若重复次数,很多,,就应该考虑用循环,如果重复次数,无法确定,,就必须用循环描述,14,例,1,:求,13,到,315,所有数的平方根之和。,可以一个个地加,但更方便的方法是写循环。,需要一个变量保存部分和,逐步把各平方根加上去;,需要一个变量保存变动轨迹,从初值开始每次修改。,for(sum=0.0,n=13;n=13;-n),sum+=sqrt(n);,典型,for,循环。假定已有总和变量,sum,和循环变量,n,:,向上循环,向下循环,循环变量,累积变量,基本的循环方式有两种:向上循环和向下循环,15,while,语句重写上例,double sum;,int n;,Sum=0.0;n=13;,while(n=315),sum+=sqrt(n);,+n;,16,注意,:,因为浮点计算存在误差,,一般不用浮点数控制循环,,尤其是增量为小数或包含小数时。,例:求从,0,到,100,每隔,0.2,的数的平方根之和:,double sum,x,;,for(sum=0.0,x=0.2;x=100.0;x+=0.2),sum+=sqrt(x);,由于浮点计算误差,不能保证循环,500,次。,应写:,int n,;double sum;,for(sum=0.0,n=1,;n=500;+n),sum+=sqrt(0.2*n);,17,例,2,:,打印出,1,到,200,间的完全平方数。,方法一,:逐个检查,遇平方数打印。循环框架:,for(n=1;n=200;n+),if(,n,是完全平方数,),打印,n;,n,是完全平方数判断,:,m,可以从,1,开始,递增,,直至,m*m,大于,n,:,for(m=1;m*m=n;m+),if(m*m=n),打印,n;,18,完整程序:,#include,int main(),int m,n;,for(n=1;n=200;n+),for(m=1;m*m=n;m+),if(m*m=n)printf(%d,n);,printf(n);,return 0;,内层循环结束的两种情况:,1,,找到,m,使,m*m=n,(,n,是完全平方数),2,,试探了所有可能,但都不成功(,n,不是,),共循环了多少次?,19,具有累计循环次数功能的完整程序:,#include,int main(),int m,n,count=0;,for(n=1;n=200;n+),for(m=1;m*m=n;m+),count+;,if(m*m=n)printf(%d,n);,printf(“%dn“,count);,return 0;,共循环了,1799,次,20,方法二,:需要,打印的一定是从,1,开始连续几个整数的平方,可从,1,开始打印到平方大于,200,为止。,for(n=1;n*n=200;+n),printf(%d,n*n);/*,注意打印什么,*,/,方法三,:,还可以考虑利用递推公式:,方法一产生所有备选数据(,1,到,200,的整数),检查排除不合格的。,生成与检查,是解决问题的常用方法。,方法二是针对具体问题的特定方法。,21,#include,int main(),int termn,n;,for(n=1,termn=1;termn=200;n+),printf(%4d,termn);,termn+=2*n+1;,return 0;,利用递推公式求平方数程序,:,方法与启发,方法,1,产生所有备选数据(,1,到,200,之间的整数),检查排除不合格的。,启发,生成与检查是解决问题的常用方法。,方法,2,换个角度思考问题,是针对具体问题的特定方法。,方法,3,递推,用数学模型解决问题,启发,同一个问题,可以有不同的解决方法,应尝试切换思考角度和寻找更有效的方法,不同的方法有不同的效率,22,例,3,:判断整数是否为素数,int isprime(int),,返回,0/1,值,n,是素数当且仅当,n,没有真因子,若,n%m=0,,则,m,是,n,的因子,若,n%m=0,,且,m n,23,素数判断函数定义,int isprime(int n),/*n,是否素数*,/,int m=2;,for(;,m*m=n,;m+),if(,n%m,=0),return 0;,/,只要发现能被一个数整除,就返回,return 1,;,/*,没有因子,是素数*,/,24,分析,从循环中退出途径,只要发现一个因子,就可做结论,,return 0,;,没有发现因子,循环条件不符合。,函数存在的问题,对,1,给出,“,是素数,”,;,负数也会给出不合理结果。,应该在循环前处理,特殊情况,if(n=1),return 0;,负数问题?,如果需要可以另外考虑处理。,25,26,例,4,,艰难旅程(浮点误差)。乌龟要去环球。第,1,秒爬,1,米,第,2,秒爬,1/2,米,第,3,秒爬,1/3,米,第,4,秒爬,1/4,米,,。问一小时能爬出多远?爬,20,米需多少秒?,一小时能爬多远算法,:,1.d(,距离,实数,);,s(,时间,整数,);,2.d=0.0;s=1;,3.d=d+1/(,实数,)s;s=s+1;,4.,如果,s=3600,转,3;,5.,否则,输出,d;,爬,20m,需多少秒算法,:,d(,距离,实数,);,s(,时间,整数,);,d=0.0,s=1;,d=d+1/(,实数,)s;s=s+1;,如果,d20.0,转,3;,否则,输出,s-1;,根据数学,乌龟能完成环球,可以爬得任意远。,这里想比较,float,和,double,的计算误差情况,。,s-1?,27,n,秒能爬,x,米的函数,float distfun(long n),float distfun(long n),long i;,float x=0.0;,for(i=1;i=n;+i),x+=1/(float)i;,return x;,例,4,,艰难旅程(浮点误差)。乌龟要去环球。第,1,秒爬,1,米,第,2,秒爬,1/2,米,第,3,秒爬,1/3,米,第,4,秒爬,1/4,米,,。问一小时能爬出多远?爬,20,米需多少秒?,28,例,4,,艰难旅程(浮点误差)。乌龟要去环球。第,1,秒爬,1,米,第,2,秒爬,1/2,米,第,3,秒爬,1/3,米,第,4,秒爬,1/4,米,,。问一小时能爬出多远?爬,20,米需多少秒?,20,米需要多少时间。写出下面函数:,long,scndsfun(float d),/*d,为爬行距离*,/,long i;,float x=0.0;,for(i=1;x d;+i),x+=1/,(float),i;,return,i-1,;,d=20,29,写下面语句,执行时总也不输出:,printf(%lds,%fmn,scndsfun(20.),20.);,修改为如下语句,:,for(x=10.0;x=20.0;x+=1.0),printf(%lds,%fmn,scndsfun(x),x);,原因?,程序输出:,12367s,10.000000m,33617s,11.000000m,91328s,12.000000m,248695s,13.000000m,662167s,14.000000m,1673859s,15.000000m,而后又没反应了。,30,void test_float(),long i;,float sum=0.0,sum0=-1.0;,for(i=1;,sum!=sum0,;+i),sum0=sum,;,sum+=1/(float)i;,printf(float:%ld terms at%fn,i-1,sum);,对乌龟活动的模拟受到数据表示精度和范围的限制。,考虑如下的,测试函数,:,程序很快就输出了一行:,float:2097152 terms at 15.403683,判断爬的距离不再发生变化。,Float,精度限制,差值无法测试到,记住上一次的值,解决方案:改用双精度浮点数,如果把测试程序改用,double,类型变量保存距离,则可以得出如下结果(,15m,以后),1835421s,15m,2989191s,16m,13562027s,17m,36865412s,18m,111210581s,19m,272400600s,20m,采用,float,表示所爬的里程,,d,为目标里程,long scndsfun(float d),long i;,/,秒数,double x=0.0;,/,已经爬里程,for(i=1;x=1E-6),x1=x2;,x2=(2.0*x1+x/(x1*x1)/3.0;,return x2;,程序的一个缺点是同一表达式写了两次。,调用语句,:,y=cbrt(200);,或,x=200;y=cbrt(x);,36,do-while,没有,for,和,while,语句用得多。,用,do-while,结构重写求立方根,函数:,double cbrt(double x),double x1,x2=x;,if(x=0.0)return 0.0;,/*,处理特殊情况*,/,do,x1=x2;,x2=(2.0*x1+x/(x1*x1)/3.0;,while(fabs(x2-x1)/x1)=1E-6);,return x2;,37,循环中的递推变量:,对变量,x1,、,x2,、,x3,,循环体可能有序列:,x1=x2;,x2=x3;,x3=.x1.x2.;,例如上面,cbrt,里的变量,x1,和,x2,。,38,例,6,:定义函数,利用公式,求 近似值。设为,double dsin(double x),。,sum=0.0;,对,n,为0计算,t;,while(,需要继续),sum=sum+t;,计算下一个,t;,循环结束条件:,例如用项绝对值小于 。,方法:循环累加,,n,趋向无穷的过程中,项值趋于,0,,而,累加值趋向函数值,。保存累加和的变量,sum,,循环中求出的项值用,t,保存。,39,问题:,t,的值如何计算?,第一个,t,就是,x;,分析可以发现项值的递推公式:,double dsin(double x),double s=0.0,t=x;,int n=0;,/*n=0,t=x*/,while(t=1E-6|t=-1E-6),s+=t;,n=n+1;,t=-t*x*x/(2*n)/(2*n+1),;,return s;,Sin(x)=x-x,3,/3!+x,5,/5!-x,7,/7!+.,8.2,循环中的重要问题,40,n,m,isprime(m),isprime(n-m),验证结果,6,3,1,1,OK,5,8,3,1,1,OK,5,10,3,1,1,OK,5,1,1,OK,7,12,3,1,0,NO,5,1,1,OK,7,n,m,isprime(m),isprime(n-m),验证结果,14,3,1,1,OK,5,1,0,7,1,1,OK,9,16,3,1,1,OK,5,1,0,OK,7,1,0,NO,9,.,存在多余判断,for(,n,=6;n=200;n+=2),for(,m=3,;m=,n/2,;m+=2),if(,isprime(m),&,isprime(n-m),printf(%d=%d+%dn,n,m,n-m);,如何从循环中退出?,例:对,6200,的各偶数验证哥德巴赫猜想(一个偶数可以拆成两个素数),可以利用前面写的素数判断函数,isprime,41,用,return,退出?,前面写,isprime,时借助,return,退出了函数,效果上等于结束了循环。,但是在这个程序里,程序判断完某个偶数,n,已经由某个素数对组成以后,还需要对下一个偶数进行相同判断。,此时并不能用,return,结束函数的执行,怎么办,?,42,解决方案,1,增加对循环的控制,把发现素数分解作为条件加入。,引入整型变量,found,,值,0,表示未发现素数对。发现时将,found,赋,1,。内循环开始时,found,置,0,。应修改内层循环条件。,修改后循环是,for(n=6;n=200;n+=2),for(,found=0,m=3;m=n/2&,!found,;m+=2),if(isprime(m)&isprime(n-m),printf(%d=%d+%dn,n,m,n-m);,found=1;,非常常用的机制,设置变量用于表示某一项任务的完成状态或某个对象的状态,Found,NOT,Found,43,执行过程示意,n,m,found,isprime(m),isprime(n-m),found,6,3,0,1,1,1,5,1,8,3,0,1,1,1,5,1,10,3,0,1,1,1,5,12,3,0,1,0,0,5,0,1,1,1,7,1,14,3,0,1,1,1,5,1,16,3,0,1,1,1,5,1,18,Found,NOT,Found,44,解决方案,2,:用,break,语句,语法,break;,功能及说明,break,只能用在循环语句及,switch,语句里。,用在循环语句里,从,break,所处的循环层次的复合语句内跳出(跳到外层),程序中被跳出的循环语句体之后的第一条语句处继续执行。,用在,switch,语句的语句体中时,从该语句体中跳出,执行跳到,switch,的语句体之后继续执行。,45,例,用,break,实现跳出,for(n=6;n=200;n+=2),for(m=3;m=n/2;m+=2),if(isprime(m)&isprime(n-m),printf(%d=%d+%dn,n,m,n-m);,break;,printf(,“,finished,”,);,问题:执行完,break,以后执行哪条语句或计算?,expr2,循环体,真,(,非,0),for,计算,expr1,计算,expr3,假,(0),46,执行过程示意,n,m,isprime(m),isprime(n-m),验证结果,6,3,1,1,TRUE,8,3,1,1,TRUE,10,3,1,1,TRUE,12,3,1,0,FALSE,5,1,1,TRUE,14,3,1,1,TRUE,16,3,1,1,TRUE,18,47,利用,break,重写前面求立方根的函数,double cbrt(double x),double x1,x2=x;,if(x=0.0),return 0.0;,while(1),x1=x2;,x2=(2.0*x1+x/(x1*x1)/3.0;,if(fabs(x2-x1)/x1)1E-6),break;,return x2;,本例中,因循环结束后函数不需要再做别的事情,因此也可以在,break,处直接写,return x2,。,解决了同一表达式计算写了两段相类似的计算代码的问题,48,“,常量,”,是标识符形式,在程序里代表同一常数的东西。,用,enum,定义(,枚举,)可方便地定义一组符号常量:,enum NUM=10,LEN=20;,枚举常量的作用?用于循环示例,例:,#include,enum,START,=0,END,=300,STEP,=20;,int main(void),int c;,for(c=,START,;c=,END,;c+=,STEP,),printf(C=%d,F=%fn,c,c*5.0/9.0+32.0);,return 0;,/*,这样的程序更容易修改,*,/,另一种形式:,define START 0,define END 300,#define STEP 20,49,符号形式表示能帮人理解程序意义。,程序里两个,0,可能代表不同意义,数值形式没有任何区分。采用符号常量可提高可读性。,将所需常数定义为符号常量,在程序中统一使用是很好的方法。,使程序更容易修改(修改时不必浏览整个程序)。对大程序的作用更明显。,课本第五章继续介绍其他常量定义方式。,enum,的详细讨论在第九章,目前作为一种定义符号整型常量的机制。,说明:,50,8.3,程序设计举例,51,8.3,程序设计实例,例,1,:简单交互式计算器。,假定它可以输入并计算:,128+365,254+1438,10313+524,输入一行算一个结果。直至用户要求结束。,基本思想:,while(,还有输入,),取得数据,计算并输出,用,scanf,读数据,用文件结束或非数字表示输入结束。,52,#include,int main(),int left,right;,printf(Small calculator.n);,printf(Any no-digit character to stop.n);,while(scanf(%d,&left)=1),if(getchar()!=+|scanf(%d,&right)!=1),printf(Fmt error.Enter:nnn+mmmn);,while(getchar()!=n);,/,丢掉本行剩余字符,;,continue;,printf(%d+%d=%dn,left,right,left+right);,return 0;,53,例,2,:,单词计算问题,英文正文文件,可看成是,字符序列,,,空白字符,把序列分隔为一个个,“,单词,”,。要求写程序统计文件中的,单词个数,。,空白字符包括:空格,、制表符,t,、换行符,n,54,问题分析,需要一个计数器,遇到一个词将计数器加一。,考虑用函数,getchar,读字符。程序主要部分的框架:,while(,文件未结束,),遇到一个词,时计数器加一,;,打印统计信息,;,用,getchar,输入,很容易判断文件结束。,问题是如何确定“遇到了一个词”。,55,初始思路:,#include,int main(),int c=,count=0;,while(c!=EOF),while(c=getchar()!=EOF&,(c=|c=t|c=n),;,if(c=EOF),break;,+count;,while(c=getchar()!=EOF&,c!=&c!=t&c!=n),;,printf(word count:%dn,count);,return 0;,读完新词,略过空白字符,出现新词,56,如何判断一个单词,?,若读的字符是单词首字符,则计数器加一。,读入字符过程中需要区分是否空白。,问题:,非空白字符未必是词的开始,是否新词要看前一字符是否空白。,可见:,不能孤立地处理情况,要参考前面情况。,必须做情况记录,以便后面参考。,57,前后关系,分两种情况:,1,)读到空白,随后遇非空白字符就是新词;,2,)读到非空白,随后不会遇到新词。,可看作处理过程的不同状态,,两种状态,:,1,)读在词外(遇到非空白是新词);,2,),读在词内。,在读入字符的过程中读入状态也不断转换。,典型,可以用有限状态转换系统(,自动机,)描述。,58,分析前后关系,OUT,IN,读到空格字符,状态不变,读到非空格字符,转入词内状态,读到空格字符,转入词外状态,读到非空格字符,状态不变,两种读入状态:,OUT:,当前位置在词外,IN:,当前位置在词内,在从,OUT,转换到,IN,时,遇到新词,计数。,状态图转换图,59,状态的表示,60,可以用一个变量来记录状态,设,state,令变量取值为,IN,和,OUT,;,只要求这两个值不同;,不会同时处在两种状态;,可以将,IN,OUT,定义成枚举值。,if(c=|c=t|c=n),if(state=IN)state=OUT;,else,/*state,为,OUT*/,state=OUT;,else,/*,不是空格*,/,if(state=IN)state=IN;,else,/*state,为,OUT*/,state=IN;,+count;,/*,许多地方可以简化*,/,61,当前读状态变换的表示,当前读到一个字符,c,时,处理可描述为:,#include,enum IN=1,OUT=0;,int main(void),int c,count=0,state=OUT;,while(c=getchar()!=EOF),if(c=|c=t|c=n),/,如果是空白字符,state=OUT;,/,在词外,else if(state=OUT),/,如果碰到非空白字符,/,且读状态为在词外,则说明碰到新词,state=IN;,/,将状态修改为词内,+count;,/,记数,printf(word count:%dn,count);,return 0;,62,例,2,:,单词计算问题,英文正文文件可看成是字符序列,空白字符(空格,、制表符,t,、换行符,n,)把序列分隔为一个个,“,单词,”,。要求写程序统计文件中的单词个数。,思考,中文的词可以用这种办法找出来吗?,拓展学习,学习中文分词知识及算法,63,8.4,程序测试和排错,64,分析问题,编制程序,编译,连接,调试运行,完成,调试中发现程序编写有错误,修改源程序,编译时发现程序有语法错误,修改源程序,连接时发现程序有错误,修改源程序,调试运行时发现问题分析设计有错误,重新分析问题,程序开发过程,65,8.4,程序的调试与排错,写好一个程序后,需要:,通过加工(编译和连接)产生可执行程序,运行它,提供数据进行试验,确认它确实满足要求,试验中常常会发现错误,需要设法排除,测试(,testing,):在完成一个程序或一部分程序,通过编译后试验性运行,仔细检查运行效果,设法确认该程序确实完成了所期望的工作。反过来说:测试就是设法用一些特别选出的数据去挖掘出程序里的错误,排错(,debugging,):在发现程序有错时,设法确认产生错误的根源,修改程序,排除这些错误的工作过程,66,测试的基本方法,测试时考虑的基本问题是提供什么样的数据,才可能最大限度地把程序中的缺陷和错误挖出来。,有两类确定测试数据的基本方式:,根据程序结构确定测试数据。这相当于把程序打开,根据其内部结构考虑如何检查它,设法发现其中的问题。这种方式称为,白箱测试,根据程序所解决的问题去确定测试过程和数据,不考虑程序内部如何解决问题。这相当于把程序看作解决问题的“黑箱”,因此称为,黑箱测试,67,白箱测试,考察程序内部结构及由此产生的执行流,选择数据使程序在试验运行中能通过,“,所有,”,可能出现的执行流程,复合结构只有一条执行流,“,if(,条件,),语句,1,else,语句,2,”,有两条可能执行流:条件成立时执行,语句,1,;不成立时执行,语句,2,。应设法提供测试数据,检验程序在这两种情况下都能正确工作,从本质上说“,while(,条件,),循环体,”可能产生无穷多条执行流:循环体不执行,执行,1,次,执行,2,次,,。无法穷尽检查。,常用方法是选择测试数据,检查循环的一些典型情况,包括循环体执行,0,次、,1,次、,2,次的情况,以及一些其他情况,其他结构可类似分析。要考虑程序中结构嵌套产生的组合流程,68,黑箱测试,考虑的不是程序内部结构(可能是别人的程序,结构不可知;即使可知也可能极其复杂,无法理解其所有的执行流),只考虑程序所解决问题的情况,例如,如果某函数只有一个,int,参数,可检查参数为,0,时结果是否正确,参数为,1,和,-1,时,,2,和,-2,怎么样等等,如果对函数有所了解,还应考查已知结果的明显情况。例如对求立方根函数,应先检查参数为,0,、,1,、,-1,、,8,、,27,等的情况,因为知道应该得到什么结果。确认这些情况都能正确工作后,再去检查一些一般性情况,69,测试与驱动程序,函数不是完整程序,怎样检查是否正确?,必须写临时主函数。测试用主函数(及辅助功能)称为,驱动程序,或者,测试台,。下面以测试立方根函数为例。,最容易想到的测试台可能是:,#include,#include,double cbrt(double x),int main(),printf(%fn,cbrt(1.0);,可检查发现语法错误等。,一个数据难以确认正确性,换数据需要改程序,麻烦。,让程序帮助多做些事情。例如:,int main(),double x,y;,while(scanf(%lf,&x)=1),printf(cbrt(%f)=%fn,x,cbrt(x);,return 0;,应该先试特殊情况和容易判断正误的情况:,0,cbrt(0.000000)=0.000000,1,cbrt(1.000000)=1.000000,27,cbrt(27.000000)=3.000000,1000,cbrt(1000.000000)=10.000000,100,cbrt(100.000000)=4.641589,71,重复录入数据测试,可能觉得反复试验和判断正误也很麻烦。可以写:,int main(),double x,y;,for(x=-10.0;x 1E-10),printf(,E,rror:x=%f,cbrt(x)=%fn,x,y);,printf(Test finished.n);,return 0;,这里让计算机检查一系列计算。如果没有出错,程序只产生一行信息,报告程序完成。,72,排除程序中的错误,语法错误比较容易排错,排错语义错误(逻辑错误)时,要设法确定错误根源,确定程序在什么执行流中产生错误,主要手段是选择适当的测试数据,测试程序、排除程序错误的最重要工具就是,眼睛和头脑,程序的良好格式极其重要,排错常见方法,设法确认程序对最基本的情况能正常工作,解决了基本情况后再考虑更复杂的情况,设法找出出错的规律性,检查出错时数据经过的执行流,逐步缩小可疑范围,在程序中加入输出语句,检查重要变量的值的变化情况,利用,IDE,的排错功能,本部分应掌握的内容,程序设计基本过程,问题分析方法,从算法到程序,程序的功能与性能要求,程序的错误处理和排错方法,程序的调试方法,(黑箱、白箱)测试的概念,76,Q,A,!,
展开阅读全文