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