第3章 结构化程序设计

上传人:gu****n 文档编号:243138242 上传时间:2024-09-16 格式:PPT 页数:60 大小:962KB
收藏 版权申诉 举报 下载
第3章 结构化程序设计_第1页
第1页 / 共60页
第3章 结构化程序设计_第2页
第2页 / 共60页
第3章 结构化程序设计_第3页
第3页 / 共60页
资源描述:

《第3章 结构化程序设计》由会员分享,可在线阅读,更多相关《第3章 结构化程序设计(60页珍藏版)》请在装配图网上搜索。

1、单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,*,本章导读,,本章从实例分析着手,使读者了解并掌握,C,语言三种基本流程控制结构:顺序、选择、循环结构 ,加深对,C,语言程序开发设计过程的感性认识,强化培养编程思路,为进一步进行,C,语言程序设计打下基础。,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本书目录,第3章 结构化程序设计,本章主要知识点,,(,1),顺序结构及程序设计。,,,(2),选择结构及程序设计。,,(3),循环结构及程序设计。,,,(4),结构化程序设计方法、编程思路与综合实训,,第3章

2、 结构化程序设计,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本章导读,3.2 选择结构程序设计,3.3 循环结构程序设计,3.4 结构化程序设计方法与综合实训,3.1 顺序结构程序设计,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本章目录,3.1.2 顺序结构语句,3.1.3 程序实训,3.1.1 顺序结构的,C,程序实例,3.1 顺序结构程序设计,,3.1.1,C,程序实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,C,程序实例,,,,,,,,【,例3.1】编程实现:输

3、入一个长方形的二边长,求长方形的面积并输出。,,/*程序名为,l3_1.,cpp,。*/,,#include ",stdio,.h",,main(),,{ float a,b,s;,,scanf,("%f%f",,,s=a*b;,,printf,("The area of rectangle is %5.2f .\n",s);,,},,,返回本节目录,程序运行情况如下:,,输入:,,3.0 4.0 <,CR >,,输出:,,The area of rectangle is 12.00 .,,这个程序属于顺序结构,程序是按照书写的顺序自上而下一步步执行,程序中的每一条语句都被执行一次,

4、且仅能被执行一次。,【例3.1】编程,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,3.1.2 顺序结构语句1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,,,,,,C,语言的顺序结构语句可以分为四大类:,,1.表达式语句,,表达式的后面加一个分号就构成了一个语句,例如:,sum=a+b; 。,事实上,,C,语言中有使用价值的表达式语句主要有3种:,,(1)赋值语句。 例如:,sum=a+b;,,(2),自动增1、减1运算符构成的表达式语句。例如:,i++;,,(3),逗号表达式语句。例:,x=1,y=2;,,2.,空语句,,语句仅有一个

5、分号“;”,它表示什么也不做。一般和后面章节所讲循环语句结合使用起到延时作用。,,3. 复合语句,,由"{"和"}"把一些变量定义和执行语句组合在一起,称之为复合语句,又称语句块。复合语句的语句形式如下:,,{语句1;语句2;…;语句,n;},返回本节目录,,返回本节目录,例如:{,int,a=0,b=1,sum;,,sum=a+b;,,printf,("%d",sum);,,},,【,注意】与,C,语言中的其他语句不同,复合语句不以分号作为结束符,若复合语句的"}"后面出现分号,那不是该复合语句的组成成分,而是单独的一个空语句。在复合语句起始部分可以有变量定义,如:",int,a=0,b=1

6、,sum;",,也可以没有。复合语句的"{}"内可能会有多个语句,但在语法上把它整体上视为一条语句看待。,,4.函数调用语句,,由一个函数调用加上一个分号组成一个语句,如:,,,scanf,("%d%d",,,printf,("a=%d,b=%d\n",a,b);,3.1.2 顺序结构语句2,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),C,程序实例,,,,,,,,【,例3.2】由键盘输入两个整数给变量,a,和,b,,然后输出,a,和,b,,在交换,a,和,b,中的值后,再输出,a,和,b,,验证

7、两个变量中的数值是否正确地进行了交换。,,/*程序名为,l3_2.,cpp,。*/,,#include ",stdio,.h",,main(),,{,int,a,b,t;,,printf,("Enter a and b:\n");,,scanf,("%d%d",,,printf,("a=%d,b=%d\n",a,b);,,t=a;a=b;b=t;,,printf,("a=%d,b=%d\n",a,b);,,},,程序运行情况如下:,,Enter a and b:,,123 456 ,,a=123,b=456,,a=456,b=123,返回本节目录,3.1.3 程序实训,【例3.2】,,返

