C语言程序设计 第四章 循环语句和转移语句_第1页
C语言程序设计 第四章 循环语句和转移语句_第2页
C语言程序设计 第四章 循环语句和转移语句_第3页
C语言程序设计 第四章 循环语句和转移语句_第4页
C语言程序设计 第四章 循环语句和转移语句_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4 4章章 循环语句和转移语句循环语句和转移语句4.1 for循环循环4.2 while循环循环4.3 do-while循环循环 4.4 跳转语句跳转语句4.5 循环的嵌套循环的嵌套4.6 程序设计举例程序设计举例4.1 for循环循环循环循环: 就是有规律地重复执行某些语句的过程。 例如:要计算0到360度的正弦函数,要求每隔0.1度计算一次,如果没有循环结构,则: . x=0.0; y=sin(x); printf(“y=%f”,y); x=0.1; y=sin(x*3.14159/180.0); printf(“y=%f”,y); 对于如此简单的问题,需要10000多条语句。 循环结

2、构来处理重复计算的问题。对于上述问题可以用以下程序:for(i=0;i=3600;i+) x=i*3.14159/180.00; y=sin(x); printf(“y=%f”,y); 显然,这段程序简洁易懂。显然,这段程序简洁易懂。4.1 for4.1 for循环循环for语句的一般格式为: for(表达式1;表达式2;表达式3) 语句表达式1用于循环赋初始值,它只能执行一次;表达式2是循环条件;表达式3用于对循环条件的修改,以使循环能于结束。求解表达式求解表达式1表达式表达式2语句语句求解表达式求解表达式3for循环下面的语句循环下面的语句非非00例1:求从1加到100的程序。#inclu

3、de void main() int s,i; s=0; for(i=1;i=100;i+) s=s+i; printf(sum=%d,s); 循环体!结果:sum=5050for语句-范例 #include void main(void ) int i,n; long fact=1; printf(please input n:); scanf(%d,&n); for(i=1;i=n;i+) fact*=i; printf(%d!=%ld,n,fact);例例2:求求n!对对forfor语句作几点说明:语句作几点说明:(1)可以将表达式1放到for语句之前,在for语句内缺省表达式1。 例如

4、: s=0,i=1; for(; i=100; i+) s=s+i;对对forfor语句作几点说明:语句作几点说明:(2)表达式2如果缺省(分号不能缺省),相当于表达式2永远为非0(“真”),从而循环无终止地进行下去。 例如: s=0; for(i=1; ;i+) s=s+i;(3)可以把表达式3改为表达式语句移到循环体的尾部,作为循环体的一部分。 例如: s=0; for(i=1;i=100;) s=s+i; i+; 对对for语句作几点说明语句作几点说明:对对for语句作几点说明:语句作几点说明:(4)可以把与循环控制变量无关的循环初始化操作放入表达式1中,也可以把循 环体中与循环变量无关

5、的操作放到表达式3中。 例如: for(s=0,i=1;i=100;i+) s=s+i; 其中,s=0,i=1是逗号表达式。对对for语句作几点说明语句作几点说明:(5)如果循环体中没有任何语句,则应该加一个分号。 例如: s=0; for(i=1; i=100; s=s+i, i+) ; ;此分号不能少!例例3: 求一个等差数列前求一个等差数列前n项的和:项的和: ai+1-ai=d (i=1,2,3)分析:分析:1 输入输入n、d和等差数列的第一个数和等差数列的第一个数a的取值。的取值。 2 sum 、i的初值置的初值置0 3 a+sumsum 4 计算数列中下一个数的取值计算数列中下一个

6、数的取值 a+da 5 i+1i 6 重复重复3、4、5步直到步直到i大于大于n 7 输出结果输出结果nfor语句-范例#include void main(void) int a , d , n , i ; int ai , sum=0 ; printf(“input a=?td=?tn=?n”) ; scanf(“%d%d%d”, &a,&d,&n) ; ai=a; for(i=1; i=n ; i+) sum+=ai ; ai+=d ; printf(“sum=%dn” , sum) ;例例4 求求Fibonacci数列数列1,1,2,3,5,8 的前的前30个数个数F1=1 F2=1

