cout<<:
:
a<<'\t'<<:
:
b<<'\t'<<:
:
c<return0;
}
答:
输出结果如下:
697
3415
4.试问下列程序的输出结果如何?
#include
usingnamespacestd;
inta=5,b=8;
intmax(inta,intb)
{
return(a>b?
a:
b);
}
intmain()
{
inta=9;
cout<return0;
}
答:
输出结果如下:
9
5.试问下列程序的输出结果如何?
#include
usingnamespacestd;
intf(intx);
intmain()
{
inta=4;
for(inti=0;i<4;i++)
cout<cout<return0;
}
intf(intx)
{
inty=0;
staticz=3;
y++;
z++;
return(x+y+z);
}
答:
输出结果如下:
9101112
6.试设法将例5-4及例5-6程序中的全局变量k改为合适的局部静态变量。
使能获得正确的运行结果。
答:
例5-4程序修改为:
#include
#include
usingnamespacestd;
voidlok(int,int);
intjdg(int);
voidout(int);
intmain()
{
lok(10,50);
return0;
}
voidlok(inta,intb){
for(inti=a;i<=b;i++)
if(jdg(i))out(i);
}
intjdg(intn){
for(inti=2;i<=9;i++)
if(n%i==0)return1;
return0;
}
voidout(intn){
staticintk;
cout<k++;
if(k%10==0)cout<}
例5-6程序修改为:
#include
#include
usingnamespacestd;
intin();
voidcyl(int);
longf(int,int);
voidout(int);
intmain()
{
inta;
a=in();
cyl(a);
return0;
}
intin(){
intt;
cout<<"请输入一整数。
";
cin>>t;
returnt;
}
voidcyl(intx){
for(intn=1;n<=20;n++)
out(f(x,n));
}
longf(intx,intn){
if(n==1)return1;
elseif(n==2)returnx;
elsereturnf(x,n-1)+x*f(x,n-2);
}
voidout(intx){
staticintk;
cout<k++;
if(k%5==0)cout<}
7.主调函数中声明了下列变量:
inta=2;
charb=‘Q’;
char*p=“System”
现在想通过别名传递调用函数fun来对这三个变量进行访问操作。
试写出实参表、形参表和被调函数中访问的对象。
列出表格如表5-4那样。
答:
列出表格如表5-9所示。
表5-9参数别名传递的函数调用
主调函数中待访问变量
inta
charb
char*p
实参表
(a,b,p)
形参表
(int&x,char&y,char*&z)
被调函数中访问的对象
x
y
z
访问别名x、y、z于被调函数内,效达实名a、b、p于主调函数中
8.试分析下列程序,输出什么结果?
#include
usingnamespacestd;
voidfun(int,int&,int&,int&);
intmain()
{
inttm=12345;//A
inthr=3,mt=10,sd=20;
cout<<"原来时刻是"<
"<fun(tm,hr,mt,sd);//B
cout<<"经"<cout<<"现在时刻是"<
"<return0;
}
voidfun(intt,int&h,int&m,int&s)//D
{
t=t+h*3600+m*60+s;//E
h=(t/3600)%24;
m=(t%3600)/60;
s=t%60;
}
答:
程序运行结果为:
原来时刻是:
3点10分20秒。
经12345秒后,
现在时刻是:
6点36分5秒。
9.上题程序中,函数fun的第一个形参为何不用别名?
如果也用别名会有什么影响?
答:
从程序B行可看出,主函数是用tm作为第一个实参通过值传递给形参t,调用fun函数的。
在fun函数体内E行对形参t进行操作,改变了t值。
如果这个形参是用别名的话,则这种改变的效果将直达主调函数中的tm,使tm作同样改变,致使tm不再是12345了。
这将使C行的输出中tm不正确。
因此fun函数的第一个形参没用别名。
10.主调函数中声明了下列变量:
inta=2;
charb=‘Q’;
char*p=“System”
现在想通过地址传递调用函数fun来对这三个变量进行访问操作。
试写出实参表、形参表和被调函数中访问的对象。
列出表格如表5-5和表5-6那样。
答:
列出表格如表5-10所示。
表5-10参数地址传递的函数调用
主调函数中待访问变量
inta
charb
char*p
实参表
(&a,&b,&p)
形参表
(int*x,char*y,char**z)
被调函数中访问的对象
*x
*y
*z
访问指针所指*x、*y、*z于被调函数内,效达所指变量a、b、p于主调函数中
11.主调函数中声明了下列变量:
inta=2;
charb=‘Q’;
char*p=“System”
现在想通过值传递调用函数fun。
试写出实参表、形参表和被调函数中访问的对象。
列出表格如表5-7那样。
试问这时被调函数在函数体内的操作对主调函数中的变量有无影响?
答:
列表格如表5-11所示。
被调函数在函数体内的操作对主调函数中的变量毫无影响。
表5-11参数值传递的函数调用
主调函数中的变量
inta
charb
char*p
实参表
(a,b,p)
形参表
(intx,chary,char*z)
被调函数中访问的变量
x
y
z
访问变量x、y、z于被调函数内,对主调函数中变量a、b、p毫无影响.
12.试问下列程序中,函数的返回值是何类型?
是指向哪个变量的指针?
程序的输出结果如何?
#include
usingnamespacestd;
int*f(intx)
{
staticintz=3;
z+=x;
return&z;
}
intmain()
{
inta=4;
for(inti=0;i<4;i++)cout<<*f(a)<<’\t’;
*f(a)=1000;
cout<<*f(a)<return0;
}
答:
函数的返回值是指向静态变量z的int型指针。
程序输出结果为:
71115191004
13.试将上题程序中函数返回值改为静态变量z的别名。
程序中其它相关语句也作相应改变,使得输出结果与上题完全一样?
答:
程序修改后如下:
#include
usingnamespacestd;
int&f(intx){
staticintz=3;
z+=x;
returnz;
}
intmain()
{
inta=4;
for(inti=0;i<4;i++)cout<f(a)=1000;
cout<return0;
}
14.试将例5-6中的程序改为多文件形式。
上机将各文件相继加入到同一个工程中,进行编译通过。
然后进行链接,运行。
答:
程序如下:
//头文件,h514.h
#include
#include
usingnamespacestd;
intin();
voidcyl(int);
longf(int,int);
voidout(int);
externintk;
//函数定义,f514.cpp
#include"h514.h"
intin(){
intt;
cout<<"请输入一整数。
";
cin>>t;
returnt;
}
voidcyl(intxb){
for(intnb=1;nb<=20;nb++)
out(f(xb,nb));
}
longf(intx,intn){
if(n==1)return1;
elseif(n==2)returnx;
elsereturnf(x,n-1)+x*f(x,n-2);
}
voidout(intxc){
cout<k++;
if(k%5==0)cout<}
//主函数,m514.cpp
#include"h514.h"
intk=0;
intmain()
{
intxa;
xa=in();
cyl(xa);
return0;
}
5.10.2程序设计题
1.试设计一程序,输入三个不等的整数,求出其中的最大数,输出之。
充分细分各项任务,由多个函数分担实现。
#include
usingnamespacestd;
voidin(int&,int&,int&);
intmx(int,int,int);
voidout(int);
intmain()
{
inta,b,c,max;
in(a,b,c);
max=mx(a,b,c);
out(max);
return0;
}
voidin(int&x,int&y,int&z){
cout<<"请输入三个不等的整数。
"<cin>>x>>y>>z;
}
intmx(intx,inty,intz){
return(x>=y?
x:
y)z:
(x>=y?
x:
y);
}
voidout(intm){
cout<<"三数中最大数为:
"<}
2.设计程序,输入m值和r值,按下列公式计算组合数C(m,r):
C(m,r)=m!
/(r!
×(m-r)!
)
其中m、r为正整数,且m>r。
分别求出C(3,2)、C(8,4)、C(5,3)的组合数。
充分细分各项任务,由多个函数分担实现。
#include
usingnamespacestd;
voidin(int&,int&);
intjecn(int);
intC(int,int);
voidout(int,int);
intmain()
{
inta,b;
in(a,b);
out(a,b);
return0;
}
voidin(int&x,int&y){
cout<<"请依次输入大小两整数。
"<cin>>x>>y;
}
intjecn(intn){
intm=1;
for(inti=1;i<=n;i++)m*=i;
returnm;
}
intC(intm,intr){
return(jecn(m)/(jecn(r)*jecn(m-r)));
}
voidout(intu,intv){
cout<<"C("<
}
程序运行结果为:
请依次输入大小两整数。
32↙
C(3,2)=3
请依次输入大小两整数。
84↙
C(8,4)=70
请依次输入大小两整数。
53↙
C(5,3)=10
3.试设计程序,用函数的递归调用求阶乘5!
和8!
。
#include
usingnamespacestd;
intjecn(intn){
if(n==1)return1;
elsereturnn*jecn(n-1);
}
intmain()
{
cout<<"阶乘5!
的值为:
"<cout<<"阶乘8!
的值为:
"<return0;
}
运行结果为:
阶乘5!
的值为:
120
阶乘8!
的值为:
40320
4.试设计程序,输入一整数n,用递归函数实现求Fibonacci数列的前n项。
#include
#include
usingnamespacestd;
intfbnc(intn){
if(n==1||n==2)return1;
elsereturnfbnc(n-1)+fbnc(n-2);
}
intmain()
{
for(intn=1;n<=20;n++){
cout<if(n%10==0)cout<}
return0;
}
5.试修改例5-7程序使得运行结果改为正序输出。
#include
usingnamespacestd;
intin();
voidfun(int);
intmain()
{
inta;
a=in();
fun(a);
cout<return0;
}
intin()
{
intn;
cout<<"请输入一个整数。
"<cin>>n;
returnn;
}
voidfun(intx)
{
if(x){
fun(x/8);
cout<}
}
6.试设计一程序,输入一个十进制整数,能正序输出其十六进制数。
用递归函数求解。
#include
usingnamespacestd;
intin();
voidfun(int);
intmain()
{
inta;
a=in();
fun(a);
cout<return0;
}
intin()
{
intn;
cout<<"请输入一个整数。
"<cin>>n;
returnn;
}
voidfun(intx)
{
if(x){
fun(x/16);
cout<}
}
7.试设计程序。
输入一整数x(要求x>1)和一整数n,分别用递归函数和非递归函数来求出Hennite多项式的前n项的值。
当x>1时,Hennite多项式定义为:
用递归函数程序如下:
#include
#include
usingnamespacestd;
intHennite(intx,intn){
if(n==0)return1;
elseif(n==1)return2*x;
elsereturn2*x*Hennite(x,n-1)-2*(n-1)*Hennite(x,n-2);
}
intmain()
{
intx,n;
cout<<"请依次输入x和n两整数。
"<cin>>x>>n;
for(inti=0;icout<if((i+1)%5==0)cout<}
return0;
}
用非递归函数程序如下:
#include
#include
usingnamespacestd;
intmain()
{
intx,n;
cout<<"请输入x和n两整数。
"<cin>>x>>n;
intc=1,b=2*x,a;
a=2*x*b-2*(2-1)*c;
cout<<<for(inti=3;ic=b;b=a;a=2*x*b-2*(i-1)*c;
cout<if((i+1)%5==0)cout<}
return0;
}
8.试设计一程序,主函数中声明两整数a和b,初值分别为66和88。
用a和b通过别名传递调用函数swap将a和b的值相互交换。
主函数中输出调用前后a和b的值。
#include
usingnamespacestd;
voidswap(int&x,int&y){
intt;
t=x;x=y;y=t;
}
intmain()
{
inta=66,b=88;
cout<<"swap函数调用前:
"<<"a="<<<"b="<
swap(a,b);
cout<<"swap函数调用后:
"<<"a="<<<"b="<
return0;
}
9.试设计一程序,输入一个实数,由函数将其分解为整数部分和小数部分。
由主函数将这两部分输出之。
(用参数的别名传递)
#include
usingnamespacestd;
voidfun(doublex,double&y,int&z){
z=x;
y=x-z;
}
intmain()
{
doublea,b;
intc;
cout<<"请输入一个实数。
"<cin>>a;
fun(a,b,c);
cout<<"实数的小数部分为:
"<
cout<<"实数的整数部分为:
"<return0;
}
10.某同学家原快餐份数为0。
想吃快餐,向快餐店订送快餐5份。
试设计程序,由函数实施送餐;由主函数输出送餐前后该同学家的快餐份数。
(用参数的地址传递)
#include
usingnamespacestd;
voidfun(int*x){
*x+=5;
}
intmain()
{
inta=0;
cout<<"原快餐数为:
"<fun(&a);
cout<<"现快餐数为:
"<return0;
}
11.问从18点25分32秒的时刻开始,经过了123456789秒以后的时刻是几点几分几秒?
试设计程序,由函数进行计算,由主函数输出结果。
(用参数的地址传递)
#include
usingnamespacestd;
voidfun(int,int*,int*,int*);
intmain()
{
inttm=123456789;
inthr=18,mt=25,sd=32;
cout<<"原来时刻是"<
"<fun(tm,&hr,&mt,&sd);
cout<<"经"<cout<<"现在时刻是"<
"<return0;
}
voidfun(intt,int*h,int*m,int*s){
t=t+*h*3600+*m*60+*s;
*h=(t/3600)%24;
*m=(t%3600)/60;
*s=t%60;
}
12.试设计一程序,输入一个实数,由函数将其分解为整数部分和小数部分。
由主函数将这两部分输出之。
(用参数的地址传递)
#include
usingnamespacestd;
voidfun(