《C过程化语句》PPT课件.ppt

上传人:w****2 文档编号:15598099 上传时间:2020-08-23 格式:PPT 页数:114 大小:697.50KB
收藏 版权申诉 举报 下载
《C过程化语句》PPT课件.ppt_第1页
第1页 / 共114页
《C过程化语句》PPT课件.ppt_第2页
第2页 / 共114页
《C过程化语句》PPT课件.ppt_第3页
第3页 / 共114页
资源描述:

《《C过程化语句》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《C过程化语句》PPT课件.ppt(114页珍藏版)》请在装配图网上搜索。

1、c+程序设计,上海大学通信与信息工程学院 2020/8/23,第四章 过程化语句及程序设计,第一节 面向过程的程序设计及其算法,面向过程的程序设计: 把程序看做处理数据的一系列过程 程序设计者必须指定计算机执行的具体步骤, 做什么?怎么做? 根据程序要“做什么” ,写出一个个语句,安排好它们的执行顺序。 怎样设计这些步骤,怎样保证它的正确性和具有较高的效率,这就是算法需要解决的问题。,第一节 面向过程的程序设计及其算法,面向过程的程序设计,第一节 面向过程的程序设计及其算法,程序和算法,程序和算法: 程序=算法+数据结构,指定数据的类型和数据的组织形式数据结构(data structure)。

2、,对操作的描述。即操作步骤算法(algorithm)。,作为程序设计人员,必须认真考虑和设计数据结构和算法。 算法必须具体地指出在执行时每一步应当怎样做。,第一节 面向过程的程序设计及其算法,算法,算法就是解决一个问题的完整的步骤描述。也就是给定初始状态或数据,按照算法描述的步骤进行运算,能够得出所要求或所期望的终止状态或输出数据。 解决一个问题的方法有高明的的,也有糟糕的;同样,同一个问题的算法也存在优劣之分。,什么是算法?,第一节 面向过程的程序设计及其算法,算法,一个算法的优劣可以用空间复杂度与时间复杂度来衡量。,算法优劣的衡量,算法的时间复杂度是指执行算法需要消耗的时间资源,其表征了算

3、法执行的效率问题,既解决问题的速度。 算法的空间复杂度是指执行算法需要占用的内存空间,其表征了算法执行需要的资源,也就是解决问题付出的代价。 算法的效率越高、代价越小,其性能越优异。,算法的表示: 自然语言:用中文或英文等自然语言描述算法。在程序设计中一般不用自然语言表示算法。 流程图:用传统的流程图或结构化流程图表示算法,比较形象直观,但修改算法时显得不大方便。 伪代码(pseudo code) :用介于自然语言和计算机语言之间的文字和符号来描述算法 用计算机语言表示算法:用一种计算机语言去描述算法,这就是计算机程序。,if x is positive then print x else p

4、rint-x,算法,第一节 面向过程的程序设计及其算法,流程图:,算法,第一节 面向过程的程序设计及其算法,C/C+的控制语句,if()else(条件语句) for()(循环语句) while() dowhile()(循环语句) continue(结束本次循环语句) switch(多分支选择语句) break(终止执行switch或循环语句) return(从函数返回语句) goto(转向语句),流程控制语句:,操作运算语句:,表达式语句,第一节 面向过程的程序设计及其算法,三种基本结构,严格使用三种基本结构: 顺序结构 选择结构 循环结构 1996年,计算机科学家Bohm和Jacopini证

5、明:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种结构组合而成。所以,这三种结构就被称为程序设计的三种基本结构,也是面向过程程序设计建议采用的结构。,第二节 顺序结构,第二节 顺序结构,顺序结构编程实例1,例:交换两个变量 #include /预处理命令 int main() int a=1, b=2; /定义待交换的两个整型变量,并赋值 int tmp; /定义一个整型变量作为中间交换用 cout交换前:a=a,b=bendl; tmp=a; a=b; b=tmp; cout交换后:a=a,b=bendl; ,自上而下顺序执行,第二节 顺序结构,顺序结构编程实例2,例: 求一

6、元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac0。,自上而下顺序执行,#include /预处理命令 #include /要用到数学函数sqrt,应包含头文件cmath.h int main( ) float a,b,c,x1,x2; /声明语句 cinabc; /对象调用语句 x1=(-b+sqrt(b*b-4*a*c)/(2*a); /表达式语句 x2=(-b-sqrt(b*b-4*a*c)/(2*a); coutx1=x1endl; coutx2=x2endl; return 0; /控制语句 ,第三节 选择结构,第三节 选择结构,选择结