7、Fn=Fn-1+Fn-22=1+1 3=1+25=2+3 8=3+5在一次循环中计算两项,递推公式为:在一次循环中计算两项,递推公式为:F1=1 F2=1 (初值)(初值)F1=F1+F2F2=F2+F1 #include void main( ) long int f1, f2; int i, n; printf (“ Input n:”); scanf (“ %d”, &n); f1=f2=1; for (i=1;i=n;i+) printf(“%ldt%ldn”,f1,f2); f1=f1+f2; f2=f2+f1; 练习:练习: 已知已知a1=10,a2=-3、an=3an-1+an-

8、2,求,求an前前10项之和。项之和。分析:从第分析:从第3项起都可以根据公式求出,可项起都可以根据公式求出,可设变量设变量x表示当前项,表示当前项,sum表示和,通过表示和,通过8次循环,求出第次循环,求出第3项到第项到第10项当前项的项当前项的值,并累加到值,并累加到sum中。中。#include void main(void) int a1=10,a2=-3,i,x,sum; sum=a1+a2; for(i=3;i=10;i+) x=3*a2+a1; sum+=x; a1=a2; a2=x; printf(前前10项和项和=%dn,sum); 例5 利用公式计算ex=1+x/1!+x2

9、/2!+x3/3!+xn/n!对于求级数的和,常用两类方法:1)通项公式法t0=1 ti=xi/i! (i=1,2,.n)2)递推公式法t0=1 ti= ti-1 .x/i (i=1,2,n)对于本题使用递推公式法计算量要小。程序如下: #include void main(void) int i,n; double t,x,ex; ex=1.0; t=1.0; printf(“Enter value of n,x:”); scanf(“%d%lf”,&n,&x); for (i=1;in;i+) t*=x/i; ex+=t; printf(“exp(%f)=%lfn”,x,ex); 例6 求

10、10个大于0小于100的数中的最大数和最小数置初值的方法一般有两种:1)极值法:取有界数据的上界作为最小值的初值,取有界数据的下界作为最大的初值2)成员法:取一批数据的第一个数作为最大值和最小值的初值。本程序采用极值法#include void main( ) int a, i, max, min; max=0; min=100; for (i=1;i=10;i+) scanf(“%d”, &a); if (maxa) min=a; printf(“Max=%d,Min=%dn”,max,min); for语句的特点:语句的特点:1、使用了三个表达式、使用了三个表达式2、循环控制变量可以在循环

11、体内使用,也可、循环控制变量可以在循环体内使用,也可以不使用,仅用来控制循环次数以不使用,仅用来控制循环次数3、从正常出口离开循环时,循环控制变量会、从正常出口离开循环时,循环控制变量会超过终值超过终值4.2 while4.2 while循环循环whilewhile语句的一般格式为:语句的一般格式为: while(while(表达式表达式) ) 语句语句whilewhile语句的执行过程为:语句的执行过程为: (1)(1)计算并判断表达式的值。若值为计算并判断表达式的值。若值为0 0,则结束,则结束循环,退出循环,退出whilewhile语句;若值为非语句;若值为非0 0,则执行循,则执行循环

12、体。环体。 (2)(2)转步骤转步骤(1)(1)。while语句的执行过程语句的执行过程 执行过程: 计算表达式并判断循 环 体=0非0 #include void main(void) int a = 1, sum = 0; while(a = 100) sum += a; a+; printf(%d, sum); while语句语句-范例范例 100例例1:求求 n n=1注意注意“边界值边界值”的选择的选择!应有使循环趋于应有使循环趋于结束的语句!结束的语句! 例例2 2 利用辗转相除法,求两个正整数的最大公约数利用辗转相除法,求两个正整数的最大公约数算法:算法: (1 1) 若若j=0

13、j=0,则,则i i为最大公约数为最大公约数 (2 2) 若若j j不为不为0 0 将将i i除以除以j j,余数为,余数为k k i=j i=j;j=kj=k 转(转(1 1) #include void main() int i, j, temp; printf(“Enter 2 integers:”); scanf(“%d%d”,&i,&j); while( j ) temp=i%j; i=j; j=temp; printf(“Gcd=%dn”,i); 例例3 将键盘输入复制到屏幕,直到按下一个回车将键盘输入复制到屏幕,直到按下一个回车键为止键为止.#include void main(

14、 ) char c; c=getchar( ); while(c!=n) putchar( c ); c=getchar( ); while语句的特点:语句的特点: 1、循环一般由条件控制、循环一般由条件控制 2、在循环体内至少有一条语句能对循环、在循环体内至少有一条语句能对循环条件产生影响,以防止死循环条件产生影响,以防止死循环 while语句练习练习练习:输入一批整数,以输入一批整数,以0为结束,输出其中的为结束,输出其中的最大值。最大值。分析:采用分析:采用“打擂台打擂台”的方法,即两两相比,的方法,即两两相比,大大 者留下,当所有数比完时留下的那个数者留下,当所有数比完时留下的那个数

