第三章 基本控制结构程序设计

95
ok 第第第 第第第第第第第第第第 第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第第 第第 第第第 C++ 第第第第第第第第第第第第第第 第第第第第 第 。一 第第第第

description

第三章 基本控制结构程序设计. 结构化程序设计的特点是任何程序都可由 三种基本结构 及其组合来描述。本章将介绍 C++ 分支结构和循环结构的设计方法。还将介绍一些 常用算法 。. 第三章 基本控制结构程序设计. 3 . 1 分支结构程序设计. 3 . 2 循环结构 程序设计. 3 . 3 转向语句. 3 . 4 常用算法的应用实例. 3 . 5 枚举类型. 3 . 6 输入输出文件简介. 3.1 分支结构程序设计. - PowerPoint PPT Presentation

Transcript of 第三章 基本控制结构程序设计

Page 1: 第三章  基本控制结构程序设计

ok

第三章 基本控制结构程序设计结构化程序设计的特点是任何程序都可由三种基本结构及其组合来描述。本章将介绍 C++ 分支结构和循环结构的设计方法。还将介绍一些常用算法。

Page 2: 第三章  基本控制结构程序设计

ok

第三章 基本控制结构程序设计 33 .. 1 1 分支结构程序设计分支结构程序设计

33 .. 5 5 枚举类型枚举类型

33 .. 4 4 常用算法的应用实例常用算法的应用实例 33 .. 3 3 转向语句转向语句

33 .. 2 2 循环结构循环结构程序设计程序设计

33 .. 6 6 输入输出文件简介输入输出文件简介

Page 3: 第三章  基本控制结构程序设计

ok

3.1 分支结构程序设计 对程序的运行流程进行控制,主要通过执行专门用来控制流程的语句来实现。流程控制语句也称为过程化语句。分支语句是三种基本流程控制语句之一。 C++ 提供以下三种分支语句:

if 语句 条件运算符 “ ? : ” swith 语句

Page 4: 第三章  基本控制结构程序设计

ok

3.1 分支结构程序设计3.1.1 if 语句

3.1.2 条件运算符“ ?:”

3.2.1 swich 语句

Page 5: 第三章  基本控制结构程序设计

ok

3.1.1 if 语句if 语句有两种基本格式为: 1 、 if (< 表达式 >) < 语句 1>;

2 、 if (< 表达式 >) < 语句 1>

else < 语句 2>;

Page 6: 第三章  基本控制结构程序设计

ok

if 语句【例 3 . 1 】 输入一个年份,判断是否闰年。算法分析:假定年份为 year, 闰年的条件是 : year%4==0&&year%100!=0||year%400==0 。#include <iostream.h>void main( ){

int year;cout<<" 输入年份 :"<<endl;cin>>year;if (year%4==0&&year%100!=0

||year%400==0)cout<<year<<" 是闰年 "<<endl;

else cout<< year<<" 不是闰年 "<<endl; }

ok

Page 7: 第三章  基本控制结构程序设计

ok

分析:读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数。#include <iostream.h>void main(){ int a, b, c, max; cout<<" 输入三个正数 :"; cin>>a>>b>>c; cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘

<<"c="<<c<<endl; if(a>b) max=a; else max=b; if(c>max) cout<< “ 最大数为 :”<<c<<endl; else cout<< “ 最大数为 :”<<max<<endl; }

if 语句【例 3 . 2 】 从键盘上输入三个整数,输出其中的最大数。

ok

Page 8: 第三章  基本控制结构程序设计

ok

if 语句中,如果内嵌语句又是 if 语句,就构成了嵌套 if 语句。 if 语句可实现二选一分支,而嵌套 if 语句则可以实现多选一的多路分支情况。嵌套有两种形式,第一种是嵌套在 else 分支中 :if (< 表达式 1>) < 语句 1>;else if (< 表达式 2>) 语句 2; else if … else < 语句 n>; 第二种是嵌套在 if分支中为:if (< 表达式 1>) if (< 表达式 2>) < 语句 1> ; else< 语句 2>;

if 语句

Page 9: 第三章  基本控制结构程序设计

ok

// 方法 1 :采用 if 中嵌套形式#include <iostream.h>void main(){

int a, b, c, max;cout<<" 输入三个正数 :";cin>>a>>b>>c;cout<<"a="<<a<<'\t'<<"b="<<b

<<'\t'<<"c="<<c<<endl;if(a>b) if(a>c) max=a; //a>b 且 a>c

else max=c; //a>b 且 a<celse if(b>c) max=b; //a<=b 且 b>c

else max=c; //a<=b 且 b<ccout<<" 最大数 max="<<max;}

if 语句【例 3.3 】用嵌套 if 语句完成【例 3.2 】的任务。

ok

Page 10: 第三章  基本控制结构程序设计

ok

// 方法 2 :采用 else 中嵌套形式#include <iostream.h>void main(){

int a,b,c,max;cout<<" 输入三个正数 :";cin>>a>>b>>c;cout<<"a="<<a<<'\t'<<"b="<<b

<<'\t'<<"c="<<c<<endl;if(a>b&&a>c) max=a;else if(b>a&&b>c) max=b; else max=c;cout<<" 最大数为 :max="<<max; }

if 语句

ok

Page 11: 第三章  基本控制结构程序设计

ok

要特别注意 else 和 if 的配对关系。 C++ 规定了 if 和 else 的“就近配对”原则,即相距最近且还没有配对的一对 if和 else 首先配对。按上述规定,第二种嵌套形式中的 else 应与第二个 if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“ {}”中。如第二种嵌套形式中,要让 else 和第一个 if 配对,语句必须写成:if ( 表达式 1) {if ( 表达式 2) 语句 1 ; } else 语句 2 ; 第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。

Page 12: 第三章  基本控制结构程序设计

ok

请看以下两个语句://语句 1:if(n%3==0)if(n%5==0) cout<<n<<″ 是 15 的倍数″ <<endl;else cout<< n<<″ 是 3的倍数但不是 5的倍数″ <<endl;// 语句 2:if(n%3==0){ if(n%5==0) cout<<n<<″ 是 15 的倍数″ <<endl; }else cout<< n <<″ 不是 3的倍数″两个语句的差别只在于一个“ {}”,但表达的逻辑关系却完全不同。

