1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,第,3,章 语句与基本控制结构,C+,语言程序设计,中山大学信息科学与技术学院,2,主要内容,C+,语句概述,程序的基本控制结构,选择语句,循环语句,应用举例,3,引言,C+,程序中最小的执行单位是,语句,符合,C+,语法规则的语句才能通过编译,语义错误通常会导致程序出错,C+,程序中的语句通常是按顺序依次逐条执行的,要改变这种执行顺序,需要使用控制语句,4,1,、,C+,语句概述,程序由语句组成,分号(,;,)是语句的标志(例外:块语句无分号),按照语句的结构形式和功能,,C+,中的语句大致可以划分为,
2、带标号语句(,labeled-statement,),表达式语句(,expression-statement,),复合语句(,compound statement,),声明语句(,declaration statement,),try,块(,try block,),转移语句(,jump statement,),选择语句(又称分支语句(,selection or branch statement,),循环语句(,iteration or loop statement,),5,1,、,C+,语句概述(续),带标号语句,语句的起首是一个标号,该标号有的可以由程序员自己定义,有的是,C+,中的关键字(
3、保留字),三种形式,标识符语句,形如:,标识符,:,语句,与,goto,语句搭配使用,case,语句,形如:,case,常量表达式,:,语句,只用在,switch,语句中,default,语句,形如:,default:,语句,只用在,switch,语句中,6,1,、,C+,语句概述(续),表达式语句,由表达式(可选)和分号组成,expression,;,空语句(,null statement,),;,/null statement,C+,中最简单的语句,-,只由一个分号组成,当计算机执行空语句时,并不产生任何动作,空语句的作用是在语法,while(cina&a!=found),;/null s
4、tatement,滥用或误用空语句,将会导致程序的错误,例如,cin a;,while(a!=found),;,cin a;,7,1,、,C+,语句概述(续),表达式语句(续),赋值语句、输入语句、输出语句,a=(x+y)%z)/m;/,赋值语句,cin b;/,输入语句,cout You name is s a;,while(a!=found),cout You input the wrong number,please input again!,a;,9,1,、,C+,语句概述(续),声明语句,描述名字(即标识符)在计算机中如何解释,如:,存储类别,数据类型 变量名,=,初值,变量名,=,
5、初值,;,存储类别,const,数据类型 常量名,=,初值,常量名,=,初值,;,定义性声明,vs.,引用性声明,变量的定义性声明(又称,定义,)导致内存空间的分配,而引用性声明不会导致内存分配,整个程序中,一个标识符的定义性声明只能有一次,而引用性声明可以有多次,C+,语言规定:,先定义,后使用,未指定存储类别为,extern,的变量声明都是定义性声明,10,1,、,C+,语句概述(续),try,块,用于,C+,中的异常处理,详见第,12,章,11,1,、,C+,语句概述(续),转移语句,用于无条件地改变程序语句的执行顺序,break,语句,break;,只能用在,switch,语句和循环语
6、句(,while,、,do-while,和,for,语句)中,执行,break,语句将导致直接包含该语句的,switch,语句或循环语句中止执行,continue,语句,continue;,只能用在循环语句中,作用:中止循环的当次迭代,转入下次迭代(循环体的一次执行称为一次,迭代,),12,1,、,C+,语句概述(续),转移语句(续),return,语句,return;,或,return,表达式,;,只能用在函数中,作用:结束当前正在执行的函数,将控制权返回给,函数调用者,,并将函数值传递给调用者,goto,语句,goto,语句标号,;,将控制权转移到带有语句标号的语句,而这个语句标号是任意合
7、法的标识符,要求位于当前函数内,否则会导致使用未经初始化的变量的错误,13,例:,int judge(int n),if(n=0)/,如果,n,等于,0,,返回值,0,return 0;,if(n 0)/,如果,n,大于,0,,返回值,1,return 1;,if(n 0)/,如果,n,小于,0,,返回值,-1,return-1;,14,#include,using namespace std;,int main(),int n;,int i;,int f;,i=1;,f=1;,cout Please input an integer number:n;,Fctor:,f=f*i;,i+;,i
8、f(i=n),goto Fctor;,cout Factorial of n =f endl;,return 0;,for(int i=1;i=n;i+),f=f*i;,15,2,、程序的基本控制结构,C+,程序中的语句通常都是按顺序依次逐条执行的,语句的顺序执行,16,2,、程序的基本控制结构(续),C+,提供了一组控制流语句来改变执行的路径,以达到解决问题的目的,这组控制流语句具有的执行结构称为,基本控制结构,选择(分支),循环,选择控制结构,循环控制结构,17,3,、选择语句,选择语句在执行时,先判断条件,然后根据判断结果执行相应的分支,两种选择语句,if,语句,switch,语句,18
9、3,、选择语句(续),if,语句,简单,if,语句,形如:,if(,条件,),语句,对,条件,(一个表达式)求值的结果为,true,时,执行,语句,,而结果为,false,时,不执行,语句,例:,max=x;,if(max y),max=x;,else,max=y;,20,3,、选择语句(续),if,语句(续),嵌套,if,语句,简单,if,语句或,if-else,语句中的,语句,本身又是,if,语句,用于处理多分支,形式多样(,if,语句的,if,子句和,else,子句均可进行嵌套),if(,条件,1),if(,条件,2),语句,if(,条件,1),if(,条件,2),语句,1,else,
10、语句,2,if(,条件,1),语句,1,else if(,条件,2),语句,2,if(,条件,1),语句,1,else if(,条件,2),语句,2,else if(,条件,3),语句,3,else,语句,n,表示多分支选择的一种良好形式,21,3,、选择语句(续),if,语句(续),else,与,if,的匹配规则:,C+,编译器将,else,与出现在它前面的、同一层次的、还没有,else,与之配对的,if,相匹配,例:,int x=8;,if(x 6),if(x 9),cout,grade 1,;,else,cout 6),if(x 9),cout grade 1;,else,cout x;
11、if(x=90),cout,You got an excellent score!,=95),cout,A+,;,else,cout=80),cout,You got a good score!,=85),cout,B+,;,else,cout=70),cout,You got a medium score!,=75),cout,C+,;,else,cout=60),cout,You got a pass exam!,=65),cout,D+,;,else,cout,D,;,else if(x60),cout,You fail in the exam!,endl;,cout,E,;,24,3
12、选择语句(续),switch,语句,用于实现多分支选择,形式:,switch(,条件,),语句,条件,必须是,整型,(即,short,int,long,char,bool,)、,枚举类型,(,enum,)或,类类型,(该类类型必须具有将类类型转换成整型或枚举类型的,类型转换函数,),语句,包含两种带标号语句,case,子句。形如:,case,常量表达式,:,语句序列,default,子句。形如:,default:,语句序列,case,子句可有多个,但,default,子句最多只有一个,25,3,、选择语句(续),switch,语句,(续),执行流程:,首先对,条件,求值,若结果值与某个,c
13、ase,子句中的,常量表达式,的值相等,则执行此,case,子句中的,语句序列,,否则:若有,default,子句则执行,default,子句,若无,default,子句则执行,switch,语句后的下一语句,分支较多时,应优先考虑采用,switch,语句实现,使程序更具可读性,恰当使用,break,26,例:若,answer,的值是字符,B,,则输出结果是?,switch(answer),case a:,case A:cout The answer is wrong!endl;,break;,case b:,case B:cout Sorry,you did not get the righ
14、t answer!,endl;,break;,case c:,case C:cout Congratulation!The answer is correct!endl;,break;,case d:,case D:cout Your answer is not the right one!endl;,break;,case e:,case E:cout Wrong answer!endl;,break;,default:cout You inputted an invalid answer!endl;,break;,27,例:若,answer,的值是字符,b,,则输出结果是?,switch(
15、answer),case a:,case A:cout The answer is wrong!endl;,case b:,case B:cout Sorry,you did not get the right answer!endl;,case c:,case C:cout Congratulation!The answer is correct!endl;,case d:,case D:cout Your answer is not the right one!endl;,case e:,case E:cout Wrong answer!endl;,default:cout You inp
16、utted an invalid answer!endl;,28,一种常见的错误:,switch(answer),case,a,A,:cout The answer is wrong!endl;,case,b,B,:cout Sorry,you did not get the right answer!endl;,case,c,C,:cout Congratulation!The answer is correct!endl;,case,d,D,:cout Your answer is not the right one!endl;,case,e,E,:cout Wrong answer!en
17、dl;,default:cout You inputted an invalid answer!endl;,29,4,、循环语句,在执行循环语句时,当循环条件满足(值为,true,)时,就继续执行循环体,否则跳出该循环控制结构,C+,提供三种形式的循环语句,while,语句,do-while,语句,for,语句,30,4,、循环语句,(续),循环的类型,计数控制循环(,count-controlled loop,),循环体执行的次数是精确的,是已经定好的,事件控制循环(,event-controlled loop,),只有当某些事件发生或不发生时,才停止执行循环体,又可细分为:哨兵控制循环(,
18、sentinel-controlled loop,)、文件结束控制循环(,end-of-file-controlled loop,),和标志控制循环(,flag-controlled loop,),31,4,、循环语句(续),while,语句,形式,while(,条件,),语句,while,语句在执行时,先判断,条件,,如果为,true,就执行循环体,如果为,false,就跳出该循环控制结构。如果,条件,不是标准的逻辑表达式,则系统会根据相应的规则将其转成,bool,类型的值,死循环,:循环永不终止,循环体中必须有改变,条件,的语句,或者,break,语句,否则会导致死循环,称为,“,循环体,
19、32,4,、循环语句(续),/,计数控制循环的例子,count=1;,sum=0;,while(count t;,while(t!=-1),sum+=t;,count+;,cin t;,cout average temperature:sum/count endl;,导致事件改变的语句,哨兵:,-1,34,4,、循环语句(续),/,标志控制循环的例子,int n=0,count=0;,bool found=true;,while(found),n+;,if(n%3=2)&(n%5=3)&(n%7=2),cout n endl;,count+;,if(count=5),found=false
20、设置标志初值,修改标志的值,35,4,、循环语句(续),do-while,语句,形式:,do,语句,while(,条件,);,do-while,语句与,while,语句的区别,while,语句先判断,条件,再根据判断的结果决定是否执行循环体,而,do-while,语句先执行循环体一次,再判断,条件,,根据判断的结果决定是否继续执行循环体,do-while,语句至少执行循环体一次,而,while,语句有可能一次都不执行,36,4,、循环语句(续),/,标志控制循环的例子,int n=0,count=0;,bool found=true;,do,n+;,if(n%3=2)&(n%5=3)&(n
21、7=2),cout n endl;,count+;,if(count=5),found=false;,while(found);,37,4,、循环语句(续),for,语句,形式,:,for(,初始化语句 条件,;,表达式,),语句,与以下形式的,while,语句等价,初始化语句,while(,条件,),语句,表达式,;,38,4,、循环语句(续),for,语句(续),执行流程:,先执行,初始化语句,,然后判断,条件,。如果判断结果为,true,则先执行是,语句,,,然后对,表达式,求值,然后再判断,条件,并根据结果看是否再次执行,语句,和对,表达式,求值,依次类推;如果,条件,的判断结果为,
22、false,,则结束整个,for,语句,跳出该循环,39,4,、循环语句(续),for,语句(续),初始化语句,可以是声明语句、表达式语句或者空语句,它们都以分号结束,因此可将,for,语句的语法形式写为,for(,初始化式,;,条件,;,表达式,),语句,for,后面的括号中的三个部分都可以省略,但是两个分号却不可省略,初始化语句,的目的是给循环变量赋初值,如果是一个循环变量的声明语句(同时赋初值),则该变量的作用域是本,for,语句,这一点与上述等价的,while,语句不同,40,当把循环变量的赋初值放在,for,语句之前时,初始化语句即成为空语句,int sum;,sum=0;,for(
23、int i=1;i=100;i+),sum=sum+i;,int sum;,int i;,sum=0;,i=1;,for(;i=100;i+),sum=sum+i;,虽然功能相同,但是变量,i,的作用域不同:前例中的,i,当,for,语句执行完毕后其存储空间就被系统收回,但在后例中,当,for,语句执行完毕后,,i,仍然可以被其后的语句访问,41,4,、循环语句(续),for,语句(续),条件,可以是表达式或为空。如果,条件,为空,表示放置的是,true,,即,for(,初始化式,;,条件,;,表达式,),,因此该循环成为死循环(除非循环体中有,break,语句),int sum;,sum=0
24、for(int i=1;i+),if(i=100),break;,sum=sum+i;,注意:这种做法对程序的清晰性、可读性没有什么好处!,42,4,、循环语句(续),for,语句(续),表达式,部分通常对循环变量进行更新,当该部分省略时,循环体内应该有相应语句对循环变量进行更新,否则也会导致死循环,int sum;,sum=0;,for(int i=1;i=100;),sum=sum+i;,i+;,注意:这种做法对程序的清晰性、可读性没有什么好处!,43,4,、循环语句(续),break,语句及其在循环语句中的使用,break,语句的作用:终止该语句所在块的执行,例:将,50,到,100
25、之间的所有素数显示在标准输出设备上,44,#include,#include/,使用其中的函数,sqrt,using namespace std;,int main(),int i,j;,bool isPrime;,isPrime=true;,for(i=50;i 100;i+),for(j=2;j=int(sqrt(i);j+),if(i%j=0),isPrime=false;,break;,if(isPrime),cout i endl;,isPrime=true;,return 0;,此程序有什么可以改进的地方?,45,4,、循环语句(续),continue,语句及其在循环语句中的使用
26、continue,语句的作用:终止循环中当次迭代的执行,转而执行下一次迭代,例:计算,1,10000,这,10000,个整数中素数的个数和非素数的个数,46,/,预处理指示等(略),int main(),int i,j;,int primeCnt,nonPrimeCnt;,primeCnt=0;,nonPrimeCnt=0;,for(i=1;i=10000;i+),if(i=1|i=2|i=3),primeCnt+;,else,for(j=2;j=int(sqrt(i);j+),if(i%j=0),nonPrimeCnt+;,break;,else,if(j int(sqrt(i),cont
27、inue;,primeCnt+;,/,输出结果(略),return 0;,此程序有什么可以改进的地方?,47,3.5,应用举例,问题描述,要求编程实现一个猜三个随机数之和的游戏。在每一局游戏中,系统随机产生三个,1,到,6,的数字,来模仿掷三个骰子得到的朝上的那个面的点数。游戏者有三次机会去猜这三个数字之和,猜中则获胜,猜不中则失败。具体玩法是:游戏者从键盘输入答案,每次的输入都能从系统中获得反馈信息,被告知所输入的数值与真正答案之间的关系。游戏者最多有三次输入机会,三次机会用完后仍然猜不中,则失败,如果第三次输入前已经猜中,游戏者获胜,本局游戏结束。,编程要求:游戏开始前给出游戏的说明信息;
28、游戏者总共最多有三次输入答案机会,游戏者每次输入答案后系统需要给出提示信息;如果游戏者三次输入都猜不中,则给出失败提示,如猜中则给出获胜祝贺提示;当一局游戏结束时,询问游戏者是否继续再玩下一局,如果游戏者输入为,Y,或,y,,则开始新的一局游戏,如果输入为其他字符,则终止整个程序,48,3.5,应用举例,分析与设计,由于要求游戏者可以不断进行游戏,因此需要使用循环语句,这是最外层的循环,我们记这个,while,循环为,loop00,。这个循环属于标志控制循环,其循环体中依次进行如下步骤:,生成三个随机数并求和,用计数循环来给游戏者最多三次的输入机会,当游戏者猜中时,使用,break,语句跳出循
29、环。记这个,for,循环为,loop02,如果游戏者,3,次猜不对,则揭晓答案并给出失败提示,询问用户是否继续玩这个游戏,判断用户输入的字符并作相应处理,49,3.5,应用举例,程序的运行逻辑,50,/*,/diceGame.cpp,/,功能:一个猜数游戏程序,主要用来演示选择语句和循环语句的使用,/*,#include/,使用,cin,,,cout,和,endl,#include/,使用函数,rand(),和,srand(seed),#include/,使用其中的函数,time(),获取系统时间,作为,srand(seed),中的,seed,using namespace std;,int
30、main(),int randNum1,randNum2,randNum3;/,用于存放,3,个随机数,int rsum;/,用于存放,3,个随机数之和,int count;/,用于游戏者输入答案的循环,bool flag;/,用于事件控制循环,loop00,int n;/,游戏者输入的三随机数之和,char c;/,游戏者输入的是否进行下一局游戏的答案,51,/,游戏说明与提示,cout Here will be an exciting game _ endl;,cout There are three dice casting in a black box,;,cout and each
31、face of one dice shows points from 1 to 6,;,cout please guess the sum of the three dice!endl;,cout Note that you have three times to guess at most.endl;,flag=true;,/,最外层的循环关乎是否再来一局游戏,while(flag)/loop00,cout Now the game begin!endl;,/,生成三个取值范围在,1,6,的随机数并求,3,数之和,rsum=0;,srand(unsigned)time(NULL);/time
32、函数获取系统时间,/srand,函数设置产生随机数的种子,randNum1=rand()%6+1,;/rand,函数生成,0RAND_MAX,之间的随机数,randNum2=rand()%6+1;,randNum3=rand()%6+1;,rsum=randNum1+randNum2+randNum3;,52,/,游戏者最多有,3,次机会输入答案,for(count=0;count 3;count+)/loop02,cout n;,if(n rsum&count 2),cout Too small number!Enter bigger one!,rsum&count 2),cout Too
33、 big number!Enter smaller one!,endl;,else if(n=rsum),cout How smart you are!YOU WIN!,endl;,cout The points on the three dice are:,endl;,cout randNum1 randNum2,randNum3 endl;,break;,53,/,揭晓答案并给出失败提示,if(count=3),cout endl;,cout Sorry,You lose!endl;,cout Now lets disclose the black box!endl;,cout The p
34、oints on the three dice are:endl;,cout randNum1 randNum2 ,randNum3 endl;,cout endl The sum of points of the three dice is:,“,endl;,cout rsum endl;,/,询问是否再玩一局,cout endl Do you want to play the game again?endl;,cout Please enter Y or y to play again,enter other letter to exit the game:c;,if(c=Y|c=y),flag=true;,else,flag=false;,return 0;,人有了知识,就会具备各种分析能力,,明辨是非的能力。,所以我们要勤恳读书,广泛阅读,,古人说“书中自有黄金屋。,”通过阅读科技书籍,我们能丰富知识,,培养逻辑思维能力;,通过阅读文学作品,我们能提高文学鉴赏水平,,培养文学情趣;,通过阅读报刊,我们能增长见识,扩大自己的知识面。,有许多书籍还能培养我们的道德情操,,给我们巨大的精神力量,,鼓舞我们前进,。,






