C程序设计实验报告
实验项目:函数和宏定义实验
姓名:罗子健 实验地点:物联网实验室 实验时间:2019年5月16日
一、实验目的与要求
(1)掌握函数定义方法和调用规则。
(2)掌握在C语言程序中主调函数和被调用函数之间进行数据传递的规则。
(3)了解函数的返回值及其类型,并正确使用它。
(4)了解局部变量和全局变量的作用域及它们与储存分类的关系,理解变量的存在性和可变性的概念。
(5)练习递归函数的使用。
(6)理解宏的概念,掌握定义无参宏和带参宏的方法。了解文件包含的概念,掌握其用法。
(7)理解内部函数和外部函数,了解外部函数的编译和连接的方法。
二、实验内容
6.4.2 实验练习2
1、问题的简单描述:利用复式梯形公式计算定积分。
2、实验流程图、代码和结果:
1 /*sab.h*/ 2 #include<stdio.h> 3 double f(double x); 4 double sab(double a, double b,int n) 5 { 6 double h,result,x1,x2,x3=0,t,k; 7 h=(b-a)/n;/*求h的值*/ 8 x1=f(a);/*求f(a)的值*/ 9 x2=f(b);/*求f(b)的值*/ 10 for(k=1;k<=(n-1);k++)/*for循环的循环体*/ 11 { 12 t=a+k*h; 13 x3=x3+f(t);/*求h n-1Σk=1f(xk)*/ 14 } 15 result=h*(x1+x2)/2+h*x3;/*最终的值存入result中*/ 16 return result; 17 }
1 /*2-1.cpp*/ 2 #include<stdio.h> 3 #include<math.h> 4 #include"sab.h" 5 double f(double x) 6 { 7 double result; 8 result=x*x*exp(x);/*f(x)=x^2*e^x的程序段*/ 9 return result; 10 } 11 main() 12 { 13 double a,b,result; 14 int n; 15 printf("请输入a,b,n:");/*提示输入a,b,n*/ 16 scanf("%lf,%lf,%d",&a,&b,&n);/*输入a,b,n*/ 17 result=sab(a,b,n);/*调用sab(a,b,n)求积分*/ 18 printf("sab=%lf",result);/*输出结果*/ 19 return 0; 20 }
1 /*2-2.cpp*/ 2 #include<stdio.h> 3 #include"sab.h" 4 double f(double x) 5 { 6 double result; 7 result=1/(25+x*x);/* f(x)=1/(25+x*x); f(x)=1/(25+x^2)的程序段*/ 8 return result; 9 } 10 main() 11 { 12 double a,b,result; 13 int n; 14 printf("请输入a,b,n:");/*提示输入a,b,n*/ 15 scanf("%lf,%lf,%d",&a,&b,&n);/*输入a,b,n*/ 16 result=sab(a,b,n);/*调用sab(a,b,n)求积分*/ 17 printf("sab=%lf",result);/*输出结果*/ 18 return 0; 19 }
3、问题分析:要分成3个独立的文件,就好比是Html中css的引用一样的使用。
6.4.2 实验练习3
1、问题的简单描述:计算Ackerman函数。
2、实验流程图、代码和结果:
1 #include<stdio.h> 2 int Ack(int n,int x,int y) 3 { 4 int a; 5 if(n==0)/*判断回归条件1的if语句头部*/ 6 a=x+1; 7 if(n==1&&y==0)/*判断回归条件2的if语句头部*/ 8 a=x; 9 if(n==2&&y==0)/*判断回归条件3的if语句头部*/ 10 a=0; 11 if(n==3&&y==0)/*判断回归条件4的if语句头部*/ 12 a=1; 13 if(n>=4&&y==0)/*判断回归条件5的if语句头部*/ 14 a=2; 15 if(n!=0&&y!=0) 16 a=Ack(n-1,Ack(n,x,y-1),x);/*进一步递推的语句*/ 17 return a; 18 } 19 main() 20 { 21 int n,x,y,result; 22 printf("please input n,x,y:");/*提示输入n,x,y*/ 23 scanf("%d,%d,%d",&n,&x,&y);/*输入n,x,y*/ 24 if(n<0&&x<0&&y<0) 25 printf("输出错误并重新输入");/*如果输入不合法,输出错误提示信息并重新输入*/ 26 else 27 result=Ack(n,x,y);/*用输入的两个数据,调用递归函数*/ 28 printf("Ack(%d,%d,%d)=%d ",n,x,y,result); 29 }
3、问题分析:注意判断输入不合法的条件。
6.4.3 实验练习1
1、问题的简单描述:编写计算x的y次幂的递归函数getpower(int x,int y),并在主程序中实现输入输出。
2、实验流程图、代码和结果:
1 #include"stdio.h" 2 long getpower(int x, int y) 3 { 4 if(y==1)/*判断回归条件的if语句头部*/ 5 return x; 6 else 7 return x*getpower(x,y-1);/*进一步递推的语句*/ 8 } 9 main() 10 { 11 int num, power; 12 long answer; 13 printf("输入一个数:");/*提示输入一个数*/ 14 scanf("%d",&num);/*输入一个整数*/ 15 printf("输入幂次方:");/*提示输入幂次方*/ 16 scanf("%d",&power);/*输入一个整数*/ 17 answer=getpower(num,power);/*用输入的两个数据,调用递归函数*/ 18 printf("结果是:%ld ", answer); 19 }
3、问题分析:无
6.4.3 实验练习2
1、问题的简单描述:编写计算学生年龄的递归函数。
2、实验流程图、代码和结果:
1 #include<stdio.h> 2 int age(int n) 3 { 4 int c; 5 if(n==1)/*判断回归条件的if语句头部*/ 6 c=10; 7 else 8 c=age(n-1)+2;/*进一步递推的语句*/ 9 return c; 10 } 11 main() 12 { 13 int n=5; 14 n=age(n);/*调用递归函数输出第5位学生的年龄*/ 15 printf("第5位学生的年龄是:%ld ",n); 16 }
3、问题分析:无
6.4.3 实验练习3
1、问题的简单描述:编写递归函数实现Ackman函数。
2、实验流程图、代码和结果:
1 #include<stdio.h> 2 Acm(int m,int n) 3 { 4 int a; 5 if(m==0)/*判断回归条件的if语句头部*/ 6 a=n+1; 7 if(n==0) 8 a=Acm(m-1,1); 9 if(n>0&&m>0) 10 a=Acm(m-1,Acm(m,n-1));/*进一步递推的语句*/ 11 } 12 int main() 13 { 14 int a,b; 15 a=Acm(2,1); 16 b=Acm(3,2); 17 printf("Acm(2,1)=%d Acm(3,2)=%d",a,b);/*调用Acm函数输出Acm(2,1)和Acm(3,2)的结果*/ 18 return 0; 2 }
3、问题分析:无
三、实验小结(在本次实验中收获与不足)
在寝室写实验报告时,实验报告的数据的前两个总是不能得到正确答案,在请教周萌同学之后,才发现是因为逗号的原因,因为在运行框中输入的逗号是中文逗号,而不是英文逗号,所以不能获得正确的实验数据。在以后的程序编写过程中,要注意中英文的切换。要注意到符号的不同所导致的错误。