第 3章 结构化程序设计
3.1 C++输入输出流
3.2 结构化程序设计概述
3.3 顺序结构程序设计
3.4 选择结构程序设计
3.5 循环结构程序设计
3.6程序设计举例
3.1 C++输入输出流
C++语言程序设计 第三章 结构化程序设计
在 C++中,将数据从一个对象到另一个对象的流动抽象为
,流, 。从流中获取数据的操作称为提取操作,向流中添加数据的
操作称为插入操作。数据的输入输出是通过输入输出 I/O流来实现
的。
C++提供了 I/O流机制,完成对输入输出的操作管理,包括流
输入和流输出。 cin和 cout是预定义的流对象。 cin用来处理标准输
入,即键盘输入; cout用来处理标准输出,即屏幕输出。由于 cin和
cout被定义在, iostream.h”头文件中,在使用它们之前,要用预编
译命令, #include”将, iostream.h”(即所使用的头文件)包括到
用户的源程序中。即源文件中需有,
#include <iostream.h>
C++语言程序设计 第三章 结构化程序设计
3.1.1 C++无格式输入输出
,<<”是预定义的插入符,使用, <<”向 cout输出流中插入数据,
便可实现在屏幕上显示输出。格式如下,
cout<<表达式 1<<表达式 2 … <<表达式 n;
或分成多行,
cout<<表达式 1
<<表达式 2
…
<< 表达式 n; //输出效果同单行格式
在输出语句中,可以连续使用多个插入操作符,输出多个数
据项。
1.无格式输出 cout,
C++语言程序设计 第三章 结构化程序设
计 【 例 3.1】 无格式输出 cout。
#include<iostream.h>
void main( )
{
cout<<”This is a program.\n”;
cout<<”This,<<”is,<<”a,<<”program.\n”; //连续使
用多个插入操作符
cout<<”This,
<<”is,
<<”a,
<<”program.\n”;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
This is a program,
This is a program,
This is a program,
在插入运算符后面可以写任意复杂的表达式,系统会自动计
算出它们的值,并传递给插入操作符。
【 例 3.2】 无格式输出 cout。
#include<iostream.h>
void main()
{ int a=10;
int b=20;
int c=30;
2,无格式输入 cin
C++语言程序设计 第三章 结构化程序设
计 cout<<a<<”\n”
<<b<<”\n”
<<c<<”\n”
<<(a+c)/(2*b)<<”\n”;}
程序的运行结果为,
10
20
30
1
,>>”是预定义的提取符,使用, >>”从 cin输入流中提取数据,
便可实现键盘输入。格式如下,
C++语言程序设计 第三章 结构化程序设计
cin >>数据 1>>数据 2 …>>数据 n;
也可写成多行,
cin>>数据 1
>>数据 2
…
>>数据 n;
cin在用于输入数据时,能自动识别变量位置和类型 。
例如,
float f; long l;
cin>>f>>l;
cin能知道提取变量的类型,它将对 f,l分别给出一个浮点型和
长整型数。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.3】 无格式的输入输出 cin。
#include<iostream.h>
void main()
{
int n1,n2;
cout<<"Please input 2 number\n==>";
cin>>n1>>n2; //键入数据,两数之间空格或回车键或
Tab键分隔
cout<<"The average of the 2
numbers\n==>"<<(n1+n2)/2<<"\n";
}
C++语言程序设计 第三章 结构化程序设
计
当使用 cin,cout进行数据的输入和输出时,不管处理何种类
型的数据,都能自动按照默认格式处理。但需要按特定的格式输入
输出时,默认格式就不能满足要求了 。例如对 double pi=3.1415;
如果需要输出 pi并换行,设置域宽为 5个字符,小数点后保留
两位有效数字,则简单的使用如下语句不能完成
cout<<pi<<”\n”; //系统默认显示 6位有效数字。
==>3 7
The average of the 2 numbers
==>5
程序的运行结果为,
Please input 2 number
3.1.2 C++格式输入输出
C++语言程序设计 第三章 结构化程序设
计 为此 C++提供了控制符( manipulators),用于对 I/O流的格式进行
控制。使用控制符,把上述语句改为如下形式则可以完成需求。
cout<<setw(5)<<setprecision(3)<<pi<<endl;
控制符是在头文件 iomanip.h中预定义的对象,可以直接插
入流中。使用控制符时,要在源文件中添加 #include<iomanip.h>预
处理命令。
常用控制符如表 3.1所示。
下面举例说明控制符用法,
【 例 3.4】 控制换行 endl的使用。
#include <iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设
计
控制符
描述
endl
插入换行符并刷新流
dec
数值数据采用十进制表示
hex
数值数据采用十六进制表示
oct
数值数据采用八进制表示
setiosflags(ios::uppercase)
设置 16进制数大写输出
resetiosflags(ios::uppercase)
取消 16进制数大写输出
setw(n)
设域宽为 n个字符
setfill(c)
设填充字符为 c
setprecision(n)
设显示小数精度为 n位
setiosflags(ios::fixed)
用定点方式表示实数
setiosflags(ios::scientific)
用科学计数法表示浮点数
setiosflags(ios::left)
左对齐
setiosflags(ios::right)
右对齐
setiosflags(ios::showpoint)
强制显示小数点和无效 0
setiosflags(ios::showpos)
强制显示正数符号
表 3.1 I/O流的常用控制符
C++语言程序设计 第三章 结构化程序设计
{int x=30,y=300,z=1024;
cout<<"Decimal:"<<x<<' '<<y<<' '<<z<<endl; //按十进
制输出
cout<<"Octal:"<<oct<<x<<' '<<y<<' '<<z<<endl; //按八进
制输出
cout<<"Hexadecimal:"<<hex<<x<<' '<<y<<' '<<z<<endl;//按
十六进制输出
cout<<setiosflags(ios::uppercase); //设置数值中字母大写
输出
cout<<"Hexadecimal:"<<x<<' '<<y<<' '<<z<<endl; //仍按
十六进制输出
cout<<resetiosflags(ios::uppercase); //设置数值中字母小
写输出
C++语言程序设计 第三章 结构化程序设计
{
cout<<”河北建筑工程学院, <<endl; //endl相当于 ’ \n’,使
以后的输出换行打印。
cout<<”计算机系, <<endl;
}
程序的运行结果为,
河北建筑工程学院
计算机系
【 例 3.5】 使用控制符 hex,oct和 dec控制输出 8进制,16进制
和 10进制数。
#include <iostream.h>
#include <iomanip.h>
void main()
C++语言程序设计 第三章 结构化程序设
计 cout<<"Hexadecimal:"<<x<<' '<<y<<' '<<z<<endl; //仍按十六进
制输出
cout<<“Decimal:”<<dec<<x<<? ?<<y<<? ?<<z<<endl; //恢复
按十 进制输出
}
程序的运行结果为,
Decimal:30 300 1024
Octal:36 454 2000
Hexadecimal:1e 12c 400
Hexadecimal:1E 12C 400
Hexadecimal:1e 12c 400
Decimal:30 300 1024
C++语言程序设计 第三章 结构化程序设
计 【 例 3.6】 使用 setw设置值的输出宽度。
#include <iostream.h>
#include <iomanip.h>
void main()
{
int a =10;
int b =1000;
cout <<setw(5)<<a<<"\n";
cout <<setw(2)<<b;
}
程序的运行结果为,
10
1000
C++语言程序设计 第三章 结构化程序设计
说明,
(1) setw操作符主要用来输出欲留空间格数,若空间多余则向
右对齐;若空间不够,按数据长度输出。
(2) setw操作符只对紧接其后的待输出变量有效。如,
int a=10,b=1000;
cout<<setw(5)<<a<<b; //setw(5)只对 a有效,输出结果第一位数字前
有三个空格
此程序段的运行结果为,101000
【 例 3.7】 用 setfill控制符设置填充字符
#include <iostream.h>
#include <iomanip.h>
void main()
C++语言程序设计 第三章 结构化程序设计
{
cout<<setfill(?*?) //设置填充符号为 "*"
<<setw(2)<<"OK"<<endl
<<setw(3)<<"OK"<<endl
<<setw(4)<<"OK"<<endl;
cout <<setfill(? ?); // 恢复默认设置,填充空格
}
程序的运行结果为,
OK
*OK
**OK
【 例 3.8】 控制浮点数值显示
//本程序分别用浮点, 定点和指数的方式表示一个实数
#include <iostream.h>
#include <iomanip.h>
void main()
{
double test = 22.0/7 ;
cout << test << endl ; //C++默认的流输出数值有效位为 6
cout << setprecision(0) << test << endl // C++最小有效位数
为 1,此处取 1
<< setprecision(1) << test << endl
<< setprecision(2) << test << endl
<< setprecision(3) << test << endl
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
<< setprecision(4) << test << endl ;
cout << setiosflags(ios::fixed) ;
cout <<setprecision(8) << test << endl ;
// setiosflags(ios::fixed) 与 setprecision(8)合用,控制小数点右边的
数字个数为 8
cout << setprecision(6) ; // 重新设置成 C++默认流输出
数值有效位
}
程序的运行结果为,
3.14286
3
3
C++语言程序设计 第三章 结构化程序设计
3.1
3.14
3.143
3.14285714
注:小数位数截短显示时,进行4舍5入处理。
【 例 3.9】 左右对齐输出。
#include <iostream.h>
#include <iomanip.h>
void main()
{
cout << setiosflags(ios::right) //设置右对齐输出,空格在
前
<< setw(5) << 1
C++语言程序设计 第三章 结构化程序设
计 << setw(5) << 2
<< setw(5) << 3 << endl ;
cout << setiosflags(ios::left) //设置左对齐输出,空格在后
<< setw(5) << 1
<< setw(5) << 2
<< setw(5) << 3 << endl ;
}
程序的运行结果为,
1 2 3
1 2 3
注:默认时,I/O流为左对齐显示内容。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.10】 强制显示小数点。
#include <iostream.h>
#include <iomanip.h>
void main()
{
double x=66,y=-8.246;
cout << x<< " " << y << endl ;
cout << setiosflags(ios::showpoint); //设置强制显示小
数点和无效 0
cout << x<< " " << y << endl ;
}
C++语言程序设计 第三章 结构化程序设计
66 –8.246
66.0000 –8.24600
【 例 3.11】 强制显示符号。
#include <iostream.h>
#include <iomanip.h>
void main()
{
double x=66,y=-8.246;
cout << x<< " " << y << endl ;
cout << setiosflags(ios::showpos); //设置强制显示正号
cout << x<< " " << y << endl ; }
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
66 –8.246
+66 –8.246
注:默认时,I/O流仅在负数之前显示值的符号。
3.2 结构化程序设计概述
1966年,Bohm和 Jacopini首次证明了只要三种控制结构,就能
表达一个入口和一个出口的框图(流程图)所能表达的任何程序逻
辑。这三种控制结构是 顺序结构、选择结构和循环结构 。
1968年 Dijksrea建议,GOTO语句太容易把程序弄乱,应从一
切高级语言中去掉;只剩 3种基本控制结构就可以写各种程序,而
这样的程序可以自顶向下阅读而不会返回。这促进了一种新的程序
设计思想、方法和风格的形成,以显著提高软件生产效率和降低软
件维护的代价。
C++语言程序设计 第三章 结构化程序设
计
1972年,Mills进一步提出程序只应有一个入口和一个出口,进
而填补了结构化程序设计的原则。结构化程序设计的概念和方法,
以及支持这些方法的一整套软件工具,就构成了所谓的, 结构化革
命, 。这是存储程序计算机问世以来对计算机界影响最大的一个软
件概念。
自提出结构化程序设计的概念后,经过多年的发展,结构化程
序设计已经具有了很广泛的内容和特有的设计方法。用结构化程序
设计方法编写的程序不仅结构良好,易写易读,而且易于证明其正
确性。
模块化设计技术与方法,是程序设计中应用最早的一种重要方
法,它早在使用低级语言时期就已出现,但是,只有在结构化程序
设计中,这种技术与方法才得以发展、充实、提高与完善。
C++语言程序设计 第三章 结构化程序设计
模块化程序设计方法是指在程序设计中,将一个复杂的算法
(或程序)分解成若干个相对独立、功能单一的模块,利用这些模
块即可适当地组合成所需的全局算法(或程序)。这里所说的模块,
是一个可供调用(即让其它模块调去使用)的相对独立的操作块
(或程序段),每个模块都是由三种基本结构组成的结构化模块。
在模块化结构中,整个系统犹如搭积木一样,是由各模块适当组合
而成。模块之间的相对独立性,使每个模块均可各自独立地分别进
行分析、设计、编写、调试、修改和扩充,并且不会影响到其它模
块和全局算法(或程序),这表明模块化结构不仅使复杂的软件研
制工作得以简化,缩短开发周期,节省开发费用,提高软件质量,
而且还可以有效地防止模块间错误的扩张,增加整个系统的稳定性
与可靠性。
C++语言程序设计 第三章 结构化程序设计
同时还可使软件具备结构灵活、便于组装、层次分明利于维护、条
理清晰容易理解的优点。在结构化程序中常常用模块化结构来组织
程序,
图 3.1给出了用模块化结构组织程序的示意图。
模块 A1
(小功能
)
模块 A2
{小功能
)
模块 A(较小功能) 模块 C
C1 C2 C3 C4
模块 B
B1 B2
主模块(主功能)
图 3.1 程序模块化分图
C++语言程序设计 第三章 结构化程序设计
3.3 顺序结构程序设计
3.3.1 顺序结构
顺序结构是最简单、最基本的结构,在顺序结构内,顺序执
行各个语句。图 3.2表示了一个顺序结构形式,从图中可以看出它
有一个入口 a点,一个出口 b点,在结构内 A框和 B框都是顺序执
行的处理框。
A
B
a
b
图 3.2 顺序结构示意图
C++语言程序设计 第三章 结构化程序设
计 【 例 3.12】 顺序结构程序举例(求表达式值)
#include <iostream.h>
void main()
{
int a,b,result;
cout <<,please input two number:\n”;
cin >> a ;
cin>> b;
result=3*a-2*b+1;
cout <<,result is, << result << endl;
}
C++语言程序设计 第三章 结构化程序设
计 在 C++语言中,实现顺序结构除了一般的语句如表达式语句、输入
输出函数的调用语句外,还有两种特殊形式的语句:空语句和复合
语句。
C++语言中,只有一个分号的语句称为空语句,即 ;
它在语法上要占据一个语句的位置,但它没有任何功能操作。
复合语句是由花括号 {}括起来的多个语句组成,在语法上它等价于
一个语句,一般形式为,
{ 语句 1;
语句 2;
……
语句 n;}
1.空语句
2.复合语句
C++语言程序设计 第三章 结构化程序设
计 3.3.2 程序举例
【 例 3.13】 完成将输入的一个三位正整数逆转的操作,例如,输入
123,输出 321。
#include<iostream.h>
void main()
{ int n,i,j,k;
cout<<"输入一个三位正整数,";
cin>>n;
i=n/100; //求百位数
n=n-i*100;j=n/10; //求十位数
n=n-j*10;k=n; //求个位数
cout<<"逆转数,"<<k<<j<<i<<endl; //反向显示
}
C++语言程序设计 第三章 结构化程序设计
程序的运行结果为,
输入一个三位正整数,123
逆转数,321
【 例 3.14】 完成在屏幕上显示, 欢迎使用 VC++!,,并响铃三次。
#include<iostream.h>
void main()
{
cout<<”欢迎使用 VC++!, <<endl;
cout<<"\a"<<"\a"<<"\a"; //完成响铃三次
}
C++语言程序设计 第三章 结构化程序设计
【 例 3.15】 复合语句举例。
#include<iostream.h>
void main()
{ int x=10;
cout<<x<<endl;
{
int x=20;
cout<<x<<endl;
}
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
10
20
10
注:其中,
{
int x=20;
cout<<x<<endl;
}
为复合语句,当复合语句内定义的变量和复合语句外定义的
变量同名时,在复合语句范围内,复合语句内定义的变量有效。在
复合语句范围外,复合语句外定义的变量有效。
C++语言程序设计 第三章 结构化程序设计
【 例 3.16】 求 ax2+bx+c=0方程的根。 a,b,c由键盘输入,设 b2-4ac
> 0。
#include <iostream.h>
#include <math.h>
void main()
{ double a,b,c,x1,x2,disc,p,q;
cout<<"请给出系数,";
cin>>a>>b>>c;
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;
x2=p-q;
Page 36
C++语言程序设计 第三章 结构化程序设
计 cout<<"方程的根为,"<<x1<<" "<<x2<<endl;
}
程序的运行结果为,
请给出系数,1 3 2↙
方程的根为,-1 -2
3.4 选择结构程序设计
实际应用中,经常遇到需要根据不同情况进行不同处理的问题。
例如,大学生交纳学费时,应按不同的专业交纳不同的学费;调整
职工工资时,应按不同的级别调整。我们通过选择结构来实现这些
问题的解决。选择语句包括 if语句和 switch语句两种。
3.4.1 用 if语句实现选择结构设计
C++语言程序设计 第三章 结构化程序设
计 图 3.3表示了用 if语句实现选择结构的流程。其中菱形框表示条
件的判断,矩形框表示处理语句,带箭头的连线表示执行走向。图
中( a)和( b)分别表示省略和带有 else部分的流程。
图 3.3 选择结构示意图
注意:在两种基本形式的 if语句中,作为条件判断的表达式可
以是单个变量,可以是关系表达式,也可以是逻辑表达式;作为子
句的语句 1或语句 2可以是简单句,可以是空语句,也可以是复合语
句。当语句是复合语句时,应当用大括号括起来,否则将会出错。
条件 P
A B
a
b
Y N
A
条件 P
a
b
Y
N
【 例 3.17】 if语句举例 。
#include <iostream.h>
void main( )
{ int a,b,x;
cin>>a>>b;
x=b;
if(a>b)
x=a;
cout<<x<<endl;
}
注:执行 if语句时, 首先判断 a是否大于 b,如 a
大于 b,则执行 x=a,结果便输出 a的值, 否则不执
行 x=a,结果输出 b的值 。
C++语言程序设计 第三章 结构化程序设
计
【 例 3.18】 用 if—else结构形式改写上例。
#include <iostream.h>
void main( )
{ int a,b,x;
cin>>a>>b;
if(a>b)
x=a;
else
x=b;
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设计
if语句中的任何一个子句可以是任意可执行语句,当然也可以
是一条 if语句,这种情况称为 if语句的嵌套。当出现 if语句嵌套时,
不管书写格式如何,else都将与它前面最靠近的未曾配对的 if语句相
配对,构成一条完整的 if语句。
我们可以在第 1个 if语句中的 else后,放上第 2个 if语句;在第 2个 if语
句中的 else后,又放上第 3个 if语句;以此类推,构成如图 3.4的嵌套
形式。
if (表达式 1) 语句 1;
else if (表达式 2) 语句 2;
- - -
else if (表达式 n) 语句 n;
else 语句 n+1;
2,if语句的嵌套
C++语言程序设计 第三章 结构化程序设
计
真
假
真
真
真
假
假
假
表达式 1
表达式 2
表达式 3
表达式 4
语句 1 语句 2 语句 3 语句 4 语句 5
图 3.4 if语句嵌套形式
C++语言程序设计 第三章 结构化程序设计
这是常用的一种形式。在这种嵌套形式里,若表达式 1的值不为
0,则执行语句 1;若为 0,则判断表达式 2,其结果不为 0,执行语
句 2;若为 0,则判断下一个 if语句。若任何一个表达式的值都为 0,
则执行语句 n+1,即 if语句里的第 n个 else部分。
【 例 3.19】 if语句嵌套的使用。
该程序使用嵌套形式的 if语句,根据学生的考分来划分成绩
的优、良、及格、不及格,分别用 A,B,C,D表示,并按如下规
定划分,即,100~95为 A,94~80为 B,79~60为 C,59~0为 D。
#include <iostream.h>
void main() {
int score=0;
char grade;
cout<<"score=";
C++语言程序设计 第三章 结构化程序设计
cin>>score;
if(score>94) grade='A';
else if(score>79) grade='B';
else if(score>59) grade='C';
else grade='D';
cout<<"grade="<<grade<<endl;
}
程序的运行结果为,
score=81↙
grade=B
C++语言程序设计 第三章 结构化程序设计
除了上述形式的 if语句嵌套外,还可以采用其它形式的 if语句嵌
套。如,
(1) if(表达式 1)
{ if(达式 2) 句 1; }
else 语句 2;
(2) if(表达式 1)
{ if(表达式 2) 语句 1 else 语句 2; }
(3) if(表达式 1)
{ if(表达式 2) 语句 1 else 语句 2; }
else 语句 3;
思考题:这些形式可以实现不同情况的选择, 请读者试着画出这
些嵌套形式的执行流程图 。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.20】 编写一程序计算函数。 (用到 if else嵌套 )
1 x>0
y = -1 x<0
0 x=0
void main( )
{ int x,y;
cin>>x;
if(x) //外层 if语句
{
if(x>0) //内层 if语句
y=1;
else //与内层 if配套
C++语言程序设计 第三章 结构化程序设
计 y=-1;
}
else //与外层 if配套
y=0;
cout<<"x=”<<x<<”,”<<”y="<<y<<endl; }
3.4.2 用 switch语句实现选择结构设计
switch语句是多分支选择语句,又称开关语句。 If语句是二分
支选择语句,但在实际问题中常常需要用到多分支的选择。例如,
学生成绩分类( 90分以上为 A,80分至 89分为 B,70分至 79分为 C
等),人口统计分类(按年龄分为老、中、青、少、幼)等。嵌套
的 if语句也可以处理多分支选择,但是 switch更加直观。
图 3.5描述了 switch语句流程。
C++语言程序设计 第三章 结构化程序设
计
语句组 1
break;
语句组 2
break;
语句组 n
break; 缺省语句
组
……
表达式
CASE 常
量 1
CASE 常
量 2
CASE 常
量 n
default
3.5 switch语句流程图
C++语言程序设计 第三章 结构化程序设
计 switch语句的一般形式如下,
switch(表达式 )
{
case 常量表达式 1,
语句组 1;
break;
case 常量表达式 2,
语句组 2;
break;
…
case 常量表达式 n,
语句组 n;
C++语言程序设计 第三章 结构化程序设
计 break;
default,
语句组 n+1;
}
【 例 3.22】 switch语句的使用举例。
#include<iostream.h>
void main()
{
int weekday;
cout<<"今天星期几 (0-6)?";
cin>>weekday;
switch (weekday)
C++语言程序设计 第三章 结构化程序设
计 {
case 0:cout<<"Sunday"<<endl;break;
case 1:cout<<"Monday"<<endl;break;
case 2:cout<<"Tuesday"<<endl;break;
case 3:cout<<"Wednesday"<<endl;break;
case 4:cout<<"Thursday"<<endl;break;
case 5:cout<<"Friday"<<endl;break;
case 6:cout<<"Saturday"<<endl;break;
}
}
C++语言程序设计 第三章 结构化程序设计
使用 switch语句需注意以下几点,
(1) switch下面的一对大括号不能省略,它的作用是将多分
支结构视为一个不可分隔的整体。每一个 case后面的语句组不需要
用大括号括起来,程序流程会自动顺序地执行该 case后面的所有可
执行语句 。
(2) 每个 case中的 break语句使 switch语句只执行一个 case中
的语句,执行到 break语句即从 switch语句中跳出。若没有 break语
句,将继续执行该 case下面各 case部分的执行语句。
(3)当不存在与表达式的值一致的常量表达式时,则执行
default后面的语句;当 default部分省略时,则什么也不执行就跳出
switch语句。
(4) 表达式的类型和常量表达式的类型必须一致。若表达式的
值与某 case后的常量表达式的值相等,则执行该 case后的语句。
(5) 所有常量表达式的值必须互不相同,而 case部分与 default
部分的顺序可以自由书写。如果 default部分位于程序最后,default
部分的 break语句便可以省略;否则 break语句必不可少。
(6) 当若干个 case所执行的内容可用一条语句(可以是复合语
句)表示时,允许这些 case共用一条语句。这种情况下的 switch 结
构变为,
switch(表达式 )
{
case 常量表达式 1,
case 常量表达式 2,
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
- - -
case 常量表达式 m,
语句组 m;
break;
case 常量表达式 m+1,
语句组 m+1;
break;
- - -
case 常量表达式 n,
语句组 n; break;
default
语句组 n+1; }
这种结构的 switch程序流程是:当表达式的
值与常量表达式 1的值或常量表达式 2的值,…或常
量表达式 m的值之一匹配时,都执行语句组 m,为
其它值时执行情况不变。
【 例 3.23】 多个 case共用一个语句的例子。
#include <iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设计
{ char grade;
cin>>grade;
if(grade>=’a’&&grade<=’z’)
grade-=32;
switch(grade)
C++语言程序设计 第三章 结构化程序设
计 {
case ’A’,
case ’B’,
case ’C’,cout<<"pass\n";break;
case ’D’,cout<<"fail\n";break;
default, cout<<"error\n";
}
}
注:在该例中, 输入 A,B,C时, 其输出结果都为,pass,输入
其它字符时, 其输出结果的情况不变 。
C++语言程序设计 第三章 结构化程序设
计
3.5循环结构程序设计
在许多问题中需要用到循环控制。例如,要输入全校学生成
绩;求若干个数之和;迭代求根等。 C++语言为解决这个问题提供
了循环语句,用循环语句来编写需要反复执行的程序段,将会简化
程序结构,节省计算机存储空间。
循环结构是指在一定条件下反复执行一个程序块的结构。循
环结构也是只有一个入口,一个出口。根据循环条件的不同,循环
结构分为当型循环结构和直到型循环结构两种。
当型循环的结构如图 3.6,其功能是:当给定的条件 p成立时,
执行 A框操作,执行完 A操作后,再判断 p条件是否成立,如果成立,
再次执行 A操作,如此重复执行 A操作,直到判断 p条件不成立才停
止循环。此时不执行 A操作,而从出口 b跳出循环结构。
C++语言程序设计 第三章 结构化程序设计
直到型循环的结构如图 3.7,其功能是,先执行 A框操作,然后
判断给定条件 p是否成立,如果不成立,再次执行 A操作;然后再
对 p进行判断,如此反复,直到给定的 p条件成立为止。此时不再执
行 A框,从出口 b跳出循环。
A
条件 P
a
b
Y
N
a
b
N
Y
条件 P
A
图 3.6 当型循环结构流程图 图 3.7 直到型循环结构流程图
C++语言程序设计 第三章 结构化程序设
计 一般地说,一个循环结构应由四个主要部分构成,
(1) 循环的工作部分。即循环体,完成循环程序的主要工作。
(2) 循环的修改部分。它保证循环体在循环过程中,有关的
量能按一定的规律变化。
(3) 循环的控制部分 。 它保证循环程序按规定的循环条件控
制循环正确进行 。
(4) 循环的初始部分 。 它是保证循环结构能够开始执行的语
句, 往往编写在程序的开头部分, 逻辑上先从这一部分开始执行 。
对于一个具体的程序, 上述几个部分有时很明显就能分开,
有时却很难分开 。 相互位置可前可后, 或相互包容 。 但循环的初始
部分一般应在循环的前面 。
C++语言中, 实现循环结构的控制语句有 while,do~ while、
for语句 。
C++语言程序设计 第三章 结构化程序设计
3.5.1 while语句
while语句用来实现, 当型, 循环结构,即先判断表达式,后执
行语句。其一般形式如下,
while (表达式 )
语句; //循环体
其执行过程是,首先判断括号内最初表达式的值,其值不
为 0,执行循环体,为 0则跳到循环体外;循环体执行完后,接着再
次判断表达式的值,进行与上述相同的处理要特别注意,while后
面的括号里是表达式而不是语句,表达式是没有分号的。
【 例 3.24】 编写一程序计算 1+2+3+…+99+100。
#include<iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设
计
{ int sum,n;
n=1;
sum =0;
while(n<=100)
{
sum +=n;
n++;
}
cout<<"sum ="<< sum <<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
sum=5050
说明,
(1) 循环体如果包含一个以上语句,一定要用大括号括起来,
以复合语句形式出现。如果不用大括号,则 while语句的范围只到
while后面的第一个分号处。例如,本例中 while语句中如果无大括
号,则 while语句范围只到, sum +=n;”
(2) 在循环体中应有使循环趋向于结束的语句。例如,在本例
中循环结束的条件是, n>100”,因此在循环体中应该有使 n增值以
最终能使 n>100的语句,例中使用, n++;”语句来达到此目的。如果
无此语句,则 n的值始终不改变,循环永不结束,构成死循环,程
序不能正常结束。
【 例 3.25】 分别统计出键入的所有正整数中, <60”和, >=60”
的数据的个数,然后显示。
C++语言程序设计 第三章 结构化程序设
计 void main()
{
int x,c1=0,c2=0;
cin>>x;
while (x>0)
{
if(x<60) c1++;
else c2++;
cin>>x;
}
cout<<"小于 60的正整数个数,"<<c1<<endl
<<"大于等于 60的正整数个数,"<<c2<<endl;
void main()
{
int x,c1=0,c2=0;
cin>>x;
while (x>0)
{
if(x<60) c1++;
else c2++;
cin>>x;
}
cout<<"小于 60的正整数个数,"<<c1<<endl
<<"大于等于 60的正整数个数,"<<c2<<endl;
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设
计
do-while语句用来实现, 直到型, 循环结构,即先执
行循环体,然后判断循环条件是否成立。其一般形式如下,
do
{
语句; //循环体
}
while (条件表达式 );
其执行过程是, 先执行一次指定的循环体语句,
然后判断表达式, 当表达式的值非零 (, 真, ) 时, 返回
重新执行循环体语句, 如此反复, 直到表达式的值等于零
为止, 此时循环结束 。
3.5.2 do-while语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.26】 编写一程序计算 1+2+3+...+99+100。
#include <iostream.h>
void main( )
{
int sum,n;
n=1;
sum=0;
do
sum+=n;
n++;
} while(n<=100);
cout<<"sum=”<<sum<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 {
sum+=n;
n++;
} while(n<=100);
cout<<"sum=”<<sum<<endl;
}
说明,
(1) 对于一个循环问题,我们既可以用当型循环也可以用直到
型循环来解决问题。例 3.24用当型循环,例 3.26用直到型循环,都
完成了计算 0到 100之间整数的和。
(2) 直到型循环的循环体至少执行一次,当型循环的循环体可
能一次也不执行。例如,在上两例中,为循环变量 n设初值 1,都等
于 5050;
C++语言程序设计 第三章 结构化程序设计
但如果循环变量 n的初值设为 101,则两种语句执行的结果就不同了,
while语句的执行结果是 0(即循环体语句部分一次也不执行),而
do-while语句的执行结果是 101(即循环体语句部分执行一次)。
for语句是 C++语言中使用最灵活方便的一种循环语句,它不仅用于
循环次数已知的情况,还能用于循环次数预先不能确定只给出循环
结束条件的情况。
for语句的一般形式为,
for(表达式 1;表达式 2;表达式 3)
语句 ; //循环体
其执行过程是,
3.5.3 for语句
C++语言程序设计 第三章 结构化程序设计
(1) 求解表达式 1。
(2) 求解表达式 2,若其值为真(值为非 0),则执
行 for语句中指定的循环体语句,然后执行下面的第⑶步。若为假
(值为 0),则结束循环,转到第⑸步。
(3) 求解表达式 3。
(4) 转回上面第⑵步继续执行。
(5) 循环结束,执行 for语句后面的其它语句。
与前两类循环类似,用作循环体的语句不仅可以是单个语句,
也可以是复合语句或空语句。
for语句中的三个表达式必须用分号隔开,其中表达
式 1一般用来初始化循环控制变量;表达式 2为表示循环条件的表达
式,用作循环条件控制,其作用与前两类循环语句中的表达式完全
一样,用法也基本相同;
C++语言程序设计 第三章 结构化程序设
计
表达式 3用来修改循环控制变量,用以表示循环控制变量的增量或
减量,常用自增或自减运算。
【 例 3.27】 用 for循环解决例 3.24的求和问题。
#include <iostream.h>
void main( )
{
int sum,n;
sum=0;
for(n=1;n<=100;n++)
sum+=n;
cout<<"sum="<<sum<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 说明,
(1) 语句 for(n=1;n<=100;n++) sum+=n;
相当于以下语句,
n=1;
while(n<=100)
{
sum+=n;
n++;
}
显然,用 for语句简单、方便。
C++语言程序设计 第三章 结构化程序设计
(2) 需要提及的是,for语句中的表达式 1和表达式 3一般为简单表
达式,但也可以使用逗号表达式,这是 for语句的一个很有用的特
性,当使用逗号表达式时,可一次完成对多个变量赋初值和修改多
个变量的功能,例如,
for(i=0,j=100;i<j;i++,j--) k=i+j;
表达式 1和表达式 3都使用了逗号表达式,即同时为
两个变量赋初值,同时使两个变量增值。
【 例 3.28】
#include<iostream.h>
void main( )
{int s,n;
for(s=0,n=1;n<=100;n++)
s+=n;
C++语言程序设计 第三章 结构化程序设
计 cout<<"s="<<s<<endl;
}
注:本例 for语句的表达式 1使用了逗号表达式,与例 3.27相比循环
结构更为紧凑和清晰。
for语句中的三个表达式允许省略或部分省略,以充
分体现其灵活性,但用作分隔符的两个分号绝不能省略。以下是省
略表达式的几种情况,
(1) 省略表达式 1。此时应在 for语句之前给循环变量
赋初值。语句格式为,for(;表达式 2;表达式 3)
语句 ;
例如,//求和
i=1;
for (;i<=50;i++) //分号不能省略
sum+=i;
C++语言程序设计 第三章 结构化程序设
计 (2) 省略表达式 2。此时循环继续条件永为真,必须在循环体中有
跳出循环的控制条件语句,否则构成死循环。语句格式为,
for(表达式 1;;表达式 3)
语句 ;
例如,//求和
for (i=1;;i++) //分号不能省略
{
sum+=i;
if(i>50) //if语句控制跳出循环
break; //功能为强制跳出循环
}
(3) 省略表达式 3。 此时需在循环体内使循环控制变量递变, 以保
证循环正常结束 。 语句格式为,
for(表达式 1;表达式 2;)
语句 ;
C++语言程序设计 第三章 结构化程序设
计 例如,//求和
for (i=1;i<=50;) //分号不能省略
sum+=i++; //累加的同时改变循环变量
(4) 省略表达式 1和省略表达式 3。 此时需要预先赋初值, 在循环体
内修改循环变量的值 。 语句格式为,
for(;表达式 2;)
语句 ;
例如,//求和
i=1; //循环变量预先赋值
for (;i<=50;) //分号不能省略
sum+=i++; //累加的同时改变循环变量
(5) 省略三个表达式 。 此时需要预先赋初值, 在循环体内修改循环
变量的值, 在循环体中有跳出循环的控制条件语句 。 语句格式为,
For(;;)
语句 ;
C++语言程序设计 第三章 结构化程序设计
例如,//求和
i=1; //循环变量预先赋值
for (;;) //分号不能省略
{
sum+=i++; //累加的同时改变循环变量
if(i>50) //控制跳出循环
break;
}
C++语言程序设计 第三章 结构化程序设
计 3.5.4跳转语句 break 和 continue
前面我们介绍了 C++语言的三种循环语句,它们退出循环的
方式是以某个表达式的结果值作为判断条件,当其值为 0时结束
循环,这属正常退出。 除了这种正常结束循环的方式外,还可
以利用 C++语言提供的 break语句在循环的中途退出循环,这属
于强行退出。在实际应用中,break语句一般都是与 if条件语句
配合使用。
break语句也被称为中断语句, 形式如下所示,
break;
该语句被限定使用在任一种循环语句和 switch语句中,
当程序执行到该语句时, 将立即结束所在循环语句或 switch语
句的执行, 接着执行其后面的语句 。
break语句也可以用于嵌套的循环结构中,在这种情况下,
如执行 break则仅仅 退出包含该 break语句的那层循环,即
break语句不能使程序控制退出一层以上的循环。
1.break语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.29】 已知产值及产值增长速度,编写计算产值增长一倍所需
的年数的程序。
#include<iostream.h>
void main()
{
double a,c=100000000.00; //c代表已知的当前产值 ;
for(;;){ //第 5行
int year=0; //y代表所要求的年数
cout<<"请输入增长率,";
cin>>a; //a代表增长率
if(a<=0.0) break;
double c1=c;
for(;;){ //第 11行
C++语言程序设计 第三章 结构化程序设
计 c1*=(1+a); //c1代表增长后的产值
++year;
if(c1>2*c) break;
}
cout<<"增长率为 "<<a
<<"时产值增长一倍所需年数为:
"<<year<<endl;
}
}
运行结果,
请输入增长率,0.2↙
增长率为 0.2时产值增长一倍所需年数为,4
请输入增长率,0↙
C++语言程序设计 第三章 结构化程序设
计
注:程序中使用了两个 break语句:第 1个 break语句,表示当
所输入的增长率 a小于等于 0时,说明与题意不符,需立即退出第 5
行的 for语句;第 2个 break语句,表示当产值已达到 2倍时,year中
所存的数就是所求的年数,这时无需再执行第 11行的 for语句了,
必须从该 for语句中退出。
continue语句也用于循环结构中, 它的作用是忽略它之
后到循环终止的程序, 而转向下一次循环 。 和 break语句一样,
continue语句通常也是和 if语句结合, 一同使用于循环结构中 。
2,Continue语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.30】 将 100~ 150之间不能被 3整除的数输出。
#include<iostream.h>
void main( )
{ int i,count=0;
for(i=100;i<=150;++i)
{
if(i%3==0)
continue;
cout<<i<<" "; count++;
if(count%5==0) cout<<endl; //一行输出 5个数据
}
cout<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
100 101 103 104 106
107 109 110 112 113
115 116 118 119 121
122 124 125 127 128
130 131 133 134 136
137 139 140 142 143
145 146 148 149
注:当 n能被 3整除时, 执行 contiune语句, 结束本次循环 ( 即
跳过 cout输出语句 ), 进行下一次循环 。 只有 n不能被 3整除时才执
行 cout输出语句 。
continue和 break的作用有相似之处, 却也有着根本区别,
continue语句只是结束本次循环, 还要进行下一次循环, 而不是要
结束整个循环 ;break则是结束整个循环, 转到循环体外面去了 。
C++语言程序设计 第三章 结构化程序设计
一个循环体内包含另一个完整的循环结构称
为循环的嵌套,内嵌的循环中还可以嵌套循环,
这就是多重循环。
【 例 3.31】 输出 100以内的所有素数。
#include<iostream.h>
#include<iomanip.h>
void main( )
{ int i,n,count=0;
for(n=2;n<100;++n)
{
for(i=2;i<n;++i)
if(n%i==0)
break;
3.5.5循环的嵌套
C++语言程序设计 第三章 结构化程序设计
if(i==n)
{
cout<<setw(4)<<n;
count++;
if(count%5==0) 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
C++语言程序设计 第三章 结构化程序设计
注:该程序是由两层循环组成的循环嵌套结构,第一层是自
for(n=2;n<=100;++n)开始到程序末,第二层自 for(i= 2;i<n;++i)
开始到 cout<<endl;语句。 break语句执
行的条件是 (n%i==0),即 n能被 i整除, 一旦该条件成立就强行结束
for(i=2;i<n;++i)开始的循环, 例如当 n=9时由于 9能被 3整除, 所
以内层循环执行到 i=3就强行结束, 不再执行 i=4;i=5;…。
三种循环可以互相嵌套, 但在循环的嵌套中要注意, 内
层循环应完全在外层循环里面, 也就是不允许出现交叉 。 在嵌套的
循环结构中, 如用缺口矩形表示每层循环结构时, 则图 3.8中 (a)、
(b)是正确的多层循环结构, 而 (c)是错误的多层循环结构, 因为它
出现了循环结构的交叉 。
另外, 使用循环结构时必须注意, 如果循环的控制条件
永远成立, 循环体将永无休止地反复执行, 程序就将陷入, 死循
环,, 这显然是应当防止的 。
C++语言程序设计 第三章 结构化程序设计
(a) (b) (c)
图 3.8 多层循环结构
C++语言程序设计 第三章 结构化程序设计
【 例 3.32】 求出所有的, 水仙花数,
,水仙花数, 是指一个三位数,其各位数字的立方和恰好等于该数
本身。例如 153=1*1*1+5*5*5+3*3*3,所以 153是, 水仙花数, 。
依题意,从 100到 999循环查找, 水仙花数, 即可。
本程序主要用到 for循环语句和 if选择语句。程序如下,
#include<iostream.h>
void main()
{ int i,a,b,c;
for (i=100;i<=999;i++)
{ a=i/100; //a是数 i的百位数
b=i/10-a*10; //b是数 i的十位数
3.6程序设计举例
C++语言程序设计 第三章 结构化程序设计
c=i-b*10-a*100; //c是数 i的个位数
if(i==a*a*a+b*b*b+c*c*c)
cout<<a<<b<<c<<endl;
}
}
程序的运行结果为,
153
370
371
407
【 例 3.33】 输入年、月,打印出该年份、该月的天数。
根据历法,凡是 1,3,5,7,8,10,12月,每月 31天,凡是 4,6、
9,11月,每月 30天,2月份闰年 29天,
C++语言程序设计 第三章 结构化程序设计
平年 28天。据此,题中采用多个 case可共同使用一个语句组的
switch语句,完成不同天数的选择。
另外,判断某年是否为闰年的规则是:如果此年号能被 400
整除,则是闰年;否则,如果此年号能被 4整除,而不能被 100整除,
则是闰年;否则不是闰年。题中采用嵌套的 if语句完成闰年的判断。
定义了 leap作为判断变量。
本程序主要用到 switch多分支选择语句和嵌套 if选择语句。
程序如下,
#include<iostream.h>
void main()
{ int year,mon,days,leap;
cout<<"年 月,";
C++语言程序设计 第三章 结构化程序设计
cin >>year>>mon;
switch (mon)
{
case 1,
case 3,
case 5,
case 7,
case 8,
case 10,
case 12:days=31;
break;
case 4,
case 6,
C++语言程序设计 第三章 结构化程序设计
case 9,
case 11:days=30;
break;
case 2:if (year%400==0)
leap=1;
else if (year%4==0&&year%100!=0)
leap=1;
else leap=0;
if (leap) days=29;
else days=28;
}
C++语言程序设计 第三章 结构化程序设计
cout<<year<<"年 "<<mon<<"月的天数为,"<<days<<endl;}
【 例 3.34】 用牛顿迭代法求解 x3=3x+1的一个根。
迭代法是求解方程根的常用方法,它是一种重要的逐次逼近
的方法,此方法是用某个迭代格式 (迭代公式 )根据旧值 X0生成一个
新值 X1,然后再把新值当作旧值,不断重复上面的过程,逐步精确
化,最后得到满足精度要求的结果,简言之,一组指令的重复执行
即为迭代。牛顿迭代法又称牛顿切线法,它比一般的迭代法具有更
快的收敛速度,但它对初值要求很严,当初值偏离准确解太多时,
有可能不收敛。因此,一般为便于分析,先把两个函数的曲线做出
来,它们的交点就是方程的根,这样就可以估计出根的所在区间,
使得初值更接近准确解。
C++语言程序设计 第三章 结构化程序设计
x
y=3x+1 y
图 3.10 曲线示意图
y
y=x3
C++语言程序设计 第三章 结构化程序设
计 我们先把函数 y1=x3和 y2=3x+1的两条曲线做出来 (见图 3.10),
它们的交点就是方程 x3=3x+1的根,由图可见 x3=3x+1的一个根在 -
1.6~ -1.5之间,另一个根在 -0.5~ -0.3之间,再一个根在 1.8~ 2.0之
间,必须在不同的区间分别迭代才能求出每个根。现在我们把 X在 -
0.5~ -0.6之间的根找出来。取 X的初值为 -0.5,精度取 0.000001。
本程序主要用到 while循环语句。程序如下,
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
double x=0.0,y1,y2;
double x1=-0.5; //*为 x1赋初值 -0.5*/
cout<<" x x1 x*x*x 3*x+1\n";
while((fabs(x1-x))>0.000001)
{
x=x1;
y1=x*x*x-(3*x+1);
y2=3*x*x-3;
x1=x-y1/y2;
cout<<setiosflags(ios::fixed)<<endl;
cout<<setprecision(6)<<x<<" "
C++语言程序设计 第三章 结构化程序设计
<<setprecision(6)<<x1<<" "
<<setprecision(6)<<x*x*x<<" "
<<setprecision(6)<<3*x+1<<endl;
}
cout<<endl<<"x="<<setprecision(6)<<x<<endl;
}
程序运行的结果为,
x x1 x*x*x 3*x+1
-0.500000 -0.333333 -0.125000 -0.500000
-0.333333 -0.347222 -0.037037 0.000000
-0.347222 -0.347296 -0.041862 -0.041667
-0.347296 -0.347296 -0.041889 -0.041889
x=-0.347296
C++语言程序设计 第三章 结构化程序设
计 【 例 3.35】 编一程序,将任意自然数 m的立方表示为 m个连续的奇
数之和。例如,
13=1
23=5+3=8
33=11+9+7=27
43=19+17+15+13=64
分析上面所列 m3的奇数和,可以看出一个规律,组成 m3的 m个
奇数中最大的奇数为 m(m+1)-1,这样就不难得到其余奇数了。
本程序主要用到 do-while循环语句。程序如下,
#include <iostream.h>
void main( )
{ int m,n,i,sum;
C++语言程序设计 第三章 结构化程序设
计 cout<<"Enter an integer:";
cin>>n;
if(n<1)
cout<<n<<"<1,Error! \n";
else
{
m=n*(n+1)-1;
sum=m;
i=n-1;
cout<<n<<”*”<<n<<”*”<<n<<”="<<m;;
do
C++语言程序设计 第三章 结构化程序设
计 { i--;
m=m-2;
sum=sum+m;
cout<<”+”<<m;
}while(i!=0);
}
cout<<"=”<<sum<<endl;
}
若运行时输入,6
程序运行的结果为,
inter an integer,6↙
6*6*6=41+39+37+35+33+31=216
【 例 3.36】 实现打印九九乘法表 。
本程序主要用到嵌套 while循环语句 。 程序如下,
#include<iostream.h>
#include<iomanip.h>
void main()
{
int i,j,result;
i=1;
j=1;
cout<<"九九乘法表,"<<"\n";
while (i<=9)
{
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设
计 j=1;
while (j<=i)
{
result=i*j;
cout<<j++<<"*"<<i<<"="<<setw(2)<<result<<" ";
}
i++;
cout<<"\n";
}
}
九九乘法表,
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72
9*9=81
C++语言程序设计 第三章 结构化程序设
计
?1.下列关于条件语句的描述中,是错误的。
A if语句中只有一个 else子句。
B if语句中可有多个 else if子句。
C if语句中 if体内不能是 switch语句。
D if语句的 if体中可以是循环语句。
?2.以下程序段 。
int x=-1;
do
{ x=x*x;}
while (!x);
A 是死循环 B 循环执行两次 C 循环执行一次 D 有语法错误
C++语言程序设计 第三章 结构化程序设计
习题
?3.给出下面程序运行后的输出结果。
#include <iostream.h>
void main()
{
int i,j;
for (i=0;i<5;i++)
{
for (j=i;j<5;j++)
cout<<"*";
cout<<endl;
}
}
C++语言程序设计 第三章 结构化程序设计
若用 0至 9之间不同的三个数构成一个三位数,以下程序将统计出共
有多少种构成方法。请填空。
#include <iostream.h>
void main()
{ int i,j,k,count=0;
for (i=1;i<=9;i++)
for (j=0;j<=9;j++)
if (① ) continue;
else for (k=1;k<=9;k++)
if (② ) count++;
cout<<count<<endl;
}
C++语言程序设计 第三章 结构化程序设计
?5.编一程序,求 1!+2!+3!+…+10!之和。
?6.编一程序,用牛顿迭代法求解 2x3-4x2+3x-6=0在 1.5附近的根。
?7.编一程序,将输入数据按小于 10,10~ 99,100~ 999,1000 以
上分类并显示。例如,输入 358时,显示 358 is 100 to 999。
?8.编一程序,输出以下图形,
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
? *
C++语言程序设计 第三章 结构化程序设计
?9.编一程序,求满足如下条件的最大的 n 。
12+22+32+…+n2≤1000
?10.一百万富翁遇到一陌生人,陌生人找他谈一个换钱计划,该
计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二
天我仍给你十万元,你给我二分钱,第三天我仍给你十万元,你给
我四分钱,……,你每天给我的钱是前一天的两倍,直到满一个月
( 30天)。百万富翁很高兴,欣然接受了这个契约。请编写一个程
序计算这一个月中陌生人给了百万富翁多少钱,百万富翁给了陌生
人多少钱。
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
习题答案
第 1题 答案为 A
第 2题 答案为 C
第 3题 执行结果 *****
****
***
**
*
第 4题 答案:① i==j② j==k
第 5题,编一程序,求 1!+2!+3!+… +10!之和。
#include <iostream.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
int s,n,i,j;
for (j=0,i=1;i<=10;i++)
{
for (s=0,n=1;n<=i;n++)
{s*=n;}
j+=s;
}cout<<j<<endl;
}
第 6题
#include<iostream.h>
#include<math.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
double x=0.0,y1,y2;
double x1=1.5;
while((fabs(x1-x))>0.000001)
{
x=x1;
y1=2*x*x*x-4*x*x+3*x-6;
y2=6*x*x-8*x+3;
x1=x-y1/y2;
}
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设计
第 7题
#include <iostream.h>
void main()
{ int i;
cin>>i;
if(i<10)
cout<<i<<"is 0 to 9"<<endl;
else if (i<100)
cout<<i<<"is 10 to 99"<<endl;
else if (i<1000)
cout<<i<<"is 100 to 999"<<endl;
else
cout<<i<<"is biger than 1000"<<endl;}
C++语言程序设计 第三章 结构化程序设计
第 8题
#include<iostream.h>
void main()
{
int m=3,n=0;
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(j<=(m+n)&&j>=(m-n))
cout<<"*";
else
C++语言程序设计 第三章 结构化程序设计
cout<<" ";
}
cout<<endl;
if(i<3)
n++;
else
n--;
}
}
C++语言程序设计 第三章 结构化程序设计
第 9题
#include <iostream.h>
void main()
{ int i=1,s=0,t;
do{t=i*i;
s+=t;
i++;}while(s<=1000);
cout<<i-1<<endl;
}
第 10题
#include <iostream.h>
void main()
{ long int i,x,y=0,s=1;
x=100000*30;
cout<<"陌生人给富翁 "<<x<<"元 ";
for(i=0;i<30;i++)
{s=s*2;
y=y+s;}
cout<<" 富翁给陌生人 "<<y/100<<"元 ";
}
3.1 C++输入输出流
3.2 结构化程序设计概述
3.3 顺序结构程序设计
3.4 选择结构程序设计
3.5 循环结构程序设计
3.6程序设计举例
3.1 C++输入输出流
C++语言程序设计 第三章 结构化程序设计
在 C++中,将数据从一个对象到另一个对象的流动抽象为
,流, 。从流中获取数据的操作称为提取操作,向流中添加数据的
操作称为插入操作。数据的输入输出是通过输入输出 I/O流来实现
的。
C++提供了 I/O流机制,完成对输入输出的操作管理,包括流
输入和流输出。 cin和 cout是预定义的流对象。 cin用来处理标准输
入,即键盘输入; cout用来处理标准输出,即屏幕输出。由于 cin和
cout被定义在, iostream.h”头文件中,在使用它们之前,要用预编
译命令, #include”将, iostream.h”(即所使用的头文件)包括到
用户的源程序中。即源文件中需有,
#include <iostream.h>
C++语言程序设计 第三章 结构化程序设计
3.1.1 C++无格式输入输出
,<<”是预定义的插入符,使用, <<”向 cout输出流中插入数据,
便可实现在屏幕上显示输出。格式如下,
cout<<表达式 1<<表达式 2 … <<表达式 n;
或分成多行,
cout<<表达式 1
<<表达式 2
…
<< 表达式 n; //输出效果同单行格式
在输出语句中,可以连续使用多个插入操作符,输出多个数
据项。
1.无格式输出 cout,
C++语言程序设计 第三章 结构化程序设
计 【 例 3.1】 无格式输出 cout。
#include<iostream.h>
void main( )
{
cout<<”This is a program.\n”;
cout<<”This,<<”is,<<”a,<<”program.\n”; //连续使
用多个插入操作符
cout<<”This,
<<”is,
<<”a,
<<”program.\n”;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
This is a program,
This is a program,
This is a program,
在插入运算符后面可以写任意复杂的表达式,系统会自动计
算出它们的值,并传递给插入操作符。
【 例 3.2】 无格式输出 cout。
#include<iostream.h>
void main()
{ int a=10;
int b=20;
int c=30;
2,无格式输入 cin
C++语言程序设计 第三章 结构化程序设
计 cout<<a<<”\n”
<<b<<”\n”
<<c<<”\n”
<<(a+c)/(2*b)<<”\n”;}
程序的运行结果为,
10
20
30
1
,>>”是预定义的提取符,使用, >>”从 cin输入流中提取数据,
便可实现键盘输入。格式如下,
C++语言程序设计 第三章 结构化程序设计
cin >>数据 1>>数据 2 …>>数据 n;
也可写成多行,
cin>>数据 1
>>数据 2
…
>>数据 n;
cin在用于输入数据时,能自动识别变量位置和类型 。
例如,
float f; long l;
cin>>f>>l;
cin能知道提取变量的类型,它将对 f,l分别给出一个浮点型和
长整型数。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.3】 无格式的输入输出 cin。
#include<iostream.h>
void main()
{
int n1,n2;
cout<<"Please input 2 number\n==>";
cin>>n1>>n2; //键入数据,两数之间空格或回车键或
Tab键分隔
cout<<"The average of the 2
numbers\n==>"<<(n1+n2)/2<<"\n";
}
C++语言程序设计 第三章 结构化程序设
计
当使用 cin,cout进行数据的输入和输出时,不管处理何种类
型的数据,都能自动按照默认格式处理。但需要按特定的格式输入
输出时,默认格式就不能满足要求了 。例如对 double pi=3.1415;
如果需要输出 pi并换行,设置域宽为 5个字符,小数点后保留
两位有效数字,则简单的使用如下语句不能完成
cout<<pi<<”\n”; //系统默认显示 6位有效数字。
==>3 7
The average of the 2 numbers
==>5
程序的运行结果为,
Please input 2 number
3.1.2 C++格式输入输出
C++语言程序设计 第三章 结构化程序设
计 为此 C++提供了控制符( manipulators),用于对 I/O流的格式进行
控制。使用控制符,把上述语句改为如下形式则可以完成需求。
cout<<setw(5)<<setprecision(3)<<pi<<endl;
控制符是在头文件 iomanip.h中预定义的对象,可以直接插
入流中。使用控制符时,要在源文件中添加 #include<iomanip.h>预
处理命令。
常用控制符如表 3.1所示。
下面举例说明控制符用法,
【 例 3.4】 控制换行 endl的使用。
#include <iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设
计
控制符
描述
endl
插入换行符并刷新流
dec
数值数据采用十进制表示
hex
数值数据采用十六进制表示
oct
数值数据采用八进制表示
setiosflags(ios::uppercase)
设置 16进制数大写输出
resetiosflags(ios::uppercase)
取消 16进制数大写输出
setw(n)
设域宽为 n个字符
setfill(c)
设填充字符为 c
setprecision(n)
设显示小数精度为 n位
setiosflags(ios::fixed)
用定点方式表示实数
setiosflags(ios::scientific)
用科学计数法表示浮点数
setiosflags(ios::left)
左对齐
setiosflags(ios::right)
右对齐
setiosflags(ios::showpoint)
强制显示小数点和无效 0
setiosflags(ios::showpos)
强制显示正数符号
表 3.1 I/O流的常用控制符
C++语言程序设计 第三章 结构化程序设计
{int x=30,y=300,z=1024;
cout<<"Decimal:"<<x<<' '<<y<<' '<<z<<endl; //按十进
制输出
cout<<"Octal:"<<oct<<x<<' '<<y<<' '<<z<<endl; //按八进
制输出
cout<<"Hexadecimal:"<<hex<<x<<' '<<y<<' '<<z<<endl;//按
十六进制输出
cout<<setiosflags(ios::uppercase); //设置数值中字母大写
输出
cout<<"Hexadecimal:"<<x<<' '<<y<<' '<<z<<endl; //仍按
十六进制输出
cout<<resetiosflags(ios::uppercase); //设置数值中字母小
写输出
C++语言程序设计 第三章 结构化程序设计
{
cout<<”河北建筑工程学院, <<endl; //endl相当于 ’ \n’,使
以后的输出换行打印。
cout<<”计算机系, <<endl;
}
程序的运行结果为,
河北建筑工程学院
计算机系
【 例 3.5】 使用控制符 hex,oct和 dec控制输出 8进制,16进制
和 10进制数。
#include <iostream.h>
#include <iomanip.h>
void main()
C++语言程序设计 第三章 结构化程序设
计 cout<<"Hexadecimal:"<<x<<' '<<y<<' '<<z<<endl; //仍按十六进
制输出
cout<<“Decimal:”<<dec<<x<<? ?<<y<<? ?<<z<<endl; //恢复
按十 进制输出
}
程序的运行结果为,
Decimal:30 300 1024
Octal:36 454 2000
Hexadecimal:1e 12c 400
Hexadecimal:1E 12C 400
Hexadecimal:1e 12c 400
Decimal:30 300 1024
C++语言程序设计 第三章 结构化程序设
计 【 例 3.6】 使用 setw设置值的输出宽度。
#include <iostream.h>
#include <iomanip.h>
void main()
{
int a =10;
int b =1000;
cout <<setw(5)<<a<<"\n";
cout <<setw(2)<<b;
}
程序的运行结果为,
10
1000
C++语言程序设计 第三章 结构化程序设计
说明,
(1) setw操作符主要用来输出欲留空间格数,若空间多余则向
右对齐;若空间不够,按数据长度输出。
(2) setw操作符只对紧接其后的待输出变量有效。如,
int a=10,b=1000;
cout<<setw(5)<<a<<b; //setw(5)只对 a有效,输出结果第一位数字前
有三个空格
此程序段的运行结果为,101000
【 例 3.7】 用 setfill控制符设置填充字符
#include <iostream.h>
#include <iomanip.h>
void main()
C++语言程序设计 第三章 结构化程序设计
{
cout<<setfill(?*?) //设置填充符号为 "*"
<<setw(2)<<"OK"<<endl
<<setw(3)<<"OK"<<endl
<<setw(4)<<"OK"<<endl;
cout <<setfill(? ?); // 恢复默认设置,填充空格
}
程序的运行结果为,
OK
*OK
**OK
【 例 3.8】 控制浮点数值显示
//本程序分别用浮点, 定点和指数的方式表示一个实数
#include <iostream.h>
#include <iomanip.h>
void main()
{
double test = 22.0/7 ;
cout << test << endl ; //C++默认的流输出数值有效位为 6
cout << setprecision(0) << test << endl // C++最小有效位数
为 1,此处取 1
<< setprecision(1) << test << endl
<< setprecision(2) << test << endl
<< setprecision(3) << test << endl
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
<< setprecision(4) << test << endl ;
cout << setiosflags(ios::fixed) ;
cout <<setprecision(8) << test << endl ;
// setiosflags(ios::fixed) 与 setprecision(8)合用,控制小数点右边的
数字个数为 8
cout << setprecision(6) ; // 重新设置成 C++默认流输出
数值有效位
}
程序的运行结果为,
3.14286
3
3
C++语言程序设计 第三章 结构化程序设计
3.1
3.14
3.143
3.14285714
注:小数位数截短显示时,进行4舍5入处理。
【 例 3.9】 左右对齐输出。
#include <iostream.h>
#include <iomanip.h>
void main()
{
cout << setiosflags(ios::right) //设置右对齐输出,空格在
前
<< setw(5) << 1
C++语言程序设计 第三章 结构化程序设
计 << setw(5) << 2
<< setw(5) << 3 << endl ;
cout << setiosflags(ios::left) //设置左对齐输出,空格在后
<< setw(5) << 1
<< setw(5) << 2
<< setw(5) << 3 << endl ;
}
程序的运行结果为,
1 2 3
1 2 3
注:默认时,I/O流为左对齐显示内容。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.10】 强制显示小数点。
#include <iostream.h>
#include <iomanip.h>
void main()
{
double x=66,y=-8.246;
cout << x<< " " << y << endl ;
cout << setiosflags(ios::showpoint); //设置强制显示小
数点和无效 0
cout << x<< " " << y << endl ;
}
C++语言程序设计 第三章 结构化程序设计
66 –8.246
66.0000 –8.24600
【 例 3.11】 强制显示符号。
#include <iostream.h>
#include <iomanip.h>
void main()
{
double x=66,y=-8.246;
cout << x<< " " << y << endl ;
cout << setiosflags(ios::showpos); //设置强制显示正号
cout << x<< " " << y << endl ; }
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
66 –8.246
+66 –8.246
注:默认时,I/O流仅在负数之前显示值的符号。
3.2 结构化程序设计概述
1966年,Bohm和 Jacopini首次证明了只要三种控制结构,就能
表达一个入口和一个出口的框图(流程图)所能表达的任何程序逻
辑。这三种控制结构是 顺序结构、选择结构和循环结构 。
1968年 Dijksrea建议,GOTO语句太容易把程序弄乱,应从一
切高级语言中去掉;只剩 3种基本控制结构就可以写各种程序,而
这样的程序可以自顶向下阅读而不会返回。这促进了一种新的程序
设计思想、方法和风格的形成,以显著提高软件生产效率和降低软
件维护的代价。
C++语言程序设计 第三章 结构化程序设
计
1972年,Mills进一步提出程序只应有一个入口和一个出口,进
而填补了结构化程序设计的原则。结构化程序设计的概念和方法,
以及支持这些方法的一整套软件工具,就构成了所谓的, 结构化革
命, 。这是存储程序计算机问世以来对计算机界影响最大的一个软
件概念。
自提出结构化程序设计的概念后,经过多年的发展,结构化程
序设计已经具有了很广泛的内容和特有的设计方法。用结构化程序
设计方法编写的程序不仅结构良好,易写易读,而且易于证明其正
确性。
模块化设计技术与方法,是程序设计中应用最早的一种重要方
法,它早在使用低级语言时期就已出现,但是,只有在结构化程序
设计中,这种技术与方法才得以发展、充实、提高与完善。
C++语言程序设计 第三章 结构化程序设计
模块化程序设计方法是指在程序设计中,将一个复杂的算法
(或程序)分解成若干个相对独立、功能单一的模块,利用这些模
块即可适当地组合成所需的全局算法(或程序)。这里所说的模块,
是一个可供调用(即让其它模块调去使用)的相对独立的操作块
(或程序段),每个模块都是由三种基本结构组成的结构化模块。
在模块化结构中,整个系统犹如搭积木一样,是由各模块适当组合
而成。模块之间的相对独立性,使每个模块均可各自独立地分别进
行分析、设计、编写、调试、修改和扩充,并且不会影响到其它模
块和全局算法(或程序),这表明模块化结构不仅使复杂的软件研
制工作得以简化,缩短开发周期,节省开发费用,提高软件质量,
而且还可以有效地防止模块间错误的扩张,增加整个系统的稳定性
与可靠性。
C++语言程序设计 第三章 结构化程序设计
同时还可使软件具备结构灵活、便于组装、层次分明利于维护、条
理清晰容易理解的优点。在结构化程序中常常用模块化结构来组织
程序,
图 3.1给出了用模块化结构组织程序的示意图。
模块 A1
(小功能
)
模块 A2
{小功能
)
模块 A(较小功能) 模块 C
C1 C2 C3 C4
模块 B
B1 B2
主模块(主功能)
图 3.1 程序模块化分图
C++语言程序设计 第三章 结构化程序设计
3.3 顺序结构程序设计
3.3.1 顺序结构
顺序结构是最简单、最基本的结构,在顺序结构内,顺序执
行各个语句。图 3.2表示了一个顺序结构形式,从图中可以看出它
有一个入口 a点,一个出口 b点,在结构内 A框和 B框都是顺序执
行的处理框。
A
B
a
b
图 3.2 顺序结构示意图
C++语言程序设计 第三章 结构化程序设
计 【 例 3.12】 顺序结构程序举例(求表达式值)
#include <iostream.h>
void main()
{
int a,b,result;
cout <<,please input two number:\n”;
cin >> a ;
cin>> b;
result=3*a-2*b+1;
cout <<,result is, << result << endl;
}
C++语言程序设计 第三章 结构化程序设
计 在 C++语言中,实现顺序结构除了一般的语句如表达式语句、输入
输出函数的调用语句外,还有两种特殊形式的语句:空语句和复合
语句。
C++语言中,只有一个分号的语句称为空语句,即 ;
它在语法上要占据一个语句的位置,但它没有任何功能操作。
复合语句是由花括号 {}括起来的多个语句组成,在语法上它等价于
一个语句,一般形式为,
{ 语句 1;
语句 2;
……
语句 n;}
1.空语句
2.复合语句
C++语言程序设计 第三章 结构化程序设
计 3.3.2 程序举例
【 例 3.13】 完成将输入的一个三位正整数逆转的操作,例如,输入
123,输出 321。
#include<iostream.h>
void main()
{ int n,i,j,k;
cout<<"输入一个三位正整数,";
cin>>n;
i=n/100; //求百位数
n=n-i*100;j=n/10; //求十位数
n=n-j*10;k=n; //求个位数
cout<<"逆转数,"<<k<<j<<i<<endl; //反向显示
}
C++语言程序设计 第三章 结构化程序设计
程序的运行结果为,
输入一个三位正整数,123
逆转数,321
【 例 3.14】 完成在屏幕上显示, 欢迎使用 VC++!,,并响铃三次。
#include<iostream.h>
void main()
{
cout<<”欢迎使用 VC++!, <<endl;
cout<<"\a"<<"\a"<<"\a"; //完成响铃三次
}
C++语言程序设计 第三章 结构化程序设计
【 例 3.15】 复合语句举例。
#include<iostream.h>
void main()
{ int x=10;
cout<<x<<endl;
{
int x=20;
cout<<x<<endl;
}
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
10
20
10
注:其中,
{
int x=20;
cout<<x<<endl;
}
为复合语句,当复合语句内定义的变量和复合语句外定义的
变量同名时,在复合语句范围内,复合语句内定义的变量有效。在
复合语句范围外,复合语句外定义的变量有效。
C++语言程序设计 第三章 结构化程序设计
【 例 3.16】 求 ax2+bx+c=0方程的根。 a,b,c由键盘输入,设 b2-4ac
> 0。
#include <iostream.h>
#include <math.h>
void main()
{ double a,b,c,x1,x2,disc,p,q;
cout<<"请给出系数,";
cin>>a>>b>>c;
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;
x2=p-q;
Page 36
C++语言程序设计 第三章 结构化程序设
计 cout<<"方程的根为,"<<x1<<" "<<x2<<endl;
}
程序的运行结果为,
请给出系数,1 3 2↙
方程的根为,-1 -2
3.4 选择结构程序设计
实际应用中,经常遇到需要根据不同情况进行不同处理的问题。
例如,大学生交纳学费时,应按不同的专业交纳不同的学费;调整
职工工资时,应按不同的级别调整。我们通过选择结构来实现这些
问题的解决。选择语句包括 if语句和 switch语句两种。
3.4.1 用 if语句实现选择结构设计
C++语言程序设计 第三章 结构化程序设
计 图 3.3表示了用 if语句实现选择结构的流程。其中菱形框表示条
件的判断,矩形框表示处理语句,带箭头的连线表示执行走向。图
中( a)和( b)分别表示省略和带有 else部分的流程。
图 3.3 选择结构示意图
注意:在两种基本形式的 if语句中,作为条件判断的表达式可
以是单个变量,可以是关系表达式,也可以是逻辑表达式;作为子
句的语句 1或语句 2可以是简单句,可以是空语句,也可以是复合语
句。当语句是复合语句时,应当用大括号括起来,否则将会出错。
条件 P
A B
a
b
Y N
A
条件 P
a
b
Y
N
【 例 3.17】 if语句举例 。
#include <iostream.h>
void main( )
{ int a,b,x;
cin>>a>>b;
x=b;
if(a>b)
x=a;
cout<<x<<endl;
}
注:执行 if语句时, 首先判断 a是否大于 b,如 a
大于 b,则执行 x=a,结果便输出 a的值, 否则不执
行 x=a,结果输出 b的值 。
C++语言程序设计 第三章 结构化程序设
计
【 例 3.18】 用 if—else结构形式改写上例。
#include <iostream.h>
void main( )
{ int a,b,x;
cin>>a>>b;
if(a>b)
x=a;
else
x=b;
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设计
if语句中的任何一个子句可以是任意可执行语句,当然也可以
是一条 if语句,这种情况称为 if语句的嵌套。当出现 if语句嵌套时,
不管书写格式如何,else都将与它前面最靠近的未曾配对的 if语句相
配对,构成一条完整的 if语句。
我们可以在第 1个 if语句中的 else后,放上第 2个 if语句;在第 2个 if语
句中的 else后,又放上第 3个 if语句;以此类推,构成如图 3.4的嵌套
形式。
if (表达式 1) 语句 1;
else if (表达式 2) 语句 2;
- - -
else if (表达式 n) 语句 n;
else 语句 n+1;
2,if语句的嵌套
C++语言程序设计 第三章 结构化程序设
计
真
假
真
真
真
假
假
假
表达式 1
表达式 2
表达式 3
表达式 4
语句 1 语句 2 语句 3 语句 4 语句 5
图 3.4 if语句嵌套形式
C++语言程序设计 第三章 结构化程序设计
这是常用的一种形式。在这种嵌套形式里,若表达式 1的值不为
0,则执行语句 1;若为 0,则判断表达式 2,其结果不为 0,执行语
句 2;若为 0,则判断下一个 if语句。若任何一个表达式的值都为 0,
则执行语句 n+1,即 if语句里的第 n个 else部分。
【 例 3.19】 if语句嵌套的使用。
该程序使用嵌套形式的 if语句,根据学生的考分来划分成绩
的优、良、及格、不及格,分别用 A,B,C,D表示,并按如下规
定划分,即,100~95为 A,94~80为 B,79~60为 C,59~0为 D。
#include <iostream.h>
void main() {
int score=0;
char grade;
cout<<"score=";
C++语言程序设计 第三章 结构化程序设计
cin>>score;
if(score>94) grade='A';
else if(score>79) grade='B';
else if(score>59) grade='C';
else grade='D';
cout<<"grade="<<grade<<endl;
}
程序的运行结果为,
score=81↙
grade=B
C++语言程序设计 第三章 结构化程序设计
除了上述形式的 if语句嵌套外,还可以采用其它形式的 if语句嵌
套。如,
(1) if(表达式 1)
{ if(达式 2) 句 1; }
else 语句 2;
(2) if(表达式 1)
{ if(表达式 2) 语句 1 else 语句 2; }
(3) if(表达式 1)
{ if(表达式 2) 语句 1 else 语句 2; }
else 语句 3;
思考题:这些形式可以实现不同情况的选择, 请读者试着画出这
些嵌套形式的执行流程图 。
C++语言程序设计 第三章 结构化程序设
计 【 例 3.20】 编写一程序计算函数。 (用到 if else嵌套 )
1 x>0
y = -1 x<0
0 x=0
void main( )
{ int x,y;
cin>>x;
if(x) //外层 if语句
{
if(x>0) //内层 if语句
y=1;
else //与内层 if配套
C++语言程序设计 第三章 结构化程序设
计 y=-1;
}
else //与外层 if配套
y=0;
cout<<"x=”<<x<<”,”<<”y="<<y<<endl; }
3.4.2 用 switch语句实现选择结构设计
switch语句是多分支选择语句,又称开关语句。 If语句是二分
支选择语句,但在实际问题中常常需要用到多分支的选择。例如,
学生成绩分类( 90分以上为 A,80分至 89分为 B,70分至 79分为 C
等),人口统计分类(按年龄分为老、中、青、少、幼)等。嵌套
的 if语句也可以处理多分支选择,但是 switch更加直观。
图 3.5描述了 switch语句流程。
C++语言程序设计 第三章 结构化程序设
计
语句组 1
break;
语句组 2
break;
语句组 n
break; 缺省语句
组
……
表达式
CASE 常
量 1
CASE 常
量 2
CASE 常
量 n
default
3.5 switch语句流程图
C++语言程序设计 第三章 结构化程序设
计 switch语句的一般形式如下,
switch(表达式 )
{
case 常量表达式 1,
语句组 1;
break;
case 常量表达式 2,
语句组 2;
break;
…
case 常量表达式 n,
语句组 n;
C++语言程序设计 第三章 结构化程序设
计 break;
default,
语句组 n+1;
}
【 例 3.22】 switch语句的使用举例。
#include<iostream.h>
void main()
{
int weekday;
cout<<"今天星期几 (0-6)?";
cin>>weekday;
switch (weekday)
C++语言程序设计 第三章 结构化程序设
计 {
case 0:cout<<"Sunday"<<endl;break;
case 1:cout<<"Monday"<<endl;break;
case 2:cout<<"Tuesday"<<endl;break;
case 3:cout<<"Wednesday"<<endl;break;
case 4:cout<<"Thursday"<<endl;break;
case 5:cout<<"Friday"<<endl;break;
case 6:cout<<"Saturday"<<endl;break;
}
}
C++语言程序设计 第三章 结构化程序设计
使用 switch语句需注意以下几点,
(1) switch下面的一对大括号不能省略,它的作用是将多分
支结构视为一个不可分隔的整体。每一个 case后面的语句组不需要
用大括号括起来,程序流程会自动顺序地执行该 case后面的所有可
执行语句 。
(2) 每个 case中的 break语句使 switch语句只执行一个 case中
的语句,执行到 break语句即从 switch语句中跳出。若没有 break语
句,将继续执行该 case下面各 case部分的执行语句。
(3)当不存在与表达式的值一致的常量表达式时,则执行
default后面的语句;当 default部分省略时,则什么也不执行就跳出
switch语句。
(4) 表达式的类型和常量表达式的类型必须一致。若表达式的
值与某 case后的常量表达式的值相等,则执行该 case后的语句。
(5) 所有常量表达式的值必须互不相同,而 case部分与 default
部分的顺序可以自由书写。如果 default部分位于程序最后,default
部分的 break语句便可以省略;否则 break语句必不可少。
(6) 当若干个 case所执行的内容可用一条语句(可以是复合语
句)表示时,允许这些 case共用一条语句。这种情况下的 switch 结
构变为,
switch(表达式 )
{
case 常量表达式 1,
case 常量表达式 2,
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
- - -
case 常量表达式 m,
语句组 m;
break;
case 常量表达式 m+1,
语句组 m+1;
break;
- - -
case 常量表达式 n,
语句组 n; break;
default
语句组 n+1; }
这种结构的 switch程序流程是:当表达式的
值与常量表达式 1的值或常量表达式 2的值,…或常
量表达式 m的值之一匹配时,都执行语句组 m,为
其它值时执行情况不变。
【 例 3.23】 多个 case共用一个语句的例子。
#include <iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设计
{ char grade;
cin>>grade;
if(grade>=’a’&&grade<=’z’)
grade-=32;
switch(grade)
C++语言程序设计 第三章 结构化程序设
计 {
case ’A’,
case ’B’,
case ’C’,cout<<"pass\n";break;
case ’D’,cout<<"fail\n";break;
default, cout<<"error\n";
}
}
注:在该例中, 输入 A,B,C时, 其输出结果都为,pass,输入
其它字符时, 其输出结果的情况不变 。
C++语言程序设计 第三章 结构化程序设
计
3.5循环结构程序设计
在许多问题中需要用到循环控制。例如,要输入全校学生成
绩;求若干个数之和;迭代求根等。 C++语言为解决这个问题提供
了循环语句,用循环语句来编写需要反复执行的程序段,将会简化
程序结构,节省计算机存储空间。
循环结构是指在一定条件下反复执行一个程序块的结构。循
环结构也是只有一个入口,一个出口。根据循环条件的不同,循环
结构分为当型循环结构和直到型循环结构两种。
当型循环的结构如图 3.6,其功能是:当给定的条件 p成立时,
执行 A框操作,执行完 A操作后,再判断 p条件是否成立,如果成立,
再次执行 A操作,如此重复执行 A操作,直到判断 p条件不成立才停
止循环。此时不执行 A操作,而从出口 b跳出循环结构。
C++语言程序设计 第三章 结构化程序设计
直到型循环的结构如图 3.7,其功能是,先执行 A框操作,然后
判断给定条件 p是否成立,如果不成立,再次执行 A操作;然后再
对 p进行判断,如此反复,直到给定的 p条件成立为止。此时不再执
行 A框,从出口 b跳出循环。
A
条件 P
a
b
Y
N
a
b
N
Y
条件 P
A
图 3.6 当型循环结构流程图 图 3.7 直到型循环结构流程图
C++语言程序设计 第三章 结构化程序设
计 一般地说,一个循环结构应由四个主要部分构成,
(1) 循环的工作部分。即循环体,完成循环程序的主要工作。
(2) 循环的修改部分。它保证循环体在循环过程中,有关的
量能按一定的规律变化。
(3) 循环的控制部分 。 它保证循环程序按规定的循环条件控
制循环正确进行 。
(4) 循环的初始部分 。 它是保证循环结构能够开始执行的语
句, 往往编写在程序的开头部分, 逻辑上先从这一部分开始执行 。
对于一个具体的程序, 上述几个部分有时很明显就能分开,
有时却很难分开 。 相互位置可前可后, 或相互包容 。 但循环的初始
部分一般应在循环的前面 。
C++语言中, 实现循环结构的控制语句有 while,do~ while、
for语句 。
C++语言程序设计 第三章 结构化程序设计
3.5.1 while语句
while语句用来实现, 当型, 循环结构,即先判断表达式,后执
行语句。其一般形式如下,
while (表达式 )
语句; //循环体
其执行过程是,首先判断括号内最初表达式的值,其值不
为 0,执行循环体,为 0则跳到循环体外;循环体执行完后,接着再
次判断表达式的值,进行与上述相同的处理要特别注意,while后
面的括号里是表达式而不是语句,表达式是没有分号的。
【 例 3.24】 编写一程序计算 1+2+3+…+99+100。
#include<iostream.h>
void main( )
C++语言程序设计 第三章 结构化程序设
计
{ int sum,n;
n=1;
sum =0;
while(n<=100)
{
sum +=n;
n++;
}
cout<<"sum ="<< sum <<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
sum=5050
说明,
(1) 循环体如果包含一个以上语句,一定要用大括号括起来,
以复合语句形式出现。如果不用大括号,则 while语句的范围只到
while后面的第一个分号处。例如,本例中 while语句中如果无大括
号,则 while语句范围只到, sum +=n;”
(2) 在循环体中应有使循环趋向于结束的语句。例如,在本例
中循环结束的条件是, n>100”,因此在循环体中应该有使 n增值以
最终能使 n>100的语句,例中使用, n++;”语句来达到此目的。如果
无此语句,则 n的值始终不改变,循环永不结束,构成死循环,程
序不能正常结束。
【 例 3.25】 分别统计出键入的所有正整数中, <60”和, >=60”
的数据的个数,然后显示。
C++语言程序设计 第三章 结构化程序设
计 void main()
{
int x,c1=0,c2=0;
cin>>x;
while (x>0)
{
if(x<60) c1++;
else c2++;
cin>>x;
}
cout<<"小于 60的正整数个数,"<<c1<<endl
<<"大于等于 60的正整数个数,"<<c2<<endl;
void main()
{
int x,c1=0,c2=0;
cin>>x;
while (x>0)
{
if(x<60) c1++;
else c2++;
cin>>x;
}
cout<<"小于 60的正整数个数,"<<c1<<endl
<<"大于等于 60的正整数个数,"<<c2<<endl;
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设
计
do-while语句用来实现, 直到型, 循环结构,即先执
行循环体,然后判断循环条件是否成立。其一般形式如下,
do
{
语句; //循环体
}
while (条件表达式 );
其执行过程是, 先执行一次指定的循环体语句,
然后判断表达式, 当表达式的值非零 (, 真, ) 时, 返回
重新执行循环体语句, 如此反复, 直到表达式的值等于零
为止, 此时循环结束 。
3.5.2 do-while语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.26】 编写一程序计算 1+2+3+...+99+100。
#include <iostream.h>
void main( )
{
int sum,n;
n=1;
sum=0;
do
sum+=n;
n++;
} while(n<=100);
cout<<"sum=”<<sum<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 {
sum+=n;
n++;
} while(n<=100);
cout<<"sum=”<<sum<<endl;
}
说明,
(1) 对于一个循环问题,我们既可以用当型循环也可以用直到
型循环来解决问题。例 3.24用当型循环,例 3.26用直到型循环,都
完成了计算 0到 100之间整数的和。
(2) 直到型循环的循环体至少执行一次,当型循环的循环体可
能一次也不执行。例如,在上两例中,为循环变量 n设初值 1,都等
于 5050;
C++语言程序设计 第三章 结构化程序设计
但如果循环变量 n的初值设为 101,则两种语句执行的结果就不同了,
while语句的执行结果是 0(即循环体语句部分一次也不执行),而
do-while语句的执行结果是 101(即循环体语句部分执行一次)。
for语句是 C++语言中使用最灵活方便的一种循环语句,它不仅用于
循环次数已知的情况,还能用于循环次数预先不能确定只给出循环
结束条件的情况。
for语句的一般形式为,
for(表达式 1;表达式 2;表达式 3)
语句 ; //循环体
其执行过程是,
3.5.3 for语句
C++语言程序设计 第三章 结构化程序设计
(1) 求解表达式 1。
(2) 求解表达式 2,若其值为真(值为非 0),则执
行 for语句中指定的循环体语句,然后执行下面的第⑶步。若为假
(值为 0),则结束循环,转到第⑸步。
(3) 求解表达式 3。
(4) 转回上面第⑵步继续执行。
(5) 循环结束,执行 for语句后面的其它语句。
与前两类循环类似,用作循环体的语句不仅可以是单个语句,
也可以是复合语句或空语句。
for语句中的三个表达式必须用分号隔开,其中表达
式 1一般用来初始化循环控制变量;表达式 2为表示循环条件的表达
式,用作循环条件控制,其作用与前两类循环语句中的表达式完全
一样,用法也基本相同;
C++语言程序设计 第三章 结构化程序设
计
表达式 3用来修改循环控制变量,用以表示循环控制变量的增量或
减量,常用自增或自减运算。
【 例 3.27】 用 for循环解决例 3.24的求和问题。
#include <iostream.h>
void main( )
{
int sum,n;
sum=0;
for(n=1;n<=100;n++)
sum+=n;
cout<<"sum="<<sum<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 说明,
(1) 语句 for(n=1;n<=100;n++) sum+=n;
相当于以下语句,
n=1;
while(n<=100)
{
sum+=n;
n++;
}
显然,用 for语句简单、方便。
C++语言程序设计 第三章 结构化程序设计
(2) 需要提及的是,for语句中的表达式 1和表达式 3一般为简单表
达式,但也可以使用逗号表达式,这是 for语句的一个很有用的特
性,当使用逗号表达式时,可一次完成对多个变量赋初值和修改多
个变量的功能,例如,
for(i=0,j=100;i<j;i++,j--) k=i+j;
表达式 1和表达式 3都使用了逗号表达式,即同时为
两个变量赋初值,同时使两个变量增值。
【 例 3.28】
#include<iostream.h>
void main( )
{int s,n;
for(s=0,n=1;n<=100;n++)
s+=n;
C++语言程序设计 第三章 结构化程序设
计 cout<<"s="<<s<<endl;
}
注:本例 for语句的表达式 1使用了逗号表达式,与例 3.27相比循环
结构更为紧凑和清晰。
for语句中的三个表达式允许省略或部分省略,以充
分体现其灵活性,但用作分隔符的两个分号绝不能省略。以下是省
略表达式的几种情况,
(1) 省略表达式 1。此时应在 for语句之前给循环变量
赋初值。语句格式为,for(;表达式 2;表达式 3)
语句 ;
例如,//求和
i=1;
for (;i<=50;i++) //分号不能省略
sum+=i;
C++语言程序设计 第三章 结构化程序设
计 (2) 省略表达式 2。此时循环继续条件永为真,必须在循环体中有
跳出循环的控制条件语句,否则构成死循环。语句格式为,
for(表达式 1;;表达式 3)
语句 ;
例如,//求和
for (i=1;;i++) //分号不能省略
{
sum+=i;
if(i>50) //if语句控制跳出循环
break; //功能为强制跳出循环
}
(3) 省略表达式 3。 此时需在循环体内使循环控制变量递变, 以保
证循环正常结束 。 语句格式为,
for(表达式 1;表达式 2;)
语句 ;
C++语言程序设计 第三章 结构化程序设
计 例如,//求和
for (i=1;i<=50;) //分号不能省略
sum+=i++; //累加的同时改变循环变量
(4) 省略表达式 1和省略表达式 3。 此时需要预先赋初值, 在循环体
内修改循环变量的值 。 语句格式为,
for(;表达式 2;)
语句 ;
例如,//求和
i=1; //循环变量预先赋值
for (;i<=50;) //分号不能省略
sum+=i++; //累加的同时改变循环变量
(5) 省略三个表达式 。 此时需要预先赋初值, 在循环体内修改循环
变量的值, 在循环体中有跳出循环的控制条件语句 。 语句格式为,
For(;;)
语句 ;
C++语言程序设计 第三章 结构化程序设计
例如,//求和
i=1; //循环变量预先赋值
for (;;) //分号不能省略
{
sum+=i++; //累加的同时改变循环变量
if(i>50) //控制跳出循环
break;
}
C++语言程序设计 第三章 结构化程序设
计 3.5.4跳转语句 break 和 continue
前面我们介绍了 C++语言的三种循环语句,它们退出循环的
方式是以某个表达式的结果值作为判断条件,当其值为 0时结束
循环,这属正常退出。 除了这种正常结束循环的方式外,还可
以利用 C++语言提供的 break语句在循环的中途退出循环,这属
于强行退出。在实际应用中,break语句一般都是与 if条件语句
配合使用。
break语句也被称为中断语句, 形式如下所示,
break;
该语句被限定使用在任一种循环语句和 switch语句中,
当程序执行到该语句时, 将立即结束所在循环语句或 switch语
句的执行, 接着执行其后面的语句 。
break语句也可以用于嵌套的循环结构中,在这种情况下,
如执行 break则仅仅 退出包含该 break语句的那层循环,即
break语句不能使程序控制退出一层以上的循环。
1.break语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.29】 已知产值及产值增长速度,编写计算产值增长一倍所需
的年数的程序。
#include<iostream.h>
void main()
{
double a,c=100000000.00; //c代表已知的当前产值 ;
for(;;){ //第 5行
int year=0; //y代表所要求的年数
cout<<"请输入增长率,";
cin>>a; //a代表增长率
if(a<=0.0) break;
double c1=c;
for(;;){ //第 11行
C++语言程序设计 第三章 结构化程序设
计 c1*=(1+a); //c1代表增长后的产值
++year;
if(c1>2*c) break;
}
cout<<"增长率为 "<<a
<<"时产值增长一倍所需年数为:
"<<year<<endl;
}
}
运行结果,
请输入增长率,0.2↙
增长率为 0.2时产值增长一倍所需年数为,4
请输入增长率,0↙
C++语言程序设计 第三章 结构化程序设
计
注:程序中使用了两个 break语句:第 1个 break语句,表示当
所输入的增长率 a小于等于 0时,说明与题意不符,需立即退出第 5
行的 for语句;第 2个 break语句,表示当产值已达到 2倍时,year中
所存的数就是所求的年数,这时无需再执行第 11行的 for语句了,
必须从该 for语句中退出。
continue语句也用于循环结构中, 它的作用是忽略它之
后到循环终止的程序, 而转向下一次循环 。 和 break语句一样,
continue语句通常也是和 if语句结合, 一同使用于循环结构中 。
2,Continue语句
C++语言程序设计 第三章 结构化程序设
计 【 例 3.30】 将 100~ 150之间不能被 3整除的数输出。
#include<iostream.h>
void main( )
{ int i,count=0;
for(i=100;i<=150;++i)
{
if(i%3==0)
continue;
cout<<i<<" "; count++;
if(count%5==0) cout<<endl; //一行输出 5个数据
}
cout<<endl;
}
C++语言程序设计 第三章 结构化程序设
计 程序的运行结果为,
100 101 103 104 106
107 109 110 112 113
115 116 118 119 121
122 124 125 127 128
130 131 133 134 136
137 139 140 142 143
145 146 148 149
注:当 n能被 3整除时, 执行 contiune语句, 结束本次循环 ( 即
跳过 cout输出语句 ), 进行下一次循环 。 只有 n不能被 3整除时才执
行 cout输出语句 。
continue和 break的作用有相似之处, 却也有着根本区别,
continue语句只是结束本次循环, 还要进行下一次循环, 而不是要
结束整个循环 ;break则是结束整个循环, 转到循环体外面去了 。
C++语言程序设计 第三章 结构化程序设计
一个循环体内包含另一个完整的循环结构称
为循环的嵌套,内嵌的循环中还可以嵌套循环,
这就是多重循环。
【 例 3.31】 输出 100以内的所有素数。
#include<iostream.h>
#include<iomanip.h>
void main( )
{ int i,n,count=0;
for(n=2;n<100;++n)
{
for(i=2;i<n;++i)
if(n%i==0)
break;
3.5.5循环的嵌套
C++语言程序设计 第三章 结构化程序设计
if(i==n)
{
cout<<setw(4)<<n;
count++;
if(count%5==0) 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
C++语言程序设计 第三章 结构化程序设计
注:该程序是由两层循环组成的循环嵌套结构,第一层是自
for(n=2;n<=100;++n)开始到程序末,第二层自 for(i= 2;i<n;++i)
开始到 cout<<endl;语句。 break语句执
行的条件是 (n%i==0),即 n能被 i整除, 一旦该条件成立就强行结束
for(i=2;i<n;++i)开始的循环, 例如当 n=9时由于 9能被 3整除, 所
以内层循环执行到 i=3就强行结束, 不再执行 i=4;i=5;…。
三种循环可以互相嵌套, 但在循环的嵌套中要注意, 内
层循环应完全在外层循环里面, 也就是不允许出现交叉 。 在嵌套的
循环结构中, 如用缺口矩形表示每层循环结构时, 则图 3.8中 (a)、
(b)是正确的多层循环结构, 而 (c)是错误的多层循环结构, 因为它
出现了循环结构的交叉 。
另外, 使用循环结构时必须注意, 如果循环的控制条件
永远成立, 循环体将永无休止地反复执行, 程序就将陷入, 死循
环,, 这显然是应当防止的 。
C++语言程序设计 第三章 结构化程序设计
(a) (b) (c)
图 3.8 多层循环结构
C++语言程序设计 第三章 结构化程序设计
【 例 3.32】 求出所有的, 水仙花数,
,水仙花数, 是指一个三位数,其各位数字的立方和恰好等于该数
本身。例如 153=1*1*1+5*5*5+3*3*3,所以 153是, 水仙花数, 。
依题意,从 100到 999循环查找, 水仙花数, 即可。
本程序主要用到 for循环语句和 if选择语句。程序如下,
#include<iostream.h>
void main()
{ int i,a,b,c;
for (i=100;i<=999;i++)
{ a=i/100; //a是数 i的百位数
b=i/10-a*10; //b是数 i的十位数
3.6程序设计举例
C++语言程序设计 第三章 结构化程序设计
c=i-b*10-a*100; //c是数 i的个位数
if(i==a*a*a+b*b*b+c*c*c)
cout<<a<<b<<c<<endl;
}
}
程序的运行结果为,
153
370
371
407
【 例 3.33】 输入年、月,打印出该年份、该月的天数。
根据历法,凡是 1,3,5,7,8,10,12月,每月 31天,凡是 4,6、
9,11月,每月 30天,2月份闰年 29天,
C++语言程序设计 第三章 结构化程序设计
平年 28天。据此,题中采用多个 case可共同使用一个语句组的
switch语句,完成不同天数的选择。
另外,判断某年是否为闰年的规则是:如果此年号能被 400
整除,则是闰年;否则,如果此年号能被 4整除,而不能被 100整除,
则是闰年;否则不是闰年。题中采用嵌套的 if语句完成闰年的判断。
定义了 leap作为判断变量。
本程序主要用到 switch多分支选择语句和嵌套 if选择语句。
程序如下,
#include<iostream.h>
void main()
{ int year,mon,days,leap;
cout<<"年 月,";
C++语言程序设计 第三章 结构化程序设计
cin >>year>>mon;
switch (mon)
{
case 1,
case 3,
case 5,
case 7,
case 8,
case 10,
case 12:days=31;
break;
case 4,
case 6,
C++语言程序设计 第三章 结构化程序设计
case 9,
case 11:days=30;
break;
case 2:if (year%400==0)
leap=1;
else if (year%4==0&&year%100!=0)
leap=1;
else leap=0;
if (leap) days=29;
else days=28;
}
C++语言程序设计 第三章 结构化程序设计
cout<<year<<"年 "<<mon<<"月的天数为,"<<days<<endl;}
【 例 3.34】 用牛顿迭代法求解 x3=3x+1的一个根。
迭代法是求解方程根的常用方法,它是一种重要的逐次逼近
的方法,此方法是用某个迭代格式 (迭代公式 )根据旧值 X0生成一个
新值 X1,然后再把新值当作旧值,不断重复上面的过程,逐步精确
化,最后得到满足精度要求的结果,简言之,一组指令的重复执行
即为迭代。牛顿迭代法又称牛顿切线法,它比一般的迭代法具有更
快的收敛速度,但它对初值要求很严,当初值偏离准确解太多时,
有可能不收敛。因此,一般为便于分析,先把两个函数的曲线做出
来,它们的交点就是方程的根,这样就可以估计出根的所在区间,
使得初值更接近准确解。
C++语言程序设计 第三章 结构化程序设计
x
y=3x+1 y
图 3.10 曲线示意图
y
y=x3
C++语言程序设计 第三章 结构化程序设
计 我们先把函数 y1=x3和 y2=3x+1的两条曲线做出来 (见图 3.10),
它们的交点就是方程 x3=3x+1的根,由图可见 x3=3x+1的一个根在 -
1.6~ -1.5之间,另一个根在 -0.5~ -0.3之间,再一个根在 1.8~ 2.0之
间,必须在不同的区间分别迭代才能求出每个根。现在我们把 X在 -
0.5~ -0.6之间的根找出来。取 X的初值为 -0.5,精度取 0.000001。
本程序主要用到 while循环语句。程序如下,
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
double x=0.0,y1,y2;
double x1=-0.5; //*为 x1赋初值 -0.5*/
cout<<" x x1 x*x*x 3*x+1\n";
while((fabs(x1-x))>0.000001)
{
x=x1;
y1=x*x*x-(3*x+1);
y2=3*x*x-3;
x1=x-y1/y2;
cout<<setiosflags(ios::fixed)<<endl;
cout<<setprecision(6)<<x<<" "
C++语言程序设计 第三章 结构化程序设计
<<setprecision(6)<<x1<<" "
<<setprecision(6)<<x*x*x<<" "
<<setprecision(6)<<3*x+1<<endl;
}
cout<<endl<<"x="<<setprecision(6)<<x<<endl;
}
程序运行的结果为,
x x1 x*x*x 3*x+1
-0.500000 -0.333333 -0.125000 -0.500000
-0.333333 -0.347222 -0.037037 0.000000
-0.347222 -0.347296 -0.041862 -0.041667
-0.347296 -0.347296 -0.041889 -0.041889
x=-0.347296
C++语言程序设计 第三章 结构化程序设
计 【 例 3.35】 编一程序,将任意自然数 m的立方表示为 m个连续的奇
数之和。例如,
13=1
23=5+3=8
33=11+9+7=27
43=19+17+15+13=64
分析上面所列 m3的奇数和,可以看出一个规律,组成 m3的 m个
奇数中最大的奇数为 m(m+1)-1,这样就不难得到其余奇数了。
本程序主要用到 do-while循环语句。程序如下,
#include <iostream.h>
void main( )
{ int m,n,i,sum;
C++语言程序设计 第三章 结构化程序设
计 cout<<"Enter an integer:";
cin>>n;
if(n<1)
cout<<n<<"<1,Error! \n";
else
{
m=n*(n+1)-1;
sum=m;
i=n-1;
cout<<n<<”*”<<n<<”*”<<n<<”="<<m;;
do
C++语言程序设计 第三章 结构化程序设
计 { i--;
m=m-2;
sum=sum+m;
cout<<”+”<<m;
}while(i!=0);
}
cout<<"=”<<sum<<endl;
}
若运行时输入,6
程序运行的结果为,
inter an integer,6↙
6*6*6=41+39+37+35+33+31=216
【 例 3.36】 实现打印九九乘法表 。
本程序主要用到嵌套 while循环语句 。 程序如下,
#include<iostream.h>
#include<iomanip.h>
void main()
{
int i,j,result;
i=1;
j=1;
cout<<"九九乘法表,"<<"\n";
while (i<=9)
{
C++语言程序设计 第三章 结构化程序设
计
C++语言程序设计 第三章 结构化程序设
计 j=1;
while (j<=i)
{
result=i*j;
cout<<j++<<"*"<<i<<"="<<setw(2)<<result<<" ";
}
i++;
cout<<"\n";
}
}
九九乘法表,
1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72
9*9=81
C++语言程序设计 第三章 结构化程序设
计
?1.下列关于条件语句的描述中,是错误的。
A if语句中只有一个 else子句。
B if语句中可有多个 else if子句。
C if语句中 if体内不能是 switch语句。
D if语句的 if体中可以是循环语句。
?2.以下程序段 。
int x=-1;
do
{ x=x*x;}
while (!x);
A 是死循环 B 循环执行两次 C 循环执行一次 D 有语法错误
C++语言程序设计 第三章 结构化程序设计
习题
?3.给出下面程序运行后的输出结果。
#include <iostream.h>
void main()
{
int i,j;
for (i=0;i<5;i++)
{
for (j=i;j<5;j++)
cout<<"*";
cout<<endl;
}
}
C++语言程序设计 第三章 结构化程序设计
若用 0至 9之间不同的三个数构成一个三位数,以下程序将统计出共
有多少种构成方法。请填空。
#include <iostream.h>
void main()
{ int i,j,k,count=0;
for (i=1;i<=9;i++)
for (j=0;j<=9;j++)
if (① ) continue;
else for (k=1;k<=9;k++)
if (② ) count++;
cout<<count<<endl;
}
C++语言程序设计 第三章 结构化程序设计
?5.编一程序,求 1!+2!+3!+…+10!之和。
?6.编一程序,用牛顿迭代法求解 2x3-4x2+3x-6=0在 1.5附近的根。
?7.编一程序,将输入数据按小于 10,10~ 99,100~ 999,1000 以
上分类并显示。例如,输入 358时,显示 358 is 100 to 999。
?8.编一程序,输出以下图形,
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
? *
C++语言程序设计 第三章 结构化程序设计
?9.编一程序,求满足如下条件的最大的 n 。
12+22+32+…+n2≤1000
?10.一百万富翁遇到一陌生人,陌生人找他谈一个换钱计划,该
计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二
天我仍给你十万元,你给我二分钱,第三天我仍给你十万元,你给
我四分钱,……,你每天给我的钱是前一天的两倍,直到满一个月
( 30天)。百万富翁很高兴,欣然接受了这个契约。请编写一个程
序计算这一个月中陌生人给了百万富翁多少钱,百万富翁给了陌生
人多少钱。
C++语言程序设计 第三章 结构化程序设计
C++语言程序设计 第三章 结构化程序设计
习题答案
第 1题 答案为 A
第 2题 答案为 C
第 3题 执行结果 *****
****
***
**
*
第 4题 答案:① i==j② j==k
第 5题,编一程序,求 1!+2!+3!+… +10!之和。
#include <iostream.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
int s,n,i,j;
for (j=0,i=1;i<=10;i++)
{
for (s=0,n=1;n<=i;n++)
{s*=n;}
j+=s;
}cout<<j<<endl;
}
第 6题
#include<iostream.h>
#include<math.h>
void main()
{
C++语言程序设计 第三章 结构化程序设计
double x=0.0,y1,y2;
double x1=1.5;
while((fabs(x1-x))>0.000001)
{
x=x1;
y1=2*x*x*x-4*x*x+3*x-6;
y2=6*x*x-8*x+3;
x1=x-y1/y2;
}
cout<<x<<endl;
}
C++语言程序设计 第三章 结构化程序设计
第 7题
#include <iostream.h>
void main()
{ int i;
cin>>i;
if(i<10)
cout<<i<<"is 0 to 9"<<endl;
else if (i<100)
cout<<i<<"is 10 to 99"<<endl;
else if (i<1000)
cout<<i<<"is 100 to 999"<<endl;
else
cout<<i<<"is biger than 1000"<<endl;}
C++语言程序设计 第三章 结构化程序设计
第 8题
#include<iostream.h>
void main()
{
int m=3,n=0;
for(int i=0;i<7;i++)
{
for(int j=0;j<7;j++)
{
if(j<=(m+n)&&j>=(m-n))
cout<<"*";
else
C++语言程序设计 第三章 结构化程序设计
cout<<" ";
}
cout<<endl;
if(i<3)
n++;
else
n--;
}
}
C++语言程序设计 第三章 结构化程序设计
第 9题
#include <iostream.h>
void main()
{ int i=1,s=0,t;
do{t=i*i;
s+=t;
i++;}while(s<=1000);
cout<<i-1<<endl;
}
第 10题
#include <iostream.h>
void main()
{ long int i,x,y=0,s=1;
x=100000*30;
cout<<"陌生人给富翁 "<<x<<"元 ";
for(i=0;i<30;i++)
{s=s*2;
y=y+s;}
cout<<" 富翁给陌生人 "<<y/100<<"元 ";
}