C语言__循环程序设计_第1页
C语言__循环程序设计_第2页
C语言__循环程序设计_第3页
C语言__循环程序设计_第4页
C语言__循环程序设计_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1会计学C语言语言_循环程序设计循环程序设计23456789101112131415循环体循环控制条件循环控制变量循环的初始化#include void main( ) int i=1, sum=0 ;while ( i = 100 )sum = sum + i ;i+ ;printf ( “Sum = %d n”, sum ) ;16循环体循环控制条件循环控制变量循环的初始化#include void main( ) int i=2, sum=0 ;while ( i = 100 )sum = sum + i ;i+=2 ;printf ( “Sum = %d n”, sum ) ;1718

2、while语句的执行过程是:语句的执行过程是:计算计算“表达式表达式”的值;的值;若若“表达式表达式”的值不时的值不时0,为,为“真真”,继续执行;否则,结束循环,继续执行;否则,结束循环,转到,转到while语句后面的语句继续语句后面的语句继续执行程序;执行程序;执行执行“语句语句”部分,即执行循环体部分,即执行循环体;返回继续执行。返回继续执行。192021#include void main( ) int i=1, sum=0 ;while ( i= 100 )sum = sum + i+ ;printf ( “Sum = %d n”, sum ) ;#include void main

3、( ) int i=1, sum=0 ;dosum = sum + i ;i+;while ( i= 100 );printf ( “Sum = %d n”, sum ) ;2223#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次

4、后的高度是次后的高度是%g。n, number, paper_height);242526#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);2728 如果在一个循环的循

5、环体内包含另一个完整的如果在一个循环的循环体内包含另一个完整的循环则称为循环则称为循环的嵌套循环的嵌套,其中被嵌套的循环称,其中被嵌套的循环称为为内循环内循环,而嵌套了内循环的是,而嵌套了内循环的是外循环外循环 内循环还可以嵌套循环,形成多级(层)嵌套内循环还可以嵌套循环,形成多级(层)嵌套29 本题的关键是求阶乘本题的关键是求阶乘 数学上,数学上,n!=123(n-1)n30外循环内循环对比程序:对比程序:#include void main( ) int i=1;float f = 1;while( i = 10 )f = f * i;printf( %2d! = %.0f n, i, f

6、 );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 + ;31 循环的嵌套不仅可以发生在相同语句之间,如循环的嵌套不仅可以发生在相同语句之间,如while嵌套嵌套while、do-while嵌套嵌套do-while,while语句和语句和do-while语句也可以互相语句也可以互相嵌套嵌套(1)while(.)(2)while(

7、)while() dowhile();(3)do(4)dowhile() do while() ; while() ;32错误的嵌套形式 循环必须是完整的,不允许循环必须是完整的,不允许内外循环交叉嵌套内外循环交叉嵌套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+ ; 33 输入一个输入一

8、个5位数,计算并输出各位的和位数,计算并输出各位的和方法一:将输入的方法一:将输入的5位数位数看作是看作是5个独立的数字个独立的数字字符,依次读取每一个字符,依次读取每一个数字字符,将其转化为数字字符,将其转化为对应的数字后再求和对应的数字后再求和 将数组字符将数组字符ch转化为转化为数字的方法为数字的方法为ch-034 输入一个输入一个5位数,计算并输出各位的和位数,计算并输出各位的和#include void main( ) char ch ;int i=0, sum = 0;printf(“Enter a number with 5 digits: ”);while( i 5 )ch =

9、 getchar( );sum += ch - 0 ; /* 将数字字符转化为对应的数字将数字字符转化为对应的数字 */ i+ ;printf( “Sum of these 5 digits is %dn”, sum ) ;35几种常见运算:几种常见运算:l如果如果chch为数字字符,则表达式为数字字符,则表达式ch - ch - 0 0的值为对应的值为对应的数字的数字l如果如果chch为大写字母,则表达式为大写字母,则表达式 ch-ch-A A+ +a a 为对应的为对应的小写字母小写字母l如果如果chch为小写字母,则表达式为小写字母,则表达式 ch-ch-a a+ +A A 为对应的为对