Page 13: 第三章  基本控制结构程序设计

ok

【例 3. 4】 某商场优惠活动规定,某种商品单 价为 80 元,一次购买 5件以上(包含 5 件) 10 件以下(不包含 10件)打 9 折,一次购买 10件以上(包含 10件) 打 8折。设计程序根据客户的购买量计 算总价。

if 语句

Page 14: 第三章  基本控制结构程序设计

ok

算法• 1 、输入购买件数 count ,设置单价 price=80

( 元 ) • 2 、根据 count 值确定折扣 discount ;• 3 、实际售价 amount=price*count*discount ;• 4 、输出 amount 的值。算法细化:• 2.1 、 if ( count<5 ) discount=1 ;• 2.2 、 if ( count>=5&&count<10 ) discount=0.9 ;• 2.3 、 if ( count>=10 ) discount=0.8 ;

ok

Page 15: 第三章  基本控制结构程序设计

ok

#include <iostream.h>void main(){ float price=80,discount,amount;// 单价 , 折扣 , 总价 int count; // 购买件数 cout<<" 输入购买件数 :"<<endl; cin>>count; if(count<5) discount=1; else if(count<10) discount=0.9; else discount=0.8; amount=price*count*discount; cout<<" 购买件数: "<<count<<endl; cout<<" 单价: "<<price<<'\t'<<" 折扣:“<<discount<<endl; cout<<" 总价: "<<amount<<endl; }请在 VC++ 平台上运行,输入不同的件数,使程序所有分支都可以被执行一次。ok

Page 16: 第三章  基本控制结构程序设计

ok

【例 3 . 5 】 求一元二次方程ax2+bx+c=0 的根。

其中系数 a(a≠0) 、 b 、 c 的值由键盘输入。分析:输入系数 a(a≠0) 、 b 、 c 后,令 delta= b2–4ac, 结果有三种情况:

若 delta=0 ,方程有两个相同实根; 若 delta>0 ,方程有两个不同实根; 若 delta<0 ,方程无实根。

if 语句

Page 17: 第三章  基本控制结构程序设计

ok

算法• 1 、输入系数 a(a≠0) 、 b 、 c ;• 2 、令 delta= b2–4ac ;• 3 、根据 delta 的值求方程的根;• 4 、输出方程的根;算法细化:• 3.1 、 if ( delta==0 )方程有两个相同实根;计算…• 3.2 、 if ( delta>0 )方程有两个不同实根;计算…• 3.3 、 if ( delta<0 )方程无实根;计算…

ok

Page 18: 第三章  基本控制结构程序设计

ok

#include <iostream.h>#include <math.h>void main(){float a,b,c;float delta,x1,x2;const float zero=0.0001;// 定义一个很小的常数cout<<" 输入三个系数 a(a!=0), b, c:"<<endl;cin>>a>>b>>c;cout<<"a="<<a<<'\t'<<"b="<<b<<'\t‘<<"c="<<c<<endl;delta=b*b-4*a*c;

求一元二次方程的根源程序

Page 19: 第三章  基本控制结构程序设计

ok

if(fabs(delta)<zero){ // 绝对值很小的数即被认为是 0cout<<" 方程有两个相同实根 :";cout<<"x1=x2="<<-b/(2*a)<<endl;}else if(delta>0){ delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)/(2*a);cout<<" 方程有两个不同实根 :";cout<<"x1="<<x1<<'\t'<<"x2=“<<x2<<endl;}else //delta<0cout<<" 方程无实根 !"<<endl;}请在 VC++ 平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。

Page 20: 第三章  基本控制结构程序设计

ok

3.1.2 条件运算符“ ?:” if 语句在某些情况下可以用条件运算符“ ?:”来简化表达。“ ?:” 是一个三元运算符,其构成的表达式格式为: < 表达式 1> ? < 表达式 2> : <表达式 3>执行逻辑:先计算表达式 1,若其值为真(或非0),则计算表达式 2(不计算表达式 3),并将该值作为整个表达式的值;反之,即表达式 1的值为假或为 0,则计算表达式 3(不计算表达式 2),并将该值作为整个表达式的值。 例如: int a=6,b=7, min=a<b?a:b; //min=6 min=a<b?++a:++b; //min=7 a=7 b=7 min=a<b?a++:b++; //min=6 a=7 b=7

ok

Page 21: 第三章  基本控制结构程序设计

ok

3.1.3 switch 语句用嵌套 if 语句可以实现多选一的情况。另外 C++中还提供了一个 switch 语句,称为开关语句,也可以用来实现多选一:switch ( 表达式 ) { case 常量表达式1 : 《语句序列1》《 break; 》 …… case 常量表达式 n: 《语句序列 n 》《 break; 》 《 default: 语句序列》}

Page 22: 第三章  基本控制结构程序设计

ok

switch 语句格式( 1 )各个 case (包括 default )分支出现的次序可以任意,通常将 default 放在最后。( 2 ) break 语句可选,如果没有 break 语句,每一个 case 分支都只作为开关语句的执行入口,执行完该分支后,还将接着执行其后的所有分支。因此,为保证逻辑的正确实现,通常每个 case 分支都与 break 语句联用。( 3 )每个常量表达式的取值必须各不相同,否则将引起歧义。

Page 23: 第三章  基本控制结构程序设计

ok

( 4 )允许多个常量表达式对应同一个语句序列。例如:char score;cin>>score; switch (score) {case ′A′: case ′a′: cout<<″excellent″;

break;case ′B′: case ′b′: cout<<″good″; break;default: cout<<″fair″; }( 5 )从形式上看, switch 语句的可读性比嵌套 i

f 语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。 ok

Page 24: 第三章  基本控制结构程序设计

ok

switch 语句例子【例 3 . 6 】 运输公司对所运货物实行分段计费。设运输里程为 s ,则运费打折情况如下:

s<250 不打折扣250<=s<500 2% 折扣500<=s<1000 5% 折扣1000<=s<2000 8% 折扣2000<=s<3000 10% 折扣3000<=s 15% 折扣

设每公里每吨的基本运费为 p ,货物重量为 w ,折扣为 d ,则总运费 f 为: f=p*w*s*(1-d)设计程序,当输入 p 、 w和 s 后,计算运费 f 。

Page 25: 第三章  基本控制结构程序设计

ok

算法1 、输入每吨运费 p 、货物重量 w 、运输里程 s ;2 、根据运输里程 s 计算折扣 d ;3 、计算总运费 f=p*w*s*(1-d) ;4 、输出计算结果;算法细化: 2 、根据运输里程 s 计算折扣 d

分析:如果用 switch 语句,必须使表达式符合语法要求,分析发现,里程 s 的分段点均是 250 的倍数,因此,将里程 s除以 250 ,取整数商,便得到若干整数值。ok

Page 26: 第三章  基本控制结构程序设计

ok

switch(c=s/250) { case 0: d=0; break; case 1: d=0.02; break; case 2: case 3: d=0.05; break; case 4: case 5: case 6: case 7: d=0.08; break; case 8: case 9: case 10: case 11:d=0.1;break; default:d=0.15; }

s<250 不打折扣250<=s<500

2% 折扣500<=s<1000

5% 折扣

1000<=s<2000 8% 折扣

2000<=s<3000 10% 折扣

3000<=s 15% 折扣

Page 27: 第三章  基本控制结构程序设计

ok

#include <iostream.h>#include <iomanip.h>void main( ){ int c,s; float p,w,d,f;

cout<<" 输入运输单价 p ,重量 w和里程 s:"<<endl;cin>>p>>w>>s; c=s/250;switch(c){case 0: d=0; break;case 1: d=0.02; break;case 2: case 3: d=0.05; break;case 4: case 5: case 6: case 7: d=0.08; break;case 8:case9:case10:case11:d=0.1;break;default:d=0.15;}f=p*w*s*(1-d);cout<<" 运输单价为 "<<p<<'\t'<<"重量为 "<<w<<'\t

‘<<"里程为 "<<s<<endl;cout<<" 折扣为 "<<d<<endl;cout<<" 运费为 "<<f<<endl;}请在 VC++ 平台上运行,输入不同的里程,使程序所有分支都可以被执行一次。

