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

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

第1节 第一部分

例4.1在主函数中调用其他函数。

#include <iostream>

usingnamespacestd;

voidprintstar(void)                     //定义printstar函数

{

 cout<<"****************************** "<<endl;    //输出30个“*”

}

 

voidprint_message(void)                //定义print_message函数

{

 cout<<"      Welcome  to  C++!"<<endl;           //输出一行文字

}

 

intmain(void)

{

printstar( );                       //调用printstar 函数

  print_message( );                   //调用print_message函数

printstar( );                       //调用printstar 函数

return0;

}

 

例4.10 有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。请问第5个人多大?

可以写出以下C++程序,其中的age函数用来实现上述递归过程。

#include <iostream>

usingnamespacestd;

intage(int);                     //函数声明

intmain( )                        //主函数

 { cout<<age(5)<<endl;

   return0;

 }

 

intage(intn)                     //求年龄的递归函数

{intc;                            //用c作为存放年龄的变量       

 if(n==1) c=10;                    //当n=1时,年龄为10

 elsec=age(n-1)+2;                //当n>1时,此人年龄是他前一个人的年龄加2

 returnc;                         //将年龄值带回主函数

}

 

例4.11 用递归方法求n!。

有了例4.10的基础,很容易写出本题的程序:

#include <iostream>

usingnamespacestd;

longfac(int);                           //函数声明

intmain( )

 {intn;                                 //n为需要求阶乘的整数

longy;                                //y为存放n!的变量

cout<<"please input an integer :";     //输入的提示                 

cin>>n;                                //输入n

  y=fac(n);                              //调用fac函数以求n!

  cout<<n<<"!="<<y<<endl;                //输出n!的值

  return0;

 }

 

longfac(intn)                          //递归函数

{longf;

 if(n<0)

  {cout<<"n<0,data error!"<<endl;       //如果输入负数,报错并以-1作为返回值

   f=-1;}

 elseif(n==0||n==1) f=1;              //0!和1!的值为1

elsef=fac(n-1)*n;                     //n>1时,进行递归调用

 returnf;                              //将f的值作为函数值返回

}

 

例4.12 静态局部变量的值。

#include <iostream>

usingnamespacestd;

intf(inta)                          //定义f函数,a为形参

 {autoint  b=0;                      //定义b为自动变量

  staticintc=3;                     //定义c为静态局部变量

  b=b+1;

  c=c+1;

  returna+b+c;

 }

 

 intmain( )

 {inta=2,i;

  for(i=0;i<3;i++)

    cout<<f(a)<<" ";

  cout<<endl;

  return0;

 }

 

例4.13 输出1~5的阶乘值(即1!,2!,3!,4!,5!)。

#include <iostream>

usingnamespacestd;

intfac(int);                    //函数声明

intmain( )

 {inti;

  for(i=1;i<=5;i++)

   cout<<i<<"!="<<fac(i)<<endl;

return0;

 }

 

intfac(intn)

 {staticintf=1;                    //f为静态局部变量,函数结束时f的值不释放

  f=f*n;                             //在f原值基础上乘以n

  returnf;

 }

 

例4.14 用extern对外部变量作提前引用声明,以扩展程序文件中的作用域。

#include <iostream>

usingnamespacestd;

intmax(int,int);              //函数声明

voidmain( )

 {externinta,b;               //对全局变量a,b作提前引用声明

  cout<<max(a,b)<<endl;

 }

inta=15,b=-7;                  //定义全局变量a,b

intmax(intx,inty)

 {intz;

  z=x>y?x:y;

  returnz;

 }

 

例4.15 输入两个整数,要求输出其中的大者。用外部函数实现。

file1.cpp(文件1)

#include <iostream>

usingnamespacestd;

intmain( )

 {externintmax(int,int);  //声明在本函数中将要调用在其他文件中定义的max函数

  inta,b;

  cin>>a>>b;

  cout<<max(a,b)<<endl;

  return0;

 }

file2.cpp(文件2)

intmax(intx,inty)

{intz;

 z=x>y?x:y;

 returnz;

 }

 

例4.16 在调试程序时,常常希望输出一些所需的信息,而在调试完成后不再输出这些信息。可以在源程序中插入条件编译段。下面是一个简单的示例。

#include <iostream>

usingnamespacestd;

#define RUN                                 //在调试程序时使之成为注释行

intmain( )

{ intx=1,y=2,z=3;

#ifndef RUN                                //本行为条件编译命令

cout<<"x="<<x<<",y="<<y<<",z="<<z;  //在调试程序时需要输出这些信息

#endif                                     //本行为条件编译命令

cout<< "x*y*z="*y*z<<endl;

}

 

例4.2 调用函数时的数据传递。

#include <iostream>

usingnamespacestd;

intmax(intx,inty)              //定义有参函数max

{intz;

 z=x>y?x:y;

 return(z);

}

 

intmain( )

{inta,b,c;

 cout<<"please enter two integer numbers:";

 cin>>a>>b;

 c=max(a,b);            //调用max函数,给定实参为a,b。函数值赋给c

 cout<<"max="<<c<<endl;

 return0;

}

 

例4.3 对被调用的函数作声明。

#include <iostream>

usingnamespacestd;

intmain( )

{floatadd(floatx,floaty);              //对add函数作声明

 floata,b,c;

cout<<"please enter a,b:";

 cin>>a>>b;

 c=add(a,b);

 cout<<"sum="<<c<<endl;

 return0;

}

 

floatadd(floatx,floaty)               //定义add函数

{floatz;

 z=x+y;

 return(z);

}

 

