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

下载本文档

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

文档简介

C+程序设计,授课教师:李战春,第二章 基本控制结构程序设计,结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。 本章将介绍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; 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, 闰年的条件是 : year%4=0 ,分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。 int main() int a, b, c, max; coutabc; cout=b) max=a; else max=b; if(cmax) max=c; cout “最大数为:”maxendl; return 0; ,if 语句【例25】,【例2.5】 从键盘上输入三个整数,输出其中的最大数。,逻辑运算、逻辑表达式,逻辑运算: 用于判断分析,运算符包括关系和逻辑运算符。 关系运算符: 包括:(大于)、(大于等于)、(小于)、(小于等于);= =(等于)和!=(不等于) 。关系运算符完成两个操作数大小的比较,结果为逻辑值true(真)或false(假)。,逻辑值与整数的对应关系是什么?,逻辑值能参与运算吗?,关系表达式:,例如: a+bc+d /*等同于(a+b)(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;则: 3ab /结果是?,其运算 过程如下:,a,5,b,3.2,3,T, 即1,T即1,逻辑运算符:,包括:!、&和|,语义见下表。,由逻辑运算符连接的表达式,其操作数和运算结果均为逻辑量。操作数可以是表达式,只要其值是逻辑量,如关系表达式。,由于逻辑值和整数之间的对应关系,也允许整型和字符型操作数进行逻辑运算: 21&0 /逻辑与,21与0,结果? 21|0 /逻辑或,21或0,结果? !21 /逻辑非,21的非,结果? 运算结果同样可以作为一个整数参与其他运算。,逻辑表达式:,逻辑表达式计算时,逻辑非优先级最高,关系运算其次,逻辑与和逻辑或最低。,已知: int a=10, b=20, c=30;float x=1.8, y=2.4;,ay|ay)|(a(b-(!c),t1=1,t2=0,t4=0,-,&,t3=0,t5=b,t6=1,|,得整个表达式的值为:,1,嵌套if语句: if 语句中,如果内嵌语句又是if语句。 嵌套有两种形式,2.2.2 if 语句的嵌套,【例2.6】用嵌套if语句完成【例2.5】的任务。,/方法1:采用if中嵌套形式 int main() int a, b, c, max; coutabc; coutb) if(ac) max=a; /ab且ac else max=c; /ab且ac) max=b; /ac else max=c; /a=b且bc cout“最大数max=“max; return 0; ,if 语句【例26】,【例2.6】用嵌套if语句完成【例2.5】的任务。,/方法2:采用else中嵌套形式 int main() int a,b,c,max; coutabc; 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&count=10)discount=0.8;,if 语句【例27】,int main() float price,discount,amount;/单价,折扣,总价 int count; /购买件数 coutprice; coutcount; 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“总价:“amountendl; return 0;,if 语句【例27】,【例2.8】 求一元二次方程 ax2+bx+c=0 的根。 其中系数a(a0)、b、c的值由键盘输入。 分析:输入系数a(a0)、b、c后,令delta= b24ac,结果有三种情况: *若delta=0, 方程有两个相同实根; *若delta0, 方程有两个不同实根; *若delta0,方程无实根。,if 语句【例28】,#include #include using namespace std; int main() float a,b,c; float delta,x1,x2; coutabc; cout“a=“at“b=“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“方程有两个不同实根:“; cout“x1=“x1t“x2=“ x2endl; else cout“方程无实根!“endl; /delta0 return 0;,if 语句【例28】,2.2.3 条件运算符“?:”,三元运算符条件运算符“?:”可以用来简化if语句表达。其构成的表达式格式为: 表达式1 ? 表达式2 : 表达式3 例如:int a=6,b=7; min=ab?a:b; /min=6,#include using namespace std; int main() char ch; cout ch ; if ( ch = A ,改写为条件表达式 ch = ( ch = 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 ,注: 表达式类型为非浮点型 各常量表达式类型要与之匹配 各常量表达式要求各不相等,语句标号,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 “ error n “ ; return 0; ,观察不同输入时的输出结果,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 “ error n “ ; return 0; ,2.1.2 switch 语句,例题 根据考试成绩的等级打印出百分制分数段。,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 “ error n “ ; return 0; ,2.1.2 switch 语句,例题 根据考试成绩的等级打印出百分制分数段。,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 “ error n “ ; return 0; ,switch语句,# include int main () char grade ; 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 “ error n “ ; return 0; ,跳出switch语句,switch语句,例题 根据考试成绩的等级打印出百分制分数段。,例题 根据考试成绩的等级打印出百分制分数段。,# include int main () char grade ; 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 “ error n “ ; return 0; ,switch语句,讨论: 1)csae 和 default 仅起语句标号作用,不能控制程序流程 2)一旦选中一个case分支后,将继续往下顺序执行语句序列 3)添加 break 语句可以跳出 switch 语句体,达到控制流程作用,根据以上特点,可以写出多个 case 共执行一个语句的形式,2.1.2 switch 语句,2.2.4 switch语句,例 根据考试成绩的等级打印出百分制分数, 允许输入大写或小写字母。,# include int main () char grade ; 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 ; default : cout “ error n “ ; retrun 0; ,a 或 A 共同执行一个语句,switch语句,if 语句 switch 语句 形成分支控制流程 不形成程序控制流程 用于复杂条件判断 表达式的值为数值集合时作多分支 控制,可读性较好,与 if 语句比较:,2.2.4 switch语句,【例2.10】 设计一个计算器程序,实现加、减、乘、除运算。 分析:读入两个操作数和运算符,根据运算符完成相应运算。 #include using namespace std; int main( ) float num1,num2; char op; coutnum1opnum2; 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;,循环结构,【例23】求4个整数的和。,显示结果:60,演示算法执行过程,12,3,14,26,2,16,42,1,18,60,0,count4; /整数个数 sum0; /累加和的初值 while (count0) x输入一个整数; sumsum+x; countcount-1; 输出sum;,循环控制语句是基本流程控制语句之一。C+提供三种循环语句:,2.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 ) 循环体语句 ;,关键字,初始表达式,循环控制 逻辑表达式,循环后置表达式,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 () 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 ; return 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数列定义如下:,算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量; 属递推算法。,For循环语句,1.7 数组与字符数组,数组定义: 数组是有限个同类型元素的有序集合,这些元素有一个共同的名字,每个元素以其在数组中的位置区分,位置用下标表示。数组下标的个数称作维数。,int m5; /定义数组m, 其中有5个整数,float x3; /数组x中有3个实数,一维数组,一维数组的定义格式: 存储类型 数据类型 数组名常量;,一维数组初始化,# include using namespace std; int main() 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) coutendl; return 0; ,For循环语句,【例2.22】 输入一个小于1的数x,求sinx的近似值,要求误差小于0.0001。近似计算公式如下:,应用实例,itemitem*x*x/(2*n)*(2*n+1),int main() const double epsilon=0.0001; /用epsilon保存误差 double x,sinx,item; int n=2,sign=-1; /sign保存符号 coutx; sinx=x;item=x*x*x/6; /第一项作为初值,第二项为误差项 while(itemepsilon) sinx=sinx+item*sign; /将当前项累加进结果,注意符号作为因子 item=item*x*x/(2*n)*(2*n+1); /推算新的误差项 sign=-sign; /注意符号的变换 n+; cout“sin(“x“)=“sinxendl; return 0; ,【例2.15】 输入一个不超过9位的整数,将其反向后输出。例如输入247,变成742输出。 算法分析: 1、将整数的各个数位逐个分开,用一个数组保存各位的值,然后反向组成新的整数。 2、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位、百位,直到整数的值变成0为止。,2.3.3 for 语句,数据处理: 1、设置变量num表示输入的整数,整型数组digit9用来存放num 的各个位;变量i用来表示数组的当前下标; 算法: 1、输入num; 变量初始化:i=0; 2、while (num!=0) num对10取余,得num的当前个位数放入digiti; num整除10,即去掉个位数,十位变个位, 百位变十位,; i+; /数组digit准备记录下一位; 3、将数组元素按下标从低到高的顺序反向组合;,For循环语句,程序如下: int main() int i,num,subscript; int digit9; coutnum; 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 循环的嵌套,嵌套循环: 当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。 嵌套层次一般不超过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,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.16】 _打印九九表,循环嵌套,2.4 转向语句,break & continue goto return,break & continue,break语句 无条件地结束switch语句,或循环语句,转向执行语句块的后续语句 continue语句 用于循环体中,终止当前一次循环,while ( E1 ) 语句 1 if ( E2 ) break ; 语句 2 ,while ( E1 ) 语句 1 if ( E2 ) continue ; 语句 2 ,break,continue,break 与 continue 语句比较,break & continue,for (I=1;I=100;I+) if ( I%3!=0) continue; /I不是3的倍数,不输出,继续下一个I; 输出I的值;/I是3的倍数才输出 if(I%3=0)输出I的值;,例:输出1100内3的倍数。 分析:设置整型变量I从1变化到100,依次测试I是否3的倍数,算法属于穷举法。,本章重点例题或算法,分段函数 用switch求分数段 1+2+.+n 或 1*2*n 或X*X*. N个数求最大值、最小值、平均值 求素数 大小写字母转换 求最大公约数或最小公倍数,break & continue,【例2.18】 给定正整数m,判定其是否为素数。 分析:如果m2,m是素数的条件是不能被2,3,,(m的平方根取整)整除。因此可以用2,3,k(k为m的平方根取整)逐个去除m,如果被其中某个数整除了,则m不是素数,否则是素数。 算法属于穷举法。,int main() int m,i,k; coutm; if(m=2) coutk) cout m“是素数“endl; /循环提前终止表示是非素数 else cout m“不是素数“endl; return 0;,break & continue,2.6 常用算法的应用实例,【例2.20】中国古代数学史上著名的“百鸡问题”,【例2.21】用欧基里德算法(也称辗转法)求两个整数的最大公约数,【例2.23】输入一个8位二进制数,将其转换为十进制数输出。,【例2.22】输入一个小于1的数x,求sinx的近似值,枚举,文件,【例2.19】 求100之内的所有素数,并将这些素数输出,每行输出 2个数据。,2.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;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 #include using namespace std; int main() int i,j,k; cout“ 公鸡 母鸡 小鸡“endl; for(i=0;i=20;i+) for(j=0;j=33;j+) k=100-i-j; if(5*i+3*j+k/3=100),2.6 常用算法的应用实例【例2.20】,注意:穷举法采用循环,须剔除的情况,应在循环体内用用条件语句实现,不可放在循环条件中,请考虑为什么?本例是选合条件的,如去除不合条件用continue语句,改改看? 程序运行结果: 公鸡 母鸡 小鸡 0 25 75 4 18 78 8 11 81 12 4 84,2.6 常用算法的应用实例【例2.20】,2.6 常用算法的应用实例【例2.21】,3.递推法:递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出其他解,如数列问题,近似计算问题等,通常也要借助于循环结构完成。 【例2.21】 用欧基里德算法(也称辗转法)求两个整数的最大公约数。 分析:假定两个整数分别为num1和num2,最大公约数应当是不超过其中较小数的一个整数。 辗转法:用num1除以num2,求出余数resd,如果resd=0,则当前num2就是最大公约数,如果resd!=0,令num1=num2, num2=resd, 重复以上过程,直到resd=0为止。,1、设置两个整型变量num1和num2代表两个数;输入num1、num2; 2、辗转法: 2.1、使num1num2; 2.2、 2.2.1、设置变量resd=num1%num2; /包含了步骤2.1 2.2.2、if(resd=0)当前num2就是最大公约数; else num1=num2, num2=resd; 重复2.2.1和2.2.2,直到resd=0为止。 步骤2辗转法可用以下程序段表示: do resd=num1%num2; if(resd=0)当前num2就是最大公约数; else num1=num2, num2=resd; while (resd!=0); 3、输出当前的num2。,int main( ) int num1,num2,resd; coutnum1num2; coutnum1“和“num2“的最大公约数为:“; do resd=num1%num2; if(resd=0) break; num1=num2; num2=resd; while(resd!=0) coutnum2endl; return 0; ,【例2.22】 输入一个小于1的数x,求sinx的近似值,要求误差小于0.0001。近似计算公式如下: 分析:这个近似计算可以看作一个累加过程,关键在于累加项数的确定。该求近似值的奇次多项式各项顺序改变符号,若取前n项累加和作为sin(x)的近似值,则第n+1项的绝对值就是误差限。因此可以这样考虑,若公式中第一项作为累加和的初值,则第二项就是误差,如果误差不满足要求,则将该项累加到累加和上,进而用该项推出第三项,第三项又是新的累加和的误差。经过这样累加、递推,直至满足要求为止。如果用item保存第n项,则推出第n+1项的方法为: itemitem*x*x/(2*n)*(2*n+1),2.6 常用算法的应用实例【例2.22】,int main() const double epsilon=0.0001; /用epsilon保存误差 double x,sinx,item; int n=2,sign=-1; /sign保存符号 coutx; sinx=x;item=x*x*x/6; /第一项作为初值,第二项为误差项 while(itemepsilon) sinx=sinx+item*sign; /将当前项累加进结果,注意符号作为因子 item=item*x*x/(2*n)*(2*n+1); /推算新的误差项 sign=-sign; /注意符号的变换 n+; cout“sin(“x“)=“sinxendl; return 0; ,2.6 常用算法的应用实例【例2.23】,【例2.23】 输入一个8位二进制数,将其转换为十进制数输出。 分析:二进制转换为十进制只要将每位二进制数乘以该位的权然后相加。实际上属于多项式求和问题: 对于本例,x=2。多项式的系数a i 即为二进制数的各个位,可以用数组保存。 如果直接求幂再求和,需要做(n*(n+1)/2)次乘法。现将多项式作如下变形: 就变成一个十分简单的计算,仅做了n次乘法。,算法: 1、用数字串存二进制数,数组bin8用来放各个二进制位;/考虑为什么? 2、整型变量dec= 0 ; x=2; /初始化 2、for(i=7;i=0;i-) /系数从a n 到a 0 依次投入运算 dec = dec * x +(bini - 0); / (bini - 0):数字字符转换为数字,2.6 常用算法的应用实例【例2.23】,程序: const int n=8; int main() char binn; int x=2,a,dec,i; cout=0;i-) cinbini;/先输入的是高位 dec=0; for(i=n-1;i=0;i-) a=bini-0; /数字字符转换为数字 dec= dec*x+a; cout=0;i-) coutbini; 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 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等则正确,2.7.1 枚举类型的定义,枚举常量: 枚举常量代表该枚举类型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从0开始。如上例中RED、 BLUE、 WHITE、 BLACK的值分别为0、1、2、3。 用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加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、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、赋值包括将枚举常量值赋给枚举变量和两个同类型变量之间赋值。不能直接将整型量赋给枚举变量,两个不同类型的枚举变量之间也不能相互赋值。例如: 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、由于枚举常量本身是一个整数值,因此也允许将一个枚举量赋给整型变量。但不允许将一个整型变量赋给枚举量,即使整型变量取值合适,也必须将整型变量强制转换为枚举型 。例如: int i, j; i=color3; /合法,i的值为1 j=GREEN; /合法,j的值为0 color3= i; /非法 3、关系运算可以是同一枚举类型的两个枚举变量之间或一个枚举变量和一个枚举常量之间,用它们所取的值(序号)比较。例如: if (color3=color4) cout”相等”; if (color3!=WHITE) cout”not white”;,4、枚举变量不能直接输入,可以直接输出,但输出的是变量的整数值。例如: cincolor1 /非法 coutcolor3 /合法,输出的是2 从程序的合法性和可读性出发,枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串。同时,枚举类型数据的其他处理也往往应用switch语句。,2.7.2 枚举类型的变量的使用,*【例2.24】 口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。,2.8 输入输出文件简介,如果希望程序的运行结果能够永久保留下来,供随时查阅或取用,则需要将其保存在文件中。 文件包括文本文件和二进制文件。本小节只讨论文本文件的基本操作和简单应用。文本文件由字符序列组成,也称ASCII码文件,在文本文件中存取的最小信息单位为字符(character)。 两个概念:内部文件和外部文件。通常所谓的文件是指磁盘文件,就是在“我的电脑”的目录中见到的文件,这里称为外部文件。而在程序中运行的文件,称为内部文件(文件流对象)。程序中操作的是内部文件,最后保存的是外部文件。,算法,枚举,文件,2.8 输入输出文件简介,使用文件的步骤如下: 说明一个文件流对象(内部文件)。 文件流类型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”为磁盘文件路径名,这样在文件流对象和磁盘文件名之间建立了联系。,(3) 对文件进行读写操作。最常见的文件读写是顺序的,所谓“顺序”指的是从文件头开始进行读写。顺序读写可用C+的提取运算符()和插入运算符()进行。也可以用读字符的get()和读字符串的getling()等函数。读写是在文件缓冲区中进行。 (4) 关闭文件。当打开一个文件进行读写后,应该显式地关闭该文件。与打开文件相对应: ifile.clo

温馨提示

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

评论

0/150

提交评论