15、为最大。程序用一个变量为最大。程序用一个变量max保存(留保存(留 下)每两两相比中大的那个数。下)每两两相比中大的那个数。 #include void main(void)int x,max;printf(“请输入数字,输入请输入数字,输入0结束结束:n);scanf(%d,&x);max=x;while(x)scanf(%d,&x);if(maxx) max=x;printf(max=%dn,max);1、功能:、功能:do-while语句一般完成直到型循环,语句一般完成直到型循环,2、格式为:、格式为:do 语句块语句块while(表达式)(表达式);3、do-while语句控制流程为:

16、先执行一次循环体内的语句,然语句控制流程为:先执行一次循环体内的语句,然后再求判终表达式的值,若判终表达式的值为后再求判终表达式的值,若判终表达式的值为“非非0”,则重,则重复执行循环体,否则当表达式的值为复执行循环体,否则当表达式的值为“0”时,循环结束。时,循环结束。4.3 do-while4.3 do-while循环循环 执行过程: 计算表达式并判断循 环 体=0非0#include void main(void) int i,sum=0; i=1; dosum=sum+i; i+; while(i=100); printf(“%d”,sum);do-while语句-范例 100例例1:

17、求求 n n=1无论表达式的值无论表达式的值是多少,循环体是多少,循环体至少执行一次!至少执行一次! 例例2 从键盘输入一个字符,判别其是否为大从键盘输入一个字符,判别其是否为大写字母,如果是,则将其转换为小写字母并写字母,如果是,则将其转换为小写字母并输出;否则不转换,不输出;并提示是否继输出;否则不转换,不输出;并提示是否继续输入(按续输入(按y继续)。继续)。#include #include void main() char ch, answer; do printf(“Enter a letter:”); ch=getchar( ); if(isupper(ch) printf(“%

18、c”,ch+a-A); getchar( ); printf(“ndo you want to try again?(y/other letter)”); answer=getchar( ); getchar( ); while (answer=Y | answer=y);do-whiledo-while语句与语句与whilewhile语句的本质区别语句的本质区别nwhilewhile语句是先计算并判断表达式的值。若其语句是先计算并判断表达式的值。若其值为非值为非 0 0,则执行循环体;若其值为,则执行循环体;若其值为0 0,则退,则退出循环。出循环。ndo-whiledo-while语句则首

19、先执行循环体,然后再计算语句则首先执行循环体,然后再计算并判断表并判断表 达式的值。因此,达式的值。因此,do-whiledo-while语句语句至至少要执行一次循环体少要执行一次循环体。4.4 跳转语句跳转语句1_break语句语句 1. break语句的功能:用于从循环体内跳出循环体,语句的功能:用于从循环体内跳出循环体,即即提前结束提前结束循环。循环。2.使用要点:使用要点:break只能用在只能用在循环语句循环语句和和switch语句语句中中.for(r=1;r100) break; printf(“%f”,area); break语句语句-范例范例例例1:计算计算r=1到到r=10的

20、圆面积的圆面积,当面积大于当面积大于100时结束循环时结束循环.break语句语句-范例范例break语句例语句例2: 某银行利息某银行利息2.8%(以复利计)。假设以复利计)。假设某储户存入本金某储户存入本金8000元,当满足以下条件之一,储元,当满足以下条件之一,储户从银行将钱取出。户从银行将钱取出。 (1)储蓄满)储蓄满10年年 (2)连本带息超过)连本带息超过10000元元 编程求储户会在第几年将钱取出,取出时连本带息编程求储户会在第几年将钱取出,取出时连本带息是多少?是多少?#include void main(void) int year; float money=8000; fo

21、r(year=1;year10000) break; printf(“%d year %fn”,year,money);break语句例语句例3: 百鸡问题:一只公鸡百鸡问题:一只公鸡5元钱,一只母元钱,一只母鸡鸡3元钱,三只小鸡元钱,三只小鸡1元钱,现有元钱,现有100元钱,要买元钱,要买100只鸡,是否可以?要求三种鸡都有。只鸡,是否可以?要求三种鸡都有。分析:设公鸡、母鸡、小鸡各分析:设公鸡、母鸡、小鸡各x、y、z只,则可知只,则可知z=100-x-y,且,且 5x+3y+z/3=100 break语句语句-范例范例#include void main(void) int x,y,z;

