第4-5-6-7讲第3章程序和流程控制编程及应用_第1页
第4-5-6-7讲第3章程序和流程控制编程及应用_第2页
第4-5-6-7讲第3章程序和流程控制编程及应用_第3页
第4-5-6-7讲第3章程序和流程控制编程及应用_第4页
第4-5-6-7讲第3章程序和流程控制编程及应用_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

1、第第1、2章回顾章回顾C程序结构:程序结构: C程序由main函数和若干个其他子函数(标准函数和自定义函数等)构成。函数包括函数头和函数体,C程序语句以分号作为结束标志。语法单位(单词):语法单位(单词):关键字关键字、标识符标识符、分隔符分隔符、常常量量、变量、变量、运算符运算符。数据类型的规定以及数据类型的规定以及表达式运算规则。表达式运算规则。输入输出函数输入输出函数getchar,putchar,scanf,printf的使用。的使用。第第3 3章章 程序和流程控制程序和流程控制 3.1 C语言程序的版式及语句语言程序的版式及语句 3.2 结构化程序设计和流程控制结构化程序设计和流程控

2、制 3.3 if语句语句 3.4 switch多分支选择语句多分支选择语句 3.5 循环控制循环控制 3.6 辅助控制语句辅助控制语句 3.7 典型程序编写方法举例典型程序编写方法举例 3.8 小结小结C语言流程控制语句语言流程控制语句3.1 C语言程序的版式及语句语言程序的版式及语句 3.1.1 C语言程序的版式 3.1.2 C语言的语句例例3.1 /* 求二整数之和的程序求二整数之和的程序 */#include /预处理预处理void main( ) /函数定义函数定义 int a,b; /变量说明变量说明 int sum; scanf(%d%d,&a,&b); / 数据输

3、入数据输入 sum = a + b ; /执行部分执行部分 printf(sum=%d,sum); /信息输出信息输出该程序的运行结果为:该程序的运行结果为:7 8 /输入输入sum=153.1.1 C语言程序的版式特征语言程序的版式特征程序设计程序设计主要任务主要任务1.输入输入2.处理处理3.输出输出 编写C语言程序一般应包含如下几个部分 (1)注释部分注释部分:格式为*注释内容*或/注释内容;在函数的最上端,一般都应有一段注释信息,主要说明函数的功能,输入、输出及其限制;如是商品软件还应包含版权信息,在程序的其他部分也可加注释。编程者要养成一边编程序、一边加注释的习惯。一般长段的注释用*

4、注释内容*形式,短段的注释用/注释内容形式。 (2)预处理块、全局变量说明等预处理块、全局变量说明等。(参见后面章节) (3)函数定义部分函数定义部分,包括函数类型,函数名及参数表,由于只有一个函数故取名main(),由于无返回值故类型为void,无参数输入时,main()内参数表为空。 (4)变量说明部分变量说明部分,对所用的变量进行说明; (5)数据输入部分数据输入部分,对要使用的变量赋初值,可直接或间接输入,有些是在第(4)部分完成(即变量直接初始化); (6)执行部分执行部分,它是整个程序的核心,一般是对程序算法用结构化程序设计方法进行描述,然后将其转化成对应的C语言语句; (7)信息

5、输出部分信息输出部分,根据要求输出所求的信息或返回结果;有些是在第(6)部分一边执行一边输出。如上述程序的执行部分采用函数调用则如上述程序的执行部分采用函数调用则上述程序应为上述程序应为例例3.2 /* 求二整数之和的程序求二整数之和的程序 */#include /预处理预处理int add(int x,int y); /函数声明函数声明void main( ) /函数定义函数定义 int a,b; /变量说明变量说明 int sum; scanf(%d%d,&a,&b); /数据输入数据输入 sum = add(a, b) ; /执行部分执行部分 printf(sum=%d,

6、sum); /信息输出信息输出/*求和函数,输入参数为二整数,求和函数,输入参数为二整数,返回值为其和返回值为其和*/int add(int x, int y) /函数定义函数定义 int z; / 变量说明变量说明 z = x + y; /执行部分执行部分 return z; /返回结果返回结果输入:输入:7 8 该程序的运行结果为:该程序的运行结果为:sum=15语句是语句是C语言程序的基本元素,语句以分号为结束标志。语言程序的基本元素,语句以分号为结束标志。程序中的各函数模块都是由一定含义的语句组成的。程序中的各函数模块都是由一定含义的语句组成的。 例例: char ch =H;/*分号

7、为语句结束标志分号为语句结束标志*/ int y= 7 ; c=a+b; printf( “hello !”) ;语句的分类:语句的分类:说明语句说明语句 用来对程序中所使用的各种类型变量及属性进行用来对程序中所使用的各种类型变量及属性进行说明,按其所起作用有时也称为定义语句。说明,按其所起作用有时也称为定义语句。执行语句执行语句 包括表达式语句、流程控制语句、函数调用语句等表达式语句、流程控制语句、函数调用语句等完成一定运算操作功能的语句。完成一定运算操作功能的语句。3.1.2 C语言的语句语言的语句1. 说明语句说明语句 2. 用来对程序中所使用的各种类型变量进行说明,也称为用来对程序中所