7、构编程,C/C+语言提供了多种手段来实现选择结构: if语句 switch语句 条件表达式和逻辑表达式 它们各有优劣和适用的场合。 if语句是C/C+语言中实现选择结构最常用的方式。当if语句和else语句组合时候时,可以实现更灵活更复杂的选择结构。学会熟练地使用if语句是C/C+编程的基础。,第三节 选择结构,If语句(1),if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。,在if语句中,用括号中表达式的值来判断程序的流向,如果表达式的值不为0(即为true),表示条件成立;否则(即表达式的值等于0或false)表示条件不成立。,if( )else

8、,if(条件表达式) 语句; 或 if(条件表达式) 语句块 ,语义:如果条件表达式的值为真,则执行其后的语句, 否则不执行该语句。,int main() int a,b,max; coutab; max=a; if (maxb) max=b; coutmax=max; ,第三节 选择结构,三种形式之一:,If语句(2)(p44),if(条件表达式) 语句1; else 语句2;,语义:如果条件表达式的值为真,则执行语句1,否则执行语句2。,int main() int a, b; coutab; if(ab) coutmax= a; else coutmax= b; ,第三节 选择结构,三种

9、形式之二:,If语句(3)(p45),if(条件表达式1) 语句1; else if(条件表达式2) 语句3; else if(条件表达式3) 语句3; else if(条件表达式m) 语句m; else 语句n;,语义:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。,第三节 选择结构,三种形式之三:,If语句(3),第三节 选择结构,If语句(4),#include void main() int score; coutscore; if (score =90) cout=80) cout=70) co

10、ut=60) cout“及格endl; else cout“不及格endl; ,例:根据考分给出学生成绩等级,第三节 选择结构,If语句(5),使用If语句应注意的问题,1、在if关键字后面均为表达式,通常为逻辑或关系表达式,但也可以是其它表达式,甚至也可以是一个变量。 if(a=5).; if(b);/均合法。只要表达式的值为非0,即为“真”。 if(a=b) couta; else couta=0; 语义为:把b赋给a,若非0则输出该值,否则输出a=0字符串。这种用法在程序中是经常出现的。,第三节 选择结构,If语句(6),使用If语句应注意的问题,2、在if语句中,条件判断表达式必须用括

11、号括起来,在语句之后必须加分号。 3、在if语句的3种形式中,所有的语句应为单个语句,如果要想在条件满足时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在之后,不能再加分号。如: if(ab) a+; b+; else a=0; b=10; ,第三节 选择结构,If语句(7),C/C+语言中赋值运算符(= )和等于运算符(=)只相差一个等号。这种错误在编程中十分常见。而且,这两种写法都是合法的写法,编译器无法自动检测。编程时必须特别小心!,int a=1; if(a=2) coutYesn; else coutNon“ 输出:No,int a=1; if(a=2

12、) coutYesn; else coutNon“ 输出:Yes,特别注意条件表达式中“”与“”的区别,第三节 选择结构,If语句(8),If语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套。 if(表达式1) if(表达式2)语句1 else 语句2 else if(表达式3 )语句3 else 语句4 应当注意if与else的配对关系。else总是与它上面最近的、且未配对的if配对。,第三节 选择结构,If语句(9),if(x=0) if(x50) coutx is okn; else coutx is not okn;,if(x=0) if(x50) coutx is

13、okn; else coutx is not okn; ,if(x=0) if(x50) coutx is okn; else coutx is not okn;,解释1,解释2,if语句嵌套导致的二义性,第三节 选择结构,If语句(9),if语句嵌套中if-else配对规则,if-else语句成对的规则:else连接到上面没有配对的且为可见的if上。 if(条件) if(条件) if(条件) 语句; else 语句;,正确的配对。 用括起来的第三if不可见了,第三节 选择结构,If语句(10),if(x=0) if(x50) coutx is okn; else coutx is not o