ok

Page 28: 第三章  基本控制结构程序设计

ok

【例 3 . 7 】 设计一个计算器程序,实现加、减、乘、除运算。分析:读入两个操作数和运算符,根据运算符完成相应运算。#include <iostream.h>void main( ){float num1,num2;char op;cout<<" 输入操作数 1 ,运算符,操作数 2 : "<<endl;cin>>num1>>op>>num2; switch(op){ case '+': cout<<num1<<op<<num2<<"="<<num1+num2<<endl; break; case '-': cout<<num1<<op<<num2<<"="<<num1-num2<<endl; break; case '*': cout<<num1<<op<<num2<<"="<<num1*num2<<endl; break; case '/': cout<<num1<<op<<num2<<"="<<num1/num2<<endl; break; default : cout<<op<<" 是无效运算符 !"; }} 常量表达式采用字符型,上机运行一下。

Page 29: 第三章  基本控制结构程序设计

ok

循环控制语句是三种基本流程控制语句之一。C++ 提供以下三种循环语句: while 语句 do-while 语句 for 语句

3.2 循环结构程序设计

Page 30: 第三章  基本控制结构程序设计

ok

循环结构程序设计3.2.1 while 语句

3.2.4 循环的嵌套 3.2.3 for 语句

3.2.2 do-while 语句

Page 31: 第三章  基本控制结构程序设计

ok

3.2.1 while 语句while 语句也称为当循环。语句格式为:while ( 表达式 )

循环体语句;

图 3.1 while 语句的执行流程图

求表达式的值表达式值为真 ?

执行循环体语句

Page 32: 第三章  基本控制结构程序设计

ok

while 语句【例 3 . 8 】 求 1+2+3+4 的值。

ok

N个连续整数相加算法1、设置变量 i用来放被加数,变量 sum用来放和值 ,并初始化 ;2、从第一个数开始,依次将被加数赋给 i ,并进行操作 sumsum+i;3、输出 sum;细化算法 2: while( 还有被加数 ){ i=当前被加数; sum+=i; i准备接受下一个被加数; }

Page 33: 第三章  基本控制结构程序设计

ok

源程序如下:#include <iostream.h>void main( ){ int i=1,sum=0;//循环初始条件 while(i<=4) { sum+=i; i++; //修改循环条件 } cout<<"sum="<<sum<<endl;

}在 VC++ 平台上运行,试一试是否正确ok

Page 34: 第三章  基本控制结构程序设计

ok

while 语句注意:在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。C++ 表达方式灵活,上例中的循环语句还可以写成:while (i<=n) sum+=i++;或者while (sum+=i++, i<=n) ;//循环体为空语句修改程序后在 VC++ 平台上运行,看是否正确

Page 35: 第三章  基本控制结构程序设计

ok

3.2.2 do-while 语句 do-while 语句称为直到循环,格式为: do 循环体语句 while( 表达式 )

是 表达式的值为真 ?

执行循环体语句求表达式的值

图 3.2 do-while 语句的执行流程图

Page 36: 第三章  基本控制结构程序设计

ok

do-while 语句do/while 语句和 while 语句的区别:多数情况下可以互相替代。区别是 do/while 语句至少执行一次循环体后再判断循环条件是否满足;while 语句先判断条件是否满足,然后才执行循环体。

Page 37: 第三章  基本控制结构程序设计

ok

【例 3 . 9 】 用迭代法求 a 的平方根近似值。求平方根的迭代公式为: 要求前后两个迭代根之差小于 10- 5 。

do-while 语句

迭代法求解: a 是已知正数, x 0 是迭代初值,给 x 0一个值,假定 x 0 = a/2 ;则用迭代公式依次计算:x1=(x0+a/x0)/2 ; x2=(x1+a/x1)/2 ;……xk+1=(xk+a/xk)/2 ;当 |xk+1 –xk|<ε(ε是一个较小的正数 )时,迭代终止,取 xk+1 的值为 a 的平方根近似值。

