第3章 分支和循环的C程序设计_1.ppt_第1页
第3章 分支和循环的C程序设计_1.ppt_第2页
第3章 分支和循环的C程序设计_1.ppt_第3页
第3章 分支和循环的C程序设计_1.ppt_第4页
第3章 分支和循环的C程序设计_1.ppt_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 分支和循环的C程序设计,Chapter 3 Control Flow,问题,#include #include void main(void) float a,b,c,x1,x2; scanf(“%f,%f,%f”, ,b*b-4ac0?,一元二次方程根求解算法描述,b2-4ac=0?,yes,求等根,no,b2-4ac0?,yes,求实根,no,求复根,问题:如何构造条件? 如何根据条件实现不同算法?,3.1 程序的基本结构,结构化程序设计是软件设计的第三次革命。结构化程序设计的 基础是采用三种程序的控制结构。,1966年BHM g;,框图:,f;,g;,选择结构Selection(

2、分支结构),算法描述: if(e) f; else g;,框图:,e?,yes,f;,no,g;,循环结构Repetition,当型循环,while c is true do f,c?,f,YES,NO,直到循环,do f until c is false,f,c?,YES,NO,三种控制结构有如下共同的特点:,一个入口和一个出口; 无死语句; 无死循环。,如何构造条件 ?,复合语句 CompoundStatement,概念:C语言可以用 包括一系列的语句。一对 所包含的 内容称为一个复合语句。其中可以含有0到多条C语言语句。,#include void main (void) int a,b

