C语言程序设计:4 循环结构

上传人:壹****1 文档编号:570197882 上传时间:2024-08-02 格式:PPT 页数:55 大小:1.86MB
返回 下载 相关 举报
C语言程序设计:4 循环结构_第1页
第1页 / 共55页
C语言程序设计:4 循环结构_第2页
第2页 / 共55页
C语言程序设计:4 循环结构_第3页
第3页 / 共55页
C语言程序设计:4 循环结构_第4页
第4页 / 共55页
C语言程序设计:4 循环结构_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《C语言程序设计:4 循环结构》由会员分享,可在线阅读,更多相关《C语言程序设计:4 循环结构(55页珍藏版)》请在金锄头文库上搜索。

1、第第4章章 循环结构程序设计循环结构程序设计主要内容主要内容三种循环语句及其应用三种循环语句及其应用用格里高利公式求用格里高利公式求的近似值的近似值统计一个整数的位数统计一个整数的位数判断素数判断素数求求1!+2!+100!循环结构程序设计循环结构程序设计教学目标、重点和难点教学目标、重点和难点n教学目教学目标q了解三种循了解三种循环形式的异同和形式的异同和应用用场合合q掌握用循掌握用循环实现常常见问题的求解的求解q熟悉熟悉breakbreak、continuecontinue语句在循句在循环中的作用中的作用q掌握循掌握循环的嵌套(的嵌套(2 2层)q进一步熟悉一步熟悉单步步执行、断点跟踪等程

2、序行、断点跟踪等程序调试方法方法n教学重点教学重点qFor、while、do-while循循环的使用;的使用;q涉及循涉及循环的常用算法的常用算法n教学教学难点点q循循环的嵌套;的嵌套;q经典算法典算法C 语言中的三种循环语言中的三种循环需要多次重复执行一个或多个任务的问题考虑使用循环来解决表达式表达式2 2表达式表达式1 1循环体语句循环体语句表达式表达式3 3for循环循环用于循环次数已知或确定的情况用于循环次数已知或确定的情况n语句一般形式句一般形式qfor(表达式表达式1 ; 表达式表达式2 ; 表达式表达式3) 循循环体体语句句n执行流程行流程表达式表达式2 2表达式表达式1 1循环

3、体语句循环体语句非非0 00表达式表达式3 3循环变量值修改循环变量值修改循环变量赋初值循环变量赋初值循环控制条件循环控制条件一条语句一条语句1234; /空语句空语句一条简单或复合语句一条简单或复合语句sum=sum+2; sum=sum+1;sum=0; 不确定不确定sum0 1 3sum=sum+3; 6 sum=sum+n; 5050sum=sum+i; 规律是:规律是:表示为:表示为:for(i=1;i=n;i+) sum=sum+i; 是是for语句!语句!例例2-7计算并输出计算并输出1+2+3+n的值的值例例2-8:计算:计算1-1/3+1/5-1/7前前n项的和。项的和。in

4、t i=1,n,t=1;float sum=0;scanf(%d,&n); for(i=1; i=n; i+) sum=sum+ 1.0/t; t=t+2; 先思考:如何求先思考:如何求 前前n项和项和再思考:如何解决正负相间的问题再思考:如何解决正负相间的问题for ( i=1; i=n; i+ ) s=s+flag/t; t=t+2 ; flag=-flag; double flag=1; 符号翻转符号翻转i=1 flag=1s=s+1/1i=2 flag=-1s=s-1/3i=3 flag=1s=s+1/5n算法流程图算法流程图定义定义s=0,n,i,flag,t输入输入ni=1, fl

5、ag=1, t=1; i = n s=s+flag/tflag=- flagi = i+1输出输出s t = t + 2n程序程序#include void main() int n, i, t;double s=0, flag=1 ;scanf(%d,&n);printf(s=%lfn, s);for( i=1 ; i=n ; i+ ) s=s+flag / t; flag= - flag; t = t +2; (2*i-1)例例2-8:计算:计算1-1/3+1/5-1/7前前n项的和。项的和。n程序程序#include void main() 例题:计算例题:计算1-1/3+1/5-1/7

6、前前n项的和。项的和。int n,i;double s=0,flag=1;printf(输入输入n:);scanf(%d,&n);for( i=1 ; i=2*n-1 ; ) s=s+flag ); flag= -flag; printf(s=%lfn, s);n算法流程图算法流程图定义定义s=0,n,i,flag输入输入ni=1,flag=1;i = 2*n-1i =i+2输出输出ss=s+flag / iflag = - flag/ ii=i+2课堂练习:课堂练习:2-15(P38)n程序程序#include int main() int n, i; double s=0,flag=1;