ok

Page 38: 第三章  基本控制结构程序设计

ok

1 、输入 a(a>0)及较小正数 delta( 也可用常变量 ) ;2 、 x 0 = a/2 ; 用迭代公式算 x1=(x0+a/x0)/2 ;3 、 while ( |x1 –x0|>=delta)

{ x 0 = x 1 ; //把最近的值给 x 0 ; x1=(x0+a/x0)/2 ;

} // 求 xk+1时只需要知道 xk 的值,所以只需 2 个变量;4 、取 x1 的值为 a 的平方根近似值,输出。2 、 3步骤很适合用 do/while 语句实现: x 1 = a/2 ; do{ x0=x1;

x1=(x0+a/x0)/2 ; } while ( |x1 –x0|>=delta) ;

和迭代法对应的程序算法是递推算法:

回到题目

Page 39: 第三章  基本控制结构程序设计

ok

#include<iostream.h>#include<math.h>void main( ){ float x0,x1,a; cout<<" 输入一个正数: "; cin>>a; if(a<0)cout<<a<<" 不能开平方 !"<<endl; else { // 有实数解的情况 x1=a/2; //x1 用于保存结果 do{ x0=x1;x1=(x0+a/x0)/2;} while (fabs(x1-x0)>=1e-5); cout<< a<<" 的平方根为: "<<x1<<endl; }}在 VC++ 平台上运行,输入 2, 3, 4, 5试一试是否正确回到题目

Page 40: 第三章  基本控制结构程序设计

ok

【例 3 . 10 】 输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。算法分析:1 、逐个读入文本中的字符,直到读到一个输入结束符 EOF 为止。2 、如何算行数?行结束标志为读到字符′ \n′ ;3 、如何算单词数?设一个变量 isword ,读到字符时 isword=1 ,读到间隔符时 isword=0 ;如果读到一个间隔符而此时 isword 值为 1 ,则说明刚读完一个单词;(如果读到一个字符而此时 isword值为 0 ,则说明刚开始读一个单词;)4 、如何算字符数?

do-while 语句

ok

Page 41: 第三章  基本控制结构程序设计

ok

算法1 、设置变量 line 、 word 、 ch 分别代表行数、单词数、非分隔字符数,并初始化 ;设置变量 isword 来辅助统计单词数 ;2 、 do{ 从键盘读入一个字符 c ;

if ( c==’\n’) line++;if ( 是单词开头 ) word++; if (c 不是分隔符 ) ch++; } while (c!= EOF );

3 、输出统计结果。将下面的程序在 VC++ 平台上运行,试一试是否正确

Page 42: 第三章  基本控制结构程序设计

ok

#include<iostream.h>void main( ) {char c;int line=0, word=0, ch=0;int isword=0;do {c=cin.get();if (ch==′ \n′) line++; //遇换行符行数 +1if (c!=′ ′&&c!=′ \t′&&c!=′\n′){ // 读到非间隔符 if(isword==0) word++;// 在单词的起始处给单词数 +1 ch++; //字符数加 +1 isword=1; }else isword=0; // 读到间隔符} while(c!=EOF);cout<<” 行数:” <<line<<endl;cout<<” 单词数:” <<word<<endl;cout<<”字符数:” <<char<<endl;}

Page 43: 第三章  基本控制结构程序设计

ok

3.2.3 for 语句 for循环语句的格式为:for ( < 表达式 1>;

< 表达式 2>;

< 表达式 3> )

<循环体语句 >

图 3.3 for 语句的执行流程图

否是

求表达式 1 的值求表达式 2 的值

表达式 2值为真 ?

执行循环体语句求表达式 3 的值ok

Page 44: 第三章  基本控制结构程序设计

ok

for 语句、 while 语句、 do/while 语句实现相同的功能: 1+2+3+4int i=1,sum=0; // 循环初始条件while(i<=4) { sum+=i; i++; //修改循环条件 }

int i=1,sum=0;// 循环初始条件do { sum+=i;

i++;//修改循环条件 } while(i<=4);

for( int i=1,sum=0; i<=4; i++ ){ sum+=i; }/* 习惯上:表达式 1 :循环初始条件;表达式 2 :循环终止条件;表达式 3:修改循环条件 */ok

Page 45: 第三章  基本控制结构程序设计

ok

for 语句的应用• for 语句的几点说明:1 、是先判断型的,同 while 语句;2 、使用更为灵活:三个表达式可以是任意表达式,因此他们就可以实现循环初始化、计算、修改循环条件等任务,而不一定非在循环体中进行;

Page 46: 第三章  基本控制结构程序设计

ok

for 语句的应用【例 3 . 11 】 设计程序输出 Fibonacii 数列的前 20项,要求每行输出 5 个数据。Fibonacii 数列定义如下:

算法分析:除了第 0项和第 1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;属递推算法。

Page 47: 第三章  基本控制结构程序设计

ok

算法:1、设置变量 n 表示第几项,变量 f 1 和 f 2 用来记住当前项 f 3 之前的两项 ;变量初始化 n=0 ;2、 while (当前项不到第 20项) { if (当前项是第 0项 ) f 1=0;

if (当前项是第 1项 ) f 2=1; if (当前项是第 2项或更高项 )f 3=f 1+f 2; 按要求输出 f 3 ; f 1=f 2; f 2=f 3; //记住最近两项

当前项后移一位; }

Page 48: 第三章  基本控制结构程序设计

ok