例4.4 函数指定为内置函数。

#include <iostream>

usingnamespacestd;

inlineintmax(int,int, int);       //声明函数,注意左端有inline

intmain( )

{inti=10,j=20,k=30,m;

 m=max(i,j,k);

 cout<<"max="<<m<<endl;

 return0;

}

 

inlineintmax(inta,intb,intc)       //定义max为内置函数

{if(b>a) a=b;                           //求a,b,c中的最大者

 if(c>a) a=c;

 returna;

}

 

例4.5 求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。

#include <iostream>

usingnamespacestd;

intmain( )

{intmax(inta,intb,intc);                //函数声明

doublemax(doublea,doubleb,doublec);    //函数声明

longmax(longa,longb,longc);            //函数声明

 inti1,i2,i3,i;                            

 cin>>i1>>i2>>i3;                         //输入3个整数

 i=max(i1,i2,i3);                         //求3个整数中的最大者

 cout<<"i_max="<<i<<endl;

 doubled1,d2,d3,d;   

 cin>>d1>>d2>>d3;                         //输入3个双精度数

 d=max(d1,d2,d3);                         //求3个双精度数中的最大者

 cout<<"d_max="<<d<<endl;

 longg1,g2,g3,g;

 cin>>g1>>g2>>g3;                         //输入3个长整数

 g=max(g1,g2,g3);                         //求3个长整数中的最大者

 cout<<"g_max="<<g<<endl;

}

 

intmax(inta,intb,intc)                //定义求3个整数中的最大者的函数

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

doublemax(doublea,doubleb,doublec)   //定义求3个双精度数中的最大者的函数

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

longmax(longa,longb,longc)           //定义求3个长整数中的最大者的函数

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

例4.6 编写一个程序,用来求两个整数或3个整数中的最大数。如果输入两个整数,程序就输出这两个整数中的最大数,如果输入3个整数,程序就输出这3个整数中的最大数。

#include <iostream>

usingnamespacestd;

intmain( )

{intmax(inta,intb,intc);              //函数声明

 intmax(inta,intb);                    //函数声明

 inta=8,b=-12,c=27;

 cout<<"max(a,b,c)="<<max(a,b,c)<<endl;   //输出3个整数中的最大者

 cout<<"max(a,b)="<<max(a,b)<<endl;       //输出两个整数中的最大者

}

 

intmax(inta,intb,intc)         //此max函数的作用是求3个整数中的最大者

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

intmax(inta,intb)               //此max函数的作用是求两个整数中的最大者

{if(a>b) returna;

elsereturnb;

}

 

例4.7 将例4.6程序改为通过函数模板来实现。

#include <iostream>

usingnamespacestd;

template<typenameT>        //模板声明,其中T为类型参数

T max(T a,T b,T c)          //定义一个通用函数,用T作虚拟的类型名

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

intmain( )

{inti1=185,i2=-76,i3=567,i;

 doubled1=56.87,d2=90.23,d3=-3214.78,d;

 longg1=67854,g2=-912456,g3=673456,g;

i=max(i1,i2,i3);          //调用模板函数,此时T被int取代

 d=max(d1,d2,d3);          //调用模板函数,此时T被double取代

g=max(g1,g2,g3);          //调用模板函数,此时T被long取代

 cout<<"i_max="<<i<<endl;

 cout<<"f_max="<<f<<endl;

 cout<<"g_max="<<g<<endl;

 return0;

}

 

例4.8 求2个或3个正整数中的最大数,用带有默认参数的函数实现。

#include <iostream>

usingnamespacestd;

intmain( )

{intmax(inta, intb, intc=0);//函数声明,形参c有默认值

inta,b,c;

 cin>>a>>b>>c;

 cout<<"max(a,b,c)="<<max(a,b,c)<<endl;   //输出3个数中的最大者

 cout<<"max(a,b)="<<max(a,b)<<endl;       //输出2个数中的最大者

 return0;

}

 

intmax(inta,intb,intc)        //函数定义

{if(b>a) a=b;

 if(c>a) a=c;

 returna;

}

 

例4.9 用弦截法求方程f(x)=x3次方-5x2次方+16x-80=0的根。

#include <iostream>

#include <iomanip>

#include <cmath>

usingnamespacestd;

doublef(double);                 //函数声明

doublexpoint(double, double);     //函数声明

doubleroot(double, double);       //函数声明

 

intmain( )

{ doublex1,x2,f1,f2,x;

 do

  {cout<<"input x1,x2:";

   cin>>x1>>x2;

   f1=f(x1);

   f2=f(x2);

  } while(f1*f2>=0);

 x=root(x1,x2);

 cout<<setiosflags(ios∷fixed)<<setprecision(7); 

//指定输出7位小数

 cout<<"A root of equation is "<<x<<endl;

 return0;

}

 

doublef(doublex)              //定义f函数,以实现f(x)

{doubley;

 y=x*x*x-5*x*x+16*x-80;

 returny;

}

 

doublexpoint(doublex1, doublex2)       //定义xpoint函数,求出弦与x轴交点

{doubley;

 y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));    //在xpoint函数中调用f函数

 returny;

}

 

doubleroot(doublex1, double  x2)       //定义root函数,求近似根

{doublex,y,y1;

 y1=f(x1);

 do

  {x=xpoint(x1,x2);             //在root函数中调用xpoint函数

   y=f(x);                      //在root函数中调用f函数

   if(y*y1>0)

    {y1=y;

     x1=x;

    }

   else

x2=x;

  }while(fabs(y)>=0.00001);

 returnx;

}