c语言程序设计(三章11.30).ppt

上传人:小飞机 文档编号:6503977 上传时间:2023-11-07 格式:PPT 页数:98 大小:278KB
返回 下载 相关 举报
c语言程序设计(三章11.30).ppt_第1页
第1页 / 共98页
c语言程序设计(三章11.30).ppt_第2页
第2页 / 共98页
c语言程序设计(三章11.30).ppt_第3页
第3页 / 共98页
c语言程序设计(三章11.30).ppt_第4页
第4页 / 共98页
c语言程序设计(三章11.30).ppt_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《c语言程序设计(三章11.30).ppt》由会员分享,可在线阅读,更多相关《c语言程序设计(三章11.30).ppt(98页珍藏版)》请在三一办公上搜索。

1、第三章控制结构,重点:1、单分支和双分支if语句的基本用法。2、If语句的嵌套使用。3、Switch语句的基本用法。4、while、do-while语句的基本用法。5、for 语句的使用。6、循环的嵌套。7、学会分析循环的程序段。,3.1 c语句概述,五类语句:1)控制语句If-else switch for while do-while continuebreak goto return2)表达式语句 在各种表达式后加一个分号;,即构成了表达式语句。其中最常见的是由赋值表达式加上分号构成的赋值语句。表达式语句是C中最简单的语句,在C中表达式语句的表达能力很强,使用也很方便。,例:int a,

2、b,c,d,sum;a=b+c*d;c+;sum=a+b+;3)函数调用语句通常函数调用语句作为表达式语句的一部分,因此函数调用语句可并入表达式语句.例:a=max(a,b,c);printf(“%d%on”,x,y+8);4)空语句 只有一个;的语句叫空语句,是表达式语句的特例,该语句不做任何事情。,5)复合语句 用一对花括号 括起来的一段程序即为一个复合语句。复合语句又称分程序(非子程序)。格式:变量定义/说明部分;/可有可无,任选 执行语句部分;【注】复合语句可以用在C语言的任何地方,C规定:凡能使用简单语句的地方都可以使用复合语句。花括号 必须配对使用。花括号 允许嵌套。即执行语句可以

3、是简单语句或内嵌的复合语句。,内定义的变量一般来说是局部变量,局部变量只在 范围内有效,换句话说,离开 范围就不可能再引用到它。若外面有引用该变量的语句,那肯定是引用的另一个在 外定义的同名变量。5 复合语句经常会出现在条件语句的if子句、else子句中,或循环体中,既当满足某条件后要执行的语句不止一条时,可使用复合语句把多条语句括起来。,#include“math.h”#include“stdio.h”main()int a=100,b,c;scanf(“%d”,printf(“A2=%dn”,a);getchar();,3.2 if 条件语句 C语言程序设计使用的是结构化程序设计方法,通常

4、有三种基本结构:顺序结构、选择结构、循环结构。在实际编程中经常要根据不同的条件来选择的不同的执行路径,因此仅仅依靠顺序结构是不够的,此时就需要用到c语言中的选择结构。,3.2.1 if 结构(单分支形式)选择结构是根据不同条件来选择不同分支执行的一种程序结构,其中又分为单分支、双分支、多分支三种形式。格式:if(表达 式E)语句S;功能:测试表达式的值,若为真(0),则执行语句S;否则(=0,假),跳过语句S继续执行。,表达式E为真?,执行语句S,if 语句出口,if语句入口,T,F,【注】语句S可为简单语句,亦可为复合语句。表达式E为任何表达式,运算结果0,表示结果 为真,否则为假。测试“相

