第 4章
C++的流程控制语句
C++的语句分类表达式语句,有返回值的语句,如 a= =b;
声明语句,对变量、类、函数等声明,如,int a;
空语句,仅由分号组成,如,;
函数调用语句,用于调用函数,如,sin(x);
块语句,多个语句的组合,如:
{int a,b=1; a=b*2; cout<<a; }
控制语句,改变语句的执行次序,如:
if(a>b) max=a; else max=b;
说明语句,对结构、变量进行定义、描述的语句。
C++语言的语句和程序结构程序的三种基本结构
1.顺序结构,按顺序依次执行各语句。
2.选择结构,根据执行结果选择某一语句。
如:若 x>1,则 y=5
若 x<1,则 y=-5
3.循环(重复)结构,根据条件反复执行一个语句或若干个语句。
B
A A
B
NS图流程图顺序结构选择结构语句条 件 语 句
if 条件语句:
if(expression)
statement;
if(expression)
statement1;
else
statement2;
假 真
Exp.
Stat.
假 真Exp.
Stat.1.Stat.2
B
N
A
Y
条 件 P
A B
Y
条 件 P
NS图例 1,if( x>1.5) y+=5;
y=x*x+5*x;
例 2,s=0;
if( a) s=100;
s+=200;
cout<<“s=”<<s<<?\n?;
假 真if(a>b)
cout << a;cout << b;
结果,max(a,b)=3
例 3,#include<iostream.h>
void main( ){
int a=1,b=3;
cout << " max(a,b)= ";
if( a>b ) cout << a;
else cout << b;
}
41
42
例 4,从键盘上输入三个整数,利用二中选一条件语句,输出三个数中的最大数。
分析,先用 cin语句从键盘上读入三个整数,前两个比较,求出较大者,再与第三个比较求出最大数。
例 5,求一元二次方程
ax2+bx+c=0
的解。其中系数 a,b,c从键盘上输入。
分析,输入系数后,用判别公式判断有没有根。
注意,若 statement 也是一个 if 结构的嵌套的语句,则 else 与最近的未配对的 if 匹配,如果在 if
和 else 后有多个语句,则要用花括弧括起来,即:
if(exp.) {stat1; stat2; …… }
else if (exp.) {stat1; stat2;…… }
else if ……
else {stat1; stat2;…… }
例 4,求 a,b,c中的最大值。
if(c>b) // c>b
if(c>a) max=c; // c>a,max=c
else max=a; // a>=c,max=a
else // c<=b
if(b>a) max=b; //b>a,max=b
else max=a; //b<=a,max=a
43
44 条件运算符,?:,
一般格式:
<表达式 1>? <表达式 2>,<表达式 3>
功能,计算表达式 1的值,若不为 0,计算表达式 2,
该值作为计算结果,否则计算表达式 3,其值作为计算结果。
这是一个三元运算符。
例 5,判断输入字符的种类。把字符分为五类:数字、
大写字母、小写字母、控制字符(其 ASCII的编码小于 32)和其他字符。
如求二个数中的大数可用语句:
max=a>=b?a:b;
即 if(a>=b)max=a;
else max=b;
三元运算左结合。
如 z=a>b?a:c>b?c:d;
三元运算可嵌套使用。
如三个变量 a,b,c中取最大值可如下表示:
max=(a>=b?a:b)<c?c:(a>=b?a:b);
即 max=(t=a>=b?a:b)<c?c:t;
即 if(a>=b)t=a;
else t=b;
if(t<c)max=c;
else max=t;

a=1,b=2,c=3,d
=4,则结果 z=3
开关 语句 switch,多情况选择形式? switch (expression){
case c1,statements;
break;
case c2,statements;
break;
case c3,statements;
break;
default,statements;
}
流程? 先计算 exp 的值,再执行相应的语句,
若表达式的值不在 {ci}之内,执行
default 语句。
expression
switch 语句:多情况选择流程
case a stats,breakT
F…
case y stats,break
case z stats,break
T
F
T
F
default stats.
input an integer,2
two
结果?
例 6,#include <iostream.h>
void main(void)
{ int m;
cout << "\n input an integer:" ;
cin >> m;
switch(m)
{ case 1,cout << "one"<< endl; break;
case 2,cout << "two" << endl; break;
case 3,cout << "three" << endl; break;
default,cout << "default" << endl;
}
}
switch 语句注意点
case 后的常量类型 = switch中表达式类型
这些类型只能为,int,char,enum
在每个 case 中,必须加入 break,,以达到仅选一种的目的。
当省略 case后面的语句时,可实现多个入口,
执行同一个语句序列。如:
int digit,white,other;
char c;