8、回本节目录,注意:在程序中交换两个变量,a,和,b,的值,不可以简单地用:,a=b;b=a;,两条语句来实现。假设,a,和,b,的值分别为23和78,赋值语句,a=b;,将使,a,的值变为78,接下来的,b=a;,使,b,的值变为78,这样,,a,和,b,的值最终都变为78。所以在本例中引入了中间变量,t,,用来临时存放,a,的值,这样才能完成变量,a,和,b,的正确交换。,【例3. 3】输入一个,double,类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入处理,然后输出此数,以便验证处理是否正确。,,/*程序名为,l3_3.,cpp,。*/,,#include ",stdio,

9、.h",,main(),,{ double x;,,printf,("Input x:\n");,,scanf,("%lf",,3.1.3 程序实训,【例3.3】,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,3.1.3 程序实训,【例3. 3】,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,,,printf,("(1) x=%f\n",x); /*,将,x,输出*/,,,x=x*100;,,x=x+0.5;,,x=(,int,)x;,,x=x/100; /*,

10、将,x,扩大100倍,加上0.5之后取整,再缩小100倍*/,,,printf,("(2) x=%f\n",x); /*,将四舍五入后的,x,输出*/,,},,程序运行情况如下:,,Input x:3.14159,,则输出的结果为:,,(1),x=3.141590,,(2) x=3.140000,,3.1.3 程序实训,【例3.4】,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,【例3.4】从键盘上输入一大写英文字母,要求改用相应的小写字母输出。,,/*程序名为,l3_4.,cpp,。*/,,#include ",stdio,.h",,mai

11、n(),,{ char c1,c2;,,scanf,("%c",,,printf,("The upper case is %c .\n",c1);,,c2=c1+'a'-'A';,,printf,("The lower case is %c .\n",c2);,,},程序运行时:,,输入:,B,,输出:,,The upper case is B .,,The lower case is b .,,3.2 选择结构程序设计,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.2.1 选择结构的,C,程序实例,3.2.2,if,语句,3.2.3,switch,语句,3.

12、2.4 程序实训,,返回本章目录,,3.2.1 选择结构的,C,程序实例,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,,【例3.5】请输入两个整数,a,b,,比较,a+b,和,a×b,哪个大,输出判断结果。,,/*程序名为,l3_5.,cpp,。*/,,#include ",stdio,.h",,main(),,{,int,a,b,s1,s2;,,printf,(",请输入两个整数,a,b:");,,scanf,("%d,%d",,,s1=a+b; s2=a*b; /*,求两个数的和、积*/,,,,if(s1>s2),,printf,("(a

13、+b)>(a*b) /n"); /*,语句,A*/,,,,else,,printf,(" (a+b)<=(a*b)\n"); /*,语句,B*/,,},,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,,运行结果为:,,请输入两个整数,a,b:2,3,,(a+b)<=(a*b),,在这个程序中使用了,if,分支语句,它不像前面的程序那样,按照语句的书写顺序一步步执行下去,而是根据所给条件的真假,选择两者其中之一执行。该程序执行的过程是:比较两数的和与积,如果,s1>s2,,则执行语句,A(,跳过语句,B,不执行),否则,就跳过语句,A,执行

14、语句,B。,可见,if,语句在程序中起到了改变语句执行顺序的作用。,if,语句就是我们在下一节中要介绍的条件分支语句。,3.2.1 选择结构的,C,程序实例结果,,返回本节目录,,3.2.2,,if,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),1.,,if,语句的一般形式,返回本节目录,2.,if-else,中的复合语句,3. 非关系、非逻辑表达式构成的条件表达式,4.,if,语句的嵌套,,1.,if,语句的一般形式1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,,,,1.,if,语句的一般形式:,,if,语句有两种形式:,,(1)

15、不含,else,子句的,if,语句,,语句形式如下:,,if(<,表达式>) ,,例如,if(a

16、。,返回3.2.2目录,,1.,if,语句的一般形式2,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,,,,(2)含,else,子句的,if,语句,,语句形式如下:,,if(<,表达式>),,,,[,else,,<,语句体2>],,执行过程:首先计算的值,如果该表达式的值为非零("真"),则执行,如果该表达式的值为零("假"),则跳过,直接执行,两者执行其一后再去执行,if,语句后的下一个语句。,返回3.2.2目录,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,1.,if,语句的一般形式实例,【例3.6】求分段函数的值,如果,x≥0, y=

17、2x+1,,否则,,,y=0 。,,#include ",stdio,.h",,main() /*,程序名为,l3_6.,cpp,。*/,,{,int,x,y; /*,变量,y,存放,f(x),的值*/,,,printf,(",请输入,x,的值:");,,,scanf,("%d",,,if(x>=0),,y=2*x+1;,,else,,y=0;,,printf,(",当,x=%d,时,,f(x)=%d",x,y);,,},返回3.2.2目录,,1.,if,语句的一般形式实例,《,C,语言程序设计,》,,(,Visual C++ 6.

18、0,环境),运行结果:,,请输入,x,的值:3<,CR>,,,当,x=3,时,,f(x)=7,,因为输入,x=3,,那么,x>=0,为真,所以输出2*3+1=7。,,C,语言中有一种特有的条件运算符“?:”,我们在前面章节已作介绍,它在某种程序上可以起到逻辑判断的作用。本例中的,if,语句也可用条件运算符表达式实现如下:,,y=x>=0?2*x+1:0;,,但有些判断不能用条件表达式完成,或者很繁琐、表达不清晰。,返回3.2.2目录,,2.,if-else,中的复合语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),2.,,if-else,中的复合语句,,如果两个分支中

