收藏 分享(赏)

C++程序设计教程第3章——程序控制语句.ppt

上传人:hwpkd79526 文档编号:7134642 上传时间:2019-05-06 格式:PPT 页数:64 大小:908.50KB
下载 相关 举报
C++程序设计教程第3章——程序控制语句.ppt_第1页
第1页 / 共64页
C++程序设计教程第3章——程序控制语句.ppt_第2页
第2页 / 共64页
C++程序设计教程第3章——程序控制语句.ppt_第3页
第3页 / 共64页
C++程序设计教程第3章——程序控制语句.ppt_第4页
第4页 / 共64页
C++程序设计教程第3章——程序控制语句.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

1、,第3章 程序控制语句,C+的语句分类为:控制语句表达式语句空语句复合语句本章主要介绍程序控制语句。在C+中,有一组相关的控制语句,用以实现选择结构与循环结构。选择控制语句: ifelse ;switchcase循环控制语句: while、dowhile、for转移控制语句: break、continue、goto。,3.1.1 ifelse 语句if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。C+语言提供了三种形式的if语句: (1) if(表达式)语句1它的执行过程是:当表达式为真时,执行语句1,否则不做任何操作,直接去执行if语句后面的语句,如

2、图(a)所示。,31 选择语句,图(a),(2) if(表达式) 语句1 else 语句2它的执行过程是:当表达式为真时,执行语句1;表达式为假时,执行语句2。无论如何,语句1与语句2每次只能有一个被执行,如图(b)所示。(两者选择之一),图(b),完整源程序为: #include using namespace std; /* 以上两句也合并成: #include */ int main() int a,b,c,max;cinabc;if (ab) max=a;else max=b;if (cmax) max=c;cout“max=“maxendl;return 0; ,例3-1 输入三个整

3、数,找出其中的最大数并输出。 分析:为求输入的三个整数a、b和c的最大值max, 可以先比较a和b,将较大的值赋给max,语句为: if (ab) max=a; else max=b;然后将max与c进行比较,如果c大于max,则将max修改为c的值,语句为:if (cmax) max=c;,例3-2 输入三个整数,将它们按从小到大的顺序输出。 #include using namespace std; int main() int a,b,c,temp;cinabc;if (ab) temp=a;a=b;b=temp;,if (ac)temp=a;a=c;c=temp;if (bc)temp

4、=b;b=c;c=temp;cout“The result is “a“ “b“ “c“ “endl;return 0; ,在一个if 语句中可以又出现另一个if语句,这称为if语句的嵌套或多重if语句。其一般形式为: if (表达式_1)if (表达式_11)语句1;else 语句2; elseif (表达式_12) 语句3;else 语句4; 程序执行流程 如图(c)所示。,图(c),例3-3 编写一个程序,输入一个x,根据下面的函数输出y的值。1 (x0)y 0 (x=0)-1 (x using namespace std; int main() float x; int y;cinx;

5、if (x=0)if (x0) y=1;else y=0;else y = -1;coutyendl;return 0; ,改写成如下形式: #include using namespace std; int main() float x;int y;cinx;y=0;if (x=0)if (x0) y=1;else y=-1;coutyendl;return 0; 对吗?,(3)ifelse if语句 在C+程序还经常使用如下结构: if(表达式_1)语句1else if(表达式_2)语句 2else if(表达式_3)语句 3else if(表达式_n)语句 nelse语句n+1 这种嵌套

6、的if语句构成的序列是编写多路判定的最一般的方法。它的执行过程是:如果表达式1的值为真,则执行语句1;否则,如果表达式2的值为真,则执行语句2;如果if后的表达式都不为真,则执行语句n+1。每一个语句可以是单个语句,也可以是用花括号括起来的一组语句即复合语句。,当n=3时,程序执行的流程如图(d)所示。,图(d),例3-4 输入一个百分制的考试成绩,要求按照下面的规则打印出等级。 对应规则为:90100分等级为“A”,8089分等级为“B”,7079分等级为“C”,6069分等级为“D”,059分等级为“E”。 #include using namespace std; int main()

7、int score;cinscore;if (score100) cout=90) cout =80) cout =70) cout =60) cout =0) cout score “-E“ endl;else cout “Your input is Wrong!“ endl;return 0; ,使用if 语句的注意事项: (1)三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表式。例如,if(ab & xy)coutab,xy”; 在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式的值为非0,按“真”处理,执行指定的语句。例如:有以下if语句:i