8、使用的各种类型变量进行说明,也称为定义语句。定义语句。 说明语句的格式:说明语句的格式: 数据类型数据类型 变量名列表;变量名列表; 例例: int i, j ; /说明了两个整型变量说明了两个整型变量i和和j 说明语句同时也可以进行初始化赋值,如:说明语句同时也可以进行初始化赋值,如: char ch =H; unsigned long y = 0 x35847412 ;执行语句中所使用的每一个变量都必须在此前说明过。执行语句中所使用的每一个变量都必须在此前说明过。 2. 执行语句。一般包含四大类:执行语句。一般包含四大类: 表达式语句(包括空语句)表达式语句(包括空语句) 复合语句复合语句

9、 流程控制语句流程控制语句 辅助控制语句辅助控制语句 (1)表达式语句表达式语句 任何一个表达式加上一个分号就是一条表达式语句;任何一个表达式加上一个分号就是一条表达式语句; /表达式语句,通常是赋值表达式或函数调用表达式。表达式语句,通常是赋值表达式或函数调用表达式。 例:例: c=a+b; sum = add( a , b) ; /赋值语句赋值语句 printf( “hello !”) ; /函数调用语句函数调用语句 ; /空语句空语句 (2)复合语句复合语句 将若干语句用一对大括号将若干语句用一对大括号 括起来就构成了复合括起来就构成了复合语句。复合语句的一般格式为语句。复合语句的一般格

10、式为: 说明语句说明语句; 可执行语句可执行语句; 复合语句在程序结构上是以整体出现,相当于程序块复合语句在程序结构上是以整体出现,相当于程序块(BLOCK),),当一个功能必须用多条语句才能完成时,当一个功能必须用多条语句才能完成时,就需要使用复合语句。就需要使用复合语句。采用采用 可以清晰地表达程序的层次结构。可以清晰地表达程序的层次结构。3.2 结构化程序设计和流程控制结构化程序设计和流程控制 3.2.1 结构化程序设计结构化程序设计 3.2.2 C语言的流程控制语句和辅助控制语句语言的流程控制语句和辅助控制语句3.2.1 结构化程序设计结构化程序设计 结构化程序设计的基本思想,结构化程

11、序设计的基本思想,任何程序都可以用三种基任何程序都可以用三种基本结构表示:本结构表示: 顺序结构顺序结构 选择结构选择结构 循环结构。循环结构。 采用这三种基本结构编写程序的设计风格称为采用这三种基本结构编写程序的设计风格称为结构化程序设计。结构化程序设计。图图3.1顺序结构示意图顺序结构示意图顺序结构顺序结构: : 按语句顺序依次执行。按语句顺序依次执行。/通过语句书写顺序自然实现通过语句书写顺序自然实现 int a,b; /变量说明变量说明 int sum; scanf(“%d%d”,&a,&b);/输入输入 sum = a + b ; /执行运算执行运算 printf(“

12、sum=%d”,sum); /输输出出 选择结构选择结构根据条件选择两支或多支程序中的一支执行。根据条件选择两支或多支程序中的一支执行。 图3.2选择结构示意图由两分支选择结构可以派生出另一种基本结构,多分支选择结构。/if,switchif,switch语句语句, ,选择运算符实现选择运算符实现 if(a=0) printf(come in !); else printf(go away!); 循环结构循环结构 在判断条件成立的情况下,反复执行某个程序段。在判断条件成立的情况下,反复执行某个程序段。图3.3循环结构示意图/while,do while以及以及/ for语句来实现语句来实现wh

