




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+程序设计,授课教师:李战春lizhanchunwh,第二章 基本控制结构程序设计,结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。 本章将介绍C+分支结构和循环结构的设计方法。 教学目标:编写选择和循环结构的程序 考核方式: 要求基本: (1)独立编写并运行2.2、2.3 (2)独立编写并运行2.8、2.9、2.10、2.7、2.12 较高要求: 独立编写并运行2.5、2.6、2.13、2.15、2.16,利用海伦公式计算三角形面积,输入a=3,b=4,c=5后,结果是多少?,输入a=1,b=1,c=3呢?,为什么?怎么办?,2.1 算法的概念与表
2、示方法,2.1.1 算 法 的 概 念,2.1.3 算 法描述的三种基本结构,2.1.2 算 法 的 表 示,2.1.1 算 法 的 概 念,2.1.3算法描述的三种基本结构,3 循 环 结 构,1 顺 序 结 构,2 分 支 结 构,算法的基本结构: 对算法的理论研究和实践表明,任何算法的描述都可以分解为三种基本结构或它们的组合,这三种基本结构是顺序结构、分支结构和循环结构。,num115;,2.1.3算法描述的三种基本结构,(1) 顺序结构,【例21】 求两数之和。,显示结果:35,num220;,sumnum1+num2;,演示算法执行过程,输出sum;,活动图,2.1.3算法描述的三种
3、基本结构,(2) 分支结构,【例22】 输入三个数,输出其中的最大数。,x7;,y12;,z10;,if(xy) maxx; else max y;,if (zmax) maxz;,输出max;,显示结果:12,演示算法执行过程,2.2.1 if 语句,if语句基本格式: 1、if (表达式) 语句1; 2、if (表达式) 语句1; else 语句2;,【例2.4】 输入一个年份,判断是否闰年。,【例2.5】 从键盘上输入三个整数,输出其中的最大数。,2.2 分支结构程序设计,if 语句【例24】,【例24】 输入一个年份,判断是否闰年。 算法分析:假定年份为year, 闰年的条件是 : y
4、ear%4=0 ,分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。 int main() int a, b, c, max; coutabc; cout=b) max=a; else max=b; if(cmax) max=c; cout “最大数为:”max(c+d) */ y=ab /*计算ab的值0或1赋给y*/ abc /*等同于(ab)c,先求ab 的值, 再将结果0或1与c比较大小*/,由关系运算符连接的表达式。是一种简单的逻辑表达式。值为true或false。,数学式abc ,对应的关系表达式为什么?,设有定义 float a=3.2;int b=5
5、;则: 3ab /结果是?,其运算 过程如下:,a,5,b,3.2,3,T, 即1,T即1,逻辑运算符:,包括:!、float x=1.8, y=2.4;,ay|ay)|(ac) max=a; /ab且ac else max=c; /ab且ac) max=b; /ac else max=c; /a=b且bc cout最大数max=bc; cout=b ,if 语句【例26】,【例2.7】 某商场购物优惠活动,【例2.8】 求一元二次方程的根。,配对关系实例:,【例2.7】 某商场优惠活动规定,某种商品单 价为80元,一次购买5件以上(包含5件)10件以下(不包含10件)打9折,一次购买10件以
6、上(包含10件)打8折。设计程序根据客户的购买量计 算总价。,算法 1、输入购买件数count,设置单价price=80(元) 2、根据count值确定折扣率discount; 3、实际售价amount=price*count*discount; 4、输出amount的值。 算法细化: 2.1、if(count=5/单价,折扣,总价 int count; /购买件数 coutprice; coutcount; if(count5) discount=1; else if(count10) discount=0.9; else discount=0.8; amount=price*count*d
7、iscount; cout 单价:price endl; cout 购买件数:count t折扣:“ discountendl; cout总价:amountbc; couta=atb=bt c=cendl; delta=b*b-4*a*c;,if 语句【例28】,if(delta=0) cout0) delta=sqrt(delta); x1=(-b+delta)/(2*a); x2=(-b-delta)/(2*a); cout方程有两个不同实根:; coutx1=x1tx2=“ x2endl; else cout方程无实根!endl; /delta= A ,改写为条件表达式 ch = ( c
8、h = A ,把输入字符转换为小写字母。对输入字符进行判断,如果是大写字母,则转换为小写字母;否则,不转换。,2.2.4 switch语句,开关语句(switch语句) 用来实现多选一: switch (表达式) case 常量表达式: 语句序列break; case 常量表达式n:语句序列nbreak; default:语句序列 ,条件表达式,整型 字符型 布尔型 枚举型,取值为常量的表达式,switch ( 表达式 ) case 常量表达式 1 : 语句 1 case 常量表达式 2 : 语句 2 case 常量表达式 n : 语句 n default : 语句 n+1 ,注: 表达式类型
9、为非浮点型 各常量表达式类型要与之匹配 各常量表达式要求各不相等,语句标号,2.2.4 switch语句,根据一个整型表达式的值决定程序分支,执行流程,2.2.4 switch语句,# include using namespace std; int main () char grade ; cout grade ; switch ( grade ) case a : cout 85_100 n ; case b : cout 70_84 n ; case c : cout 60_69 n ; case d : cout 60 n ; default : cout grade ; switch
10、 ( grade ) case a : cout 85_100 n ; case b : cout 70_84 n ; case c : cout 60_69 n ; case d : cout 60 n ; default : cout grade ; switch ( grade ) case a : cout 85_100 n ; case b : cout 70_84 n ; case c : cout 60_69 n ; case d : cout 60 n ; default : cout grade ; switch ( grade ) case a : cout 85_100
11、n ; case b : cout 70_84 n ; case c : cout 60_69 n ; case d : cout 60 n ; default : cout grade ; switch ( grade ) case a : cout 85_100 n ; break; case b : cout 70_84 n ; break; case c : cout 60_69 n ;break; case d : cout 60 n ; break; default : cout grade ; switch ( grade ) case a : cout 85_100 n ; b
12、reak; case b : cout 70_84 n ; break; case c : cout 60_69 n ;break; case d : cout 60 n ; break; default : cout grade ; switch ( grade ) case a : case A : cout 85_100 n ; break ; case b : case B : cout 70_84 n ; break ; case c : case C : cout 60_69 n ; break ; case d : case D : cout 60 n ;break ; defa
13、ult : cout opnum2; switch(op) case +: coutnum1opnum2=num1+num2endl; break; case -: coutnum1opnum2=num1-num2endl; break; case *: coutnum1opnum2=num1*num2endl; break; case /: coutnum1opnum2=num1/num2endl; break; default : coutop0) x输入一个整数; sumsum+x; countcount-1; 输出sum;,循环控制语句是基本流程控制语句之一。C+提供三种循环语句:,2
14、.3.1 while语句,2.3.4 循环的嵌套,2.3.3 for语句,2.3.2 do-while 语句,2.3 循环结构程序设计,注意: 1)循环开始前对循环条件进行初始化; 2)在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。,2.3.1 while语句,while语句也称为当循环,语句格式为: while (表达式) 循环体语句; ,2.3.2 do-while 语句,do-while语句称为直到循环,格式为: do 循环体语句 ; while(表达式);,2.3.3 for 语句,for循环语句的格式 for ( 表达式1;表达式2; 表达式3 ) 循环体语
15、句 ;,关键字,初始表达式,循环控制 逻辑表达式,循环后置表达式,for语句、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:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/,# include using namespace std; int main ()
16、 int i = 1 , sum = 0 ; while ( i = 100 ) sum = sum + i ; i + ; cout sum = sum endl ; return 0; ,想一想: 循环条件是什么? 循环结束条件是什么? 哪一个语句修改循环条件?,一个简单的循环跟踪: 求,while语句,例如,用 for 语句的求和式 的程序,# include using namespace std; int main () int i , sum = 0 ; for ( i =1 ; i = 100 ; i + ) sum + = i ; cout sum = sum endl ; r
17、eturn 0; ,# include using namespace std; int main () int i = 1 , sum = 0 ; while ( i = 100 ) sum = sum + i ; i + ; cout sum = sum endl ; return 0; ,for循环语句,【例2.14】运行结果: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181,【例2.14】 设计程序输出Fibonacii数列的前20项,要求每行输出5个数据。,2.3.3 for 语句,Fibonacii数列
18、定义如下:,算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量; 属递推算法。,For循环语句,1.7 数组与字符数组,数组定义: 数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置区分,位置用下标表示。数组下标的个数称作维数。,int m5; /定义数组m, 其中有5个整数,float x3; /数组x中有3个实数,一维数组,一维数组的定义格式: 存储类型 数据类型 数组名常量;,一维数组初始化,# include using namespace std; int mai
19、n() int int_arr4; int_arr0=1; int_arr1=1; int_arr2=2; int_arr3=int_arr1+int_arr2; coutint_arr3n; return 0; ,【例1.2】使用数组的简单例子,Fibonacii数列定义如下:,For循环语句,(1)定义数组 (2)使用数组元素循环求解,程序如下: int main() int fib20=0,1,n; for(n=2;n20;n+) fibn=fibn-2+fibn-1; for(n=0;n20;n+) coutsetw(5)fibn; if(n%5=4) coutepsilon) sin
20、x=sinx+item*sign; /将当前项累加进结果,注意符号作为因子 item=item*x*x/(2*n)*(2*n+1); /推算新的误差项 sign=-sign; /注意符号的变换 n+; coutsin(x)=sinxnum; cout0) digitsubscript=num%10; num=num/10; subscript+; /修改下标 for(i=0;isubscript;i+) /整数的反向组合 num=num*10+digiti; cout反向后整数为:numendl; return 0;,For循环语句,2.3.4 循环的嵌套,嵌套循环: 当循环语句中的循环体中又
21、有循环语句时,就构成了嵌套循环。 嵌套层次一般不超过3层,以保证可读性。,【例2.16】 打印九九表。打印格式为: * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 9 9 18 27 36 45 54 63 72 81,2.3.4 循环的嵌套,算法: 1、输出表头,用一个循环语句即可; 2、输出表体: for (i=1; i10; i+) couti; /输出行号 输出第i行数据; /A coutendl; /准备输出下一行 3、A行细化: for (j=1; j=i; j+) coutsetw(4)i*j;,2.3.4 循环的嵌套,int main() int i
22、,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; /输出表中数据(乘积) coutm; if(m=2) coutk) cout m是素数endl; /循环提前终止表示是非素数 else cout m不是素数endl; return 0;,break 2、100之内的所有素数?方法:一个个试; 综上所述,得到一个循环嵌套的算法:
23、 for(m=2;m=100;m+)/穷举法 if(m是素数)按要求的格式输出m;,k= sqrt(m); for(i=2;ik) m是素数; /刚才的for不是由break结束的,2. 枚举法枚举法也称穷举法,基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。枚举法适合求解的问题是:可能的答案是有限个且答案是可知的,但又难以用解析法描述。这种算法通常用循环结构来完成。 【例2.20】 中国古代数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何? 分析:设鸡翁、母、雏分别为i,j,k,根据题意可得: i*5+j*3+k/
24、3=100; i+j+k=100; 两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应用。 i、j、k可能的取值有哪些?分析可知,百钱最多可买鸡翁20,鸡母33,鸡雏300。,算法: for (i=0; i=20;i+) for (j=0; j=33;j+) for (k=0; k=300;k+) if (i+j+k=100) 这个算法使用三重循环,执行时间函数是立方阶,循环体将执行20*33*300=198000次。 我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间。,2.6 常用算法的应用实例【例2.20】
25、,实际上,当i、j确定时,k就可由题目要求确定为100-i-j,因此实际上只要用i、j去测试,用钱数检测就可以了。循环体将执行: 20*33=660次。 算法改进为: for (i=0; i+=20;) for (j=0; j+=33;) if ( 5*i+3*j+(100-i-j)/3=100 ) coutijk;,2.6 常用算法的应用实例【例2.20】,#include #include using namespace std; int main() int i,j,k; cout 公鸡 母鸡 小鸡endl; for(i=0;inum1num2; coutnum1和num2的最大公约数为
26、:; do resd=num1%num2; if(resd=0) break; num1=num2; num2=resd; while(resd!=0) coutnum2epsilon) sinx=sinx+item*sign; /将当前项累加进结果,注意符号作为因子 item=item*x*x/(2*n)*(2*n+1); /推算新的误差项 sign=-sign; /注意符号的变换 n+; coutsin(x)=sinxbini;/先输入的是高位 dec=0; for(i=n-1;i=0;i-) a=bini-0; /数字字符转换为数字 dec= dec*x+a; cout=0;i-) co
27、utbini; cout)的值为:decendl; return 0;,2.7 枚举类型,2.7.1 枚举类型的定义,2.7.2 枚举变量的使用,枚举类型(enumerate)是c+中的一种派生数据类型,它是用户定义的若干枚举常量的集合。 枚举类型的变量,只能取枚举常量表中所列的值。 定义枚举类型的主要目的是增加程序的可读性。,2.7.1 枚举类型的定义,枚举类型定义: enum ; 关键字enum指明其后的标识符是一个类型的名字,枚举常量表中列出该类型的所有取值,各枚举常量之间以“,”间隔。 例: enum color_set1 RED, BLUE, WHITE, BLACK; enum w
28、eek Sun, Mon, Tue, Wed, Thu, Fri, Sat; 枚举常量(或称枚举成员)是以标识符形式表示的整型量,非法定义实例: enum letter_set a, d, F, s, T; /枚举常量只能是标识符 enum year_set2000,2001,2002,2003,2004,2005; /改为y2000等则正确,2.7.1 枚举类型的定义,枚举常量: 枚举常量代表该枚举类型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从0开始。如上例中RED、 BLUE、 WHITE、 BLACK的值分别为0、1、2、3。
29、 用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加1的原则取值。各枚举常量的值可以重复,但各枚举常量标识符必须不同。 例: enum fruit_set apple, orange, banana=1, peach, grape enum week Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat; 枚举常量apple、orange、banana、peach、grape的值分别为0、1、1、2、3。枚举常量Sun, Mon, Tue, Wed, Thu, Fri, Sat的值分别为7、1
30、、2、3、4、5、6。,2.7.1 枚举类型的定义,枚举型变量定义: 定义枚举类型之后,就可以定义枚举类型的变量;亦可类型与变量同时定义(甚至类型名可省):color_set1 color1, color2; enum Sun, Mon, Tue, Wed, Thu, Fri, Sat weekday1, weekday2; 枚举变量的取值范围就是整型数的一个子集。枚举变量占用内存的大小与整型数相同。,2.7.2 枚举类型的变量的使用,枚举类型应用要点: 1、赋值包括将枚举常量值赋给枚举变量和两个同类型变量之间赋值。不能直接将整型量赋给枚举变量,两个不同类型的枚举变量之间也不能相互赋值。例如:
31、 enum color_set2 GREEN, RED, YELLOW, WHITE; color_set2 color3, color4; color3=RED; /合法 color4=color3; /合法,color4的值为RED color1=1; /非法,不能直接将整性常量赋给枚举变量 color2=color3; /非法,color2类型是color_set1, /color3类型是color_set2 ,不能相互赋值,2.7.2 枚举类型的变量的使用,枚举类型应用要点: 2、由于枚举常量本身是一个整数值,因此也允许将一个枚举量赋给整型变量。但不允许将一个整型变量赋给枚举量,即使整
32、型变量取值合适,也必须将整型变量强制转换为枚举型 。例如: int i, j; i=color3; /合法,i的值为1 j=GREEN; /合法,j的值为0 color3= i; /非法 3、关系运算可以是同一枚举类型的两个枚举变量之间或一个枚举变量和一个枚举常量之间,用它们所取的值(序号)比较。例如: if (color3=color4) cout”相等”; if (color3!=WHITE) coutcolor1 /非法 cout)和插入运算符()进行。也可以用读字符的get()和读字符串的getling()等函数。读写是在文件缓冲区中进行。 (4) 关闭文件。当打开一个文件进行读写后,
33、应该显式地关闭该文件。与打开文件相对应: ifile.close(); ofile.close(); 关闭文件时,系统把与该文件相关联的文件缓冲区中的数据写到磁盘文件中,保证文件的完整;同时把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。,【例2.25】将百鸡问题计算结果存入文件。,【例2.26】读出存放百鸡问题计算结果的文件。,*【例2.24】 口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。 分析: 每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色。 假设所取三个球的颜色分别为i, j, k, 每个量都有5种取值,其中ijk就是满足要求的取法,因此用枚举算法(穷举法)可以解决。,2.7.2 枚举类型的变量的使用*【例2.24】,算法: 1、定义枚举类型及相应变量; enum color red,yellow,blue,white,black; color i,j,k,col; 2、 for(i=red;i=black;i+) for(j=red;j=bla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- JB-KR-TC5306可燃气体报警控制器安装使用说明书-天成消防
- 陕西省咸阳市2024-2025学年高二下学期期末质量检测政治试卷(含解析)
- 工程项目管理中回归分析应用导则
- 部编版三年级语文上册第三单元新趋势题提优训练(B)单元试卷(含解析)
- 2024-2025学年广东省深圳市光明区北师大版四年级下册期末考试数学试卷(含答案)
- 文言文阅读之断句(讲义)解析版-2026年中考语文一轮复习之古诗文
- 危险化学品经营单位安全管理人员考试题及答案
- 四川省泸州市2025年中考英语试题
- 天津市滨海新区塘沽某中学2024-2025学年高一年级上册第一次月考 化学试卷 (解析版)
- 外研版七年级英语下册Unit 4 The art of having fun书面表达(含解析)
- GB/T 41375-2022农村文化活动中心建设与服务规范
- GB/T 2828.3-2008计数抽样检验程序第3部分:跳批抽样程序
- GB 29518-2013柴油发动机氮氧化物还原剂尿素水溶液(AUS 32)
- 第三单元名著导读《儒林外史之严贡生、严监生》课件-部编版语文九年级下册
- 赣价协〔2023〕9号江西省建设工程造价咨询服务收费基准价
- 2022年郑州城市职业学院辅导员招聘考试笔试试题及答案解析
- 订单(英文范本)Purchase Order
- 鲁班奖工程复查参考表格
- Q∕SY 17375-2016 钻井液用固体润滑剂石墨类
- 契税补贴申请表
- 厦门市城市绿地养护管理标准(暂行)
评论
0/150
提交评论