8、f(3) cout“O.K.”;是合法的,执行结果输出“O.K.”,因为表达式的值为3,按 “真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型,实型、字符型指针型数据)。,(2)第二、第三种形式的if语句中,在每个else前面有一分号,整个语句结束处有一分号。,这是由于分号是C语言中不可缺少的部分,这个分号是if语句中的内嵌语所要求的。如果无此分号,则出现语法错误。else子句不能作为语句单独使用它必须是if语句的一部分与if配对使用,而且是:每个else与最近的一个if配对。,(3)在if和else后面可以只含一个内嵌的操作语句(如上例),也可以有多个操作语句

9、,此时用花括号“”将几个语句括起来成为一个复合语句。 什么是复合语句:它是使用花括号“ ”将多条语句括起来组合而成的一种语句格式。格式为: 局部定义变量;语句1;语句2; 语句n;,复合语句从形式上看是多个语句的组合,但在语法意义上它是一个整体,相当于一条语句,所以凡是可以用简单语句的地方都可以用复合语句来实现。在程序设计中复合语句被看成是一条语句,而不是多条语句。 例如: a=10; cout“a= ”a;就是复合语句。注意:复合语句中的每一条语句都必须以“;”结束。而不允许将“;”写在“”外。复合语句不需要以“;”结束。,3.1.2 switch语句C+提供了switch开关语句专门处理多

10、分支选择的情形,使程序变得简洁。,该语句的执行过程为:首先计算表达式的值,当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。 例如:char grade;cingrade;switch (grade) case A : cout “85100n”;break;case B : cout “7084n”; break;case C : cout “6069n”;break;case D : cout “059n”; break;default : cout“等级输入有误!

