第三章 结构化程序设计
3,1 分支结构程序设计
3,5 枚举类型
3,4 常用算法的应用实例
3,3 转向语句
3,2 循环结构程序设计
3.1 分支结构程序设计
3,1,1 if语句
3,1,2 条件运算符,?:”
3,1,3 swith语句
3.1.1 if 语句
if语句有两种基本格式为:
if (<表达式 >) <语句 1>;
else <语句 2>;
3.1.1 if 语句
【 例 3,1】 输入一个年份,判断是否闰年 。
分析:假定年份为 year,闰年的条件是,
year%4==0&&year%100==0||year%400==0。
程序如下:
//文件名,EX3_1.cpp
#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;}
输入年份,
1994
1994%4!=0
3.1.1 if 语句输入三个整数
10 8 23
a=10 b=8 c=23
a>b max=10
最大数为,
c>max 输出 23
【 例 3,2】 从键盘上输入三个整数,输出其中的最大数 。
分析,读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数 。 程序如下:
//文件名,Ex3_2.cpp
#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;
cout<<"最大数为,";
if(c>max) cout<<c<<endl;
else cout<<max<<endl; }
3.1.1 if 语句
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>;
3.1.1 if 语句
【 例 3,3】 用嵌套 if语句完成 【 例 3,2】 的任务 。
//方法 1:采用第二种嵌套形式
//文件名,Ex3_31.cpp
#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<c
else //a<=b
if(b>c) max=b; //b>=a且 b>c
else max=c; //b>=a且 b<c
cout<<"最大数为,max="<<max<<endl;}
输入三个整数
10 8 23
a=10 b=8 c=23
a>b a<c max=c
输出 最大数为,max=23
3.1.1 if 语句
//方法 2:采用第一种嵌套形式
//文件名,Ex3_32.cpp
#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<<endl; }
输入三个整数
10 8 23
a=10 b=8 c=23
a>b a<c max=c
输出 最大数为,max=23
3.1.1 if 语句
【 例 3,4】 某商场优惠活动规定,某种商品单价为 80元,一次购买 5件以上 ( 包含
5件 ) 10件以下 ( 不包含 10件 ) 打 9
折,一次购买 10件以上 ( 包含 10件 )
打 8折 。 设计程序根据客户的购买量计算总价 。
3.1.1 if 语句
//文件名,Ex3_4.cpp
#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; }
输入购买件数
count=3
count<5 discount=1
amount=80*3*1=240
输出 购买件数,3
单价,80 折扣,1
总价,240
3.1.1 if 语句输入购买件数
count=9
5<count<10 discount=0.9
amount=80*9*0.9=648
输出 购买件数,9
单价,80 折扣,0.9
总价,648
//文件名,Ex3_4.cpp
#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; }
3.1.1 if 语句输入购买件数
count=10
Count=10 discount=0.8
amount=80*10*0.8=640
输出 购买件数,10
单价,80 折扣,0.8
总价,640
//文件名,Ex3_4.cpp
#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; }
3.1.1 if 语句
【 例 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,方程无实根。
3.1.1 if 语句
//文件名,Ex3_5.cpp
#include <iostream.h>
#include <math.h>
void main(){
float a,b,c;
float delta,x1,x2;
const float zero=0.0001; //定义一个很小的常数
3.1.1 if 语句
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
输入三个系数 a(a!=0),b,c:
1 4 4
a=1 b=4 c=4
delta=4*4-4*1*4=0
方程有两个相同实根,
x1=x2=-4/(2*1)=-2
3.1.1 if 语句输入三个系数 a(a!=0),b,c:
1 -5 6
a=1 b=-5 c=6
delta=(-5)*(-5)-4*1*6=1
delta=sqrt(1)=1
x1=(5+1)/(2*1)=3
x2=(5-1)/(2*1)=2
方程有两个不同实根,
x1=3 x2=2
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
3.1.1 if 语句输入三个系数 a(a!=0),b,c:
1 2 4
a=1 b=2 c=4
delta=2*2-4*1*4=-12
方程无实根,
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
3.1.2 条件运算符,?:”
if语句在某些情况下可以用条件运算符,?:”来简化表达 。,?:”是一个三元运算符,其构成的表达式格式为:
<表达式 1>? <表达式 2>,<表达式 3>
执行的运算是,先计算表达式 1,若其值为真(或非 0),则计算表达式 2(不计算表达式 3),并将该值作为整个表达式的值;反之,即表达式 1的值为假或为 0;则计算表达式 3(不计算表达式 2),
并将该值作为整个表达式的值。
3.1.3 switch语句格式为:
switch (<表达式 >) {
case <常量表达式1 >,[<语句序列1 >] [break;]
case <常量表达式2 >,[<语句序列2 >] [break;]
…
case <常量表达式 n>,[<语句序列 n>] [break;]
[default,<语句序列 >]
}
3.1.3 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。
分析:如果用 switch语句,必须使表达式符合语法要求,分析发现,里程
s的分段点均是 250的倍数,因此,将里程 s除以 250,取整数商,便得到若干整数值 。
3.1.3 switch语句
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
输入运输单价 p,重量 w和里程 s:
100 10 200
c=200/250=0
c=0 d=0
f=100*10*200*(1-0)=200000
运输单价为 100
重量为 10 里程 200
折扣,0
运费为 200000
3.1.3 switch语句 输入运输单价 p,重量 w和里程 s:
100 10 400
c=400/250=1
c=1 d=0.02
f=100*10*400*(1-0.02)=392000
运输单价为 100
重量为 10 里程 400
折扣,0.02
运费为 392000
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
3.1.3 switch语句 输入运输单价 p,重量 w和里程 s:
100 10 3000
c=3000/250=12
c=12 d=0.15
f=100*10*3000*(1-0.15)=2550000
运输单价为 100
重量为 10 里程 3000
折扣,0.15
运费为 2550000
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
3.1.3 switch语句
【 例 3,7】 设计一个计算器程序,实现加,减,乘,除运算 。
分析:读入两个操作数和运算符,根据运算符完成相应运算 。
程序如下:
//文件名,Ex3_7.cpp
#include <iostream.h>
void main(){
float num1,num2;
char op;
3.1.3 switch语句
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<<"是无效运算符 !";
}
}
输入操作数 1,运算符,操作数 2:
100 * 3
op=*
100*3=300
3.1.3 switch语句输入操作数 1,运算符,操作数 2:
100 # 3
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<<"是无效运算符 !";
}
}
3.2 循环结构程序设计
3,2,1 while语句
3,2,4 循环的嵌套
3,2,3 for语句
3,2,2 do-while 语句
3.2.1 while 语句
while语句也称为当循环 。
语句格式为:
while (<表达式 >) <循环体语句 >;
图 3.1 while语句的执行流程图求表达式的值执行循环体语句表达式的值为真?
是否
3.2.1 while 语句
i= 1
sum= 0
i= 1 <4
2
1
Sum=0+1=0
I=1+1=2
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 2
sum= 1
3.2.1 while 语句
i= 2 <4
3
3
Sum=1+2=3
I=2+1=3
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 3
sum= 3
3.2.1 while 语句
i= 3 <4
4
6
Sum=3+3=6
I=3+1=2
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 4
sum= 6
3.2.1 while 语句
i= 4
5
10
Sum=6+4=10
I=4+1=5
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
3.2.1 while 语句
i= 5
sum= 0
i= 5 >4
输出
sum=10
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
3.2.2 do-while 语句
do-while语句称为直到循环,格式为:
do <循环体语句 > while(<表达式 >)
否是 表达式的值为真?
执行循环体语句求表达式的值图 3.2 do-while语句的执行流程图
3.2.2 do-while 语句
【 例 3,9】 用迭代法求的近似值 。 求平方根的迭代公式为:
要求前后两个迭代根之差小于 10-5。
分析,这是递推算法的一个应用 。 从键盘读入一个正数赋给 a,人为估计一个值作为迭代初值 x0,假定取 a/2,根据迭代公式求出 x1,若 |x1-x0|<10-5,则
x1就是所求的平方根近似值;否则,将 x1赋给 x0,再用公式迭代出新的 x1。
重复以上过程直到 |x1-x0|<10-5为止 。
程序如下:
//文件名,Ex3_9.cpp
#include<iostream.h>
#include<math.h>
void main(){
float x0,x1,a;
3.2.2 do-while 语句
cout<<"输入一个正数,"<<endl;
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;
}
}
3.2.2 do-while 语句
【 例 3,10】 输入一段文本,统计文本的行数,单词数及字符数 。 假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行 。
分析,逐个读入文本中的字符,直到读到一个输入结束符 EOF为止 。 其中行结束标志为读到字符 ′\n′。 先令 行数 line=0,单词个数 word=0,字符数
ch=0。 在读入过程中,每读到一个非间隔符,ch=ch+1,每读到一个 ′\n′,
line=line+1; 另设一个变量 isword,读到字符时 isword=1,读到间隔符时
isword=0,如果读到一个间隔符而此时 isword值为 1,则 word=word+1。
程序如下:
#include<iostream.h>
void main() {
char c;
3.2.2 do-while 语句
int line=0,word=0,ch=0;
int isword=0;
do {
c=cin.get();
if (ch==′ \n′) line++; //遇换行符行数 +1
if (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;}
3.2.3 for 语句
for语句也称 for循环,语句格式为:
for (<表达式 1>; <表达式 2>; <表达式 3>) <循环体语句 >
图 3.3 for语句的执行流程图否是求表达式 1的值求表达式 2的值表达式 2值为真?
执行循环体语句求表达式 3的值
3.2.3 for 语句
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
fib0=0
fib1=1
fib2=
0 1
1
n=3 n<4
n++
4
fib2=0+1=1
1
1
1
1n 1)-f i b ( n2)-f i b ( n
1n 1
0n 0
f i b ( n )
3.2.3 for 语句
fib0=0
fib1=1
fib2= 1
0 1
2
n=4 n=4
n++
5
fib2=1+1=2
2
1
1
1
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
3.2.3 for 语句
fib0=0
fib1=1
fib2= 1
0 1
2
n=5 结束
2
1
1
1
3.2.3 for 语句
【 例 3,12】 输入一个不超过 5位的整数,将其反向后输出 。 例如输入 247,变成 742输出 。
分析,将整数的各个数位逐个位分开,用一个数组保存各个位的值,然后反向组成新的整数 。 将整数各位数字分开的方法是,
通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位,百位 ……,直到整数的值变成 0为止 。
程序如下:
//文件名,Ex3_12.cpp
#include <iostream.h>
void main(){
int num,subscript;
int digit[5];
3.2.3 for 语句
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; }
digit[4]=
digit[3]=
digit[2]=
digit[1]=
digit[0]=
num=
subscript=
247%10=7
7
247/10=24
24724
0
Ssubscript++
1
输入一个整数,
原来整为,247
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]=
digit[0]=7
num=
subscript=
24%10=4
4
24/10=2
242
1
Ssubscript++
2
输入一个整数,
原来整为,247
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; }
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num=
subscript=
2%10=2
2
2/10=0
20
2
Ssubscript++
3
输入一个整数,
原来整为,247
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; }
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 0
subscript= 3
i= 0
2
输入一个整数,
原来整为,247
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; }
0<31
0*10+7=77
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 7
subscript= 3
i= 1
2
输入一个整数,
原来整为,247
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; }
1<32
7*10+4=7474
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 74
subscript= 3
i= 2
2
输入一个整数,
原来整为,247
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; }
2<33
74*10+2=742742
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 74
subscript= 3
i= 2
2
输入一个整数,
原来整为,247
3
742
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; }
反向后整数为,742
3.2.4 循环的嵌套
【 例 3,13】 打印九九表 。 打印格式为:
* 1 2 3 4 5 6 7 8 9
1 1
2 2 4
3 3 6 9
…
9 9 18 27 36 45 54 63 72 81
3.2.4 循环的嵌套分析:计算机的输出是按行进行的,因此可以先用一个循环语句输出第一行表头 。 表中各行数据的输出可以用下面的算法描述:
for (i=1; i<10; i++) { cout<<i; //输出行号输出第 i行数据; //A
cout<<endl; //准备输出下一行 }
第 A行需要进一步细化,由于第 i行数据是一组有规律的数列,每个数的值与其所在行与列有关,因此也可以用一个循环语句描述:
for (j=1; j<10; j++) cout<<setw(4)<<i*j;
按上述算法输出的每一行都将有九列,即打印出的是矩形表而不是下三角形表 。
进一步分析发现每一行的列数与所在行数相关,因此要输出三角形表,上面的循环语句需稍作修改:
for (j=1; j<=i; j++) cout<<setw(4)<<i*j;
将细化后的算法放到顶层算法的 A行即可 。
3.2.4 循环的嵌套程序如下:
//文件名,Ex3_13.cpp
#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; //准备输出下一行 } }
i= 1
1 2 3 4 5 6 7 8 9
1 1
3.2.4 循环的嵌套 i= 1
1 2 3 4 5 6 7 8 9
1 1
2 2 4
2
程序如下:
//文件名,Ex3_13.cpp
#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 循环的嵌套 i= 2
1 2 3 4 5 6 7 8 9
1 1
2 2 4
…
3
程序如下:
//文件名,Ex3_13.cpp
#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 循环的嵌套 i= 8
1 2 3 4 5 6 7 8 9
1 1
2 2 4
…
9 9 18 27 36 45 54 63 72 81
9
程序如下:
//文件名,Ex3_13.cpp
#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.3 转向语句
3,3,1 break语句
3,3,4 return语句
3,3,3 goto 语句
3,3,2 continue语句
3.3.1 break 语句
break语句只能用在 switch语句和循环语句 中,
用来跳出 switch语句或提前终止循环,转去执行
switch语句或循环语句之后的语句。
for循环必然是如下形式:
for(; ;) {
…
if(<表达式 >) break;
…
}
3.3.1 break 语句
【 例 3,14】 给定正整数 m,判定其是否为素数 。
分析,如果 m>2,m是素数的条件是不能被 2,3,…,( 取整 ) 整除 。
因此可以用 2,3,…,( 取整 ) 逐个去除 m,如果被其中某个数整除了,
则 m不是素数,否则是素数 。
程序如下:
//文件名,Ex3_14
#include <iostream.h>
#include <math.h>
void main(){
int m,i,k;
3.3.1 break 语句
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;
}
}
m= 10
k=
i=
输入整数,
3
2 10%2=0
break
2<3即 i<k
10不是素数
3.3.1 break 语句
m= 11
k=
i=
输入整数,
3
2 11%2!=0
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;
}
}
3.3.1 break 语句
m= 11
k=
i= 2
输入整数,
3
3 11%3!=0
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;
}
}
3.3.1 break 语句
m= 11
k=
i= 3
输入整数,
3
4
4>3 即 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;
}
} 11是素数
3.3.2 continue 语句
continue语句只能用在 循环语句 中,用来 终止本次循环 。当程序执行到 continue语句时,将跳过其后尚未执行的循环体语句,
开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。
continue语句与 break语句的区别在于,
continue语句结束的只是 本次循环,而 break
结束的是 整个循环 。
3.3.3 goto 语句
goto语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从
goto语句所在的地方转移到标号语句处。 goto
语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用 goto语句。但在某些特定场合下 goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用 break语句,不仅要使用多次,
而且可读性较差,这时 goto语句可以发挥作用。
3.3.4 return 语句
exit( ) 和 abort( ),用来终止当前程序执行,将控制权返回给操作系统 。
exit( )函数使用格式为:
exit(<表达式 >);
其中表达式的值必须是一个 整数常数 。
abort( )函数是无参的,使用格式为:
abort( );
3.4 常用算法的应用实例
【 例 3,15】 用欧基里德算法 ( 也称辗转法 ) 求两个整数的最大公约数 。
分析,假定两个整数分别为 num1和 num2,最大公约数应当是不超过其中较小数的一个整数 。 辗转法的思想是:用 num1除以 num2,求出余数 resd,如果 resd==0,则当前 num2就是最大公约数,否则
( resd!=0),num1=num2,num2=resd,重复以上过程,直到 resd==0
为止 。
程序如下:
//文件名,Ex3_15.cpp
#include<iostream.h>
void main(){
int num1,num2;
3.4 常用算法的应用实例
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;
}
输入两个整数,
9和 6的最大公约数为,
num1= 9
num2= 6
resd= 3
6
3
3.4 常用算法的应用实例输入两个整数,
9和 6的最大公约数为,
num1= 6
num2= 6
resd= 30
3
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;
}
3.4 常用算法的应用实例
【 例 3,16】 用筛选法求 10之内的所有素数,并将这些素数输出,每行输出 2个数据 。
分析,这个问题要用数组来解决 。 将 10之内的整数保存在一个数组 a中,经过筛选后所有非素数全部置 0,最后输出数组中的非 0值 。 筛选过程可描述为:
for (i=0; i<=10; i++) {
if (a[i]==0) continue;
将数组中所有是 a[i]倍数的元素置 0;
判定 a[i]是否素数;
if (a[i]不是素数 ) a[i]=0; }
程序如下,
#include<iostream.h>
#include<iomanip.h>
void main() {
int a[10];
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
2 3
5 7
3.4 常用算法的应用实例
【 例 3,17】 世界数学史上著名的,百鸡问题,,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一 。 百钱买百鸡,问鸡翁,母,雏各几何?
分析,设鸡翁,母,雏分别为 i,j,k,根据题意可得:
两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法的应用 。 分析可知,百钱最多可买鸡翁 20,鸡母 33,鸡雏 300,每取一组值都用两个方程检测,满足条件的输出,检测过程可描述为:
for (i=0; i++<=20;)
for (j=0; j++<=33;)
for (k=0; k++<=300;)
if ((i+j+k==100)&&(5*i+3*j+k/3==100)) cout<<i<<j<<k;
这个算法使用三重循环,执行时间函数是立方阶,循环体将执行 20*33*300=198000次 。 我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间 。 实际上,当 i,j确定时,
k就可由题目要求确定为 100-i-j,因此实际上只要用 i,j去测试,用钱数检测就可以了 。 循环部分可以改成:
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 常用算法的应用实例程序如下:
//文件名,Ex3_17.cpp
#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))
cout<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k<<endl;
}
}
3.4 常用算法的应用实例程序运行后将输出:
公鸡 母鸡 小鸡
0 25 75
3 20 77
4 18 78
8 11 81
… …
3.4 常用算法的应用实例
【 例 3,18】 输入一个 8位二进制数,将其转换为十进制数输出 。
分析,二进制转换为十进制只要将每位二进制数乘以该位的权然后相加 。
实际上属于多项式求和问题,即对于本例,x=2,多项式的系数即为二进制数的各个位,可以用数组保存 。
如果直接求幂再求和,需要反复调用系统函数,执行效率降低很多 。 现将多项式作如下变形:
就变成一个十分简单的求累加和的问题 。
程序如下,
//文件名,Ex3_18.cpp
#include<iostream.h>
void main(){
char bin[8];
int x=2,a,dec,i;
012-n2-n1-n1-nnn axaxaxaxay
03-n2-n1-nn ax)ax)a)xaxa(((y
3.4 常用算法的应用实例
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’
i=
a=
dec= 0
输入二进制序列,
7
1
1 dec=0*2+1=1
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’i= 7
a= 1
dec= 1
输入二进制序列,
6
0
2 dec=1*2+0=2
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’
i= 1
a= 0
dec= 90
输入二进制序列,
0
1
181 dec=90*2+1=181
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[2]=‘1’
bin[2]=‘0’
bin[2]=‘1’
bin[2]=‘0’
bin[2]=‘1’i= 1
a= 0
dec= 2
输入二进制序列,
-1
1
181
cout<<"输入二进制序列,"<<endl;
for(i=2;i>=0;i--) cin>>bin[i];
dec=0;
for(i=2;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=2;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
} 二进制序列 (10110101)的值为,181
3.5 枚举类型
3,5,1 枚举类型的定义
3,5,2 枚举变量的使用
3.5.1 枚举类型的定义枚举类型的定义格式为:
enum <类型名 > {<枚举常量表 >};
3.5.2 枚举变量的使用
【 例 3,19】 口袋中又红,黄,蓝,白,黑五种颜色的球若干个,每次从口袋中取三种不同颜色的球,统计并输出所有的取法 。
分析,每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色 。 假设所取三个球的颜色分别为 i,j,k,每个量都有 5种取值,其中 i≠j≠k
就是满足要求的取法,因此用枚举算法可以解决 。
程序如下:
//文件名,Ex3_19.cpp
#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;
3.5.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){//第三个球不同于前两个,满足要求
counter++; cout<<setw(15)<<counter;
/*下面输出每种取法,一行为一种取法的三个颜色 */
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;} }
cout<<endl; //输出一种取法后换行 } }cout<<"共有,"<<counter<<"种取法 "<<endl;}
3.5.2 枚举变量的使用运行结果为:
1 red yellow
blue
2 red yellow
white
3 red yellow
black
4 red blue
yellow
…… ……
共有 60种取法
3,1 分支结构程序设计
3,5 枚举类型
3,4 常用算法的应用实例
3,3 转向语句
3,2 循环结构程序设计
3.1 分支结构程序设计
3,1,1 if语句
3,1,2 条件运算符,?:”
3,1,3 swith语句
3.1.1 if 语句
if语句有两种基本格式为:
if (<表达式 >) <语句 1>;
else <语句 2>;
3.1.1 if 语句
【 例 3,1】 输入一个年份,判断是否闰年 。
分析:假定年份为 year,闰年的条件是,
year%4==0&&year%100==0||year%400==0。
程序如下:
//文件名,EX3_1.cpp
#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;}
输入年份,
1994
1994%4!=0
3.1.1 if 语句输入三个整数
10 8 23
a=10 b=8 c=23
a>b max=10
最大数为,
c>max 输出 23
【 例 3,2】 从键盘上输入三个整数,输出其中的最大数 。
分析,读入三个数,先求出两个数中较大者,再将该大数与第三个数比较,求出最大数 。 程序如下:
//文件名,Ex3_2.cpp
#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;
cout<<"最大数为,";
if(c>max) cout<<c<<endl;
else cout<<max<<endl; }
3.1.1 if 语句
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>;
3.1.1 if 语句
【 例 3,3】 用嵌套 if语句完成 【 例 3,2】 的任务 。
//方法 1:采用第二种嵌套形式
//文件名,Ex3_31.cpp
#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<c
else //a<=b
if(b>c) max=b; //b>=a且 b>c
else max=c; //b>=a且 b<c
cout<<"最大数为,max="<<max<<endl;}
输入三个整数
10 8 23
a=10 b=8 c=23
a>b a<c max=c
输出 最大数为,max=23
3.1.1 if 语句
//方法 2:采用第一种嵌套形式
//文件名,Ex3_32.cpp
#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<<endl; }
输入三个整数
10 8 23
a=10 b=8 c=23
a>b a<c max=c
输出 最大数为,max=23
3.1.1 if 语句
【 例 3,4】 某商场优惠活动规定,某种商品单价为 80元,一次购买 5件以上 ( 包含
5件 ) 10件以下 ( 不包含 10件 ) 打 9
折,一次购买 10件以上 ( 包含 10件 )
打 8折 。 设计程序根据客户的购买量计算总价 。
3.1.1 if 语句
//文件名,Ex3_4.cpp
#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; }
输入购买件数
count=3
count<5 discount=1
amount=80*3*1=240
输出 购买件数,3
单价,80 折扣,1
总价,240
3.1.1 if 语句输入购买件数
count=9
5<count<10 discount=0.9
amount=80*9*0.9=648
输出 购买件数,9
单价,80 折扣,0.9
总价,648
//文件名,Ex3_4.cpp
#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; }
3.1.1 if 语句输入购买件数
count=10
Count=10 discount=0.8
amount=80*10*0.8=640
输出 购买件数,10
单价,80 折扣,0.8
总价,640
//文件名,Ex3_4.cpp
#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; }
3.1.1 if 语句
【 例 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,方程无实根。
3.1.1 if 语句
//文件名,Ex3_5.cpp
#include <iostream.h>
#include <math.h>
void main(){
float a,b,c;
float delta,x1,x2;
const float zero=0.0001; //定义一个很小的常数
3.1.1 if 语句
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
输入三个系数 a(a!=0),b,c:
1 4 4
a=1 b=4 c=4
delta=4*4-4*1*4=0
方程有两个相同实根,
x1=x2=-4/(2*1)=-2
3.1.1 if 语句输入三个系数 a(a!=0),b,c:
1 -5 6
a=1 b=-5 c=6
delta=(-5)*(-5)-4*1*6=1
delta=sqrt(1)=1
x1=(5+1)/(2*1)=3
x2=(5-1)/(2*1)=2
方程有两个不同实根,
x1=3 x2=2
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
3.1.1 if 语句输入三个系数 a(a!=0),b,c:
1 2 4
a=1 b=2 c=4
delta=2*2-4*1*4=-12
方程无实根,
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;
if(fabs(delta)<zero){ //绝对值很小的数即被认为是 0
cout<<"方程有两个相同实根,";
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<0
cout<<"方程无实根 !";}
3.1.2 条件运算符,?:”
if语句在某些情况下可以用条件运算符,?:”来简化表达 。,?:”是一个三元运算符,其构成的表达式格式为:
<表达式 1>? <表达式 2>,<表达式 3>
执行的运算是,先计算表达式 1,若其值为真(或非 0),则计算表达式 2(不计算表达式 3),并将该值作为整个表达式的值;反之,即表达式 1的值为假或为 0;则计算表达式 3(不计算表达式 2),
并将该值作为整个表达式的值。
3.1.3 switch语句格式为:
switch (<表达式 >) {
case <常量表达式1 >,[<语句序列1 >] [break;]
case <常量表达式2 >,[<语句序列2 >] [break;]
…
case <常量表达式 n>,[<语句序列 n>] [break;]
[default,<语句序列 >]
}
3.1.3 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。
分析:如果用 switch语句,必须使表达式符合语法要求,分析发现,里程
s的分段点均是 250的倍数,因此,将里程 s除以 250,取整数商,便得到若干整数值 。
3.1.3 switch语句
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
输入运输单价 p,重量 w和里程 s:
100 10 200
c=200/250=0
c=0 d=0
f=100*10*200*(1-0)=200000
运输单价为 100
重量为 10 里程 200
折扣,0
运费为 200000
3.1.3 switch语句 输入运输单价 p,重量 w和里程 s:
100 10 400
c=400/250=1
c=1 d=0.02
f=100*10*400*(1-0.02)=392000
运输单价为 100
重量为 10 里程 400
折扣,0.02
运费为 392000
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
3.1.3 switch语句 输入运输单价 p,重量 w和里程 s:
100 10 3000
c=3000/250=12
c=12 d=0.15
f=100*10*3000*(1-0.15)=2550000
运输单价为 100
重量为 10 里程 3000
折扣,0.15
运费为 2550000
//文件名,Ex3_6.cpp
#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,case 9,case 10,case 11: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;}
3.1.3 switch语句
【 例 3,7】 设计一个计算器程序,实现加,减,乘,除运算 。
分析:读入两个操作数和运算符,根据运算符完成相应运算 。
程序如下:
//文件名,Ex3_7.cpp
#include <iostream.h>
void main(){
float num1,num2;
char op;
3.1.3 switch语句
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<<"是无效运算符 !";
}
}
输入操作数 1,运算符,操作数 2:
100 * 3
op=*
100*3=300
3.1.3 switch语句输入操作数 1,运算符,操作数 2:
100 # 3
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<<"是无效运算符 !";
}
}
3.2 循环结构程序设计
3,2,1 while语句
3,2,4 循环的嵌套
3,2,3 for语句
3,2,2 do-while 语句
3.2.1 while 语句
while语句也称为当循环 。
语句格式为:
while (<表达式 >) <循环体语句 >;
图 3.1 while语句的执行流程图求表达式的值执行循环体语句表达式的值为真?
是否
3.2.1 while 语句
i= 1
sum= 0
i= 1 <4
2
1
Sum=0+1=0
I=1+1=2
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 2
sum= 1
3.2.1 while 语句
i= 2 <4
3
3
Sum=1+2=3
I=2+1=3
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 3
sum= 3
3.2.1 while 语句
i= 3 <4
4
6
Sum=3+3=6
I=3+1=2
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
i= 4
sum= 6
3.2.1 while 语句
i= 4
5
10
Sum=6+4=10
I=4+1=5
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
3.2.1 while 语句
i= 5
sum= 0
i= 5 >4
输出
sum=10
【 例 3,8】 求 1+2+3+4的值。
分析:求累加和实际上是重复一个循环,在循环中将下一个数与累加和相加 。
程序如下:
//文件名,Ex3_8.cpp
#include <iostream.h>
void main(){
int i=1,sum=0; //循环初始条件
while(i<=4){
sum+=i;
i++; //修改循环条件
}
cout<<"sum="<<sum<<endl; }
3.2.2 do-while 语句
do-while语句称为直到循环,格式为:
do <循环体语句 > while(<表达式 >)
否是 表达式的值为真?
执行循环体语句求表达式的值图 3.2 do-while语句的执行流程图
3.2.2 do-while 语句
【 例 3,9】 用迭代法求的近似值 。 求平方根的迭代公式为:
要求前后两个迭代根之差小于 10-5。
分析,这是递推算法的一个应用 。 从键盘读入一个正数赋给 a,人为估计一个值作为迭代初值 x0,假定取 a/2,根据迭代公式求出 x1,若 |x1-x0|<10-5,则
x1就是所求的平方根近似值;否则,将 x1赋给 x0,再用公式迭代出新的 x1。
重复以上过程直到 |x1-x0|<10-5为止 。
程序如下:
//文件名,Ex3_9.cpp
#include<iostream.h>
#include<math.h>
void main(){
float x0,x1,a;
3.2.2 do-while 语句
cout<<"输入一个正数,"<<endl;
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;
}
}
3.2.2 do-while 语句
【 例 3,10】 输入一段文本,统计文本的行数,单词数及字符数 。 假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行 。
分析,逐个读入文本中的字符,直到读到一个输入结束符 EOF为止 。 其中行结束标志为读到字符 ′\n′。 先令 行数 line=0,单词个数 word=0,字符数
ch=0。 在读入过程中,每读到一个非间隔符,ch=ch+1,每读到一个 ′\n′,
line=line+1; 另设一个变量 isword,读到字符时 isword=1,读到间隔符时
isword=0,如果读到一个间隔符而此时 isword值为 1,则 word=word+1。
程序如下:
#include<iostream.h>
void main() {
char c;
3.2.2 do-while 语句
int line=0,word=0,ch=0;
int isword=0;
do {
c=cin.get();
if (ch==′ \n′) line++; //遇换行符行数 +1
if (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;}
3.2.3 for 语句
for语句也称 for循环,语句格式为:
for (<表达式 1>; <表达式 2>; <表达式 3>) <循环体语句 >
图 3.3 for语句的执行流程图否是求表达式 1的值求表达式 2的值表达式 2值为真?
执行循环体语句求表达式 3的值
3.2.3 for 语句
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
fib0=0
fib1=1
fib2=
0 1
1
n=3 n<4
n++
4
fib2=0+1=1
1
1
1
1n 1)-f i b ( n2)-f i b ( n
1n 1
0n 0
f i b ( n )
3.2.3 for 语句
fib0=0
fib1=1
fib2= 1
0 1
2
n=4 n=4
n++
5
fib2=1+1=2
2
1
1
1
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
【 例 3,11】 设计程序输出 Fibonacii数列的前 4项,要求每行输出 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<=4;n++){
fib2=fib0+fib1;
cout<<setw(5)<<fib2;
if(n%2==0) cout<<endl; //控制每行 2个数据
fib0=fib1; fib1=fib2; }
}
3.2.3 for 语句
fib0=0
fib1=1
fib2= 1
0 1
2
n=5 结束
2
1
1
1
3.2.3 for 语句
【 例 3,12】 输入一个不超过 5位的整数,将其反向后输出 。 例如输入 247,变成 742输出 。
分析,将整数的各个数位逐个位分开,用一个数组保存各个位的值,然后反向组成新的整数 。 将整数各位数字分开的方法是,
通过求余得到个位数,然后将整数缩小十倍,再求余,并重复上述过程,分别得到十位,百位 ……,直到整数的值变成 0为止 。
程序如下:
//文件名,Ex3_12.cpp
#include <iostream.h>
void main(){
int num,subscript;
int digit[5];
3.2.3 for 语句
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; }
digit[4]=
digit[3]=
digit[2]=
digit[1]=
digit[0]=
num=
subscript=
247%10=7
7
247/10=24
24724
0
Ssubscript++
1
输入一个整数,
原来整为,247
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]=
digit[0]=7
num=
subscript=
24%10=4
4
24/10=2
242
1
Ssubscript++
2
输入一个整数,
原来整为,247
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; }
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num=
subscript=
2%10=2
2
2/10=0
20
2
Ssubscript++
3
输入一个整数,
原来整为,247
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; }
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 0
subscript= 3
i= 0
2
输入一个整数,
原来整为,247
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; }
0<31
0*10+7=77
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 7
subscript= 3
i= 1
2
输入一个整数,
原来整为,247
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; }
1<32
7*10+4=7474
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 74
subscript= 3
i= 2
2
输入一个整数,
原来整为,247
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; }
2<33
74*10+2=742742
3.2.3 for 语句
digit[4]=
digit[3]=
digit[2]=
digit[1]= 4
digit[0]=7
num= 74
subscript= 3
i= 2
2
输入一个整数,
原来整为,247
3
742
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; }
反向后整数为,742
3.2.4 循环的嵌套
【 例 3,13】 打印九九表 。 打印格式为:
* 1 2 3 4 5 6 7 8 9
1 1
2 2 4
3 3 6 9
…
9 9 18 27 36 45 54 63 72 81
3.2.4 循环的嵌套分析:计算机的输出是按行进行的,因此可以先用一个循环语句输出第一行表头 。 表中各行数据的输出可以用下面的算法描述:
for (i=1; i<10; i++) { cout<<i; //输出行号输出第 i行数据; //A
cout<<endl; //准备输出下一行 }
第 A行需要进一步细化,由于第 i行数据是一组有规律的数列,每个数的值与其所在行与列有关,因此也可以用一个循环语句描述:
for (j=1; j<10; j++) cout<<setw(4)<<i*j;
按上述算法输出的每一行都将有九列,即打印出的是矩形表而不是下三角形表 。
进一步分析发现每一行的列数与所在行数相关,因此要输出三角形表,上面的循环语句需稍作修改:
for (j=1; j<=i; j++) cout<<setw(4)<<i*j;
将细化后的算法放到顶层算法的 A行即可 。
3.2.4 循环的嵌套程序如下:
//文件名,Ex3_13.cpp
#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; //准备输出下一行 } }
i= 1
1 2 3 4 5 6 7 8 9
1 1
3.2.4 循环的嵌套 i= 1
1 2 3 4 5 6 7 8 9
1 1
2 2 4
2
程序如下:
//文件名,Ex3_13.cpp
#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 循环的嵌套 i= 2
1 2 3 4 5 6 7 8 9
1 1
2 2 4
…
3
程序如下:
//文件名,Ex3_13.cpp
#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 循环的嵌套 i= 8
1 2 3 4 5 6 7 8 9
1 1
2 2 4
…
9 9 18 27 36 45 54 63 72 81
9
程序如下:
//文件名,Ex3_13.cpp
#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.3 转向语句
3,3,1 break语句
3,3,4 return语句
3,3,3 goto 语句
3,3,2 continue语句
3.3.1 break 语句
break语句只能用在 switch语句和循环语句 中,
用来跳出 switch语句或提前终止循环,转去执行
switch语句或循环语句之后的语句。
for循环必然是如下形式:
for(; ;) {
…
if(<表达式 >) break;
…
}
3.3.1 break 语句
【 例 3,14】 给定正整数 m,判定其是否为素数 。
分析,如果 m>2,m是素数的条件是不能被 2,3,…,( 取整 ) 整除 。
因此可以用 2,3,…,( 取整 ) 逐个去除 m,如果被其中某个数整除了,
则 m不是素数,否则是素数 。
程序如下:
//文件名,Ex3_14
#include <iostream.h>
#include <math.h>
void main(){
int m,i,k;
3.3.1 break 语句
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;
}
}
m= 10
k=
i=
输入整数,
3
2 10%2=0
break
2<3即 i<k
10不是素数
3.3.1 break 语句
m= 11
k=
i=
输入整数,
3
2 11%2!=0
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;
}
}
3.3.1 break 语句
m= 11
k=
i= 2
输入整数,
3
3 11%3!=0
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;
}
}
3.3.1 break 语句
m= 11
k=
i= 3
输入整数,
3
4
4>3 即 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;
}
} 11是素数
3.3.2 continue 语句
continue语句只能用在 循环语句 中,用来 终止本次循环 。当程序执行到 continue语句时,将跳过其后尚未执行的循环体语句,
开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。
continue语句与 break语句的区别在于,
continue语句结束的只是 本次循环,而 break
结束的是 整个循环 。
3.3.3 goto 语句
goto语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从
goto语句所在的地方转移到标号语句处。 goto
语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用 goto语句。但在某些特定场合下 goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用 break语句,不仅要使用多次,
而且可读性较差,这时 goto语句可以发挥作用。
3.3.4 return 语句
exit( ) 和 abort( ),用来终止当前程序执行,将控制权返回给操作系统 。
exit( )函数使用格式为:
exit(<表达式 >);
其中表达式的值必须是一个 整数常数 。
abort( )函数是无参的,使用格式为:
abort( );
3.4 常用算法的应用实例
【 例 3,15】 用欧基里德算法 ( 也称辗转法 ) 求两个整数的最大公约数 。
分析,假定两个整数分别为 num1和 num2,最大公约数应当是不超过其中较小数的一个整数 。 辗转法的思想是:用 num1除以 num2,求出余数 resd,如果 resd==0,则当前 num2就是最大公约数,否则
( resd!=0),num1=num2,num2=resd,重复以上过程,直到 resd==0
为止 。
程序如下:
//文件名,Ex3_15.cpp
#include<iostream.h>
void main(){
int num1,num2;
3.4 常用算法的应用实例
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;
}
输入两个整数,
9和 6的最大公约数为,
num1= 9
num2= 6
resd= 3
6
3
3.4 常用算法的应用实例输入两个整数,
9和 6的最大公约数为,
num1= 6
num2= 6
resd= 30
3
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;
}
3.4 常用算法的应用实例
【 例 3,16】 用筛选法求 10之内的所有素数,并将这些素数输出,每行输出 2个数据 。
分析,这个问题要用数组来解决 。 将 10之内的整数保存在一个数组 a中,经过筛选后所有非素数全部置 0,最后输出数组中的非 0值 。 筛选过程可描述为:
for (i=0; i<=10; i++) {
if (a[i]==0) continue;
将数组中所有是 a[i]倍数的元素置 0;
判定 a[i]是否素数;
if (a[i]不是素数 ) a[i]=0; }
程序如下,
#include<iostream.h>
#include<iomanip.h>
void main() {
int a[10];
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
0
0
0
是素数
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例
for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
a[0]= 1
a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0
3.4 常用算法的应用实例 a[0]= 1 a[1]= 2
a[2]= 3
a[3]= 4
a[4]= 5
a[5]= 6
a[6]= 7
a[7]= 8
a[8]= 9
a[9]= 10
0
0
0
0
0for (int i=0; i<=10; i++) a[i]=10+i;//用数组保存整数
a[0]=0;
for (i=0; i<=10; i++) {if (a[i]==0) continue;
for (int j=i+1; j<=10; j++)
if (a[j]%a[i]==0) a[j]=0; //是 a[i]倍数的元素置 0;
int k=sqrt(a[i]); //以下判断 a[i]是否素数
for(j=2; j<=k; j++)
if (a[i]%j==0) break;//有因子,可断定为非素数,终止循环
if (j>k) a[i]=0; } // a[i]不是素数,置 0
int count=0;
for (int i=0; i<=10; i++) //输出所有素数
if (a[i]!=0) {cout<<setw(3)<<a[i];
count++;
if (count%2==0) cout<<endl; }} //每行 2个数据
2 3
5 7
3.4 常用算法的应用实例
【 例 3,17】 世界数学史上著名的,百鸡问题,,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一 。 百钱买百鸡,问鸡翁,母,雏各几何?
分析,设鸡翁,母,雏分别为 i,j,k,根据题意可得:
两个方程无法解出三个变量,只能将各种可能的取值代入,其中能满足两个方程的就是所需的解,因此这是枚举算法的应用 。 分析可知,百钱最多可买鸡翁 20,鸡母 33,鸡雏 300,每取一组值都用两个方程检测,满足条件的输出,检测过程可描述为:
for (i=0; i++<=20;)
for (j=0; j++<=33;)
for (k=0; k++<=300;)
if ((i+j+k==100)&&(5*i+3*j+k/3==100)) cout<<i<<j<<k;
这个算法使用三重循环,执行时间函数是立方阶,循环体将执行 20*33*300=198000次 。 我们希望在算法上改进一下,如能减少一重循环,将大大缩短运行时间 。 实际上,当 i,j确定时,
k就可由题目要求确定为 100-i-j,因此实际上只要用 i,j去测试,用钱数检测就可以了 。 循环部分可以改成:
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 常用算法的应用实例程序如下:
//文件名,Ex3_17.cpp
#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))
cout<<setw(6)<<i<<setw(10)<<j<<setw(10)<<k<<endl;
}
}
3.4 常用算法的应用实例程序运行后将输出:
公鸡 母鸡 小鸡
0 25 75
3 20 77
4 18 78
8 11 81
… …
3.4 常用算法的应用实例
【 例 3,18】 输入一个 8位二进制数,将其转换为十进制数输出 。
分析,二进制转换为十进制只要将每位二进制数乘以该位的权然后相加 。
实际上属于多项式求和问题,即对于本例,x=2,多项式的系数即为二进制数的各个位,可以用数组保存 。
如果直接求幂再求和,需要反复调用系统函数,执行效率降低很多 。 现将多项式作如下变形:
就变成一个十分简单的求累加和的问题 。
程序如下,
//文件名,Ex3_18.cpp
#include<iostream.h>
void main(){
char bin[8];
int x=2,a,dec,i;
012-n2-n1-n1-nnn axaxaxaxay
03-n2-n1-nn ax)ax)a)xaxa(((y
3.4 常用算法的应用实例
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’
i=
a=
dec= 0
输入二进制序列,
7
1
1 dec=0*2+1=1
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’i= 7
a= 1
dec= 1
输入二进制序列,
6
0
2 dec=1*2+0=2
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[3]=‘1’
bin[4]=‘0’
bin[5]=‘1’
bin[6]=‘0’
bin[7]=‘1’
i= 1
a= 0
dec= 90
输入二进制序列,
0
1
181 dec=90*2+1=181
cout<<"输入二进制序列,"<<endl;
for(i=7;i>=0;i--) cin>>bin[i];
dec=0;
for(i=7;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=7;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
}
3.4 常用算法的应用实例
bin[0]=‘1’
bin[1]=‘0’
bin[2]=‘1’
bin[2]=‘1’
bin[2]=‘0’
bin[2]=‘1’
bin[2]=‘0’
bin[2]=‘1’i= 1
a= 0
dec= 2
输入二进制序列,
-1
1
181
cout<<"输入二进制序列,"<<endl;
for(i=2;i>=0;i--) cin>>bin[i];
dec=0;
for(i=2;i>=0;i--){
a=bin[i]-'0';//数字字符转换为数字
dec= dec*x+a;
}
cout<<"二进制序列 (";
for(i=2;i>=0;i--) cout<<bin[i];
cout<<")的值为,"<<dec<<endl;
} 二进制序列 (10110101)的值为,181
3.5 枚举类型
3,5,1 枚举类型的定义
3,5,2 枚举变量的使用
3.5.1 枚举类型的定义枚举类型的定义格式为:
enum <类型名 > {<枚举常量表 >};
3.5.2 枚举变量的使用
【 例 3,19】 口袋中又红,黄,蓝,白,黑五种颜色的球若干个,每次从口袋中取三种不同颜色的球,统计并输出所有的取法 。
分析,每个球的颜色都是这五种颜色之一,因此可以使用枚举类型来定义球的颜色 。 假设所取三个球的颜色分别为 i,j,k,每个量都有 5种取值,其中 i≠j≠k
就是满足要求的取法,因此用枚举算法可以解决 。
程序如下:
//文件名,Ex3_19.cpp
#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;
3.5.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){//第三个球不同于前两个,满足要求
counter++; cout<<setw(15)<<counter;
/*下面输出每种取法,一行为一种取法的三个颜色 */
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;} }
cout<<endl; //输出一种取法后换行 } }cout<<"共有,"<<counter<<"种取法 "<<endl;}
3.5.2 枚举变量的使用运行结果为:
1 red yellow
blue
2 red yellow
white
3 red yellow
black
4 red blue
yellow
…… ……
共有 60种取法