7、printf(输入输入n:); scanf(%d,&n); for( i=1 ; i=n; i+ ) s=s+flag/(3*i-2); flag= -flag; printf(s=%lfn, s); return 0;#include void main() int n, i, t = 1; double s=0, flag=1; printf(输入输入n:); scanf(%d,&n); for( i=1 ; i=0.0001s = s + flag * (1.0/i)i = i+2flag = - flag输出输出4*s的值的值#include int main( ) n程序:程序:in

8、t i, flag; double s=0; flag=1;i=1;while( 1.0/i = 0.0001 ) printf(=%.4lf!n, 4*s );return 0;问题:用格里高利公式求问题:用格里高利公式求的近似值的近似值s=s+flag*(1.0/i);flag=- flag;i=i+2;循环变量值修正循环变量值修正 循环条件循环条件P P真真假假循环变量初始化循环变量初始化循环条件循环条件P P循环变量初始化循环变量初始化循环变量值修正循环变量值修正循环体循环体循环体循环体n循环变量初始化循环变量初始化n循环条件判断循环条件判断n循环变量值修正循环变量值修正经典循环结构的

9、三要素经典循环结构的三要素while 循环语句循环语句while (表达式表达式) 语句语句A;while while 循环的一般语法:循环的一般语法:计算计算表达式表达式的值,若值为真的值,若值为真( (非非0)0)时,则执行语句时,则执行语句A(A(循环循环体体) )一次,然后再计算一次,然后再计算表达式表达式的值的值,如此循环,直到,如此循环,直到表达式的值为假(表达式的值为假(0 0),循环),循环终止。终止。 工作原理工作原理表达式表达式语句语句A循环条件判断循环条件判断循环体循环体(一条语句一条语句:简单语句简单语句 或复合语句)或复合语句)0 0非非0 0循环体最少执行次数:?循

10、环体最少执行次数:?0 0;nfor语句句变换成成while语句句qfor( 表达式表达式1 ; 表达式表达式2 ; 表达式表达式3 ) 循循环体体语句句n执行流程行流程表达式表达式2 2表达式表达式1 1循环体语句循环体语句非非0 00表达式表达式3 3变换变换表达式表达式1;while( 表达式表达式2 ) 循环体语句;循环体语句; 表达式表达式3; for 语句与语句与while语句的等效变换语句的等效变换while能否变换成能否变换成for语句?语句?#include void main( ) int i, g=0, s=0; i=1; while( ) if( i%3=0 | i%5

11、=0) s=s+i; g+; i+; printf(s=%dn,s); 例题:求从例题:求从1开始的前开始的前100个能被个能被3或或5整除的整数和值。整除的整数和值。n程序如下:程序如下:g100 i+; 能否改成这样?能否改成这样?NO死循环死循环永远也不可能结束的循环永远也不可能结束的循环条件条件P P真真假假g100g=g+1,s+=ii=i+1显示显示g,sg,sg=0,s=0;i=1;n流程图流程图第第4章章 循环结构程序设计循环结构程序设计主要内容主要内容用格里高利公式求用格里高利公式求的近似值的近似值统计一个整数的位数统计一个整数的位数判断素数判断素数求求1!+2!+100!循

12、环结构程序设计循环结构程序设计问题:统计一个整数的位数值问题:统计一个整数的位数值n要求:输入一个整数,求该数的位数要求:输入一个整数,求该数的位数 。n分析:分析:定义定义zs,ws=0;输入输入zszs=zs/10zs0真真假假zs=-zs#include void main( ) n程序:程序:int zs, ws=0; scanf(%d, &zs); if(zs0 );printf(位数位数=%dn,ws);ws+; do while 循环语句循环语句do语句语句A; while (表达式表达式);do while do while 循环的一般语法:循环的一般语法:先执行循环体语句一次

