实验06 函数编译预处理.docx

上传人:b****6 文档编号:14022078 上传时间:2023-06-20 格式:DOCX 页数:26 大小:405.83KB
下载 相关 举报
实验06 函数编译预处理.docx_第1页
第1页 / 共26页
实验06 函数编译预处理.docx_第2页
第2页 / 共26页
实验06 函数编译预处理.docx_第3页
第3页 / 共26页
实验06 函数编译预处理.docx_第4页
第4页 / 共26页
实验06 函数编译预处理.docx_第5页
第5页 / 共26页
实验06 函数编译预处理.docx_第6页
第6页 / 共26页
实验06 函数编译预处理.docx_第7页
第7页 / 共26页
实验06 函数编译预处理.docx_第8页
第8页 / 共26页
实验06 函数编译预处理.docx_第9页
第9页 / 共26页
实验06 函数编译预处理.docx_第10页
第10页 / 共26页
实验06 函数编译预处理.docx_第11页
第11页 / 共26页
实验06 函数编译预处理.docx_第12页
第12页 / 共26页
实验06 函数编译预处理.docx_第13页
第13页 / 共26页
实验06 函数编译预处理.docx_第14页
第14页 / 共26页
实验06 函数编译预处理.docx_第15页
第15页 / 共26页
实验06 函数编译预处理.docx_第16页
第16页 / 共26页
实验06 函数编译预处理.docx_第17页
第17页 / 共26页
实验06 函数编译预处理.docx_第18页
第18页 / 共26页
实验06 函数编译预处理.docx_第19页
第19页 / 共26页
实验06 函数编译预处理.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验06 函数编译预处理.docx

《实验06 函数编译预处理.docx》由会员分享,可在线阅读,更多相关《实验06 函数编译预处理.docx(26页珍藏版)》请在冰点文库上搜索。

实验06 函数编译预处理.docx

实验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;n

if(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;n

if(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;i

if(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;i

if(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;

}

最后,对这次实验作一个简要的总结。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2