14、kn;,if(x=0 ,程序的改进,二者并不完全一样!,第三节 选择结构,If语句(11),嵌套结构: int main() int A,B; coutAB; if(A!=B) if(AB) coutBn; else coutABn; else coutA=Bn; ,if-else-if结构: int main() int A,B; coutAB; if(A=B) coutB) coutBn; else coutABn; ,第三节 选择结构,条件运算符与条件表达式(p47)1,如果在条件语句中,只执行单个赋值语句时,常可以用条件表达式来实现。不但使程序简洁,也提高了运行效率。 条件运算符为:

15、? : 由条件运算符组成的条件表达式的一般形式为: 表达式1 ? 表达式2表达式3,条件表达式,条件为真时表达式,条件为假时表达式,max=(ab)? a:b;,第三节 选择结构,条件运算符与条件表达式(p47)2,条件语句: if(ab)max=a; else max=b; 可以用条件表达式写成 : max=(ab)?a:b; 执行该语句的语义是:ab为真,则把a赋予max,否则把b赋予max。,条件运算符的优先级,高于赋值运算符,但低于关系运算符和算术运算符。,第三节 选择结构,条件运算符与条件表达式(p47)3,条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同: int x

16、; int m; m=x? a:b; 表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。 xy?1:1.5 如果xy,则条件表达式的值为1.5,若xy,值应为1,由于C+把1.5按双精度数处理,双精度的类型比整型高,因此,将1转换成双精度数,以此作为表达式的值。,若x=0,则条件表达式的值为字符b的ASCII码。,条件表达式中的类型转换,第三节 选择结构,条件运算符与条件表达式(p47)4,例: 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 #include int main( ) char ch; c