3、; scanf(“%d,%d”, ,复合语句,复合语句,复合语句可以嵌套,凡是可以出现单一语句的地方都可以使用复合语句。,复合语句的作用:,作为分支和循环的块。,作为标识符的作用域。,交换算法演示,3.2选择结构Selection(分支结构),3.2.1 if结构的三种形式,if 及 if-else 的三种结构。,由标准的分支结构可以演化成单分支、多分支结构。C语言的分 支语句有if 、if else、switch三种。,if语句(单分支),格式: if(expression)statement;,语句,表达式,非0为yes,0为no。,语句,可以是复合语句。,流程图:,e?,statemen

4、t;,yes,no,举例:,/* example 3-1 求 y=|x| */#include void main(void) float x,y; printf(x = ? ); scanf(%f, ,单分支的功能: (1) 首先计算表达式的值。 (2) 若为真(非0),则执行“语句”;否则不执行“语句”,即跳过“语句”。 (3) 继续执行if语句后面的语句。,【例3-1】已知x的值,求y=|x|。,/* example 3-1 求 y=|x| */ #include void main(void) float x,y; /* 定义实型数据 */ printf(x = ? ); scanf(

5、%f, /* 输出 */ ,【例3-2】已知2个数,求2个数中的大数。,/* example 3-2 求2个数中的大数 */ #include void main(void) float x,y,maxf; /* 定义实型数据 */ printf(x,y = ? ); scanf(%f,%f, /* 输出 */ , if else 结构(双分支),格式: if(expression) stat1; else stat2;,语句或复合语句。,流程图:,e?,false,stat2;,stat1;,true,入口,出口,举例:输出| x |。,#include void main (void) i

6、nt x ; scanf ( “%d” , ,【例3-3】已知x的值,求y=|x|。,/* example 3-3 求 y=|x| */ #include void main(void) float x,y; /* 定义实型数据 */ printf(x = ? ); scanf(%f, /* 输出 */ ,【例3-4】已知2个数,求2个数中的大数。,/* example 3-4 求2个数中的大数 */ #include void main(void) float x,y,maxf; /* 定义实型数据 */ printf(x,y = ? ); scanf(%f,%f, /* 输出 */ ,【例

7、3-5】输入1个数,判断其是奇数还是偶数,/* example 3-5 判断数是奇数还是偶数 */ #include void main(void) int x; /* 定义整型数据 */ printf(x = ? ); scanf(%d, /* 输出是奇数 */ , if else if结构(多分支),格式: if(e1) stat1; else if(e2) stat2; else if(e3) stat3; else if(en-1) statn-1; else statn;,框图:,e1?,t,stat1;,f,e2?,t,stat2;,出口,f,en-1?,t,statn-1;,f,

8、statn;,n-1个条件,满足某个条件,执行对应的语句,然后到出口。,if else if结构(多分支)的功能: (1) 首先计算表达式1的值。 (2) 若表达式1的值为真(非0),则执行“语句1”;否则计算表达式2的值,若表达式2的值为真(非0),则执行“语句2”;,即依次判断各个表达式的值,当遇到第1个为真的表达式,则执行其对应的语句,如果所有的表达式都是假,则执行else后面的语句,即在n种路中选择其中的一种。 (3) 接着继续执行if结构后面的语句。,if else if结构举例:,征税问题: 1000以下税率为3% 10002000税率为4% 20003000税率为5% 3000以

9、上税率6% 输入收入,求应缴税款。,#include void main(void) float x ,rate; scanf(“%f ”, ,3/100?,【例3-6】从键盘任意输入一个字符,判断其是数字、大写字母、小写字母或是其它字符 。,/* example 3-6 判断是什么字符 */ #include void main(void) char c; printf(c = ?); c = getchar(); /* 从键盘输入字符赋给c */ if(c=0 /* 其它 */ ,/* example 3-7 判断考试成绩 */ #include void main(void) float

10、 score; printf(score = ?); scanf(%f, /* 不及格 */ ,【例3-7】从键盘任意输入一个百分制考试成绩,判断其是优、良、中、及格、不及格,switch语句(多分支结构),格式: switch (expression) case 常量表达式1: statement 1; case 常量表达式2: statement 2; case 常量表达式n-1: statement n-1; default : statement n; ,只能是整型或字符型表达式。,整型字符型常量表达式。 表达式的值要互不能相等!,流程:,先求expression的值。,依次比较exp

11、ression和各常量表达式的值。,如果与第i个常量表达式相等,则执行第i条以后的语句。,如果都不相等,则执行default以后的语句。,3.2.1 switch结构和break语句,语句标号的概念:,#include void main(void) char grade; grade=getchar( ); switch(grade) case A: printf (“90100n”); case B: printf (“8089n); case C: printf (“7079n”); case D: printf (“60 69n”); case E: printf (“60n”); d

12、efault : printf (“errorn”); ,语句标号。,break语句:,格式: break;,作用:中断switch流程。,break; break; break; break; break;,功能: (1) 首先计算表达式的值。 (2) 然后将该值依次与每一个case中的常量值进行比较,如果相等,则执行该case常量值后面的语句组,如果不等,则继续与下一个case中的常量值进行比较,即将表达式的值依次与各个常量表达式的值进行相等的比较,当遇到相等的表达式,则执行其后的语句直到遇到break语句,如果所有的表达式都不等,则执行default后面的语句,即在n+1种路中选择其中的

13、一种。 (3) 接着继续执行switch结构后面的语句,/* example 3-8(a) 判断考试成绩 */ #include void main(void) char score; printf(score = ?); scanf(%c, /* 不及格 */ ,【例3-8】以5分制的形式输入一门课程的考试成绩,打印其所在的百分制段落,如:输入B,输出8089,/* example 3-8(b) 判断考试成绩 */ #include void main(void) char score; printf(score = ?); scanf(%c, /* 不及格 */ ,例3-8的改进1,/*

14、example 3-8(c) 判断考试成绩 */ #include void main(void) char score; printf(score = ?); scanf(%c, /* 提示出错信息 */ ,例3-8的改进2,情况1:,if 是A类? 是A类 else if 是B类? 是B类 else if 是C类? 是C类 else if 是D类? 是D类 else 是其它类,3.2.1 各种分支的嵌套,情况2:,if 是A类? if 是A1类? 是A1类 else 是A2类 else if 是B1类? 是B1类 else 是B2类,情况3:,if 是A类? if 是A1类? 是A1类 e

15、lse 是A2类 else 是B类,/* example 3-9(a) 求分段函数 */ #include void main(void) int x,y; /* 定义数据 */ printf(x = ? ); scanf(%d, /* 输出 */ ,【例3-9】求下列分段函数的值。,/* example 3-9(b) 求分段函数 */ #include void main(void) int x,y; /* 定义数据 */ printf(x = ? ); scanf(%d, /* 输出 */ ,解法二,/* example 3-9(c) 求分段函数 */ #include void main

16、(void) int x,y; /* 定义数据 */ printf(x = ? ); scanf(%d, /* 输出 */ ,解法三,例,对于如下的结构: if(e1) stat1; else stat2;,在stat1或stat2中又含有if结构: if(e2) stat3; else stat4; 称为if结构的嵌套。各种if结构都可以嵌套。,如求符号函数: -1 (x0),#include void main ( void) int x,y ; scanf (“%d” , ,外层,内层,在外层else语句中,含有一个if结构。,说明:,书写采取缩进形式, 便于区分。,内层缩进。,else

17、与最近的if 相匹 配,从内到外。,y=-1; if (x!=0) if (x0) y=1; else y=0;,x=0结果?,举例:求一元二次方程ax2+bx+c=0的根。,#include #include void main(void) float a,b,c,d,x1,x2; scanf(“%f,%f,%f”, ,外层,内 层,求相等实根。,求不等实根。,求共扼复根。,判断实型量相等或不等用误差的方法。,flaot a=1.0 /*a=1.000001或0.999999*/ a=1.0?,例:输出五分制对应的百分制范围。,#include void main(void) char ch

18、Grad; chGrad=getchar( ); switch(chGrad) case a: case A: printf(“90100n”); break; case b: case B: printf(“8089n”); break; case c: case C: printf(“7079n”); break; case d: case D: printf(“6069n”); break; case e: case E: printf(“60n”);break; default : printf(“Data Error!n”); ,多个标号可以共用相同的语句。,default语句可以省

19、略。,3.3 循环结构(Repetition),程序经常会重复执行某些相同的操作,如: 求:s=1+2+3+4+100,算法描述: s=0;i=1; s+=i; i+; 判断i是否小于等于100 如果i小于等于100,重复; 否则,结束。,此类根据“条件”重复执行相同算法的结构,称为循环。,初始化部分。,循环体。含有使条件趋假的语句。,循环的条件。 注意:循环应在有限次完成。,C 语言提供了三类实现循环的语句: while, do while,for,格式: while(expression) statement;,表达式:值非0,表示满足条件;值为0 代表不满足条件。,语句(复合语句),重复

20、执行部分(循环体)。,流程:,e?,true,statement;,false,含有使条件趋假的语句。,举例:,求 s= 1+2+3+4+100,#include void main(void ) int s=0, i=1; while (i=100) s=s+i; /* s+=i; */ i+; printf (“s = %d n”, s) ; ,初始化部分,循环体,条件测试,使条件趋假语句,CHAP3EX7,3.3.1 while 循环(当型循环),【例3-10】打印循环变量的值。,/* example 3-10(a) 打印循环变量的值 */ #include void main(void

21、) int i; /* 定义整型循环变量 */ i=1; /* 初始化循环变量 */ while(i=10) /* 循环条件 */ printf(i=%d, ,i); /* 输出循环变量 */ i+; /* 修正循环变量 */ ,3-10(b),/* example 3-10(b) 打印循环变量的值 */ #include void main(void) int i; /* 定义整型循环变量 */ i=1; /* 初始化循环变量 */ while(i=10) /* 循环条件 */ printf(i=%d, ,i); /* 输出循环变量 */ i=i+2; /* 修正循环变量 */ ,【例3-1

22、1】求 的值(用while循环实现),/* example 3-11 求累加和 */ #include void main(void) int i; /* 定义整型循环变量 */ float sum; /* 定义累加和 */ i = 1; /* 初始化循环变量 */ sum=0.0; /* 初始化累加和 */ while(i=100) /* 循环条件 */ sum = sum+i; /* 不断累加 */ i+; /* 修正循环变量 */ printf(i=%d, ,i); /* 输出循环变量 */ printf(sum=%fn ,sum); /* 输出累加和 */ ,格式: do statem

23、ent; while (expression );,流程:,statement;,e?,true,false,含有使条件趋假的语句。,while循环与do-while循环的区别: while循环先判条件,后执行循环体; do while循环先执行循环体,后判条件。,举例:,求:30!,#include void main(void) float s=1.0; int i=1; do s*=i; i+; while(i=30); printf(“30!=%f”,s); ,初始化。,循环体。,测试条件。,使条件趋假。,CHAP3EX8,思考题: 用do-while实现s=1+2+100。用whil

24、e实现30!。,3.3.2 do while循环(直到型循环),例3-12 求1到100的累加和(用do-while循环实现)。,/* example 3-12 求累加和 */ #include void main(void) int i; /* 定义整型循环变量 */ float sum; /* 定义累加和 */ i = 1; /* 初始化循环变量 */ sum=0.0; /* 初始化累加和 */ do sum = sum+i; /* 不断累加 */ i+; /* 修正循环变量 */ while(i=100); /* 循环条件 */ printf(i=%d, ,i); /* 输出循环变量 *

25、/ printf(sum=%fn ,sum); /* 输出累加和 */ ,格式: for (e1; e2; e3 ) statement;,流程:,e1,e2?,true,statement;,e3,false,举例:,求:s=1+2+3+100,#include void main (void ) int s=0,i ; for (i=1; i=100; i+ ) s =s + i; printf (“s= %d” , s) ; ,使e2趋假。,在for循环中,e1、e2、e3都可以省略!,e1省略,i=1;,e3省略,i+;,初值表达式。,测试表达式。,增值表达式。,3.3.3 for循环

26、,for循环实例,求100以内的偶数和。,int s=0,i; for(i=2;i100;i+=2) s+=i; ,求500以内最大的5个能被50整除数的和。,int i ,j,s=0; for(j=500,i=0;i5;i+, j-=50) s+=j; ,从大到小输出100以内能被5整除的数。,int i; for(i=100;i=0;i-=5) printf(“%dn”,i);,int i,j,s=0; for(i=0,j=0;i+j100;i+,+j) s+=i+j; ,【例3-13】求1到100的累加和(用do-while循环实现)。,/* example 3-13 求累加和 */ #

27、include void main(void) int i; /* 定义整型循环变量 */ float sum; /* 定义累加和 */ sum=0.0; /* 初始化累加和 */ for(i=1;i=100;i+) /* 初值、循环条件、步长 */ sum = sum+i; /* 不断累加 */ printf(i=%d, ,i); /* 输出循环变量 */ printf(sum=%fn ,sum); /* 输出累加和 */ ,【例3-14】几种常见的空循环举例,/* example 3-14(a) 空循环 */ #include void main(void) int i; for(i=1;

28、i=100;i+) ; *循环体内空语句*/ printf(i=%dn,i); ,/* example 3-14(b) 空循环 */ /* for语句后打了一个分号 */ #include void main(void) int i; for(i=1;i=100;i+); printf(i=%dn,i); ,【例3-14】几种常见的死循环举例,/* example 3-15(a) 死循环 */ /* 省略表达式3 */ #include void main(void) int i; for(i=1;i=100;) ; printf(i=%dn,i); ,/* example 3-15-(b)

29、死循环 */ /* 省略表达式2 */ #include void main(void) int i; for(i=1; ;i+) ; printf(i=%dn,i); ,3.3.4 转移语句,任何循环都必须在有限的时间内能够结束,而循环的结束有2种方式: 正常结束循环 非正常结束循环,1break语句 break语句又称中断语句,其一般形式为: break;,2continue语句 continue语句的一般形式为: continue;,循环的中断(break)和继续(continue),循环的中断:break语句,概念:循环体中可以加分支,判断是否继续执行循环,break 语句可以提前结束

30、循环。,举例:求:r=110的圆的面积,如圆面积大于100则中断。,for (r=1; r100 ) break; printf ( “ n% f “ , area); ,满足条件,则退出循环。,继续循环:continue语句,continue语句的作用是跳过本次循环剩余的循环体内容,执行 下次循环。,举例:求1100内的偶数和。,s=0; for ( n=1; n=100; n+) if (n%2!=0) continue; s+=n; ,满足条件,跳过本次循环体剩余内容,继续下次循环。,int s=0,i; for(i=2;i100;i=i+2)s+=i;,【例3-16】转移语句举例,/*

31、 example 3-16(a) */ /* break语句的使用 */ #include void main(void) int i; for(i=1;i=10;i+) if (i%4=0) break; printf(i=%dn,i); ,/* example 3-16(b) */ /* continue语句的使用 */ #include void main(void) int i; for(i=1;i=10;i+) if (i%4=0) continue; printf(i=%dn,i); ,3goto语句,格式: goto Label /* Label: 同一函数内语句前的标号。*/,

32、作用:转移到标号对应的语句上继续执行。,loop: if (i=100 ) sum=sum+i; i+; goto loop; ,概念:在一个循环的循环体内又包含一个完整的循环称为循环 的嵌套。,i 1 2 3 4 5 6 7 8 9 1 11 12 19 j 2 21 22 29 9 91 92 99,如打印一99的乘法表:,i=1时,j从1变化到9,完i*j 。,3.3.5 各种循环的嵌套,/* example 3-17 嵌套循环 */ #include void main(void) int i,j; for(i=1;i=3;i+) /* 外循环3次 */ printf(外循环i=%d:

33、 ,i); /* 输出外循环变量 */ for(j=1;j=5;j=j+2) /* 内循环3次 */ printf(内循环j=%d ,j); /* 输出内循环变量 */ printf(n); /* 换行 */ ,【例3-17】输出循环变量的值,分析循环的执行过程,#include void main (void ) int i,j ; for (i=1 ; i=9 ; i+) printf (“ n “); ,外层循环,内层循环,说明:,内外层循环采用缩进形式。,while和do- while和for可以 相互嵌套。,执行次数为内层循环次数和 外层循环次数的乘积。,CHAP3EX9,如何打印乘

34、法表的一半?,for(j=1; j=9 ; j+) printf ( “ %4d “ , i * j ) ; ,【例3-18】打印九九乘法表,无限循环和空循环,条件为恒真的循环无限循环,while(1) do while(1); for( ; ;),通过条件控制的break语句退出循环。,例:程序等待直到输入字母A。 for ( ; ;) ch= getchar ( ); if ( ch=A) break; ,循环体为空语句的循环空循环,for (i=1 ;i=MAX ; i+) ;,作用:程序延时。,空语句, ;,3.4 分支和循环的C程序设计,输入10个自然数统计其中偶数的个数及偶数值和。

35、,算法框图:,start,定义变量,初始化,循环?,true,输入,偶数?,true,统计累加,false,false,输出结果,end,#include void main(void) int i, ix,iCount=0,iSum=0; for(i=1;i=10;i+) scanf(“%dn”, ,循环结构,分支结构,输入负数?,do if(ix=0)printf(“date error”); while(ix=0);,算法的健壮性,注意:结构应完整的包含和被包含。,3.4.1 应用程序,程序分析:此题首先找出2个数中的大数maxf,再将2个数中的大数maxf与第3个数比较,即可得出3个数

36、中的大数,/* example 3-19 求3个数中的大数 */ #include void main(void) float x,y,z,maxf; /* 定义实型数据 */ printf(x,y,z = ? ); scanf(%f,%f,%f, /* 输出 */ ,【例3-19】由键盘任意输入3个数,找出其中的最大数,/* example 3-20 判断闰年 */ #include void main(void) int n; /* 定义数据 */ printf(n = ? ); scanf(%d, /* 输出不是闰年 */ ,【例3-20】由键盘任意输入一个年号,如:2008,判断其是否

37、是闰年,/* example 3-21 统计字符的个数 */ #include void main(void) char c; int digcou=0; /* 定义整型变量并初始化为0 */ int capcou=0; int smacou=0; int othercou=0; printf(c = ?); while(c = getchar()!=n) /* 循环输入字符赋给c */ if(c=0 /* 统计小写字母 */ else,【例3-21】由键盘任意输入一串字符,分别统计其中大写字母、小写字母、数字、其他字符的个数,othercou+; /* 统计其它字符 */ printf(数字

38、字符有%d个n,digcou); /* 输出字符个数 */ printf(大写字母有%d个n,capcou); printf(小写字母有%d个n,smacou); printf(其它字符有%d个n,othercou); ,/* example 3-22(a) 求累乘积的和 */ #include void main(void) int i; /* 定义整型循环变量 */ float temp=1.0; /* 定义并初始化累乘积 */ float sum=0.0; /* 定义并初始化累加和 */ int n; printf(n=? ); scanf(%d, /* 输出累加和 */ ,【例3-22

