第3章结构化程序设计

上传人:gu****n 文档编号:243125717 上传时间:2024-09-16 格式:PPT 页数:60 大小:962KB
返回 下载 相关 举报
第3章结构化程序设计_第1页
第1页 / 共60页
第3章结构化程序设计_第2页
第2页 / 共60页
第3章结构化程序设计_第3页
第3页 / 共60页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章导读,本章从实例分析着手,使读者了解并掌握,C,语言三种基本流程控制结构:顺序、选择、循环结构 ,加深对,C,语言程序开发设计过程的感性认识,强化培养编程思路,为进一步进行,C,语言程序设计打下基础。,C,语言程序设计,(,Visual C+ 6.0,环境),返回本书目录,第3章 结构化程序设计,本章主要知识点,(,1),顺序结构及程序设计。,(2),选择结构及程序设计。,(3),循环结构及程序设计。,(4),结构化程序设计方法、编程思路与综合实训,第3章 结构化程序设计,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】编程实现:输入一个长方形的二边长,求长方形的面积并输出。,/*程序名为,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 ,输出:,The area of rectangle is 12.00 .,这个程序属于顺序结构,程序是按照书写的顺序自上而下一步步执行,程序中的每一条语句都被执行一次,且仅能被执行一次。,【例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.,空语句,语句仅有一个分号“;”,它表示什么也不做。一般和后面章节所讲循环语句结合使用起到延时作用。,3. 复合语句,由和把一些变量定义和执行语句组合在一起,称之为复合语句,又称语句块。复合语句的语句形式如下:,语句1;语句2;语句,n;,返回本节目录,返回本节目录,例如:,int,a=0,b=1,sum;,sum=a+b;,printf,(%d,sum);,【,注意】与,C,语言中的其他语句不同,复合语句不以分号作为结束符,若复合语句的后面出现分号,那不是该复合语句的组成成分,而是单独的一个空语句。在复合语句起始部分可以有变量定义,如:,int,a=0,b=1,sum;,,也可以没有。复合语句的内可能会有多个语句,但在语法上把它整体上视为一条语句看待。,4.函数调用语句,由一个函数调用加上一个分号组成一个语句,如:,scanf,(%d%d,printf,(a=%d,b=%dn,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,,验证两个变量中的数值是否正确地进行了交换。,/*程序名为,l3_2.,cpp,。*/,#include ,stdio,.h,main(),int,a,b,t;,printf,(Enter a and b:n);,scanf,(%d%d,printf,(a=%d,b=%dn,a,b);,t=a;a=b;b=t;,printf,(a=%d,b=%dn,a,b);,程序运行情况如下:,Enter a and b:,123 456 ,a=123,b=456,a=456,b=123,返回本节目录,3.1.3 程序实训,【例3.2】,返回本节目录,注意:在程序中交换两个变量,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,.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=%fn,x); /*,将,x,输出*/,x=x*100;,x=x+0.5;,x=(,int,)x;,x=x/100; /*,将,x,扩大100倍,加上0.5之后取整,再缩小100倍*/,printf,(2) x=%fn,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,main(), 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.2.4 程序实训,返回本章目录,3.2.1 选择结构的,C,程序实例,C,语言程序设计,(,Visual C+ 6.0,环境),返回本节目录,【例3.5】请输入两个整数,a,b,,比较,a+b,和,ab,哪个大,输出判断结果。,/*程序名为,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(s1s2),printf,(a+b)(a*b) /n); /*,语句,A*/,else,printf,( (a+b)=(a*b)n); /*,语句,B*/,C,语言程序设计,(,Visual C+ 6.0,环境),运行结果为:,请输入两个整数,a,b:2,3,(a+b)s2,,则执行语句,A(,跳过语句,B,不执行),否则,就跳过语句,A,执行语句,B。,可见,if,语句在程序中起到了改变语句执行顺序的作用。,if,语句就是我们在下一节中要介绍的条件分支语句。,3.2.1 选择结构的,C,程序实例结果,返回本节目录,3.2.2,if,语句,C,语言程序设计,(,Visual C+ 6.0,环境),.,if,语句的一般形式,返回本节目录,2.,if-else,中的复合语句,3. 非关系、非逻辑表达式构成的条件表达式,4.,if,语句的嵌套,.,if,语句的一般形式1,C,语言程序设计,(,Visual C+ 6.0,环境),1,if,语句的一般形式:,if,语句有两种形式:,(1)不含,else,子句的,if,语句,语句形式如下:,if() ,例如,if(ab)t=a;a=b;b=t;,其中,,if,是,C,语言的关键字,表达式两侧的圆括号不可少,最后是一条语句,称为,if,子句。如果在,if,子句中需要多个语句,则应该使用花括号把一组语句括起来组成复合语句,这样在语法上仍满足一条语句的要求。,执行过程:首先计算紧跟在,if,后面一对圆括号中的表达式的值,如果该表达式的值为非零(“真”),则执行其后的,if,子句,然后去执行,if,语句后的下一个语句。如果该表达式的值为零(“假”),则跳过,if,子句,直接执行,if,语句后的下一个语句。,返回3.2.2目录,.,if,语句的一般形式2,C,语言程序设计,(,Visual C+ 6.0,环境),(2)含,else,子句的,if,语句,语句形式如下:,if(),else,执行过程:首先计算的值,如果该表达式的值为非零(真),则执行,如果该表达式的值为零(假),则跳过,直接执行,两者执行其一后再去执行,if,语句后的下一个语句。,返回3.2.2目录,C,语言程序设计,(,Visual C+ 6.0,环境),.,if,语句的一般形式实例,【例3.6】求分段函数的值,如果,x0, y=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目录,.,if,语句的一般形式实例,C,语言程序设计,(,Visual C+ 6.0,环境),运行结果:,请输入,x,的值:3,当,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,中的复合语句,如果两个分支中需要执行的语句不止一条,必须用“”括起来,作为一个复合语句使用。若只是一条语句,“”可以省略。,【注意】,(1),if,后面的一定要有括号;,(2),if,和,else,同属于一个,if,语句,,else,不能作为语句单独使用,它只是,if,语句的一部分,与,if,配对使用,因此程序中不可以没有,if,而只有,else;,(3),只能执行与,if,有关的语句或者执行与,else,有关的语句,而不可能同时执行两者;,(4)如果和是非复合语句,那么该语句一定要以分号结束,,(5),if,语句的表达式可以是任意类型的,C,语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。,返回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,语言有效表达式(如赋值表达式,算术表达式等等),因此也可以是作为表达式特例的常量或变量。,返回3.2.2目录,C,语言程序设计,(,Visual C+ 6.0,环境),3.非关系、非逻辑表达式构成的条件表达式2,【例3.10】中的条件表达式是一个赋值表达式,并不是判断,s,是否等于2。相当于,if(2),printf,(hello);,,这是合法的。由于该条件表达式的值是非零值,恒为真,故本程序的,printf,(error);,无论如何都不会被执行。,if,语句最终执行哪一个分支,取决于条件表达式的计算结果。同一个条件的也可以用多种表达方式。,【例3.11】以变量为分支条件的实例。,/*程序名为,l3_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=%dn,y);,现把程序中,if(x),改成,if(x!=0),,此时虽然条件表达式写法不同,但是完成的功能是相同的。,下面两种表示方法经常使用:,if(x),等价于,if(x!=0),if(!x),等价于,if(x=0),返回3.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(ab),printf,(abn);,else,if(ab),printf,(ay),if(zx),max=z;,else,if(yx),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;,printf,(input g:);,scanf,(%d,printf,(g=%d: ,g);,if(g=90),printf,(An);,else if(g=80),printf,(Bn);,else if(g=70),printf,(Cn);,else if(g=60),printf,(Dn);,else,printf,(En);,返回3.2.2目录,4.,if,语句的嵌套实例3,C,语言程序设计,(,Visual C+ 6.0,环境),当执行以上程序时,首先输入、输出学生的成绩,然后进入,if,语句;,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,环境),.,switch,语句的一般形式,返回本节目录,2.,switch,语句的执行过程,3.,switch,语句的实例,1,.,switch,语句的一般形式,C,语言程序设计,(,Visual C+ 6.0,环境),1.,switch,语句的一般形式,switch,语句的一般形式是:,switch(),case :,case :,case :,default:,【,说明】:,switch,语句是关键字,其后面大括号里括起来的部分称为,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,后面的常量之后有:。,default,也是关键字,起标号的作用。代表所有,case,标号之外的那些标号。,default,可以出现在语句体中任何标号位置上。在,switch,语句体中也可以无,default,标号。,、等,可以是一条语句,也可以是若干语句。,必要时,,case,语句标号后的语句可以不写。,1,.,switch,语句的一般形式,返回3.2.3目录,2,.,switch,语句的执行过程,C,语言程序设计,(,Visual C+ 6.0,环境),2.,switch,语句的执行过程,首先计算的值,然后在,switch,语句体内寻找与该吻合的,case,标号,如果有与该值相等的标号,则执行从该标号后开始的各语句,包括在其后的所有,case,和,default,语句,直到,switch,语句体结束。如果没有与该值相等的标号,并且存在,default,标号,则从,default,标号后的语句开始执行,直到,switch,语句体结束。如果没有与该值相等的标号,并且不存在,default,标号,则跳过,switch,语句体,什么也不执行。,在,switch,语句中使用,break,语句,break,语句也称间断语句。可以在各个,case,之后的语句最后加上,break,语句,每当执行到,break,语句时,立即跳出,switch,语句体。,switch,语句通常总是和,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);,printf,(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,(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,你获得一听芬达,返回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毫米的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可以抵达(再对折一次就超过)珠穆朗玛峰的高度?程序如下:,main(),/*,程序名为,l3_14.,cpp,。*/, double h=0.1;,int,n=0; /* n,用来累计对折次数*/,while(h=8848180), h=h*2; n=n+1;,printf,(,对折次数为:%,d,此时厚度:%.2,fn,n-1,h/2);,重复对折一张纸,实质就是厚度乘以2,次数加1。用顺序结构编程为:,h=h*2; n=n+1;,这样的语句一直重复写到,h,满足题目要求为止。实际中这类问题,就可用循环结构编程实现。本例中,使用的是循环结构中的,while,语句。,C,语言共有三种类型的循环语句,,while、do-while,和,for,语句。,返回本节目录,3.3.2,while,语句,C,语言程序设计,(,Visual C+ 6.0,环境),返回本节目录,1,.,while,语句的一般形式,while(),说明:,while,语句是,C,的关键字,其后面的一对括号中的,可以是,C,语言的任意合法表达式,由它来控制循环体语句是否执行,括号不能省略。可以是一条语句,也可以是多条语句,一般来说循环体是一条语句时不用加,如果是多条语句,就一定要加 构成复合语句。其中的语句可以是空语句、表达式语句或作为循环体一部分的复合语句,如果循环体是一个空语句,表示不执行任何操作(一般用于延时)。,(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 ,stdio,.h,main() / *,若,sum,的值超过,int,型变量能表示的范围,则设置成长整型*/,int,sum=0,i=1; while(i=100), sum+=i;,i+;,printf,(,其和是 %,dn,sum);,/*,若,sum,为长整型,则相应的输出也设置成长整型,ld*/,运行结果:,其和是5050,返回本节目录,do,while();,说明:,do,是,C,语言的关键字,必须和,while,联合使用。,do-while,循环由,do,开始,用,while,结束;注意,在,while,结束后必须有分号,它表示该语句的结束。其它同,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,语句来实现。,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,(,其和是 %,dn,sum);,/*,若,sum,为长整型,则相应的输出也设置成长整型,ld*/,返回本节目录,3.3.4,for,语句,C,语言程序设计,(,Visual C+ 6.0,环境),for,语句是,C,语言提供的一种在功能上比前面两种循环语句更强的一种循环语句。,for,循环语句格式如下:,for(;),说明:,for,是,C,语言的关键字,三个表达式之间的必须用分号;隔开。三个表达式可以是任意形式的,C,表达式,通常主要用于,for,循环的控制。一般用于计算循环变量初始值,为循环体是否执行的条件,为循环变量的调整。的使用同,while、do-while,循环语句。,for,循环语句的格式还可以表示为:,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,语句的执行过程,首先计算。,求的值;若其值为非零,则转去执行;若的值为零,则转去执行,结束,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,环境),返回本节目录,for( ;i=n;i+),sum+=i;,printf,(,其和是 %,dn,sum);,/*,若,sum,为长整型,则相应的输出也设置成长整型,ld*/,运行结果:,其和是5050,for,循环的执行过程:先执行表达式1,为空语句,然后判断,i=n,是否成立,如果为真,执行循环体,sum+=i,转而执行,i+,再判断,i=n,,如此反复,直到,i=n,为假为止。在这个例子中,,i,是循环控制变量,每次循环时,它的值都被改变且进行检验。,for,语句多样性,C,语言程序设计,(,Visual C+ 6.0,环境),返回本节目录,for,语句的多样性,由于,C,语言中表达式的形式十分丰富,对,for,语句的三个控制表达式可以灵活运用,因此造成,for,语句形式多种多样。,(1)为空语句,如上例中求1-100的和。本来由完成的初始化可提到循环之外完成。,(2)和是逗号表达方式,(,3)用空循环来延长时间,常用空循环来产生延时,以达到某种特定要求。如:,for(t=0;ttime;t+);,(4),无限循环,for,循环的三个表达式中,任何一个都可以省略,但是分号;不可省略。所以下面的写法:,for(;),是一个无限循环。将成为死循环。,3.3.5 循环的嵌套,C,语言程序设计,(,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,分析:表体共九行,所以首先考虑一个打印九行的算法:,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】 /*程序名为,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.,break,语句,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(i=1;i5) break;,printf,(s=%dn,s);,printf,(,使用,break,语句时,,s,的最终值为:%,dn,s);,break,语句,C,语言程序设计,(,Visual C+ 6.0,环境),程序运行后的输出结果如下:,s=1,s=3,使用,break,语句时,,s,的最终值为:6,本例中,如果没有,break,语句,程序将进行10次循环;但当,i=3,时,,s,的值为6,,if,语句中的表达式,s5,值为1,于是执行,break,语句, 循环立即中断,跳出,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,;,【例3.30】将【例3.28】中的,break,语句改用,continue,语句,来比较两者的区别。,#,include ,stdio,.h,main() /*,程序名为,l3_30.,cpp,。*/,int,i,s=0;,for(i=1;i5) continue;,printf,(s=%dn,s);,printf,(,使用,continue,语句时,,s,的最终值为:%,dn,s);,返回3.3.6目录,Continue,语句,C,语言程序设计,(,Visual C+ 6.0,环境),程序运行后的输出结果如下:,s=1,s=3,使用,continue,语句时,,s,的最终值为:55,在本例中,当,i=1,时,输出,s=1,,当,i=2,时,输出,s=3,,当,i=3,时,,s,的值为6,,if,语句中的表达式,s5,值为1,于是执行,continue,语句,跳过循环体中余下的语句,而去对,for,语句中的表达式3求值,然后进行表达式2的条件测试,最后根据表达式2的值来决定循环是否继续执行。不论,continue,是作为何种语句成分出现的,都将按此功能执行,这点与,break,有所不同。可以看出,,continue,语句的功能是结束本次循环。,返回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);,3.3.7 编程实训2,C,语言程序设计,(,Visual C+ 6.0,环境),返回本节首,【例3.33】求整数3-100中的素数。为了检查某数是否是素数,采用的方法是,从,n=3,起直到100止,逐个用,i=2n/2,去试除,n,,只要有一个能整除,说明该数不是素数。程序如下:,main(),/*,程序名为,l3_27.,cpp,。*/,int,i,n,num;,for(n=3,num=0;n=100;n+), for(i=2;i1e-6), t=t*n; /*,求,n!*/,e=e+1/t; /*,实现求,n!,的倒数的和 */,n+;,printf,(e=%8.6fn,e);,运行结果:,e=2.718282,3.4.2 综合实训2,C,语言程序设计,(,Visual C+ 6.0,环境),返回本节目录,通过本例可以体现这样一个编程思路:凡是遇到求若干个有规律变化的项的乘积,就可在循环体中用,求累乘积,的,编程通式,t=t*x,来编程实现;求其和,用,求累加和,的,编程通式,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: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=19;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=%dn,cocks,hens,chicks);, ,程序运行结果如下:,cocks=4,hens=18,chicks=78,cocks=8,hens=11,chicks=81,cocks=12,hens=4,chicks=84,本例采用的编程算法是,穷举法,。其,基本思想是,:对问题的所有可能状态一一测试,直到找到解或全部可能状态都测试过为止。下面例题为另一类型的穷举问题。,【例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,语言程序设计,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


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

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


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