1n 1)-fib(n2)-fib(n1n 1 0n 0

fib(n)

【例 3 . 11 】 设计程序输出 Fibonacii 数列的前 20项,要求每行输出 2 个数据。 Fibonacii 数列定义如下:程序如下:// 文件名: Ex3_11.cpp#include<iostream.h>#include<iomanip.h>void main(){ int fib0=0,fib1=1,fib2;cout<<setw(5)<<fib0<<setw(5)<<fib1 <<endl;for(int n=3;n<=20;n++){fib2=fib0+fib1;cout<<setw(5)<<fib2;if(n%5==0) cout<<endl; // 控制每行 2 个数据fib0=fib1; fib1=fib2; }}

Page 49: 第三章  基本控制结构程序设计

ok

for 语句的应用在 VC++ 平台上运行运行结果:0 1 1 2 35 8 13 21 3455 89 144 233 377610 987 1597 2584 4181

Page 50: 第三章  基本控制结构程序设计

ok

【例 3.12 】 输入一个不超过 5位的整数,将其反向后输出。例如输入 247,变成 742 输出。算法分析:1 、将整数的各个数位逐个位分开,用一个数组保存各个位的值,然后反向组成新的整数。2 、将整数各位数字分开的方法是,通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位、百位……,直到整数的值变成 0 为止。

for 语句的应用

ok

Page 51: 第三章  基本控制结构程序设计

ok

数据:1 、设置变量 num 表示输入的整数,整型数组 digit[5] 用来存放 num 的各个位;变量 i 用来表示数组的当前下标;算法:1 、输入 num; 变量初始化: i=0;2 、 while ( num!=0 ) {

num 对 10 取余 ,得 num 的当前个位数 digit[i] ;

num 整除 10 ,即去掉个位数,十位变个位,百位变十位,……;i++; 数组 digit准备记录下一位;

}3 、将数组元素按下标从高到低的顺序输出;

Page 52: 第三章  基本控制结构程序设计

ok

程序如下:#include <iostream.h>void main(){int num,subscript;int digit[5];cout<<" 输入一个整数: "<<endl;cin>>num;cout<<" 原来整数为: "<<num<<endl;subscript=0; // 数组下标初值do{ digit[subscript]=num%10;num=num/10;subscript++; //修改下标} while (num>0);for(int i=0;i<subscript;i++)//整数的反向组合num=num*10+digit[i];cout<<"反向后整数为: "<<num<<endl;}在 VC++ 平台上运行,试一试是否正确

Page 53: 第三章  基本控制结构程序设计

ok

3.2.4 循环的嵌套

【例 3 . 13 】 打印九九表。打印格式为:* 1 2 3 4 5 6 7 8 9 1 1 2 2 43 3 6 9…9 9 18 27 36 45 54 63 72 81

当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。嵌套层次一般不超过 3层,已保证可读性。

Page 54: 第三章  基本控制结构程序设计

ok

循环的嵌套分析:1 、计算机的输出是按行进行的,因此可以先用一个循环语句输出第一行表头。2 、表中各行数据的输出可以用下面的算法描述:for (i=1; i<10; i++)

{ cout<<i; // 输出行号 输出第 i 行数据; //A

cout<<endl; //准备输出下一行 }

Page 55: 第三章  基本控制结构程序设计

ok

3 、第 A 行需要进一步细化。由于第 i 行数据是一组有规律的数列,每个数的值是其所在行与列的乘积,因此输出第 i 行可以:for (j=1; j<10; j++) cout<<setw(4)<<i*j;

4 、按上述算法输出的每一行都将有九列,即打印出的是矩形表而不是下三角形表。进一步分析发现每一行的列数与所在行数相关,因此要输出三角形表,上面的循环语句需稍作修改:for (j=1; j<=i; j++) cout<<setw(4)<<i*j;

将此语句放到顶层算法的 A 行即可。

循环的嵌套

Page 56: 第三章  基本控制结构程序设计

ok

算法:1 、输出表头,用一个循环语句即可;2 、输出表体:for (i=1; i<10; i++) { cout<<i; // 输出行号 输出第 i 行数据; //A cout<<endl; //准备输出下一行 }3 、 A 行细化: for (j=1; j<=i; j++) cout<<setw(4)<<i*j;

循环的嵌套

Page 57: 第三章  基本控制结构程序设计

ok

在 VC++ 平台上运行下面的程序:#include <iostream.h>#include <iomanip.h>void main() cout<<setw(3)<<'*'<<setw(4)<<' ';for(int i=1;i<10;i++)cout<<setw(4)<<i; // 输出表头 (乘数 )cout<<endl<<endl;for(i=1;i<10;i++){cout<<setw(3)<<i<<setw(4)<<' '; // 输出行号 ( 被乘数 )for(int j=1;j<=i;j++)cout<<setw(4)<<i*j; // 输出表中数据 (乘积 )cout<<endl; //准备输出下一行 } }

3.2.4 循环嵌套 __ 打印九九表

Page 58: 第三章  基本控制结构程序设计

ok

3.3 转向语句3 . 3 . 1 break 语句

3 . 3 . 4 return 语句 3 . 3 . 3 goto 语句 3 . 3 . 2 continue 语句

Page 59: 第三章  基本控制结构程序设计

ok

3.3.1 break 语句 break 语句只能用在 switch 语句和循环语句中,用来跳出 switch 语句或提前终止循环,转去执行 switch 语句或循环语句之后的语句。 在 for循环中可以用 break 结束循环:

for(; ;) { … if(< 表达式 >) break; …}

Page 60: 第三章  基本控制结构程序设计

ok

break 语句应用【例 3.14 】 给定正整数 m ,判定其是否为素数。分析:如果 m>2 , m 是素数的条件是不能被 2,3,… ,(取整)整除。因此可以用 2,3,… ,(取整)逐个去除m ,如果被其中某个数整除了,则 m 不是素数,否则是素数。——算法属于穷举法。1 、输入被测数 m ( m>2 );令整型变量 k= sqrt(m) 2 、判断 m 是否素数:设置辅助整型变量 i, 使 i 从 2 开始直到 k依次测试m能否整除 i, 若能,则不是素数; for( i=2;i<=k;i++ ) if(m%i==0) break ; /* 条件满足, m 不是素数 ,停止测试 , 结束 for 语句。 */3 、根据 i 是否已达到 k ,输出结果是否为素数。

Page 61: 第三章  基本控制结构程序设计

ok

#include <iostream.h>#include <math.h>void main(){int m,i,k;cout<<" 输入整数 m : "<<endl;cin>>m;if(m==2) cout<<m<<" 是素数 "<<endl;else{ k=sqrt(m);for(i=2;i<=k;i++) if (m%i==0) break;// 只要有一个整除,就可停止if(i>k) cout<< m<<" 是素数 "<<endl;//循环提前终止表示是非素数else cout<< m<<" 不是素数 "<<endl;}}在 VC++ 平台上运行,改一下,使程序自动算出 100 以内的素数

Page 62: 第三章  基本控制结构程序设计

ok

3.3.2 continue 语句 continue 语句只能用在循环语句中,用来终止本次循环。当程序执行到 continue 语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。 continue 语句与 break语句的区别在于,continue 语句结束的只是本次循环,而 break结束的是整个循环。

Page 63: 第三章  基本控制结构程序设计

ok

例:输出 1~ 100内 3 的倍数。分析:设置整型变量 I 从 1变化到 100 ,依次测试 I 是否 3 的倍数,算法属于穷举法。 for (I=1;I<=100;I++) { if ( I%3! =0) continue; //I 不是 3 的倍数,不输出,继续下一个 I; 输出 I 的值; //I 是 3 的倍数才输出 }

Page 64: 第三章  基本控制结构程序设计

ok

3.3.3 goto 语句 goto 语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从 goto 语句所在的地方转移到标号语句处。 goto 语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用goto 语句。但在某些特定场合下 goto 语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用 break语句,不仅要使用多次,而且可读性较差,这时 goto 语句可以发挥作用。

Page 65: 第三章  基本控制结构程序设计

ok

3.3.4 return 语句 return 语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。利用一个 return 语句可以将一个数据返回给调用者。通常,当函数的返回类型为 void时, return 语句可以省略,如果使用也仅作为函数或程序结束的标志。

Page 66: 第三章  基本控制结构程序设计

ok

3.4 常用算法的应用实例【例 3.15 】 用欧基里德算法(也称辗转法)求两个整数的最大公约数。分析:假定两个整数分别为 num1和 num2 ,最大公约数应当是不超过其中较小数的一个整数。辗转法的思想是:用 num1除以 num2 ,求出余数 resd ,如果 resd==0 ,则当前 num2就是最大公约数,否则如果 resd!=0 , num1=num2, num2=resd, 重复以上过程,直到 resd==0 为止。

【例 3.15 】【例 3.16 】【例 3.17 】 【例 3.18 】

Page 67: 第三章  基本控制结构程序设计

ok

1 、设置两个整型变量 num1和 num2代表两个数;输入 num1 、 num2 ;2 、辗转法: 2.1 、使 num1>num2; 2.2.1 、设置变量 resd=num1%num2 ; 2.2.2 、 if ( resd==0 )当前 num2就是最大公 约数;

Else { num1=num2, num2=resd;} 重复 2.2.1和 2.2.2 ,直到 resd==0 为止。 2.2 、 do{

resd=num1%num2 ; if ( resd==0 )当前 num2就是最大公约数;

else { num1=num2, num2=resd;}}while (resd!=0);

3 、输出当前的 num2 。

Page 68: 第三章  基本控制结构程序设计

ok

程序如下:#include<iostream.h>void main( ){

int num1,num2; cout<<" 输入两个整数: "<<endl;cin>>num1>>num2;cout<<num1<<" 和 "<<num2<<" 的 最 大 公 约 数为: ";for(;;){

int resd;resd=num1%num2;if(resd==0) break;num1=num2; num2=resd;

}cout<<num2<<endl;

}

Page 69: 第三章  基本控制结构程序设计

ok

【例 3 . 16 】 用筛选法求 100 之内的所有素数,并将这些素数输出,每行输出 2个数据。分析 算法一 穷举法:1、判断一个数是否素数?方法穷举法 ;2、 100 之内的所有素数?方法:一个个试 ;综上所述,得到一个循环嵌套的算法:

for ( int m=2 ; m<=100 ; k++ ) //穷举法 if ( m 是素数)按要求的格式输出 k;

k= sqrt(m); for(i=2 ; i<=k;i++) //穷举法 if(k%i==0) break ; //k 不是素数if (i<=k) k 不是素数; //刚才的 for 是由 break 结束的

Page 70: 第三章  基本控制结构程序设计

ok

分析 算法二 筛选法:1、一个数如果是其他数的倍数,则这个数肯定不是素数;2、在由 多个大于 1 的数 组成的集合中,剔除所有的非素数,剩下的就都是素数了;综上所述,得到算法二(及所需的相应数据):1 、将 100之内的整数映射到一个集合。可以采用一个数组 a 来表示,数组元素值为各个整数;2 、在数组 a 中,从素数 2 开始剔除掉新找到的素数的整数倍的元素值(置 0 ,非素数);3 、输出数组 a 中数组元素值非 0 的元素,他们都是素数。

Page 71: 第三章  基本控制结构程序设计

ok

算法二 第 2步 的细化(筛选法):for (i=0; i<=9; i++) // 数组下标 0~ 9 ,元素值 1~ 10{ 2.1 、 if (a[i]==0) continue; // i已被定为非素数,已被筛掉

2.2 、将数组中所有是 a[i]倍数的元素置 0 ; for(int j=i+1 ; j<=99 ; j++) if(a[j]%a[i]==0) a[j]=0;

2.3 、判定 a[i] 是否素数; if(a[i] 不是素数 ) a[i]=0; //a[i]肯定是素数 }

3.4 常用算法的应用实例

Page 72: 第三章  基本控制结构程序设计

ok

#include<iostream.h>#include<iomanip.h>#include<math.h>const int n=100;void main(){int a[n];int i,j;for(i=0;i<n;i++) a[i]=1+i; // 用数组保存整数 1-100a[0]=0; //1 不是素数,置 0for(i=0;i<n;i++){ if(a[i]==0) continue; //该数已经置 0, 判断下一个 for(j=i+1;j<n;j++) if(a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0 ; }

3.4 常用算法的应用实例

Page 73: 第三章  基本控制结构程序设计

ok

int count=0;cout<<"1—" <<n<<" 之间的素数: "<<endl;for(i=0;i<n;i++) // 输出所有素数if(a[i]!=0){ cout<<setw(6)<<a[i]; count++; if(count%10==0) cout<<endl;// 每行 10 个}cout<<endl;}运行结果: 1—100之间的素数:2 3 5 7 11 13 17 19 23 2931 37 41 43 47 53 59 61 67 7173 79 83 89 97

3.4 常用算法的应用实例

Page 74: 第三章  基本控制结构程序设计

ok

3.4 常用算法的应用实例【例 3 . 17 】 世界数学史上著名的“百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?分析:设鸡翁、母、雏分别为 i , j , k ,根据题意可得: i*5+j*3+k/3*1=100; i+j+k=100;

两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法(也叫穷举法)的应用。 i 、 j 、 k 可能的取值有哪些?分析可知,百钱最多可买鸡翁 20 ,鸡母 33 ,鸡雏 300 。

Page 75: 第三章  基本控制结构程序设计

ok

算法:for (i=0; i<=20;i++)

for (j=0; j<=33;j++) for (k=0; k<=300;k++) if ((i+j+k==100)&&(5*i+3*j+k/3==100))

cout<<i<<j<<k; 这个算法使用三重循环,执行时间函数是立方阶,循环体将执行 20*33*300=198000 次。我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间。

3.4 常用算法的应用实例

Page 76: 第三章  基本控制结构程序设计

ok

实际上,当 i 、 j 确定时, k就可由题目要求确定为 100-i-j ,因此实际上只要用 i 、 j去测试,用钱数检测就可以了。循环体将执行 :

20*33=660 次。算法改进为:for (i=0; i++<=20;)

for (j=0; j++<=33;)

if ( 5*i+3*j+(100-i-j)/3==100 )

cout<<i<<j<<k;

3.4 常用算法的应用实例

Page 77: 第三章  基本控制结构程序设计

ok

程序如下:#include <iostream.h>#include <iomanip.h>void main(){int i,j,k;cout<<" 公鸡 母鸡 小鸡 "<<endl;for(i=0;i<=20;i++) for(j=0;j<=33;j++){

k=100-i-j;if((5*i+3*j+k/3==100)&&(k%3==0)) //注意 (k%3==0)非常重要 ,想一想为什么 cout<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k

<<endl; }}

3.4 常用算法的应用实例

Page 78: 第三章  基本控制结构程序设计

ok

程序运行后将输出:公鸡 母鸡 小鸡 0 25 75

4 18 78

8 11 81

12 4 84

3.4 常用算法的应用实例

Page 79: 第三章  基本控制结构程序设计

ok

3.4 常用算法的应用实例【例 3.18 】 输入一个 8位二进制数,将其转换为十进制数输出。分析 : 二进制转换为十进制只要将每位二进制数乘以该位的权然后相加。实际上属于多项式求和问题 :

对于本例, x=2 。多项式的系数 a i 即为二进制数的各个位,可以用数组保存。 如果直接求幂再求和,需要做( n*(n+1)/2 )次乘法。现将多项式作如下变形:就变成一个十分简单的计算,仅做了 n 次乘法。

012-n

2-n1-n

1-nn

n axaxaxaxay

013-n2-n1-nn ax)aax)a)xaxa(((...y

Page 80: 第三章  基本控制结构程序设计

ok

算法:1 、数组 bin[8] 用来放各个二进制位;2 、整型变量 dec= 0 ; x=2; //初始化2 、 for(i=7;i>=0;i--) // 系数从 a n 到 a 0 依次投入运算

dec = dec * x + ( bin[i] - '0' ) ;

// ( bin[i] - '0' ):数字字符转换为数字

3.4 常用算法的应用实例

Page 81: 第三章  基本控制结构程序设计

ok

程序如下:#include<iostream.h>const int n=8;void main(){ char bin[n]; int x=2,a,dec,i; cout<<" 输入二进制序列: "<<endl; for(i=n-1;i>=0;i--) cin>>bin[i];// 先输入的是高位 dec=0; for(i=n-1;i>=0;i--){a=bin[i]-'0'; // 数字字符转换为数字dec= dec*x+a; } cout<<" 二进制序列 ("; for(i=n-1;i>=0;i--) cout<<bin[i]; cout<<") 的值为 :"<<dec<<endl;}

Page 82: 第三章  基本控制结构程序设计

ok

3.5 枚举类型

3 . 5. 1 枚举类型的定义 3 . 5. 2 枚举变量的使用

• 枚举类型 (enumerate) 是 c++ 中的一种派生数据类型,它是用户定义的若干枚举常量的集合。• 枚举类型的变量,只能取枚举常量表中所列的值。• 定义枚举类型的主要目的是增加程序的可读性。

Page 83: 第三章  基本控制结构程序设计

ok

3.5.1 枚举类型的定义 枚举类型的定义格式为:enum < 类型名 > {< 枚举常量表 >};关键字 enum 指明其后的标识符是一个类型的名字,枚举常量表中列出该类型的所有取值,各枚举常量之间以“,”间隔。例:enmu color_set1 {RED, BLUE, WHITE, BLACK};enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};枚举常量(或称枚举成员)是以标识符形式表示的整型量,例如下面的定义是非法的:enum letter_set {‘a’, ‘d’, ‘F’, ’s’, ‘T’};// 枚举常量只能是标识符enum year_set{2000,2001,2002,2003,2004,2005}; // 改为 y2000等则正确

Page 84: 第三章  基本控制结构程序设计

ok

3.5.1 枚举类型的定义 各个枚举常量代表该枚举类型的变量可能取的值,编译系统为每个枚举常量指定一个整数值,缺省状态下,这个整数就是所列举元素的序号,序号从 0开始。如上例中 RED 、 BLUE 、 WHITE 、 BLACK的值分别为 0、 1、 2、 3 。用户也可以在类型定义时为部分或全部枚举常量指定整数值,在第一个指定值之前的枚举常量仍按缺省方式取值,而指定值之后的枚举常量按依次加 1 的原则取值。各枚举常量的值可以重复,但各枚举常量标识符必须不同。例如,enum fruit_set {apple, orange, banana=1, peach, grape}enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};枚举常量 apple、 orange、 banana、 peach、 grape的值分别为 0、 1、 1、 2、 3 。枚举常量 Sun, Mon, Tue, Wed, Thu, Fri, Sat 的值分别为 7、 1、 2、 3、 4、 5、6 。

Page 85: 第三章  基本控制结构程序设计

ok

3.5.2 枚举类型的变量的使用 1、定义枚举类型之后,就可以定义枚举类型的变量;亦可类型与变量同时定义(甚至类型名可省):color_set1 color1, color2;enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat} weekday1, weekday2;2、枚举变量的取值范围就是整型数的一个子集。枚举变量占用内存的大小与整型数相同。