19、需要执行的语句不止一条,必须用“{}”括起来,作为一个复合语句使用。若只是一条语句,“{}”可以省略。,,【注意】,,(1),if,后面的一定要有括号;,,(2),if,和,else,同属于一个,if,语句,,else,不能作为语句单独使用,它只是,if,语句的一部分,与,if,配对使用,因此程序中不可以没有,if,而只有,else;,,(3),只能执行与,if,有关的语句或者执行与,else,有关的语句,而不可能同时执行两者;,,(4)如果和是非复合语句,那么该语句一定要以分号结束,,,(5),if,语句的表达式可以是任意类型的,C,语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之

20、一。,返回3.2.2目录,,3.非关系、非逻辑表达式构成的条件表达式1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.非关系、非逻辑表达式构成的条件表达式,,【例3.10】以"赋值表达式"为分支条件的实例。,,/*程序名为,l3_10.,cpp,。*/,,,,#include",stdio,.h",,main(),,{,int,s;,,if(s=2),,printf,("hello");,,else,,printf,("error");,,},if,后面圆括号中的表示,分支条件的类型不限于逻辑/关系表达式,可以是任意的,C,语言有效表达式(如赋值表达式,算术表达式等

21、等),因此也可以是作为表达式特例的常量或变量。,返回3.2.2目录,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.非关系、非逻辑表达式构成的条件表达式2,【例3.10】中的条件表达式是一个赋值表达式,并不是判断,s,是否等于2。相当于,if(2),printf,("hello");,,这是合法的。由于该条件表达式的值是非零值,恒为真,故本程序的,printf,("error");,无论如何都不会被执行。,if,语句最终执行哪一个分支,取决于条件表达式的计算结果。同一个条件的也可以用多种表达方式。,,【例3.11】以"变量"为分支条件的实例。,,/*程序名为,l3_

22、11.,cpp,。*/,,#include ",stdio,.h",,main(),,{,int,x,y;,scanf,("%d",,,if(x),,y=1;,,else,,y=-1;,返回3.2.2目录,,3.非关系、非逻辑表达式构成的条件表达式3,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,printf,("y=%d\n",y);,,},,,现把程序中,if(x),改成,if(x!=0),,此时虽然条件表达式写法不同,但是完成的功能是相同的。,,下面两种表示方法经常使用:,,if(x),等价于,if(x!=0),,if(!x),等价于,if(x==0),返回3.

23、2.2目录,,4.,if,语句的嵌套1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,在一个,if,语句中又包含另一个,if,语句,从而构成了,if,语句的嵌套使用。内嵌的,if,语句既可以嵌套在,if,子句中,也可以嵌套在,else,子句中。例如:,【例3.12】输入,a,b,两个整数的值,比较大小并输出结果。,,#,include ",stdio,.h“,,/*,程序名为,l3_12.,cpp,。*/,,main(),,{,int,a,b;,printf,(",请输入,a,b:") ;,scanf,("%d%d",,,,if(a>b),,,printf,("a>b

24、\n");,,else,,,if(a

25、自己将来的修改)。如果,if,的数目和,else,的数目相同,从内层到外层一一对应,不易出错。如果,if,与,else,的数目不一致,为实现编程者的意图,必要的时候必须加"{}",来强制确定配对关系。否则,就不能实现编程者的真正意图。,返回3.2.2目录,,4.,if,语句的嵌套实例1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),,【例3.13】写出下列程序的输出结果。,,/*程序名为,l3_13.,cpp,。*/,,#include",stdio,.h",,main(),,{,int,x=4,y=5,z=2,max;,,max=x;,,if(z>y),,if(z>x