17、inch; ch=(ch=A ,第三节 选择结构,条件运算符与条件表达式(p47)5,条件表达式通常用于赋值语句中: max=(ab)?a:b; 语义是:ab为真,则把a赋予max,否则把b赋予max 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符 max=(ab)?a:b;可以去掉括号写成max=ab?a:b; 条件运算符?和:是一对运算符(3目),不能分开单独使用。 条件运算符的结合方向是自右至左 例:ab?a:cd?c:d 应理解为 ab?a:(cd?c:d ),总结,第三节 选择结构,多分支选择语句switch(1),if 语句是二分支选择语句,一个条件会出现两种可能性

18、。而在实际生活中,一个条件会出现多种可能性,虽然可以用嵌套的if语句来处理,但整个程序结构可读性就比较差了。 switch语句是多分支选择语句,当条件值为一系列的整数值时,用switch语句就显得更加直观和简捷。 switch也称为开关语句。,第三节 选择结构,多分支选择语句switch(2),一般形式,switch(表达式) case 常量表达式1:语句组1 case 常量表达式2:语句组2 . case 常量表达式n:语句组n default:语句组n+1 执行switch语句时,先计算表达式,再与每一种情况常量表达式进行比较。如果某一情况常量表达式等于表达式的值,控制就转向该情况常量表达

19、式后面的相应语句。 如果没有相匹配的就转到default。 如果没有相匹配,也没有default就不执行任何语句。,第三节 选择结构,多分支选择语句switch(3),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: cout85100n; case B: cout7084n; case C: cout6069n; case D: cout60n; default : couterrorn; 1、switch后面括号内的“表达式”,允许为任何类型表达式,但表达式的值必须是整型、字符型或枚举型。case后面的常量表达式必须与其匹配,第三节 选择结构,多分支选

20、择语句switch(4),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: cout85100n; case B: cout7084n; case C: cout6069n; case D: cout60n; default : couterrorn; 2、每一个case表达式的值必须互不相同,否则就会出现互相矛盾的现象,第三节 选择结构,多分支选择语句switch(5),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: cout85100n; case B: cout7084n; case C: cout6069n;

21、 case D: cout60n; default : couterrorn; 3、各个case和default的出现次序不影响执行结果。例如,可以先出现“default:”,再出现“case D:”,然后是“case A:”。,第三节 选择结构,多分支选择语句switch(6),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: cout85100n; case B: cout7084n; case C: cout6069n; case D: cout60n; default : couterrorn; 4、在执行switch语句时,根据switch表达式

22、的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。,第三节 选择结构,多分支选择语句switch(7),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: cout85100n; break; case B: cout7084n; break; case C: cout6069n; break; case D: cout60n; break; default : couterrorn; break; 5、在执行一个case子句后,必须使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。,

23、第三节 选择结构,多分支选择语句switch(8),例:按照考试成绩的等级打印出百分制分数段 switch (grade) case A: case B: case C: case D: cout60n; break; default : couterrorn; break; 6、多个case可以共用一组执行语句。当grade的值为A、B或C时都执行同一组语句。,第三节 选择结构,多分支选择语句switch(9),7、switch不一定非要包含复合语句块。 switch(i) case 1:cout“okn” ; 等价于: if(i=1) cout“ok/n”;,但一般不这样写!,第三节 选择

24、结构,多分支选择语句switch(9),8、switch语句可以嵌套。 int i,j; switch(i) case 1:/ case 2: switch(j) /嵌套switch case 1: / case 2: / case 3: / ,第三节 选择结构,多分支选择语句switch(10),9、switch语句可以用if语句替换,char grade; / if(grade=A) cout85100n; else if(grade=B) cout7084n; else if(grade=C) cout6069n; else if(grade=D) cout60n; else coute

25、rrorn;,第三节 选择结构,多分支选择语句switch(11),10、switch语句可以用if语句替换,如果根据分数输出其成绩等级,就只能用if而不能用switch了。因为条件是一个范围,而不是单独的整数。 if(grade=85 ,第三节 选择结构,多分支选择语句switch(12),扩展:实习二的将学生成绩转换为等级可以用switch实现:,第三节 选择结构,选择结构举例(1),例: 编写程序,判断某一年是否为闰年。 #include int main( ) int year; bool leap; coutyear; /输入年份 if (year%4!=0) /年份不能被4整除 l

26、eap=false; /非闰年 else if (year%100!=0) /年份能被4整除但不能被100整除 leap=true; /闰年 else if (year%400=0) /年份能被400整除 leap=true; /闰年 else /年份能被4和100整除但不能被400整除 leap=false; /非闰年,闰年的条件:能被4整除但不能被100整除,或能被400整除,第三节 选择结构,选择结构举例(2),/ 输出结果 if (leap) coutyear is ; /若leap为真,就输出年份和“是” else coutyear is not ; /若leap为假,就输出年份和“

27、不是” cout a leap year.endl; /输出“闰年” return 0; ,运行情况如下: 2005 2005 is not a leap year. 2000 2000 is a leap year.,第四节 循环结构,第四节 循环结构,循环结构,当程序要反复执行同一操作时,就必须使用循环结构。很多问题都必须使用循环结构。如,树的遍历,数组输出,链表的操作等等。循环结构的功能是:通过设置执行循环体的条件和改变循环变量,从而重复执行一系列操作。 C/C+语言中提供了for语句、while语句、do-while语句来实现循环结构。 for语句是C/C+编程中最主要的循环语句。fo

28、r语句用法简单,用以实现在满足某一条件下一系列操作的重复执行,其实现的循环结构逻辑清晰。,第四节 循环结构,for循环(p58)(1),for语句的一般形式: for(表达式1;表达式2;表达式3) 循环体 表达式1:循环初始化 表达式2:条件测试判断 表达式3:状态修正 一个循环包括: (1)循环初始状态 (2)条件判断 (3)状态修正 (4)循环体,第四节 循环结构,for循环(p58)(2),for(int i=1; i=10; +i) coutHello.; for语句头的括号中由两个分号隔开了三个部分,分别表示: (1)循环变量初始化(int i=1); (2)条件判断(i=10)表

29、示循环的结束判断,当条件为假时,则说明循环应该结束; (3)循环变量的增量(+i表示循环的状态修正)。 for语句花括弧中的部分为循环体,它可以由若干条语句组成,当循环体只含一条语句时,其外面的花括弧(表示语句块)可以省略。,反复做10次输出”Hello”,第四节 循环结构,for循环(p58)(3),for(int i=1; i=10; +i) coutHello.; 最初i的值为1,判断i=10为真,所以开始执行循环体。即输出一个“Hello.”。 然后,返回去进行状态修正,i的值变成2,再进行条件判断,i=10为真,所以又一次执行循环体,输出第二个“Hello.”。 再去状态修正,再去条

30、件判断直到最后,当i为11,条件( i=10 )为假时,循环终止,即本for循环语句执行完成。整个循环共执行了10次。,反复做10次输出”Hello”,第四节 循环结构,for循环(p58)(4),求1+2+3+100的值,如果不考虑用计算公式(首项+尾项) 项数2,而是逐项相加,应为下列语句: int sum = 0; sum = sum+1; sum = sum+2; sum = sum+100; coutsumendl; 该序列中,中间的100条语句都做相似的操作: sum=sum+i 只不过i的值从1逐一变化到100,对此可以将这100条语句拿出来作为循环来设计。,第四节 循环结构,f

31、or循环(p58)(4),求1+2+3+100的值,int sum = 0; for (int i=1; i=100; i+) /循环变量在for头部定义, /这是一个好的做法。p60 sum + =i; coutsumendl; 如果把第一句放在循环体内,就会起不到累计的作用,因为每次都创建sum,并执行sum=0,并会导致最后输出因sum只从属于for而出现sum没定义的错误。 如果把最后一句放入循环体,就会导致共输出100个不同的值,也不是想要的结果形式。,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + = i; coutsum

32、endl;,int sum = 0; int i=1; for( ; i=100; i+) /分号不能省 sum += i; coutsumendl; 循环变量的初始化放在for循环的外部定义。这样可以使循环变量在循环结束之后,仍然存在。在某些情况下便于查看循环是否正常退出。,for语句变化-省略初始化,for循环(p58)(5),第四节 循环结构,int sum = 0; for(int i=1; ; i+) /分号不能省 sum += i; if(i=100) break; coutsumendl; 这表明可以在循环体中测试循环结束条件,并用break退出循环,而省略for循环结构描述中的

33、条件测试部分。 省略条件测试部分,相当于让循环体执行永不停止。循环的退出在每一轮都可以测试退出条件,但也可以在循环体中,通过测试条件,决定执行break的时机,达到退出循环的目的。,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + =i; coutsumendl;,for语句变化-省略条件测试,for循环(p59)(6),第四节 循环结构,int sum = 0; for(int i=1; i=100; ) /分号不能省 sum += i+; /同时修改循环变量 coutsumendl; 该循环体中改变循环变量的值和累加赋值合二为一,省

34、略for循环结构描述中的修正循环变量部分。,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + = i; coutsumendl;,for语句变化-省略状态修正,for循环(7),第四节 循环结构,int sum = 0; int i=1; for( ; i=100; ) sum += i+; coutsumendl; 要注意的是for语句在格式上,其两个分号不能少!,for语句变化-省略初始化和状态修正,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + = i; coutsume

35、ndl;,for循环(8),第四节 循环结构,int sum = 0; int i=1; for( ; ; ) sum += i+; if(i100) break; coutsumendl; 要注意的是for语句在格式上,其两个分号不能少!,for循环(9),第四节 循环结构,for语句变化-省略初始化、状态测试和状态修正,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + = i; coutsumendl;,int sum = 0; for(int i=100; i=1; i-) sum += i; coutsumendl; for循环

36、的循环变量可以从这一头变化到那一头,也可以从那一头变化到这一头。,原来的代码在这里: int sum = 0; for (int i=1; i=100; i+) sum + =i; coutsumendl;,for语句变化-从100到1倒过来累计,for循环(10),第四节 循环结构,多重循环-输出水仙花数,for循环(11),第四节 循环结构,所谓水仙花数是指一个三位数,其各位数字立方之和等于该数本身,如153。 解:为了输出所有的水仙数,可以使用3层for循环,最外层循环变量为三位数的百位数,中层循环变量为三位数的十位数,内层循环变量为个位数,循环的结果是遍历了100999,在循环体中判断

37、该三位数是否是水仙数。,多重循环-输出水仙花数,for循环(12),第四节 循环结构,#include int main() int a, b, c; int narcissus; coutNarcissus numbers:n; for(a = 1; a 10; +a) /* 百位数 */ for(b = 0; b 10; +b) /* 十位数 */ for(c = 0; c 10; +c) /* 个位数 */ narcissus = a * 100 + b * 10 + c; /* 计算该三位数的值 */ /* 判断这个三位数是否为水仙花数 */ if (a * a * a + b * b

38、 * b + c * c * c= narcissus) coutnarcissus ; coutendl;/* 换行,调整输出样式 */ return 0; ,while循环(1),第四节 循环结构,while语句是C/C+语言中循环结构的另一种实现方式。它和for语句的结构有很大不同之处,在不同的场景中各有优劣;两者还可以相互转换。,一般形式: while (表达式) 循环体 作用: 当指定的条件为真(表达式为非0)时,执行while语句中的内嵌语句。 特点:先判断表达式,后执行语句。while循环称为当型循环。,while循环(2),第四节 循环结构,int sum = 0; int i

39、=1; while( i=100) sum = sum+i; i = i+1; coutsumendl;,While,while循环(3),第四节 循环结构,for循环: int sum = 0; int i=1; for( ; i=100; ) sum += i+; coutsumendl;,已经演变成了while循环: int sum = 0; int i=1; while( i=100) sum += i+; coutsumendl;,Do-while循环(1),第四节 循环结构,一般形式: do 循环体 while (表达式); 先执行一次语句,再判断表达式的值,当指定的条件为真时,继

40、续执行循环体中的语句。 Do-while循环称为do循环。,do-while语句是while语句的一个变体。for语句与while语句都是对进入循环进行条件判断,先做条件判断,再执行循环体;而do-while则是对跳出循环进行条件判断,先执行循环体,后再做条件判断。,Do-while循环(2),第四节 循环结构,#include int main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); coutsum=sumendl; return 0;,循环体中必须有使循环趋于结束的语句,Do-while循环(3),第四节 循环结构,int ma

41、in() int sum=0,i; cini; while(i=10) sum=sum+i; i+; coutsum; ,int main() int sum=0,i; cini; do sum=sum+i; i+; while(i=10); coutsum=sumendl; ,当i分别等于2和12时输出结果分别是多少?,while do-while,三种循环比较,第四节 循环结构,(1) 3种循环都可以用来处理同一问题,一般情况下它们可以互相代替。for最常用,while次之,d0.while最少。 (2) while和do-while循环,是在while后面指定循环条件的,在循环体中应包含

42、使循环趋于结束的语句(如i+,或i=i+1等)。 for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强,凡用while循环能完成的,用for循环都能实现。 (3) 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。,循环的嵌套,第四节 循环结构,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。 3种循环(while循环、do-while循环和for循环)可以互相嵌套。,(2

43、) do do while( ); while( );,(3) for (;) for(;) ,(1) while( ) while( ) ,(4) while( ) do while( ); ,(6) do for (;) while( );,(5) for(; ) while( ) ,循环结构与选择结构的嵌套,第四节 循环结构,情况1: while(循环条件判断) if(选择条件判断) 分支; 循环体; ,情况2: if(选择条件判断) 分支; while(循环条件判断) 循环体 ,循环结构与选择结构嵌套举例(1),第四节 循环结构,打印图形。按输入边长n,打印n行n列图形。偶数行(从0行

44、开始计算)充填=,奇数行充填+。例如输入1,则打印: = 输入5,则打印: = + = + =,循环结构与选择结构嵌套举例(2),第四节 循环结构,void main( ) /方案1 int i, j,length; cout0):length; / 输入图形边长 for (i = 0; i length; +i) /外层循环:控制行数 for (j = 0; j length; +j) / 内层循环:控制列数 if (i % 2 =0) / 根据行数的奇偶性决定输出内容 cout=; else cout+; cout“n”; /换行 ,分析:打印每一个字符之前都需要执行if判断,以检查行号的