13、ile ( i =90&a=90&a=100) printf(“A !); else printf(“b!);2 if单路分支形式(选择性执行语该分支单路分支形式(选择性执行语该分支) scanf(“%f”,&i); if ( i60) printf(“不不及格及格”); printf(“%f”,i);在在C语言程序中,还常用如下书写形式语言程序中,还常用如下书写形式: if(x) 等价于等价于 if(x!=0) if(!x) 等价于等价于 if(x=0) 如变量如变量x为为float或或double实型变量,则与实型变量,则与0比较比较的的if语句建议如下:语句建议如

14、下: if (fabs(x)=90)grade= A ; else if (i=70) grade=B ; else if (i=60) grade=C ; else if (i=0) grade=D ; putchar(grade); /输出该生成绩等级输出该生成绩等级 也可用也可用 printf(“%c/n”,grade); 90100分分A7090分分B6070分分C060分分D 例例3.3 给某班学生的一次考试成绩分等级给某班学生的一次考试成绩分等级. 90分以上的为分以上的为A,70分到分到90分之间的为分之间的为B,60分到分到70分之间的为分之间的为C,60分以下的得分以下的得D

15、。Sample-3-3-1.c算法算法2: ; float i; /定义定义i表示学生成绩,表示学生成绩, char grade; /grade表示等级表示等级。 scanf(“%f”,&i); /输入学生成绩输入学生成绩 if (i60)grade= D ; else if (i70) grade=C ; else if (i=90)grade= A ; else if (i=70) grade=B ; else if (i=60) grade=C ; else if (i=0) grade=D ; putchar(grade); /输出该生成绩等级输出该生成绩等级 也可用也可用 p

16、rintf(“%c/n”,grade); 90100分分A7090分分B6070分分C060分分D 例例3.3 给某班学生的一次考试成绩分等级给某班学生的一次考试成绩分等级. 90分以上的为分以上的为A,70分到分到90分之间的为分之间的为B,60分到分到70分之间的为分之间的为C,60分以下的得分以下的得D。Sample-3-3-1.c 例例3.4 求一元二次方程求一元二次方程 ax2+bx+c=0的根,实系数的根,实系数a,b,c从终端输入。从终端输入。 算法分析:算法分析: 先判断输入的系数是否满足方程是二次方程,判断先判断输入的系数是否满足方程是二次方程,判断a是否是否为为0。接着应考

17、虑两个不同实根,相同实根,和复根三种情况讨。接着应考虑两个不同实根,相同实根,和复根三种情况讨论论: 当当b2-4ac0时,有两个不同的实根,其中时,有两个不同的实根,其中x1,x2为其两个根;为其两个根; 当当b2-4ac0时,有两个相同的实根,其中时,有两个相同的实根,其中x1,x2为其两个等根;为其两个等根; 当当b2-4ac0时,有两个共轭的虚根;我们把虚根的实部时,有两个共轭的虚根;我们把虚根的实部x3和虚部和虚部x4分成两部份分开计算,后来再组合在一起。分成两部份分开计算,后来再组合在一起。 程序如下程序如下: #include #include void main( ) floa

18、t a,b,c; float x1,x2; float x3,x4; printf(input numbers: a ,b ,c:); scanf(%f%f%f,&a,&b,&c); if ( a = 0) if ( b=0) printf(error input n); else printf(“x=%.2fn,-c/b); /return ; else if ( b*b 4*a*c) x1 = (-b+sqrt(b*b-4*a*c)/(2*a); x2 = (-b-sqrt(b*b-4*a*c)/(2*a); printf(x1=%.2f,x2=%.2fn,x1,x

19、2); else if ( b*b = 4*a*c) x1 = x2 = (-b+sqrt(b*b-4*a*c)/(2*a); printf(x1=x2=%.2fn,x1); else x3 = -b/(2*a); x4 = sqrt(4*a*c- b*b)/(2*a); printf(x1=%.2f+%.2f in,x3,x4); printf(x2=%.2f-%.2f in,x3,x4); Sample-3-4.c 该程序的运行结果(分该程序的运行结果(分5种情况)为:种情况)为:(1) 0 1 4 /输入输入 x=-4 /输出输出(2) 0 0 4 /输入输入 the input is

20、error /输出输出(3) 1 4 3 /输入输入 x1= -1.00 ,x2= -3.00 /输出输出(4) 1 4 4 /输入输入 x1=x2=-2.00 /输出输出 (5) 1 2 4 /输入输入 x1=-1+1.73 i /输出输出 x2=-1-1.73 iif多条件分支下的流程控制if 语句的不足语句的不足条件表达式的结果条件表达式的结果只有真或假两种结只有真或假两种结果果,由一个条件语,由一个条件语句只能提供两个分句只能提供两个分支供选择。支供选择。多重多重if语句可以实语句可以实现多重分支,但现多重分支,但程程序结构显得繁琐序结构显得繁琐,欠清晰欠清晰,执行效率也执行效率也比较

21、低。比较低。图图3.8 switch语句的流程控制语句的流程控制3.4 switch多分支选择语句多分支选择语句 switch分支选择语句,它可以结构清晰地直接表达分支选择语句,它可以结构清晰地直接表达多分支选择多分支选择, 执行效率更高执行效率更高。switch(表达式表达式) case 判断值判断值1: 语句组语句组1; break; case 判断值判断值2: 语句组语句组2; break; case 判断值判断值 n: 语句组语句组n; default: 语句组语句组n+1; break;printf(“the end”);使用使用switch语句注意事项语句注意事项 1. switc

22、h ( )后面圆括号中的表达式要求后面圆括号中的表达式要求结果是整数,各个结果是整数,各个case判断值要求是整判断值要求是整形常量形常量; switch语句比较表达式的值与语句比较表达式的值与某个某个case后常量值相等,则从该后常量值相等,则从该case后后面的第一个语句开始依次执行面的第一个语句开始依次执行 2. 各个各个case和及其下面的语句组的顺序和及其下面的语句组的顺序是任意的,但各个是任意的,但各个case后面的判断值必后面的判断值必须是不同值须是不同值,default后无判断值后无判断值,其功能其功能相当与相当与if语句中的语句中的else 。 switch语句形式switc

23、h(表达式表达式) case 判断值判断值1: 语句组语句组1; break; case 判断值判断值2: 语句组语句组2; break; case 判断值判断值 n-1: case 判断值判断值 n: 语句组语句组n; default: 语句组语句组n+1; break;printf(“the end”);switch语句使用注意事项语句使用注意事项3. break语句起着退出语句起着退出switch-case结构的结构的作用,若无此语句,程序将顺序执行下作用,若无此语句,程序将顺序执行下一个一个case语句组。语句组。4. 当表达式的结果值与所有的当表达式的结果值与所有的case的判断的判

24、断值都不一致时,程序才执行值都不一致时,程序才执行default部分部分的语句组。的语句组。default部分不是必须的。部分不是必须的。5.对于表达式的多个结果值执行相同语句对于表达式的多个结果值执行相同语句组时组时,程序的形式是多个程序的形式是多个case重叠。重叠。switch语句形式#include void main( ) float a,b,c; int n; printf(“请输入两数据请输入两数据:”); scanf(“%f%f”,&a,&b); printf(“请选择运算种请选择运算种类类:1 加法;加法;2 减法;减法;3 乘法;乘法;4 除法除法”); s

25、canf(“%d”,&n); switch (n) case 1: c=a+b; break; case 2: c=a-b; break; case 3: c=a*b; break; case 4: if(b!=0) c=a/b; else printf(“data error”); break; default: printf(“选择无选择无效效”); printf(“结果为结果为:%.2f”,c); 例例3.5.0 编程实现:用户输入两个数据,选择执行某种四则运算,编程实现:用户输入两个数据,选择执行某种四则运算,输出结果。输出结果。Sample 3-5-0.c#define ES

26、C 0 x11b;#define F1 0 x3b00 /F1键的键值为键的键值为0 x3b00 #define F2 0 x3c00 #define F3 0 x3d00 #define F4 0 x3e00 #define F5 0 x3f00 #define F6 0 x4000 #include #include void main( ) unsigned int key_value; key_value = bioskey(0); switch (key_value) case F1: F1功能处理程序功能处理程序; break; case F2: F2功能处理程序功能处理程序; b

27、reak; case F3: case F4: F3,F4相同功能处理程序相同功能处理程序; break; case F5: F5功能处理程序功能处理程序; break; case F6: F6功能处理程序功能处理程序; break; default: 默认处理程序默认处理程序; break; 例例3.5 编一示意性的菜单处理程序,编一示意性的菜单处理程序, 按下一功能键,按下一功能键, 执执行响应的功能处理。行响应的功能处理。例例3.6 分段函数计算,输入变量数值分段函数计算,输入变量数值x,计算结果。,计算结果。 864464334222201xxxxxxxxy注意:注意:面对问题面对问题

28、,应按计算机程序设计的方式来思考对问应按计算机程序设计的方式来思考对问题的描述和解决方案题的描述和解决方案: 考虑变量的定义考虑变量的定义(几个变量几个变量,数据类数据类型型), 流程控制语句的选用流程控制语句的选用, 再编程实现再编程实现.#include void main( ) float x,y; printf(input the number x=); scanf(%f,&x); if( x = 0 & x=2&x= 4 & x = 6 & x8) y= 4*x + 4; else printf(error in input datan); p

29、rintf(y=.2f,y); 该程序的运行结果为:该程序的运行结果为: 1.00 /输入输入2.00 /输出输出分析:利用多分支的分析:利用多分支的if 语句形式来编写语句形式来编写:#includevoid main() float x, y; printf(input the number x=); scanf(%f, &x); switch (int) x) case 0: case 1: y = x + 1; break; case 2: case 3: y = 2 * x + 2; break; case 4: case 5: y = 3 * x + 3; break; c

30、ase 6: case 7: y = 4 * x + 4; break; default: printf(error input datan); printf(y = %.2f , y);Sample3-6-2.cpp利用利用switch语句同样可以实现上述功能语句同样可以实现上述功能: /输入学生成绩,判别所属等级输入学生成绩,判别所属等级Sample-3-3-2.c#includevoid main() float x, y; printf(input the number x=); scanf(%f, &x); switch ( (int) x / 2 ) case 0: y =

31、 x + 1; break; case 1: y = 2 * x + 2; break; case 2: y = 3 * x + 3; break; case 3: y = 4 * x + 4; break; default: printf(error input datan); break; printf(y = %.2f , y);更精巧的程序更精巧的程序: 3.5 循环语句循环语句 3.5.1 while3.5.1 while语句语句 3.5.2 for3.5.2 for语句语句 3.5.3 do-while3.5.3 do-while语句语句 3.5.4 3.5.4 循环语句的嵌套循环

32、语句的嵌套( (多重循环多重循环 ) )循环控制结构是在条件成立时,反复执行循环体内的程序段循环控制结构是在条件成立时,反复执行循环体内的程序段.C语言中三种循环流程控制语句语言中三种循环流程控制语句:3.5.1 while语句语句while循环语句是首先判断循环执行条件循环语句是首先判断循环执行条件,当其成立当其成立(非非0值值)时,时,则反复执行循环体内的程序段则反复执行循环体内的程序段.图图3.9 while语句的流程及语句形式语句的流程及语句形式1. while循环的表达式是循环进行的条件。循环的表达式是循环进行的条件。当条件表达式值为真当条件表达式值为真(非零非零)时,执行循时,执行

33、循环体,为假环体,为假(等于等于0)则循环结束则循环结束;2. while(x)等价于等价于while(x!=0);while(!x)等等价于价于while(x = = 0); 3. 条件表达式中一般包括一个能够改变表条件表达式中一般包括一个能够改变表达式的变量,这个变量称为循环变量。达式的变量,这个变量称为循环变量。对于循环变量的初始化应在对于循环变量的初始化应在while( )语句语句之前进行。之前进行。3. 当循环体不需要实现任何功能时,可用当循环体不需要实现任何功能时,可用空语句作为循环体。空语句作为循环体。while(ch=getchar( )!=A) ;4. 循环语句应有出口。循环

34、语句应有出口。(通过循环语句的条通过循环语句的条件判断或循环体中件判断或循环体中break语句退出循环语句退出循环)。6. while语句中条件表达式与语句中条件表达式与if语句中条件语句中条件表达式都可以为各种表达式。表达式都可以为各种表达式。int i , sum; sum = 0; i = 1;while ( i = 100) sum = sum + i ; i +; While语句使用注意事项语句使用注意事项例例3.7用用 while循环语句编写一求和程序循环语句编写一求和程序 #include void main( ) int i , sum; sum = 0; i = 1; whi

35、le ( i = 100) sum = sum + i ; i +; printf(sum = %dn , sum); 该程序的运行结果为:该程序的运行结果为:sum =5050要求要求1.n之和之和?奇数之和奇数之和?十位数为十位数为3的数之和的数之和?并输出这些数并输出这些数?Sample-3-73.5.3 do-while语句语句图图3.11 do-while语句的流程与语句形式语句的流程与语句形式先执行一次循环体再判断是否循环下一次先执行一次循环体再判断是否循环下一次!例: int i=0; do printf(%3d , i+) ; while(i5);输出: 0 1 2 3 4wh

36、ile语句: int i=0; while(i5); printf(%3d , i+) ; 输出: 0 1 2 3 4当当int i=6; while语句语句do.while语句分别输出语句分别输出: ?(1)do-while循环类似于循环类似于while循环,区别在于循环,区别在于循环条件判断位置循环条件判断位置不同不同。do-while是在执行一次循环体结束时判断是否继续循环。是在执行一次循环体结束时判断是否继续循环。(2)能用)能用while循环和循环和for循环描述的程序循环描述的程序大多数情况下大多数情况下都能用都能用do-while循环描述循环描述, 比如上节中的例子也可用比如上节

37、中的例子也可用do-while来编写。来编写。(3)能用)能用do-while循环描述的程序一定能用循环描述的程序一定能用while和和for循环描述。循环描述。do-while语句与while的比较例例3.9 利用利用dowhile循环编写求和程序循环编写求和程序#include void main( ) int i=1 , sum =0; do sum = sum + i ; i +; while ( i=100); printf(sum = %d n, sum);该程序的运行结果为:该程序的运行结果为:sum =50503.5.2 for语句语句图图3.10 for语句的流程和语句形式语

38、句的流程和语句形式使用说明:for ( i=0 ; i100; i+=5) printf(%dn,i);等价于:i=0;for (; i100;) printf(%dn,i); i+=5;for循环通常用于描述循环范围比较明确。循环变量变循环通常用于描述循环范围比较明确。循环变量变化满足化满足 “初值、终值、步长初值、终值、步长”型变化规律型变化规律.如如: for ( i=0 ; i100; i+=5) printf(%dn,i);for循环中表达式循环中表达式1和表达式和表达式3还可包含逗号运算表达式。还可包含逗号运算表达式。如如: for ( a=0,b=10; a100; a+=b)

39、printf(%dn,a);for(表达式表达式1; 表达式表达式2; 表达式表达式3) 语句注意事项语句注意事项: (1)表达式表达式1,表达式,表达式2和表达式和表达式3可以全部或部分省掉,但是分号可以全部或部分省掉,但是分号不能省不能省,当省略表达式,当省略表达式2时相当于永真条件(条件永远成立),时相当于永真条件(条件永远成立),即即for( ; ; )等同于等同于 for( ; 1 ; ),此种情况下,只有通过循环体此种情况下,只有通过循环体中使用中使用break或或return语句来控制循环的结束。语句来控制循环的结束。 (2) 当当for语句省略了表达式语句省略了表达式1和和3时

40、时,等效于等效于while(表达式表达式2)循环循环.(2) 循环体也可以为空语句,起延迟一段时间的作用循环体也可以为空语句,起延迟一段时间的作用;如如: for(int i=0 ; i10000 ; i+) ;或或for(int i=0 ; i10000 ; i+) (3) 在在for 循环体内一般不要操作循环变量循环体内一般不要操作循环变量,以防,以防for 循环失控。循环失控。(4) 注意注意for语句循环量取值区间语句循环量取值区间以及条件表达式以及条件表达式2的终止循环条件。的终止循环条件。Sample-3-7如下如下2种写法功能是相同的,都是循环种写法功能是相同的,都是循环N次次,

41、。for (x=0,a=0 ; xN ; x+) a+=x;for (x=0,a=0 ; x=N-1 ;x+) a+=x;示例(a) 循环变量属于半开半闭区间 示例(b) 循环变量属于闭区间for (x=1,a=0; x=N ; x+) a+=x;循环语句编程注意:条件表达式的初始状态和终止条件,循环语句编程注意:条件表达式的初始状态和终止条件,在编写程在编写程序时应仔细推敲序时应仔细推敲, 验算程序执行到此处时各有关参数取值情况验算程序执行到此处时各有关参数取值情况.例例3.8 我们还是用上一节的例子,利用我们还是用上一节的例子,利用for循循环语句编写程序求环语句编写程序求1到到100 的

42、和的和;#include void main( ) int i ; int sum ; for (i = 1 , sum = 0 ; i = 100; i +) sum += i ; printf(sum = %d n, sum);i=1,sum=0;for ( ; i = 100; ) sum += i ; i+; i=1,sum=0;while ( i = 100 ) sum += i ; i+; Sample-3-7.cpp修改得修改得循环体部分又包含循环结构时循环体部分又包含循环结构时,就形成了多重循环就形成了多重循环.例如例如while循环语句如下循环语句如下: while(条件表达

43、式条件表达式) 循环体部分循环体部分; 多重循环多重循环: while(条件表达式条件表达式1) while(条件表达式条件表达式2) 循环体部分循环体部分2; 3.5.4 循环语句的嵌套循环语句的嵌套-多重循环多重循环循环语句组合形成二重循环的几种形式循环语句组合形成二重循环的几种形式: :(1) while( ) (2) while( )(1) while( ) (2) while( ) while( ) for( ; ; ) while( ) for( ; ; ) (3) for( ; ; ) (4) for( ; ; )(3) for( ; ; ) (4) for( ; ; ) for

44、 ( ; ; ) while( ) for ( ; ; ) while( ) 编写多重循环时应注意以下问题:(1) (1) 对于多重循环,特别要对于多重循环,特别要注意循环有关的变量赋注意循环有关的变量赋初值的位置初值的位置: :只需执行一次的赋初值操作应放在最只需执行一次的赋初值操作应放在最外层循环开始执行之前。外层循环开始执行之前。(2) (2) 内外循环变量不应该同名内外循环变量不应该同名,否则将造成循环控,否则将造成循环控制混乱,导致死循环或计算结果错误。制混乱,导致死循环或计算结果错误。(3) (3) 正确地区分内外循环体正确地区分内外循环体,在内循环执行的所有,在内循环执行的所有语

45、句必须用语句必须用 括起来组成复合语句作为内层循环括起来组成复合语句作为内层循环体体; ;属于外循环的语句应放在内层循环体之外,外属于外循环的语句应放在内层循环体之外,外循环之中。循环之中。(4) (4) 不应该在循环中执行的操作应放在最外层循环不应该在循环中执行的操作应放在最外层循环进入之前或最外层循环结束后。进入之前或最外层循环结束后。 例:输出下列由例:输出下列由 * * 组成的图案组成的图案* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

46、 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Sample 3-10-0例例3.10编程显示输出如下所示的三角形的程序编程显示输出如下所示的三角形的程序 * * * * * *算法分析算法分析:1. 输出输出6行行*,循环循环i=162. 逐行输出字符个数逐行输出字符个数2*i-13. 字符前空格数字符前空格数6-i#include void main( ) int i,j; for ( i = 0 ; i 6 ; i +) /共输出共输出n行行*字符字符

47、printf(“n”); /回车换行回车换行 for(j = 0 ; j 5-i ; j +) /每行先输出每行先输出n-i个空格个空格 printf( ); for(j=0 ; j2*i+1 ; j+) /输出输出2i+1个字符个字符* printf(*); Sample3-10例例3.11打印九九乘法表打印九九乘法表 page77 Sample3-113.6 辅助控制语句辅助控制语句 3.6.1 break语句语句 3.6.2 continue语句语句 goto 语句和标号语句和标号 return语句语句3.6.1 break语句break语句用于循环语句和语句用于循环语句和switch语

48、句。语句。 可使流程跳出可使流程跳出switch结构或循环体结构或循环体,执行后面的,执行后面的语句。语句。break语句语句只能跳出一层循环只能跳出一层循环。break语句不能用于循环体语句语句不能用于循环体语句和和switch 语句之外的任何其语句之外的任何其它语句。它语句。for(int i=1;i=5;i+) sum2=0 for(int j=i;j32767) break; sum1+=sum2; if(sum232767|sum132767) break;3.6.2 continue语句语句结束本次循环,即跳过循环体后续的语句,进行下一次的循环判定。结束本次循环,即跳过循环体后续的

49、语句,进行下一次的循环判定。continue语句和语句和break语句的区别是语句的区别是: continue语句只结束本次循环体后续语句的执行,而不是跳出循环。语句只结束本次循环体后续语句的执行,而不是跳出循环。break语句则是结束整个循环语句,执行程序中后续语句。语句则是结束整个循环语句,执行程序中后续语句。for(int i=1;i32767) break;printf( “ End”);for(int i=1;i32767) sum2=0; continue; printf( “ End”);例例3.13 把把0100之间能被之间能被5整除的数输出。整除的数输出。 void main

50、( ) int n; for(n=0;n=100;n+) /n从数字从数字0到到100逐个进行测试逐个进行测试 if(n%5!=0) /是否能整除是否能整除 continue; /不能整除则执行下一次循环不能整除则执行下一次循环 printf(%dt,n); printf(“n the end); if(n%5=0) printf(%dt,n);Sample 3-13 例例3.14.输入一个圆的半径,输出圆的面积。输入一个圆的半径,输出圆的面积。要求要求: (1).允许反复的输入半径,计算并显示圆的面积,允许反复的输入半径,计算并显示圆的面积,直到输入的半径是直到输入的半径是0时为止时为止;

51、(2).对输入的半径进行检查,若发现是负数将提示对输入的半径进行检查,若发现是负数将提示操作者重新输入。操作者重新输入。#include#include #define PI 3.1415926void main() double r, area; while (1) printf(input the radius:); scanf(%lf, &r); if (fabs(r) 1e-5) break; else if (r 0) printf(the input is errorn); continue; area = PI * r * r; printf(the area is:%l

52、fn, area); 该程序的运行结果为: input the radius:-1/输入 the input is error input the radius:1 3.1415926 input the radius:0 /退出整个do-while循环。Sample 3-14.cppgoto 语句和标号语句和标号 page81 程序中使用程序中使用goto语句时要求和标号配合,一般形式:语句时要求和标号配合,一般形式: goto 标号标号; 标号标号: 语句语句; goto 语句的功能是,把程序控制转移到标号指定的语句处。语句的功能是,把程序控制转移到标号指定的语句处。既执行既执行goto语