13、,然先执行循环体语句一次,然后计算后计算表达式表达式的值,若值为的值,若值为真真( (非非0) 0) ,则再执行循环体,则再执行循环体语句一次语句一次,如此循环,如此循环,直到表达式的值为假(直到表达式的值为假(0 0),),循环终止。循环终止。 工作原理工作原理表达式表达式语句语句A循环条件判断循环条件判断循环体循环体(一条语句一条语句:简单或复合简单或复合)0 0非非0 0循环体最少执行次数:?循环体最少执行次数:?1 1请同学们自请同学们自己动手编写己动手编写空缺处程序空缺处程序代码!代码!输出输出yearsyearsm=10,years=0m=10,years=0m100m100例题例

14、题: 现存钱现存钱10万万,年息年息5%,问几年后身家问几年后身家100万?万?#include void main() int years=0; double m=10; printf(years=%dn, years);m=m*(1+0.05)m=m*(1+0.05)years+;years+;do m=m*(1+0.05); years+; while( m100 );n流程图流程图n程序程序课堂练习:统计一个整数的位数值课堂练习:统计一个整数的位数值n能否将以下程序中的能否将以下程序中的dowhile变换成变换成while语句?语句?#include void main( ) int

15、zs, ws=0; scanf(%d, &zs); if(zs0 ); printf(位数位数=%dn,ws);while( zs0 ) zs=zs/10; ws+; if( zs = 0) ws=1;第第4章章 循环结构程序设计循环结构程序设计主要内容主要内容用格里高利公式求用格里高利公式求的近似值的近似值统计一个整数的位数统计一个整数的位数判断素数判断素数求求1!+2!+100!循环结构程序设计循环结构程序设计问题:问题:判断素数判断素数n要求:输入一个正整数要求:输入一个正整数m,判断它是否为素数。,判断它是否为素数。n原理:素数定义原理:素数定义(只有只有1和本身两个因子和本身两个因子

16、)n算法:算法:定义定义m,i输入输入mfor(i=2; i =mm为素数为素数真真假假break:跳出跳出(终止终止)其所在层的其所在层的循环语句的执行。循环语句的执行。#include int main( ) n程序:程序:int m, i; printf(m=); scanf(%d, &m) ; for( i = 2 ; i = m ) printf(%d 为素数为素数!n, m );else printf(%d 为不是素数为不是素数!n, m );问题:问题:判断素数判断素数= m/2i m/2= sqrt(m)sqrt(m)break 语句语句n语句形式句形式qbreak ;n功能功

17、能q强行行终止止其所在其所在层的的switch或或循循环语句的句的执行,将程序行,将程序流程跳流程跳转到到其所在其所在层的的语句之后。句之后。条件条件break;假假真真whilewhile循环循环表达式表达式2 2break;.假假真真表达式表达式1 1表达式表达式3 3forfor循环循环break;.条件条件假假真真do whiledo while循环循环例题:完善猜数游戏。例题:完善猜数游戏。n要求:在要求:在1,100范围内随机生成被猜数,最多允许范围内随机生成被猜数,最多允许猜猜7次,若次,若7次未猜中,则显示次未猜中,则显示“游戏结束游戏结束”。n分析分析q怎样获得怎样获得1,1

18、00区间的随机数?区间的随机数?n调用调用rand()函数:函数:rand()%n返回一个返回一个0,n)之间的随机之间的随机的非负整数。的非负整数。nx=min+rand()%(max-min+1)q怎样限定最多猜怎样限定最多猜7次?次?n设已猜次数变量设已猜次数变量cs=0,当,当cs7时执行循环,每循环一次猜一个数,时执行循环,每循环一次猜一个数,cs+,若猜中,则,若猜中,则跳出循环跳出循环,否则显示与被猜数的大小关系。,否则显示与被猜数的大小关系。q当猜数结束,怎样知道仍然没猜中?当猜数结束,怎样知道仍然没猜中?n用变量用变量flag表示表示是否猜中标志是否猜中标志,猜数前,猜数前f