switch( c) {
case?0?:
case?1?:
case?2?:
case?3?:
case?9?,digit++; break;
case:
case?\n?:
case?\t?,white++; break;
default,other++;
}
当字符变量 c的值为‘ 0?、
‘ 1?、‘ 2?、
‘ 3?、‘ 9?时,
均执行同一语句。
再如下列程序段:
float x;
int a,b;

a=3; b=4;
switch(x*2){ //x*2为实数,不允许
case 2.5,… // 2.5为实数,也不合法
case a+b,… // 不是常量表达式,不合法
case 1,2,3,… // 不合法
}
注意,由于开关语句的限制,故不同的内容需要可选择不同的语句。
例 7,运输公司对所运的物品分段进行计费。设距离为 s,则计算运费时打折的情况为:
s<250 没有折扣
250<=s<500 2%折扣
500<=s<1000 5%折扣
1000<=s<2000 8%折扣
2000<=3<3000 10%折扣
3000<=s 15%折扣设每公里每吨的基本运费为 p,货物的重量为 w,折扣为 d%,则总的运费 f的计算公式为:
f=p*w*s*( 1-d/100.0)
设计一个程序,当输入 p,w和 s后,计算其运费 f。
分析,按照打折情况分析,当输入距离 s后,可将它除以 250,取其整数商。
45
例 8,用条件语句实现上例中运费的计算。
46
例 9,设计一个程序,实现简单的计算器功能,
即能完成加、减、乘和除运算。如输入:
2.5*4
则输出为:
2.5*4=10 47
循环结构语句,while 和 do/while
形式? while (condition){
statements;
}
do {
statements;
} while (condition);
区别?while,先验证条件,再执行语句
do/while,先执行语句,再验证条件注意? 不能死循环,即无限循环。
while 和 do/while 执行流程
statements
con
d.
F
T
do/while
statements
cond,F
T
while
例 10,#include<iostream.h>
void main( )
{ int count=1; //如果 count=11,结果如何?
while (count<=10)
{ cout << count << " " ; count++; } }
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
结果?
#include<iostream.h>
void main( )
{ int count=1; //如果 count=11,结果如何?
do { cout << count << " " ; count++;
} while (count <=10); }
例 11,利用 while()语句求 S=1+2+3+…+100 。
48本例也可用如下程序实现:
#include <iostream.h>
void main( void) {
int i=1,s=1;
while( ++i<=100)s+=i;
cout<<"s="<<s<<'\n';
}
例 12,利用 do…while ()语句求 S=1+2+…+100 。
49
分析,把输入的正数赋给 a,并把 a/2的值作为 x0
的初值,根据以上公式就可以求出 x1,若 |x1-
x0|<10-5,则 x1就是所求平方根的近似值;否则将 x1赋给 x0,再根据公式求出 x1。重复以上过程,直到 |x1-x0|<10-5为止。 410
例 13,用迭代法求 x=√a的近似值。
求平方根的迭代公式为:
x n+1=( x n+a/x n) /2
要求前后两次求出的根的近似值之差的绝对值小于 10-5。
也可用 while语句求解。 4101
重复控制语句,for
形式? for(exp1; exp2; exp3)
statement;
exp1,初始化表达式
exp2,判断条件表达式
exp3,修正表达式
statement,循环体exp1
exp
2 exp3statement
判断条件
T
F
表达式 2
语句表达式 1
表达式 3
真 假
for(表达式 1;表达式 2;表达式 3)语句;
例 14,生成 n项 Fibonacci数列:
Fib(n)=1,n<3; Fib(n)=Fib(n-1)+Fib(n-2),n? 3
#include <iostream.h>
void main( void ) {
int f1,f2,f3,terms,n; //定义变量
cout << " input an integer,"; //输出提示
cin >> terms; // 读入所输入的整数
if(terms>2) //判断输入是否 大于 2
{f1=f2=1; cout <<f1<< ";" <<f2<< "; "; //输出前两项
for(n=3; n<=terms;n++) //从 3到 terms 的循环体
{ f3=f1+f2; //计算新值
cout << f3 << "; "; //输出新值
f1=f2; f2=f3; } //更新 f1和 f2,注意赋值次序 }
}
else //terms小于 3
{ for(n=1; n<=terms; n++) //从 1到 terms 的循环体
cout << 1 << "; "; } }
414
4141
For语句的一些注意事项
1.防止无限循环
2.循环体有多条语句时,要加 { }
3.表达式可缺省,但分号不能省,如
int n=1;
for( ; n<10; n++)
4.变量可在表达式中声明:
for(int n=1; n<10; n++)
例 15,输入一行字符,并按输入的顺序依次输出该行字符。
分析,依次从输入缓冲区中读取一个字符,并输出一个字符,直到读取的字符是换行字符为止。
411
三种循环的比较
1.for与 while均先判断条件,循环体有可能不执行,
而 do while先执行,故循环体至少执行一次。
2.不同情况作不同选择,建议先考虑 for及 while循环。
注,循环可嵌套进行。即在循环语句内嵌循环语句。
例 16,打印一张下三角形的九九表。其格式为:
1 2 3 4 5 6 7 8 9
1 1
2 2 4
3 3 6 9
4 4 8 12 16