45、奇偶性, 共需length*length 次,代价比较大。,循环结构与选择结构嵌套举例(3),第四节 循环结构,void main(void) /方案2 int i, j,length; cout0):length;/ 输入图形边长 for (i = 0; i length; +i) /外层循环:控制行数 if (i % 2= 0) /使用选择结构包含循环结构的方式 for (j = 0; j length; +j) / 偶数行各列输出 cout=; else for (j = 0; j length; +j) /奇数行各列输出 cout+; cout“n”; /换行 ,分析:把选择结构从内层

46、循环体提升一层,放到外层循环体。打印之前判断行号的奇偶性。条件判断只需要执行length次,但可读性上要比上一个方案差,但也不会很糟糕。,转向语句break,第四节 循环结构,用在while,do-while,for和switch语句中。 在switch语句中,用break来使流程跳出switch语句,继续执行switch后的语句。 在循环语句中,用break从最近的封闭循环体内跳出。 for( ; ; ) for( ; ;) break; a=1; /break跳至此句 ,转向语句continue,第四节 循环结构,continue语句在循环中,作用为结束本次循环,即跳过循环体中尚未执行的语

47、句,接着进行下一次是否执行循环的判定。 for(int n=100; n=200; n+) if(n%3 =0) continue; /结束本次循环,转向下次循环 coutnendl; ,Break与continue区别(1),第四节 循环结构,continue只结束本次循环,break结束整个循环过程。,一个循环结构套一个选择结构,Break与continue区别(2),第四节 循环结构,打印100200之间所有不能被3整除的数。,for (int n=100;n=200;n+) if (n%3=0) continue; cout nendl; ,for (int n=100;n=200;n

48、+) if (n%3=0) break; cout nendl; ,打印100200之间比第1个能被3整除的数小的数。,第五节 循环设计,三种循环结构的使用说明,第五节 循环设计,循环是程序设计入门中最重要的内容之一。 用得最多的是for语句,因为它能描述循环体的初始和结束状态,以及中间步长。 while是for的一种特例,在循环不含明确的循环变量时,用while会更简捷。 而do-while循环的使用机会大大少于前两者,因为大多数循环可以用前两者描述,没有必要用do-while。,字符图形例1:输出字母图形,第五节 循环设计,M MM MMM MMMM MMMMM MMMMMM MMMMMM