19、lag=0,若猜中则设,若猜中则设flag=1,猜数结束后一句,猜数结束后一句flag的值判断之前是否猜中。的值判断之前是否猜中。#include #include #include void main( ) int s1,s2,cs=0,flag; srand( time(0) ); s1=rand() %100+1; flag = 0;n算法流程图算法流程图例题:完善猜数游戏。例题:完善猜数游戏。定义定义s1,s2,cs=0,flag=0;s1=1+rand()%(100-1+1)css1太大太大太小太小真真假假flag=0游戏结束游戏结束n程序程序 while( cs s1 ) prin

20、tf(太大太大n); else printf(太小太小n); if( flag = 0 ) printf(游戏结束游戏结束n); 例题:完善猜数游戏。例题:完善猜数游戏。n程序程序(续续)思考:可否不用思考:可否不用break,修改程序使修改程序使之达到同样的效果之达到同样的效果? #include void main() double sc,s=0; int p=0; /人数人数 while( ) scanf(%lf,&sc); if(sc100) ; s+=sc; p+; printf(人数人数=%d,平均分平均分=%lfn,p,s/p); n要求:以要求:以负数作数作为输入入结束,大于束

21、,大于100为无效成无效成绩。n流程流程图n程序程序 问题:输入课程成绩求平均分问题:输入课程成绩求平均分continuebreak1 /恒真条件恒真条件11输入输入scscs=0, p=0s=s+sc,p+begin恒真恒真sc0sc100sc1001end输出输出s/ps/pbreak;continue;continue语句语句n语句形式句形式qcontinue ;n功能功能q强行行中止本中止本轮次循次循环,程序流程跳,程序流程跳转到到其所在循其所在循环语句句的的循循环条件判断(条件判断(for语句的表达式句的表达式3)处。条件条件continue;假假真真whilewhile循环循环co

22、ntinue;.条件条件假假真真do whiledo while循环循环表达式表达式2 2continue;.假假真真表达式表达式1 1表达式表达式3 3forfor循环循环第第4章章 循环结构程序设计循环结构程序设计主要内容主要内容用格里高利公式求用格里高利公式求的近似值的近似值统计一个整数的位数统计一个整数的位数判断素数判断素数求求1!+2!+100!循环结构程序设计循环结构程序设计问题:求问题:求1!+2!+100!n分析分析q累加求和累加求和,设和变量为设和变量为s,每次累加一项,则需要每次累加一项,则需要循环循环100次次, 设循环变量设循环变量i,每次累加值为,每次累加值为i !。

23、qi !可以通过调用求阶乘可以通过调用求阶乘函数函数fact()获得,也可以获得,也可以利用内嵌的循环得到。利用内嵌的循环得到。定义定义s = 0, i ;i=1i =100s = s + fact(i)i = i+1输出输出s的值的值#include double fact(int n); /阶乘函数声明阶乘函数声明void main( ) int i; double s=0; /因和值很大,宜采用因和值很大,宜采用double型型 n程序:程序: i=1;while( i = 100 ) s = s + fact(i) ; i+; printf(s=%lf!n, s );问题:求问题:求1

24、!+2!+100!double fact (int n) int i; double result = 1; for (i = 1; i = n; i+) result = result * i ; return result ; 能否将这段求能否将这段求阶乘程序移入阶乘程序移入main()#include void main( ) int i, j ; double s=0, result=1 ; i=1;while( i = 100 ) i+; printf(s=%lf!n, s );问题:求问题:求1!+2!+100!循环的嵌套循环的嵌套结构结构result=1;for( j=1; j=

25、i; j+) result=result * j;s = s + result ; 循环语句的嵌套循环语句的嵌套n概念:在一个概念:在一个循循环语句内句内又又完整包含完整包含另一个循另一个循环语句。句。n例如例如外外循循环环内循内循环环n执行方式外循环执行一次,外循环执行一次,内循环执行一轮内循环执行一轮。n输出出结果如下:果如下:例题:输出九九乘法表例题:输出九九乘法表第第i i行:显示行:显示i(i(行号行号),),显示显示i-1i-1个空数位,显示个空数位,显示10-i10-i个乘积值个乘积值n程序如下:程序如下:#include void main() int i,j; printf(