26、),,max=z;,,else,,if(y>x),,max=y;,,printf,(" max=%d",max);,,},,运行结果:,,,max=4,返回3.2.2目录,,4.,if,语句的嵌套实例2,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),【例3.14】编写程序,根据输入的学生成绩,给出相应的等级。90分以上的等级为,A,60,分以下的等级为,E,,其余每10分一个等级。程序如下:,,#,include",stdio,.h",,main() /*,程序名为,l3_14.,cpp,。*/,,{,int,g;,pr

27、intf,("input g:");,,scanf,("%d",,printf,("g=%d: ",g);,,if(g>=90),,printf,("A\n");,,else if(g>=80),,printf,("B\n");,,else if(g>=70),,printf,("C\n");,,else if(g>=60),,printf,("D\n");,,else,,,printf,("E\n");,,},返回3.2.2目录,,4.,if,语句的嵌套实例3,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),当执行以上程序时,首先输入、输出学生的成绩,然后进入,if,

28、语句;,if,语句中的表达式将依次对学生成绩进行判断,若能使某,if,后的表达式值为1,则执行与其相应的子句,之后便退出整个,if,结构。,,例如,若输入的成绩为78分,首先输出:,g=78 : ,,当从上至下逐一检测时,使,g>=70,这一表达式的值为1,因此在输出",g=78 :",之后再输出,C,,便退出整个,if,结构。,,若输入的成绩为30分,首先输出相应成绩",g=30:",,其次进入相应判断,最后再输出相应等级",E",,便退出整个,if,结构。,返回3.2.2目录,,3.2.3,switch,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),1.,,s

29、witch,语句的一般形式,返回本节目录,2.,switch,语句的执行过程,3.,switch,语句的实例,,1,.,,switch,语句的一般形式,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),1.,switch,语句的一般形式,switch,语句的一般形式是:,,switch(<,表达式>),,{,case <,常量表达式1>:,,,case <,常量表达式2>:,,……,,,case <,常量表达式,n>:<,语句序列,n>,,[default:<,语句序列,n+1>],,},,【,说明】:,,①,switch,语句是关键字,其后面大括号里括起来的部分称为

30、,switch,语句体。要特别注意必须写这一对大括号。,,②,switch,后的运算结果可以是整型、字符型或枚举型表达式等,两边的括号不能省略。,返回3.2.3目录,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),③,case,也是关键字,与其后面合称为,case,语句标号。的值在运行前必须是确定的,不能改变,因此不能是包含变量的表达式,而且数据类型必须与一致。如:,,,int,x=3,y=7, z;,,switch(z),,{ case 1+2: /*,是正确的*/,,,case x+y: /*,是错误的*/,,},,④,case,和常量之间要有空格,,case,

31、后面的常量之后有":"。,,⑤,default,也是关键字,起标号的作用。代表所有,case,标号之外的那些标号。,default,可以出现在语句体中任何标号位置上。在,switch,语句体中也可以无,default,标号。,,⑥、等,可以是一条语句,也可以是若干语句。,,⑦必要时,,case,语句标号后的语句可以不写。,,1,.,,switch,语句的一般形式,返回3.2.3目录,,2,.,,switch,语句的执行过程,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),2.,switch,语句的执行过程,首先计算的值,然后在,switch,语句体内寻找与该吻合的,cas

32、e,标号,如果有与该值相等的标号,则执行从该标号后开始的各语句,包括在其后的所有,case,和,default,语句,直到,switch,语句体结束。如果没有与该值相等的标号,并且存在,default,标号,则从,default,标号后的语句开始执行,直到,switch,语句体结束。如果没有与该值相等的标号,并且不存在,default,标号,则跳过,switch,语句体,什么也不执行。,,在,switch,语句中使用,break,语句,,break,语句也称间断语句。可以在各个,case,之后的语句最后加上,break,语句,每当执行到,break,语句时,立即跳出,switch,语句体。,s

33、witch,语句通常总是和,break,语句联合使用,使得,switch,语句真正起到多个分支的作用。,返回3.2.3目录,,3,.,,switch,语句的实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.,switch,语句的实例,【例3.17】模拟自动饮料机。按屏幕所示功能,输入所选择的合法数字,输出可获得的相应饮料名称。程序如下:,,/*程序名为,l3_17.,cpp,。*/,,#include ",stdio,.h",,main(),,{,int,button;,,printf,("==========,自动饮料机 ==========\,n");,,pr