49、M MMMMMMMM MMMMMMMMM MMMMMMMMMM,用for循环编程画出图形。图形一共10行,每行增加一个字符M,,应循环10次,每次输出一行,其循环模式为: for(int i=1; i=10; +i) 输出第i行 换行 其中“输出第i行”是在for循环中的一个小循环。每次执行时其长度都是不一样的,但长度的变化正好与i同步,所以可以依赖i来实现。,字符图形例1:输出字母图形,第五节 循环设计,注意到第i行的M字符数与i的关系: 行i M数 111 222 333 444 1010 10 所以,可以得到“输出第i行”的循环为 for(int j=1; j=i; +j) cout“M

50、”;,M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM,字符图形例1:输出字母图形,第五节 循环设计,将内、外循环套起来,就有了完整的程序: #include int main() for(int i=1; i=10; +i) for(int j=1; j=i; +j) coutM; coutendl; /换行 对付这种字符图形,一般用两重循环,外循环遍历所有行,内循环遍历行中每个字符。,举一反三,第五节 循环设计,字符图形的排列图形除了有正直角三角形之外,还有其它各种图形如:倒直角三角形及其它朝向的直角三角形、等

51、腰三角形、梯形、菱形、平行四边形等等。都可以通过程序来实现,* * * * * * * * * *,* * * * * * * * * *,* * * * * * *,* * * * * * * * * *,第五节 循环设计,字符图形例2:输出金字塔字母图形,A ABC ABCDE ABCDEFG ABCDEFGHI,外循环的形式 for(int i=1; i=5; +i) 输出若干空格 输出若干字符 换行 如果要输出A起头依序的n(n27)个字母。可以 for(int i=1; i=n; +i) coutchar(A+i-1); / 括号内的整型转换成 char型 或者 for(char c

52、h=A; chA+n); +ch) coutch;,第五节 循环设计,字符图形例2:输出金字塔字母图形,A ABC ABCDE ABCDEFG ABCDEFGHI,每一行中的空格数、字符数与i的关系 行 空格数 字符数 141 233 325 0 9 第i行的空格数为5-i个,字符数为2i-1。 因此输出空格数和字符数的内循环分别为: for(int j=1; j=5-i; +j) cout“ ”; for(char ch=A; chA+2*i-1; +ch) coutch;,第五节 循环设计,字符图形例2:输出金字塔字母图形,A ABC ABCDE ABCDEFG ABCDEFGHI,将内、

