第三章基本控制结构基本控制结构
§ 3.1 程序的基本控制结构
§ 3.2 选择结构
§ 3.3 循环结构
§ 3.4 跳转语句
§ 3.5 简单程序设计举例
§ 3.1 程序的基本控制结构
语句
语句的分类语 句
语句是 C++中可以执行的基本单元
程序的执行过程就是语句的执行过程
多个语句构成函数,函数是 C++程序的主要模块语句的分类 1(形式)
简单语句单个语句,以分号结尾空语句,只有一个分号。
复合语句多个简单语句构成的逻辑语句语句的分类 1(形式)
简单语句
a=b+c;
复合语句
{
temp=a;
a=b;
b=temp;
}
注,1)用大括号括起来等价于一个单语句
2),}”后不用分号语句的分类 2(功能)
说明和定义语句
表达式语句
流程控制语句
其他标号语句
try--throw--catch语句说明和定义语句
说明或定义程序中用到的变量、常量、函数、

int grade; //变量说明
const float PI=3.14; //常量定义
void swap(int &a,int &b); //函数说明
class PEOPLE //类定义
{
….
};
表达式语句
进行数据输入、输出、运算或者赋值
输入语句 cin>>a;
赋值语句 a=b+c;
运算语句 a++;
输出语句 cout<<a;
函数调用语句 swap(a,b);
返回语句 return a+b;
空语句 ;
流程控制语句
控制程序以 非顺序 的方式执行语句
分支语句 (if,switch)
循环语句 (do…while,while,for)
跳转语句 (break,continue,goto)
此外,C++还提供了上述三种控制结构的若干变形程序的执行流程顺序 分支 循环语句 1
语句 2
语句 3
语句 1
语句 2
条 件语句 1 语句 2
§ 3.2 选择结构
if 语句
switch 语句
if 语句
形式一:
if (条件表达式)语句或者 if (条件表达式)
{
….
}
if 语句
形式二:
if (条件表达式)
语句 1
else
语句 2
if (条件表达式)
{
….
}
else
{
….
}
if 语句可以嵌套
If( 条件 1)
语句 1
else if( 条件 2)
语句 2
…….
else if( 条件 n)
语句 n
else
语句 n+1
条件 1
条件 2
条件 n
语句 n+1 语句 n
语句 2
语句 1
……
if--else语句的模糊性
if (表达式 1)
if (表达式 2)
语句 1
else
语句 2
if--else语句的模糊性
else 子句总是与 最后出现的,
还没有 else 与其配对的 if 相匹配
if--else语句的模糊性
if (表达式 1)
if (表达式 2)
语句 1
else
语句 2
if (表达式 1)
{
if (表达式 2)
语句 1
else
语句 2
}
if 语句与条件运算
当 if语句中的两个子语句都是简单语句时,可以用条件运算 (?:)代替 if语句例,if(i>j)
max=i;
else
max=j;
max=(i>j)?i:j;
if 语句与条件运算
注意:条件运算是右结合例,int a=1,b=2,c=3,d=4,e=5,f=6;
(a>b)? c,(d>c)? e,f;
相当于:
(a>b)? c,((d>c)? e,f);
if 语句 ---举例例 1,从键盘上输入两个浮点数,编程比较大小
if 语句 ---举例例 1,从键盘上输入两个浮点数,编程比较大小
#include<iostream.h>
void main( )
{
float x,y;
cout <<,Input x,y:”;
cin >> x >> y;
if (x!=y)
if (x>y)
cout <<,x>y\n”;
else
cout <<“x<y\n”; 执行该程序,屏幕显示:
else Input x,y:
cout <<,x=y\n”;
}
if 语句 ---举例例 2,(3,10)
分析下列程序的输出结果,并指出程序中的 else子句是与哪个 if 配对的。
例 3,(15,20)
例 2,#include<iostream.h>
void main( )
{
int i=7,j=5;
if (i!=j)
if (i==j)
{
i+=8;
cout<<i<<endl;
}
else
{
j-=2;
cout<<j;
}
cout<<i+j<<endl;
}
例 3,#include<iostream.h>
void main( )
{
int i=7,j=5;
if (i!=j)
{
if (i>=j)
{
i+=8;
cout<<i;
}
}
else
{
j-=2;
cout<<j<<endl;
}
cout<<i+j<<endl;
}
switch 语句
switch 语句结构图
switch 语句的定义
使用 switch语句的注意事项
switch 语句的执行流程
switch 语句举例
switch 语句开关语句见书 56页 例 3.2.4
switch 语句
switch(表达式 0)
{
case 常量表达式 1:
语句组 1
break;
case 常量表达式 2:
语句组 2
break;
……
case 常量表达式 n:
语句组 n
break;
default:
语句组 n+1
break;
}
整型的常量表达式表达式的值不能相等当表达式 0与所有表达式的值不等时,
执行 default语句组使用 switch语句的注意事项
1,表达式 0必须与表达式 1,…,表达式 n
的类型相同
2,表达式 1,…,表达式 n的结果必须互不相同
3,default部分可有可无
4,break语句起了中断的作用,哪个 case执行完就应退出。
使用 switch语句的注意事项
5,break语句可以没有,case语句后的语句组也可以为空,为空时则执行下面一个语句组,因此,可以出现多个
case共用一个语句组
6,if 后面是条件表达式,switch 后面是整型的常量表达式
7,switch语句可以嵌套
switch 语句的执行流程
break语句的作用
exp0
default
没有 default子句
y
y
y
n
n
n
0?=1
0?=2
0?=n
stat1
stat2
stat n
y
y
y
n
没有 break语句没有 default子句