34、intf,("1.,可口可乐\,n");,,printf,("2.,雪碧\,n");,,printf,("3.,芬达\,n");,,printf,("4.,百事可乐\,n");,,printf,("5.,非常可乐\,n");,,printf,(",请按1--5键选择饮料:\,n");,,scanf,("%d",,,,返回3.2.3目录,,3,.,,switch,语句的实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),switch(button),,{ case 1:,printf,("\n,你获得一听可口可乐\,n");break;,,case 2:,printf,

35、("\n,你获得一听雪碧\,n");break;,,case 3:,printf,("\n,你获得一听芬达\,n");break;,,case 4:,printf,("\n,你获得一听百事可乐\,n");break;,,case 5:,printf,("\n,你获得一听非常可乐\,n");break;,,default:,printf,("\n,非法操作!\,n");break;,,},,},,运行结果:,,=============自动饮料机==============,,1.可口可乐,,2.雪碧,,3.芬达,,4.百事可乐,,5.非常可乐,,请按1-5按钮选择饮料:3<,CR>,,你获得一

36、听芬达,返回3.2.3目录,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本章目录,3.3.2,while,语句,3.3.3,do-while,语句,3.3.1 循环结构的,C,程序实例,3.3 循环结构程序设计,3.3.4,for,语句,3.3.5 循环的嵌套,3.3.6,break,语句和,continue,语句,3.3.,7,程序实训,,3.3.1,循环结构的,C,程序实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),【例3.19】有一张厚度为0.1毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折

37、一次就超过)珠穆朗玛峰的高度?程序如下:,,,main(),,/*,程序名为,l3_14.,cpp,。*/,,{ double h=0.1;,int,n=0; /* n,用来累计对折次数*/,,,while(h<=8848180),,{ h=h*2; n=n+1;,,},,printf,(",对折次数为:%,d,,此时厚度:%.2,f\n",n-1,h/2);,,},,重复对折一张纸,实质就是厚度乘以2,次数加1。用顺序结构编程为:,,h=h*2; n=n+1;,,……,,这样的语句一直重复写到,h,满足题目要求为止。实际中这类问题,就可用循环结构编程实现。本例中,使用的

38、是循环结构中的,while,语句。,,C,语言共有三种类型的循环语句,,while、do-while,和,for,语句。,返回本节目录,,3.3.2,while,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,1,.,while,语句的一般形式,while(<,表达式>),,,,说明:,while,语句是,C,的关键字,其后面的一对括号中的,可以是,C,语言的任意合法表达式,由它来控制循环体语句是否执行,括号不能省略。可以是一条语句,也可以是多条语句,一般来说循环体是一条语句时不用加"{}",如果是多条语句,就一定要加"{}" 构成复合语句。其中的语句

39、可以是空语句、表达式语句或作为循环体一部分的复合语句,如果循环体是一个空语句,表示不执行任何操作(一般用于延时)。,(1)计算,while,后一对括号中的的值。当值为非零时,则执行步骤(2);当值为零时,则执行步骤(3)。,,(2)执行后,转去执行步骤(1)。,,(3)退出,while,循环。,2,.,while,语句的执行过程,,while,语句实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.,while,语句实例,例3.21】用,while,循环语句实现从1加到100,并将结果打印出来。,/*程序名为,l3_21.,cpp,。*/,,#include ",s

40、tdio,.h",,main() / *,若,sum,的值超过,int,型变量能表示的范围,则设置成长整型*/,,{,int,sum=0,i=1; while(i<=100),,{ sum+=i;,,i++;},,printf,(",其和是 %,d\n",sum);,,/*,若,sum,为长整型,则相应的输出也设置成长整型,ld*/,,},运行结果:,,其和是5050,返回本节目录,,,,do,,<,循环体语句>,,while(<,表达式>);,,说明:,do,是,C,语言的关键字,必须和,while,联合使用。,do-while,循环由,do,开始,用,while,结束;注意,在,while

41、,结束后必须有分号,它表示该语句的结束。其它同,while,循环语句。,3.3.3,do-while,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),1,.,do-while,语句的一般形式,返回本节目录,2,.,do-while,语句的执行过程,,(1),执行,do,后面的。,,(2)计算,while,后一对括号中的的值。当值为非零时,转去执行步骤(1)。当值为零时,则执行步骤(3)。,,(3)退出,while,循环。,,运行结果:,,其和是5050,,在本例中,循环条件和循环体以及得到的结果都是和,while,循环一样的,只是用,do-while,语句来实现。,

42、do-while,语句实例,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),3.,do-while,语句实例,,【例3.23】用,do-while,语句实现求1+2+…+100的和。,,#,include ",stdio,.h" /*,程序名为,l3_23.,cpp,。*/,,main(),,{,int,sum=0,i=1; / *,若,sum,的值超过,int,型变量能表示的范围,则设置成长整型*/,,,do,,{ sum+=i;,,i++;} while(i<=100);,,printf,(",其和是 %,d\n",sum);,,,,/*,若,sum,为长整型,

