实验五函数与编译预处理.docx
《实验五函数与编译预处理.docx》由会员分享,可在线阅读,更多相关《实验五函数与编译预处理.docx(16页珍藏版)》请在冰豆网上搜索。
实验五函数与编译预处理
实验五函数与编译预处理
实验课程名:
高级语言程序设计(C)
专业班级:
11级环境科学
(1)班学号:
201140340104姓名:
杨华
实验时间:
2013-6-7实验地点:
K3-208指导教师:
刘军
一、实验目的和要求
1.掌握定义函数的方法。
2.掌握函数实参与形参的对应关系以及“值传递”的方法。
3.掌握函数的嵌套调用和递归调用的方法。
4.掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。
二、实验内容
1.任务名称
阅读c60101.c程序,通过调试该程序,熟悉函数的调用方法及单步跟踪键F7和F8的不同。
源代码:
#include
voidmain()
{
voidfun(inti,intj,intk);
intx,y,z;
x=y=z=6;
fun(x,y,z);
printf("x=%d;y=%d;z=%d\n",x,y,z);
}
voidfun(inti,intj,intk)
{
intt;
t=(i+j+k)*2;
printf("t=%d\n",t);
}
运行结果:
(需要截图)
运行结果分析:
2、任务名称
阅读c60102.c程序,注意在调试时F11和F10的区别,还要注意函数调用过程中形参、实参的关系。
源代码:
运行结果:
(需要截图)
运行结果分析:
3、任务名称
程序c60103.c是实现求素数的,请填空完成该程序,并上机运行测试。
#include
#include
voidmain()
{intm;
;/*申明求素数函数*/
printf("Pleaseinputadatam=:
");
scanf("%d",&m);
;/*调用求素数函数*/
}
voidprime(intn)
{inti,k;
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)break;
if(i>=k+1)
printf("Thisisaprimenumber");
elseprintf("Thisisn’taprimenumber");
}
源代码:
#include
#include
voidmain()
{
intm;
voidprime(intn);/*申明求素数函数*/
printf("Pleaseinputadatam=:
");
scanf("%d",&m);
prime(m);/*调用求素数函数*/
}
voidprime(intn)
{
inti,k;
k=sqrt(n);
for(i=2;i<=k;i++)
if(n%i==0)break;
if(i>=k+1)
printf("Thisisaprimenumber\n");
elseprintf("Thisisn'taprimenumber\n");
}
运行结果:
(需要截图)
运行结果分析:
4.任务名称
程序c60104.c的功能是从键盘上输入的若干个数并求出最大值。
请填空完成该程序。
#include
voidmain()
{inti;
ints[10],max;
/*Findmax()函数的申明*/
intFindmax(intx[],intn);
printf("Input10number:
\n");
/*输入10个数据到s数组中*/
for(i=0;i<10;i++)scanf(“%d”,&s[i]);;
/*调用Findmax函数*/
max=Findmax(s,10);;
for(i=0;i<10;i++)
printf("%4d",s[i]);
printf("\nthemaxis%d",max);
}
intFindmax(intx[],intn)
{intmax,i;
max=x[0];
for(i=1;iif(maxmax=x[i];
returnmax;
}
源代码:
#include
voidmain()
{
inti;
ints[10],max;
intFindmax(intx[],intn);/*Findmax()函数的申明*/
printf("Input10number:
\n");
for(i=0;i<10;i++)
scanf("%d",&s[i]);/*输入10个数据到s数组中*/;
max=Findmax(s,10);/*调用Findmax函数*/;
for(i=0;i<10;i++)
printf("%4d",s[i]);
printf("\nthemaxis%d\n”max;
}
intFindmax(intx[],intn)
{
intmax,i;
max=x[0];
for(i=1;iif(maxmax=x[i];
returnmax;
}
运行结果:
(需要截图)
运行结果分析
5.任务名称
程序c60105.c的功能是从键盘上输入的若干个数按升序排序。
请调试检查该程序中的错误,程序如下:
#include
voidmain()
{inti,k;
floats[100],j;
printf("Inputnumber:
\n");
for(i=0;scanf("%f",&j);i++)
s[i]=j;
sort(s,i);
for(k=0;k
printf("%f",s[k]);
printf("\n");
}
voidsort(intx[n],intn)
{inti,j,temp,min;
for(i=0;i{min=i;
for(j=i+1;jif(x[j]min=j;
if(min!
=i)
{temp=x[i];
x[i]=x[min];
x[min]=temp;
}
}
}
错误提示:
形参和实参的数据类型不一致;一般形参数组在说明时不指定数组的长度,而仅给出类型、数组名和一对方括号;用户自定义函数sort()没有申明过。
注意:
for(i=0;scanf("%f",&j);i++)这一行中for语句第二个表达式的使用形式,此处用了scanf()函数的出错来结束输出循环。
请读者查一下教材后面的附录,看看什么时候scanf()函数返回0,此时就可以结束循环。
源代码:
#include
voidmain()
{inti,k;
ints[100],j;
voidsort(intx[],intn);
printf("Inputnumber:
\n");
for(i=0;scanf("%d",&j);i++)
s[i]=j;
sort(s,i);
for(k=0;k
printf("%4d",s[k]);
printf("\n");
}
voidsort(intx[],intn)
{inti,j,temp,min;
for(i=0;i{min=i;
for(j=i+1;jif(x[j]min=j;
if(min!
=i)
{temp=x[i];
x[i]=x[min];
x[min]=temp;
}
}
}
运行结果:
(需要截图)
运行结果分析
6.任务名称
编写程序,实现由主函数输入m、n,按下述公式计算并输出
的值。
提示:
定义一个求阶层的函数,然后在主函数中调用三次即可求得
源代码:
#include
intmain()
{
intfac(intx);
intm,n,a,b,c,y;
printf("inputanintegernumber:
");
scanf("%d,%d",&m,&n);
a=fac(m);b=fac(n);c=fac(m-n);
y=a/(b*c);
printf("y=%d\n",y);
return0;
}
intfac(intx)
{
intf;
if(x<0)
printf("x<0,dateerror!
\n");
elseif(x==0||x==1)
f=1;
elsef=fac(x-1)*x;
return(f);
}
运行结果:
(需要截图)
运行结果分析
7.任务名称
阅读如下递归程序c60107.c,其功能是什么?
上机调试。
#include
voidmain()
{intm,k;
voiddtoo(intn,intr);
printf("Pleaeinputthedecimalnumber:
");
scanf("%d",&m);
printf("Pleaseinputanumberin(2,8,16):
");
scanf("%d",&k);
dtoo(m,k);
printf(“\n”);
}
voiddtoo(intn,intr)
{if(n>=r)dtoo(n/r,r);
printf("%d",n%r);
}
源代码:
运行结果:
(需要截图)
运行结果分析:
输出输入的较小值
8.任务名称
预习c60201.c程序,写出预习结果,上机验证并写出分析。
变量的作用范围
#defineLOW10
#defineHIGH5
#defineCHANGE2
inti=LOW;
#include
voidmain()
{intworkover(inti),reset(inti);
inti=HIGH;
reset(i/2);
printf("i=%d\n",i);
reset(i=i/2);
printf("i=%d\n",i);
reset(i/2);
printf("i=%d\n",i);
workover(i);
printf("i=%d\n",i);
}
intworkover(inti)
{i=(i%i)*((i*i)/(2*i)+4);
printf("i=%d\n",i);
return(i);
}
intreset(inti)
{i=i<=CHANGE?
HIGH:
LOW;
return(i);
}
相关知识:
“变量用之不尽,一写就走”。
在main()主函数中reset(i/2)和reset(i=i/2)不同,第一个reset的i没有被赋值到,所以该函数调用结束后还保持原来的值;而第二个reset的i被赋值了,所以函数调用结束后以前的值就没有。
全局变量:
在所函数外面定义的变量,其有效范围到整个源程序结尾;局部变量:
在函数内部定义的变量或在函数头部定义的形参,其有效范围只在所定义的函数,局部变量具有“用之则建,用完则撤”的特点。
在不同函数内定义的变量同名互不干扰。
如果一个源程序中的局部变量和全局变量同名,则局部变量优先。
源代码:
运行结果:
(需要截图)
运行结果分析
9.任务名称
上机调试c60202.c程序,观察静态局部变量在调用过程中的变化。
#include
voidmain()
{inti;
intf(int);
for(i=1;i<=5;i++)
printf("(%d):
%d\n",i,f(i));
printf("\n");
}
intf(intn)
{staticintj=1;
j=j*n;
return(j);
}
相关知识:
静态局部变量。
如果希望在函数调用结束后仍然保留函数中定义的局部变量的值,则可以将该局部变量定义为静态局部变量(或称局部静态变量)。
静态局部变量具有这样一些特点:
①全局寿命:
静态局部变量的数据存储在静态存储区的存储单元中,在函数调用结束后,它的值并不消失,直到整个应用程序执行结束,它的存储空间才被收回去。
②局部可见性:
其作用域只在定义它的函数内部,尽管它的值在函数调用结束后并不消失,但其他函数仍然不能访问它,在进入到它所在的函数内,它的值才可见。
③初始化的特点:
若在定义该局部变量时有赋初值的,则赋初值只在编译过程中进行,只赋值一次;若没有赋初值,则默认的初值为0(数值型)或空字符(字符型)。
源代码:
运行结果:
(需要截图)
运行结果分析
10.任务名称
预习程序c60203.c,分析在程序运行前宏NUM的值,并上机运行,比较一下的预习结果和实际结果。
#include"stdio.h"
#defineN2
#defineMN+1
#defineNUM(M+1)*M/2
main()
{inti,n=0;
for(i=1;i<=NUM;i++)
{n++;printf("%d\n",n);}
printf("\n");
}
源代码:
运行结果:
(需要截图)
运行结果分析
11.任务名称.
分析程序c60104.c的运行结果,上机验证。
#definePOWER(x)((x)*(x))
#defineMAX(x,y)(x)>(y)?
(x):
(y)
#definePRprintf
#include
voidmain()
{inta,b,c,d,x;
a=5;b=10;x=200;
c=POWER(a+b);
x=x/POWER(a+b);
d=MAX(a+6,b);
PR("c=%d,d=%d,x=%d\n",c,d,x);
}
源代码:
运行结果:
(需要截图)
运行结果分析
12.任务名称
编写:
输入10个学生的3门课的成绩,分别用函数求:
(1)每个学生的平均分。
(2)每门课的平均分。
(3)按学生平均分降序排列输出学生信息。
(4)统计不及格学生,输出其相应信息。
(5)编写一菜单主函数,菜单内容包括以上4部分。
分析:
本题要求完成的操作有录入数据、求平均分、排序、统计。
这些操作分别用函数来实现。
先分析表示这些数据的数据结构,可用如下结构来表示学生的成绩:
课程1
课程2
课程3
平均分
68
74
50
…
…
…
即10个学生的3门课程成绩可以登记在一个二维数组中score[10][4],其中最后一列用于保存平均分,学生的学号不单独记录,学生的序号用二维表的行号来表示。
下面给出了主菜单的参考程序c60205.c,其他功能的函数学生自己编写。
#include
#defineN10
#defineM4
voidmain()
{intscore[N][M];
charchoice='1';
voidinput(int[][],int,int);
voidaver_stu(int[][],int,int);
voidaver_cour(int[][],int,int);
voidorde_aver(int[][],int,int);
voidfailed(int[][],int,int);
input(score,N,M);
/*显示主菜单*/
while(choice!
='0')
{clrscr();
printf("==========theScoreProcessingSystem====================\n");
printf("1.printeachstudent'saverage\n");
printf("2.printeachcourse'saverage\n");
printf("3.Orderthestudentsbystudent'saveragedecreasingly\n");
printf("4.printthefailedstudent\n");
printf("0.Exitthesystem\n");
printf("===============================================\n");
printf("Pleasechoise(0-4):
\n");
choice=getchar();
switch(choice)
{case'1':
aver_stu(score,N,M);break;
case'2':
aver_cour(score,N,M);break;
case'3':
orde_aver(score,N,M);break;
case'4':
failed(score,N,M);break;
case'0':
exit(0);
default:
printf("ChoiceError,Pleaseselectagain(0-4).");
}
}
}
源代码:
运行结果:
(需要截图)
运行结果分析
三、结论(写本次实验的收获)
通过近2周的实验学习,我掌握定义函数,函数实参与形参的对应关系以及“值传递”,函数的嵌套调用和递归调用的方法,也熟悉了全局变量和局部变量,动态变量、静态变量的概念和使用方法。
说明:
1、每次实验报告后,以学生的学号+实验项目名作为该word文件名保存。
例如某学生学号为20080001,姓名为张三,本次实验名称是:
实验一顺序结构程序设计,则本次实验报告的保存文件名为:
01张三实验一.doc。
(禁止提交文件夹)
2、在每次试验完后内,学生以整个试验项目为一个完整文档,将本报告(电子文档和纸质文档)按照
(1)要求的文件名提交给实验指导教师。