10、应的大写字母大写字母技巧技巧36 输入一个输入一个5位数,计算并输出各位的和位数,计算并输出各位的和方法二:将输入的方法二:将输入的5位位数看作一个整数,先数看作一个整数,先读取该整数,再分离读取该整数,再分离出各位数字出各位数字 对于整数对于整数x,其个位数,其个位数为为 x%10 要求整数要求整数x的十位数,的十位数,可以先令可以先令x=x/10,再,再求求x的个位数的个位数37 输入一个输入一个5位数,计算并输出各位的和位数,计算并输出各位的和#include void main( ) int x, x1, r, sum = 0;printf(Enter a number: );scan

11、f( %d, &x) ;x1=x;while( x 0 )r = x % 10;sum += r ; x /= 10 ;printf( Sum of the digits in %d is %dn, x1, sum ) ;38 任意输入一行字符,统计字母任意输入一行字符,统计字母a和和A的个数的个数#include void main( )char ch;int count=0;printf( Enter characters: );doch = getchar( );if( ch=A | ch=a ) count+; while( ch != n );printf( Counter

12、of a or A: %dn , count );3940#include void main( )int f = -1, n =1 ;float t, pi = 0 ;/* t为最后一项的值为最后一项的值 */dof = -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 ) ;41 for语句是常用的、特殊的循环控制语句语句是常用的、特殊的循环控制语句 for语句的功

13、能强大,使用灵活,变化多样语句的功能强大,使用灵活,变化多样 for语句语句优点优点:将:将“循环初始化条件循环初始化条件”、“循循环控制条件环控制条件”、“循环控制变量的修改循环控制变量的修改”集集中表示中表示 将将量变量变与与质变质变的因素集中表示的因素集中表示42for语句的用法语句的用法for( 表达式表达式1 ; 表达式表达式2 ; 表达式表达式3 ) 语句语句l“表达式表达式1 1”用于用于循环的初始化循环的初始化l“表达式表达式2 2”是是forfor语句的语句的循环控制条件循环控制条件,当循环控,当循环控制条件为制条件为1(True)1(True)或非或非0 0时,运行代表循环

14、体的时,运行代表循环体的“语句语句”部分,可以是任何形式的表达式部分,可以是任何形式的表达式l“表达式表达式3 3”用于用于修改循环控制变量的值修改循环控制变量的值,目的是,目的是使使“表达式表达式2 2”的值变为的值变为0(False)0(False),以结束循环,以结束循环l“语句语句”部分是部分是forfor语句的语句的循环体循环体,可以是单一语,可以是单一语句,也可以是复合语句句,也可以是复合语句43for语句的执行过程语句的执行过程44使用使用for语句编程。计算语句编程。计算sum=1+2+3+100#include void main( ) int i, sum=0 ;for(

15、i =1 ; i=100 ; i+)sum += i ;printf( “sum = %d n, sum );45任意输入任意输入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, &x );sum += x ;printf( Average is %f n, sum/10 );46循环的嵌套循环的嵌套 for语句可以嵌套语句可以嵌套for语句构成循环的嵌套语句构成循环的

16、嵌套 for语句也可以与语句也可以与while语句、语句、do-while语句语句互相互相嵌套嵌套47例:顺序打印例:顺序打印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

17、( j = i )f = f * j;j + ;printf( “ %2d! = %.0f n”, i, f );i + ;48例:打印几何图形例:打印几何图形对于这类问题,每行对于这类问题,每行中星号的个数、总行中星号的个数、总行数等都应该用循环结数等都应该用循环结构进行控制,而不是构进行控制,而不是直接输出若干行字符直接输出若干行字符串串#include void main( )int i, j ;for(i=1; i = 4; i+ )for( j = 0; ji ; j+ ) putchar( );for( j = 1; j=6 ; j+ ) putchar(*);putchar(n)

