函数 实验 【实验目的】 ① 掌握函数的定义及函数的调用方法。
② 掌握函数间参数传递和返回值传递的方法。
③ 掌握递归程序设计的方法。
④ 学会使用模块化程序设计方法解决比较复杂的问题。
【实验 7 7..1 1】 】请编制程序,功能是从键盘输入两个整数,求它们的最大公约数和最小公倍数。要求在 main()中输入两个整数,gcd()求两个数的最大公约数,lcm()两个数的最小公倍数,main()调用 gcd()和 lcm()。
【指导 】求最大公约数 int gcd(int u,int v)使用“欧几里德算法”(也称“辗转相除法”)。该算法如下:
给定两个正整数 u,v(u>v)(1)用 u 除以 v,余数为 r;(2)若 r 为 0,算法结束,v 为最大公约数;(3)若 r 不为 0,则 v→u,r→v,返回(1)。
求最小公倍数 int lcm(int u,int v)的方法很多,在这里用最简单的方法,即 u 和 v的最小公倍数是:
u*v/(u 和 v 的最大公约数)【参考程序 】 #include int gcd(int u, int v)//求 u 和 v 的最大公约数,其中,u 为被除数,v 为除数 { int r;if(uv r=u%v;//求 u 除以 v 的余数 while(r!=0){ u=v;v=r;r=u%v;} return v;} int lcm(int u, int v)//求 u 和 v 的最小公倍数 { return u*v/gcd(u, v);} void main(){ int x, y;
printf(“input x,y:n”);scanf(“%d%d”,&x, &y);printf(“The gcd of %d and %d is %dn”,x,y, gcd(x,y));printf(“The lcm of %d and %d is %dn”,x,y,lcm(x,y));} 【实验 7 7..2 2 】编制程序,在主函数中从键盘输入的一个整数,并调用子函数判断该整数是否是素数,然后在主函数中输出判断结果。
【提示 】(1)编制一个能判断任意整数 x 是否为素数的子程序 int prime(int x)。该函数的返回值为 1(x 是素数)或 0(x 不是素数);(2)在主函数中输入一个任意整数 y,通过变量值传递的方式将该整数 y 传递到子函数prime(),并根据 prime()的返回值来输出 y 是或不是素数。
【实验 7 7..3 3】 】编写程序,要求主函数自动生成 20 个元素的一维数组,每个元素的值在 50~100 之间(含 50,但不含 100),子函数 mymin()能求一维数组的最大值,并将最大值返回。
【提示】 】产生 50~100 之间的随机数的方法 #include #include #include void main(){ int a[20];…… srand((unsigned)time(NULL));//srand()按时间产生不同的随机数种子 …… a[i]=50+50*rand()/32767;//rand()产生 0~32767 之间的随机整数 …… } 其中,srand()和 rand()定义在头文件 stdlib.h 中,time()定义在头文件 time.h 中。
# include # include # include int maxvalue(int a[20]){ int i;for(i=1;i<20;i++)if(a[0]maxvalue(b);printf("n%dn",b[0]);} 【实验 7 7..4 4】 】编制程序,子函数 trans()的功能是将一个 n×n 的二维数组转置(即将二维数组的列变成行,行变成列),主函数用来输入二维数组元素的值,接收子函数传递过来的转置后的数组,并打印出来。
【提示】 】数组的行数和列数用宏定义确定,函数间用数组名进行参数传递。
【实验 7 7..5 5 】请编制程序,功能是从键盘输入一组数,用二分法查找指定的数是否在这一组数中。要求在 main()中输入原始数据和待查数,search()用来进行二分查找,main()先调用数据排序函数 sort(),再调用二分查找函数 search()。
【指导 】二分查找算法(也称作“折半查找”)用于有序数据的查询。它要求待查询数据是有序的,且与数据的排序顺序有关。因此,该算法与排序程序配合使用。算法思路如下:
先将整个数组(存放待查询数据)作为搜索区间,取该区间的中点,看其是否为待查询数。若是,查找结束;否则,检查待查询数是在搜索区间的上半部分还是下半部分,从而将搜索区间压缩一半,继续采用折半查找的方法。当搜索区间的上界和下界重合时,用仍未找到待查询数,可判定为待查询数不在原始数据中。
【参考程序 】 #include #include int search(int a[], int n, int key)//a 为待查数组,n 为原始数据的个数,key 位待查的关键字 { int low, high, mid;low=0;high=n-1;mid=(low+high)/2;while(lowa[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;} }
void main(){ int a[20], i, n, k, x;printf("请输入数据数量(1~20 之间)n");scanf("%d", &n);if(n>20 || n<0){ printf("数据数量大于 0 或小于等于 20n");exit(1);} printf("请输入数据n");for(i=0;i【提示 】(1)使用二维字符数组存放多个字符串。数组行下标代表每个字符串的首地址。
(2)读入字符串时可使用 gets()函数,scanf()函数遇空格结束。
(3)对字符串的操作可使用字符串处理函数,要在程序开头使用#include命令。
【实验 7 7..7 7 】编一个程序,用递归方法求 Cnm。
【指导】算法分析:
Cnm 的递归定义为:
【参考程序】 int cmn(int m, int n){ if(n==0)return 1;else if(n==1)1 n=0 m n=1 Cn mm n>2m Cnm 1 +C11nm 其他 Cnm =
return m;else if(n>m/2)return cmn(m,m-n);else return cmn(m-1,n)+cmn(m-1,n-1);} void main(){ int m,n;scanf("%d%d",&m,&n);printf("m=%d,n=%d,cmn=%dn",m,n,cmn(m,n));} 【实验 7 7..8 8 】请编制递归程序计算 s n =1+2+3+……+n。
【提示】 】 ① 所给累加和问题的递归数学模型为:
0(n=0)s n = 1(n=1)s1 n+ n(n>1)② 递归函数 s()的形式参数为 n,接收主函数指定的累加和的上界值,其返回值即为累加和。
#include "stdio.h" int fun(int num){int sum;if(num==1)sum=1;else sum=num+fun(num-1);return sum;} void main(){ int n,s;printf("n=");scanf("%d",&n);s=fun(n);printf("s=%dn",s);}
实验,7
vb实验7
实验专练7
2012年中考物理实验电学实验专题复习7
数据结构实验