例3.1 各行小數(shù)點對齊。
#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。
根據(jù)流程圖寫出程序:
#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次方為止。
根據(jù)給定的算法很容易編寫程序如下:
#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數(shù)列前40個數(shù)。這個數(shù)列有如下特點:第1、2個數(shù)為1、1。從第3個數(shù)開始,每個數(shù)是其前面兩個數(shù)之和。即
F1=1 (n=1)
F2=1 (n=2)
Fn=Fn-1+Fn-2 (n≥3)
這是一個有趣的古典數(shù)學問題:有一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設所有兔子都不死,問每個月的兔子總數(shù)為多少?
可以從書中表3.4看出兔子數(shù)的規(guī)律。
根據(jù)給出的每月兔子總數(shù)的關系,可以編寫程序如下:
#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,每次輸出兩個數(shù)
if(i%2==0) cout<<endl;
//每輸出完4個數(shù)后換行,使每行輸出4個數(shù)
f1=f1+f2;
//左邊的f1代表第3個數(shù),是第1、2個數(shù)之和
f2=f2+f1;
//左邊的f2代表第4個數(shù),是第2、3個數(shù)之和
}
return0;
}
例3.14 找出100~200間的全部素數(shù)。
編寫程序如下:
#include <iostream>
#include <cmath>
#include <iomanip>
usingnamespacestd;
intmain( )
{intm,k,i,n=0;
boolprime; //定義布爾變量prime
for(m=101;m<=200;m=m+2) //判別m是否為素數(shù),m由101變化到200,增量為2
{prime=true; //循環(huán)開始時設prime為真,即先認為m為素數(shù)
k=int(sqrt(m)); //用k代表根號m的整數(shù)部分
for(i=2;i<=k;i++) //此循環(huán)的作用是將m被2~根號m除,檢查是否能整除
if(m%i==0) //如果能整除,表示m不是素數(shù)
{ prime=false; //使prime變?yōu)榧?/p>
break; //終止執(zhí)行本循環(huán)
}
if(prime) //如果m為素數(shù)
{cout<<setw(5)<<m; //輸出素數(shù)m,字段寬度為5
n=n+1; //n用來累計輸出素數(shù)的個數(shù)
}
if(n%10==0) cout<<endl; //輸出10個數(shù)后換行
}
cout<<endl; //最后執(zhí)行一次換行
return0;
}
例3.15 譯密碼。為使電文保密,往往按一定規(guī)律將電文轉換成密碼,收報人再按約定的規(guī)律將其譯回原文。例如,可以按以下規(guī)律將電文變成密碼:將字母A變成字母E,a變成e,即變成其后的第4個字母,W變成A,X變成B,Y變成C,Z變成D。見圖3.20。字母按上述規(guī)律轉換,非字母字符不變。如"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函數(shù)進行輸入和輸出。
#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。
根據(jù)求x1,x2的算法。它可以編寫出以下C++程序:
#include <iostream>
#include <cmath> //由于程序要用到數(shù)學函數(shù)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> //使用數(shù)學函數(shù)時要包含頭文件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); //指定輸出的數(shù)包含4位小數(shù)
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
據(jù)此寫出程序如下:
#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;
}
