例3.1 各行小数点对齐。
#include <iostream>
#include <iomanip>
usingnamespacestd;
intmain( )
{
doublea=123.456,b=3.14159,c=-3214.67;
cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);
cout<<setw(10)<<a<<endl;
cout<<setw(10)<<b<<endl;
cout<<setw(10)<<c<<endl;
return0;
}
例3.10 求1+2+3+…+100。
用流程图表示算法,见图3.10。
根据流程图写出程序:
#include <iostream>
usingnamespacestd;
intmain( )
{inti=1,sum=0;
while(i<=100)
{ sum=sum+i;
i++;
}
cout<<"sum="<<sum<<endl;
}
例3.11 用do-while语句求1+2+3+…+100。
先画出流程图,见图3.12。
可编写出下面的程序:
#include <iostream>
usingnamespacestd;
intmain( )
{inti=1,sum=0;
do
{ sum=sum+i;
i++;
}while(i<=100);
cout<<"sum="<<sum<<endl;
return0;
}
例3.12 用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一项的绝对值小于10的-7次方为止。
根据给定的算法很容易编写程序如下:
#include <iostream>
#include <iomanip>
#include <cmath>
usingnamespacestd;
intmain( )
{ints=1;
doublen=1,t=1,pi=0;
while((fabs(t))>1e-7)
{pi=pi+t;
n=n+2;
s=-s;
t=s/n;
}
pi=pi*4;
cout<<"pi="<<setiosflags(ios∷fixed)<<setprecision(6)<<pi<<endl;
return0;
}
例3.13 求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数为1、1。从第3个数开始,每个数是其前面两个数之和。即
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n≥3)
这是一个有趣的古典数学问题:有一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假设所有兔子都不死,问每个月的兔子总数为多少?
可以从书中表3.4看出兔子数的规律。
根据给出的每月兔子总数的关系,可以编写程序如下:
#include <iostream>
#include <iomanip>
usingnamespacestd;
intmain( )
{longf1,f2;
inti;
f1=f2=1;
for(i=1;i<=20;i++)
{cout<<setw(12)<<f1<<setw(12)<<f2;
//设备输出字段宽度为12,每次输出两个数
if(i%2==0) cout<<endl;
//每输出完4个数后换行,使每行输出4个数
f1=f1+f2;
//左边的f1代表第3个数,是第1、2个数之和
f2=f2+f1;
//左边的f2代表第4个数,是第2、3个数之和
}
return0;
}
例3.14 找出100~200间的全部素数。
编写程序如下:
#include <iostream>
#include <cmath>
#include <iomanip>
usingnamespacestd;
intmain( )
{intm,k,i,n=0;
boolprime; //定义布尔变量prime
for(m=101;m<=200;m=m+2) //判别m是否为素数,m由101变化到200,增量为2
{prime=true; //循环开始时设prime为真,即先认为m为素数
k=int(sqrt(m)); //用k代表根号m的整数部分
for(i=2;i<=k;i++) //此循环的作用是将m被2~根号m除,检查是否能整除
if(m%i==0) //如果能整除,表示m不是素数
{ prime=false; //使prime变为假
break; //终止执行本循环
}
if(prime) //如果m为素数
{cout<<setw(5)<<m; //输出素数m,字段宽度为5
n=n+1; //n用来累计输出素数的个数
}
if(n%10==0) cout<<endl; //输出10个数后换行
}
cout<<endl; //最后执行一次换行
return0;
}
例3.15 译密码。为使电文保密,往往按一定规律将电文转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。见图3.20。字母按上述规律转换,非字母字符不变。如"Wonderful!"转换为"Asrhivjyp!"。输入一行字符,要求输出其相应的密码。
图3.20
程序如下:
#include <iostream>
usingnamespacestd;
intmain( )
{charc;
while((c=getchar( ))!='\n')
{if((c>='a' && c<='z') || (c>='A' && c<='Z'))
{c=c+4;
if(c>'Z' && c<='Z'+4|| c>'z') c=c-26;
}
cout<<c;
}
cout<<endl;
return0;
}
例3.2 输出单个字符。
#include <iostream> //或者包含头文件stdio.h:#include <stdio.h>
usingnamespacestd;
intmain( )
{chara,b,c;
a='B';b='O';c='Y';
putchar(a);putchar(b);putchar(c);putchar('\n');
putchar(66);putchar(79);putchar(89);putchar(10);
return0;
}
例3.3 输入单个字符。
#include <iostream>
usingnamespacestd;
intmain( )
{charc;
c=getchar( ); putchar(c+32); putchar('\n');
return0;
}
例3.4 用scanf和printf函数进行输入和输出。
#include <iostream>
usingnamespacestd;
intmain( )
{inta; floatb; charc;
scanf("%d %c %f",&a,&c,&b); //注意在变量名前要加地址运算符&
printf("a=%d,b=%f,c=%c\n",a,b,c);
return0;
}
例3.5 求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入,它们的值满足b2-4ac≥0。
根据求x1,x2的算法。它可以编写出以下C++程序:
#include <iostream>
#include <cmath> //由于程序要用到数学函数sqrt,故应包含头文件cmath
usingnamespacestd;
intmain( )
{float a,b,c,x1,x2;
cin>>a>>b>>c;
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
cout<<"x1="<<x1<<endl;
cout<<"x2="<<x2<<endl;
return0;
}
例3.6 求三角形的面积。
#include <iostream>
#include <cmath> //使用数学函数时要包含头文件cmath
#include <iomanip> //使用I/O流控制符要包含头文件iomanip
usingnamespacestd;
intmain( )
{
doublea,b,c;
cout<<"please enter a,b,c:";
cin>>a>>b>>c;
if(a+b>c && b+c>a && c+a>b)
{ //复合语句开始
doubles,area; //在复合语句内定义变量
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
cout<<setiosflags(ios∷fixed)<<setprecision(4); //指定输出的数包含4位小数
cout<<"area="<<area<<endl; //在复合语句内输出局部变量的值
} //复合语句结束
elsecout<<"it is not a trilateral!"<<endl;
return0;
}
例3.7 输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。
#include <iostream>
usingnamespacestd;
intmain( )
{
charch;
cin>>ch;
ch=(ch>='A' && ch<='Z')?(ch+32):ch; //判别ch是否大写字母,是则转换
cout<<ch<<endl;
return0;
}
例3.8 编写程序,判断某一年是否为闰年。
#include <iostream>
usingnamespacestd;
intmain( )
{ intyear;
boolleap;
cout<<"please enter year:"; //输出提示
cin>>year; //输入年份
if(year%4==0) //年份能被4整除
{if(year%100==0) //年份能被4整除又能被100整除
{if(year%400==0) //年份能被4整除又能被400整除
leap=true; //闰年,令leap=true(真)
elseleap=false;} //非闰年,令leap=false(假)
else //年份能被4整除但不能被100整除肯定是闰年
leap=true;} //是闰年,令leap=true
else //年份不能被4整除肯定不是闰年
leap=false; //若为非闰年,令leap=false
if(leap)
cout<<year<<" is "; //若leap为真,就输出年份和“是”
else
cout<<year<<" is not "; //若leap为真,就输出年份和“不是”
cout<<" a leap year."<<endl; //输出“闰年”
return0;
}
例3.9 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:
s<250km 没有折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
设每公里每吨货物的基本运费为p(price的缩写),货物重为w(wright的缩写),距离为s,折扣为d(discount的缩写),则总运费f(freight的缩写)的计算公式为
f = p * w * s * (1- d)
图3.8
据此写出程序如下:
#include <iostream>
usingnamespacestd;
intmain( )
{intc,s;
floatp,w,d,f;
cout<<"please enter p,w,s:";
cin>>p>>w>>s;
if(s>=3000) c=12;
elsec=s/250;
switch(c)
{ case0:d=0;break;
case1:d=2;break;
case2:
case3:d=5;break;
case4:
case5:
case6:
case7:d=8;break;
case8:
case9:
case10:
case11:d=10;break;
case12:d=15;break;
}
f=p*w*s*(1-d/100.0);
cout<<"freight="<<f<<endl;
return0;
}