5、等关系”,应当使用“=”运算符。而不能 误用赋值号“=”。表达式E要用圆括号()扩起来。if 语句允许嵌套。,例:输入年龄,判断如果有岁,则输出相应提示int age;printf(“Please input your age!n”);scanf(“%d”,观察程序,(age=85),age=85,#includevoid main()float r;printf(“Input r:”);scanf(“%f”,【例】从键盘输入圆的半径,若半径小于等于0,则不进行计算;否则计算圆面积。,#includevoid main()float r;printf(“Input r:”);scanf(“%f

6、”,【例】从键盘输入圆的半径,若半径为10,则计算圆的面积;若半径为20,则计算圆周长,否则不进行计算。,#includevoid main()float a,b,temp;printf(“Input a,b:”);scanf(“%f,%f”,【例】输入2个实数,按由大到小的顺序输出这2个数。,if(ab)printf(“%f,%f”,a,b);If(ab)printf(“%f,%f”,b,a);,#includevoid main()float a,b,temp;printf(“Input a,b:”);scanf(“%f,%f”,【例】输入2个实数,按由大到小的顺序输出这2个数。,3.2.

7、2 if-else 结构(双分支形式)格式:if(表达 式E)语句S1;else 语句S2;功能:测试表达式的值,若为真(0),则执行语句S1;否则,执行语句S2。【注】语句S1、S2可以为简单/复合语句。if-else主要用于“非此即彼”的情况。,T,F,【例】已知三角形的三条边,求三角形的面积。,#include#include void main()float a,b,c,area;scanf(“%f%f%f”,3.2.3 if-else if 结构(else 中内嵌if-else的多分支结构)格式:if(表达 式1)语句1;else if(表达 式2)语句2;else if(表达 式3

8、)语句3;else 语句n;等价形式:if(表达 式1)语句1;else if(表达 式2)语句2;else if(表达 式n)语句n;else 语句n;,语句n,语句n,语句2,语句1,非0,非0,非0,0,0,0,后继语句,输入一个x的值,求下列相应的y的值。(书 55页),#include void main()float x,y;scanf(“%f”,y=0(x=0),-1(x0),1(x0),【例】从键盘输入字符,若为数字,显示“D”;若为大写字母,显示“U”;若为小写字母数字,显示“L”;若为标点符号,显示“P”。#include#include void main()char c