22、for(x=1;x20;x+) for(y=1;y34;y+) z=100-x-y; if(z%3=0)&(5*x+3*y+z/3)=100) break; if(y34) printf(“cook=%d hen=%d chicken=%dn”,x,y,z); printf(“this is one solution.n”); break; 4.4 跳转语句跳转语句2_ continue语句语句1、功能、功能:结束本次循环结束本次循环,接着判定下一次是否执行循环。接着判定下一次是否执行循环。2、continue与与break的区别的区别:continue只结束本次循环只结束本次循环,而不是终止

23、整个循环。而而不是终止整个循环。而break终止本层循环,不再会去判断执行循环体的终止本层循环,不再会去判断执行循环体的条件是否成立。条件是否成立。 例:把例:把100200之间的不能被之间的不能被3整除的数输出整除的数输出.#include void main(void) int n; for(n=100;n=200;n+) if (n%3=0) continue; printf(“%d”,n); 4.4 4.4 跳转语句跳转语句3 goto3 goto语句语句gotogoto语句用于将控制转到标号所指定的语句去执行。语句用于将控制转到标号所指定的语句去执行。 它的一般格式为:它的一般格式为

24、: 或或: goto 标号;标号; 标号:语句标号:语句标号:语句标号:语句goto 标号;标号; 例:例: 100 #include 求求 n void main( ) n=1 int i,sum=0; i=1;运行结果为运行结果为:5050 loop :if (i=100) sum=sum+i; i+; goto loop; printf(“%d”,sum); 说明:说明:目前目前goto语句很少使用语句很少使用,过多的使用过多的使用goto语语句会降低程序的可读性。句会降低程序的可读性。4.5 4.5 循环的嵌套循环的嵌套多重循环多重循环: : 嵌套多层循环结构的循环。嵌套多层循环结构的

25、循环。外循环:外循环: 处于外层的循环称为外循环。处于外层的循环称为外循环。内循环内循环: 处于内层的循环称为内循环。处于内层的循环称为内循环。#include void main(void) int i,j;for(i=1;i=3;i+)for(j=1;j=8;j+)putchar(*);printf(n);例例 输出图形输出图形 * * *例例: : 编写一个编写一个九九乘法表九九乘法表的程序的程序分析:九九乘分析:九九乘法表分法表分9 9行行, ,第第i i行共行共i i个小项。个小项。i i* *j j i=1,2,9i=1,2,9j=1,2,ij=1,2,i#include void

26、 main(void) int i,j; for(i=1;i=9;i+) for(j=1;j=i;j+)printf(“%1d*%1d=%-4d”,i,j,i*j); printf(“n”); 例例 输出下面图案输出下面图案 ABCDE BCDE CDE DE E #include void main() int i; char ch; for(i=0;i5;i+) for(ch=A+i;chA+5;ch+) printf(“%c”,ch); printf(“n”); 例例 求求1M1M之间的全部素数之间的全部素数( (素数是除素数是除1 1和本身以和本身以外不能被其他自然数整除的自然数外不能

27、被其他自然数整除的自然数) )#include #include void main() int n,m,i,j,l=0; scanf(“%d”,&m); for (n=2;n=m;n+) i=sqrt(n); for (j=2;j=i+1) if (l5) printf(“%dt”,n); l+; else printf(“%dn”,n); l=0; 应用举例应用举例应用例应用例1:输入一行字符,分别统计其中字母、空格、输入一行字符,分别统计其中字母、空格、数字及其他字符的个数。数字及其他字符的个数。分析:分析: 1 读入一个字符到变量读入一个字符到变量c 2 判断判断c是哪一类,再给相应计数的变量加是哪一类,再给相应计数的变量加1 3 重复重复1、2直到直到c等于等于n#include void main(void) int letter=0,space=0,digit=0,other=0; char c; while(c=getchar( )!=n)if(c=a&c=A&c=0&c=9) digit+; else other+; printf(“letter=%d,space=%d,digit=%d,other=%dn”,letter, space,digi

温馨提示

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

评论

0/150

提交评论