基本控制结构程序设计课件

上传人:仙*** 文档编号:244484978 上传时间:2024-10-04 格式:PPT 页数:105 大小:982.05KB
返回 下载 相关 举报
基本控制结构程序设计课件_第1页
第1页 / 共105页
基本控制结构程序设计课件_第2页
第2页 / 共105页
基本控制结构程序设计课件_第3页
第3页 / 共105页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,C+,程序设计,1,第二章 基本控制结构程序设计,2,结构化程序设计的特点是,任何程序,都可由,三种基本结构及其组合,来描述。,本章将介绍,C+,分支结构和循环结构的设计方法。还将介绍一些常用算法。,3,2.1,算法的概念与表示方法,2.2,分支结构程序设计,2.3,循环结构程序设计,2.4,转向语句,2.5,结构化程序设计思想(选读),2.6,常用算法的应用实例,2.7,枚举类型,2.8,输入输出文件简介,4,2.1,算法的概念与表示方法,2.1.1,算法的概念,2.1.2,算法的表示,2.1.3,算法描述的三种基本结构,5,算法:,为了解决某一问题而采取的有限步骤。,计算机算法的特征:,可执行性,确定性,有穷性,可输入输出信息,算法是程序设计学习的重点。,2.1.1,算 法 的 概 念,6,2.1.2,算法的表示,流程图:算法的图形化表示方法,矩形框,:,表示要执行的指令,在框内标注指令内容;,菱形框,:,表示要判断其中表达式的值是真还是假;,箭头线,:,标示指令的流程方向。,伪码:,伪码是介于自然语言和程序设计语言之间的一种类自然语言的表示方法,书写形式自由,容易转换为程序。,7,顺序结构,分支结构,循环结构,2.1.3,算法描述的三种基本结构,任何算法的描述都可以分解为三种基本结构或它们的组合,8,顺序结构,步骤,1,步骤,2,步骤,n,9,分支结构,条件,语句,1,语句,2,T,F,条件,语句,1,T,F,10,循环结构,条件,T,循环体,F,当型(,while,) 循环,条件,T,循环体,F,直到型循环(,do,循环的反条件),11,2.2,分支结构程序设计,2.2.1,if,语句,2.2.2,if,语句的嵌套,2.2.3,条件运算符,2.2.4,switch,语句,12,2.2.1 if,语句,if (,表达式,),语句,1;,if (,表达式,),语句,1,;,else,语句,2;,13,执行流程,false (0),true (,非,0,),表达式,语 句,格式,1,:,if (,表达式,),语句,1;,14,执行流程,false (0),true (,非,0,),表达式,语 句,1,语 句,2,格式,2,:,if (,表达式,),语句,1,;,else,语句,2;,15,分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。,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;,【,例,2.5】,从键盘上输入三个整数,输出其中的最大数。,16,例,2.4,输入一个年份,判断是否为闰年,#include,using namespace std;,int main (), int year;,cout“,输入年份”, year ;,if (year%4=0&year%100!=0|year%400=0),cout year “,年时闰年”, endl ;,else,coutyear“,年不是闰年”,endl;,return 0;,17,2.2.2 if,语句的嵌套,嵌套,if,语句:,if,语句中,如果内嵌语句又是,if,语句,就构成了嵌套,if,语句。,if,语句可实现二选一分支,而嵌套,if,语句则可以实现多选一的多路分支情况。,嵌套在,else,分支中,:,if (,表达式,1),语句,1;,else,if (,表达式,2),语句,2;,else,if ,else,语句,n;,嵌套在,if,分支中:,if (),if (),;,else,;,18,2.2.2,if,语句的嵌套,配对关系实例:,/,语句,1,:,if,(n%3=0),if,(n%5=0) coutn,是,15,的倍数,endl;,else,cout n,是,3,的倍数但不是,5,的倍数,endl;,/,语句,2,:,if,(n%3=0),if,(n%5=0) coutn,是,15,的倍数,endl;,else,cout n 0,,,方程有两个不同实根;,*若,delta0,,方程无实根。,【,例,2.8】,求一元二次方程的根。,20,#include,#include,using namespace,std;,int,main(),float,a,b,c;,float,delta,x1,x2;,cout,输入三个系数,a(a!=0), b, c:abc;,couta=atb=bt,c=cendl;,delta=b*b-4*a*c;,21,if,(delta=0),cout,方程有两个相同实根,:;,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;,/delta0,return,0;,请在,VC+,平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。,22,2.2.3,条件运算符“,?:”,三元运算符“,?:,”,可以用来简化,if,语句表达。其构成的表达式格式为:,表达式,1,?,表达式,2,:,表达式,3,23,例如:,int a=6,b=7,min;,min=ab,?,a,:,b;,/min=6,min=ab,?,+a,:,+b;,/min=7 a=7 b=7,min=ab,?,a+,:,b+;,/min=6 a=7 b=7,24,#include ,using namespace std;,int main(), char ch;,cout ch ;,if ( ch = A ,cout ch = A ,把输入字符转换为小写字母。对输入字符进行判断,如果是大写字母,则转换为小写字母;否则,不转换。,25,switch (,表达式,),case,常量表达式,1,:,语句,1,case,常量表达式,2,:,语句,2,case,常量表达式,n,:,语句,n,default :,语句,n+1,注:,表达式类型为非浮点型, 各常量表达式类型要与之匹配, 各常量表达式要求各不相等,default,子句可选。缺省时,没有匹配值,switch,语句为空,2.2.4 switch,语句,根据一个整型表达式的值决定程序分支,26,表达式,语句,1,语句,2,语句,3,语句,n,语句,n+1,=,常量,1,=,常量,2,=,常量,3,=,常量,n,default,执行流程,2.2.4 switch,语句,27,例题根据考试成绩的等级打印出百分制分数段。,# include ,using namespace std;,int main (), char grade ;,cout “,输入等级,(ad) : 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;,观察不同输入时的输出结果,28,例题 根据考试成绩的等级打印出百分制分数段。,# include ,using namespace std;,int main (), char grade ;,cout ,输入等级,(ad) : 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;,29,if,语句,switch,语句,形成分支控制流程,不形成程序控制流程,用于复杂条件判断,表达式的值为数值集合时作多分支,控制,可读性较好,switch,语句与,if,语句比较,:,30,【,例,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 -: coutnum1opnum2=num1-num2endl; break;,case *: coutnum1opnum2=num1*num2endl; break;,case /: coutnum1opnum2=num1/num2endl; break;,default : coutop,是无效运算符,!;,return 0;,31,2.3,循环结构程序设计,2.3.1,while,语句,2.3.2,do-while,语句,2.3.3,for,语句,2.3.4,循环的嵌套,32,循环条件,循环体,true,false,注意:,1,)循环开始,前,对,循环条件,进行,初始化,;,2,)在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。,2.3.1 while,语句,while,语句也称为当循环,语句格式为:,while (,表达式,),循环体语句;,33,# include ,using namespace std;,int main (), int i = 1 , sum = 0 ;,while ( i = 100 ), sum = sum + i ;,i + ;,cout sum = sum endl ;,return 0;,i = 100,sum = sum + i;,i + + ;,1,0,i = 1; sum = 0;,想一想:,循环条件是什么?,循环结束条件是什么?,哪一个语句修改循环条件?,一个简单的循环跟踪:,求,34,while (i=n) sum+=i+;,while (sum+=i+, i=n) ;/,循环体为空语句,这两种表达方式与例,2.11,中的循环语句从执行结果看是完全等价的。需要说明的是,,虽然,C+,可以让代码最大限度优化,但往往造成可读性降低,,因此程序设计者只需理解这种表达方法的意义,而设计时主要追求的目标应是,可读性,。,35,循环条件,循环体,true,false,直到型循环,2.3.2 do-while,语句,do-while,语句称为直到循环,格式为:,do,循环体语句,while(,表达式,),;,36,do/while,语句和,while,语句的区别:,do/while,语句至少执行一次循环体后再判断循环条件是否满足;,while,语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。,多数情况下可以互相替代。,37,【,例,2.12】,用迭代法求,a,的平方根近似值。,求平方根的迭代公式为:,要求前后两个迭代根之差小于,10,- 5,。,迭代法求解:,a,是已知正数,,x,0,是迭代初值,给,x,0,一个值,假定,x,0,= a/2,;则用迭代公式依次计算:,x,1,=(x,0,+a/x,0,)/2,;,x,2,=(x,1,+a/x,1,)/2,;,x,k+1,=(x,k,+a/x,k,)/2,;,当,|x,k+1,x,k,|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,;,/,求,x,k+1,时只需要知道,x,k,的值,所以只需,2,个变量,4,、取,x1,的值为,a,的平方根近似值,输出。,和迭代法对应的程序算法是递推算法:,39,#include ,#include ,using namespace std;,int,main( ),float,x0,x1,a;,couta;,if,(a0),couta,不能开平方,!=1e-5);,cout a,的平方根为:,x1endl;,return,0;,40,2.3.3 for,语句,for,循环语句的格式,for (,表达式,1;,表达式,2;,表达式,3 ),循环体语句,表达式,2,循环体,true,false,表达式,1,表达式,3,关键字,初始表达式,循环控制,逻辑表达式,循环后置表达式,41,例如,用,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;,42,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,:修改循环条件*,/,43,(1) for,语句属于先判断型,与,while,语句完全等同。,(2) for,语句中的三个表达式都是包含逗号表达式在内的任意表达式。,如,【,例,2.11】,中的循环部分用,for,语句可描述为:,for,(i=1, sum=0; i=100; i+) sum+=i;,(3) for,语句中的三个表达式可部分或全部省略,但两个分号不能省略。如上述语句还可写为:,i=1; sum=0;,for,( ;i=100; ) sum+=i; i+; ,实际上,表达式,2,也可省略,形如,for (; ;) ,这种情况下,约定表达式,2,的值为,1,,即等同,for (; 1;) ,死循环,用,break,跳出。,for,语句的几点说明:,44,【,例,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,个数据。,45,Fibonacii,数列定义如下:,算法分析:除了第,0,项和第,1,项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;,属,递推算法,。,46,算法:,1,、设置变量,n,表示第几项,变量,f 1,和,f 2,用来记住当前项,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;,47,#include ,#include ,using namespace std;,int,main(),int,fib0=0,fib1=1,fib2,n;,coutsetw(5)fib0setw(5)fib1;,for,(n=3;n=20;n+),fib2=fib0+fib1;,coutsetw(5)fib2;,if,(n%5=0) coutendl;,/,控制每行,5,个数据,fib0=fib1; fib1=fib2; ,return,0;,48,【,例,2.15】,输入一个不超过,9,位的整数,将其反向后输出。例如输入,247,,变成,742,输出。,算法分析:,1,、将整数的各个数位逐个分开,用一个数组保存各位的值,然后反向组成新的整数。,2,、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并,重复上述过程,,分别得到十位、百位,,,直到,整数的值变成,0,为止,。,49,数据处理:,1,、设置变量,num,表示输入的整数,整型数组,digit9,用来存放,num,的各个位;变量,i,用来表示数组的当前下标;,算法:,1,、输入,num;,变量初始化:,i=0;,2,、,while,(,num!=0,),num,对,10,取余,得,num,的当前个位数放入,digiti,;,num,整除,10,,即去掉个位数,十位变个位,,百位变十位,,;,i+;,/,数组,digit,准备记录下一位;,3,、将数组元素按下标从低到高的顺序反向组合;,50,#include ,using namespace std;,int main(),int i,num,subscript,digit9;,cout,输入一个不超过,9,位的整数:,num;,cout,原来的整数为:,num0);,for(i=0;isubscript;i+) /,整数的反向组合,num=num*10+digiti;,cout,反向后整数为:,numendl;,return 0;,51,2.3.4,循环的嵌套,嵌套循环:,当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。,嵌套层次一般,不超过,3,层,,以保证可读性。,52,【,例,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,循环的嵌套,53,算法:,1,、输出表头,用一个循环语句即可;,2,、输出表体:,for (i=1; i10; i+), couti;,/,输出行号,输出第,i,行数据;,/A,coutendl;,/,准备输出下一行,3,、,A,行细化:,for (j=1; j=,i,; j+) coutsetw(4)i*j;,54,#include ,#include ,using namespace std;,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;,55,2.4,转向语句,break,&,continue,goto,return,56,break,&,continue,break,语句,无条件地结束,switch,语句,或循环语句,转向执行语句块的后续语句,continue,语句,用于循环体中,终止当前一次循环,57,while (,E1,),语句,1,if (,E2,),break,;,语句 2,while (,E1,),语句,1,if (,E2,),continue,;,语句 2,语句,2,E 1,语句,1,E2,下一语句,break,语句,2,E 1,语句,1,E 2,下一语句,continue,break,与,continue,语句比较,58,for (I=1;I2,,,m,是素数的条件是不能被,2,3,,(,m,的平方根取整)整除。因此可以,用,2,3,k,(,k,为,m,的平方根取整)逐个去除,m,,如果被其中某个数整除了,则,m,不是素数,否则是素数。,算法属于穷举法。,60,#include ,#include ,using namespace std;,int main(),int m,i,k;,cout,输入整数,m,:,m;,if(m=2),coutm,是素数,endl;,else,k=sqrt(m);,for(i=2;ik),cout m,是素数,endl;,else,cout m,不是素数,endl;,return 0;,61,goto,语句,goto,语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从,goto,语句所在的地方转移到标号语句处。,goto,语句会导致程序结构混乱,可读性降低,,而且它所完成的功能完全可以用算法的三种基本结构实现,,因此一般不提倡使用,goto,语句。,但在某些特定场合下,goto,语句可能会显出价值,比如,在多层循环嵌套中,要从深层地方跳出所有循环,,如果用,break,语句,不仅要使用多次,而且可读性较差,这时,goto,语句可以发挥作用,。,语法:,goto,标号,;,标号,:,语句,62,return,语句,return,语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。,利用一个,return,语句可以将一个数据返回给调用者。通常,当函数的返回类型为,void,时,,return,语句可以省略,如果使用也仅作为函数或程序结束的标志。,语法:,return,表达式,;,或,return (,表达式,);,或,return;,63,2.6,常用算法的应用实例,筛选法,枚举法,穷举法,各种尝试,64,【,例,2.20】,中国,古代数学史上著名的,“,百鸡问题,”,【,例,2.21】,用欧基里德算法(也称辗转法) 求两个整数的最大公约数,【,例,2.23】,输入一个,8,位二进制数,将其转换为十进制数输出。,【,例,2.19】,用筛选法求,100,之内的所有素数,【,例,2.22】,输入一个小于,1,的数,x,,求,sinx,的近似值,65,1,、判断一个数是否素数?,2,、,100,之内的所有素数?方法:一个个试,;,综上所述,得到一个循环嵌套的算法:,for,(,m=2,;,m=100,;,m+,),/,穷举法,if,(,m,是素数)按要求的格式输出,m;,k= sqrt(m);,for(i=2,;,ik) m,是素数;,/,刚才的,for,不是由,break,结束的,直接法,【,例,2.19】,求,100,之内的所有素数,并将这些素数输出,每行输出,2,个数据。,66,【,例,2.19】,求,100,之内的所有素数,并将这些素数输出,每行输出,2,个数据。,一个数如果是其他数的倍数,则这个数肯定不是素数;,在由 多个,大于,1,的数,组成的集合中,剔除所有的非素数,剩下的就都是素数了;,筛选法,算法二(及所需的相应数据):,1,、将,100,之内的整数映射到一个集合。,可以采用一个数组,a,来表示,数组元素值为各个整数,;,2,、在数组,a,中,从素数,2,开始剔除掉新找到的素数的整数倍的元素值(置,0,,非素数);,3,、输出数组,a,中数组元素值非,0,的元素,他们都是素数。,67,第,2,步,的细化:,筛选法,for,(i=0; i=99; i+),/,数组下标,0,99,,元素值,1,100,2.1,、,if,(ai=0),continue,;,/ ai,已被定为非素数,并已被筛掉,2.2,、将数组中所有是,ai,倍数的元素置,0,;,for,( j=i+1,;,j=99,;,j+),if,(aj%ai=0) aj=0;,算法二:,2,、在数组,a,中,从素数,2,开始剔除掉新找到的素数的整数倍的元素值(置,0,,非素数);,68,#include,#include,#include,using namespace,std;,const int,n=100;,int,main(),int,an;,int,i,j;,for,(i=0;in;i+) ai=1+i;,/,用数组保存整数,1-100,a0=0;,/1,不是素数,置,0,for,(i=1;in;i+),if,(ai=0),continue,;,/,该数已经置,0,判断下一个,for,(j=i+1;jn;j+),if,(aj%ai=0) aj=0;,/,是,ai,倍数的元素置,0,;,【,例,2.19】,求,100,之内的所有素数,并将这些素数输出,每行输出,2,个数据。,筛选法,69,int,count=0;,cout1 n,之间的素数:,endl;,for,(i=0;in;i+),/,输出所有素数,if,(ai!=0),coutsetw(6)ai;,count+;,if,(count%10=0) coutendl,;/,每行,10,个,coutendl;,return,0;,运行结果:,1100,之间的素数:,2 3 5 7 11 13 17 19 23 29,31 37 41 43 47 53 59 61 67 71,73 79 83 89 97,筛选法,70,枚举法,枚举法也称穷举法,基本思想是,在有限范围内列举所有可能的结果,找出其中符合要求的解。,枚举法适合求解的问题是:,可能的答案是有限个且答案是可知的,但又难以用解析法描述,。这种算法通常用,循环结构,来完成。,71,设鸡翁、母、雏分别为,i,,,j,,,k,,根据题意可得:,i*5+j*3+k/3=100;,i+j+k=100;,两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应用。,i,、,j,、,k,可能的取值有哪些?分析可知,百钱最多可买鸡翁,20,,鸡母,33,,鸡雏,300,。,【,例,2.20】,中国古代数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?,枚举法,72,这个算法使用三重循环,执行时间函数是立方阶,循环体将执行,20*33*300=198000,次。,我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间。,for (i=0; i=20;i+),for (j=0; j=33;j+),for (k=0; k=300;k+),if (i+j+k=100)&(5*i+3*j+k/3=100),coutijk;,枚举法,算法:,73,枚举法,实际上,当,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;,74,#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)&(k%3=0),/,注意,(k%3=0),非常重要,想一想为什么,coutsetw(6)isetw(10)jsetw(10)knum2;,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,。,78,int,main( ),int,num1,num2,resd;,cout,输入两个整数:,num1num2;,coutnum1,和,num2,的最大公约数为:,;,for,(;),resd=num1%num2;,if,(resd=0),break;,num1=num2; num2=resd;,coutnum2endl;,return,0;,程序,递推法,79,【,例,2.22】,输入一个小于,1,的数,x,,求,sinx,的近似值,要求误差小于,0.0001,。近似计算公式如下:,这个近似计算可以看作一个累加过程,关键在于累加项数的确定。,如果用,item,保存第,n,项,则推出第,n+1,项的方法为:,item,item*x*x/(2*n)*(2*n+1),80,程序:,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+;,coutsin(x)=sinx=0;i-),/,系数从,a,n,到,a,0,依次投入运算,dec = dec * x +(bini - 0);,/ (bini - 0),:数字字符转换为数字,【,例,2.23】,输入一个,8,位二进制数,将其转换为十进制数输出,83,程序:,const int,n=8;,int,main(),char,binn;,int,x=2,a,dec,i;,cout,输入二进制序列:,=0;i-) cinbini;,/,先输入的是高位,dec=0;,fo,r,(i=n-1;i=0;i-),a=bini-0;,/,数字字符转换为数字,dec= dec*x+a;,cout=0;i-) coutbini;,cout),的值为,:decendl;,return,0;,84,2.7,枚举类型,2.7.1,枚举类型的定义,2.7.2,枚举变量的使用,85,2.7,枚举类型,枚举类型,(enumerate),是,c+,中的一种派生数据类型,它是用户定义的若干枚举常量的集合。,枚举类型的,变量,,只能取,枚举常量表,中所列的值。,定义枚举类型的主要目的是增加程序的可读性。,86,enum,color_set1,RED, BLUE, WHITE, BLACK;,enum,week,Sun, Mon, Tue, Wed, Thu, Fri, Sat;,2.7.1,枚举类型的定义,enum ;,枚举常量(或称枚举成员)是以标识符形式表示的整型量,,之间以“,”间隔,非法定义实例,:,enum letter_set a, d, F, s, T;,/,枚举常量只能是标识符,enum year_set2000,2001,2002,2003,2004,2005;,/,改为,y2000,等则正确,87,2.7.1,枚举类型的定义,枚举常量:,编译系统为每个枚举常量指定一个整数值,,缺省状态,下,这个整数就是所列举元素的序号,,序号从,0,开始。,用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按,依次加,1,的,原则取值。,各枚举常量的值可以重复,但各枚举常量标识符必须不同。,enum fruit_set apple, orange, banana=1, peach, grape,枚举常量,apple,、,orange,、,banana,、,peach,、,grape,的值分别为,0,、,1,、,1,、,2,、,3,enum week Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat;,枚举常量,Sun, Mon, Tue, Wed, Thu, Fri, Sat,的值分别为,7,、,1,、,2,、,3,、,4,、,5,、,6,88,枚举型变量定义:,先定义枚举类型,再定义枚举变量,枚举类型与枚举变量同时定义,2.7.1,枚举类型的定义,enum,color_set1,RED, BLUE, WHITE, BLACK;,color_set1,color1, color2;,enum RED, BLUE, WHITE, BLACK,color1, color2;,枚举变量的取值范围就是整型数的一个子集。枚举变量占用内存的大小与整型数相同。,89,2.7.2,枚举类型的变量的使用,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,,不能相互赋值,枚举变量的赋值,枚举常量赋值给枚举变量,同类型枚举变量之间赋值,不能直接将整型量赋给枚举变量,两个不同类型的枚举变量之间也不能相互赋值,90,int,i, j;,i=color3;,/,合法,,i,的值为,1,j=GREEN;,/,合法,,j,的值为,0,color3= i;,/,非法,2.7.2,枚举类型的变量的使用,枚举常量本身是一个整数值,因此,允许,将,一个枚举量赋给整型变量,。但,不允许,将,一个整型变量赋给枚举量,,即使整型变量取值合适也必须将整型变量强制转换为枚举型 。,91,2.7.2,枚举类型的变量的使用,if (color3=color4) cout”,相等”,;,if (color3!=WHITE) coutcolor1,/,非法,coutcolor3,/,合法,输出的是,2,枚举变量不能直接输入,可以直接输出,但输出的是变量的整数值。,从程序的合法性和可读性出发,枚举变量的输入输出一般都采用,switch,语句将其转换为字符或字符串。同时,枚举类型数据的其他处理也往往应用,switch,语句。,93,2.7.2,枚举类型的变量的使用,*,分析:,每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色。,假设所取三个球的颜色分别为,i, j, k,每个量都有,5,种取值,其中,ijk,就是满足要求的取法,因此用枚举算法,(,穷举法,),可以解决。,*【,例,2.24】,口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。,94,枚举类型变量的使用,算法:,1,、定义枚举类型及相应变量;,enum,color red,yellow,blue,white,black;,color i,j,k,col;,2,、,for,(i=red;i=black;i+),for,(j=red;j=black;j+),if,(i!=j),/,前两个球颜色不同,for,(k=red;k=black;k+),if,(k!=i&k!=j),/,第三个球不同于前两个,满足要求;找到一种取法,3,、输出该取法:注意枚举量的输出方法。,95,枚举类型变量的使用,程序:,int,main(),enum,color_set red,yellow,blue,white,black;,color_set color;,int,i,j,k,counter=0,loop;,for,(i=red;i=black;i+),for,(j=red;j=black;j+),if,(i!=j),/,前两个球颜色不同,for,(k=red;k=black;k+),if,(k!=i&k!=j),/,第三个球不同于前两个,满足要求,counter+;,if,(counter)%22=0),cout,“,请按回车键继续,”,;/,每屏,22,行,cin.get();,coutsetw(15)counter;,96,/,下面输出每种取法,一行为一种取法的三个颜色,for,(loop=1;loop=3;loop+),sw
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!