26、%4c,*); for(i=1;i10;i+) /显示列号示列号 printf(%4d,i); printf(n-n); for(i=1;i10;i+) printf(%4d,i); /显示行号示行号 for( ) /显示示i-1个空数位个空数位 printf(%4c,32); for( ) /显示示10-i个乘个乘积值 printf(%4d,i*j); printf(n);j=1; ji; j+j=i; j10; j+例题:输出九九乘法表例题:输出九九乘法表.当当i=5时时/换行换行第第4章章 循环结构程序设计循环结构程序设计主要内容主要内容用格里高利公式求用格里高利公式求的近似值的近似值统

27、计一个整数的位数统计一个整数的位数判断素数判断素数求求1!+2!+100!循环结构程序设计循环结构程序设计问题:输入一批学生的成绩,求最高分。问题:输入一批学生的成绩,求最高分。n如何求最高分?如何求最高分?q最大值求解只能通过最大值求解只能通过两两比较两两比较来实现。来实现。q设最大值为设最大值为max,每输入一个成绩,就拿它,每输入一个成绩,就拿它与与max比比较较,若,若比比max大大,就用该值,就用该值替换替换max。qmax的初始值怎么得到?的初始值怎么得到?n先单独输入一个成绩,将它赋给先单独输入一个成绩,将它赋给max。n因成绩为非负值,可设因成绩为非负值,可设 max= -1。

28、n如何控制循环的次数?如何控制循环的次数?q输入学生人数,用人数控制循环的次数。输入学生人数,用人数控制循环的次数。q以输入负值作为循环结束的判断条件。以输入负值作为循环结束的判断条件。#include void main() int i, mark, max, n; scanf (%d, &n); /输入班级人数输入班级人数 scanf (%d, &mark); /读入第一个成绩读入第一个成绩 max = mark; /假设第一个成绩是最高分假设第一个成绩是最高分 for ( i = 1; i n; i+ ) /循环读入循环读入n-1份成绩份成绩 scanf (%d, &mark); if

29、(max mark) max = mark; printf(Max = %dn, max);n程序程序1:循环次数已知循环次数已知常用常用for语句语句问题:输入一批学生的成绩,求最高问题:输入一批学生的成绩,求最高分。分。#include void main() int mark, max; scanf (%d, &mark); /读入第一个成绩读入第一个成绩 max = mark; /假设第一个成绩是最高分假设第一个成绩是最高分 while( mark=0 ) /当成绩非负时继续循环当成绩非负时继续循环 if (max mark) max = mark; scanf (%d, &mark)

30、; /输入一个成绩输入一个成绩 printf(Max = %dn, max);n程序程序2:循环次数未知循环次数未知进入循环条件明确进入循环条件明确常用常用while语句语句问题:输入一批学生的成绩,求最高问题:输入一批学生的成绩,求最高分。分。#include void main() int mark, max; max = -1; /设设max为一不可能的值为一不可能的值 do /mark值不确定值不确定 scanf (%d, &mark); /输入一个成绩输入一个成绩 if (mark max) max = mark; while( mark=0 ); printf(Max = %dn,

31、 max);n程序程序3:循环次数未知循环次数未知进入循环条件不明确进入循环条件不明确常用常用dowhile语句语句问题:输入一批学生的成绩,求最高问题:输入一批学生的成绩,求最高分。分。#include #include void main() int k, i, s=0; for(i=100; i=200; i+) for(k=2; k=sqrt(i); k+) if ( i%k =0 ) ; if ( ) s+=i; printf(s=%dn,s); 例题:求例题:求100-200之间所有素数的和值。之间所有素数的和值。n流程流程图:s=0,i=100i=200显示显示s si=i+1验

