C语言--循环程序设计课件

上传人:2127513****773577... 文档编号:242749909 上传时间:2024-09-02 格式:PPTX 页数:83 大小:4.07MB
返回 下载 相关 举报
C语言--循环程序设计课件_第1页
第1页 / 共83页
C语言--循环程序设计课件_第2页
第2页 / 共83页
C语言--循环程序设计课件_第3页
第3页 / 共83页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,#,C,语言程序设计,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,C,语言程序设计,第,5,章 循环程序设计,管理学院,电子商务系,第5章 循环程序设计管理学院,2,第,5,章 循环程序设计,5.1,概述,5.2 while,和,do while,循环,5.3,for,循环,5.4,循环的嵌套,5.5,循环的控制,5.6,应用举例,5.7,程序调试,2第5章 循环程序设计5.1 概述,3,第,5,章 循环程序设计,3第5章 循环程序设计,4,第,5,章 循环程序设计,4第5章 循环程序设计,5,第,5,章 循环程序设计,5第5章 循环程序设计,6,第,5,章 循环程序设计,6第5章 循环程序设计,7,第,5,章 循环程序设计,7第5章 循环程序设计,8,第,5,章 循环程序设计,8第5章 循环程序设计,9,第,5,章 循环程序设计,9第5章 循环程序设计,10,第,5,章 循环程序设计,水温度的,量变,引起水的物理形态的,质变,:,水在标淮大气压下加温到,100,摄氏度变成汽,降温到,0,摄氏度变成冰。,10第5章 循环程序设计 水温度的量变引起水的物理形态,11,第,5,章 循环程序设计,物体从地球上抛射速度的,量变,引起运动形式的,质变,:,小于,7911m/s,时,在地面上沿弹道飞行;,达到,7911m/s,时,绕地球作椭园轨道运动,成为地球的卫星;,增大到,11189m/s,时,脱离地球成为绕太阳运行的一个行星;,速度达到,16662m/s,时,脱离太阳系成为迢游太空的一个天体。,11第5章 循环程序设计 物体从地球上抛射速度的量变,12,第,5,章 循环程序设计,计算机程序由若干语句顺序组成:,顺序结构的程序只能按照语句的先后顺序从前向后依次执行,分支结构程序虽然允许在执行了某个判断后跳过某些语句执行后面的语句,但也只能按语句的前后次序执行,有时,需要在程序中重复执行某个语句或语句块,就需要循环结构,12第5章 循环程序设计 计算机程序由若干语句顺序组成,13,第,5,章 循环程序设计,生活中的例子:,击鼓传花:大家坐成一个圈,鼓声响起的时候将花束顺序交到下一个人的手里,依次向下传递,当鼓声突然中断时停止传花,花束落在谁的手里便成为输家,4100,米接力赛跑:第,1,个人跑完,100,米后将接力棒传给第,2,个人,第,2,个人再跑,100,米,然后是第,3,个人,直到第,4,个人跑完最后一个,100,米,共同点:,都要完成相同的任务:,量变,的重复内容,都有结束条件:发生,质变,的界限,13第5章 循环程序设计生活中的例子:,14,第,5,章 循环程序设计,1.,计算,sum=1+2+3+100,14第5章 循环程序设计1. 计算sum=1+2+3+,15,第,5,章 循环程序设计,1.,计算,sum=1+2+3+100,循环体,循环控制条件,循环控制变量,循环的初始化,#include ,void main( ),int,i=1, sum=0 ;,while (,i = 100,),sum = sum + i ;,i+ ;,printf ( “Sum = %d n”, sum ) ;,15第5章 循环程序设计1. 计算sum=1+2+3+,16,第,5,章 循环程序设计,2.,计算,sum=2+4+6+100,循环体,循环控制条件,循环控制变量,循环的初始化,#include ,void main( ),int,i=2, sum=0 ;,while (,i = 100,),sum = sum + i ;,i+=2 ;,printf ( “Sum = %d n”, sum ) ;,16第5章 循环程序设计2. 计算sum=2+4+6+,17,5.2 while,和,do while,循环,格式:,while(,表达式,),语句,do,语句,while(,表达式,) ;,说明:,括号中的“表达式”是循环控制条件,但不限于关系表达式和逻辑表达式,“语句”是单一语句,但可以是复合语句,如果,while,语句的括号后面只有“;”,则循环体为空。如果,do-while,语句的括号后面(分号前面)还有其他符号,则出现语法错误,175.2 while和do while循环格式:,18,5.2 while,和,do while,循环,while,语句的执行过程,while,语句的执行过程是:,计算“表达式”的值;,若“表达式”的值不时,0,,为“真”,继续执行;否则,结束循环,转到,while,语句后面的语句继续执行程序;,执行“语句”部分,即执行循环体;,返回继续执行。,185.2 while和do while循环while语句的,19,5.2 while,和,do while,循环,do-while,语句的执行过程,195.2 while和do while循环do-while,20,5.2 while,和,do while,循环,循环语句的特点:,while,循环是“先判断后循环”,如果开始时循环条件不满足,循环体就一次也不执行,do-while,循环是“先循环后判断”,即使第一次判断的结果为“假”,循环体也已经执行了一次,但不论哪种循环,循环体中必须包含能够使循环条件变为“假”的运算,205.2 while和do while循环循环语句的特点:,21,5.2 while,和,do while,循环,循环的变化:,sum=1+2+3+100,#include ,void main( ),int i=1, sum=0 ;,while ( i= 100 ),sum = sum + i+ ;,printf ( “Sum = %d n”, sum ) ;,#include ,void main( ),int i=1, sum=0 ;,do,sum = sum + i ;,i+;,while ( i= 100 );,printf ( “Sum = %d n”, sum ) ;,215.2 while和do while循环循环的变化:su,22,5.2 while,和,do while,循环,几何级数,2,x,的力量:,一页,普通,纸的厚度约为0.1mm,(,1mm=10,-3,m,),珠穆朗玛,峰的高度为,8,844.43,m,编写程序计算一下,普通纸对折多少次可以超过,珠穆朗玛,峰的高度?,225.2 while和do while循环几何级数2x的力,23,5.2 while,和,do while,循环,#include ,void main( ),double paper_height, mountain_height;,int number;,paper_height=0.0001;,mountain_height=8844.43;,number=0;,while ( paper_height mountain_height ),paper_height *= 2;,number += 1;,printf(,对折第,%d,次后的高度是,%g,。,n, number, paper_height);,235.2 while和do while循环#include,24,5.2 while,和,do while,循环,几何级数,2,x,的力量:,中国战国时期的赵国辩士公孙龙有一个著名命题:“一尺之棰,日取其半,万世不竭”。这是说,一尺长,(,0.,33,m,),的一根木棰,每天取它一半,世世代代也取不完。,这一命题,包含了某些朴素辩证法的思想,它猜测到了,物质,的无限可分性。但严格说来它并不科学。因为就某一,具体物质形态,来说,它在被分割到一定程度时就不再是这一事物了。,最大的原子是铯,半径为,225pm,(,1pm=10,-12,m,),编写程序计算一下,这只木棰日取一半,取多少天可以比铯原子的半径小?,245.2 while和do while循环几何级数2x的力,25,5.2 while,和,do while,循环,255.2 while和do while循环,26,5.2 while,和,do while,循环,#include ,void main( ),double hammer_height, cesium_radius;,int number;,hammer_height=0.33;,cesium_radius=225e-12;,number=0;,while ( cesium_radius hammer_height ),hammer_height /= 2;,number += 1;,printf(,第,%d,天后的高度是,%g,。,n, number, hammer_height);,265.2 while和do while循环#include,27,5.2 while,和,do while,循环,恩格斯说:“纯粹的量的分割是有一个极限的,到了这个极限它就转化为质的差别;物体纯粹是由分子构成的,但它是本质上不同于分子的东西,正如分子又不同于原子一样”。,取到第,3,天,剩下的部分,4.125cm,长,这时它还能做为“木棰”吗?取到第,31,天,它剩下的部分已经没有分子那么大了,这时它不仅不再能成为“木棰”,连木头的物理分子都已经不是了。当然,它还可以被取下去,但随着次数的变化,它必然会发生不同层次的,质变,。,严格说来,应该是“一尺之,棰,,日取其半,三日可竭”;作为,木质,应该是“一只之棰,日取其半,一月乃竭”;作为,物质,,应该是“一尺之棰,日取其半,万世不蝎”。这就是说,不同层次的,量变,,总是引起与之相应的,质变,。,275.2 while和do while循环恩格斯说:“纯粹,28,5.2 while,和,do while,循环,循环的嵌套,如果在一个循环的循环体内包含另一个完整的循环则称为,循环的嵌套,,其中被嵌套的循环称为,内循环,,而嵌套了内循环的是,外循环,内循环还可以嵌套循环,形成多级(层)嵌套,285.2 while和do while循环循环的嵌套如果在,29,5.2 while,和,do while,循环,顺序打印,1-10,的阶乘,即,1!, 2!, , 10!,本题的关键是求阶乘,数学上,,n!=123(n-1)n,295.2 while和do while循环顺序打印1-10,30,5.2 while,和,do while,循环,外循环,内循环,对比程序:,#include ,void main( ),int i=1;,float f = 1;,while( i = 10 ),f = f * i;,printf( %2d! = %.0f n, i, f );,i + ;,思考一下:,8-10,的阶乘,#include ,void main( ),int i=1, j ;,float f ;,while( i = 10 ),j = 1;,f = 1;,while( j = i ),f = f * j;,j + ;,printf( “ %2d! = %.0f n”, i, f );,i + ;,305.2 while和do while循环外循环内循环对比,31,5.2 while,和,do while,循环,循环的嵌套不仅可以发生在相同语句之间,如,while,嵌套,while,、,do-while,嵌套,do-while,,,while,语句和,do-while,语句也可以互相嵌套,(1)while(.)(2)while(),while() do,while();,(3)do(4)do,while() do, while() ;, while() ;,315.2 while和do while循环 循,32,5.2 while,和,do while,循环,错误的嵌,套形式,循环必须是完整的,不允许内外循环交叉嵌套,f = 1;,while( i 10),i=1;,do,f = f * i;,i +;, while( i10 );,混乱的控,制条件,内外循环的循环控制条件通常是分开的,相对独立的,i=1; s=0;,while ( i 3 ),s = s + f;,i = 1; f=1;,while( i5),i +=2;,f = f * i;,i+ ;,325.2 while和do while循环错误的嵌,33,5.2 while,和,do while,循环,应用举例,输入一个,5,位数,计算并输出各位的和,方法一:将输入的,5,位数看作是,5,个独立的数字字符,依次读取每一个数字字符,将其转化为对应的数字后再求和,将数组字符,ch,转化为数字的方法为,ch-0,335.2 while和do while循环应用举例输入一个,34,5.2 while,和,do while,循环,输入一个,5,位数,计算并输出各位的和,#include ,void main( ),char ch ;,int i=0, sum = 0;,printf(“Enter a number with 5 digits: ”);,while( i 0 ),r = x % 10;,sum += r ;,x /= 10 ;,printf( Sum of the digits in %d is %dn, x1, sum ) ;,375.2 while和do while循环输入一个5位数,,38,5.2 while,和,do while,循环,任意输入一行字符,统计字母,a,和,A,的个数,#include ,void main( ),char ch;,int count=0;,printf( Enter characters: );,do,ch = getchar( );,if( ch=A | ch=a ) count+;, while( ch != n );,printf( Counter of a or A: %dn , count );,385.2 while和do while循环任意输入一行字符,39,5.2 while,和,do while,循环,395.2 while和do while循环,40,5.2 while,和,do while,循环,#include ,void main( ),int f = -1, n =1 ;,float t, pi = 0 ;/* t,为最后一项的值 *,/,do,f = -f ;/*,第,n,项的符号 *,/,t = 1.0 / ( 2*n -1 ) ;/*,用,1.0,是为了避免整除 *,/,pi += f * t ;,n+ ;, while( t 1e-5 );,pi = 4 * pi ;,printf( PI = %.4f n, pi ) ;,405.2 while和do while循环#include,41,5.3 for,语句,for,语句是常用的、特殊的循环控制语句,for,语句的功能强大,使用灵活,变化多样,for,语句,优点,:将“,循环初始化条件,”、“,循环控制条件,”、“,循环控制变量的修改,”集中表示,将,量变,与,质变,的因素集中表示,415.3 for语句,42,5.3 for,语句,for,语句的用法,for(,表达式,1 ;,表达式,2 ;,表达式,3 ),语句,“,表达式,1,”,用于,循环的初始化,“,表达式,2,”,是,for,语句的,循环控制条件,,当循环控制条件为,1(True),或非,0,时,运行代表循环体的,“,语句,”,部分,可以是任何形式的表达式,“,表达式,3,”,用于,修改循环控制变量的值,,目的是使,“,表达式,2,”,的值变为,0(False),,以结束循环,“,语句,”,部分是,for,语句的,循环体,,可以是单一语句,也可以是复合语句,425.3 for语句for语句的用法,43,5.3 for,语句,for,语句的执行过程,435.3 for语句for语句的执行过程,44,5.3 for,语句,使用,for,语句编程。计算,sum=1+2+3+100,#include ,void main( ),int i, sum=0 ;,for( i =1 ; i=100 ; i+),sum += i ;,printf( “sum = %d n, sum );,445.3 for语句使用for语句编程。计算sum=1+2,45,5.3 for,语句,任意输入,10,个数,求平均值,#include ,void main( ),int i ;,float x, sum=0 ;,printf( Enter 10 numbers one by one: n );,for( i =1 ; i=10 ; i+),scanf( %f, ,sum += x ;,printf( Average is %f n, sum/10 );,455.3 for语句任意输入10个数,求平均值#inclu,46,5.3 for,语句,循环的嵌套,for,语句可以嵌套,for,语句构成循环的嵌套,for,语句也可以与,while,语句、,do-while,语句,互相,嵌套,465.3 for语句循环的嵌套,47,5.3 for,语句,例:顺序打印,1-10,的阶乘,即,1!, 2!, 3!, , 10!,#include ,void main( ),int i, j ;,float f ;,for( i=1; i = 10 ; i+ ),f = 1;,for( j=1; j = i ; j+ ),f = f * j;,printf( %2d! = %.0f n, i, f );,#include ,void main( ),int i=1, j ;,float f ;,while( i = 10 ),j = 1;,f = 1;,while( j = i ),f = f * j;,j + ;,printf( “ %2d! = %.0f n”, i, f );,i + ;,475.3 for语句例:顺序打印1-10的阶乘,即1!,48,5.3 for,语句,例:打印几何图形,对于这类问题,每行中星号的个数、总行数等都应该用循环结构进行控制,而不是直接输出若干行字符串,#include ,void main( ),int i, j ;,for(i=1; i = 4; i+ ),for( j = 0; ji ; j+ ),putchar( );,for( j = 1; j y ; t+ ),x = 100+5*t ;,y = 8 * t;,printf( Time is %d secondsn, t);,495.3 for语句例:甲、乙两个会计进行点钞比赛,甲的速,50,5.3 for,语句,for,语句的变化形式,可以省略,for,语句的“表达式,1”,或“表达式,3”,,也可以都省略(“,退化为,”,while,语句),例:将用键盘输入的若干字符顺序输出到屏幕上,#include ,void main( ),char ch ;,for( ; (ch=getchar( ) ) !=n ; ),putchar( ch ) ;,505.3 for语句for语句的变化形式可以省略for语句,51,5.3 for,语句,如果省略“表达式,2”,,则循环控制条件总为“真”,下面的语句是“合法”的,但构成了“死循环”:,for( i=1; ; i+) sum += i ;,下面的程序在运行时会因为“除以零”而出错:,#include ,void main( ),char i ;,int sum=0 ;,for( i=1; ; i+) sum += 1000 / i ;,printf( sum=%d n, sum);,515.3 for语句如果省略“表达式2”,则循环控制条件总,52,5.4,循环的控制,复杂的循环控制条件,对循环的控制问题,不仅仅是防止,“,死循环,”,,还包括选择恰当的时机,正确地结束循环,有的时候,循环控制条件是复杂的,还可能是多种条件的综合,525.4 循环的控制复杂的循环控制条件,53,例:假设每个班最多有,30,个人,依次输入每个人的成绩,如果输入的不是,0-100,之间的数,或者已经输入了,30,个数,则结束输入,输出计算结果。,#include ,void main( ),int i = 0, flag=1 ;,float score, ave = 0 ;,printf( Enter scores one by one:n );,while ( i 0 ) ave = ave / i;,printf(Average: %.2fn, ave);,53例:假设每个班最多有30个人,依次输入每个人的成绩,如果,54,5.4,循环的控制,下面的程序块常用来对输入的数据进行限制:,do scanf(%d, ,while( iInput MAXIMUM );,或者,,scanf(,%d, ,while( iInput MAXIMUM ),scanf(,%d, ,常用下面的程序块要求用户选择,Yes,或,No,,忽略其他输入:,printf(,Enter Yes / No ?,);,do ch=getchar( );,while( ch!=y ,或者,?,(,讨论一下,),技巧,545.4 循环的控制 下面的程序块常用来对输入的数据进行限,55,例:利用随机数产生一个乘法算式,用户输入算式的运算结果,由程序判断对错。,#include ,#include ,void main( ),int iFor = 0, iErr =0 ;,int x, y, iAns ; char ch;,do,iFor +;,x = rand() % 100;,y = rand() % 100;,printf( %d x %d = ? , x, y );,scanf( %d, ,if( iAns=x*y ),printf( Right!n ) ;,else,iErr +; printf( You are wrong.n ) ;,printf(Are you want to continue ? (Y/N) ) ;,do ch=getchar( );,while( ch!=y , while( ch=y | ch=Y );,printf(In %d questions, , iFor );,printf(youve made %d right, %d wrong.n, iFor - iErr, iErr );,55例:利用随机数产生一个乘法算式,用户输入算式的运算结果,,56,5.4,循环的控制,break,语句,break,语句的格式为:,break;,在,switch,语句中,,break,语句用于跳过后面的语句,结束,switch,语句,在循环结构中,,break,语句的作用是跳出循环结构,执行循环后面的语句,在下面的程序块中,由于,break,语句的作用,循环只进行了,1,次,,printf,语句一次也没有执行,并且永远也不会被执行:,for( i=1; i 100; i+),sum += i;,break;,printf( %d, sum );,565.4 循环的控制break语句break语句的格式为:,57,5.4,循环的控制,continue,语句,continue,语句的格式为:,continue;,continue,语句只能用在循环结构中,用于结束本次循环,即跳过循环体中后面的语句,开始下一次循环,下面的语句块中,循环次数是,100,次,但,printf,语句一次也没有执行:,for( i=1; i 100; i+),sum += i;,continue;,printf( %d, sum );,575.4 循环的控制continue语句continue语,58,5.4,循环的控制,break,语句和,continue,语句的有效范围都仅限于所在的循环语句之内。如果想从嵌套的循环结构的内循环中直接跳出到外循环之外,使用一个,break,语句是不行的。可行的方法是:在程序中引入一个标识变量,在各循环的结束位置检测这一标识,用多个,break,语句作连续的跳转,flag =1,while( i 10 ),for( j=i; j10; j+),if( j=2*i),flag =0;break;,if( flag != 1)break;,printf(%d, i);,585.4 循环的控制break语句和continue语句,59,5.4,循环的控制,例:顺序打印,100-1000,之间所有,9,的倍数,如果一个数同时也是,7,的倍数则停止打印,#include ,void main( ),int i ;,for( i=100; i0; i- ),if( n % i = 0 ) break;,printf(The biggest factor of %d is %dn, n, i );,605.4 循环的控制例:求任意正整数的除了自身以外的最大因,61,5.4,循环的控制,goto,语句,goto,语句是从早期程序设计语言遗留下来的一个语句,称为无条件跳转语句,已被淘汰,goto,语句的使用格式是:,goto,语句标号,;,“,语句标号”是一个特殊的标识符,由字母、数字或下划线组成(第一个字符不能是数字),后面跟冒号“:”,放在语句行的最前头,#include ,void main( ),int i =100;,while( i0 ; i-) x = x / 2 ;,printf( There are %d amebas.n , x ) ;,645.5 应用举例设开始时阿米巴的个数为x0,第1次、第2,65,例:谷角猜想,对于任意一个自然数,n,,若,n,为偶数,则将其除以,2,;若,n,为奇数,则将其乘以,3,,然后再加,1,。如此反复,经过有限次运算后,总可以得到自然数,1,。试编程验证之。,#include ,void main( ),int n ;,printf( Enter a number: ) ;,scanf( %d, ,printf( %5d, n );,while( n 1 ),if( n%2 = 0 ) n /= 2;,else n = 3* n +1 ;,printf(%5d, n );,65例:谷角猜想,对于任意一个自然数n,若n为偶数,则将其除,66,5.5,应用举例,例:打印九九乘法口诀表,要求:,九九乘法口诀表呈三角形,共有,9,行。第,1,行有,1,列,第,2,行有,2,列,,,第,9,行有,9,列。打印方法是,用,外循环,控制行数,包括打印一行中的所有列和换行,在,内循环,中,打印某一行上的所有列。,#include ,void main( ),int i, j;,for( i=1; i = 9; i+ ),for( j=1; j = i; j+ ),printf( %1dx%1d=%-4d, j, i, j*i );,printf(n);,665.5 应用举例例:打印九九乘法口诀表#include,67,例:利用迭代公式 求 的近似值,结果保留,5,位有效数字。,用该迭代公式求,a,的平方根,x,,实际是求近似值,x,n,+1,,即,x,x,n,+1,,“保留,5,位有效数字”可理解为,|,x,n,+1,-,x,n,|,/,x,n,+1,10,-5,#include ,#include ,void main( ),float x, y, y0 ;,printf( Enter a positive: ) ;,do scanf(%f, ,while( x 1e-5 );,printf(Square root of %f is %fn,x, y );,67例:利用迭代公式,68,例:利用牛顿迭代法求方程的 在,2,附近的一个实根。,对于方程,f (x)=0,,把,f (x),在,x,0,附近展开成泰勒级数:,f (x) = f (x,0,) + (x,x,0,) f (x,0,) + (x,x,0,),2,f (x,0,) +,取线性部分作为方程,f (x) = 0,的近似方程,则有:,f (x,0,) + f (x,0,)(x,x,0,) = 0,设,f (x,0,) 0,,则方程的近似解为:,x,1,=x,0,f (x,0,) / f (x,0,),再把,f (x),在,x,1,附近展开,也取其线性部分。若,f (x,1,)0,,则得到方程的另一个近似解:,x,2,=x,1,f (x,1,)/f (x,1,),这样,可得到牛顿法的一个迭代序列:,x,n+1,=x,n,f (x,n,)/f (x,n,),当,f (x,n+1,)0,时即可认为,x,n+1,就是方程,f (x)=0,的近似解。对于本题,,f (x) = 5x,3,- 3x,2,- 22,f (x) = 15x,2,- 6x,x,0,= 2,68例:利用牛顿迭代法求方程的,69,例:利用牛顿迭代法求方程的 在,2,附近的一个实根。,#include ,void main( ),float x, y, y1;,x = 2;,do,y = x*x* ( 5*x - 3 ) - 22 ;,y1 = (15 * x 6 ) * x ;,x = x y / y1;, while( fabs( y ) 1e-5 ),printf(The root is %fn, x);,69例:利用牛顿迭代法求方程的,70,5.6,程序调试,对于程序设计而言,即使优秀的程序员也不能保证不会犯错误,一个优秀的程序,不在于使用了先进的算法,而在于仅仅包含少量的错误,程序中的错误是在所难免的,关键是发现并纠正错误,初学程序设计的人有必要从一开始就养成良好的习惯,培养严谨的工作作风,并逐步掌握一些编程技巧,705.6 程序调试对于程序设计而言,即使优秀的程序员也不能,71,5.6,程序调试,程序调试的一般策略,程序中的错误一般可分为:,语法错误,比较容易发现,通常,有语法错误的程序不能通过编译和连接,也就不能生成可执行的程序,逻辑错误,又叫语义错误,也就是不能正确地表达所需要的功能,是较常见的错误之一。其外部表现为,程序可以运行,但有时出错,有时又不出错。逻辑错误通常比较难于被发现,查错和纠错对任何程序员来说都是挑战,设计错误,比较少见,通常是由于对问题的分析不彻底造成的,纠正这类错误需要重新设计程序,715.6 程序调试程序调试的一般策略,72,5.6,程序调试,调试程序的一般步骤为:,静态检查,,也就是人工检查,是在完成程序设计后,在上机调试前,仔细地对程序代码进行全面的检查。通过静态检查,不仅可以发现程序中的语法错误,也可以发现逻辑错误,甚至发现设计上的缺陷。为便于查错,应力求做到编码的标准化、文档化,增强编码的可读性、可理解性、可维护性。要做到:采用结构化方法,划分功能模块和程序段,采用必要的缩进和对齐,简化表达式,每行只有一个语句,尽量使用注释,使用有意义的标识符,,动态检查,,是指通过上机调试发现错误的过程。完成编码后,可以借助编译程序检查隐藏的语法错误,如错误标识符、非法的表达式、错误的函数调用等。利用连接程序,可以检查连接错误,如调用了未定义的函数、缺乏必要的函数定义等。通过试运行程序,可以发现一些逻辑错误,如错误的计算、有问题的输入和输出等,725.6 程序调试调试程序的一般步骤为:,73,5.6,程序调试,程序中的错误有两种:,Error,和,Warning,Error,是必须要纠正的,任何,Error,都会导致编译或连接失败,Warning,一般不影响生成可执行的“程序”,但程序有缺陷,合格的程序员不仅要纠正致命,Error,,也要重视并纠正,Warning,当程序中错误较多时,应从最前面的错误开始逐一改正有些错误实际出自同样的原因,只要纠正了其中的一个就会消除所有这些错误,735.6 程序调试程序中的错误有两种:Error和Warn,74,5.6,程序调试,程序的跟踪与调试,,以,Visual C+ 6.0,为例,1,、程序的“调试”运行方式,打开主菜单,点击 “,Go”,(快捷键是,F5,),745.6 程序调试程序的跟踪与调试,以Visual C+,75,5.6,程序调试,2,、使程序暂停的方法,执行到光标处:将光标放在一个语句行上,单击“,debug”,工具栏中的“,Run to Cursor”,按钮,设置断点:将光标放在一个语句行上,然后点击“,Add/Remove Breakpoint”,按钮 ,即可在此设置(或取消)一个断点,“中断”(,Break,)方式:当程序运行在调试方式下时,单击“,Break”,按钮,即可立即“中断”程序的运行;要恢复暂停程序的执行,只要单击“,Go”,按钮即可,755.6 程序调试2、使程序暂停的方法,76,5.6,程序调试,3,、在“暂停”状态下常见的操作,单步运行程序。点击“,Step Over”,按钮 或“,Step Into”,按钮即可一行一行地执行程序,每执行完一行都自动进入暂停状态,观察变量的值。使用“,Variables”,窗口可观察程序中的各种变量的当前值,点击其中的“,Locals”,选项卡可以显示所定义的变量的值。在“,Watch”,窗口中,也可以添加或删除要观察的变量的值。当“,Watch”,有效时,点击选中源代码窗口,把鼠标指向任何变量,稍待片刻,就会弹出该变量的值,修改变量的值。要临时修改变量的值,可以双击改变量的“,Value”,域(在,Variables,窗口或,Watch,窗口都有效),进行编辑,模拟计算。单击“,QuickWatch”,按钮 ,弹出“,QuckWatch”,对话框,可以用当前程序中的变量组成算式进行简单的模拟运算,765.6 程序调试3、在“暂停”状态下常见的操作,77,5.6,程序调试,4,、查错的技巧,程序中隐藏的错误通常难于发现,可以采取一些技巧:,在程序中加入一些“调试代码”,输出变量的中间值以帮助判断,但这种办法并不理想,一来使用起来不方便,二来破坏了程序的原有结构,三是在不需要的时候还要一一删除,不注意会遗漏。使用条件编译会更好些,通过设置断点、跟踪运行等方式调试程序,,这是比较高效的方法一旦怀疑某段程序有错,可以在程序段的开始位置设置断点,当程序运行到断点而暂停时,通过一步一步地执行程序,并观察变量的变化,判断错误是否存在。但这种方法也有不利的地方,比如,如果程序段所表达的逻辑比较复杂,或者循环次数很多,都会导致调试困难,程序的单元测试法,。对程序段的执行逻辑进行仔细分析,划分程序执行路径的种类,针对每种路径设计若干组不同的输入数据,依次使用这些数据来测试程序,观察程序的运行状态和结果,以发现可能隐藏着的错误,775.6 程序调试4、查错的技巧,78,小强蛋糕店之“成本核算”,小强蛋糕店开张已经快有两个月了,小强起早贪黑、没日没夜地干活,但是每到月底结算的时候,他却发现经济上入不敷出!虽然小强天性“乐善好施”、“学雷锋做好事”,但是如果长期如此,蛋糕店不久也会“关门大吉”了。,为了找出原因所在,小强打算应用罗老师传授的“循环程序结构”编写一个计算机程序,对制作的每款蛋糕进行“成本核算”,计算出合理的成本价格,以利于今后的经营。,78小强蛋糕店之“成本核算” 小强蛋糕店开张已,79,小强蛋糕店之“成本核算”,蛋糕主要原料是面粉、牛奶、奶油、鸡蛋和糖,小强蛋糕的主要原料成分表如下所示:,产品名称,面粉,牛奶,奶油,鸡蛋,糖,冻柠檬芝士,110g,100ml,500g,80g,50g,啤酒胡萝卜巧克力,100g,50ml,200g,180g,100g,黑森林,95g,40ml,400g,110g,120g,杏脯蜂蜜,120,18ml,100g,80g,110g,巧克力榛果,106g,21ml,100g,203g,135g,水果奶油,100g,60ml,300g,120g,140g,小强立体造型,80g,30ml,100g,90g,80g,79小强蛋糕店之“成本核算” 蛋糕主要原料是面,80,小强蛋糕店之“成本核算”,面粉、牛奶、奶油、鸡蛋和糖的当前市场价格表如下所示:,产品名称,市场价格,面粉,3,元,/500g,牛奶,6,元,/500ml,奶油,10,元,/500g,鸡蛋,5,元,/500g,糖,3,元,/500g,80小强蛋糕店之“成本核算”面粉、牛奶、奶油、鸡蛋和糖的当前,81,小强蛋糕店之“成本核算”,小强蛋糕店设计的“成本核算”程序,cost.c,如下:,#include ,void main( ),float flour_w, milk_w, butter_w, egg_w, sugar_w;,float flour_p, milk_p, butter_p, egg_p, sugar_p;,float ave_p;,char is_repeat=y;,flour_p=3;milk_p=6; butter_p=10;,egg_p=5;sugar_p=3;,printf(,请按以下顺序输入蛋糕成分数量。,n);,printf(,面粉、牛奶、奶油、鸡蛋、糖:,n);,scanf(%f%f%f%f%f, ,81小强蛋糕店之“成本核算”小强蛋糕店设计的“成本核算”程序,82,小强蛋糕店之“成本核算”,while (is_repeat=y),ave_p = (flour_w*flour_p + milk_w*milk_p + butter_w*butter_p + egg_w*egg_p + sugar_w*sugar_p)/500;,printf(,这款蛋糕的主要成本价格是,%.2f,元。,n, ave_p);,printf(,还需要对其它蛋糕进行成本核算吗?,n);,getchar();,printf(,需要输入,y,,否则输入,n,:,);,scanf(%c, ,if (is_repeat=Y | is_repeat=y), printf(,请按以下顺序输入蛋糕成分数量。,n);,printf(,面粉、牛奶、奶油、鸡蛋、糖:,n);,scanf(%f%f%f%f%f, ,else, is_repeat = n;,printf(,欢迎使用,再见!,n);,82小强蛋糕店之“成本核算”while (is_repea,83,小强蛋糕店之“成本核算”,小强感觉计算某个产品成本时都要重新输入相应的各个成分,十分不便。看来,需要请教罗老师,有没有更好的办法?,产品名称,面粉,牛奶,奶油,鸡蛋,糖,冻柠檬芝士,110g,100ml,500g,80g,50g,啤酒胡萝卜巧克力,100g,50ml,200g,180g,100g,黑森林,95g,40ml,400g,110g,120g,杏脯蜂蜜,120g,18ml,100g,80g,110g,巧克力榛果,106g,21ml,100g,203g,135g,水果奶油,100g,60ml,300g,120g,140g,小强立体造型,80g,30ml,100g,90g,80g,83小强蛋糕店之“成本核算” 小强感觉计算某个,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!