18、;* * * * * * * * * * * * *49例:甲、乙两个会计进行点钞比赛,甲的速度为例:甲、乙两个会计进行点钞比赛,甲的速度为5张张/秒,乙的秒,乙的为为8张张/秒。乙在甲已经点了秒。乙在甲已经点了100张钞票后才开始,问:只要张钞票后才开始,问:只要几秒时间乙就可以超过甲?几秒时间乙就可以超过甲?l 经过经过 t 秒,甲点过的秒,甲点过的钞票数有钞票数有 x=100+5t 张张,乙的为,乙的为 y=8t 张张l 问题就是求问题就是求 yx 时时的的 t 值值#include void main( )int t ;int x=100, y=0 ;for( t=0 ; x y ;

19、t+ )x = 100+5*t ;y = 8 * t;printf( Time is %d secondsn, t);50for语句的变化形式语句的变化形式 可以省略可以省略for语句的语句的“表达式表达式1”或或“表达式表达式3”,也可以都省略(也可以都省略(“退化为退化为”while语句)语句)例:将用键盘输入的若干字符顺序输出到屏幕上例:将用键盘输入的若干字符顺序输出到屏幕上#include void main( ) char ch ;for( ; (ch=getchar( ) ) !=n ; )putchar( ch ) ;51 如果省略如果省略“表达式表达式2”,则循环控制条件总为,

20、则循环控制条件总为“真真”下面的语句是下面的语句是“合法合法”的,但构成了的,但构成了“死循环死循环”: for( i=1; ; i+) sum += i ;l下面的程序在运行时会因为下面的程序在运行时会因为“除以零除以零”而出错:而出错:#include void main( )char i ;int sum=0 ;for( i=1; ; i+) sum += 1000 / i ;printf( sum=%d n, sum);52 复杂的循环控制条件复杂的循环控制条件对循环的控制问题,不仅仅是防止对循环的控制问题,不仅仅是防止“死循环死循环”,还包,还包括选择恰当的时机,正确地结束循环括选择

21、恰当的时机,正确地结束循环 有的时候,循环控制条件是复杂的,还可能是多种条有的时候,循环控制条件是复杂的,还可能是多种条件的综合件的综合53例:假设每个班最多有例:假设每个班最多有3030个人,依次输入每个人的成个人,依次输入每个人的成绩,如果输入的不是绩,如果输入的不是0-1000-100之间的数,或者已经输之间的数,或者已经输入了入了3030个数,则结束输入,输出计算结果。个数,则结束输入,输出计算结果。#include void main( )int i = 0, flag=1 ;float score, ave = 0 ;printf( Enter scores one by one:

22、n );while ( i 30 & flag =1 )scanf( %f, &score );if( score 100 )flag = 0;elseave += score;i+ ;if( i 0 ) ave = ave / i;printf(Average: %.2fn, ave);54 下面的程序块常用来对输入的数据进行限制:下面的程序块常用来对输入的数据进行限制:do scanf(%d, &iInput );while( iInput MAXIMUM );或者,或者, scanf(%d, &iInput );while( iInput MAXIMUM

23、) scanf(%d, &iInput ); 常用下面的程序块要求用户选择常用下面的程序块要求用户选择Yes或或No,忽略其他输入:,忽略其他输入:printf(Enter Yes / No ? );do ch=getchar( );while( ch!=y & ch!=Y & ch!=n & ch!=N );或者,?或者,?(讨论一下讨论一下)技巧技巧55例:利用随机数产生一个乘法算式,用户输入算例:利用随机数产生一个乘法算式,用户输入算式的运算结果,由程序判断对错。式的运算结果,由程序判断对错。#include #include void main( )in

24、t iFor = 0, iErr =0 ;int x, y, iAns ; char ch;doiFor +;x = rand() % 100;y = rand() % 100;printf( %d x %d = ? , x, y );scanf( %d, &iAns );if( iAns=x*y ) printf( Right!n ) ;elseiErr +; printf( You are wrong.n ) ;printf(Are you want to continue ? (Y/N) ) ;do ch=getchar( );while( ch!=y & ch!=Y &

25、amp; ch!=n & ch!=N ); while( ch=y | ch=Y );printf(In %d questions, , iFor );printf(youve made %d right, %d wrong.n, iFor - iErr, iErr );56break语句语句l breakbreak语句的格式为:语句的格式为:break;break;l 在在switchswitch语句中,语句中,breakbreak语句用于跳过后面的语句语句用于跳过后面的语句,结束,结束switchswitch语句语句l 在循环结构中,在循环结构中,breakbreak语语句的作用是

