例4.1在主函數(shù)中調(diào)用其他函數(shù)。
#include <iostream>
usingnamespacestd;
voidprintstar(void) //定義printstar函數(shù)
{
cout<<"****************************** "<<endl; //輸出30個(gè)“*”
}
voidprint_message(void) //定義print_message函數(shù)
{
cout<<" Welcome to C++!"<<endl; //輸出一行文字
}
intmain(void)
{
printstar( ); //調(diào)用printstar 函數(shù)
print_message( ); //調(diào)用print_message函數(shù)
printstar( ); //調(diào)用printstar 函數(shù)
return0;
}
例4.10 有5個(gè)人坐在一起,問第5個(gè)人多少歲?他說比第4個(gè)人大兩歲。問第4個(gè)人歲數(shù),他說比第3個(gè)人大兩歲。問第3個(gè)人,又說比第2個(gè)人大兩歲。問第2個(gè)人,說比第1個(gè)人大兩歲。最后問第1個(gè)人,他說是10歲。請(qǐng)問第5個(gè)人多大?
可以寫出以下C++程序,其中的age函數(shù)用來實(shí)現(xiàn)上述遞歸過程。
#include <iostream>
usingnamespacestd;
intage(int); //函數(shù)聲明
intmain( ) //主函數(shù)
{ cout<<age(5)<<endl;
return0;
}
intage(intn) //求年齡的遞歸函數(shù)
{intc; //用c作為存放年齡的變量
if(n==1) c=10; //當(dāng)n=1時(shí),年齡為10
elsec=age(n-1)+2; //當(dāng)n>1時(shí),此人年齡是他前一個(gè)人的年齡加2
returnc; //將年齡值帶回主函數(shù)
}
例4.11 用遞歸方法求n!。
有了例4.10的基礎(chǔ),很容易寫出本題的程序:
#include <iostream>
usingnamespacestd;
longfac(int); //函數(shù)聲明
intmain( )
{intn; //n為需要求階乘的整數(shù)
longy; //y為存放n!的變量
cout<<"please input an integer :"; //輸入的提示
cin>>n; //輸入n
y=fac(n); //調(diào)用fac函數(shù)以求n!
cout<<n<<"!="<<y<<endl; //輸出n!的值
return0;
}
longfac(intn) //遞歸函數(shù)
{longf;
if(n<0)
{cout<<"n<0,data error!"<<endl; //如果輸入負(fù)數(shù),報(bào)錯(cuò)并以-1作為返回值
f=-1;}
elseif(n==0||n==1) f=1; //0!和1!的值為1
elsef=fac(n-1)*n; //n>1時(shí),進(jìn)行遞歸調(diào)用
returnf; //將f的值作為函數(shù)值返回
}
例4.12 靜態(tài)局部變量的值。
#include <iostream>
usingnamespacestd;
intf(inta) //定義f函數(shù),a為形參
{autoint b=0; //定義b為自動(dòng)變量
staticintc=3; //定義c為靜態(tài)局部變量
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); //函數(shù)聲明
intmain( )
{inti;
for(i=1;i<=5;i++)
cout<<i<<"!="<<fac(i)<<endl;
return0;
}
intfac(intn)
{staticintf=1; //f為靜態(tài)局部變量,函數(shù)結(jié)束時(shí)f的值不釋放
f=f*n; //在f原值基礎(chǔ)上乘以n
returnf;
}
例4.14 用extern對(duì)外部變量作提前引用聲明,以擴(kuò)展程序文件中的作用域。
#include <iostream>
usingnamespacestd;
intmax(int,int); //函數(shù)聲明
voidmain( )
{externinta,b; //對(duì)全局變量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 輸入兩個(gè)整數(shù),要求輸出其中的大者。用外部函數(shù)實(shí)現(xiàn)。
file1.cpp(文件1)
#include <iostream>
usingnamespacestd;
intmain( )
{externintmax(int,int); //聲明在本函數(shù)中將要調(diào)用在其他文件中定義的max函數(shù)
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 在調(diào)試程序時(shí),常常希望輸出一些所需的信息,而在調(diào)試完成后不再輸出這些信息??梢栽谠闯绦蛑胁迦霔l件編譯段。下面是一個(gè)簡(jiǎn)單的示例。
#include <iostream>
usingnamespacestd;
#define RUN //在調(diào)試程序時(shí)使之成為注釋行
intmain( )
{ intx=1,y=2,z=3;
#ifndef RUN //本行為條件編譯命令
cout<<"x="<<x<<",y="<<y<<",z="<<z; //在調(diào)試程序時(shí)需要輸出這些信息
#endif //本行為條件編譯命令
cout<< "x*y*z="*y*z<<endl;
}
例4.2 調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞。
#include <iostream>
usingnamespacestd;
intmax(intx,inty) //定義有參函數(shù)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); //調(diào)用max函數(shù),給定實(shí)參為a,b。函數(shù)值賦給c
cout<<"max="<<c<<endl;
return0;
}
例4.3 對(duì)被調(diào)用的函數(shù)作聲明。
#include <iostream>
usingnamespacestd;
intmain( )
{floatadd(floatx,floaty); //對(duì)add函數(shù)作聲明
floata,b,c;
cout<<"please enter a,b:";
cin>>a>>b;
c=add(a,b);
cout<<"sum="<<c<<endl;
return0;
}
floatadd(floatx,floaty) //定義add函數(shù)
{floatz;
z=x+y;
return(z);
}
例4.4 函數(shù)指定為內(nèi)置函數(shù)。
#include <iostream>
usingnamespacestd;
inlineintmax(int,int, int); //聲明函數(shù),注意左端有inline
intmain( )
{inti=10,j=20,k=30,m;
m=max(i,j,k);
cout<<"max="<<m<<endl;
return0;
}
inlineintmax(inta,intb,intc) //定義max為內(nèi)置函數(shù)
{if(b>a) a=b; //求a,b,c中的最大者
if(c>a) a=c;
returna;
}
例4.5 求3個(gè)數(shù)中最大的數(shù)(分別考慮整數(shù)、雙精度數(shù)、長整數(shù)的情況)。
#include <iostream>
usingnamespacestd;
intmain( )
{intmax(inta,intb,intc); //函數(shù)聲明
doublemax(doublea,doubleb,doublec); //函數(shù)聲明
longmax(longa,longb,longc); //函數(shù)聲明
inti1,i2,i3,i;
cin>>i1>>i2>>i3; //輸入3個(gè)整數(shù)
i=max(i1,i2,i3); //求3個(gè)整數(shù)中的最大者
cout<<"i_max="<<i<<endl;
doubled1,d2,d3,d;
cin>>d1>>d2>>d3; //輸入3個(gè)雙精度數(shù)
d=max(d1,d2,d3); //求3個(gè)雙精度數(shù)中的最大者
cout<<"d_max="<<d<<endl;
longg1,g2,g3,g;
cin>>g1>>g2>>g3; //輸入3個(gè)長整數(shù)
g=max(g1,g2,g3); //求3個(gè)長整數(shù)中的最大者
cout<<"g_max="<<g<<endl;
}
intmax(inta,intb,intc) //定義求3個(gè)整數(shù)中的最大者的函數(shù)
{if(b>a) a=b;
if(c>a) a=c;
returna;
}
doublemax(doublea,doubleb,doublec) //定義求3個(gè)雙精度數(shù)中的最大者的函數(shù)
{if(b>a) a=b;
if(c>a) a=c;
returna;
}
longmax(longa,longb,longc) //定義求3個(gè)長整數(shù)中的最大者的函數(shù)
{if(b>a) a=b;
if(c>a) a=c;
returna;
}
例4.6 編寫一個(gè)程序,用來求兩個(gè)整數(shù)或3個(gè)整數(shù)中的最大數(shù)。如果輸入兩個(gè)整數(shù),程序就輸出這兩個(gè)整數(shù)中的最大數(shù),如果輸入3個(gè)整數(shù),程序就輸出這3個(gè)整數(shù)中的最大數(shù)。
#include <iostream>
usingnamespacestd;
intmain( )
{intmax(inta,intb,intc); //函數(shù)聲明
intmax(inta,intb); //函數(shù)聲明
inta=8,b=-12,c=27;
cout<<"max(a,b,c)="<<max(a,b,c)<<endl; //輸出3個(gè)整數(shù)中的最大者
cout<<"max(a,b)="<<max(a,b)<<endl; //輸出兩個(gè)整數(shù)中的最大者
}
intmax(inta,intb,intc) //此max函數(shù)的作用是求3個(gè)整數(shù)中的最大者
{if(b>a) a=b;
if(c>a) a=c;
returna;
}
intmax(inta,intb) //此max函數(shù)的作用是求兩個(gè)整數(shù)中的最大者
{if(a>b) returna;
elsereturnb;
}
例4.7 將例4.6程序改為通過函數(shù)模板來實(shí)現(xiàn)。
#include <iostream>
usingnamespacestd;
template<typenameT> //模板聲明,其中T為類型參數(shù)
T max(T a,T b,T c) //定義一個(gè)通用函數(shù),用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); //調(diào)用模板函數(shù),此時(shí)T被int取代
d=max(d1,d2,d3); //調(diào)用模板函數(shù),此時(shí)T被double取代
g=max(g1,g2,g3); //調(diào)用模板函數(shù),此時(shí)T被long取代
cout<<"i_max="<<i<<endl;
cout<<"f_max="<<f<<endl;
cout<<"g_max="<<g<<endl;
return0;
}
例4.8 求2個(gè)或3個(gè)正整數(shù)中的最大數(shù),用帶有默認(rèn)參數(shù)的函數(shù)實(shí)現(xiàn)。
#include <iostream>
usingnamespacestd;
intmain( )
{intmax(inta, intb, intc=0);//函數(shù)聲明,形參c有默認(rèn)值
inta,b,c;
cin>>a>>b>>c;
cout<<"max(a,b,c)="<<max(a,b,c)<<endl; //輸出3個(gè)數(shù)中的最大者
cout<<"max(a,b)="<<max(a,b)<<endl; //輸出2個(gè)數(shù)中的最大者
return0;
}
intmax(inta,intb,intc) //函數(shù)定義
{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); //函數(shù)聲明
doublexpoint(double, double); //函數(shù)聲明
doubleroot(double, double); //函數(shù)聲明
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位小數(shù)
cout<<"A root of equation is "<<x<<endl;
return0;
}
doublef(doublex) //定義f函數(shù),以實(shí)現(xiàn)f(x)
{doubley;
y=x*x*x-5*x*x+16*x-80;
returny;
}
doublexpoint(doublex1, doublex2) //定義xpoint函數(shù),求出弦與x軸交點(diǎn)
{doubley;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); //在xpoint函數(shù)中調(diào)用f函數(shù)
returny;
}
doubleroot(doublex1, double x2) //定義root函數(shù),求近似根
{doublex,y,y1;
y1=f(x1);
do
{x=xpoint(x1,x2); //在root函數(shù)中調(diào)用xpoint函數(shù)
y=f(x); //在root函數(shù)中調(diào)用f函數(shù)
if(y*y1>0)
{y1=y;
x1=x;
}
else
x2=x;
}while(fabs(y)>=0.00001);
returnx;
}