11、” ;,switch语句的注意事项:,(1)switch后面括弧内的“表达式”,一般最好是整型,字符型和枚举型。,(2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的 case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。,(3)每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象。,(4)各个case和default的出现次序不影响执行结果。,(5)执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。在执行swit

12、ch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下,不再进行判断。因此,应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。可以用一个break语句来达到此目的。(见以下例子),#include int main() int x=7;switch (x) case 7:cout“x=7“endl;case 2:cout“x=2“endl;case 3:cout“x=3“endl;case 5:cout“x=5“endl;return 0; ,运行结果: x=7 x=2 x=3 x=5,例3-5 输入一个年份和月份,打印这一年的

13、该月有几天。在程序中,需要判断某一年是否闰年,因为闰年的2月份为29天,而非闰年的2月份为28天。闰年的判定条件是:能被4整除,但不能被100整除的年份都是闰年,如1996年,2004年是闰年;能被100整除,又能被400整除的年份也是闰年。如2000年是闰年。可以用一个逻辑表达式来表示:(year40&year100! 0) | | year4000 当year为某一整数值时,如果上述表达式值为true(1),则year为闰年;否则year为非闰年。,#include using namespace std; int main() int year,month,day,leap_year;c

14、out year month;if ( (year%4=0 ,switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12: day=31; break;case 4:case 6:case 9:case 11: day=30; break;case 2: if (leap_year=1) day=29;else day=28;cout year “年“ month “月有“ day “天.“ endl;return 0; ,例3-6 将输入的百分制转换为等级制并打印出来。转换规则为:85100 等级A7084 等级B6069

15、等级C 60分以下 等级D,设计思路:85100 等级A X/5 20,19,18,177084 等级B X/5 16,15,146069 等级C X/5 13,1260分以下 等级D X/5 011,#include using namespace std; int main() int x;char grade;cinx;switch (x/5)case 20: case 19:,case 18:case 17:grade=A;break;case 16:case 15:case 14:grade=B;break;case 13:case 12:grade=C;break;default:

16、 grade=D;cout“Grade=“gradeendl;return 0; ,3.2.1 while语句while语句是当型循环控制语句,一般形式为:while (表达式) 语句;语句部分称为循环体,当需要执行多条语句时,应使用复合语句。while语句的执行流程如图(e)所示,其特点是先判断,后执行,若条件不成立,循环体有可能一次也不执行。,3.2 循环语句,图(e),While语句的注意事项:,(1)循环体如果包含一个以上的语句,应该用花括弧括起来, 以复合语句形式出现。如果不加花括弧,则 while语句的范围只到 while后面第一个分号处。,(2)在循环体中应有使循环趋向于结束的语

17、句。如果无此语句,则i的值始终不改变,循环永不结束。,例3-7 求1+2+3 + +99 +100的值。 #include using namespace std; int main() int i,sum;sum=0; /* 累加器的初值一般为0 */i=1; while (i=100) sum+=i;i = i+1; /* 计数器:增量为1的累加器 */cout“The sum is “ sum endl;return 0; 思考:计算 a1+a2+a50的值,其中ai为整数1,例3-8 选票统计 选票的格式为: 1. Zhang 2. Li 3. Wang 编写一个程序,根据输入的投票情

18、况,统计各侯选人得票结果。每张有效选票只许勾选1人,输入时输入候选人代号,弃权票输入0,无效票输入4(勾选人数超过1),以1作为输入终止标志。分析:程序中需要5个计数器来分别统计三位侯选人、弃权票和无效票的情况,可以用switch语句来区分这5种情况。zhang=zhang+1; li=li+1;wang=wang+1;nosele=nosele+1;other=other+1;本例是一个非计数循环,循环次数事先是未知的,但是可以用输入为-1判断循环是否结束。,#include using namespace std; int main() int sele,zhang,li,wang,nos

19、ele,other;zhang=li=wang=nosele=other=0;cinsele;while (sele!=-1)switch (sele)case 1: zhang+;break;case 2:li+;break;case 3:wang+;break;case 0:nosele+;break;case 4:other+;break;,default: coutsele; cout“Zhang =“zhangendl;cout“ Li=“Liendl;cout“ Wang= “wangendl;return 0; ,3.2.2 do-while语句在C+中,直到型循环的语句是do

20、while ,它的一般形式为:do 语句 while (表达式)其中语句通常为复合语句,称为循环体。do while 语句的执行流程如图(f)所示,其基本特点是:先执行后判断,因此循环体至少被执行一次。,图(f),例3-9 求1+2+3 + +99 +100的值。 #include using namespace std; int main() int i,sum;sum=0; i=1; dosum+=i;i = i+1; while (i=100) ;cout“The sum is “ sum endl;return 0; ,例3-10 从键盘输入一个非负整数,将它反向显示出来。 例如,输入

21、1234,输出4321。 #include using namespace std; int main() int number,digit;docoutnumber; while(number0);coutendl;return 0; ,例3-11:while和dowhile循环的比较,(1) void main()int sum=0,i;cini;while (i=10) sum=sum+i;i+;cout“sum=”sum;,(2) void main()int sum=0,i;cini;dosum=sum+i;i+;while (i=10) ;cout“sum=”sum; ,倒底有什么

22、区别?,输入:11 ,输出:0 输入大于10的任何数,则循环体一次都不做。,输入:11,输出:11 无论输入大于10的任何数,都把此数输出,所以循环体至少做一次。,3.2.3 for语句 1.for语句的一般形式为:for (表达式1 ;表达式2 ;表达式3) 语句;,2.执行过程for循环的执行流程如图所示。根据for语句的执行流程,可将for语句改写如下:表达式1;while(表达式2)语句 表达式3;,3、关于for语句的说明,(1) for语句的一般形式中的“表达式1”可以省略, 注意省略表达式 1时,其后的分号不能省略。 如 for(;i=100;i) sum=sumi; 执行时,跳

23、过“求解表达式1”这一步,其他不变。,(2)如果表达式2省略,(其后的分号不能省略),即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。 例如:for(i=1; ;i+)sum=sum+i; 它相当于:i=1;while(1)sum=sum+i;i+ +;,(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:for(il;i100;)sum=sumi;i;,(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:for(;i100;) while(i100)sumsumi; 相当于 sumsumi;i; i;,(5) for语句的一般形式中

24、的三个表达式都是可以省略的,但分号“;”绝对不能省略。特别地,当表达式1和表达式3同时省略时,for语句完全等同于while语句。之前给循环变量赋初值。 例如:i1,sum=0;for ( ;i100;) 相当于sumsumi;i+;,i=1,sum=0; While(i=100) sum=sum+i;i+; ,(6)3个表达式都可省略(但分号不能省),如:for(; ;)语句 相当于while(1)语句 即不设初值,不判断条件(认为表达式2为真值), 循环变量不增值。无终止地执行循环体。,(7)表达式1可以是设置循环变量初值的赋值表达式, 也可以是与循环变量无关的其他表达式。如:for(su

25、m=0;i=100;i) sum=sum+ i; 表达式1和表达式3可以是一个简单的表达式,也可以 是逗号表达式,即包含一个以上的简单表达式,中间 用逗号间隔。如:for(sum=0,i=1;i=100;i+ +)sum=sum+i; 或 for(i=0,j=100;i=j;i+ +,j -)k=i+j;,(9)表达式1、表达式2和表达式3可以是任何表达式。 例如:for(sum0,i1;i=100;i+) sumsumi;for(sum0,i1;i=100; sumsumi ,i+) ;for(sum0,i100;i; sumsumi, i- -) ;(10)可以在表达式1中定义循环变量,该

26、变量值只在此循环中有效。 例如:int sum0 ;for (int i1 ,;i=100;i+) sumsumi;,(8)表达式2一般是关系表达式(如 i=100)或逻辑表达式(如ab&xy),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。,例3-11 求1+2+3 + +99 +100的值。 #include using namespace std; int main() int i,sum;sum=0;for (i=1; i=100; i+) sum+=i;cout “The sum is “ sum endl;return 0; 这是for语句最易理解也是最常用的形式

27、 for (变量=初值;循环条件;变量增值) 语句 ;,3.2.4 循环的嵌套一个循环的循环体中有另一个循环叫循环嵌套。循环嵌套也称为多重循环。 例3-12 编写程序,打印如下的乘法口诀表1*1= 12*1= 2 2*2= 43*1= 3 3*2= 6 3*3= 9 9*1= 9 9*2=18 9*3=27 9*9=81 分析:如果乘法的前一个因子称为i, i :19后一个因子称为j, j :1I可用双重循环来构造本例。,#include Using namespace std; Int main() int i,j;for ( i=1; i=9; i+) for (j=1;j=i;j+)co

28、ut i “*” j “=“ i*j “ “;coutendl;return 0; ,例3-13 用1元人民币兑换成1分、2分、5分,共有多少种不同的兑换方法。问:用1角钱人民币(10分)兑换成1分、2分、5分,共有多少种不同的兑换方法?,为了不遗漏掉一种有效兑换方法,我们列举如下:5分枚数five 2分枚数 two 1分枚数0 0 101 8 2 63 44 25 01 0 5 1 32 12 0 0,外循环5分枚数从0变化到2(10/5),内循环2分枚数从0变化到(10-five*5)/2,5 分枚数five:020 (100/5) 2分枚数 two:0(100-5*five)/2,#in

29、clude using namespace std; int main() int five,two,count;count=0;for (five=0;five=100/5;five+)for (two=0; two=(100-five*5)/2;two+)count+;cout “共有 “ count “ 种兑换方法“ endl;return 0; ,这里没有考虑1分的个数,因为不够的都用1分的来凑。,例3-14 600!能被9的最高多少次方整除?600的阶乘是一个很大的数,将其计算出来,然后不断除以9,看它能被9的多少次方整除,是难以实现的。程序设计思想: 一个可以采用的方法是对1至60

30、0这600个数进行判断,看每一个数中包含多少个因子3,然后将它们加起来除以2,即得9的最高次方。,#include using namespace std; int main() int i,number,k,power;power=0;for (i=1; i=600; i+)number=i;k=number%3;while (k=0)power+;number=number/3;k=number%3;cout “The max power of 9 is “ power/2 endl;return 0; ,3.2.5 break和continue语句 1break语句语法格式: break

31、;功 能:它的作用是跳出switch结构或跳出循环结构。 例3-15 计算半径 r =1到10时圆的面积s,直到面积大于100为止。 #include int main() int r; float s;for (r=1; r100) break;cout“S(“r“)=“sendl;return 0; ,原本打印10次,增加了break语句,中断了循环的执行,打印了5次。,运行结果: S(1)=3.14 S(2)=12.56 S(3)=28.26 S(4)=50.24 S(5)=78.5,2continue语句格式: continue;功能:结束本次循环(然后开始下一次循环)。 例3-16

32、将100200之间的能被3整除的数输出。 #include using namespace std; int main() int i;for (i=100;i=200;i+)if (i%3!=0) continue;cout i “ “;cout endl;return 0; ,continue 的作用是结束本次循环,即跳过continue下面尚未执行的语句,直接跳到下一次是否执行循环的判断。 对于while和dowhile来讲,意味着立即执行条件检测部分。 对于for语句,意味着立即执行表达式3 比如: int sum; for(int i=0;i4;i+) if(i=2) continu

33、e; sum+=i; 最后sum=4;因为当i=2时候continue了。也就是直接跳过了sum+=i;直接进入i=3的情况了。,break和continue的区别如下: 1. break可用于switch语句,表示跳出整个switch块,而continue则不能用于switch语句 2. 它们都可用于循环语句的循环体,区别是它们对循环次数的影响不同。break用于立即退出当前循环,而continue仅跳过当次循环(本次循环体内不执行continue语句后的其它语句,但下次循环还会执行)。举例说明。 int i; int s = 0; for (int i = 1; i = 10; i+) i

34、f (i = 6) break; s += i; 上面的循环会因为break语句而在i=6时提前终止,这样s的最终值就是1+2+3+4+5 如将break换成continue,则结果为:1+2+3+4+5+7+8+9+10=49(没有6),3.2.6 goto语句goto语句为无条件转向语句,它用于将控制从它所在的地方转移到语句标号所标识的语句处。它的一般形式为:goto 语句标号;语句标号用标识符表示,它的命名规则与变量名相同,即由字母、数字和下划线组成,其第一个字符必须为字母或下划线。不能用整数来做标号。 例如:goto label_1;是合法的,而 goto 123;是不合法的。,现代程

35、序设计方法主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差。但也不是绝对禁止使用goto语句。例如,当要从多层循环的最内层循环直接跳到外层循环外时,如果用break语句,将要用多次,而且可读性并不好,这时用goto语句就可以发挥作用。例如:,goto error; error: ,goto语句可以与if语句一起构成循环结构。 例3-17 求1+2+3+ +99+100的值。 #include using namespace std; int main() int i,sum;sum=0;i=1;loop1:sum+=i;i+;if (i=100) goto loop1

36、;cout “The sum is “ sum endl;return 0; ,但是不推荐使用此方法!,3.2.7 循环举例 例3-18 输入10个整数,找出最大数。 #include int main() int k,x,max;cinx;max=x;k=2;while (kx;if (xmax) max=x;k+;cout“Max=“maxendl;return 0; ,例3-19 利用公式/4=1-1/3+1/5-1/7+求 的近似值,最后一项的绝对值小于10-6 为止。 #include int main() long int i; double pi,t; int s;pi=0; t

37、=1 ; i=1; s=1;while ( t=1e-6) pi=pi+s*t;i=i+2;s=-s;t=1.0 / i;pi=pi*4;cout “PI=“ pi endl;return 0; ,初值的设定,如果这里是t=1/i;那么结果将是PI=4而不是PI=3.14159,例3-20 输出Fibnacci序列的前20项的值。 #include int main() int a,b,c,i;a=1; b=1;couta“ “b“ “;for (i=3;i=20;i+)c=a+b;coutc“ “;a=b;b=c;coutendl;return 0; ,例3-21 在歌唱比赛中有10位评委为

38、选手评分,编写程序输出选手的最高分、最低分和平均分。 #include int main() float score,max,min,sum,avg;cinscore; max=score; min=score; sum=score;for (int i=2;iscore;if (scoremax) max=score;if (scoremin) min=score;sum=sum+score;avg=(sum-max-min)/(10-2); cout“Max=“max“ Min=“min;cout“ Average=“avgendl;return 0;,例3-22 判断某个整数是否为质数。

39、 #include #include int main() long m,k; int i;cinm; k=sqrt(m);for (i=2; i=k; i+)if (m%i=0) break;if (i=k) / 能除尽,所以不是质数coutm “ is not prime. ”endl;elsecoutm “ is prime. “endl;return 0; ,例3-23 求100200之间的所有质数。 #include #include int main() int i, k, m, s; for (m=101; m=200; m=m+2) k=sqrt(m);s=0; for ( i

40、=2; i=k; i+)if (m%i = 0) s=1; break; if (s=0) coutm “ “; return 0; ,例3-24 对任意给定的正整数n,求n!中末尾0的个数。对于1,2,3,n中的每一个数求5的因子个数,然后将所有5的因子个数加起来就是n!中末尾0的个数。 #include int main() int i,j,k=0,n;cinn;for (i=5; i=n; i=i+5)j=i;while (j%5=0) k+;j=j/5;cout “n!中末尾0的个数为“ k endl;return 0; ,计算此数中 有几个5,例3-25 求所有的水仙花数。所谓水仙花

41、数是指一个三位数的各位数字的立方和等于该数本身。例如:13+53+33=153。 方法一、 #include int main() int i,x,y,z;for (i=100;i1000;i+)x=i/100;y= (i-x*100)/10;z=i %10;if (x*x*x+y*y*y+z*z*z=i)couti“ “;coutendl;return 0; ,分别求百位、 十位和个位,例3-25 求所有的水仙花数。所谓水仙花数是指一个三位数的各位数字的立方和等于该数本身。例如:13+53+33=153。 方法二、#include int main() int i,j,k;for (i=1;i=9;i+)for(j=0;i=9;j+)for (k=0;k=9;k+)if (i*i*i+j*j*j+k*k*k=i*100+j*10+k)couti*100+j*10+k“ “;coutendl;return 0; ,小结 1 主要掌握while、do while、for语句的语法结构、执行过程。 2 计数循环和非计数循环。 3 累加、累乘运算。课堂练习 1 从键盘输入n,计算n!。 2 计算1+1/4+1/7+1/10+的前200项的和。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报