实验06 函数编译预处理.docx
《实验06 函数编译预处理.docx》由会员分享,可在线阅读,更多相关《实验06 函数编译预处理.docx(26页珍藏版)》请在冰点文库上搜索。
![实验06 函数编译预处理.docx](https://file1.bingdoc.com/fileroot1/2023-6/20/198d11f3-0531-4158-b7b9-eacb7f9a60d4/198d11f3-0531-4158-b7b9-eacb7f9a60d41.gif)
实验06函数编译预处理
班级:
B12数信班:
岁梦学号:
1205025106
实验6函数、编译预处理
实验目的:
1.掌握函数的定义、函数的说明和调用方法;
2.掌握函数实参与形参的对应关系以及“值传递”的方式和函数值的正确返回;
3.掌握函数的嵌套调用和递归调用的方法;
4.掌握数组做函数参数的用法;
5.掌握全局变量、局部变量、动态变量、静态变量的概念和使用方法;
6.掌握宏定义、文件包含处理和条件编译的方法;
7.学习对多文件程序的编译和运行。
实验容:
1.程序阅读理解训练。
1)输入并运行下面的程序,分析输出的结果。
#include
voidtry(int,int,int);
voidmain()
{
intx=2,y=3,z=4;
printf("
(1)x=%dy=%dz=%d\n",x,y,z);
try(x,y,z);
printf("(4)x=%dy=%dz=%d\n",x,y,z);
}
voidtry(intx,inty,intz)
{
printf("
(2)x=%dy=%dz=%d\n",x,y,z);
z=x+y;
x=x*x;
y=y*y;
printf("(3)x=%dy=%dz=%d\n",x,y,z);
}
2)输入并运行下面的程序,分析输出的结果。
#include
voidswap(int,int);
voidmain()
{
intx=10,y=20;
printf("
(1)x=%dy=%d\n",x,y);
swap(x,y);
printf("(4)x=%dy=%d\n",x,y);
}
voidswap(inta,intb)
{
intt;
printf("
(2)a=%db=%d\n",a,b);
t=a;
a=b;
b=t;
printf("(3)a=%db=%d\n",a,b);
}
3)输入并运行下面的程序,分析输出的结果。
#include
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)输入并运行下面的程序,分析输出的结果。
#include
intf1(intn)
{
staticintf=1;
f=f*n;
return(f);
}
voidmain()
{
inti;
for(i=1;i<=4;i++)
printf("%5d",f1(i));
printf("\n");
}
5)输入并运行下面的程序,说明程序及其ispring函数的功能。
运行程序时,分别输入数据:
17、34、2,1、0,检查结果是否正确,如果结果不正确,请修改。
(熟练掌握该程序)
#include
intisprime(int);
voidmain()
{
intx;
printf("Enteraintegernumber:
");
scanf("%d",&x);
if(isprime(x))
printf("%disprime.\n",x);
else
printf("%disnotprime.\n",x);
}
intisprime(inta)
{
inti;
for(i=2;i<=sqrt((double)a);i++)
if(a%i==0)
return0;
return1;
}
6)输入并运行下面的程序,说明函数fun的功能。
#include
intfun(intnum)
{
intk=1;
do
{
k*=num%10;
num/=10;
}
while(num);
returnk;
}
voidmain()
{
intn=26;
printf("%d\n",fun(n));
}
思考:
如果将函数fun中的变量k初始化为0,并将语句“k*=num%10;”改为“k+=num%10;”,函数fun的功能变为什么?
7)输入并运行下面的程序,说明函数fun的功能。
(熟练掌握该程序)
#include
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");
}
2.程序填空(根据题意在空白处填入适当的容,使程序变得完整,并上机进行调试验证)
1)程序说明:
下面程序将输入的十进制数n转换为b进制数,并将转换结果输出。
转换的方法是:
除b取余法。
#include"stdio.h"
voidtransfer(intm,intk)
{
inta[20],i;
for(i=0;m;i++)
{
a[i]=;
m/=k;
}
for(;i>=0;i--)
printf("%d",a[i]);
}
voidmain()
{
intb,n;
scanf("%d%d",);
;
}
修改:
#include"stdio.h"
voidtransfer(intm,intk)
{
inta[20]={0},i;
for(i=0;i<=m;i++)
{
a[i]=m%k;
m/=k;
}
for(;i>=0;i--)
printf("%d",a[i]);
}
voidmain()
{
intb,n;
scanf("%d%d",&b,&n);
transfer(n,b);
}
2)程序说明:
歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和,例如4=2+26=3+38=3+5…50=3+47。
下面程序将4-50之间的所有偶数用两个素数之和表示,判断一个整数是否为素数用函数prime完成。
#include"stdio.h"
intprime(intx)
{
intk,flag=1;
for(k=2;k<=x/2;k++)
if()
{
flag=0;
break;
}
return();
}
voidmain()
{
intm,n,k;
for(m=4;m<=50;m++)
for(n=2;nif(prime(n)&&)
{
printf("%d=%d+%d\n",);
break;
}
}
修改:
#include"stdio.h"
intprime(intx)
{
intk,flag=1;
for(k=2;k<=x/2;k++)
if(x%k==0)
{
flag=0;
break;
}
return(flag);
}
voidmain()
{
intm,n,k;
for(m=4;m<=50;m++)
for(n=2;nif(prime(n)&&prime(m-n))
{
printf("%d=%d+%d\n",m,n,m-n);
break;
}
}
3)程序说明:
用一个一维数组存放10个学生的成绩,写一个函数求出平均分、最高分和最低分。
#include"stdio.h"
floatmax=0;min=0;
floataverage(floatscore[],intn)
{
inti;
floatave,sum=score[0];
max=min=;
for(i=1;i{
if(score[i]>max)
max=score[i];
elseif()
min=score[i];
sum=sum+score[i];
}
ave=sum/10;
return;
}
voidmain()
{
floatave,score[10];
inti;
for(i=0;i<10;i++)
scanf("%f",);
ave=average();
printf("max=%6.2fmin=%6.2faverage=%6.2f\n,max,min,ave);
}
修改:
#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)程序说明:
在主函数中读入一字符串,再读入一字符,然后调用函数delete在字符串中查找并删除该字符,最后输出该字符串。
#include"stdio.h"
voiddelete(charp[],charch)
{
inti=0,j;
while()
{
if(p[i]==ch)
for(j=i;j<;j++)
p[i]=p[i+1];
else
i++;
}
}
voidmain()
{
charp[80],ch;
inti=0,j;
scanf("%s",p);
scanf("%c",&ch);
delete();
printf("%s",);
}
修改:
#include"stdio.h"
voiddelete(charp[],charch)//asda
{
inti=0,j;
while(p[i]!
='\0')//a
{
if(p[i]==ch)
for(j=i;j<80;j++)
p[i]=p[i+1];
else
i++;
}
}
voidmain()
{
charp[80],ch;
inti=0,j;
scanf("%s",p);
scanf("%c",&ch);
delete(p,ch);
printf("%s",p);
}
5)程序说明:
输入10个学生的学号及单科成绩,然后求出最高分的学号、最低分的学号以及超过平均分的人数。
#include"stdio.h"
inthigh_num,low_num;
intover_aver(intscore[],intn)
{
inti,imax,imin,over_num;
floataver;
imax=0;imin=0;aver=0;
for(i=0;i{
aver+=score[i];
if(score[i]>score[imax])imax=i;
if(score[i]}
aver/=n;
over_num=0;
for(i=0;iif(score[i]>=aver)
over_num++;
___________________;
___________________;
returnover_num;
}
voidmain()
{
inti,over_num,a[10];
printf("\ninputa:
");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
over_num=___________________;
printf("\nhigh_num,low_num=%d,%d",high_num,low_num);
printf("\nover_num=%d",over_num);
}
修改:
#include"stdio.h"
inthigh_num,low_num;//全局变量
intover_aver(intscore[],intn)
{
inti,imax,imin,over_num;
floataver;
imax=0;imin=0;aver=0;
for(i=0;i{
aver+=score[i];
if(score[i]>score[imax])imax=i;
if(score[i]}
aver/=n;
over_num=0;
for(i=0;iif(score[i]>=aver)
over_num++;
high_num=imax;
low_num=imin;
returnover_num;
}
voidmain()
{
inti,over_num,a[10];
printf("\ninputa:
");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
over_num=over_aver(a,10);
printf("\nhigh_num,low_num=%d,%d",high_num,low_num);
printf("\nover_num=%d",over_num);
}
3.程序设计(根据题意编写程序并上机进行调试)
1)用递归法将一个整数n转换成字符串。
例如,输入483,应输出字符串“483”。
n的位数不确定,可以是任意的整数。
#include
voidconvert(intn)
{
inti;//定义整数变量
if((i=n/10)!
=0)/*如果整数i除以10后不为0,说明高位还有值,需要更多字符来表示*/
convert(i);//调用自身,使用除以10后的i值
putchar(n%10+'0');//打印余数,余数是1则打印字符1,以此类推
}
intmain()
{
intnumber;//定义整数变量
printf("输入一个数:
");//输出信息
scanf("%d",&number);//让用户输入一个整数
printf("输出:
");//输出信息
if(number<0)//如果是负数
{
putchar('-');//打印负号
number=-number;//负数变为正数
}
convert(number);//执行递归函数
printf("\n");
return0;
}
2)求两个整数的最大公约数和最小公倍数。
用一个函数求最大公约数,用另一函数根据求出的最大公约数求最小公倍数。
要求:
求最大公约数用递归方法实现,递归公式为(r=m%n):
1不用全局变量,分别用两个函数求最大公约数和最小公倍数。
两个整数在主函数中输人,并传送给函数l,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,再返回到主函数输出最大公约数和最小公倍数。
#include
intgcd(intm,intn)
{
intr,max_gys;
r=m%n;
if(r==0)
{
max_gys=n;
returnmax_gys;
}
else
{
gcd(n,r);
}
}
intgbs(intm,intn,intl)
{
inta,b,c;
a=m/l;
b=n/l;
c=a*b*l;
returnc;
}
intmain()
{
intm,n,x,y,t;
printf("输入两个需要求最大公约数和最小公倍数的数:
\n");
scanf("%d%d",&m,&n);
if(m{
t=m;m=n;n=t;
}
x=gcd(m,n);
y=gbs(m,n,x);
printf("最大公约数是%d\t最小公倍数的数是%d\n",x,y);
return0;
}
②用全局变量的方法,分别用两个函数求最大公约数和最小公倍数,但其值不由函数带回。
将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值。
#include
intx,y;
voidgcd(intm,intn)
{
intr,max_gys;
r=m%n;
if(r==0)
{
x=n;
}
else
{
gcd(n,r);
}
}
voidgbs(intm,intn)
{
inta,b;
a=m/x;
b=n/x;
y=a*b*x;
}
intmain()
{
intm,n,t;
printf("输入两个需要求最大公约数和最小公倍数的数:
\n");
scanf("%d%d",&m,&n);
if(m{
t=m;m=n;n=t;
}
gcd(m,n);
gbs(m,n);
printf("最大公约数是%d\t最小公倍数的数是%d\n",x,y);
return0;
}
3)三角形的面积为
其中,
为三角形的边长,
。
编写程序求面积
。
要求:
定义两个带参数的宏,一个用来求
,另一个用来求
,在程序中用带参数的宏名来求面积
。
#include
#include
#defineS(a,b,c)1.0/2.0*(a+b+c)
#defineAREA(a,b,c)sqrt((S(a,b,c))*((S(a,b,c))-a)*((S(a,b,c))-b)*((S(a,b,c))-c))
intmain()
{
floata,b,c,area;
printf("输入三角形的三边:
");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
area=AREA(a,b,c);
printf("三角形的面积是%0.2f\n",area);
}
else
{
printf("这三个数不能构成三角形!
");
}
return0;
}
4)用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一字母(如'a'变成'b',……,'z'变成'a'),其他非字母字符不变。
用#define命令来控制是否要译成密码。
例如:
#defineCHANGE1
输出密码
#defineCHANGE0
按原码输出
#defineCHANGE1
输出密码
#include
#defineCHANGE1
按原码输出
intmain()
{
chara[1000];
inti;
printf("输入一串字符:
\n");
scanf("%s",&a);
if(CHANGE)
{
for(i=0;i<1000;i++)
{
if((a[i]>='a'&&a[i]<'z')||(a[i]>='A'&&a[i]<'Z'))
{
a[i]+=1;
}
if(a[i]=='z'||a[i]=='Z')
{
a[i]-=25;
}
}
printf("输出密码:
\n%s\n",a);
}
else
printf("输出原码:
\n%s\n",a);
return0;
}
最后,对这次实验作一个简要的总结。