版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、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、入输出信息 算法是程序设计学习的重点。,2.1.1 算 法 的 概 念,6,2.1.2 算法的表示,流程图:算法的图形化表示方法 矩形框 : 表示要执行的指令,在框内标注指令内容; 菱形框 : 表示要判断其中表达式的值是真还是假; 箭头线 : 标示指令的流程方向。 伪码: 伪码是介于自然语言和程序设计语言之间的一种类自然语言的表示方法,书写形式自由,容易转换为程序。,7,顺序结构 分支结构 循环结构,2.1.3算法描述的三种基本结构,任何算法的描述都可以分解为三种基本结构或它们的组合,8,顺序结构,步骤1,步骤2,步骤n,9,分支结构,条件,语句1,语句2,T,F,条件,语句1,T,F,10,
3、循环结构,条件,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,执行流程,格式1: if (表达式) 语句1;,14,执行流程,格式2: if (表达式) 语句1; else 语句2;,15,分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。 int main() int a,
4、 b, c, max; coutabc; cout=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 ,17,2.2.2 if 语句的嵌套,嵌套if语句: if 语句中,如果内嵌语句又是if语句,就构成了嵌套if语句。if 语句可实现二选一分支,而嵌套
5、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 不是3的倍数 两个语句的差别只在于一个“”,但表达的逻辑关
6、系却完全不同。,else和if的配对关系 ”就近配对“原则,相距最近且还没有配对的一对if和else首先配对,19,【例2.8】 求一元二次方程 ax2+bx+c=0 的根。 其中系数a(a0)、b、c的值由键盘输入。 分析:输入系数a(a0)、b、c后,令delta= b24ac,结果有三种情况: *若delta=0, 方程有两个相同实根; *若delta0, 方程有两个不同实根; *若delta0,方程无实根。,【例2.8】 求一元二次方程的根。,20,#include #include using namespace std; int main() float a,b,c; float
7、delta,x1,x2; coutabc; couta=atb=bt c=cendl; delta=b*b-4*a*c;,21,if(delta=0) cout0) 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语句表达。其
8、构成的表达式格式为: 表达式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 ,改写为条件表达式 ch = ( ch = A ,把输入字符转换为小写字母。对输入字符进行判断,如果是大写字母,则转换为小写字母;否则,不转换。,25,switch ( 表达式 ) c
9、ase 常量表达式 1 : 语句 1 case 常量表达式 2 : 语句 2 case 常量表达式 n : 语句 n default : 语句 n+1 ,注: 表达式类型为非浮点型 各常量表达式类型要与之匹配 各常量表达式要求各不相等 default子句可选。缺省时,没有匹配值switch 语句为空,2.2.4 switch语句,根据一个整型表达式的值决定程序分支,26,执行流程,2.2.4 switch语句,27,例题根据考试成绩的等级打印出百分制分数段。,# include using namespace std; int main () char grade ; cout grade ;
10、 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 grade ; switch ( grade ) case a : cout 85_100 n ; br
11、eak; 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 nam
12、espace 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; ,31,2.3
13、循环结构程序设计,2.3.1 while语句 2.3.2 do-while 语句 2.3.3 for语句 2.3.4 循环的嵌套,32,注意: 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
14、 = sum endl ; return 0; ,想一想: 循环条件是什么? 循环结束条件是什么? 哪一个语句修改循环条件?,一个简单的循环跟踪: 求,34,while (i=n) sum+=i+; while (sum+=i+, i=n) ;/循环体为空语句 这两种表达方式与例2.11中的循环语句从执行结果看是完全等价的。需要说明的是,虽然C+可以让代码最大限度优化,但往往造成可读性降低,因此程序设计者只需理解这种表达方法的意义,而设计时主要追求的目标应是可读性。,35,2.3.2 do-while 语句,do-while语句称为直到循环,格式为: do 循环体语句 while(表达式);,
15、36,do/while语句和while语句的区别: do/while语句至少执行一次循环体后再判断循环条件是否满足; while语句先判断条件是否满足,然后才执行循环体。可能一次也不执行。 多数情况下可以互相替代。,37,【例2.12】 用迭代法求a的平方根近似值。求平方根的迭代公式为: 要求前后两个迭代根之差小于10- 5。,迭代法求解:a是已知正数,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|(是一个较小的正数)时,迭代终止,取xk+
16、1的值为a的平方根近似值。,38,1、输入a(a0)及较小正数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的值,所以只需2个变量 4、取x1的值为a的平方根近似值,输出。,和迭代法对应的程序算法是递推算法:,39,#include #include using namespace std; int main( ) float x0,x1,a; couta; if(a=1e-5); cout
17、 a的平方根为:x1endl; return 0; ,40,2.3.3 for 语句,for循环语句的格式 for ( 表达式1;表达式2; 表达式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
18、; 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; /*习惯上:表
19、达式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,即等同 f
20、or (; 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之前的
21、两项 ;变量初始化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)
22、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; 变量初始
23、化: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; coutnum; cout0); for(i=0;isubscript;i+) /整数的反向组合 num=num*10+digiti; cout反向后整数为:numendl; return 0; ,51
24、,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+) coutset
25、w(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 语句 2 ,while (
26、 E1 ) 语句 1 if ( E2 ) continue ; 语句 2 ,break,continue,break 与 continue 语句比较,58,for (I=1;I=100;I+) if ( I%3!=0) continue; /I不是3的倍数,不输出,继续下一个I; 输出I的值;/I是3的倍数才输出 ,例:输出1100内3的倍数。 分析:设置整型变量I从1变化到100,依次测试I是否3的倍数,算法属于穷举法。,59,【例2.18】 给定正整数m,判定其是否为素数。 分析:如果m2,m是素数的条件是不能被2,3,,(m的平方根取整)整除。因此可以用2,3,k(k为m的平方根取整)逐
27、个去除m,如果被其中某个数整除了,则m不是素数,否则是素数。 算法属于穷举法。,60,#include #include using namespace std; int main() int m,i,k; coutm; if(m=2) coutk) cout m是素数endl; else cout m不是素数endl; return 0; ,61,goto语句,goto语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从goto语句所在的地方转移到标号语句处。 goto语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用
28、goto语句。 但在某些特定场合下goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用。 语法: goto 标号; 标号:语句,62,return语句,return语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。 利用一个return语句可以将一个数据返回给调用者。通常,当函数的返回类型为void时, return语句可以省略,如果使用也仅作为函数或程序结束的标志。 语法: return 表达式; 或return (表达式);或return;,63,2.6 常用算法的应
29、用实例,筛选法,枚举法,穷举法 各种尝试,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
30、不是由break结束的,直接法,【例2.19】 求100之内的所有素数,并将这些素数输出,每行输出 2个数据。,66,【例2.19】 求100之内的所有素数,并将这些素数输出,每行输出 2个数据。,一个数如果是其他数的倍数,则这个数肯定不是素数; 在由 多个大于1的数 组成的集合中,剔除所有的非素数,剩下的就都是素数了;,筛选法,算法二(及所需的相应数据): 1、将100之内的整数映射到一个集合。可以采用一个数组a来表示,数组元素值为各个整数; 2、在数组a中,从素数2开始剔除掉新找到的素数的整数倍的元素值(置0,非素数); 3、输出数组a中数组元素值非0的元素,他们都是素数。,67,第 2步
31、 的细化:,筛选法,for (i=0; i=99; i+) /数组下标099,元素值1100 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
32、;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
33、;/每行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; 两个方程无法解出三个变量,只能将各种可能
34、的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应用。 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
35、 (i+j+k=100),枚举法,算法:,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
36、+) k=100-i-j; if(5*i+3*j+k/3=100),枚举法,【例2.20】 鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?,75,递推法,递推算法是通过问题的一个或多个已知解,用同样的方法逐个推算出其他解,如数列问题,近似计算问题等,通常也要借助于循环结构完成。,76,假定两个整数分别为num1和num2,最大公约数应当是不超过其中较小数的一个整数。 辗转法:用num1除以num2,求出余数resd,如果resd=0,则当前num2就是最大公约数,如果resd!=0,令num1=num2, num2=resd, 重复以上过程,直到resd=0
37、为止。,递推法,【例2.21】 用欧基里德算法(也称辗转法)求两个整数的最大公约数。,77,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 num
38、1=num2, num2=resd; while (resd!=0); 3、输出当前的num2。,78,int main( ) int num1,num2,resd; coutnum1num2; 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。近似计算公式如下:,这个近似计算可以看作一个累加过程,关键在于累加项数的确定。
39、 如果用item保存第n项,则推出第n+1项的方法为: itemitem*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); /推算
40、新的误差项 sign=-sign; /注意符号的变换 n+; coutsin(x)=sinxendl; return 0; ,81,二进制转换为十进制只要将每位二进制数乘以该位的权然后相加。实际上属于多项式求和问题: 对于本例,x=2。多项式的系数a i 即为二进制数的各个位,可以用数组保存。 如果直接求幂再求和,需要做(n*(n+1)/2)次乘法。现将多项式作如下变形: 就变成一个十分简单的计算,仅做了n次乘法。,【例2.23】 输入一个8位二进制数,将其转换为十进制数输出,82,算法: 1、用数字串存二进制数,数组bin8用来放各个二进制位;/考虑为什么? 2、整型变量dec= 0 ; x
41、=2; /初始化 2、for(i=7;i=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; for(i=n-1;i=0;i-) a=bini-0;/数字字符转换为数字 dec= dec*x+a; cout=0;i-) coutbini; cou
42、t)的值为: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 ; 枚举常量(或称枚举成员)是以标识符形式表示
43、的整型量,之间以“,”间隔,非法定义实例: enum letter_set a, d, F, s, T; /枚举常量只能是标识符 enum year_set2000,2001,2002,2003,2004,2005; /改为y2000等则正确,87,2.7.1 枚举类型的定义,枚举常量: 编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从0开始。 用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加1的原则取值。 各枚举常量的值可以重复,但各枚举常量标识符必须不同。,enum fr
44、uit_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; co
45、lor_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类
46、型是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=
47、color4) cout”相等”; if (color3!=WHITE) cout”not white”;,关系运算可以是同一枚举类型的两个枚举变量之间或一个枚举变量和一个枚举常量之间,用它们所取的值(序号)比较。,92,2.7.2 枚举类型的变量的使用,cincolor1/非法 coutcolor3/合法,输出的是2,枚举变量不能直接输入,可以直接输出,但输出的是变量的整数值。,从程序的合法性和可读性出发,枚举变量的输入输出一般都采用switch语句将其转换为字符或字符串。同时,枚举类型数据的其他处理也往往应用switch语句。,93,2.7.2 枚举类型的变量的使用*,分析: 每个球的颜色
48、都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色。 假设所取三个球的颜色分别为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) /
49、前两个球颜色不同 for(k=red;k=black;k+) if(k!=i 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,96,/下面输出每种取法,一行为一种取法的三个颜色 for(loop=1;loop=3;loop+) switch(loop) case 1: color=(color_set) i; break;/第一个是i case 2: color=(color_set) j; break;/第二个是j case 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 总裁写保证协议书
- 岗亭技术协议书
- 2025广东广州市南沙区教育局直属事业单位引进少年宫主任1人备考核心题库及答案解析
- 资料保护协议书
- 资质类合同范本
- 要购销合同范本
- 资源占用协议书
- 志愿者合同范本
- 英语培训协议书
- 诊所欠费协议书
- 寝室用电安全培训总结课件
- 市民热线培训课件下载
- 化工氢化考试题库及答案
- 冠心病的健康宣教及饮食指导
- 2025年全国矿山安全生产事故情况
- 船舶安全奖惩管理制度
- 印刷ctp制版管理制度
- 2024鄂尔多斯市东胜国有资产投资控股集团有限公司招聘26人笔试参考题库附带答案详解
- 外研版(三起)(2024)三年级下册英语Unit 5 单元测试卷(含答案)
- 幼儿园防食物中毒安全主题
- 我的家乡四川南充
评论
0/150
提交评论