




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ok第二章第二章 基本控制结构程序设计基本控制结构程序设计结构化程序设计的特点是任何程序都可由结构化程序设计的特点是任何程序都可由三种基本结构三种基本结构及其组合来描述。及其组合来描述。本章将介绍本章将介绍C+分支结构和循环结构的设分支结构和循环结构的设计方法。还将介绍一些计方法。还将介绍一些常用算法常用算法。1ok第二章第二章 基本控制结构程序设计基本控制结构程序设计2ok2.1.3算法描述的三种基本结构算法描述的三种基本结构3 循循 环环 结结 构构1 顺顺 序序 结结 构构2 分分 支支 结结 构构算法的基本结构:算法的基本结构:对算法的理论研究和实践表明,任何算法的描述对算法的理论研究
2、和实践表明,任何算法的描述都可以分解为三种基本结构或它们的组合,这三都可以分解为三种基本结构或它们的组合,这三种基本结构是种基本结构是顺序结构顺序结构、分支结构分支结构和和循环结构循环结构。3ok2.2 分支结构程序设计分支结构程序设计 对程序的运行流程进行控制,主要通过执行对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。专门用来控制流程的语句来实现。 分支语句分支语句是基本流程控制语句之一。是基本流程控制语句之一。C+C+提供提供三种分支语句。三种分支语句。2.2.1 if语句语句 2.2.2 if语句的嵌套语句的嵌套 2.2.4 swich语句语句 2.2.3 条件运算
3、符条件运算符“?:?:” 4ok2.2.1 if 语句语句ifif语句基本格式:语句基本格式:1、if (表达式表达式) 语句语句1;2、if (表达式表达式) 语句语句1; else语句语句2;【例例2.4】 输入一个年份,判断是否闰年。输入一个年份,判断是否闰年。【例例2.5】 从键盘上输入三个整数,输出从键盘上输入三个整数,输出其中的最大数。其中的最大数。5ok嵌套嵌套ifif语句:语句:if if 语句中,如果内嵌语句又是语句中,如果内嵌语句又是ifif语句,就构成了语句,就构成了嵌套嵌套ifif语语句句。if if 语句可实现语句可实现二选一二选一分支,而嵌套分支,而嵌套ifif语句
4、则可以实现语句则可以实现多选一多选一的多路分支情况。的多路分支情况。嵌套有两种形式,嵌套在嵌套有两种形式,嵌套在elseelse分支中分支中: :if (表达式表达式1) 语句语句1;else if (表达式表达式2) 语句语句2; else if else 语句语句n;嵌套在嵌套在ifif分支中:分支中:if if () 1) ifif ( () ) 1; elseelse ; 2; 2.2.2 if 语句的嵌套语句的嵌套【例例2.6】用嵌套用嵌套if语句完成语句完成【例例2.5】的任务。的任务。6okelseelse和和ifif的配对关系:的配对关系: C+C+规定了规定了ifif和和el
5、seelse的的“就近配对就近配对”原则,即相距最近原则,即相距最近且还没有配对的一对且还没有配对的一对ifif和和elseelse首先配对。按上述规定,第首先配对。按上述规定,第二种嵌套形式中的二种嵌套形式中的elseelse应与第二个应与第二个ifif配对。如果根据程序配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在的逻辑需要改变配对关系,则要将属于同一层的语句放在一对一对“”中。如第二种嵌套形式中,要让中。如第二种嵌套形式中,要让elseelse和第一个和第一个ifif配对,语句必须写成:配对,语句必须写成:ifif( (表达式表达式1)1)if if ( (表达式表
6、达式2) 2) 语句语句1;1; else else 语句语句2 ;2 ; 第二种嵌套形式较容易产生逻辑错误,而第一种形式第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,配对关系则非常明确,因此从程序可读性角度出发,建议建议尽量使用第一种嵌套形式。尽量使用第一种嵌套形式。 2.2.2 if 语句的嵌套语句的嵌套7ok配对关系实例:配对关系实例:/语句语句1 1:ifif(n%3=0)(n%3=0)ifif(n%5=0) coutn(n%5=0) coutn是是1515的倍数的倍数endl;endl;else else cout n cout n是是3
7、 3的倍数但不是的倍数但不是5 5的倍数的倍数 endl; endl;/语句语句2 2:ifif(n%3=0)(n%3=0) ifif(n%5=0) coutn(n%5=0) coutn是是1515的倍数的倍数endl;endl; elseelse cout n cout n 不是不是3 3的倍数的倍数两个语句的差别只在于一个两个语句的差别只在于一个“”,但表达的逻辑关系却,但表达的逻辑关系却完全不同。完全不同。 【例例2.72.7】 某商场购物优惠活动某商场购物优惠活动【例例2.82.8】 求一元二次方程的根。求一元二次方程的根。8ok2.2.3 条件运算符条件运算符“?:” 三元运算符:三
8、元运算符:三元运算符条件运算符三元运算符条件运算符“?:?:”可以用来简化可以用来简化ifif语句表达。其语句表达。其构成的表达式格式为:构成的表达式格式为:表达式表达式1 ? 1 ? 表达式表达式2 : 2 : 表达式表达式3 3例如:例如:int a=6,b=7; min=ab?a:b; int a=6,b=7; min=ab?a:b; /min=6/min=6 min=ab?+a:+b; min=ab?+a:+b; /min=7 a=7 b=7/min=7 a=7 b=7 min=ab?a+:b+; min=ascore; switch (score) case A: case a: c
9、outexcellent; break;case B: case b:coutgood; break;default: coutfair; 14okok【例例2.9】 运输货物实行运输货物实行分段计费分段计费。采用不采用不带带breakbreak的的开关语句实例开关语句实例【例例2.10】 设计一个计算器程序,设计一个计算器程序,实现加、减、乘、除运算。实现加、减、乘、除运算。 2.2.4 switch语句语句15ok循环控制语句循环控制语句是基本流程控制语句之一。是基本流程控制语句之一。C+C+提供三种循环语句:提供三种循环语句:2.3.1 while语句语句 2.3.4 循环的嵌套循环的嵌
10、套 2.3.3 for语句语句 2.3.2 do-while 语句语句 2.3 循环结构程序设计循环结构程序设计16ok2.3.1 while 语句语句whilewhile语句也称为当循环。语句也称为当循环。语句格式为:语句格式为:while (while (表达式表达式) )循环体语句;循环体语句; 【例例2.11】 求求1+2+3+4+100的值。的值。17ok2.3.1 while 语句语句注意:注意:在有循环语句的程序中,通常循环开始前对循环条件进在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的行初始化;而在循环体语句中要包含修改循环条件的
11、语句,否则循环将不能终止而陷入死循环。语句,否则循环将不能终止而陷入死循环。C+表达方式灵活,例表达方式灵活,例2.11中的循环语句还可以写成:中的循环语句还可以写成:while (i=n) sum+=i+;或者或者while (sum+=i+, i=n) ;/循环体为空语句循环体为空语句这两种表达方式与例这两种表达方式与例2.11中的循环语句从执行结果看是完中的循环语句从执行结果看是完全等价的。需要说明的是,虽然全等价的。需要说明的是,虽然C+可以让代码最大可以让代码最大限度优化,但往往造成可读性降低,因此程序设计者限度优化,但往往造成可读性降低,因此程序设计者只需理解这种表达方法的意义,而
12、设计时主要追求的只需理解这种表达方法的意义,而设计时主要追求的目标应是目标应是可读性可读性。18ok2.3.2 do-while 语句语句 do-while语句称为语句称为直到直到循环循环,格式为:,格式为: do 循环体语句循环体语句 while( 表达式表达式 ) 19ok2.3.2 do-while 语句语句 do/while语句和语句和while语句的区别:语句的区别:do/while语句至少执行一次循环体后再判断语句至少执行一次循环体后再判断循环条件是否满足;循环条件是否满足;while语句先判断条件是否满足,然后才执行语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。循环
13、体。可能一次也不执行。多数情况下可以互相替代。多数情况下可以互相替代。【例例2.12】 用迭代法求用迭代法求a的平方根近似值。的平方根近似值。【例例2.13】 输入一段文本,统计文本的输入一段文本,统计文本的行数、单词数及字符数。行数、单词数及字符数。20ok2.3.3 for 语句语句 for循环语句的格式:循环语句的格式:for ( 表达式表达式1; 表达式表达式2; 表达式表达式3 ) 循环体语句循环体语句 ok执行过程为:先求表达式1的值,再求表达式2的值,判断表达式2的值,如果为真,则执行循环体语句,之后求表达式3的值,然后再计算表达式2的值,再判断表达式2的值,决定是否执行循环体,
14、如此重复,直到表达式2的值为假,结束该循环语句。 21okfor语句、语句、while语句、语句、do/while语句比较:语句比较:int i=1,sum=0; /循环初始条件循环初始条件while(i=4) sum+=i; i+; /修改循环条件修改循环条件 int i=1,sum=0;/循环初始条件循环初始条件do sum+=i; i+;/修改循环条件修改循环条件 while(i=4);int i,sum=0;for( i=1; i=4; i+ )sum+=i; / /* *习惯上:表达式习惯上:表达式1 1:循环初始条件;表达式:循环初始条件;表达式2 2:循环:循环终止条件;表达式终
15、止条件;表达式3 3:修改循环条件:修改循环条件* */ /ok22okfor 语句的应用语句的应用forfor语句的几点说明:语句的几点说明:(1) for语句属于先判断型,与语句属于先判断型,与while语句完全等同。语句完全等同。(2) for语句中的三个表达式都是包含逗号表达式在内的语句中的三个表达式都是包含逗号表达式在内的任意表达式。任意表达式。 如如【例例2.11】中的循环部分用中的循环部分用for语句可描述为:语句可描述为: for (i=1, sum=0; i=100; i+) sum+=i;(3) for语句中的三个表达式可部分或全部省略,但两个语句中的三个表达式可部分或全部
16、省略,但两个分号不能省略。如上述语句还可写为:分号不能省略。如上述语句还可写为:i=1; sum=0;for ( ;i=100; ) sum+=i; i+; 实际上,表达式实际上,表达式2也可省略,形如也可省略,形如for (; ;) 这种情况下,约定表达式这种情况下,约定表达式2的值为的值为1,即等同,即等同for (; 1;) 死循环,用死循环,用break跳出。跳出。23okfor 语句的应用语句的应用【例例2.142.14】运行结果:运行结果:0 1 1 2 35 8 13 21 3455 89 144 233 377610 987 1597 2584 4181那么怎样才能从兔子问题推
17、导出那么怎样才能从兔子问题推导出Fibonacci数列呢?数列呢?设本月底兔子数为设本月底兔子数为a,上月底兔子数,上月底兔子数b,两月前月底兔子数为,两月前月底兔子数为c。那么两月前的所有兔子,包括老兔子和当月新生的兔子本月那么两月前的所有兔子,包括老兔子和当月新生的兔子本月都可以生小兔子,即本月新生兔子总数是两月前的兔子数都可以生小兔子,即本月新生兔子总数是两月前的兔子数c,所以本月兔子总数所以本月兔子总数a等于上月兔子数等于上月兔子数b与两月前兔子数与两月前兔子数c(即本即本月新生兔子数月新生兔子数)之和,即:之和,即:a=b+c; 这就是这就是Fibonacci数列。数列。【例例2.1
18、42.14】 设计程序输出设计程序输出FibonacciFibonacci数列的前数列的前2020项项24okfor 语句的应用语句的应用也可以另设计一个算法:安排四个变量:兔子总数也可以另设计一个算法:安排四个变量:兔子总数s,成年,成年兔数量兔数量a,一月兔数量,一月兔数量b,初生兔数量,初生兔数量c;a=a+b; /本月成年兔为上月一月兔与成年兔之和本月成年兔为上月一月兔与成年兔之和b=c; /本月一月兔数量为上月初生兔本月一月兔数量为上月初生兔c=a; /本月底初生兔数量为本月成年兔数量本月底初生兔数量为本月成年兔数量s=a+b+c; /本月底兔总数本月底兔总数代入初值:代入初值:a=
19、0; b=0; c=1; 就可以进行递推。就可以进行递推。【例例2.152.15】 输入一个不超过输入一个不超过9 9位的整数,将其反向位的整数,将其反向后输出。后输出。25ok2.3.4 循环的嵌套循环的嵌套【例例2.16】 打印九九表。打印九九表。嵌套循环:嵌套循环:当循环语句中的循环体中又有循环语句时,就构成了嵌套当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。循环。嵌套层次一般不超过嵌套层次一般不超过3层,以保证可读性。层,以保证可读性。【例例2.172.17】打印如下图形。打印如下图形。 * * * * * * * * * * * * * * * * * * * * * *
20、* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *26ok2.4 转向语句转向语句break语句语句 return语句语句 goto 语句语句 continue语句语句 27ok2.4 转向语句转向语句 break语句只能用在语句只能用在switch语句语句和和循环语句循环语句中,中,用来跳出用来跳出switch语句或提前终止循环,转去执行语句或提前终止循环,转去执行switch语句或循环语句之后的语句。语句或循环语句之后的语句。 在在for循环中可以用循环中可以用break结束循环:结束循环:for(; ;) if(
21、) break; 在多重循环中,在多重循环中,break语句只能终止其所在的循环语句。语句只能终止其所在的循环语句。BreakBreak语句:语句:【例例2.18】 给定正整数给定正整数m,判定其是否为素数。,判定其是否为素数。28ok2.4 转向语句转向语句例:例: for (i =10; i 20; i +) if (i %3=0) break; /遇到遇到 i是是3的倍数,提前终止循环的倍数,提前终止循环; coutit ;/ i不是不是3的倍数才输出的倍数才输出 该程序段执行后输出:该程序段执行后输出:10 1129BreakBreak语句:语句:ok2.4 转向语句转向语句 cont
22、inue continue语句只能用在语句只能用在循环语句循环语句中,用中,用来来终止本次循环终止本次循环。当程序执行到。当程序执行到continuecontinue语语句时,将跳过其后尚未执行的循环体语句,句时,将跳过其后尚未执行的循环体语句,开始下一次循环开始下一次循环。下一次循环是否执行仍然。下一次循环是否执行仍然取决于循环条件的判断。取决于循环条件的判断。 continuecontinue语句与语句与breakbreak语句的区别在于,语句的区别在于,continuecontinue语句结束的只是语句结束的只是本次循环本次循环,而,而breakbreak结束的是结束的是整个循环整个循环
23、。 continuecontinue语句:语句:30ok例:例: for (i =10; i20; i +) if (i %3=0) continue; /遇到遇到 i是是3的倍数,跳过下面的语句,开的倍数,跳过下面的语句,开 始下一次循环始下一次循环; coutit ;/ i不是不是3的倍数才输出的倍数才输出 该程序段执行后输出:该程序段执行后输出: 10 11 13 14 16 17 18 1931ok2.4 转向语句转向语句 goto goto语句和标号语句一起使用,所谓标号语句语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从是用标识符标识的语句,它控制程序从got
24、ogoto语句所语句所在的地方转移到标号语句处。在的地方转移到标号语句处。gotogoto语句会导致程序语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡可以用算法的三种基本结构实现,因此一般不提倡使用使用gotogoto语句。但在某些特定场合下语句。但在某些特定场合下gotogoto语句可能语句可能会显出价值,比如在多层循环嵌套中,要从深层地会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用方跳出所有循环,如果用breakbreak语句,不仅要使用多语句,不仅要使用多次,而且可读性
25、较差,这时次,而且可读性较差,这时gotogoto语句可以发挥作用。语句可以发挥作用。 gotogoto语句:语句:32ok2.4 转向语句转向语句return语句用于结束函数的执行,返回调用者,语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。如果是主函数,则返回至操作系统。利用一个利用一个return语句可以将一个数据返回给调语句可以将一个数据返回给调用者。通常,当函数的返回类型为用者。通常,当函数的返回类型为void时,时, return语句可以省略,如果使用也仅作为函数语句可以省略,如果使用也仅作为函数或程序结束的标志。或程序结束的标志。return语句:语句:33o
26、k2.6 常用算法的应用实例常用算法的应用实例【例例2.202.20】中国中国古代数学史上著名的古代数学史上著名的“百鸡问题百鸡问题”【例例2.212.21】用欧基里德算法(也称辗转法)用欧基里德算法(也称辗转法) 求两个整数的最大公约数求两个整数的最大公约数【例例2.232.23】输入一个输入一个8 8位二进制数,将其转位二进制数,将其转换为十进制数输出。换为十进制数输出。【例例2.192.19】 用筛选法求用筛选法求100100之内的所有素数之内的所有素数【例例2.222.22】输入一个小于输入一个小于1 1的数的数x x,求,求sinxsinx的的近似值近似值34ok2.7 枚举类型枚举
27、类型 2.7.1 2.7.1 枚举类型的定义枚举类型的定义 2.7.2 2.7.2 枚举变量的使用枚举变量的使用 枚举类型枚举类型(enumerate)(enumerate)是是c+c+中的一种派生数据类中的一种派生数据类型,它是用户定义的若干枚举常量的集合。型,它是用户定义的若干枚举常量的集合。枚举类型的变量,只能取枚举常量表中所列的值。枚举类型的变量,只能取枚举常量表中所列的值。定义枚举类型的主要定义枚举类型的主要目的是增加程序的可读性目的是增加程序的可读性。 35ok2.7.1 枚举类型的定义枚举类型的定义 枚举类型定义:枚举类型定义:enum ;关键字关键字enum指明其后的标识符是一
28、个类型的名字,枚举常量指明其后的标识符是一个类型的名字,枚举常量表中列出该类型的所有取值,各枚举常量之间以表中列出该类型的所有取值,各枚举常量之间以“,”间隔。间隔。例:例: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_se
29、t2000,2001,2002,2003,2004,2005; /改为改为y2000等则正确等则正确36ok2.8 输入输出文件简介如果希望程序的运行结果能够永久保留下来,供随如果希望程序的运行结果能够永久保留下来,供随时查阅或取用,则需要将其保存在文件中。时查阅或取用,则需要将其保存在文件中。文件包括文本文件和二进制文件。本小节只讨论文文件包括文本文件和二进制文件。本小节只讨论文本文件的基本操作和简单应用。文本文件由字符本文件的基本操作和简单应用。文本文件由字符序列组成,也称序列组成,也称ASCII码文件,在文本文件中存码文件,在文本文件中存取的最小信息单位为字符(取的最小信息单位为字符(c
30、haracter)。)。两个概念:内部文件和外部文件。通常所谓的文件两个概念:内部文件和外部文件。通常所谓的文件是指磁盘文件,就是在是指磁盘文件,就是在“我的电脑我的电脑”的目录中见的目录中见到的文件,这里称为外部文件。而在程序中运行到的文件,这里称为外部文件。而在程序中运行的文件,称为内部文件(文件流对象)。程序中的文件,称为内部文件(文件流对象)。程序中操作的是内部文件,最后保存的是外部文件。操作的是内部文件,最后保存的是外部文件。37ok2.8 输入输出文件简介使用文件的步骤如下:使用文件的步骤如下:(1)说明一个文件流对象(内部文件)。说明一个文件流对象(内部文件)。文件流类型文件流类
31、型ifstream支持从输入文件提取数据的操作。支持从输入文件提取数据的操作。而文件流类型而文件流类型ofstream完成数据写入输出文件的各种操作。完成数据写入输出文件的各种操作。ifstream ifile; /定义输入文件,定义输入文件,ifile为文件名,可用任意标识符为文件名,可用任意标识符ofstream ofile; /定义输出文件,定义输出文件,ofile为文件名,可用任意标识符为文件名,可用任意标识符(2) 打开文件。打开文件。ifile.open(”d:my_in_file.txt”);ofile.open(”d:my_out_file.txt”);引号中的引号中的”d:m
32、y_in_file.txt” 和和”d:my_out_file.txt”为磁盘文件路径名,这样在为磁盘文件路径名,这样在文件流对象和磁盘文件名之间建立了联系。文件流对象和磁盘文件名之间建立了联系。38ok(3) 对文件进行读写操作。最常见的文件读写是顺序的,所对文件进行读写操作。最常见的文件读写是顺序的,所谓谓“顺序顺序”指的是从文件头开始进行读写。指的是从文件头开始进行读写。顺序读写可用顺序读写可用C+的提取运算符(的提取运算符()和插入运算符()和插入运算符()进行。也)进行。也可以用读字符的可以用读字符的get()和读字符串的和读字符串的getline()等函数。读写等函数。读写是在文件
33、缓冲区中进行。是在文件缓冲区中进行。(4) 关闭文件。当打开一个文件进行读写后,应该显式地关关闭文件。当打开一个文件进行读写后,应该显式地关闭该文件。与打开文件相对应:闭该文件。与打开文件相对应:ifile.close();ofile.close();关闭文件时,系统把与该文件相关联的文件缓冲区关闭文件时,系统把与该文件相关联的文件缓冲区中的数据写到磁盘文件中,保证文件的完整;同时把磁盘中的数据写到磁盘文件中,保证文件的完整;同时把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。了磁盘文件。【例例2.25】将百鸡问题计算结果存
34、入文件。将百鸡问题计算结果存入文件。【例例2.26】读出存放百鸡问题计算结果的文件。读出存放百鸡问题计算结果的文件。39ok if 语句语句【例例2 24 4】【例例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
35、year年不是闰年年不是闰年endl;return 0; ok40ok分析:读入三个数,先求出两个数中分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,较大者,再将该大数与第三个数比较,求出最大数。求出最大数。int main() int a, b, c, max; coutabc; couta=atb=b tc=c=b) max=a; else max=b; if(cmax) max=c; cout “最大数为最大数为:”maxendl; return 0;if 语句语句【例例2 25 5】 【例例2.5】 从键盘上输入三个整数,输出其中的最大数。从键盘上输入三个整数,输出其
36、中的最大数。ok41ok/方法方法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; /acelse max=c; /a=b且且bccout最大数最大数max=max; return 0; if 语句语句【例例2 26 6】【例例2.6】用嵌套用嵌套if语句完成语句完成【例例2.5】的任务。的任务。ok42ok/方法方法2:采用:采用else中嵌套形式中嵌套形式int main()int a,b,c,m
37、ax;coutabc;couta=atb=b tc=cb&ac) max=a;else if(ba&bc) max=b; else max=c;cout最大数为最大数为:max=max; return 0; if 语句语句【例例2 26 6】ok43ok【例例2.72.7】 某商场优惠活动规定,某种商品单某商场优惠活动规定,某种商品单价为价为8080元,一次购买元,一次购买5 5件以上件以上(包含5件)1010件以下件以下(不包含10件)打打9 9折,一次购买折,一次购买1010件以上件以上(包含10件)打打8 8折。设计程序根据客户的购买量计折。设计程序根据客户的购买量计 算
38、总价。算总价。算法算法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 if 语句语句【例例2 27 7】44okint main() float price,discount,amount;/单价单价,折扣折扣,总价总价 int count;/购买件数购买件数 cout
39、输入单价输入单价:price; cout输入购买件数输入购买件数:count; if(count5) discount=1; else if(count10) discount=0.9; else discount=0.8; amount=price*count*discount; cout 单价:单价:price endl; cout 购买件数:购买件数:count t折扣:折扣:“discountendl; cout总价:总价:amount0, 方程有两个不同实根;方程有两个不同实根;*若若delta0,方程无实根。,方程无实根。 if if 语句语句【例例2 28 8】46ok#incl
40、ude #include using namespace std;int main()float a,b,c;float delta,x1,x2;cout输入三个系数输入三个系数a(a!=0), b, c:abc;couta=atb=btc=cendl;delta=b*b-4*a*c;求一元二次方程的根源程序求一元二次方程的根源程序 if if 语句语句【例例2 28 8】47okif(delta=0) cout方程有两个相同实根方程有两个相同实根:;coutx1=x2=-b/(2*a)0) delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)
41、/(2*a);cout方程有两个不同实根方程有两个不同实根:;coutx1=x1tx2=“x2endl;else cout方程无实根方程无实根!endl; /delta0return 0;请在请在VC+VC+平台上运行,输入不同的系数,使程序所有分支都平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。可以被执行一次。 if if 语句语句【例例2 28 8】48ok不带不带breakbreak的开关语句实例的开关语句实例【例例2.9】 运输公司对所运货物实行运输公司对所运货物实行分段计费分段计费。设运。设运输里程为输里程为s,则运费打折情况如下:,则运费打折情况如下:s250 不打折
42、扣不打折扣250=s500 2%折扣折扣500=s1000 5%折扣折扣1000=s20008%折扣折扣2000=s300010%折扣折扣3000=s15%折扣折扣设每公里每吨的基本运费为设每公里每吨的基本运费为p,货物重量为,货物重量为w,总运,总运输里程在某段中的里程为输里程在某段中的里程为s,折扣为,折扣为d,则该段运,则该段运费为:费为:p*w*s*(1-d)设计程序,当输入设计程序,当输入p、w和和s后,计算运费后,计算运费f。49ok算法:算法:总费用为各段费用之和,可采用不加总费用为各段费用之和,可采用不加breakbreak的的switchswitch语句。语句。 分析:分析:
43、switchswitch语句要求条件表达式取值为确语句要求条件表达式取值为确定的若干个开关量,而不能使用关系表达定的若干个开关量,而不能使用关系表达式,用里程式,用里程s s进行判断似乎不符合条件。进行判断似乎不符合条件。但是分析发现,里程但是分析发现,里程s s的分段点均是的分段点均是250250的的倍数,因此,将里程倍数,因此,将里程s s除以除以250250,取整数商,取整数商c c,可得到若干整数值。因此算法描述如,可得到若干整数值。因此算法描述如下:下:ok不带不带breakbreak的开关语句实例的开关语句实例50okswitch(c) default: d=0.15;f+=p*w
44、*(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=500; case 1: d=0.02;f+=p*w*(s-250)*(1-d);s=250; case 0: d=0;f+=p*w*s*(1-d);3000=s 15%折扣折扣200
45、0=s3000 10%折扣折扣1000=s2000 8%折扣折扣500=s1000 5%折扣折扣250=s500 2%折扣折扣s250 不打折扣不打折扣不带不带breakbreak的开关语句实例的开关语句实例51okint main() int c,s,s1;double p,w,d,f; cout输入运输单价输入运输单价p,重量,重量w和里程和里程s:pws; f=0;s1=s; 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+
46、=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=500; 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里程里程:s1endl; cout折扣后运费折扣后运费:fendl; return 0;请在请在VC+平台上运行,输入
47、不同的里程。平台上运行,输入不同的里程。52ok【例例2.10】 设计一个计算器程序,实现加、减、乘、除运算。设计一个计算器程序,实现加、减、乘、除运算。分析:分析:读入两个操作数和运算符,根据运算符完成相应运算。读入两个操作数和运算符,根据运算符完成相应运算。#include using namespace std;int main( )float num1,num2;char op;cout输入操作数输入操作数1,运算符,操作数,运算符,操作数2:num1opnum2; switch(op) case +: coutnum1opnum2=num1+num2endl; break; case
48、 -: coutnum1opnum2=num1-num2endl; break; case *: coutnum1opnum2=num1*num2endl; break; case /: coutnum1opnum2=num1/num2endl; break; default : coutop是无效运算符是无效运算符!; return 0; 常量表达式采用字符型,上机运行一下。常量表达式采用字符型,上机运行一下。53ok while 语句语句【例例2.11】 【例例2.11】 求求1+2+3+4+100的值。的值。okN N个连续整数相加算法个连续整数相加算法1 1、设置变量、设置变量i i用
49、来放加数,变量用来放加数,变量sumsum用来放被加数与用来放被加数与和值和值, ,并初始化并初始化; ;2 2、从第一个数开始,依次将加数赋给、从第一个数开始,依次将加数赋给i i,并进行操,并进行操作作sumsumsum+isum+i,称为累加;,称为累加;3 3、输出、输出sumsum;细化算法细化算法2 2: whilewhile( (还有加数还有加数) ) i=i=当前加数;当前加数; sum+=i;sum+=i; i i准备接受下一个加数;准备接受下一个加数; 54ok源程序如下:源程序如下:#include using namespace std;const int n=100;
50、 /用常变量利于修改程序用常变量利于修改程序int main( ) int i=1,sum=0;/循环初始条件循环初始条件 while(i=n) sum+=i; i+;/修改循环条件修改循环条件 coutsum=sumendl; return 0; 在在VC+VC+平台上运行,试一试是否正确平台上运行,试一试是否正确ok55ok【例例2.12】 用迭代法求用迭代法求a的平方根近似值。的平方根近似值。求平方根的迭代公式为:求平方根的迭代公式为: 要求前后两个迭代根之差小于要求前后两个迭代根之差小于10- 5。 do-while 语句语句【例例2.12】 迭代法求解:迭代法求解:a是已知正数,是已
51、知正数,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=(x0+a/x0)/2; /求求xk+1时只需要知道时只需要知道xk的值,所以只需的值,所
52、以只需2个变量个变量4、取、取x1的值为的值为a的平方根近似值,输出。的平方根近似值,输出。2、3步骤很适合用步骤很适合用do/while语句实现:语句实现: x 1 = a/2; dox0=x1;x1=(x0+a/x0)/2; while(|x1 x0|=delta);和迭代法对应的程序算法是和迭代法对应的程序算法是递推算法:递推算法:57okint main( ) float x0,x1,a; couta; if(a0)couta不能开平方不能开平方!=1e-5); cout a的平方根为:的平方根为:x1endl; return 0;在在VC+VC+平台上运行,输入平台上运行,输入2 2
53、,3 3,4 4,5 5试一试是否正确试一试是否正确58ok【例例2.13】 输入一段文本,统计文本的行数、单输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。行符间隔,且文本开始没有空行。算法分析算法分析:1、逐个读入文本中的字符,直到读到一个输入结、逐个读入文本中的字符,直到读到一个输入结束符束符EOF为止。为止。2、如何算行数?行结束标志为读到字符、如何算行数?行结束标志为读到字符n;3、如何算单词数?设一个变量、如何算单词数?设一个变量isword,读到字符,读到字符 时时isword=1,
54、读到间隔符时,读到间隔符时isword=0;如果读到;如果读到一个字符而此时一个字符而此时isword值为值为0,则说明刚开始读一,则说明刚开始读一个单词;(如果读到一个间隔符而此时个单词;(如果读到一个间隔符而此时isword值值为为1,则说明刚读完一个单词;),则说明刚读完一个单词;)4、如何算字符数?剔除间隔符即所求的数量。、如何算字符数?剔除间隔符即所求的数量。 do-while 语句语句【例例2.13】ok59okdo-while 语句语句【例例2.13】算法:算法:1、设置变量、设置变量nline、nword、nch分别代表行数、分别代表行数、单词数、非分隔字符数,并初始化单词数、
55、非分隔字符数,并初始化;设置变量设置变量isword来辅助统计单词数来辅助统计单词数;2、do从键盘读入一个字符从键盘读入一个字符c;if ( c=n) nline+;if (是单词开头是单词开头) nword+; if (c不是分隔符不是分隔符) nch+; while (c!= EOF );3、输出统计结果。、输出统计结果。60okint main( ) int c; int nline=0, nword=0, nch=0, isword=0; cout输入一段文本(无空行):输入一段文本(无空行):endl; do c=cin.get(); if (c= n) nline+; /遇换行符
56、行数遇换行符行数+1 if (c!= &c!= t&c!=n) /读到非间隔符读到非间隔符 if(isword=0) nword+; /在单词的起始处给单词数在单词的起始处给单词数+1 nch+; /字符数加字符数加+1 isword=1; else isword=0;/读到间隔符读到间隔符 while(c!=EOF); cout”行数:行数:”nlineendl; cout”单词数:单词数:”nwordendl; cout”字符数:字符数:”ncharendl; return 0;61ok【例例2.14】 设计程序输出设计程序输出Fibonacii数列的前数列的前20项,项,
57、要求每行输出要求每行输出5个数据。个数据。Fibonacii数列定义如下:数列定义如下:1n 1)-fib(n2)-fib(n1n 1 0n 0 fib(n)算法分析:算法分析:除了第除了第0项和第项和第1项外,每一项都是项外,每一项都是由类似方法产生,即前两项之和;所以求当前由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项时,只需要记住前两项;程序不需要为每一项设置专用变量;项设置专用变量;属属递推算法递推算法。for 语句的应用语句的应用【例例2.142.14】62ok算法:算法:1、设置变量、设置变量n表示第几项,变量表示第几项,变量 f 1和和 f 2
58、用来记住用来记住当前项当前项f 3之前的两项之前的两项 ;变量初始化;变量初始化n=0;2、第、第0项项 f 1=0; 第第1项项 f 2=1; 输出第输出第0项和第项和第1项;项;while (当前项不到第(当前项不到第20项)项) 当前项等于前两项之和:当前项等于前两项之和:f 3=f 1+f 2; 按要求输出按要求输出当前项当前项 f 3 ; 修改最前两项:修改最前两项: f 1=f 2; f 2=f 3; for 语句的应用语句的应用【例例2.142.14】63ok程序如下:程序如下:/文件名:文件名:Ex2_14.cppint main() int fib0=0,fib1=1,fib
59、2,n;coutsetw(5)fib0setw(5)fib1 endl;for(n=3;n=20;n+)fib2=fib0+fib1;coutsetw(5)fib2;if(n%5=0) coutendl; /控制每行控制每行5个数据个数据fib0=fib1; fib1=fib2; return 0;for 语句的应用语句的应用【例例2.142.14】64ok【例例2.15】 输入一个不超过输入一个不超过9 9位的整数,将其反向位的整数,将其反向后输出。例如输入后输出。例如输入247247,变成,变成742742输出。输出。算法分析:算法分析:1、将整数的各个数位逐个分开,用一个数组保存、将整数
60、的各个数位逐个分开,用一个数组保存各位的值,然后反向组成新的整数。各位的值,然后反向组成新的整数。2、将整数各位数字分开的方法是,通过求余得到、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并个位数,然后将整数缩小十倍,再求余,并重复重复上述过程上述过程,分别得到十位、百位,分别得到十位、百位,直到直到整数整数的值变成的值变成0为止为止。 for 语句的应用语句的应用【例例2.15】 ok65ok数据处理:数据处理:1、设置变量、设置变量num表示输入的整数,整型数组表示输入的整数,整型数组digit9用来存用来存放放num 的各个位;变量的各个位;变量i用来表示数组的当前下标;用来表示数组的当前下标;算法:算法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 液压与液力技术在健身器材中的应用考核试卷
- 社交心理学在决策制定中的应用考核试卷
- 电池充放电特性与循环寿命考核试卷
- 纺织原料与绢纺质量控制考核试卷
- 渔业机械人机工程学应用考核试卷
- 纤维素纤维在鞋类产品抗滑性与耐磨性改进考核试卷
- 矿山机械故障案例分析与预防考核试卷
- 天津艺术职业学院《细胞与组织工程》2023-2024学年第二学期期末试卷
- 山东省泰安市第一中学2025年高中毕业班第二次统测物理试题含解析
- 山东省枣庄树人中学2024-2025学年初三化学试题5月模拟试题含解析
- 基于全生命周期的绿色建筑成本影响因素研究
- 2025年普法知识竞赛题库及答案(共80题)
- 碎石外包合同协议
- 心力衰竭护理查房 课件
- 【课时练基础作业】人教版四年级数学下册第四单元《期中计算能力测试》(含答案)
- 2025年第三届天扬杯建筑业财税知识竞赛题库附答案(1001-1536题)
- 2025科技辅导员培训
- 树木修剪合同协议
- 新疆维吾尔自治区2024年普通高校招生普通类国家及地方专项、南疆单列、对口援疆计划 本科一批次投档情况 (理工)
- 智研咨询发布:2025年纸浆模塑餐饮具行业市场规模及主要企业市占率分析报告
- 2025年CCAA《管理体系认证基础》考前必练题库500题(含真题、重点题)
评论
0/150
提交评论