您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《C++程序设计实践例题》 > 第1章 第一章

第3节 第三部分

例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;

}