Page 86: 第三章  基本控制结构程序设计

ok

3、枚举变量允许的操作只有赋值和关系运算;例如: if (color3==color4) cout<<” 相等”; cout<< color3<WHITE; 4、枚举变量不能直接输入,可以直接输出,但输出的是变量的整数值。例如: cin>>color1 //非法 cout<<color3 //合法,输出的是 2 从程序的合法性和可读性出发,枚举变量的输入输出一般都采用 switch 语句将其转换为字符或字符串。同时,枚举类型数据的其他处理也往往应用 switch 语句。

3.5.2 枚举类型的变量的使用

Page 87: 第三章  基本控制结构程序设计

ok

【例 3 . 19 】 口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取三个不同颜色的球,统计并输出所有的取法。分析:每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色。假设所取三个球的颜色分别为 i, j, k, 每个量都有 5种取值,其中 i≠j≠k就是满足要求的取法,因此用枚举算法 (穷举法 ) 可以解决。

3.5.2 枚举类型的变量的使用

Page 88: 第三章  基本控制结构程序设计

ok

算法:1、定义枚举类型及相应变量; enum color {red,yellow,blue,white,black}; color i,j,k,col;2、 for(i=red;i<=black;i++) for(j=red;j<=black;j++) if(i!=j) //前两个球颜色不同 for(k=red;k<=black;k++) if(k!=i&&k!=j)// 第三个球不同于前两个,满足要求;找到一种取法3、输出该取法:注意枚举量的输出方法。