26、跳出循环结构句的作用是跳出循环结构,执行循环后面的语句,执行循环后面的语句在下面的程序块中,由于在下面的程序块中,由于breakbreak语句的作用,循环语句的作用,循环只进行了只进行了1 1次,次,printfprintf语语句一次也没有执行,并且句一次也没有执行,并且永远也不会被执行:永远也不会被执行:for( i=1; i 100; i+) sum += i;break;printf( %d, sum );57continue语句语句l continue语句的格式为:语句的格式为:continue;l continue语句只能用在循语句只能用在循环结构中,用于结束本次循环结构中,用于结束

27、本次循环,即跳过循环体中后面的环,即跳过循环体中后面的语句,开始下一次循环语句,开始下一次循环下面的语句块中,循环次下面的语句块中,循环次数是数是100100次,但次,但printfprintf语语句一次也没有执行:句一次也没有执行:for( i=1; i 100; i+) sum += i;continue;printf( %d, sum );58break语句和语句和continue语语句的有效范围都仅限于所在句的有效范围都仅限于所在的循环语句之内。如果想从的循环语句之内。如果想从嵌套的循环结构的内循环中嵌套的循环结构的内循环中直接跳出到外循环之外,使直接跳出到外循环之外,使用一个用一个b

28、reak语句是不行的语句是不行的。可行的方法是:在程序中。可行的方法是:在程序中引入一个标识变量,在各循引入一个标识变量,在各循环的结束位置检测这一标识环的结束位置检测这一标识,用多个,用多个break语句作连续语句作连续的跳转的跳转flag =1while( i 10 )for( j=i; j10; j+)if( j=2*i)flag =0;break;if( flag != 1)break;printf(%d, i);59例:顺序打印例:顺序打印100-1000之间所之间所有有9的倍数,如果一个数同时的倍数,如果一个数同时也是也是7的倍数则停止打印的倍数则停止打印#include void

29、 main( ) int i ;for( i=100; i1000; i+) if( i % 9 !=0 ) continue ;printf( %5d, i ) ;if( i % 7 =0 ) break;60例:求任意正整数的除了自例:求任意正整数的除了自身以外的最大因数身以外的最大因数#include void main( )int i, n;printf( Enter a number: );scanf(%d, &n );for( i=n-1 ; i0; i- )if( n % i = 0 ) break;printf(The biggest factor of %d is %

30、dn, n, i );61goto语句语句l goto语句是从早期程序设语句是从早期程序设计语言遗留下来的一个语句计语言遗留下来的一个语句,称为无条件跳转语句,已,称为无条件跳转语句,已被淘汰被淘汰l goto语句的使用格式是:语句的使用格式是:goto 语句标号语句标号;l “语句标号语句标号”是一个特殊的是一个特殊的标识符,由字母、数字或下标识符,由字母、数字或下划线组成(第一个字符不能划线组成(第一个字符不能是数字),后面跟冒号是数字),后面跟冒号“:”,放在语句行的最前头,放在语句行的最前头#include void main( )int i =100;while( i1000 )if

31、( i % 9 !=0 ) goto Next ;printf( “%5d”, i ) ;Next: i +;例:打印所有的例:打印所有的100-1000间间9的倍数的倍数62阿米巴原虫,以细菌和更小的原虫为食阿米巴原虫,以细菌和更小的原虫为食 中枢神经系统的阿米巴原虫感染中枢神经系统的阿米巴原虫感染水水溶组织溶组织内阿米巴内阿米巴在一个试在一个试管中吞吃管中吞吃细菌细菌被称为被称为“食脑变形食脑变形虫虫”的阿米巴原虫的阿米巴原虫能从人的鼻子里钻能从人的鼻子里钻入大脑,将人的脑入大脑,将人的脑子子“吃吃”掉。掉。63例:阿米巴用简单分例:阿米巴用简单分裂方式繁殖,每分裂方式繁殖,每分裂一次用时