43、则相应的输出也设置成长整型,ld*/,,},返回本节目录,,3.3.4,for,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),for,语句是,C,语言提供的一种在功能上比前面两种循环语句更强的一种循环语句。,,for,循环语句格式如下:,,for(<,表达式1>;;),,,,说明:,for,是,C,语言的关键字,三个表达式之间的必须用分号";"隔开。三个表达式可以是任意形式的,C,表达式,通常主要用于,for,循环的控制。一般用于计算循环变量初始值,为循环体是否执行的条件,为循环变量的调整。的使用同,while、do-while,循环语句。,for,循环语句的格式

44、还可以表示为:,,for(<,初始化表达式>;;),,,,在某种情况下,用,for,语句表示循环,显得紧凑而清晰。尤其是它能利用自动地使循环变量发生改变,不像,while,结构那样要在循环体中设置"修正操作"。实际上,,for,语句中的不仅限于修正循环变量,而且可以是任何操作。例如前面例题中介绍的求1到100的和,用,for,语句可以表示为:,,,for(sum=0,i=1;i<=n;sum+=i,i++);,返回本节目录,1,.,for,语句的一般形式,,for,语句的执行过程,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,2.,for,语句的执行过程,

45、①首先计算。,,②求的值;若其值为非零,则转去执行③;若的值为零,则转去执行⑤,结束,for,语句。,,③执行一次,for,循环体。,,④求解,转②执行。,,⑤结束循环,执行循环之后的语句。,3,.,for,语句实例,【例3.25】用,for,语句实现求1-100之和。,,#,include ",stdio,.h",,main() /*,程序名为,l3_25.,cpp,。,,{,int,sum=0,i=1;,,/ *,若,sum,的值超过,int,型变量能表示的范围,则设置为长整型*/,,for,语句的实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,f

46、or( ;i<=n;i++),,sum+=i;,,printf,(",其和是 %,d\n",sum);,,/*,若,sum,为长整型,则相应的输出也设置成长整型,ld*/,,},,运行结果:,,其和是5050,,for,循环的执行过程:先执行表达式1,为空语句,然后判断",i<=n",是否成立,如果为真,执行循环体",sum+=i",,转而执行",i++",,再判断",i<=n",,如此反复,直到",i<=n",为假为止。在这个例子中,,i,是循环控制变量,每次循环时,它的值都被改变且进行检验。,,for,语句多样性,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本

47、节目录,for,语句的多样性,由于,C,语言中表达式的形式十分丰富,对,for,语句的三个控制表达式可以灵活运用,因此造成,for,语句形式多种多样。,,(1)为空语句,,如上例中求1-100的和。本来由完成的初始化可提到循环之外完成。,,(2)和是逗号表达方式,(,3)用空循环来延长时间,,常用空循环来产生延时,以达到某种特定要求。如:,,for(t=0;t,,是一个无限循环。将成为死循环。,,3.3.5 循环的嵌套,《,C,语

48、言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,在一个循环内又完整地包含另一个循环,称为循环的嵌套,即循环体自身包含循环语句。,,前面介绍了三种类型的循环,它们自己本身可以嵌套,如在,for,循环中包含另一个,for,循环,也可以互相嵌套,例如可以,for,循环中包含一个,while,循环或者,do-while,循环等等。,,下面通过几个例子来介绍循环嵌套的概念和运用。,【例3.26】打印如下形式的乘法小九九表:,,1*1=1,,2*1=2 2*2=4,,……,,9*1=9 9*2=18 9*3=27 …… 9*9=81,,分析:表体共九行,所以首先考虑一个打印九

49、行的算法:,,for(i=1;i<=9;i++),,{,打印第,i,行},,其次考虑如何"打印第,i,行"。每行都有,i,个表达式?*?=积,可以写为:,,for(j=1;j <= i;j++),,{,打印第,j,个表达式},,循环的嵌套实例,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,打印第,j,个表达式,可写为:,,printf,("%d*%d=%-3d",i,j,i*j);,,在写这个语句时,不写换行,只能在第,j,个表达式输出后写一个语句使之换行。,,printf,("\n");,,综上所述,打印以上形式的乘法小九九表的程序如下:,【例3.26】

50、 /*程序名为,l3_26.,cpp,。*/,,#include ",stdio,.h",,main(),,{,int,i,j; /* i,j,分别控制行和列的输出*/,,for(i=1;i<=9;i++),,{ for(j=1;j <= i;j++),,printf,("%d*%d=%-3d",i,j,i*j);,,printf,("\n"); /*,另起一行*/,,},,},,3.3.6,break,语句和,continue,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,1.,br

51、eak,语句,2,.,continue,语句,,1.,break,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回3.3.6目录,1.,break,语句,前面已经介绍过用,break,语句跳出当前的,switch,语句流程。在循环结构中,也可以用,break,语句使流程跳出本层循环体,从而提前强制性结束本层循环。,,break,语句的一般形式为:,,,break;,【例3.28】在循环体中,break,语句执行示例。,,#,include ",stdio,.h",,main() /*,程序名为,l3_28.,cpp,。*/,,{,int,i,s=0;,,for(

52、i=1;i<=10;i++),,{ s=s+i;,,if(s>5) break;,,printf,("s=%d\n",s);,,},,printf,(",使用,break,语句时,,s,的最终值为:%,d\n",s);,,},,break,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),程序运行后的输出结果如下:,,s=1,,s=3,,使用,break,语句时,,s,的最终值为:6,,本例中,如果没有,break,语句,程序将进行10次循环;但当,i=3,时,,s,的值为6,,if,语句中的表达式,s>5,值为1,于是执行,break,语句, 循环立即中断,跳出,