3.5.2 枚举类型的变量的使用

Page 89: 第三章  基本控制结构程序设计

ok

程序如下:#include<iostream.h>#include<iomanip.h>void main(){enum color_set {red,yellow,blue,white,black};color_set color;int i,j,k,counter=0,loop;for(i=red;i<=black;i++) for(j=red;j<=black;j++) if(i!=j){ //前两个球颜色不同 for(k=red;k<=black;k++) if(k!=i&&k!=j){

// 第三个球不同于前两个,满足要求counter++; if((counter)%22==0){cout<<“ 请按回车键继续” ;// 每屏 22 行cin.get();

} cout<<setw(15)<<counter;

Page 90: 第三章  基本控制结构程序设计

ok

//下面输出每种取法,一行为一种取法的三个颜色 for(loop=1;loop<=3;loop++){ switch(loop){ case 1: color=(color_set) i; break;// 第一个是 i case 2: color=(color_set) j; break;// 第二个是 j

case 3: color=(color_set) k; break;// 第三个是k

} switch(color){

case red: cout<<setw(15)<<"red"; break;case yellow:cout<<setw(15)<<"yellow";break;case blue: cout<<setw(15)<<"blue"; break;

case white:cout<<setw(15)<<"white"; break;case black: cout<<setw(15)<<"black"; break;

} } //for_loop