32、裂一次用时3分钟。分钟。将若干个阿米巴放将若干个阿米巴放在一个盛满营养液在一个盛满营养液的容器内,的容器内,45分钟分钟后容器内充满了阿后容器内充满了阿米巴。已知容器最米巴。已知容器最多可以装阿米巴多可以装阿米巴220个,试问,开始的个,试问,开始的时候往容器内放了时候往容器内放了多少个阿米巴?多少个阿米巴? 分析:分析:根据题意,阿米巴每根据题意,阿米巴每3分钟分钟分裂一次,那么从开始将阿米巴放分裂一次,那么从开始将阿米巴放入容器里面,到入容器里面,到 45 分钟后充满容分钟后充满容器,需要分裂器,需要分裂15次。而次。而“容器最多容器最多可以装阿米巴可以装阿米巴220个个”,即阿米巴分,即

33、阿米巴分裂裂15次以后得到的个数是次以后得到的个数是220。题。题目要求计算分裂之前的阿米巴数,目要求计算分裂之前的阿米巴数,不妨不妨使用倒推的方法使用倒推的方法,从第,从第15次分次分裂之后的裂之后的220个,倒推出第个,倒推出第 15 次分次分裂之前(即第裂之前(即第14次分裂之后)的个次分裂之后)的个数,再进一步倒推出第数,再进一步倒推出第 14次分裂次分裂之前、第之前、第13次分裂之前、次分裂之前、第第1次分裂之前的个数。次分裂之前的个数。64设开始时阿米巴的个数为设开始时阿米巴的个数为x0,第第1次、第次、第2次、第次、第3次次第第15次分裂之后的个数分别为次分裂之后的个数分别为x1

34、、x2、x3、x15,则有以,则有以下关系:下关系:x0=x1/2x1=x2/2xn=xn+1/2x14=x15/2已知已知x15=220,可以利用上面的,可以利用上面的关系倒推出关系倒推出x0#include #include void main( )int i ;long x = pow(2, 20) ;for( i = 15; i0 ; i-) x = x / 2 ;printf( There are %d amebas.n , x ) ;65例:谷角猜想,对于任意一个自然数例:谷角猜想,对于任意一个自然数n,若,若n为偶数,则为偶数,则将其除以将其除以2;若;若n为奇数,则将其乘以为奇

35、数,则将其乘以3,然后再加,然后再加1。如此反复,经过有限次运算后,总可以得到自然数如此反复,经过有限次运算后,总可以得到自然数1。试编程验证之。试编程验证之。#include void main( )int n ;printf( Enter a number: ) ;scanf( %d, &n );printf( %5d, n );while( n 1 )if( n%2 = 0 ) n /= 2;else n = 3* n +1 ;printf(%5d, n );66例:打印九九乘法口诀表例:打印九九乘法口诀表要求:要求:九九乘法口诀表呈三角形,共有九九乘法口诀表呈三角形,共有9行。

36、第行。第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);67例:利用迭代公式例:利用迭代公式 求求 的近似的近似值,结果保留值,结果保留5位有效数字。位有效

37、数字。11()2nnnaxxxxa用该迭代公式求用该迭代公式求a的的平方根平方根x,实际是求,实际是求近似值近似值xn+1,即,即xxn+1,“保留保留5位位有效数字有效数字”可理解为可理解为|xn+1-xn|/ xn+110-5#include #include void main( )float x, y, y0 ;printf( Enter a positive: ) ;do scanf(%f, &x ) ; while( x 1e-5 );printf(Square root of %f is %fn,x, y );68例:利用牛顿迭代法求方程的例:利用牛顿迭代法求方程的 在在

38、2附近附近的一个实根。的一个实根。3253220 xx对于方程对于方程f (x)=0,把,把f (x)在在x0附近展开成泰勒级数:附近展开成泰勒级数:f (x) = f (x0) + (xx0) f (x0) + (xx0)2 f (x0) +取线性部分作为方程取线性部分作为方程f (x) = 0的近似方程,则有:的近似方程,则有:f (x0) + f (x0)(xx0) = 0设设f (x0) 0,则方程的近似解为:,则方程的近似解为:x1=x0f (x0) / f (x0)再把再把f (x)在在x1附近展开,也取其线性部分。若附近展开,也取其线性部分。若f (x1)0,则得到方程,则得到方

