【学习课件】第二章基本控制结构程序设计_第1页
【学习课件】第二章基本控制结构程序设计_第2页
【学习课件】第二章基本控制结构程序设计_第3页
【学习课件】第二章基本控制结构程序设计_第4页
【学习课件】第二章基本控制结构程序设计_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章 基本控制结构程序设计结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。本章将介绍C+分支结构和循环结构的设计方法。还将介绍一些常用算法。编辑ppt第二章 基本控制结构程序设计 2.2 分支结构程序设计 2.7 枚举类型 2.6 常用算法的应用实例 2.4 转向语句 2.3 循环结构程序设计 2.8 输入输出文件简介 2.5 结构化程序设计思想(选读) 2.1 算法的概念与表示方法 编辑ppt2.1 算法的概念与表示方法2.1.1 算 法 的 概 念 2.1.3 算 法描述的三种基本结构2.1.2 算 法 的 表 示编辑ppt2.1.1 算 法 的 概 念 算法:算法是解决

2、问题的步骤。计算机算法的特征: 可执行性 确定性 有穷性 可输入输出信息算法是程序设计学习的重点。#include #define PI 3.14 int main() float r,h,v; coutrh; /r=6;h=12; v=PI*r*r*h; coutthe volume is v cbccmy) maxx;else max y;if (zmax) maxz;输出max;x7y12z10CPUmax12比较比较显示结果:12流程图条件块1块2真假演示算法执行过程编辑ppt2.1.3算法描述的三种基本结构(3) 循环结构流程图条件块真假【例23】求4个整数的和。 0sum4coun

3、t12x显示结果:60演示算法执行过程123142621642118600count4; /整数个数sum0; /累加和的初值while (count0) x输入一个整数; sumsum+x; countcount-1;输出sum;编辑ppt2.2 分支结构程序设计 对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。 分支语句是基本流程控制语句之一。C+提供三种分支语句。2.2.1 if语句 2.2.2 if语句的嵌套 2.2.4 swich语句 2.2.3 条件运算符“?:” 编辑ppt2.2.1 if 语句if语句基本格式:1、if (表达式) 语句1;2、if (表达式

4、) 语句1; else语句2;【例2.4】 输入一个年份,判断是否闰年。【例2.5】 从键盘上输入三个整数,输出其中的最大数。编辑ppt嵌套if语句:if 语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if 语句可实现二选一分支,而嵌套if语句则可以实现多选一的多路分支情况。嵌套有两种形式,嵌套在else分支中:if (表达式1) 语句1;else if (表达式2) 语句2; else if else 语句n;嵌套在if分支中:if () if () ; else; 2.2.2 if 语句的嵌套【例2.6】用嵌套if语句完成【例2.5】的任务。编辑pptelse和if的配对关系:

5、C+规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“”中。如第二种嵌套形式中,要让else和第一个if配对,语句必须写成:if (表达式1) if (表达式2) 语句1 ; else 语句2 ; 第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。 2.2.2 if 语句的嵌套编辑ppt配对关系实例:/语句1:if(n%3=0)if(n%5=0) coutn是

6、15的倍数endl;else cout n是3的倍数但不是5的倍数 endl;/语句2:if(n%3=0) if(n%5=0) coutn是15的倍数endl; else cout n 不是3的倍数两个语句的差别只在于一个“”,但表达的逻辑关系却完全不同。 【例2.7】 某商场购物优惠活动(p.37)【例2.8】 求一元二次方程的根(p.38-39)。编辑ppt 练习:编写程序,输入x,根据下面y和x的关系,计算y值并输出3x-11 (x10)x (x1)2x-1 (1xx; if(x1) y=x; else if(x10) y=2*x-1; else y=3*x-11; couty;. 编辑

7、ppt说明:语句中的表达式可以是任意表达式: if(x) y=1/x; else y=10000; 一个if结构不可分割: if(x) y=1/x; z=10; else y=10000;一个分支中包含多个语句时,要用 : if(a0) x=1; y=2;/error C2181: illegal else without matching if编辑ppt 例:从键盘输入三个整数到变量a,b,c,要求按从大到小的顺序输出。 两种典型算法: 枚举法(将各种可能的排列枚举出来)。 换位法(将a,b,c中的数据换位)。编辑ppt换位法int main() int a,b,c,t; cinabc; i

8、f(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; coutatbtcendl;358538553abc编辑ppt课下练习改正下列代码a) if (ival1!=ival2) ival1=ival2else ival1=ival2=0;b) if (ival1ival2)/执行以下两个语句 ival1=1; ival2=2;c) if (ival1=10) ival1=1; d) if ival1ival1endl; 编辑ppt上机总结(2013.11.4)上课前没有预习课下没有上机练习学习过程中浮躁(不动脑子去听课

9、)if(表达式) 语句1;满足表达式,表达式成立/可行,条件成立编辑pptcin操作遇到的问题. int a,b;cinab; /输入1.14 3.21 回车/cin.setstate(ios_base:failbit);cin.clear();while(cin.get()!=n) continue; /get rid of the rest of line. cinb; / 输入 250课下再上机练习编辑ppt2.2.3 条件运算符“?:” 三元运算符:三元运算符条件运算符“?:”可以用来简化if语句表达。其构成的表达式格式为:表达式1 ? 表达式2 : 表达式3例如:int a=6,b=