39、】求累乘积的和,/* example 3-22(b) 求累乘积的和 */ #include void main(void) int i,j; /* 定义整型循环变量 */ float temp; /* 定义累乘积 */ float sum=0.0; /* 定义并初始化累加和 */ int n; printf(n=? ); scanf(%d, /* 输出累加和 */ ,【例3-22】(b),/* example 3-23(a) 求级数和 */ #include void main(void) int i; /* 定义整型循环变量 */ float sum=0.0; /* 定义并初始化累加和 */

40、 int n; printf(n=? ); scanf(%d, /* 输出累加和 */ ,【例3-23】求级数的和,(1) 求级数的和:1+2+3+4+n。,/* example 3-23(b) 求级数和 */ #include void main(void) int i; /* 定义整型循环变量 */ float sum=0.0; /* 定义并初始化累加和 */ int n; printf(n=? ); scanf(%d, /* 输出累加和 */ ,(2) 求级数的和: 1+1/2+1/3+1/4+1/n,/* example 3-23(c) 求级数和 */ #include void ma

41、in(void) int i; /* 定义整型循环变量 */ float sum=0.0; /* 定义并初始化累加和 */ int n; printf(n=? ); scanf(%d, /* 输出累加和 */ ,(3) 求级数的和: 1+1/3+1/5+1/7+1/n,/* example 3-23(d) 求级数和 */ #include void main(void) int i; /* 定义整型循环变量 */ float sum=0.0; /* 定义并初始化累加和 */ float temp=-1; int n; printf(n=? ); scanf(%d, /* 输出pi */ ,(4

42、) 求级数的和: /4 =11/3+1/51/7+1/n,/* example 3-23(e) 求级数和 */ #include #include void main(void) int i; /* 定义整型循环变量 */ float sum=0.0; /* 定义并初始化累加和 */ float temp=-1; float eps; printf(eps=?); scanf(%f, ,/* example 3-24(a) 求素数 */ #include #include void main(void) int m,n,i,k=0; /* 定义整型变量 */ for (m=101;mn) /*

43、 退出后满足此条件则是素数 */ printf(%4d,m); /* 输出素数 */ k+; /* 统计素数 */ if(k%10=0) printf(n); /* 控制换行 */ printf(n素数有%d个n ,k); /* 输出素数个数 */ ,【例3-24】求100200之间的素数,/* example 3-24(b) 求素数 */ #include #include void main(void) int m,n,i,k=0; /* 定义整型变量 */ int found; /* 定义开关变量 */ for (m=101;m=200;m=m+2) /* 外循环依次遍历待检测的奇数 *

44、/ n = sqrt(double)m); found = 0; /* 初始化开关变量 */ i = 2; while(i=n , if(found=0) /* 退出后满足此条件则是素数 */ printf(%4d,m); /* 输出素数 */ k+; /* 统计素数 */ if(k%10=0) printf(n); /* 控制换行 */ printf(n素数有%d个n ,k); /* 输出素数个数 */ ,/* example 3-25 计算器程序 */ #include void main(void) float x,y; /* 定义实型数据 */ char op; printf(plea

45、se enter expression:); scanf(%f%c%f, ,【例3-25】设计一个简单的计算器程序,由用户从键盘输入一个表达式,如:11+22=?程序立即计算出答案,并将表达式和答案输出在屏幕上,3.4.2 2种程序设计的基本方法,根据计算机的特点,结合循环与分支结构在程序设计时常使两 种常用的基本方法。,枚举法(穷举法) 迭代法,本专题将结合分支和循环介绍两种方法的基本思想和 具体实现!,1 枚举法 Enumeration,存在有限状态;其中某些状态满足特定条件。 通过循环产生所有状态(枚举)。 对每一状态,按条件进行状态测试,满足条件的状态,为所求的解。,求100到200内

46、的所有素数。 通过循环使i从101变化到199(枚举所有状态) 对每次循环的i进行是否是素数的测试,如果是素数,输出i。,枚举法举例:,求100到200之间的所有素数(只能被1和自身整除的数)。,对于自然数n,判断其是否为素数有以下三种方法:,判断n是否能被从2到n-1范围内的数整除;,判断n是否能被从2到(int)(n/2)范围的数整除;,判断n是否能被从2到(int)sqrt(n)范围的数整除;,程序如下:,#include #include void main(void) int n, j, s; for(n=101;ns) printf(“n%d”,n); ,枚举所有数,构造,测试条件

47、,如果n能被2到s的任意数整除,退出循环。,如果n是素数,输出n。,CHAP3EXA,求水仙花数(条件:三位数的个、十、百位的方和等于该数。153=13 +53 +33 )。,n为枚举变量,枚举初值 100,枚举终值999。,构造条件:取出n的个、十、百位数。,测试是否满足条件,满足条件输出n。,#include void main(void) int n, a, b, c; for(n=100 ; n=999 ; n+) a=n/100; b=n%100/10; c=n%10; if(a*a*a+b*b*b+c*c*c=n) printf(“n%d”,n); ,枚举所有三位数,构造条件,测试

48、条件,取n的百位a、十位b、个位c。,CHAP3EXB,爱因斯坦阶梯问题(不定范围的枚举)。,设有一阶梯,每步跨2阶,最后剩1阶;每步跨3阶,最后剩2 阶;每步跨5阶,最后剩4阶;每步跨 6阶,最后剩 5阶;每步跨7 阶,正好到阶梯顶。问共有多少阶梯。,根据条件可以得出:台阶数一定是奇数且为7的倍数。 枚举初值:k=7; 枚举公式:k=k+14 结束条件:满足(k%3=2) while( !(k%3=2) ,CHAP3EXC,思考题:,36人一次搬36块砖,男搬4,女搬2,两个小孩抬一块。要一 次搬完。问:男、女、小孩要多少?, 找出1000以内的完数,所谓完数是指该数的各因子之和等于 该数,

49、如6=1+2+3。,证明6到200以内的数,符合哥德巴赫猜想(一个大于6的偶 数,可以分解成两个质数之和)。,奇妙的算式:用字母代替十进制数字写出如下算式: E G A L L L G A E 请找出这些字母代表的数字。,2 迭代法 Iteration,迭代是通过循环不断由旧值推导新值,并最后求解的过程。 迭代法有三个要点:,如人口每年按2%增长,现在人口有12亿,10年后人口有多少?,迭代公式。,m=m*(1+2%),迭代初值(边界条件)。,m=12,迭代次数(或条件)。,n=10,迭代法举例,求ex=1+x+x2/2!+xn/n!前n+1项之和。,迭代次数i 0 1 2 n,迭代公式 t=

50、t*x/i,迭代初值 exp=1, t=1,(i=1n),#include void main(void) float exp , x , t; int i, n; scanf(“%f,%d”, ,迭代初值。,迭代公式。,迭代过程,附加条件: 当| t |10-5,结束运算。,if(fabs(t)1e-5)break;,CHAP3EXD,用梯形法求定积分,( 0,0 ),y,x,f(x),a,b,面积,h,x,将 a,b分为n等份,h=(b-a)/n;,求n个梯形面积之和,第i小面积 x=x+h f1=f(x) 下底 s=s+ (f0+f1)*h/2 f0=f1 迭代,x 初值为a s初值为0

51、 f0 初值为f(a) 次数为n,迭代求积分的方法,程序如下:,#include void main(void) float a,b,f0,f1,h,x,s=0.0; int n,i; scanf(“%f,%f,%d”, ,CHAP3EXE,迭代初值。,迭代循环,求s=a+aa+aaa+aaaa。 0a10 共n项,最后一项有n个a。如求s=2+22+222+2222+222222 n、a从键盘输入。,迭代次数:i=1n,迭代初值:s=0.0,t=a,迭代公式: t=t*10+a,程序如下:,#include void main(void) float s,t; int i,a,n; do scanf(“%d,%d”, ,x,y,f(x),x1,f1=f(x1),x2,f2=f(x2),算法分析:,输入x1、x2,并求出f1、f2。,迭代:将区间二分 x =(x1+x2)/2 计算出f=f(x),x,f,判断f与f1是否同号 如果同号:x1=x,f1=f 否 则:x2=x,f2=f,x1,f1,f1,f2,判断fabs(x1-x2)是否小于某个规定的精度(如10- 6 ) : 如果小于精度:求出根,退出到。 否 则:继续。,输出根,根的值是(x1+x2)/2。,二分法求方程f(x)= x3-6x-1=0,在0,5区

温馨提示

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

评论

0/150

提交评论