C程序设计华中科技大学课件第二章.ppt_第1页
C程序设计华中科技大学课件第二章.ppt_第2页
C程序设计华中科技大学课件第二章.ppt_第3页
C程序设计华中科技大学课件第二章.ppt_第4页
C程序设计华中科技大学课件第二章.ppt_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

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

文档简介

C+程序设计,授课教师:李战izhanchunwh,第二章基本控制结构程序设计,结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。本章将介绍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.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算法描述的三种基本结构,(2)分支结构,【例22】输入三个数,输出其中的最大数。,x7;,y12;,z10;,if(xy)maxx;elsemaxy;,if(zmax)maxz;,输出max;,显示结果:12,演示算法执行过程,2.2.1if语句,if语句基本格式:1、if(表达式)语句1;2、if(表达式)语句1;else语句2;,【例2.4】输入一个年份,判断是否闰年。,【例2.5】从键盘上输入三个整数,输出其中的最大数。,2.2分支结构程序设计,if语句【例24】,【例24】输入一个年份,判断是否闰年。算法分析:假定年份为year,闰年的条件是:year%4=0,分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。intmain()inta,b,c,max;coutabc;cout=b)max=a;elsemax=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,对应的关系表达式为什么?,设有定义floata=3.2;intb=5;则:3ab/结果是?,其运算过程如下:,a,5,b,3.2,3,T,即1,T即1,逻辑运算符:,包括:!、floatx=1.8,y=2.4;,ay|ay)|(ac)max=a;/ab且acelsemax=c;/ab且ac)max=b;/acelsemax=c;/a=b且bccout最大数max=bc;cout=b,if语句【例26】,【例2.7】某商场购物优惠活动,【例2.8】求一元二次方程的根。,配对关系实例:,【例2.7】某商场优惠活动规定,某种商品单价为80元,一次购买5件以上(包含5件)10件以下(不包含10件)打9折,一次购买10件以上(包含10件)打8折。设计程序根据客户的购买量计算总价。,算法1、输入购买件数count,设置单价price=80(元)2、根据count值确定折扣率discount;3、实际售价amount=price*count*discount;4、输出amount的值。算法细化:2.1、if(count=5/单价,折扣,总价intcount;/购买件数coutprice;coutcount;if(count5)discount=1;elseif(count10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout单价:priceendl;cout购买件数:countt折扣:“discountendl;cout总价:amountbc;couta=atb=btc=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;elsecout方程无实根!endl;/delta=A,改写为条件表达式ch=(ch=A,把输入字符转换为小写字母。对输入字符进行判断,如果是大写字母,则转换为小写字母;否则,不转换。,2.2.4switch语句,开关语句(switch语句)用来实现多选一:switch(表达式)case常量表达式:语句序列break;case常量表达式n:语句序列nbreak;default:语句序列,条件表达式,整型字符型布尔型枚举型,取值为常量的表达式,switch(表达式)case常量表达式1:语句1case常量表达式2:语句2case常量表达式n:语句ndefault:语句n+1,注:表达式类型为非浮点型各常量表达式类型要与之匹配各常量表达式要求各不相等,语句标号,2.2.4switch语句,根据一个整型表达式的值决定程序分支,执行流程,2.2.4switch语句,#includeusingnamespacestd;intmain()chargrade;coutgrade;switch(grade)casea:cout85_100n;caseb:cout70_84n;casec:cout60_69n;cased:cout60n;default:coutgrade;switch(grade)casea:cout85_100n;caseb:cout70_84n;casec:cout60_69n;cased:cout60n;default:coutgrade;switch(grade)casea:cout85_100n;caseb:cout70_84n;casec:cout60_69n;cased:cout60n;default:coutgrade;switch(grade)casea:cout85_100n;caseb:cout70_84n;casec:cout60_69n;cased:cout60n;default:coutgrade;switch(grade)casea:cout85_100n;break;caseb:cout70_84n;break;casec:cout60_69n;break;cased:cout60n;break;default:coutgrade;switch(grade)casea:cout85_100n;break;caseb:cout70_84n;break;casec:cout60_69n;break;cased:cout60n;break;default:coutgrade;switch(grade)casea:caseA:cout85_100n;break;caseb:caseB:cout70_84n;break;casec:caseC:cout60_69n;break;cased:caseD:cout60n;break;default:coutopnum2;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.3.1while语句,2.3.4循环的嵌套,2.3.3for语句,2.3.2do-while语句,2.3循环结构程序设计,注意:1)循环开始前对循环条件进行初始化;2)在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。,2.3.1while语句,while语句也称为当循环,语句格式为:while(表达式)循环体语句;,2.3.2do-while语句,do-while语句称为直到循环,格式为:do循环体语句;while(表达式);,2.3.3for语句,for循环语句的格式for(表达式1;表达式2;表达式3)循环体语句;,关键字,初始表达式,循环控制逻辑表达式,循环后置表达式,for语句、while语句、do/while语句比较:,inti=1,sum=0;/循环初始条件while(i=4)sum+=i;i+;/修改循环条件,inti=1,sum=0;/循环初始条件dosum+=i;i+;/修改循环条件while(i=4);,inti,sum=0;for(i=1;i=4;i+)sum+=i;/*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/,#includeusingnamespacestd;intmain()inti=1,sum=0;while(i=100)sum=sum+i;i+;coutsum=sumendl;return0;,想一想:循环条件是什么?循环结束条件是什么?哪一个语句修改循环条件?,一个简单的循环跟踪:求,while语句,例如,用for语句的求和式的程序,#includeusingnamespacestd;intmain()inti,sum=0;for(i=1;i=100;i+)sum+=i;coutsum=sumendl;return0;,#includeusingnamespacestd;intmain()inti=1,sum=0;while(i=100)sum=sum+i;i+;coutsum=sumendl;return0;,for循环语句,【例2.14】运行结果:01123581321345589144233377610987159725844181,【例2.14】设计程序输出Fibonacii数列的前20项,要求每行输出5个数据。,2.3.3for语句,Fibonacii数列定义如下:,算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;属递推算法。,For循环语句,1.7数组与字符数组,数组定义:数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置区分,位置用下标表示。数组下标的个数称作维数。,intm5;/定义数组m,其中有5个整数,floatx3;/数组x中有3个实数,一维数组,一维数组的定义格式:存储类型数据类型数组名常量;,一维数组初始化,#includeusingnamespacestd;intmain()intint_arr4;int_arr0=1;int_arr1=1;int_arr2=2;int_arr3=int_arr1+int_arr2;coutint_arr3n;return0;,【例1.2】使用数组的简单例子,Fibonacii数列定义如下:,For循环语句,(1)定义数组(2)使用数组元素循环求解,程序如下:intmain()intfib20=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)sinx=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;return0;,For循环语句,2.3.4循环的嵌套,嵌套循环:当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。嵌套层次一般不超过3层,以保证可读性。,【例2.16】打印九九表。打印格式为:*123456789112243369991827364554637281,2.3.4循环的嵌套,算法:1、输出表头,用一个循环语句即可;2、输出表体:for(i=1;i10;i+)couti;/输出行号输出第i行数据;/Acoutendl;/准备输出下一行3、A行细化:for(j=1;j=i;j+)coutsetw(4)i*j;,2.3.4循环的嵌套,intmain()inti,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)coutm是素数endl;/循环提前终止表示是非素数elsecoutm不是素数endl;return0;,break2、100之内的所有素数?方法:一个个试;综上所述,得到一个循环嵌套的算法: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/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】,实际上,当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#includeusingnamespacestd;intmain()inti,j,k;cout公鸡母鸡小鸡endl;for(i=0;inum1num2;coutnum1和num2的最大公约数为:;doresd=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-)coutbini;cout)的值为:decendl;return0;,2.7枚举类型,2.7.1枚举类型的定义,2.7.2枚举变量的使用,枚举类型(enumerate)是c+中的一种派生数据类型,它是用户定义的若干枚举常量的集合。枚举类型的变量,只能取枚举常量表中所列的值。定义枚举类型的主要目的是增加程序的可读性。,2.7.1枚举类型的定义,枚举类型定义:enum;关键字enum指明其后的标识符是一个类型的名字,枚举常量表中列出该类型的所有取值,各枚举常量之间以“,”间隔。例:enumcolor_set1RED,BLUE,WHITE,BLACK;enumweekSun,Mon,Tue,Wed,Thu,Fri,Sat;枚举常量(或称枚举成员)是以标识符形式表示的整型量,非法定义实例:enumletter_seta,d,F,s,T;/枚举常量只能是标识符enumyear_set2000,2001,2002,2003,2004,2005;/改为y2000等则正确,2.7.1枚举类型的定义,枚举常量:枚举常量代表该枚举类型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从0开始。如上例中RED、BLUE、WHITE、BLACK的值分别为0、1、2、3。用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加1的原则取值。各枚举常量的值可以重复,但各枚举常量标识符必须不同。例:enumfruit_setapple,orange,banana=1,peach,grapeenumweekSun=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、2、3、4、5、6。,2.7.1枚举类型的定义,枚举型变量定义:定义枚举类型之后,就可以定义枚举类型的变量;亦可类型与变量同时定义(甚至类型名可省):color_set1color1,color2;enumSun,Mon,Tue,Wed,Thu,Fri,Satweekday1,weekday2;枚举变量的取值范围就是整型数的一个子集。枚举变量占用内存的大小与整型数相同。,2.7.2枚举类型的变量的使用,枚举类型应用要点:1、赋值包括将枚举常量值赋给枚举变量和两个同类型变量之间赋值。不能直接将整型量赋给枚举变量,两个不同类型的枚举变量之间也不能相互赋值。例如:enumcolor_set2GREEN,RED,YELLOW,WHITE;color_set2color3,color4;color3=RED;/合法color4=color3;/合法,color4的值为REDcolor1=1;/非法,不能直接将整性常量赋给枚举变量color2=color3;/非法,color2类型是color_set1,/color3类型是color_set2,不能相互赋值,2.7.2枚举类型的变量的使用,枚举类型应用要点:2、由于枚举常量本身是一个整数值,因此也允许将一个枚举量赋给整型变量。但不允许将一个整型变量赋给枚举量,即使整型变量取值合适,也必须将整型变量强制转换为枚举型。例如:inti,j;i=color3;/合法,i的值为1j=GREEN;/合法,j的值为0color3=i;/非法3、关系运算可以是同一枚举类型的两个枚举变量之间或一个枚举变量和一个枚举常量之间,用它们所取的值(序号)比较。例如:if(color3=color4)cout”相等”;if(color3!=WHITE)coutcolor1/非法cout)和插入运算符()进行。也可以用读字符的get()和读字符串的getling()等函数。读写是在文件缓冲区中进行。(4)关闭文件。当打开一个文件进行读写后,应该显式地关闭该文件。与打开文件相对应:ifile.close();ofile.close();关闭文件时,系统把与该文件相关联的文件缓冲区中的数据写到磁盘文件中,保证文件的完整;同时把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。,【例2.25】将百鸡问题计算结果存入文件。,【例2.26】读出存放百鸡问题计算结果的文件。,*【例2.24】口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。分析:每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色。假设所取三个球的颜色分别为i,j,k,每个量都有5种取值,其中ijk就是满足要求的取法,因此用枚举算法(穷举法)可以解决。,2.7.2枚举类型的变量的使用*【例2.24】,算法:1、定义枚举类型及相应变量;enumcolorred,yellow,blue,white,black;colori,j,k,col;2、for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)/前两个

温馨提示

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

评论

0/150

提交评论