53、句之后,程序从指定标号处的语句继续执行。语句之后,程序从指定标号处的语句继续执行。 注意注意: goto语句常用的用法是用它退出多重循环语句常用的用法是用它退出多重循环。 用用goto语句设计程序存在的问题:语句设计程序存在的问题: 1. 破坏结构化设计风格。破坏结构化设计风格。 2. goto语句经常带来错误或隐患。语句经常带来错误或隐患。 所以不提倡使用所以不提倡使用goto语句语句3.7 典型问题程序设计举例典型问题程序设计举例 程序设计宗旨:结构化程序设计是通过三种流程程序设计宗旨:结构化程序设计是通过三种流程控制语句的组合来解决将各种问题控制语句的组合来解决将各种问题. 算法设计灵活

54、算法设计灵活多样,要熟练掌握和应用多样,要熟练掌握和应用C语言规则。语言规则。 具体编程思路:具体编程思路:分析问题中涉及的数据信息分析问题中涉及的数据信息,设计设计数据输入接口定义所需变量;数据输入接口定义所需变量;再设计数据处理程再设计数据处理程序流程序流程, 选择合适的语句书写程序;最后选择合适的语句书写程序;最后输出处理输出处理结果结果 定义变量时注意数据类型取值范围,运算处理过定义变量时注意数据类型取值范围,运算处理过程也要注意数据类型的自动转换等规则,程也要注意数据类型的自动转换等规则,算法设算法设计要灵活运用三种流程结构的组合、嵌套。计要灵活运用三种流程结构的组合、嵌套。一一 典

