实验6函数习题及答案.docx
《实验6函数习题及答案.docx》由会员分享,可在线阅读,更多相关《实验6函数习题及答案.docx(17页珍藏版)》请在冰点文库上搜索。
实验6函数习题及答案
实验6函数
班级:
学号:
姓名:
日期:
一、实验目的
(1)掌握定义函数的方法;
(2)掌握函数实参与形参的对应关系,以及“值传递”的方式;
(3)掌握函数的嵌套调用和递归调用的方法;
(4)掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法;
(5)学习对多文件的程序编译和运行。
二、实验内容
1.阅读下面程序,写出程序运行结果,并且上机进行验证。
(1)a1.cpp
变量的虚实耦合,实现的是值传递,是单向传递
#include"stdio.h"
intswap(inta,intb)
{
intc,s;
c=a;
a=b;
b=c;
s=a+b;
returns;
}
voidmain()
{
inta,b,s;
a=3;b=4;
s=swap(a,b);
printf("a=%db=%ds=%d\n",a,b,s);
}
(2)a2.cpp
将十进制数26的各位数字相乘
#include"stdio.h"
intfun(intnum)
{
intk=1;
do
{
k*=num%10;/
num/=10;
}while(num);
return(k);
}
voidmain()
{
intn=26;
printf("%d\n",fun(n));
}
(3)a3.cpp
变量的作用域,当在函数内定义了与全局变量同名的局部变量时,全局变量被屏蔽
#include"stdio.h"
inta=3,b=5,c;
voidf(intb)
{
c=a+b;
printf("%d%d%d\n",a,b,c);
}
voidmain()
{
inta=8;
f(3);
printf("%d%d%d\n",a,b,c);
}
(4)a4.cpp
递归,将十进制11转换为二进制
#include"stdio.h"
voiddtob(intn)
{
inti;
if(n>1)
{
i=n%2;
dtob(n/2);
}
else
i=n;
printf("%d",i);
}
voidmain()
{
inti=11;
printf("%d->",i);
dtob(i);
printf("
(2)\n");
}
(5)a5.cpp
静态变量,求1到4的阶乘
#include"stdio.h"
intf1(intn)
{
staticintf=1;
f=f*n;
return(f);
}
voidmain()
{
inti;
for(i=1;i<=4;i++)
printf("%5d",f1(i));
printf("\n");
}
2.程序填空(根据题意在空白处填入适当的内容,使程序变得完整。
并上机进行调试验证)
(1)b1.cpp
程序说明:
下面程序将输入的十进制数n转换为b进制数,并将转换结果输出。
转换的方法是:
除b取余法。
#include"stdio.h"
voidtransfer(intm,intk)
{
inta[20],i;
for(i=0;m;i++)//当商m为0时,循环结束,否则继续循环
{
a[i]=m%k;//将m对k的余数存放在数字a中
m/=k;//m=m/k,即将m除k的商放在m中
}
for(i--;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
voidmain()
{
intb,n;
scanf("%d%d",&b,&n);
transfer(n,b);
}
(2)b2.cpp
程序说明:
歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和,例如4=2+26=3+38=3+5…50=3+47。
下面程序将4-50之间的所有偶数用两个素数之和表示,判断一个整数是否为素数用函数prime完成。
#include"stdio.h"
intprime(intx)//判断x是否为素数,如果x为素数,则返回1,否则返回0
{
intk,flag=1;
for(k=2;k<=x/2;k++)
if(x%k==0)
{
flag=0;
break;
}
return(flag);
}
voidmain()
{
intm,n;
for(m=4;m<=50;m=m+2)
for(n=2;nif(prime(n)&&prime(m-n))//如果n和m-n均为素数,则prime(n)和prime(m-n)返回的值均为1,非零即真
{
printf("%d=%d+%d\n",m,n,m-n);
break;
}
}
(3)b3.cpp
程序说明:
用一个一维数组存放10个学生的成绩,写一个函数求出平均分、最高分和最低分。
#include"stdio.h"
floatmax=0,min=0;
floataverage(floatscore[],intn)
{
inti;
floatave,sum=score[0];
max=min=score[0];
for(i=1;i{
if(score[i]>max)
max=score[i];
elseif(score[i]min=score[i];
sum=sum+score[i];
}
ave=sum/10;
returnave;
}
voidmain()
{
floatave,score[10];
inti;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10);//如果形参是数组,则调用时实参应该用数组名,实现的是地址传递
printf("max=%6.2fmin=%6.2faverage=%6.2f\n",max,min,ave);
}
(4)b4.cpp
程序说明:
在主函数中读入一字符串,再读入一字符,然后调用函数dele在字符串中查找并删除该字符,最后输出该字符串。
#include"stdio.h"
#include
voiddele(charp[],charch)
{
inti=0,j;
while(p[i]!
='\0')
{
if(p[i]==ch)
for(j=i;p[j]!
='\0';j++)
p[j]=p[j+1];
else
i++;
}
}
voidmain()
{
charp[80],ch;
scanf("%s",p);
ch=getchar();
scanf("%c",&ch);
dele(p,ch);
printf("%s",p);
}
3.编写程序并上机调试运行之。
(1)写一个判断素数的函数,在主函数输入一个整数,输出是否素数的信息。
本程序应当准备以下测试数据:
17、34、2、1、0。
分别运行并检查结果是否正确。
#include
#include
voidmain()
{
intprime(int);
intn;
printf("\npleaseinputainteger:
");
scanf("%d",&n);
if(prime(n))
printf("\n%disaprime!
",n);
else
printf("\n%disnotaprime!
",n);
}
intprime(intn)
{
inti,flag=1;
for(i=2;i<=n/2&&flag==1;i++)
{
if(n%i==0)
flag=0;
}
return(flag);
}
(2)用一个函数来实现将一行字符串中最长的单词输出。
此行字符串从主函数传递给该函数。
把两个函数放在同一个程序文件中,作为一个文件进行编译和运行。
把两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。
letter函数用于测试是否字母,longest函数用于返回最长单词的起始位置。
#include
#include
voidmain()
{
intletter(char);
intlongest(chars[]);
inti;
charstr[100];
printf("\ninputthestring:
");
gets(str);
printf("Thelongestwordis:
");
for(i=longest(str);letter(str[i]);i++)
printf("%c",str[i]);
printf("\n");
}
intletter(charc)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return
(1);
else
return(0);
}
intlongest(chars[])
{
intlen=0,i,length=0,flag=1,place=0,point;
for(i=0;i<=strlen(s);i++)
if(letter(s[i]))
if(flag)
{
point=i;
flag=0;
}
else
len++;
else
{
flag=1;
if(len>=length)
{
length=len;
place=point;
}
len=0;
}
return(place);
}
(3)用递归法将一个整数n转换成字符串。
例如,输入483,应输出字符串“483”。
N的位数不确定,可以是任意的整数。
#include
voidmain()
{
voidconvert(intn);
intnumber;
printf("inputaninteger:
");
scanf("%d",&number);
printf("output:
");
if(number<0)
{
putchar('-');
number=-number;
}
convert(number);
putchar('\n');
}
voidconvert(intn)
{
inti;
if((i=n/10)!
=0)
convert(i);
putchar(n%10+'0');
}
(4)求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。
用另一函数根据求出的最大公约数求最小公倍数。
不用全局变量,分别用两个函数求最大公约数和最小公倍数。
两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,返回到主函数输出最大公约数和最小公倍数。
用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带回。
将最大公约数和最小公倍数都设置为全局变量,在主函数中输出它们的值。
#include
voidmain()
{
inthcf(int,int);
intlcd(int,int,int);
intu,v,h,l;
scanf("%d%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
l=loc(u,v,h);
printf("L.C.D=%d\n",l);
}
inthcf(intu,intv)
{
intt,r;
if(v>u)
{
t=u;
u=v;
v=t;
}
while((r=u%v)!
=0)
{
u=v;
v=r;
}
return(v);
}
intloc(intu,intv,inth)
{
return(u*v/h);
}
(5)写一函数,输入一个十六进制数,输出相应的十进制。
#include
#defineMAX100
voidmain()
{
inthtoi(chars[]);
intc,i,flag,flag1;
chart[MAX];
i=0;
flag=0;
flag1=1;
printf("\ninputaHEXnumber:
");
while((c=getchar())!
='\0'&&i{
if((c>='0'&&c<='9')||(c>='a'&&c<='f')||(c>='A'&&c<='F'))
{
flag=1;
t[i++]=c;
}
elseif(flag)
{
t[i]='\0';
printf("decimalnumber%d:
\n",htoi(t));
printf("continueornot(Y/N)?
");
c=getchar();
if(c=='N'||c=='n')
flag1=0;
else
{
flag=0;
i=0;
printf("\ninputaHEXnumber:
");
}
}
}
}
inthtoi(chars[])
{
inti,n;
n=0;
for(i=0;s[i]!
='\0';i++)
{
if(s[i]>='0'&&s[i]<='9')
n=n*16+s[i]-'0';
if(s[i]>='a'&&s[i]<='f')
n=n*16+s[i]-'a'+10;
if(s[i]>='A'&&s[i]<='F')
n=n*16+s[i]-'A'+10;
}
return(n);
}
三、预习内容
教材第7章。