39、程的另一个近似解:的另一个近似解:x2=x1f (x1)/f (x1)这样,可得到牛顿法的一个迭代序列:这样,可得到牛顿法的一个迭代序列:xn+1=xnf (xn)/f (xn)当当f (xn+1)0时即可认为时即可认为xn+1就是方程就是方程f (x)=0的近似解。对于本题,的近似解。对于本题,f (x) = 5x3 - 3x2 - 22f (x) = 15x2 - 6xx0 = 269例:利用牛顿迭代法求方程的例:利用牛顿迭代法求方程的 在在2附近附近的一个实根。的一个实根。3253220 xx#include void main( ) float x, y, y1;x = 2;do y

40、= 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);70 对于程序设计而言,即使优秀的程序员也不对于程序设计而言,即使优秀的程序员也不能保证不会犯错误能保证不会犯错误 一个优秀的程序,不在于使用了先进的算法一个优秀的程序,不在于使用了先进的算法,而在于仅仅包含少量的错误,而在于仅仅包含少量的错误 程序中的错误是在所难免的,关键是发现并程序中的错误是在所难免的,关键是发现并纠正错误纠正错误 初学程序设计的人有必要从一开始就养成良

41、初学程序设计的人有必要从一开始就养成良好的习惯,培养严谨的工作作风,并逐步掌好的习惯,培养严谨的工作作风,并逐步掌握一些编程技巧握一些编程技巧71程序调试的一般策略程序调试的一般策略程序中的错误一般可分为:程序中的错误一般可分为:比较容易发现,通常,有语法错误的程序比较容易发现,通常,有语法错误的程序不能通过编译和连接,也就不能生成可执行的程序不能通过编译和连接,也就不能生成可执行的程序又叫语义错误,也就是不能正确地表达所又叫语义错误,也就是不能正确地表达所需要的功能,是较常见的错误之一。其外部表现为需要的功能,是较常见的错误之一。其外部表现为,程序可以运行,但有时出错,有时又不出错。逻,程序

42、可以运行,但有时出错,有时又不出错。逻辑错误通常比较难于被发现,查错和纠错对任何程辑错误通常比较难于被发现,查错和纠错对任何程序员来说都是挑战序员来说都是挑战比较少见,通常是由于对问题的分析不彻比较少见,通常是由于对问题的分析不彻底造成的,纠正这类错误需要重新设计程序底造成的,纠正这类错误需要重新设计程序72调试程序的一般步骤为:调试程序的一般步骤为:,也就是人工检查,是在完成程序设计后,在上机调试,也就是人工检查,是在完成程序设计后,在上机调试前,仔细地对程序代码进行全面的检查。通过静态检查,不仅可前,仔细地对程序代码进行全面的检查。通过静态检查,不仅可以发现程序中的语法错误,也可以发现逻辑

43、错误,甚至发现设计以发现程序中的语法错误,也可以发现逻辑错误,甚至发现设计上的缺陷。为便于查错,应力求做到编码的标准化、文档化,增上的缺陷。为便于查错,应力求做到编码的标准化、文档化,增强编码的可读性、可理解性、可维护性。要做到:采用结构化方强编码的可读性、可理解性、可维护性。要做到:采用结构化方法,划分功能模块和程序段,采用必要的缩进和对齐,简化表达法,划分功能模块和程序段,采用必要的缩进和对齐,简化表达式,每行只有一个语句,尽量使用注释,使用有意义的标识符,式,每行只有一个语句,尽量使用注释,使用有意义的标识符,是指通过上机调试发现错误的过程。完成编码后,可,是指通过上机调试发现错误的过程

44、。完成编码后,可以借助编译程序检查隐藏的语法错误,如错误标识符、非法的表以借助编译程序检查隐藏的语法错误,如错误标识符、非法的表达式、错误的函数调用等。利用连接程序,可以检查连接错误,达式、错误的函数调用等。利用连接程序,可以检查连接错误,如调用了未定义的函数、缺乏必要的函数定义等。通过试运行程如调用了未定义的函数、缺乏必要的函数定义等。通过试运行程序,可以发现一些逻辑错误,如错误的计算、有问题的输入和输序,可以发现一些逻辑错误,如错误的计算、有问题的输入和输出等出等73程序中的错误有两种:程序中的错误有两种:Error和和Warning Error是必须要纠正的,任何是必须要纠正的,任何Er