53、for,循环,从而提前中止循环,并转向循环体外的下一条语句。此时,,s,的值为6。,,break,语句使用说明:,,(1)只能在,switch,语句体和循环体内使用,break,语句。,,(2)当,break,语句出现在,其作用是跳出该,switch,语句体。当,break,语句出现在循环体中,但并不在,switch,语句体内时,则在执行,break,语句后,使流程跳出本层循环体。,返回3.3.6目录,,2.,Continue,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),2.,continue,语句,continue,语句的一般形式为:,,,continue,;

54、,【例3.30】将【例3.28】中的,break,语句改用,continue,语句,来比较两者的区别。,,#,include ",stdio,.h",,main() /*,程序名为,l3_30.,cpp,。*/,,{,int,i,s=0;,,for(i=1;i<=10;i++),,{ s=s+i;,,if(s>5) continue;,,printf,("s=%d\n",s);,,},,printf,(",使用,continue,语句时,,s,的最终值为:%,d\n",s);,,},返回3.3.6目录,,Continue,语句,《,C,语言程序设计,》,,(,Visual C++ 6.0,环

55、境),程序运行后的输出结果如下:,,s=1,,s=3,,使用,continue,语句时,,s,的最终值为:55,,在本例中,当,i=1,时,输出,s=1,,当,i=2,时,输出,s=3,,当,i=3,时,,s,的值为6,,if,语句中的表达式,s>5,值为1,于是执行,continue,语句,跳过循环体中余下的语句,而去对,for,语句中的"表达式3"求值,然后进行"表达式2"的条件测试,最后根据"表达式2"的值来决定循环是否继续执行。不论,continue,是作为何种语句成分出现的,都将按此功能执行,这点与,break,有所不同。可以看出,,continue,语句的功能是结束本次循环。,返回

56、3.3.6目录,,3.3.7 编程实训1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,【例3.32】编程输出如下图形:,,*,,***,,*****,,*******,,*********,,程序如下:,,,#,include ",stdio,.h",,main() /*,程序名为,l3_32.,cpp,。*/,,{,int,i,j;,,for(i=1;i<=5;i++),,{ for(j=1;j<=10-i;j++),,printf,(" ");,,for(j=1;j<=2*i-1;j++),,printf,("*");,,printf,("\n"

57、);,,,},,},,3.3.7 编程实训2,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节首,【例3.33】求整数3-100中的素数。为了检查某数是否是素数,采用的方法是,从,n=3,起直到100止,逐个用,i=2~n/2,去试除,n,,只要有一个能整除,说明该数不是素数。程序如下:,main(),/*,程序名为,l3_27.,cpp,。*/,,{,int,i,n,num;,,for(n=3,num=0;n<=100;n++),,{ for(i=2;i<=n-1;i++),,if(n%i==0) break;,,if(n==i),,/*,若,n=i

58、,,则说明,n,不能被2~,n-1,整除,所以,n,为素数 */,,{,printf,("%4d",n);,,,,num++;,,},,},printf,("\n,素数个数是:%,d\n",num);,,},,运行结果:,,3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97,,素数个数是:24,,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本章目录,3.4.2,综合实训,3.4.1,结构化程序设计方法,3.4,结构化程序设计方法与

59、综合实训,,3.4.1,结构化程序设计方法,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),结构化程序设计的思想是由,E.W.,Dijkstra,等人于上世纪60年代后期提出的。其思想是:一个程序的任何逻辑问题均可用“顺序”、“选择”和“循环”这三种基本逻辑结构来描述。实现这些程序流程的语句都是流程控制语句。流程控制语句在程序设计中起着重要的作用,通过三种基本控制结构,使结构化程序具有唯一入口和唯一出口,没有死循环。再一个特点是程序组织结构化,即程序设计采用自顶向下,逐步细化,功能模块化的方法。这种方法就是将程序设计成一个个功能简单独立的模块.,,C,语言是一种很好的结构