32、证当前的验证当前的i i是否是否为素数,若是,为素数,若是,则将其累加至则将其累加至s sk=2ksqrt(i)假假真真s=s+in程序如下程序如下:breakksqrt(i)math.h思考思考: :求求100100以内最以内最大的大的1010个素数的和个素数的和. .例题:输出斐波纳契例题:输出斐波纳契(Fibonacci)数列前数列前30项项nFibonacci数列数列规律律q第第1、2项都都为1,从第,从第3项起,每一起,每一项都是前两都是前两项的和。的和。n要求要求q一行一行输出出6项 例题:输出斐波纳契例题:输出斐波纳契(Fibonacci)数列前数列前30项项n方法:方法:递推法

33、(迭代法)。推法(迭代法)。例题:输出斐波纳契例题:输出斐波纳契(Fibonacci)数列前数列前30项项n求解求解过程程 +abnext 第第5项项+abnext 第第3项项abnext 第第4项项abnext 第第6项项+ 112812323535规律规律? next=a+b;a=b; b=next;: #include void main( ) int i,a,b,next; n程序程序for ( ; i= 30; i+) /输出后面输出后面2828项项 next=a+b; printf(%10d,next); /输出第输出第i i项项 if ( %6=0 ) /输出换行符输出换行符 p

34、rintf(n); 例题:输出斐波纳契例题:输出斐波纳契(Fibonacci)数列前数列前30项项a=b=1;printf(%10d%10d,a,b); /输出前两项输出前两项 i=3in流程图流程图a=1,b=1输出输出a,bi=3next=a+b输出输出nexti=30i=i+1a=b;b=next;a=b,b=nexti%6=0真真假假输出换行输出换行例题:输出斐波纳契例题:输出斐波纳契(Fibonacci)数列的数列的第第30项项n程序如下:程序如下:#include void main( ) int i,a,b; a=b=1; for(i=1 ; i ; i+) a=a+b; /i=

35、1,计算第算第3、4项,仅需循需循环14次次 b=a+b; printf(NO30:%dn, ); 15 b 例题:求正整数的逆序数。例题:求正整数的逆序数。n分析分析q从整数的低位向高位,从整数的低位向高位,依次取出每个数位,将依次取出每个数位,将这些数位重新组合得到这些数位重新组合得到其逆序数。其逆序数。q123=(1*10+2)*10+3q逆序逆序= (3*10+2)*10+1定义定义nxs = 0, n, gw;输入输入nn != 0gw = n % 10n = n / 10输出输出nxsnxs = nxs*10+gw#include void main() int n, nxs=0,

36、 gw; scanf (%d, &n); printf(逆序数逆序数 = %dn, nxs);n程序:程序:例题:求正整数的逆序数。例题:求正整数的逆序数。 while( n ) gw = n%10; nxs = nxs*10 + gw; n = n / 10; 例题:百钱百鸡问题求解例题:百钱百鸡问题求解n问题:公:公鸡5钱一只一只,母母鸡3钱一只一只,小小鸡1钱3只只,问100钱买100鸡,几何几何? n算法:算法:穷举法法q公公鸡(x):0-20只只q母母鸡(y):0-33只只q小小鸡(z):0-100只只 x+y+z=1005*x+3*y+z/3 =100n程序程序1: #includ

37、e void main() int x,y,z; for(x=0;x=20;x+) for(y=0;y=33;y+) for(z=0;z=100; ) if( x+y+z =100 & 5*x+3*y+z/3 = 100) printf(x=%2d, y=%2d, z=%2dn,x,y,z);例题:百钱百鸡问题例题:百钱百鸡问题z+=3n程序程序2:#include void main() int x,y,z; for(x=0;x=20;x+) for(y=0;y=33;y+) 例题:百钱百鸡问题例题:百钱百鸡问题 z=100-x-y; if( ) printf(x=%2d, y=%2d, z=%2dn,x,y,z); #include fabs(5*x+3*y+z/3.0-100)1e-6例题:打印菱形例题:打印菱形main()int i,j,k; for(i=1;i=4;i+) / i控制行控制行for(j=1;j=4-i;j+) / j控制第控制第i行的空格数行的空格数printf( ); for(j=1;j0;i-) for(j=1;j=4-i;j+) printf( ); for(j=1;j2*i;j+) printf(*); printf(n); 课后作业课后作业n阅读第第4章;章;n课后后习题题4 (2、5、6、9);n预习第第5章。章。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号