45、ror都会导致编译或连接失都会导致编译或连接失败败 Warning一般不影响生成可执行的一般不影响生成可执行的“程序程序”,但程序有缺,但程序有缺陷陷 合格的程序员不仅要纠正致命合格的程序员不仅要纠正致命Error,也要重视并纠正,也要重视并纠正Warning 当程序中错误较多时,应从最前面的错误开始逐一改正当程序中错误较多时,应从最前面的错误开始逐一改正有些错误实际出自同样的原因,只要纠正了其中的一个就有些错误实际出自同样的原因,只要纠正了其中的一个就会消除所有这些错误会消除所有这些错误74程序的跟踪与调试程序的跟踪与调试,以,以Visual C+ 6.0为例为例1、程序的、程序的“调试调试

46、”运行方式运行方式打开主菜单,点击打开主菜单,点击 “Go”(快捷键是(快捷键是F5)752、使程序暂停的方法、使程序暂停的方法执行到光标处:将光标放执行到光标处:将光标放在一个语句行上,单击在一个语句行上,单击“debug”工具栏中的工具栏中的“Run to Cursor”按钮按钮 设置断点:将光标放在一设置断点:将光标放在一个语句行上,然后点击个语句行上,然后点击“Add/Remove Breakpoint”按钮按钮 ,即可,即可在此设置(或取消)一个在此设置(或取消)一个断点断点“中断中断”(Break)方式)方式:当程序运行在调试方式:当程序运行在调试方式下时,单击下时,单击“Brea

47、k”按钮按钮,即可立即,即可立即“中断中断”程序程序的运行;要恢复暂停程序的运行;要恢复暂停程序的执行,只要单击的执行,只要单击“Go”按钮即可按钮即可763、在、在“暂停暂停”状态下常见的操作状态下常见的操作 单步运行程序。点击单步运行程序。点击“Step Over”按钮按钮 或或“Step Into”按钮即可按钮即可一行一行地执行程序,每执行完一行都自动进入暂停状态一行一行地执行程序,每执行完一行都自动进入暂停状态 观察变量的值。使用观察变量的值。使用“Variables”窗口可观察程序中的各种变量的窗口可观察程序中的各种变量的当前值,点击其中的当前值,点击其中的“Locals”选项卡可以

48、显示所定义的变量的值选项卡可以显示所定义的变量的值。在。在“Watch”窗口中,也可以添加或删除要观察的变量的值。当窗口中,也可以添加或删除要观察的变量的值。当“Watch”有效时,点击选中源代码窗口,把鼠标指向任何变量,有效时,点击选中源代码窗口,把鼠标指向任何变量,稍待片刻,就会弹出该变量的值稍待片刻,就会弹出该变量的值 修改变量的值。要临时修改变量的值,可以双击改变量的修改变量的值。要临时修改变量的值,可以双击改变量的“Value”域(在域(在Variables窗口或窗口或Watch窗口都有效),进行编辑窗口都有效),进行编辑 模拟计算。单击模拟计算。单击“QuickWatch”按钮按钮

49、 ,弹出,弹出“QuckWatch”对话对话框,可以用当前程序中的变量组成算式进行简单的模拟运算框,可以用当前程序中的变量组成算式进行简单的模拟运算774、查错的技巧、查错的技巧程序中隐藏的错误通常难于发现,可以采取一些技巧:程序中隐藏的错误通常难于发现,可以采取一些技巧:但这种办法并不理想,一来使用起来不方便,二来破坏了程序的原有结构但这种办法并不理想,一来使用起来不方便,二来破坏了程序的原有结构,三是在不需要的时候还要一一删除,不注意会遗漏。使用条件编译会更,三是在不需要的时候还要一一删除,不注意会遗漏。使用条件编译会更好些好些,这是比较高效的方法,这是比较高效的方法一旦怀疑某段程序有错,