60、化程序设计语言,它提供了比其他高级语言更丰富的流程控制语句。有四种语句是顺序执行的:(1)空语句;(2)表达式语句;(3)函数调用语句;(4)复合语句。选择语句有,if,语句和,switch,语句。循环语句有,for,while,和,do-while,语句以及一些辅助流程转向语句,如,continue,break,等。顺序结构、选择结构和循环结构共同作为各种复杂程序的基本构造单元。由三种结构经过反复嵌套构成的程序称为结构化程序。使用结构化程序设计的优点是:结构化构造减少了程序的复杂性,提高了可靠性、可测试性和可维护性;使用少数基本结构,使程序结构清晰,易读易懂;容易验证程序的正确性。,,循环程

61、序设计是有一定的编程规律和思路的,穷举与迭代是两类具有代表性应用的基本算法。,,本节主要内容是引导读者编程来实现这些基本算法。,返回本节目录,,3.4.2 综合实训1,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,【例3.34】用泰勒级数求,e,的近似值。直到最后一项小于1,e-6,为止。,,,e=1+1/1!+1/2!+1/3!+…+1/n!+…,,程序如下:,,/*源程序名为,l3_34.,cpp,。,泰勒级数,e*/,#,include ",stdio,.h",,main(),,{ float e=1.0,t=1.0; /*,用,e,存放结果,用

62、,t,存放,n!,n,的值每次加1*/,,,int,n=1;,,while(1/t>1e-6),,{ t=t*n; /*,求,n!*/,,e=e+1/t; /*,实现求,n!,的倒数的和 */,,,n++;,,},,printf,("e=%8.6f\n",e);,,},,运行结果:,,e=2.718282,,3.4.2 综合实训2,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,通过本例可以体现这样一个编程思路:凡是遇到求若干个有规律变化的项的乘积,就可在循环体中用,求累乘积,的,编程通式,t=t*x,来编程实现;求其和,用,求

63、累加和,的,编程通式,s=s+x,来编程实现,其中,t 、s,分别为累积、累和,初值分别为,t=1,s=0,x,为变化的项的通式。,【例3.35】百钱百鸡问题。公元前,我国古代数学家张丘建在《算经》一书中提出了"百鸡问题":鸡翁一,值钱五,鸡母一,值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?,,分析:这是一个有名的不定方程问题。设:,,cocks:,鸡翁数、,hens:,鸡母数、,chicks:,鸡雏数,则有:,,cocks+hens+chicks=100,,5*cocks+3*hens+chicks/3=100,,据上述不定方程,很容易得到三个变量的取值条件:,,cocks:

64、0-19,之间的整数。,,hens:0-33,之间的整数。,,chicks:0-100,之间的整数。,,解题思路:依次取,cocks,值域中的一个值,然后再在试取,hens,值域中的每一个值,根据前两者取值,求出,chicks,后,看是否合乎题意,合乎者为解。,,3.4.2 综合实训3,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,编程如下:/*源程序名为,l3_35.,cpp,。,百钱百鸡问题*/,,#,include ",stdio,.h",,main(),,{,int,cocks,hens,chicks;,,for(cocks=1;cocks<=1

65、9;cocks++),,for(hens=1;hens<=33;hens++),,{ chicks=100-cocks-hens;,,if(5*cocks+3*hens+chicks/3.0==100),,,printf,("cocks=%d,hens=%d,chicks=%d\n",cocks,hens,chicks");,,} },,程序运行结果如下:,,cocks=4,hens=18,chicks=78,,cocks=8,hens=11,chicks=81,,cocks=12,hens=4,chicks=84,,本例采用的编程算法是,穷举法,。其,基本思想是,:对问题的所

66、有可能状态一一测试,直到找到解或全部可能状态都测试过为止。下面例题为另一类型的穷举问题。,,,【例3.36】爱因斯坦的阶梯问题。,,设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶时,正好到阶梯顶。问共有多少阶梯?,,问题分析:设阶梯数为:,ladders,,则题中条件可以改写为:,,(1),ladders % 2 =1,,(2)ladders % 3 =2,,(3)ladders % 5 =4,,(4)ladders % 6 =5,,(5)ladders % 7 =0,,由条件(5)知,阶梯数一定为7的倍数。于是可以从7开始,分别对7、17、21、28、35…数列进行测试,看哪一个符合题意。由条件(1)又知,阶梯数一定是奇数,因此可把上述数列中的数去掉一半。,,算法:依次对7、7+14、7+14+14、…用条件(2)(3)(4)进行测试,找出符合题意者。,3.4.2 综合实训4,《,C,语言程序设计,》,,(,Visual C++ 6.0,环境),返回本节目录,,3.4.2 综合实训5,《,C,语言程序设计,》

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

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!