53、外循环套起来: #include int main() for(int i=1; i=5; +i) for(int j=1; j=5-i; +j) /每行的空格数 cout ; for(char ch=A; chA+2*i-1; +ch) /每行的字符 coutch; coutn; ,第五节 循环设计,举一反三,字符图形排列的另一种形式就是与计算与字符的变化结合在一起,例如: 九九乘法表 杨辉三角形 日历 各种其它换算表,第五节 循环设计,素数判定穷举法p68,给定一个整数m,判断其是否为素数。 分析: 判断一个数m是否为素数,最简单的方法是按素数的定义,试除以从2开始到m-1的整数,如果无一

54、例外地不能整除,则该数一定是素数。 可以用运算符%,进行取余操作,例如13%5的值为3。利用取余操作判定一个数是否能被另一个数除尽。也就是说一个数是否为另一个数的因子,若存在这样的因子,则立即可以判定该数不是素数而终止程序。等到2到m-1的数都尝试过了,就可以最后断定该数一定是素数了。,第五节 循环设计,素数判定穷举法p68,#include int main() long m; cout m; int i; for(i=2; im; i+) /找m的因数 if(m%i=0) break; if(m=i) /判断m是否被小于m的数整除 cout m is prime.n; else cout

55、m isnt prime.n; ,程序的优化: 大于2的偶数一定不是素数; 奇数中不需要用2M1的所有整数去循环判断,只需用其中的奇数,第五节 循环设计,素数判定平方根法,#include #include int main() long m; cout m; double sqrtm=sqrt(m); /用到math.h int i; for(i=2; i=sqrtm; i+) if(m%i=0) break; if(sqrtmi) cout m is prime.n; else cout m isnt prime.n; ,假定某个整数m不是素数,则一定可以表示成两个因子的积: m=ij 其