9 9 18 27 36 45 54 63 72 91
分析,先输出表头(第一行),用一个变量 i来控制要输出的行数(共 9行),i的取值从 1~9,可用一个循环(外循环)来实现。对于 i的每一个取值,要输出一行,用另一个变量 j来控制该行输出的列数,变量 j的取值从 1~i,这也要用一个循环(内循环)来控制。所以要用两重循环实现。
412
控制执行顺序的语句
4个转向语句,break,continue,return,goto
break,中止所在的循环或用在 switch中
continue,不执行循环体中 continue后面部分
return,中止并返回调用函数处
goto,软件开发中尽可能不用
2个中止函数,exit( ),abort(),
它们将中止程序的执行。
例 17,打印 3到 20之间的全部素数。
#include <iostream.h>
void main( ) {
cout << "The primes in [3,20] are,"<<endl;
for(int i=3; i<=20; i++) //从 3到 20的循环体
{ int p=1; //1=素数; 0=非素数
for(int j=2; j<=i/2; j++) { //从 1到 i/2的循环体
if(i%j= =0) // i被 j整除
{ p=0; //是非素数
break; } } //中止对 j的循环
if(p= =0)continue; //若是非素数转向到 i++
cout << i << ","; //输出素数 i
} }
执行结果,3,5,7,11,13,17,19
415
exit( )和 abort( )函数均包含在头文件 stdlib.h中,
前者正常终止程序,后者异常终止程序。
exit( )函数的格式,exit(<表达式 >);
表达式的值为整数,0为正常退出,其余为异常退出。退出前作收尾工作,如关闭文件,释放空间等。
abort( )函数的格式,abort( );
括号中不含任何参数。退出前不作收尾工作。
例 19,用 C++产生随机数的库函数,设计一个自动出题的程序,可给出加、减、乘三种运算。
做这三种运算也由随机数来确定。两个操作数的取值范围为 1~9。共出 10题,每题 10分,最后给出总的得分。
分析,可利用库函数 rand( )产生一个随机正整数,该正整数模 10后在 0~9之间。库函数 rand( )
包含在头文件 stdlib.h中。
416
课堂总结
基本语句中的控制语句,
if/else,单选
switch,多种选择
do/while,循环语句,不能无限循环
for,循环语句,不能无限循环
转向语句和中止语句
break,continue,注意两者的区别
return,中止函数的执行,回到函数调用处
exit( ),中止程序的执行
2009-7-28 37
习题课一、作业中问题
1.P30,第 7题、第 11题、第 14题。
2.P37,第 1题、第 4题。
3.P60,第 7题、第 8题。
2009-7-28 38
P60,7
#include<iostream.h>
void main(){
int i;
float a,avg,sum=0;
for(i=1;i<=10;++i){
cout<<"输入第 "<<i<<"个数,";
cin>>a;
cout<<'\n';
sum+=a;
}
cout<<"10个数的和 sum="<<sum<<'\n';
cout<<"10个数的平均 avg="<<sum/10<<'\n';
}
2009-7-28 39
P60,8
#include<iostream.h>
void main(){
int i,n,y=0,k,j;
cout<<"请输入 n的值,";
cin>>n;
cout<<'\n';
for(i=1;i<=n;++i){
k=1;
for(j=1;j<=i;++j)
k*=j;
y+=k;
}
if(n==1)cout<<"1!=1"<<'\n';
else if(n==2)cout<<"1!+2!=3"<<'\n';
else{
cout<<"n为,"<<n<<'\n';
cout<<"1!+2!+…+"<<n<<"!="<<y<<' \n';
}}
2009-7-28 40
也可用如下方法编程:
#include<iostream.h>
void main(){
int i,n,y=0,k=1;
cout<<"请输入 n的值,";
cin>>n;
cout<<'\n';
for(i=1;i<=n;++i){
k*=i;
y+=k;
}
if(n==1)cout<<"1!=1"<<'\n';
else if(n==2)cout<<"1!+2!=3"<<'\n';
else{
cout<<"n为,"<<n<<'\n';
cout<<"1!+2!+…+"<<n<<"!="<<y<<' \n';
}
}
2009-7-28 41
二、例题
1.下列程序的输出结果是 _______。
#include <iostream.h>
void main( ){
int a=0,b=1,c=0,d=20,x;
if(a)d - =10;
else if(!b)
if(!c)x=15;
else x=25;
cout<<,d=”<<d<<endl;
}
d=20
2009-7-28 42
2.下列程序的输出结果是 ________。
#include <iostream.h>
void main( ){
int x=3;
do{
cout<<(x - =2)<<?\t?;
}while(!(- -x));
}
1 -2
2009-7-28 43
3.下面程序的执行结果是 ______。
#include <iostream.h>
void main( ){
int i;
for(i=4;i<=10;i++){
if(i%3==0)continue;
cout<<i;
}
cout<<endl;
}
457810
2009-7-28 44
4.已知,int i=5;下面 do-while循环语句的次数是
_____。
do{
cout<<i- -<<endl;
i- -;
}while(i!=0);
无限
2009-7-28 45
5.编程求 1到 100之间满足条件个位数为 6,且能被 6
整除的所有整数。
#include <iostream.h>
void main(){
int i,a;
for(i=1;i<100;i++){
a=i%10;
if(a==6&&i%6==0)
cout<<i<<" ";
}
cout<<'\n';
}
2009-7-28 46
还可以这样编:
#include <iostream.h>
void main(void) {
for(int i=0;i<=9;i++)
if((i*10+6)%6==0)
cout<<i*10+6<<'\t';
cout<<endl;
}
2009-7-28 47
6.鸡兔共有 30只,脚共有 90只,编写一个程序计算鸡兔各有多少只。
#include <iostream.h>
void main(void) {
for(int i=0;i<=30;i++)
for(int j=0;j<=30;j++)
if((i+j==30)&&(i*2+j*4==90))
cout<<"鸡,"<<i<<",兔,"<<j<<endl;
}
结果:
鸡,15,兔,15
2009-7-28 48
7.设计一个程序,按以下公式求出数列的前 20项并输出。计算公式为:
0 n=0
1 n=1
y= 2 n=2
yn-1+yn-2+yn-3 n>2
#include<iostream.h>
void main(){
int n,y0,y1=0,y2=1,y3=2;
cout<<"y1=0"<<"\ny2=1"<<"\ny3=2"<<'\n';
for(n=3;n<20;n++){
cout<<"y"<<n+1<<"="<<y1+y2+y3<<'\n';
y0=y1;y1=y2;y2=y3;y3=y1+y2+y0;
}
}
2009-7-28 49
#include<iostream.h>
void main(){
int n,y0,y1=0,y2=1,y3=2;
for(n=0;n<=3;n++){
switch(n){
case 0:cout<<"y1="<<y1<<'\n';break;
case 1:cout<<"y2="<<y2<<'\n';break;
case 2:cout<<"y3="<<y3<<'\n';break;
default:for(;n<20;n++){
cout<<"y"<<n+1<<"="<<y1+y2+y3<<'\n';
y0=y1;y1=y2;y2=y3;y3=y1+y2+y0;
}
}
}
}
2009-7-28 50
8.设计一个程序,输入一个四位数(整数),求出各位数字之和。
#include <iostream.h>
void main(){
int i,k,l,j,s=0;
cout<<"请输入一个四位整数,";
cin>>k;
j=k;
for(i=1;i<=4;++i){
l=j%10;
j=j/10;
s+=l;
}
cout<<"四位整数为,"<<'\n';
cout<<'\n'<<k<<"的各位数字之和为,"<<s<<'\n';
}