9、h;scanf(“%c”,if(isdigit(c),if(isupper(c),if(islower(c),3.2.4 条件语句的嵌套条件语句的嵌套就是在if语句中包含另一个if语句。所包含的语句可以是一个简单语句或一个复合语句,也可以是另一个if语句,即内嵌if语句。例:判断一个正数是奇数还是偶数。if(i0)if(i%2=0)printf(“positive and evenn”);else printf(“positive and oddn”);,C语言中正确判断内部嵌套结构的规定:1)else与前面最近(未曾配对)的if配对。例:2)如果想改变已有的配对关系,可通过加减花括号的方法实

10、现。一般说来,内嵌在if关键字后的if嵌套结构才被认为是真正的if嵌套结构.,if(ab)if(ac)y=1;else y=2;else if(bc)y=3;else y=4;,【例】编程,若一个整数为正数且是偶数,输出提示“Positive&even”,若为负数,则输出“Not positive”。,#include void main()int n;printf(“n=”);scanf(“%d”,#include void main()int n;printf(“n=”);scanf(“%d”,阅读程序,对if语句的判断条件作注释。,include void main()int a,b;s

11、canf(“%d%d”,else,if(b=10)y=a+b;else y=a-b;printf(“%d”,y);,3.3 switch 语句 用if-else-if语句,可以解决多路分支选择问题,但不方便。而且程序冗长,可读性低。为此,C语言提供了另一种多路选择控制结构,这种多路选择控制结构取决于一个表达式的值,即switch语句。1.基本形式:switch(表达式E)case 常量表达式1:语句块1;break;case 常量表达式2:语句块2;break;case 常量表达式n:语句块n;break;default:语句块n+1;break;,不用break语句的形式 switch(表达

12、式E)case 常量表达式1:语句1;case 常量表达式2:语句2;case 常量表达式n:语句n;default:语句n+1;,2.功能:先计算表达式E的值,将结果与各常量表达式i 逐个进行比较,若有与表达式E值相等的case存在,则从该case处执行。若无匹配的常量表达式,而有缺省的case(default)存在,则从缺省case处执行,若无default,则不执行switch花括号内的任何语句,此时switch相当于空语句。,3.流程示意图:使用break语句的形式,总共n+1个入口,一旦选择某个入口,并执行完对应语句块后就退出switch语句。因此default语句(或者最后一条语句

13、)前的每个case语句无固定顺序,可随意摆放。(因为除了最后一条语句以外都有break语句。),不用break语句的形式,同样是n+1个入口,一旦选择某个入口,并执行完对应语句块后将继续往下执行,直到执行语句n+1后,再退出switch语句。因此,每个case顺序不同,则执行结构可能不同。,【应用说明】适用范围:适合于根据表达式的离散值分别执行不同的操作。特点:表达式的值是一些离散值,对于连续值,要与if.else.结合。如:if(x0)value=1;else if(x0时 操作1 case-1:.;break;/当x0时 操作2 case 0:./当x=0时 操作3,switch语句后必须

14、跟有花括号。switch(表达式)中表达式通常是一个整型或字符型。注意:表达式及常量表达式的类型要一致。case 常量表达式:实际上是语句标号,即仅仅起标号作用,一旦该常量表达式的值与switch表达式的值满足匹配,流程转至该标号对应的语句执行。,在没遇到break语句时,将继续执行下面的语句,而不再去判断是否与其它的case相匹配。换句话说,case 常量表达式:不是条件判断。整个switch语句只匹配一次。因此,若用户程序想实现按分类不同完成不同的事务时,就必须在完成不同事务之后加上一句:“break;”,该语句就控制程序跳出整个switch语句。switch语句中最后一个分支(case分

15、支或者default分支)可以不加“break;”。【注】default分支可以出现在任一个case分支中间,这种情况下default语句后要加break,但是它实际上等效于最后部分。,各种case/default下执行的语句块可以为一条语句或多条语句。因语句块前有case语句,后有break语句,故可不使用 包围子语句。常量表达式:只能出现常量,不能有变量或函数调用,也就是说,常量表达式是一个不具二义性的表达式,下面的示例是错的。switch(x)case x0:.;break;/当x0时 操作1 case x0:.;break;/当x0时 操作2 default:.;/当x=0时 操作3另

16、外,常量表达式的值应互不相同,否则会出现矛盾。,在switch语句中,允许多种情况下执行相同的操 作,如:case a:case b:case c:printf(“right!n”);break;default:printf(“error!n”);【常见错误】case和常量表达式之间忘记空格。,#include“stdio.h”main()char grade;printf(“enter grade:n”);grade=getchar();switch(grade)case A:printf(“85100n”);case B:printf(“7084n”);case C:printf(“606

17、9n”);case D:printf(“60n”);default:printf(“error!n”);,break;break;break;break;,例:按照考试成绩的等级打印出百分制分数段。,【例】输入年、月,判断该月有几天并输出。【分析】第一层算法:1.输入year,month;2.计算days;3.输出year,month,days。,第二层细化:根据month值求days。1,3,5,7,8,10,12:days=31 4,6,9,11:days=30 2:有闰年问题 if(year=闰年)days=29 else days=28,第三层细化:闰年可由如下逻辑表达式进行判别int

18、 year;(year%4=0)&(year%100!=0)|(year%400=0)(能被4整除 而且 不能被100整除)或者 能被400整除,#include void main(void)int year,month,days;printf(Input year,month:);scanf(%d%d,case 4:case 6:case 9:,case 11:days=30;break;case2:if(year%4=0),从键盘先输入两个实数,在输入四则运算符+、-、*、/中的一个,然后进行四则运算。若输入其他字符,则显示出错信息。,#include void main()float

19、a,b;char optor;printf(“input value of a,b:”);scanf(“%f%f”,switch(optor)case+:printf(“%f+%f=%fn”,a,b,a+b);break;case-:printf(“%f-%f=%fn”,a,b,a-b);break;case*:printf(“%f*%f=%fn”,a,b,a*b);break;case/:if(b=0)printf(“adivided by 0!n”);else printf(“%f/%f=%fn”,a,b,a/b);break;default:printf(“a input error!”

20、);,书70页 例3.12,main()int c,s;float p,w,d,f;scanf(“%f,%f,%d”,case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(“freight=%15.4f”,f);,#include void main(void)int c,i;int n_white,n_other,n_digit10;n_white=n_other=0;for(i=0;i10;i+)

21、n_digiti=0;while(c=getchar()!=EOF)switch(c)case 0:case 1:case 2:case 3:.,case 9:n_digitc-0+;break;case:case n:case t:n_white+;break;default:n_other+;printf(”0-9=”);for(i=0;i10;i+)printf(“%d,”,n_digiti);printf(“nwhite space=%d,other=%dn”,n_white,n_other);,【例】写一个程序,对键盘输入的字符进行分类统计:对于数字分别列出各数字出现的次数,对空白类

22、字符(nt)统一统计,对其它字 符,全纳入另一类。,3.4 循环的概念,反复地执行某一段程序指令集 循环。在实际应用中都是有条件的循环。实际应用:数据的累加和累积:sum=1+2+3+1000 product=1*2*3*20 程序设计中,必须将数学概念的累加、累积进行转换。不能用简单的赋值语句来完成,而代替为:sum=0 i=1 sum+=i i+注意保存累加、累积值的变量的初始化。,product=1i=1product*=i i+,求极值问题:求一组数据的最大、最小值。方法:对该组数据逐个比较,始终保留相对较大或者较小的数。比如,在1、2、3100中找出最大的数。步骤:首先将maxnum

23、ber/minnumber初始化(一般选择将该组数中第一个数据赋值给maxnumber 或minnumber),然后用循环比较的方法,刷新 maxnumber C语言提供了3种循环结构:for,while,do-while,格式:while(表达式E)语句S;功能:运算表达式E,若其运算结果0(为真),则执行语句S,再次运算表达式E,若其运算结果仍0,再次执行语句S,反复进行,直至运算结果=0(为假),结束循环。,3.5 三种循环语句一、while 循环,【应用说明】while 后跟()。2 while中的表达式可为任意表达式,一般为关系或逻辑表达式。3 语句S可以为简单/复合语句,不能忘记。

24、4 while 先判断,后执行,也就是说,要执行循环,先判断表达式E真假。语句S可能一次也不执行。5 while(1)表示无穷循环。6 循环体中必须有使循环趋于结束的语句,如 i+。,main()int t;t=10;while(t=0)t-;printf(“t=%dn”,t);,main()int x;x=10;while(x0)printf(“x=%dn”,x);,请想想,该程序中循环的终止条件是什么,怎样实现的,输出结果是什么?,该程序会出现什么问题?,【例】求#include void main()int n=1,sum=0;,while(n=100)sum+=n;n+;printf(

25、“sum=%dn”,sum);,触发器,如果是求1100中的奇数之和呢?,【例】求从1开始。查找一个能同时满足条件:用3除余2;用5除余3;用7除余2的整数。#include void main()int i=1;while(!(i%3=2)n/(n+1)0(float)n/(n+1),例:将键盘输入复制到屏幕上,直到按下Enter键为止。,#include void main()char c;c=getchar();while(c!=n)putchar(c);c=getchar();,x=10;while(x!=0)x-;其循环条件是什么?退出循环时x=?,x=10;while(x)x-;其

26、循环条件是什么?退出循环时x=?,x=10;while(x-);其循环条件是什么?x+;退出循环时x=?,三种形式等价,二、do-while 循环,格式:do 语句S;while(表达式E);功能:先执行语句S,再运算表达式E,若其运算结果0(为真),则再次执行语句S,再运算表达式E,反复进行,直至运算结果=0(为假),结束循环。,.T.,.F.,【应用说明】表达式E的真假判断。语句S可以为简单/复合语句。do while 先执行,后判断,语句S至少执行一次。故写程序时,若不知重复执行次数,而第一次又必须执行时,即可采用do-while形式。dowhile(1)表示无穷循环。允许嵌套。whil

27、e 后必须跟()。,【例】求#include void main()int i=1,sum=0;,do sum+=i;i+;while(i=100);printf(“sum=%dn”,sum);,While和do while 的比较,main()int sum=0;scanf(“%d”,main()int sum=0;scanf(“%d”,求5!,main()int t=1,i=1;do t=t*i;i+;while(i=5);printf(“t=%d”,t);,改进1:求1!5!改进2:求1!+2!+5!,#include#define TRUE 1/宏定义#define FALSE 0vo

28、id main()int i=0,flag=FASLE;/flag是一个判别标志,初始值为FALSE表示没找到。do i+;/该句至少执行一次 if(i%3=2),【例】求从1开始。查找一个能同时满足条件:用3除余2;用5除余3;用7除余2的整数。,【例】求2个正整数 m,n 的最大公约数。(能够同时整除m,n的最大整数)【分析】对于这类问题,一般采用“辗转相除法”,又称欧几里德法。输入 m,n;以 m 除以 n,得余数 r(0rn);判断余数 r 是否为0,若=0,当前除数 n 即为最大公约数,结束。否则执行;r0,更新被除数和除数,被除数代以上次的除数,上次的余数变为除数,再次执行。,#i

29、nclude void main()int m,n,a,b,r;scanf(%d%d,do r=a%b;a=b;b=r;while(r!=0);printf(The greatest common divided of%d,%d is%dn,m,n,a);/最小公倍数=m*n/最大公约数,【例】.从键盘输入一个字符,判别其是否为大写字母,如果是则将其转换成小写字母并输出;否则,不转换且不输出。设计一个屏幕界面程序,提示用户要继续输入字符(按y键)还是结束(按其它键)。,#include#include void main()char ch,answer;do printf(“enter a l

30、etter:”);ch=getchar();if(isupper(ch)printf(“%c”,ch+a-A);,getchar();printf(“n do you want to do again?(Y/N)”);answer=getchar();getchar();while(answer=Y|answer=y);,三、for 循环,格式:for(表达式1;表达式2;表达式3)语句S;功能:先运算表达式1(赋初值),再运算表达式2,若其运算结果0(为真),则执行语句S,然后计算表达式3。并再次运算表达式2,若结果仍0,则再执行语句S,表达式3 直至表达式2运算结果=0(为假),结束循环。

31、,表达式2为真?,语句S,表达式3,.F.,表达式2,循环初始化,循环续停判断,循环体,循环计数器操作,.T.,【应用说明】三个表达式 表达式1:一般用于循环初始化,只执行一次,可省略,但“;”必须有。表达式2:用于循环续停条件判断,可省略,但“;”必须有。常用逻辑表达式、关系表达式、算术表达式甚至函数调用、赋值表达式来表示一个条件。表达式3:常用于循环计数器,或者更通俗地讲,表达式3提供了改变表达式2取值的操作环境(触发器),若表达式2的值始终不变,则一旦进入循环就有可能永远不能终止循环。表达式1、2、3 可以看作是初值、终值、步长,此时三个表达式都是对循环变量进行操作,C中循环变量可以是整

32、型以外的数据类型。,【例】for(x=0.3;x=5.0;x+=0.1)/置x初值=0.0,终值=5.0,每循环1次,步长/增加0.1,x为循环变量。若省略表达式1,则可以把表达式1放在for语句前面:x=0.3;for(;x=5.0;x+=0.1)语句;若省略表达式2,则循环无终止地运行(即认为表达式2 恒为真)for(n=1;+n)sum+=n;/n初值=1,每循环一次n+1,共循环无穷次,for(表达式1;表达式2;表达式3)语句;表达式1;表达式1只计算一次 while(表达式2)等价于while循环语句:语句;表达式3;,用while语句表示:n=1;while(1)sum+=n;+

33、n;,for(n=1;+n)sum+=n;,此时若要有条件终止循环,则须将循环终止条件嵌入循环体中,如:if(n=100)sum+=n;break;,若省略表达式3,没有更改循环终止条件的触发器,则我们必须把触发器插入到循环体中:for(i=1;i=100;)sum+=i;i+;若省略表达式1,3,只有表达式2,则完全等价于while语句:i=1;i=1;for(;i=100;)while(i=100)sum+=i;sum+=i;i+;i+;,若三个表达式全部省略for(;)语句;/while(1)语句;是无初值,无终止条件的无穷循环。语句S可以为简单/复合语句。表达式1只执行一次。表达式2、

34、3可能执行多次。(4)在for中,表达式1和3,可以是与循环控制条件(表达式2)有关的对循环变量的操作,也可以毫无关系:【例】for(i=1,sum=0;i=100;i+)sum+=i;,for的功能很强,可以将原本放在循环体内嵌语句中完成的操作,放在表达式3内完成(通过逗号运算符完成),如:for(i=1,sum=0;i=100;sum+=i,i+);考虑到表达式2、语句、表达式3的执行顺序,也可以把循环体语句插入到 表达式2中,但要注意,如插入到表达式2中,切不可用逗号运算符将循环体语句放在原表达式2的后面,如:for(i=0,sum=0;sum+=i,i100;i+);/正确for(i=

35、0,sum=0;i100,sum+=i;i+);/不正确,因为sum+=i的值将作为逻辑值来处理,可能影响正常的循环终止条件。,又如:for(;(c=getchar()!=n;)printf(“%c”,c);for(i=0;(c=getchar()!=n;i+=c);/取输入字符,并将输入字符ASCII码相加。(6)循环体可以是单语句,也可以是复合语句,或空语句。例:s=0;for(i=1;i=100;s=s+i,i+);,(7)允许嵌套。(8)表达式1、2、3分别是一个完全表达式,并且都有一个顺序点。区别:A.for(i=1;i+=100;)s=s+i;B.for(i=1;i=100;i+)

36、s=s+i;(9)for循环可用于循环次数确定的情况,也可用于循环次数不确定的情况。,两者的结果相同么?,【例】输出100200之间的能被3整除的整数。#include void main()int n;for(n=100;n=200;n+)if(n%3=0)printf(“%dn”,n);,【例】用公式求的近似值,直到最后一项的绝对值小于10-6为止。#include#include void main()int s;float n,t,pi;/注意:n不能为int 变量,否则s/n为0 t=n=1;pi=0;s=1;for(;fabs(t)=1e6;)pi+=t;n+=2;s=s;t=s/

37、n;/n是每一项的分母,s为分子 pi*=4;printf(“pi=%10.6fn”,pi);,例:求fibonacci数列前40个数,这个数列的特点如下:第一、二个数为1,1,从第三个数开始,该数是前面两个数之和。,分析:F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n1),main()long int f1,f2;int i;for(i=1;i=20;i+)printf(“%12ld,%12ld”,f1,f2);,if(i%2=0)printf(“n”);f1=f1+f2;f2=f1+f2;,【例】利用公式ex=1+x/1!+x2/2!+x3/3!+xn/n!+计算ex展开

38、式的前20 项之和的近似值。,include int i,n;double t,x,ex;ex=1.0;t=1.0;printf(“enter value of n,x:”);scanf(“%d%lf”,for(i=1;in;i+)t*=x/i;ex+=t;printf(“exp(%f)=%fn”,x,ex);,例:求10 个大于等于零、小于等于100的数中最大数和最小数。,算法的基本思想:设置一个最大(小)值变量,让它始终用于存放每次比较后的最大(小)值。然后用这个变量的值与要比较的数逐个进行比较,在比较时,如果发现这个最大(小)值变量的值比这个要比较的数小(大),则将这个数存放到最大(小)

39、值变量中,使该变量始终存放着一个所有已比较的数中的最大(小)值。,if(maxa)max=a;,for(i=1;i=10;i+)scanf(“%d”,法二:(成员法)#include void main()int a,i,max;scanf(“%d”,法一:(极值法)#include void main()int a,i,max;max=0;for(i=1;i=10;i+)scanf(“%d”,#include void main()int a,i,max,min;max=0;min=100;for(i=1;ia)min=a;printf(“max=%d,min=%dn”,max,min);,

40、改进:If(a100)|(aa)min=a;,四、循环控制语句1循环控制的含义 两种情况:中途终止整个循环 终止本轮循环(一轮指执行循环体一次),直 接进入下一轮。C语言提供的循环控制语句有break,continue两种。,2 break语句:格式:break;意义:它导致包含break语句的最内层的while,dowhile,for或switch语句的终止,将控制传递至被终止的循环或switch 语句的后一条语句,通过使用break 语句可不必等待循环条件起作用,而直接使循环退出或使switch 语句结束,这样做在很多情况下是十分必要的。在循环语句中,break语句常与if语句配合使用,当

41、条件成立之后就跳出循环体,提前结束循环。,【例】:判断任一个自然数m是否为素数。讨论:素数的定义是:除了1和其本身以外,不能被其它自然数整除的自然数。例如:2、3、5、7、11、13。都是自然数。根据定义,我们要判断一个自然数n是否为素数,可以用2n-1的每一个数去除n,若其中有一个数能整除n,则说明n不是素数,否则就是素数。这实际上就是一个循环过程,当循环变量从2n-1的变化过程中有找到一个能整除n的数,则提前退出循环,表示不用再循环下去,已经能证明n不是素数,此时循环变量的值必然小于n,而如果循环正常终止,则循环变量必然等于n。因此根据退出循环时循环变量的取值可以判断是否为素数。而实际上只

42、需判断2 之间有没有一个整数能整除n即可,这样可以减少循环次数。,#include#include void main()int n,i,k;scanf(“%d”,3.continue 语句格式:continue;含义:它使控制转至包含它的最内层的while,do_while或for循环的本轮循环的末尾,接着重新开始下一轮循环。换句话说,就是提前结束本轮循环,即当程序执行到continue语句时,将跳过循环体中后面还没有执行的语句,并到达循环体的末尾的前面,在while和do_while语句中,意味着下一步将执行测试部分,而在for语句中,下一步将求表达式3的值(通常是完成增量操作),再判断表

43、达式2的值并测试。,while(表达式).continue;.,for(式1;式2;式3).continue;.,一遇到continue语句,立即测试表达式是否成立,若仍成立则开始新一轮循环,否则跳出循环,对于do_while亦然。注意:通常while语句的触发器是放在循环体的末尾执行,而continue语句将跳过末尾端的触发器,因此在这种情况下,continue前必须加上触发器。一遇到continue语句,立即计算表达式3,而后测试表达式2,若真,开始下一轮循环,否则跳出for 循环。,total=0;for(i=1;i3)continue;total+=5;printf(“total=%d

44、n”,total);,break;,【例】:打印出1100之间不能被5整除的数,10个数为一行。,#include void main()int i=1,j=0;while(i=100)if(i%5=0)i+;continue;+j;printf(“%2d”,i);,if(!(j%10)printf(“n”);j=0;i+;,【例】:统计输出1100之间不能被5整除的数的和。,#include void main()int i=0,j=0;/j 表示统计和 while(+i=100)if(i%5=0)continue;j+=i;printf(“sum=%dn”,j);,3.6 多重循环,所谓循

45、环嵌套就是循环体内的语句可能又是一个循环语句,这样就构成了嵌套循环,嵌套循环可以是多层,从而构成多重循环。C语言中while、do_while、for可以互相嵌套。,如:for(i=0;i10;i+)for(j=0;j10;j+)外层循环体.内层循环体,若外层循环体除了内层的for循环以外还有其它的语句成分,则需用一对 将内层循环与其它语句一起包围构成外层循环体。如:for(i=0;i10;i+)for(j=0;j10;j+)外层循环体.内层循环体 语句块;,输出如下图形:,for(i=1;i=5;i+)printf(“*”);printf(“n”);,for(i1;i=5;i+)for(j=

46、1;j=5;j+)printf(“*”);printf(“n”);,for(k=1;k=3;k+),printf(“n”);,输出下列图形:,#include main()int rows=5;int i,j;for(i=1;i=rows;i+)for(j=1;j=i;j+)printf(“*”);printf(“n”);,*,#include void main()int i,j;char ch;for(i=0;i5;i+)ch=A;for(j=I;j5;j+)printf(“%c”,ch+j);printf(“n”);,A B C D EB C D EC D ED EE,【例】求1100间

47、的素数(素数1,且除了1和自身外,不能被任何其它整数整除。),要求5个为一行。【分析】前面有个例子用来判断什么样的数才是素数,在那个例子里面我们是输入了一个自然数来判断,在这里是要求求出1-100之内的所有满足那个判断的自然数,实际上就是要重复执行同一个操作(判断一个自然数是否素数)。该问题为 二重循环。for(i=2;i=100;i+)/遍历2100的全部自然数 for(j=2;ji;j+)/对于任一个 i,用2 i 1间的每一整数去试除,【例】将1元钱兑换成1分、2分、5分的硬币,有多少种不同的换法。【分析】:设1分硬币数量为n1、2分硬币数量为n2、5分硬币数量为n5,则 凡满足n1+2

48、*n2+5*n5=100 条件的值即为其解。n1,n2和n5有一定任意性。但有限制,其取值范围分别为:n1:0100 n2:050 n5:020 最简单的算法:for(n1=0;n1=100;n1+)for(n2=0;n2=50;n2+)for(n5=0;n5=20;n5+)if(n1+2*n2+5*n5=100)进一步分析,n1,n2,n5 3 个数中,仅2个任意。n2*2=100-n1-n5*5,#include void main()int n1,n5,count=0;for(n1=0;n1=0,上面的程序,由于n1,n5都是给的最大值,而其中只有在n1等于0的时候,n5才有可能取最大值

49、20,其余n1取值从1100,n5都不可能取到20,可见循环次数里面有一大部分是浪费了的。实际上的循环次数为2121次。即使最外层循环对n2,第二层循环对n5,最内层循环对n1,循环次数也有1071次。进一步分析,n1,n2,n5 3 个数中,已知其中之一,即可求得另外两个的总和,再假定另外两个中的一个,即可求出最后一个,从而得到一个组合。,#include void main()int n1,n2,n5,count=0;for(n5=0;n5=20;n5+)for(n2=0;n2=(100 n5*5)/2;n2+)n1=100-n5*5-n2*2;printf(%d,%d,%dn,n1,n2,n5);count+;printf(count=%dn,count);,用牛顿迭代法解方程:x41x31=0,在x1附近是实根,精度要求10-5。,include#include Void main()double x0,x=-1;do x0=x;x=x0-(pow(x0,41)+pow(x0,3)+1)/(41*pow(x0,40)+3*x0*x0);while(fabs(x-x0)1e-5);printf(“x=%f”,x);,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号