56、中:1ijm 则 i2ijj2 即 i2mj2 即 所以必定有一个因子不大于m的平方根。故判断m是否为素数,只要试除到m的平方根就可以了,不必一直到m-1。,第五节 循环设计,举一反三,有关素数的问题很多: 判断一个数是否为素数。 求a,b区间中的所有素数。 在若干个区间中求素数的个数。,第五节 循环设计,找出100200之间的素数,#include #include #include int main( ) int m,k,i,n=0; bool prime; /定义布尔变量prime for(m=101;m=200;m=m+2) /判别m是否为素数,m由101200 prime=true;

57、 /循环开始时设prime为真,即先认为m为素数 k=int(sqrt(m); /用k代表根号m的整数部分 for(i=2;i=k;i+) /作用是将m被2根号m除,检查是否能整除 if(m%i=0) /如果能整除,表示m不是素数 prime=false; /使prime变为假 break; /终止执行本循环 if (prime) /如果m为素数 coutsetw(5)m; /输出素数m,字段宽度为5 n=n+1; /n用来累计输出素数的个数 if(n%10=0) coutendl; /输出10个数后换行 coutendl; /最后执行一次换行 return 0; ,例2:找出100200之间

58、的全部素数,第五节 循环设计,逻辑判断百钱买百鸡,对于逻辑判断的问题,一般都要考虑全部的可能性,然后从这些可能性中按条件逐一排查,直到最后获得某个结论。,第五节 循环设计,逻辑判断百钱买百鸡,例:公鸡7元一只,母鸡5元一只,小鸡1元3只。花100元钱,买100只鸡,如果公鸡、母鸡和小鸡都必须有,则公鸡、母鸡和小鸡应各买几只? 分析:考虑全部可能性,先考虑公鸡、母鸡和小鸡的取值范围(也可以从金额着手)。由于各种鸡都必须要有,所以公鸡的最高耗用金额为100-5-1=94元,取7的倍数,得91元,所以:公鸡数的范围为113 同理,母鸡数的范围为118 小鸡数的范围为396,注意小鸡数虽可以花100-

59、7-5=88元来买264只,但由于总鸡数的限制,小鸡数应98。,第五节 循环设计,逻辑判断百钱买百鸡,for(列举所有可能的情况) /可能为多重循环 if(条件1不满足)continue if(条件2不满足) continue / if(条件n不满足) continue 输出结果之一或者累计符合所有条件的方案 ,公鸡数+母鸡数+小鸡数=100 (cock+hen+chick=100) 买公鸡款+买母鸡款+小鸡款=100 (7*cock+5*hen+chick/3=100) 小鸡数为3的倍数(chick%3=0),本问题条件,第五节 循环设计,逻辑判断百钱买百鸡,公鸡数+母鸡数+小鸡数=100

60、(cock+hen+chick=100) 买公鸡款+买母鸡款+小鸡款=100 (7*cock+5*hen+chick/3=100) 小鸡数为3的倍数(chick%3=0),条件,上述问题的反条件值: (cock+hen+chick != 100) (7*cock+5*hen+chick/3 !=100) (chick%3 != 0),反条件,第五节 循环设计,百钱买百鸡解1,#include int main() for(int cock=1; cock=13; +cock) for(int hen=1; hen=18; +hen) for(int chick=1; chick=96; +chick) if(7*cock+5*hen+chick/3 != 100)continue; if(cock+hen+chick != 100)continue; if(chick%3 !=0)continue; coutCock:cock

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