C++重点知识点总结及习题 下载本文

第3章 C++程序的流程控制

【内容提要】 顺序控制语句 选择控制语句 循环控制语句 跳转语句

【重点与难点】 3.1 顺序控制语句

指按照语句在程序中出现的先后次序一条一条的顺次执行。包含声明语句,表达式语句,输入输出语句等。 3.1.1 表达式语句 任何一个表达式(上一章中给出了详细介绍)后面加上一个分号就构成了表达式语句(没有分号的不是语句)。常见的表达式语句有以下几种:空语句、赋值语句、函数调用语句等。 空语句:指只有一个分号而没有表达式的语句,它不作任何操作和运算。 格式为: ;

空语句被用在程序的语法上要求一条语句而逻辑上却不需要的时候。

函数调用语句:是由函数调用表达式加一个语句结束标志(分号“;”)构成的语句。函数的定义和使用请参见第五章中的详细介绍。 3.1.2 输入/输出语句

C++程序没有输入/输出语句,它的输入/输出功能由函数(scanf、printf)或流控制来实现。printf和scanf是标准的输入输出函数,主要在C程序设计中使用,其声明包含在头文件stdio.h中。在C++中,I/O流完全取代了它们,使用I/O流输入输出时,必须包含头文件iostream.h。

从键盘输入语句格式为: cin>>表达式1[>>表达式2>>?]; 向屏幕输出语句格式为: cout<<表达式1[<<表达式2<

注意:连续输入多项数据时应键入空白字符(包括空格键、回车键和Tab键)将相邻的两项数据分开。而连续输出时,cout不会在相邻数据项间加分隔符,为了增强显示效果,用户可通过控制符自定义显示宽度,换行等(部分控制符在iomanip.h头文件中声明)。 3.1.3 复合语句

C++语言允许把一组语句用一对花括号括起来,构成一个复合语句。复合语句被视为一个独立的单元它可以出现在程序中任何单个语句可以出现的地方复合语句不需要用分号作为结束。注意空语句;和空复合语句 { } 是等价的。

3.2 选择控制语句

针对于不同情况采用不同的处理方式的问题,用选择结构来实现。选择语句包含:if语句和switch语句。 3.2.1 if语句

if语句:

格式:if(<条件表达式>) <语句>

作用:当<条件表达式>为真时,执行<语句>,否则直接执行if语句后边的语句。

这里的<语句>可以是一条语句,也可以是几条语句,但对于多条语句的情况必须用{ }将几条语句括起来构成复合语句,在if语句中当做一个整体处理。

if?else语句:

格式:if(<条件表达式>) <语句1> else

<语句2>

作用:当<条件表达式>为真时,执行<语句1>;当<条件表达式>为假时,执行<语句2>。 这里<语句1>和<语句2>可以是一条语句也可以是复合语句。 说明:

①if语句有时可以用条件表达式替代。

②if语句支持多种形式的嵌套使用,但一般嵌套层次不超过三层。另外约定else总是与它上边最近的一个if配对。为了防止语法或逻辑错误的发生,建议在较复杂的情形中使用花括号区分。 3.2.2 switch语句

格式:switch(<表达式>){

case <常量表达式1>:<语句序列1> case <常量表达式2>:<语句序列2> ?

case <常量表达式n>:<语句序列n> [default:<语句序列n+1>] }

作用:计算<表达式>判断它与哪个<常量表达式>匹配,执行第一个相匹配的<常量表达式>后的语句,直到遇到break转去执行switch语句以外的语句;如果均不匹配则执行default后定义的语句(在default省略的情形中,直接执行switch语句以外的语句)。 说明:

①switch语句中的<表达式>的值只能是整型、字符型或枚举型表达式。

②switch语句中,case和其后的<常量表达式>间必须有空格否则会产生逻辑错误。case后的<常量表达式>的值是互不相同的,且它的类型与switch后的<表达式>的类型一致。

③通常情况下,每个case分支语句结束后都要加一个break语句来结束switch语句。但在要表示一个范围,或描述一类对象时(如A,B,C都属于合格,D属于不合格)有可能几条case分支语句后才有一个break语句。

④switch语句与嵌套的if语句都可以用于处理多分支选择的问题。

3.3 循环控制语句

对于同一个语句或同一组语句序列需要重复多次,则采用循环结构。C++提供了三种循环控制语句:while语句,do?while语句,for语句。 3.3.1 while语句

格式:while(<条件表达式>) <语句>

作用:判断<条件表达式>是否为真,若为真则执行<语句>,然后重复判断,直到<条件表达式>为假时跳出while循环执行其后的语句。

说明:

①这里的<语句>可以是单条语句也可以是复合语句。 ②当<条件表达式>在循环开始就不满足,则不执行while循环也就是说while循环有可能一次都不执行。

3.3.2 do?while语句 格式: do{

<语句>

}while(<条件表达式>);

作用:当流程到达do后,立即执行循环体语句,然后再对条件表达式进行判断。若<条件表达式>的值为真,则重复执行循环体语句,直到<条件表达式>为假时退出循环,执行do?while循环后的语句。 说明:这种循环中<语句>至少执行一次,当条件在循环开始时就不满足时这种做法是危险的,所以应尽量使用while语句而避免使用do?while语句。 3.3.3 for语句

格式:for(<表达式1>;<表达式2>;<表达式3>) <语句>

作用:<表达式1>可以称为初始化表达式,一般用于对循环变量进行初始化或赋初值;<表达式2>可以称为条件表达式,当它的判断条件为真时,就执行循环体<语句>,否则终止循环,退出for循环;<表达式3>可以称为修正表达式,一般用于在每次循环体执行之后,对循环变量进行修改操作。

说明:

①这里的<语句>可以是一条语句也可以是复合语句。

②for循环中三个表达式可能省略一个、两个或三个都省略,但它们之间分号在三种情况下都不可以省略。

3.4 跳转语句 3.4.1 break语句 格式:break;

作用:结束当前正在执行的循环(for、while、do?while)或多路分支(switch)程序结构,转而执行这些结构后面的语句。

说明:在循环结构中使用时,如果有多层循环,只跳出其所在的最近的循环层。 3.4.2 continue语句 格式:continue;

作用:结束当前正在执行的这一次循环(for、while、do?while),接着执行下一次循环。即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环语句的判定。

【典型例题】

例题1:下列程序的运行结果为__________。 #include void main( ) {

char c=’@’ ;

if (c>='A' && c<='Z') cout<<\是大写字母 \ else if (c>='a' && c<='z') cout<<\是小写字母\ else cout<<\是其它字符\ } 解答:

本题主要考查if语句的嵌套使用方法。首先判断字符变量c是否满足c>='A' && c<='Z',如果满足则输出\是大写字母 \;否则判断c是否满足c>='a' && c<='z',如果满足则输出\是小写字母\否则输出\是其它字符\。else总是与离它最近的前一个if配对。 答案为:是其它字符。

例题2:已定义:char grade; ,若成绩为A、B、C时输出合格,成绩为D时输出不合格,其他情况提示重新输入。要完成以上功能,则下列switch语句正确的是( )。 (a) switch(grade){

case ‘A’: case ‘B’:

case ‘C’: cout<<”合格”;break; case ‘D’: cout<<”不合格”;break; default: cout<<”请重新输入:”;

}

(b) switch(grade){

case ‘A’: case ‘B’:

case ‘C’: cout<<”合格”; case ‘D’: cout<<”不合格”; default: cout<<”请重新输入:”; }

(c) switch(grade){

case‘A’, ‘B’, ‘C’: cout<<”合格”;break; case ‘D’: cout<<”不合格”;break; default: cout<<”请重新输入:”; }

(d) switch(grade){

case A: case B:

case C: cout<<”合格”;break; case D: cout<<”不合格”;break; default: cout<<”请重新输入:”; } 解答:

本题主要考查switch语句的使用。在switch语句执行过程中,找到第一个相匹配的表达式后,转去执行该case后的语句,直到遇到break语句后跳出switch语句执行其后的语句。对于选项b,若grade的值为A则执行结果为“合格不合格请重新输入”,不满足本题的要求;switch语句多个case分支不能简写为多个表达式之间用逗号隔开的一个case分支,选项c错误;case后的表达式只能是整型、字符型或枚举型常量表达式,选项d中case后的A、B、C、D是变量。答案为:a。

例题3:找出并改正下列程序段中的错误:

(1) if(x>0);-------------①

y=x+1;-------------② else;----------------③ y=x-1;-------------④

(2) While(i) --------------------①

{ cout<

while(i<=100) ------② { sum+=i; -----------③ i++;}-------------④

(4) int i=1,sum=0;-------------①

do{ -----------------------② sum+=i; -----------------③ i++;}while(i<=100) ------④

解答:

本题中包含了初学者在编程中容易犯的一些错误,提醒读者注意。 (1)本题考查对if语句的语法结构的掌握。本题的错误在于在if和else后不应加分号。答案为:将①、③句末的分号去掉。

(2)C++是大小写敏感的语言。答案为:将①中While改为while。

(3)本题目的是完成1到100求和,结果放在sum中,但是sum在参与运算前应该首先对其赋值。答案为:将①改为 int i=1,sum=0;

(4)本题主要考查对do?while的语法结构的掌握以及与while结构进行对比区别两者在作用和语法上的不同。答案为:将第④行while后加分号即while(i<=100);

例题4:循环语句for(int i=0;i<=5&&!i;i++) cout<

本题考查对for循环的理解以及表达式运算。执行for循环i的初值为0,第一次循环时表达式0<=5&&!0结果为1所以执行循环体输出0;然后i自加为1,计算表达式1<=5&&!1结果为0,所以退出循环。答案为:a。

例题5:程序段:

int i,sum=0;

for(i=1;i<=100;sum+=i,i++);

与上边程序段不等价的是( )。 (a) int sum=0,i=1;

do{

sum+=i++;

}while(i<=100);

(b) int i=1,sum=0;

while(i<=100) { sum+=i++; }

(c) int i=1,sum=0;

while(1) {

if(i>100) break; sum+=i++; }

(d) int i,sum=0;

for(i=1;i<=100;i++,sum+=i); 解答:

本题主要考查对各种循环结构的以及它们之间转换关系的理解。本题中的程序段是求解1到100的和,循环结束后i的值为101,sum的值为5050。选项a、b分别用do?while和while循环完成求解1到100的和;选项c是永真循环,通过break语句退出循环,其作用也是求解1到100的和;选项d中i先自加然后求和,其作用为求解2到101的和,循环结束后i的值为101,sum的值为5150。答案为:d。

例题6:运行下列程序的结果为(1)____________________。(2)___________________。 (1)

#include void main() {

int x,y,cmultiple;

cout<<\输入两个整数:\ cin>>x>>y; cmultiple=x; while(1) {

if(cmultiple%y==0)break;