50、可以在程序段的开始位置设置断点,当程序运行一旦怀疑某段程序有错,可以在程序段的开始位置设置断点,当程序运行到断点而暂停时,通过一步一步地执行程序,并观察变量的变化,判断错到断点而暂停时,通过一步一步地执行程序,并观察变量的变化,判断错误是否存在。但这种方法也有不利的地方,比如,如果程序段所表达的逻误是否存在。但这种方法也有不利的地方,比如,如果程序段所表达的逻辑比较复杂,或者循环次数很多,都会导致调试困难辑比较复杂,或者循环次数很多,都会导致调试困难。对程序段的执行逻辑进行仔细分析,划分程序执行路。对程序段的执行逻辑进行仔细分析,划分程序执行路径的种类,针对每种路径设计若干组不同的输入数据,依

51、次使用这些数据径的种类,针对每种路径设计若干组不同的输入数据,依次使用这些数据来测试程序,观察程序的运行状态和结果,以发现可能隐藏着的错误来测试程序,观察程序的运行状态和结果,以发现可能隐藏着的错误78 小强蛋糕店开张已经快有两个月了,小强起早贪黑、没日没小强蛋糕店开张已经快有两个月了,小强起早贪黑、没日没夜地干活,但是每到月底结算的时候,他却发现经济上入不敷出夜地干活,但是每到月底结算的时候,他却发现经济上入不敷出!虽然小强天性!虽然小强天性“乐善好施乐善好施”、“学雷锋做好事学雷锋做好事”,但是如果长,但是如果长期如此,蛋糕店不久也会期如此,蛋糕店不久也会“关门大吉关门大吉”了。了。 为了

52、找出原因所在,小强打算应用罗老师传授的为了找出原因所在,小强打算应用罗老师传授的“循环程序循环程序结构结构”编写一个计算机程序,对制作的每款蛋糕进行编写一个计算机程序,对制作的每款蛋糕进行“成本核算成本核算”,计算出合理的成本价格,以利于今后的经营。,计算出合理的成本价格,以利于今后的经营。79 蛋糕主要原料是面粉、牛奶、奶油、鸡蛋和糖,小强蛋糕的蛋糕主要原料是面粉、牛奶、奶油、鸡蛋和糖,小强蛋糕的主要原料成分表如下所示:主要原料成分表如下所示:产品名称产品名称面粉面粉牛奶牛奶奶油奶油鸡蛋鸡蛋糖糖冻柠檬芝士冻柠檬芝士110g100ml500g80g50g啤酒胡萝卜巧克力啤酒胡萝卜巧克力100g

53、50ml200g180g100g黑森林黑森林95g40ml400g110g120g杏脯蜂蜜杏脯蜂蜜12018ml100g80g110g巧克力榛果巧克力榛果106g21ml100g203g135g水果奶油水果奶油100g60ml300g120g140g小强立体造型小强立体造型80g30ml100g90g80g80面粉、牛奶、奶油、鸡蛋和糖的当前市场价格表如下所示:面粉、牛奶、奶油、鸡蛋和糖的当前市场价格表如下所示:产品名称产品名称市场价格市场价格面粉面粉3元元/500g牛奶牛奶6元元/500ml奶油奶油10元元/500g鸡蛋鸡蛋5元元/500g糖糖3元元/500g81小强蛋糕店设计的小强蛋糕店设

54、计的“成本核算成本核算”程序程序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(面粉、牛奶、奶油、鸡蛋、糖:面粉、牛奶、奶油、鸡蛋、

55、糖:n);scanf(%f%f%f%f%f, &flour_w, &milk_w, &butter_w, &egg_w, &sugar_w);82while (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, &is_repeat);if (is_repeat=Y | is_repeat=y) printf(请按以下顺序输入蛋糕成分数量。请按以下顺序输入蛋糕成分数量。n); printf(面粉、牛奶、奶油、鸡蛋、糖:面粉、牛奶、奶油、鸡蛋、糖:n); scanf(%f%f%f%f%f, &flour_w, &milk_w, &butter_w, &egg_w, &sugar_w); else is_repeat = n;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论