第六章:函数与宏定义
函数与宏定义实验报告
姓名:许欣明 实验地点:一教522 实验时间:5月27日
一、实验目的与要求:
1.掌握函数的定义方法和调用规则。
2.掌握C语言程序中主调函数和被调函数之间进行数据传递的规则。
3.了解函数的返回值及其类型,并正确使用。
4.了解局部变量和全局变量的作用域及存储分类关系理解变量存在性和可见性的概念。
5.练习递归函数的使用。
6.理解宏的概念,掌握定义无参宏和带参宏的方法。
7.理解文件的概念并掌握其用法。
8.理解内部函数和外部函数,掌握外部函数的编译和连接方法。
二、实验内容:
实验一:
1.问题描述:
输入n,输出高度为n的正三角形。
2.实验代码:
#include <stdio.h> void trangle(int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n-i-1;j++) { printf(" "); } for(j=0;j<=2*i;j++) { printf("*"); } printf("\n"); } } int main() { int n; printf("请输入一个整数:"); scanf("%d",&n); printf("\n"); trangle(n); return 0; }
3.效果截图:
4.问题分析:
此处图形的打印过程都写在了trangle()函数中,其中与上一章的for循环结合把图形打印出来,其中for循环外部循环表示的是列,而内部循环代表的是行,注意观察图形判断好for循环的条件语句。如果想要多次打印,则可以再加上一个while循环实现。
实验二:
1.问题描述:
求两个数的最大公约数。
2.实验代码:
#include <stdio.h> int gcd(int a,int b) { int temp; int remainder; if(a<b) { temp=a; a=b; b=temp; } remainder=a%b; while(remainder!=0) { a=b; b=remainder; remainder=a%b; } return b; } int main() { int x,y; int fac; printf("please input two integers:"); scanf("%d,%d",&x,&y); fac=gcd(x,y); printf("The great common divisor is %d",fac); return 0; }
3.效果截图:
4.问题分析:
该问题可以有效的提升我们的编程思想,教我们如何把生活中的思想转化成代码,在程序中展现出来,就像本题中的问题,解决该问题的关键就是如何将辗转相除法转化为相应的代码,而我们要熟练的掌握这种方法,在以后的日子里要多多练习。
实验三:
1.问题描述:
利用复化梯形公式计算定积分
1)编写一个函数sab(a,b,n)其功能为利用复化梯形公式计算定积分,其中n为对区间[a,b]的等分数,要求该函数在一独立的文件中。
2)编织一个主函数及计算被积函数值的函数f(x),在主函数中调用1)中函数sab.h计算并输出下列积分值:
s=f [-1,1] x2ex dx 取n=10。
3)编制另一个主函数及计算被积函数值的函数f(x),在主函数中利用sab计算并输出下列积分值
s=f [-1,1] 1/(1+25x^2) dx 取n=8。
4)要求画出模块sab(a,b,n)的流程图。
则复化梯形公式为:s=h[f(a)+f(b)]/2+hf(xk)[k=1,n-1]
其中h=(b-a)/n,xk=a+kh。
2.实验代码:
/*计算1/(25+x*x)的定积分*/ #include"sab.h" double f(double x) { double result; result=1/(25+x*x); return result; } main() { double a,b,result; int n; printf("Please input double a,b and integer n:\n"); scanf("%lf%lf%d",&a,&b,&n); result=sab(a,b,n); printf("sab(%lf,%lf,%d)=%f",a,b,n,result); }
/*计算pow(x,2)*exp(x)的定积分*/ #include"sab.h" double f(double x) { double result; result=pow(x,2)*exp(x); return result; } main() { double a,b,result; int n; printf("Please input double a,b and integer n:\n"); scanf("%lf%lf%d",&a,&b,&n); result=sab(a,b,n); printf("sab(%lf,%lf,%d)=%f",a,b,n,result); }
/*利用复化梯形公式计算定积分*/ #include<stdio.h>
#include<math.h> double f(double x); double sab(double a,double b,int n) { double h,result,x1,x2,x3=0,t; int k; h=(b-a)/n; x1=f(a); x2=f(b); for(k=1;k<=n-1;k++) { t=a+k*h; x3+=f(t); } result=h*(x1+x2)/2+h*x3; return result; }
3.问题分析:
第三段代码为自己设计的之后需要调用的代码,它另起一个文件夹并且后缀应该为.h,之后文件的调用就应该这样写#include"sab.h",同时为了防止重复,可以把#include<stdio.h>
#include<math.h>写在sab.h的文件中。
实验四:
1.问题描述:
用递归的方法计算学生的年龄。已知第1位同学年龄最小为10岁,其余学生一个比另一个大两岁,求第5位学生的年龄。
2.实验代码:
#include <stdio.h> int age (int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c; } int main() { int n=5,sage; sage=age(n); printf("第%d位学生的年龄为;%d",n,sage); return 0; }
3.效果截图:
4.问题分析:
这里用到了函数的递规,可以复习一下:
递归函数就是直接或间接调用自身的函数,也就是自身调用自己;
递归两个要素:
1.递归边界
2.递归的逻辑——递归"公式"
函数的递规一帮都会有一个限制条件,否则容易造成溢出。