10、7, min=ab?a:b; /min=6 min=ab?+a:+b; /min=7 a=7 b=7 min=ascore; switch (score) case A: case a: coutexcellent; break;case B: case b:coutgood; break;default: coutfair; 编辑ppt(5)从形式上看,switch语句的可读性比嵌套if语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。 ok【例2.9】 运输货物实行分段计费。采用不带break的开关语句实例【例2.10】 设计一个计算器程序,实

11、现加、减、乘、除运算。 2.2.4 switch语句编辑ppt循环控制语句是基本流程控制语句之一。C+提供三种循环语句:2.3.1 while语句 2.3.4 循环的嵌套 2.3.3 for语句 2.3.2 do-while 语句 2.3 循环结构程序设计编辑ppt2.3.1 while 语句while语句也称为当循环。语句格式为:while (表达式)循环体语句; 图2.5 while语句的执行流程图求表达式的值表达式值为真?是否执行循环体语句【例2.11】 求1+2+3+4+100的值。编辑ppt2.3.1 while 语句注意:在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而

12、在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。C+表达方式灵活,上例中的循环语句还可以写成:while (i=n) sum+=i+;或者while (sum+=i+, i=n) ;/循环体为空语句修改程序后在VC+平台上运行,看是否正确编辑ppt2.3.2 do-while 语句 do-while语句称为直到循环,格式为: do 循环体语句 while( 表达式 ); 否是表达式的值为真?执行循环体语句求表达式的值图2.6 do-while语句的执行流程图编辑ppt2.3.2 do-while 语句 do/while语句和while语句的区别:do/while语句至少

13、执行一次循环体后再判断循环条件是否满足;while语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。多数情况下可以互相替代。【例2.12】 用迭代法求a的平方根近似值。【例2.13】 输入一段文本,统计文本的行数、单词数及字符数。编辑ppt x=-1; do x=x*x; while( !x); D) 有语法错误 C) 循环执行一次B) 循环执行三次A) 是死循环C)循环执行一次 编辑ppt int y=10; do y-; while(-y); couty-0)&(y5); couty=y x=xendl; 写出下列程序段的运行结果以及循环体中的语句共执行了几次。编辑ppt2.3.

14、3 for 语句 for循环语句的格式为:for ( 表达式1; 表达式2; 表达式3 ) 循环体语句 图2.7 for语句的执行流程图否是求表达式1的值求表达式2的值表达式2值为真?执行循环体语句求表达式3的值ok编辑ppt例:用for语句实现1-10的累加求和算法:s=0;for(i=1;i=10;i+) s+=i; 标准形式可以理解: 循环变量i从初值1开始到终值10,步长为1,重复执行循环体。表达式2表达式3表达式1循环体编辑pptfor语句的常见变化: s=0; i=1; for(;i=10;i+)s+=i; s=0; for(i=1;i=10;)s+=i+; s=0;i=1; fo