exp0
0?=1
0?=2
0?=n
stat1
stat2
stat n
default
n
n
… …
switch 语句举例
例 1,编程实现两个浮点数的四则运算
例 2,分析程序的输出结果(程序中出现了开关语句的嵌套使用)
#include <iostream.h> //编程实现两个浮点数的四则运算
void main( )
{
double d1,d2;
char op;
cout <<“input d1 op d2:”;
cin >> d1>> op >>d2;
switch(op)
{
double temp;
case?+?,temp=d1+d2;
cout<<d1<<op<<d2<<?=?<<temp<<endl;
break;
case?-?,temp=d1-d2;
cout<<d1<<op<<d2<<?=?<<temp<<endl;
break;
case?*?,temp=d1*d2;
cout<<d1<<op<<d2<<?=?<<temp<<endl;
break;
case?/?,temp=d1/d2;
cout<<d1<<op<<d2<<?=?<<temp<<endl;
break;
default,cout<<“error!\n”;
}
}
例 1程序的运行结果执行该程序输出结果如下:
input d1 op d2,4.6 * 5.2
输出结果为:
4.6 * 5.2 = 23.92
例 2:
#include<iostream.h>
void main( )
{
int a=1,b=6,c=4,d=2;
switch(a++)
{
case 1,c++; d++;
case 2,switch(++b)
{
case 7,c++;
case 8,d++;
}
case 3,c++; d++;
break;
case 4,c++; d++;
}
cout<<c<<?,?<<d<<endl;
} //程序执行结果?
§ 3.3 循环结构
while语句
do…,while语句
for语句
while语句
一般形式:
while (表达式 )
{
语句组;
}
特点:先判断条件,当表达式为真时执行循环体的语句条 件循环体
0
非 0
while语句的使用说明
执行该循环语句,先计算给定的条件表达式的值
如果第一次计算表达式的值就为 0,则循环体中的语句一次都不执行,直接退出循环
如果给定循环条件表达式的值永远为非 0,则无限制地执行循环体,也称?死循环?应避免
循环可以嵌套
while语句 ----举例
例,编程求出自然数 1至 100之和
while语句 ----举例
例,编程求出自然数 1至 100之和
#include<iostream.h>
void main( )
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
cout<<“sum=”<<sum<<endl;
}
while语句 ----例题分析
程序执行结果:
sum=5050
如果将循环体语句改为:
sum+=i++;
是否可行?程序执行结果?
如果将循环体语句改为:
sum+=++i;
是否可行?程序执行结果?
do---while语句
一般形式:
do
{
语句组;
} while (表达式 );
特点:
先执行,再判断,至少执行一次循环体循环体条 件
0
非 0
do---while语句与 while语句
do---while语句也可写成 while语句的形式,相当于:
语句;
while(表达式)
{
语句组;
}
do-while语句 ----举例
用 do—while语 句编程,求出自然数 1至 100之和程序,#include<iostream.h>
void main( )
{
int i=1,sum=0;
do
{
sum+=i++;
} while(i<=100);
cout<<“sum=”<<sum<<endl;
}
程序执行结果:
for 语句
一般形式:
for(表达式 1;表达式 2;表达式 3)
{
语句组;
}
特点:可用于循环次数确定的情况
for 语句说明
说明:
表达式 1:初始化表达式表达式 2:条件表达式(相当于 while后面的表达式)
表达式 3:增量表达式表达式 1,2,3均可省略,但分号不能省略
for 语句执行过程
for(d1;d2;d3)
{
语句组;
}
d2=0 退出循环计算 d1 计算 d2
d2!=0 执行循环体,计算 d3,再回到计算 d2
for 循环结构初始化语句 d1
循环条件 d2
循环体循环增量 d3
0
非 0
for 语句与 while语句
for 语句也可用 while语句来代替表达式 1;
while(表达式 2)
{
语句组;
表达式 3;
}
for 语句 ----举例
使用 for循环求 1至 100自然数之和形式一,#include<iostream.h>
void main( )
{
int sum=0;
for(int i=1; i<=100; i++)
{
sum+=i;
}
cout<<“sum=”<<sum<<endl;
}
(三个表达式都有)
for 语句 ----举例形式二:
#include<iostream.h>
void main( )
{
int i=1,sum =0;
for(; i<=100; i++)
{
sum+=i;
}
cout<<“sum=”<<sum<<endl;
}
( 缺省表达式 1,即在循环之前先计算表达式 1)
for 语句 ----举例形式三,
#include<iostream.h>
void main( )
{
int i=1,sum =0;
for(; i<=100;)
{
sum+=i++;
}
cout<<“sum=”<<sum<<endl;
}
( 缺省表达式 1和表达式 3)
for 语句 ----举例形式四,
#include<iostream.h>
void main( )
{
int i=1,sum =0;
for(;;)
{
sum+=i;
if (i==100)
break;
i++;
}
cout<<“sum=”<<sum<<endl;
} ( 三个表达式都省略)
for 语句 ----举例形式五,
#include<iostream.h>
void main( )
{
for(int i=1,sum =0;i<=100; sum+=i,i++);
cout<<“sum=”<<sum<<endl;
}
( 将循环体合并到表达式 3)
for 语句 ----例题 2
分析程序的输出结果
#include<iostream.h>
void main( )
{
for(int i=0; i <9; i ++)
{
if (i= =3)
{
cout<<i<<endl;
break;
}
cout<<++i<<endl;
}
}
for 语句 ----例题 3
编程求 π 的近似值,使用如下公式:
π/4=1 -1/3+3/5-5/7+……
直到最后一项的绝对值小于 1e-6(10-6)
为止
#include<iostream.h>
#include<math.h>
void main( )
{
double x=1,s=0;
for(int i=1; fabs(x)>=1e-6; i++)
{
x*=(-1.0)*(2*i-3)/(2*i-1);
s+=x;
}
s*=4;
cout<<“pi is:,<<s<<endl;
}
for 语句 ----例题 3分析
程序执行结果:
pi is,3.14159
分析:
从公式已知,假设第 i项为 x,则第 i+1项的
x*(-1)*(2*i-3)/ (2*i-1),直到第末项小于
1e-6为止
fabs( )是求浮点数绝对值函数,包含在
math.h文件中多重循环
循环可以嵌套
三种循环可以自身嵌套、相互嵌套注意:在嵌套循环时,在一个循环体内应包含另一个完整的循环结构下面列举几个合法嵌套的格式:
do—while循 环的嵌套
do
{
……
do
{
……
}while(…);
……
……
}while(…);
for循 环内嵌套 while循 环
for(……)
{
……
while(……)
{
……
}
……
}
while循 环内嵌套 for循 环
while(……)
{
……
for(……)
{
……
for(……)
{
……
}
……
}
……
}
while循 环内嵌套 do—while循 环
while(……)
{
……
do
{
……
}while(……);
……
}
for循环内嵌套 while和 do—while循 环
for(……)
{
……
while(……)
{
……
}
……
do
{
……
}while(……);
……
}
§ 3.4 跳转语句
break语句
continue语句
goto语句
三种跳转语句比较跳转语句 ---break
while
do…while
for
switch
break
循环循环的正常出口跳转语句 ---break
语句格式:
break ;
该语句在程序中可用于下面两种情况:
1、用在 switch语句的语句序列中,用来跳出
switch结构。
2、用在循环语句的循环体中,用来退出循环。
在多重循环中,break只能退出它所在的那重循环。
break语句 ---举例编程求出从键盘上输入的若干个正数之和,遇到负数时终止输入,输入的个数不超过 10个
#include<iostream.h>
void main( )
{
const int M=10;
int num,sum=0;
cout<<“Input number:”;
for(int i=0; i<M; i++)
{
cin>>num;
if(num<0)
break;
sum+=num;
}
cout<<“sum=“<<sum<<endl;
}
跳转语句 ---continue
continue
中断当前循环,转去执行下一次循环循环循环出口跳转语句 ---continue
语句格式:
contiune;
该语句用在循环语句的循环体中,
用来结束本次循环,继续判断是否执行下一次循环。
continue语句 ---举例编程求出从键盘上输入 10个数中所有的正数之和,负数不进行求和计算,并输出其结果
#include<iostream.h>
void main( )
{
const int N=10;
int num,sum=0;
cout<<“Input number:”;
for(int i=0; i<N; i++)
{
cin>>num;
if(num<0)
continue;
sum+=num;
}
cout<<“sum=“<<sum<<endl;
}
跳转语句 ---goto
中断程序的正常执行,
跳转到同一函数的指定标号处 goto
函数内的任何地方跳转语句 ---goto
语句格式:
goto <语句标号 >;
其中:
goto 是 c++的保留字语句标号用 c++允许的标识符,后跟冒号语句标号,一般放在语句行的左边跳转语句 ---goto
注意,
1,goto语句是一种非结构化控制语句,
使用它将在一定程度上破坏结构化,
因此在程序中尽量少用这种语句
2,c++规定该语句只能在一个函数体内转向
3、在一个函数体内,语句标号须唯一
goto语句 ---例 1
例 1,找到一对乘积为 50且都小于 10的两个数
for(int i=1; i<10; i++)
for(int j=1; j<10; j++)
if(i*j= =50)
goto END;
//其他语句
END,cout<<i<<?*?<<j<<“=50”;
goto语句 ---例 2
编写程序:
从一个已知的二维数组中查找出第一次出现负的数组元素
#include<iostream.h>
void main( )
{
int j,num[2][3];
cout<<“Enter 6 digiters:”;
for(int i=0; i<2; i++)
for (int j=0; j<3; j++)
cin>>num[i][j];
for(int i=0; i<2; i++)
for (int j=0; j<3; j++)
if(num[i][j]<0)
goto found;
cout<<“no find!\n”;
goto end;
found:
cout<<“num[“<<i<<“][“<<j<<“]=“<<num [i][j]<<endl;
end:;
}
跳转语句的比较
break continue
goto label
label:
简单程序设计 ----举例
例 1,编程统计从键盘上输入的数字和字符中每种数字的个数和其他字符的个数,以字符‘ #’作为输入结 束符
例 2,编程求出 3到 100之间的所有素数
例 3,编程显示如下图形
例 4,分析程序的执行结果简单程序设计 ----例 1
例 1:
编程统计从键盘上输入的数字和字符中每种数字的个数和其他字符的个数,
以字符‘ #’作为输入结束符简单程序设计 ----例 2
例 2:编程求出 3到 100之间的所有素数素数是一种只能被 1和本身整除的自然数
#include<iostream.h>
void main()
{
const int MIN=3;
const int MAX=100;
int i,j,n=0;
for(i=MIN; i<MAX; i+=2;)
{
for(j=2; j<i; j++)
if(i%j==0)
break;
if(j==i)
{
if(n%6==0)
cout<<endl;
n++;
cout<<’ ‘<<i;
}
}
cout<<endl;
}
简单程序设计 ----例 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
简单程序设计 ----例 3
例 3:编程显示如下图形:
1
2 23 3 3
4 4 4 45 5 5 5 5
6 6 6 6 6 67 7 7 7 7 7 7
8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9
10 10 10 10 10 10 10 10 10 10
#include<iostream.h>
void main( )
{
for(int i=1; i<=10; i++)
{
for(int j=0; j<=25-2*i; j++)
cout<<;
for(j=1; j<=i; j++)
{
if(i==10)
cout<<i<<“,;
else
cout<<i<<“,;
}
cout<<endl;
}
}
简单程序设计 ----例 4
例 4:分析程序的执行结果
#include<iostream.h>
void main( )
{
for(int i=5; i>=1; i--)
{
for(int j=1;j<=i; j++)
cout<<?&?;
for(j=1;j<=5-i; j++)
cout<<;
cout<<endl;
}
}