cout<<endl; // 输出一种取法后换行

Page 91: 第三章  基本控制结构程序设计

ok

} //for_k } //for_j cout<<"共有: "<<counter<<" 种取法 "<<endl;}运行结果为:1 red yellow blue2 red yellow white3 red yellow black4 red blue yellow……共有 60 种取法

Page 92: 第三章  基本控制结构程序设计

ok

3.6 输入输出文件简介使用文件的步骤如下:1 .说明一个文件流对象(内部文件)。流类 ifstream支持从输入文件中提取数据的操作。而流类 ofstream完成数据写入输出文件中的各种操作。ifstream ifile(”d:\\my_in_file.txt”) ; // 输入文件ofstream ofile(”d:\\my_out_file.txt”) ; // 输出文件流对象 ifile 和 ofile 又被称为内部文件。特别注意:输入文件用于读,输出文件用于写。而引号中的” d:\\my_in_file.txt” 和” d:\\my_out_file.txt”为磁盘文件路径名,这样在文件流对象和磁盘文件名之间建立了联系。

Page 93: 第三章  基本控制结构程序设计

ok

2 .对文件进行读写操作。最常见的文件读写是顺序的,所谓“顺序”指的是从文件头开始进行。顺序读写可用 C++的提取运算符( >> )和插入运算符( << )进行。读写是在文件缓冲区中进行。3 .关闭文件。当打开一个文件进行读写后,应该显式地关闭该文件。与打开文件相对应:ifile.close();ofile.close();关闭文件时,系统把与该文件相关联的文件缓冲区中的数据写到磁盘文件中,保证文件的完整;同时把磁盘文件名与文件流对象之间的关联断开,可防止误操作修改了磁盘文件。

Page 94: 第三章  基本控制结构程序设计

ok

【例 3.20 】将百鸡问题计算结果存入文件,然后读出。#include<fstream.h>#include<iomanip.h>void main(){int i,j,k;char a[28]; ofstream ofile("d:\\myfile.txt");// 打开文件ofile<<" 公鸡 母鸡 小鸡 "<<endl;for(i=0;i<=20;i++) for(j=0;j<=33;j++){k=100-i-j; if((5*i+3*j+k/3==100)&&(k%3==0))

//注意 (k%3==0)非常重要 ofile<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k<<endl;// 写入文件}ofile.close();

Page 95: 第三章  基本控制结构程序设计

ok

ifstream ifile("d:\\myfile.txt");i=0;while(ifile.get(a[i])){ // 不可用 >>,它不能读//白字符包括空格,制表, backspace 和回车等) if(a[i]=='\n') break; i++; }a[i]='\0';cout<<a<<endl;while(1){ ifile>>i>>j>>k;// 由文件读入 if(ifile.eof()!=0) break; cout<<setw(6)<<i<<setw(10)<<j <<setw(10)<<k<<endl;//屏幕显示 }ifile.close();}找一找 D盘有无文件 myfile.txt