55、型问题典型问题1-(求数列和求数列和)例例3.15 1, 3, 5, 7, 9.前二十项之和。前二十项之和。算法分析算法分析: 循环求和运算循环求和运算 规律规律: 第第1项已知,第项已知,第i+1项项 =第第i项项 + 2 循环条件循环条件:前前20项项,适合用适合用for语句实现语句实现.#include void main( ) int i , sum, t ; /sum代表和代表和, t代表某项代表某项 sum = 0 ; t = 1 ; for (i=1 ; i=20 ; i+) sum + = t; /累加累加 t += 2; /求下一项求下一项 printf( sum = %d,

56、sum);该程序的运行结果为:该程序的运行结果为:sum =400Sample 3-15 例例3.16 求序列:求序列: 1!, 2!, 3!, 4!.的前八项之和的前八项之和.算法分析算法分析: 循环求和运算循环求和运算 数列项变化规律数列项变化规律: 第第i+1项项 =第第i项项 * (i+1) ; 循环条件循环条件:适合采用适合采用for语句语句,8项项#include void main( ) int i; long sum, t ; /sum代表和代表和, t代表某项代表某项,注意数据类型注意数据类型 sum = 0 ; t = 1 ; for (i=1 ; i=8 ; i+) su

57、m + = t; /求和求和 t *= (i+1); /求下一项求下一项t=(i+1)! printf( sum = %ld,sum); 该程序的运行结果为:该程序的运行结果为:sum =46233Sample3-16.c用用for语句双重循环实现语句双重循环实现: int i; long sum, t ; /sum代表和代表和, t为某项阶乘为某项阶乘 sum = 0 ; for (i=1 ; i=8 ; i+) t = 1; for(int j=1; j=1e-6 的数据项之和。的数据项之和。 算法分析:算法分析: 数列求和数列求和 数列项变化规律数列项变化规律: 第第i项分子项分子: a

58、i=ai-1 + 2; 分母分母: bi=bi-1* 2; 循环条件循环条件: 数据项数据项=1e-6,适合采用适合采用while语句语句329,167,85,43,21#include void main() int i; float sum=0, a, b; / sum代表和代表和,a为分子为分子,b为分母为分母 a = 1, b = 2; / 分子、分母赋初值分子、分母赋初值 while (a / b = 1e-6) sum = sum + a / b; / 累加一项累加一项 a = a + 2; / 求下一项的分子求下一项的分子 b = b * 2; / 求下一项的分母求下一项的分母

59、printf( sum = %f, sum);该程序的运行结果为:sum =2.999999 (浮点数的舍入误差造成的现象) 例例3.18 计算计算 并使最后一项的绝对值小于并使最后一项的绝对值小于1e-6为止。为止。 分析:本数列的项变化包括分子、分母以及符号。分析:本数列的项变化包括分子、分母以及符号。算法分析:算法分析: 循环求和循环求和 数列项变化规律数列项变化规律: 第第i项分子项分子: ai=x2i-1=ai-1 * x * x; 分母分母: bi= (2i+1)!=bi-1* 2i*(2i+1); 符号符号: s = s * (-1) ; 循环条件循环条件: 数据项数据项=1e-

60、6, 可采用可采用for语句也可采用语句也可采用while语句语句.! 9! 7! 5! 3)sin(9753xxxxxx.! 9! 7! 5! 3)sin(9753xxxxxx用for语句相应程序如下:#include#includevoid main() int i; / sum代表和,a为分子,b为分母 float x, sum, a, b; char s; /s代表符号 printf(please input x:); scanf(%f, &x); s = 1; sum = 0; a = x; / 分子赋初值 b = 1; / 分母赋初值 for (i = 1; a / b = 1e-6; i+) sum = sum + s * a / b a = a * x * x; b = b * 2 * i * (2 * i + 1); s *= -1;/改变符号位 printf( sum = %f

温馨提示

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

评论

0/150

提交评论