15、r(;i10) break; s=10;i=10; for(;-i;) s+=i;省略3个表达式表达式2是任意表达式编辑ppt s=0; for(i=1,j=10;ij;i+,j-) s+=i+j; 1 2 3 4 5 6 7 8 9 10在程序设计中不要过分追求它的多变性,力求简洁明了ij用逗号表达式通用吗?i=j?编辑pptfor语句、while语句、do/while语句比较:(如何选择?)int i=1,sum=0; /循环初始条件while(i=4) sum+=i; i+; /修改循环条件 int i=1,sum=0;/循环初始条件do sum+=i; i+;/修改循环条件 while

16、(i=4);int i,sum=0;for( i=1; i=4; i+ ) sum+=i; /*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/ok编辑pptfor 语句的应用for语句的几点说明:1、是先判断型的,同while语句;2、使用更为灵活:三个表达式可以是任意表达式,因此它们就可以实现循环初始化、计算、修改循环条件等任务,而不一定非在循环体中进行;编辑pptfor 语句的应用【例2.14】运行结果:0 1 1 2 35 8 13 21 3455 89 144 233 377610 987 1597 2584 4181【例2.15】 输入一个不超过5

17、位的整数,将其反向后输出。【例2.14】 设计程序输出Fibonacii数列的前20项编辑ppt2.3.4 循环的嵌套【例2.16】 打印九九表。嵌套循环:当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。嵌套层次一般不超过3层,以保证可读性。【例2.17】打印如下图形。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *编辑ppt2.4 转向语句break语句 return语句 goto 语句 continue语句 编辑pp

18、t2.4 转向语句 break语句只能用在switch语句和循环语句中,用来跳出最近的switch语句或循环,转去执行switch语句或循环语句之后的语句。 在for循环中可以用break结束循环:for(; ;) if() break; Break语句:【例2.18】 给定正整数m,判定其是否为素数。编辑ppt a=10; y=0; do a+=2; y+=a; couta=a y=y50) break; while(a=14); 写出下列程序段的运行结果。a=12 y=12a=16 y=28a=16 y=44a=16 y=60编辑ppt int x=3,y=6,a=0; while(x+!

19、=(y-=1) a+=1; if (yx) break; coutxyaendl; x=5,y=4,a=1编辑ppt2.4 转向语句 continue语句只能用在循环语句中,用来终止本次循环。当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。 continue语句与break语句的区别在于,continue语句结束的只是本次循环,而break结束的是整个循环。 continue语句:编辑ppt例:输出1100内3的倍数。分析:设置整型变量I从1变化到100,依次测试I是否3的倍数,算法属于穷举法。 for (I=1;

20、I=100;I+) if ( I%3!=0) continue; /I不是3的倍数,不输出,继续下一个I; 输出I的值;/I是3的倍数才输出 编辑ppt2.4 转向语句 goto语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从goto语句所在的地方转移到标号语句处。goto语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用goto语句。但在某些特定场合下goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用。 go

21、to语句:编辑ppt2.4 转向语句return语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。利用一个return语句可以将一个数据返回给调用者。通常,当函数的返回类型为void时, return语句可以省略,如果使用也仅作为函数或程序结束的标志。return语句:编辑ppt int main() int i, j, x=0; for(i=0; i2; i+) x+; for(j=0; j=3; j+) if(j%2) continue; x+; x+; coutxendl; 练习x=4B) x=8x=6D) x=12 (1) i=0 x=1j=0 x=2j=2x=3x=

22、4(2) i=1x=5j=0 x=6j=2x=7x=8B编辑ppt int main() int k=0; char c=A; do switch(c+) case A:k+; break; case B:k-; case C:k+=2; break; case D:k=k%2; continue; case E:k=k*10; break; default :k=k/3; k+; while(cG); coutkendl; return 0; 练习k=3 B) k=4 C) k=2 D) k=0 (1) c=Bk=2(2) c=Ck=4(3) c=Dk=7(4) c=Ek=1(5) c=Fk

23、=11(6) c=Gk=4B编辑ppt int main() int i; for(i=1; i5; i+) if(i%2) cout“*”; else continue; cout“#”; cout$endl; return 0;练习*#*#*# $ B) #*#*#* $ C) *#*# $ D) #*#* $ C编辑ppt 若 i , j 已定义为 int 类型,则以下程序段中内循环体 总的执行次数是: for( i =5; i ; i -) for(j=0; j100) break; C) short k=32765; D) short S=32765; do while(S+%2)|

24、(S%2) k+; k+; S+; while(k0);C编辑pptshort :取值范围 -3276832767 327650 1 1 1 1 1 1 1 1 1 1 1 1 1 0 17 7 7 7 532766 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 7 7 7 7 6327670 1 1 1 1 1 1 1 1 1 1 1 1 1 1 17 7 7 7 7-327681 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 0 0 0 0 0-327671 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 1-327661 0

25、 0 0 0 0 0 0 0 0 0 0 0 0 1 01 0 0 0 0 2十进制二进制八进制编辑ppt2.5 结构化程序设计思想(选读)传统的程序设计方法可以归结为“程序=算法+数据结构”,将程序定义为处理数据的一系列过程。这种设计方法的着眼点是面向过程的,特点是数据与程序分离,即数据与数据处理分离。 结构化程序设计的基本思想是采用自顶向下、逐步细化的设计方法和单入单出的控制结构。结构化程序设计方法:编辑ppt2.5 结构化程序设计思想(选读)举一个简单的例子,要求读入一组整数,统计其中正整数和负整数的个数。该任务的模块结构及细化过程如下:1.读入数据2.统计正数、负数的个数; 3. 输出

26、结果 2.1 如数大于0,正整数个数加12.2 如数小于0,负整数个数加12.3: 取下一个整数正整数个数为0;负整数个数0 取第一个整数重复至统计完编辑ppt2.5 结构化程序设计思想(选读)(1)难以适应大型软件的设计。由于数据与数据处理相对独立,在大型多文件软件系统中,随着数据量的增大,程序越来越变得难以理解,多个文件之间的数据沟通也变得困难,还容易产生意想不到的结果,即所谓副作用。 (2)程序可重用性差。处理方法的改变或数据类型的改变都将导致重新设计,这种额外开销与可重用性相左,称为重复投入 结构化程序设计缺陷: 编辑ppt2.6 常用算法的应用实例【例2.20】世界数学史上著名的“百

27、鸡问题”【例2.21】用欧基里德算法(也称辗转法) 求两个整数的最大公约数【例2.23】输入一个8位二进制数,将其转换为十进制数输出。【例2.19】 用筛选法求100之内的所有素数【例2.22】输入一个小于1的数x,求sinx的近似值编辑ppt2.7 枚举类型 2.7.1 枚举类型的定义 2.7.2 枚举变量的使用 枚举类型(enumerate)是c+中的一种派生数据类型,它是用户定义的若干枚举常量的集合。枚举类型的变量,只能取枚举常量表中所列的值。定义枚举类型的主要目的是增加程序的可读性。 编辑ppt2.7.1 枚举类型的定义 枚举类型定义(enumeration):enum ;关键字enu

28、m指明其后的标识符是一个类型的名字,枚举常量表中列出该类型的所有取值,各枚举常量之间以“,”间隔。例:enum color_set1 RED, BLUE, WHITE, BLACK;enum week Sun, Mon, Tue, Wed, Thu, Fri, Sat;枚举常量(或称枚举成员)是以标识符形式表示的整型量,非法定义实例:enum letter_set a, d, F, s, T;/枚举常量只能是标识符enum year_set2000,2001,2002,2003,2004,2005; /改为y2000等则正确编辑ppt2.7.1 枚举类型的定义 枚举常量: 枚举常量代表该枚举类

29、型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从0开始。如上例中RED、 BLUE、 WHITE、 BLACK的值分别为0、1、2、3。 用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加1的原则取值。各枚举常量的值可以重复,但各枚举常量标识符必须不同。例:enum fruit_set apple, orange, banana=1, peach, grapeenum week Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat;枚举

30、常量apple、orange、banana、peach、grape的值分别为0、1、1、2、3。枚举常量Sun, Mon, Tue, Wed, Thu, Fri, Sat的值分别为7、1、2、3、4、5、6。编辑ppt2.7.2 枚举类型的变量的使用 枚举类型应用要点:1、定义枚举类型之后,就可以定义枚举类型的变量;亦可类型与变量同时定义(甚至类型名可省):color_set1 color1, color2;enum Sun, Mon, Tue, Wed, Thu, Fri, Sat weekday1, weekday2;2、枚举变量的取值范围就是整型数的一个子集。枚举变量占用内存的大小与整型

31、数相同。3、枚举变量允许的操作只有赋值和关系运算;如: color3=color4=BLUE; if (color3=color4) cout”相等”; cout color3color1/非法 coutcolor3/合法,输出的是2 从程序的合法性和可读性出发,枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串。同时,枚举类型数据的其他处理也往往应用switch语句。2.7.2 枚举类型的变量的使用 *【例2.24】 口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。编辑ppt2.8 输入输出文件简介使用文件的步骤如下:#in

32、clude(1) 说明一个文件流对象(内部文件)。文件流类型ifstream支持从输入文件提取数据的操作。而文件流类型ofstream完成数据写入输出文件的各种操作。ifstream ifile; /定义输入文件,ifile为文件名,可用任意标识符ofstream ofile; /定义输出文件,ofile为文件名,可用任意标识符(2) 打开文件。ifile.open(”d:my_in_file.txt”);ofile.open(”d:my_out_file.txt”);引号中的”d:my_in_file.txt” 和”d:my_out_file.txt”为磁盘文件路径名,这样在文件流对象和磁盘

33、文件名之间建立了联系。编辑ppt(3) 对文件进行读写操作。最常见的文件读写是顺序的,所谓“顺序”指的是从文件头开始进行读写。顺序读写可用C+的提取运算符()和插入运算符()进行。也可以用读字符的get()和读字符串的getline()等函数。读写是在文件缓冲区中进行。(4) 关闭文件。当打开一个文件进行读写后,应该显式地关闭该文件。与打开文件相对应:ifile.close();ofile.close();关闭文件时,系统把与该文件相关联的文件缓冲区中的数据写到磁盘文件中,保证文件的完整;同时把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。【例2.25】将百鸡问题计算结果存

34、入文件。【例2.26】读出存放百鸡问题计算结果的文件。编辑ppt第二章 基本控制结构程序设计结束欢迎再来!编辑ppt if 语句【例24】【例24】 输入一个年份,判断是否闰年。算法分析:假定年份为year, 闰年的条件是 : year%4=0&year%100!=0|year%400=0。int main( )int year;cout输入年份:year;if (year%4=0&year%100!=0|year%400=0)coutyear“年是闰年endl;else cout year“年不是闰年endl;return 0; ok编辑ppt分析:读入三个数,先求出两个数中较大者,再将该大

35、数与第三个数比较,求出最大数。int main() int a, b, c, max; coutabc; couta=atb=bt c=cb) max=a; else max=b; if(cmax) cout “最大数为:”cendl; else cout “最大数为:”max=b?max=amax=b否是cmax?max=c输出max图2.2 例2.5流程图编辑ppt/方法1:采用if中嵌套形式int main()int a, b, c, max;coutabc;couta=atb=b tc=cb) if(ac) max=a; /ab且ac else max=c; /ab且ac) max=b

36、; /acelse max=c; /a=b且bccout最大数max=max; return 0; if 语句【例26】【例2.6】用嵌套if语句完成【例2.5】的任务。ok编辑ppt/方法2:采用else中嵌套形式int main()int a,b,c,max;coutabc;couta=atb=b tc=cb&ac) max=a;else if(ba&bc) max=b; else max=c;cout最大数为:max=max; return 0; if 语句【例26】ok编辑ppt【例2.7】 某商场优惠活动规定,某种商品单价为80元,一次购买5件以上(包含5件)10件以下(不包含10件

37、)打9折,一次购买10件以上(包含10件)打8折。设计程序根据客户的购买量计 算总价。算法1、输入购买件数count,设置单价price=80(元) 2、根据count值确定折扣discount;3、实际售价amount=price*count*discount;4、输出amount的值。算法细化:2.1、if(count=5&count=10)discount=0.8; if 语句【例27】编辑pptint main() float price=80,discount,amount;/单价,折扣,总价 int count;/购买件数 cout输入购买件数:count; if(count5)

38、discount=1; else if(count10) discount=0.9; else discount=0.8; amount=price*count*discount; cout购买件数:countendl; cout单价:pricet折扣:“discountendl; cout总价:amount0, 方程有两个不同实根;* 若delta0?否输出两个相等实根否是输出无实根 if 语句【例28】编辑ppt#include #include using namespace std;int main()float a,b,c;float delta,x1,x2;const float

39、zero=0.0001; /定义一个很小的常数cout输入三个系数a(a!=0), b, c:abc;couta=atb=btc=cendl;delta=b*b-4*a*c;求一元二次方程的根源程序 if 语句【例28】编辑pptif(fabs(delta)zero) /绝对值很小的数即被认为是0cout方程有两个相同实根:;coutx1=x2=-b/(2*a)0) delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)/(2*a);cout方程有两个不同实根:;coutx1=x1tx2=“x2endl;else cout方程无实根!endl;

40、/delta0return 0;请在VC+平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。 if 语句【例28】编辑ppt不带break的开关语句实例【例2.9】 运输公司对所运货物实行分段计费。设运输里程为s,则运费打折情况如下:s250 不打折扣250=s500 2%折扣500=s10005%折扣1000=s20008%折扣2000=s300010%折扣3000=s 15%折扣2000=s3000 10%折扣1000=s2000 8%折扣500=s1000 5%折扣250=s500 2%折扣s250 不打折扣不带break的开关语句实例编辑pptint main() int c

41、,s;double p,w,d,f; cout输入运输单价p,重量w和里程s:pws; f=0; c=s/250; switch(c) default: d=0.15;f+=p*w*(s-3000)*(1-d);s=3000; case 8: case 9: case 10: case 11: d=0.1;f+=p*w*(s-2000)*(1-d);s=2000; case 4: case 5: case 6: case 7: d=0.08;f+=p*w*(s-1000)*(1-d);s=1000; case 2: case 3: d=0.05;f+=p*w*(s-500)*(1-d);s=5

42、00; case 1: d=0.02;f+=p*w*(s-250)*(1-d);s=250; case 0: d=0;f+=p*w*s*(1-d); cout运输单价:pt重量:wt里程:sendl; cout折扣后运费:fendl; return 0;请在VC+平台上运行,输入不同的里程。编辑ppt【例2.10】 设计一个计算器程序,实现加、减、乘、除运算。分析:读入两个操作数和运算符,根据运算符完成相应运算。#include using namespace std;int main( )float num1,num2;char op;cout输入操作数1,运算符,操作数2:num1opnu

43、m2; switch(op) case +: coutnum1opnum2=num1+num2endl; break; case -: coutnum1opnum2=num1-num2endl; break; case *: coutnum1opnum2=num1*num2endl; break; case /: coutnum1opnum2=num1/num2endl; break; default : coutop是无效运算符!; return 0; 常量表达式采用字符型,上机运行一下。编辑ppt while 语句【例2.11】 【例2.11】 求1+2+3+4+100的值。okN个连续整

44、数相加算法1、设置变量i用来放加数,变量sum用来放被加数与和值,并初始化;2、从第一个数开始,依次将加数赋给i,并进行操作sumsum+i,称为累加;3、输出sum;细化算法2: while(还有加数)i=当前加数; sum+=i; i准备接受下一个加数; 编辑ppt源程序如下:#include using namespace std;const int n=100; /用常变量利于修改程序int main( ) int i=1,sum=0;/循环初始条件 while(i=n) sum+=i; i+;/修改循环条件 coutsum=sumendl; return 0; 在VC+平台上运行,试

45、一试是否正确ok编辑ppt【例2.12】 用迭代法求a的平方根近似值。求平方根的迭代公式为: 要求前后两个迭代根之差小于10- 5。 do-while 语句【例2.12】 迭代法求解:a是已知正数,x 0是迭代初值,给x 0一个值,假定 x 0 = a/2;则用迭代公式依次计算:x1=(x0+a/x0)/2;x2=(x1+a/x1)/2;xk+1=(xk+a/xk)/2;当|xk+1 xk|0)及较小正数delta(也可用常变量);2、x 0 = a/2; 用迭代公式算 x1=(x0+a/x0)/2;3、while(|x1 x0|=delta) x 0 = x 1 ;/把最近的值给x 0 x1

46、=(x0+a/x0)/2; /求xk+1时只需要知道xk的值,所以只需2个变量4、取x1的值为a的平方根近似值,输出。2、3步骤很适合用do/while语句实现: x 1 = a/2; dox0=x1;x1=(x0+a/x0)/2; while(|x1 x0|=delta);和迭代法对应的程序算法是递推算法:编辑pptint main( ) float x0,x1,a; couta; if(a0)couta不能开平方!0) /有实数解的情况 x1=a/2; /x1用于保存结果 dox0=x1;x1=(x0+a/x0)/2; while (fabs(x1-x0)=1e-5); cout a的平方

47、根为:x1endl; elsecout a的平方根为:0endl; return 0;在VC+平台上运行,输入2,3,4,5试一试是否正确编辑ppt【例2.13】 输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。算法分析:1、逐个读入文本中的字符,直到读到一个输入结束符EOF为止。2、如何算行数?行结束标志为读到字符n;3、如何算单词数?设一个变量isword,读到字符时isword=1,读到间隔符时isword=0;如果读到一个间隔符而此时isword值为1,则说明刚读完一个单词;(如果读到一个字符而此时isword值为0,则说明刚开始

48、读一个单词;)4、如何算字符数? do-while 语句【例2.13】okDiaoyu Island belongs to China! I like programming in C+.编辑pptdo-while 语句【例2.13】算法:1、设置变量line、word、ch分别代表行数、单词数、非分隔字符数,并初始化;设置变量isword来辅助统计单词数;2、do从键盘读入一个字符c;if ( c=n) line+;if (是单词开头) word+; if (c不是分隔符) ch+; while (c!= EOF );3、输出统计结果。Diaoyu Island belongs to Chi

49、na! I like programming in C+.编辑pptint main( ) char c; int line=0, word=0, ch=0; bool isword=false; cout输入一段文本(无空行):endl; do c=cin.get(); if (c= n) line+; /遇换行符行数+1 if (c!= &c!= t&c!=n) /读到非间隔符 if(isword=0) word+; /在单词的起始处给单词数+1 ch+; /字符数加+1 isword=1; else isword=0;/读到间隔符,即将开始读入新的一个单词 while(c!=EOF);

50、cout”行数:”lineendl; cout”单词数:”wordendl; cout”字符数:”charendl; return 0;Diaoyu Island belongs to China! I like programming in C+.编辑ppt【例2.14】 设计程序输出Fibonacii数列的前20项,要求每行输出5个数据。Fibonacii数列定义如下:算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;属递推算法。for 语句的应用【例2.14】编辑ppt算法:1、设置变量n表示第几项,

51、变量 f 1和 f 2用来记住当前项f 3之前的两项 ;变量初始化n=0;2、while (当前项不到第20项) if (当前项是第0项) f 1=0; if (当前项是第1项) f 2=1; if (当前项是第2项或更高项)f 3=f 1+f 2; 按要求输出 f 3 ; f 1=f 2; f 2=f 3; /记住最近两项 当前项后移一位; 编辑ppt程序如下:/文件名:Ex2_14.cppint main() int fib0=0,fib1=1,fib2;coutsetw(5)fib0setw(5)fib1 endl;for(int n=3;n=20;n+)fib2=fib0+fib1;c

52、outsetw(5)fib2;if(n%5=0) coutendl; /控制每行5个数据fib0=fib1; fib1=fib2; return 0;for 语句的应用【例2.14】编辑ppt【例2.15】 输入一个不超过5位的整数,将其反向后输出。例如输入247,变成742输出。算法分析:1、将整数的各个数位逐个位分开,用一个数组保存各个位的值,然后反向组成新的整数。2、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位、百位,直到整数的值变成0为止。 for 语句的应用【例2.15】 ok编辑ppt数据处理:1、设置变量num表示输入的

53、整数,整型数组digit5用来存放num 的各个位;变量i用来表示数组的当前下标;算法:1、输入num; 变量初始化:i=0;2、while (num!=0) num对10取余,得num的当前个位数digiti;num整除10,即去掉个位数,十位变个位,百位变十位,;i+;数组digit准备记录下一位;3、将数组元素按下标从低到高的顺序输出;编辑ppt程序如下:int main()int i,num,subscript;int digit5;cout输入一个整数:num;cout原来整数为:num0);for(i=0;isubscript;i+) /整数的反向组合num=num*10+digi

54、ti;cout反向后整数为:numendl; return 0;在VC+平台上运行,试一试是否正确编辑ppt 循环的嵌套【例2.16】 分析:1、计算机的输出是按行进行的,因此可以先用一个循环语句输出第一行表头。2、表中各行数据的输出可以用下面的算法描述:for (i=1; i10; i+) couti; /输出行号 输出第i行数据; /A coutendl; /准备输出下一行 【例2.16】 打印九九表。打印格式为:* 1 2 3 4 5 6 7 8 91 1 2 2 43 3 6 99 9 18 27 36 45 54 63 72 81编辑ppt3、第A行需要进一步细化。由于第i行数据是一

55、组有规律的数列,每个数的值是其所在行与列的乘积,因此输出第i行可以:for (j=1; j10; j+) coutsetw(4)i*j;4、按上述算法输出的每一行都将有九列,即打印出的是矩形表而不是下三角形表。进一步分析发现每一行的列数与所在行数相关,因此要输出三角形表,上面的循环语句需稍作修改:for (j=1; j=i; j+) coutsetw(4)i*j;将此语句放到顶层算法的A行即可。 循环的嵌套【例2.16】 编辑ppt算法:1、输出表头,用一个循环语句即可;2、输出表体:for (i=1; i10; i+) couti; /输出行号 输出第i行数据; /A coutendl; /

56、准备输出下一行 3、A行细化: for (j=1; j=i; j+) coutsetw(4)i*j; 循环的嵌套【例2.16】 编辑ppt在VC+平台上运行下面的程序:int main()int i,j;coutsetw(3)*setw(4) ;for(i=1;i10;i+)coutsetw(4)i; /输出表头(乘数)coutendlendl;for(i=1;i10;i+)coutsetw(3)isetw(4) ; /输出行号(被乘数)for(j=1;j=i;j+)coutsetw(4)i*j;/输出表中数据(乘积)coutendl; /准备输出下一行 return 0; 循环嵌套【例2.1

57、6】 _打印九九表编辑ppt【例2.17】打印如下图形。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *分析:根据按行输出的特点,语句书写如下:for (i=1; i=5; i+) 打印第i行;/Bcoutendl;/准备输出下一行细化第B行。第i行可以看作两部分,先输出若干空格,接着输出若干*。每行输出的*数是同的,而空格数则与所在行相关,很明显,第i行空格数为5-i。故B行细化为以下两个语句:for (j=1; j=5-i;

58、 j+) cout ;for(j=1;j=11;j+) cout* ;2.3.4 循环嵌套【例2.17】编辑ppt#include #include using namespace std;int main()int i,j;for(i=1;i=5;i+) /外层循环的大括号一定不能丢掉for(j=1;j=5-i;j+) cout ; /输出若干空格for(j=1;j=11;j+) cout* ; /输出若干*cout2,m是素数的条件是不能被2,3,,(取整)整除。因此可以用2,3,,(取整)逐个去除m,如果被其中某个数整除了,则m不是素数,否则是素数。算法属于穷举法。1、输入被测数m(m2

59、);令整型变量 k= sqrt(m) 2、判断m是否素数:设置辅助整型变量i, 使i从2开始直到k依次测试m能否整除i, 若能,则不是素数;for( i=2;i=k;i+)if(m%i=0) break; /* 条件满足,m不是素数,停止测试,结束for语句。*/3、根据i是否已达到k,输出结果是否为素数。编辑pptint main()int m,i,k;cout输入整数m:m;if(m=2) coutm是素数endl;elsek=sqrt(m);for(i=2;ik) cout m是素数endl;/循环提前终止表示是非素数else cout m不是素数endl;return 0;在VC+平台

60、上运行,改一下,使程序自动算出100以内的素数编辑ppt2.6 常用算法的应用实例【例2.19】 直接法直接法是根据问题给出的条件直接求解。【例2.19】 用筛选法求100之内的所有素数,并将这些素数输出,每行输出 2个数据。分析 算法一 穷举法:1、判断一个数是否素数?方法穷举法;2、100之内的所有素数?方法:一个个试;综上所述,得到一个循环嵌套的算法:for(m=2;m=100;m+)/穷举法 if(m是素数)按要求的格式输出m;k= sqrt(m); for(i=2;i=k;i+) /穷举法 if(m%i=0) break; /m不是素数if (i=k) m是素数; /刚才的for是由

温馨提示

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

评论

0/150

提交评论