实验7 函数实验
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdlib.h>Baidu Nhomakorabea#include <stdio.h> #include <time.h> void main() { int a[20]; …… srand((unsigned)time(NULL)); …… a[i]=50+50*rand()/32767; …… } //rand()产生 0~32767 之间的随机整数 //srand()按时间产生不同的随机数种子
【实验 7.2】编制程序,在主函数中从键盘输入的一个整数,并调用子函数判断该整数是否 是素数,然后在主函数中输出判断结果。 【提示】 (1)编制一个能判断任意整数 x 是否为素数的子程序 int prime(int x)。该函数的返回 值为 1(x 是素数)或 0(x 不是素数) ; (2)在主函数中输入一个任意整数 y,通过变量值传递的方式将该整数 y 传递到子函数 prime() ,并根据 prime()的返回值来输出 y 是或不是素数。 【实验 7.3】编写程序,要求主函数自动生成 20 个元素的一维数组,每个元素的值在 50~ 100 之间(含 50,但不含 100) ,子函数 mymin()能求一维数组的最大值,并将最大值返回。 【提示】产生 50~100 之间的随机数的方法
【实验 7.6】请编制程序,功能是从键盘输入一组字符串,用二分法查找指定的字符串是否 在这一组字符串中。 【提示】 (1)使用二维字符数组存放多个字符串。数组行下标代表每个字符串的首地址。 (2)读入字符串时可使用 gets()函数,scanf()函数遇空格结束。 (3)对字符串的操作可使用字符串处理函数,要在程序开头使用#include<string.h>命 令。 【实验 7.7】编一个程序,用递归方法求 C m 。 【指导】算法分析: C m 的递归定义为:
函数实验
【实验目的】
1 2 3 4
掌握函数的定义及函数的调用方法。 掌握函数间参数传递和返回值传递的方法。 掌握递归程序设计的方法。 学会使用模块化程序设计方法解决比较复杂的问题。
【实验 7.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<stdio.h> int gcd(int u, int v) { int r; if (u<v) { r=u; u=v; v=r;} r=u%v; while(r!=0) { u=v; v=r; r=u%v; } return v; } int lcm(int u, int v) { return u*v/gcd(u, v); } void main( ) { int x, y; //求 u 和 v 的最小公倍数 //保证 u>v //求 u 除以 v 的余数 //求 u 和 v 的最大公约数,其中,u 为被除数,v 为除数
n n
1 m Cm=
n
n=0 n=1
mn
Cm
n
n>
n 1
m 2
C m 1 +C m 1
其他
【参考程序】 int cmn(int m, int n) { if (n==0) return 1; else if (n==1)
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=%d\n",m,n,cmn(m,n)); } 【实验 7.8】请编制递归程序计算 s n =1+2+3+……+n。 【提示】 ① 所给累加和问题的递归数学模型为: 0 (n=0)
其中,srand()和 rand()定义在头文件 stdlib.h 中,time()定义在头文件 time.h 中。 # include<stdio.h> # include<time.h> # include<stdlib.h> int maxvalue(int a[20]) { int i; for(i=1;i<20;i++) if(a[0]<a[i]) a[0]=a[i]; return a[0]; } void main() { int b[20],j; srand((unsigned)time(NULL)); //srand()按时间产生不同的随机数种子 for(j=0;j<20;j++) b[j]=50+50*rand()/32767; //rand()产生 0~32767 之间的随机整数 for(j=0;j<20;j++) printf("%3d",b[j]);
maxvalue(b); printf("\n%d\n",b[0]); } 【实验 7.4】编制程序,子函数 trans()的功能是将一个 n×n 的二维数组转置(即将二维数 组的列变成行,行变成列) ,主函数用来输入二维数组元素的值,接收子函数传递过来的转 置后的数组,并打印出来。 【提示】数组的行数和列数用宏定义确定,函数间用数组名进行参数传递。 【实验 7.5】请编制程序,功能是从键盘输入一组数,用二分法查找指定的数是否在这一组 数中。要求在 main( )中输入原始数据和待查数,search( )用来进行二分查找,main( )先调用 数据排序函数 sort( ),再调用二分查找函数 search( )。 【指导】二分查找算法(也称作“折半查找” )用于有序数据的查询。它要求待查询数 据是有序的, 且与数据的排序顺序有关。 因此, 该算法与排序程序配合使用。 算法思路如下: 先将整个数组(存放待查询数据)作为搜索区间,取该区间的中点,看其是否为待查询 数。若是,查找结束;否则,检查待查询数是在搜索区间的上半部分还是下半部分,从而将 搜索区间压缩一半,继续采用折半查找的方法。当搜索区间的上界和下界重合时,用仍未找 到待查询数,可判定为待查询数不在原始数据中。 【参考程序】
void main( ) { int a[20], i, n, k, x; printf("请输入数据数量(1~20 之间)\n"); scanf("%d", &n); if(n>20 || n<0) { printf("数据数量大于 0 或小于等于 20\n"); exit(1); } printf("请输入数据\n"); for(i=0;i<n;i++) scanf("%d", &a[i]); printf("请输入查询数据\n"); scanf("%d", &x); bubblesort(a,n); k=search(a,n,x); if(k) printf("has been found\n"); else printf("hasn't been found\n"); }
#include <stdio.h> #include <stdlib.h> int search(int a[], int n, int key) { int low, high, mid; low=0; high=n-1; mid=(low+high)/2; while(low<high && key!=a[mid]) { if (key<a[mid]) high=mid-1; else low=mid+1; mid=(low+high)/2; } if (key==a[mid]) return 1; else return 0; } void bubblesort (int a[ ], int n) { int i, j,t; for(i=0; i<n-1; i++) for(j=0; j<n-1; j++) if(a[j]>a[j+1]) {t=a[j]; a[j]=a[j+1];a[j+1]=t;} } //a 为待查数组,n 为原始数据的个数,key 位待查的关键字
printf(“input x,y:\n”); scanf(“%d%d”,&x, &y); printf(“The gcd of %d and %d is %d\n”,x,y, gcd(x,y)); printf(“The lcm of %d and %d is %d\n”,x,y,lcm(x,y)); }
sn =
1
(n=1) (n>1)
s n 1 +n
② 递归函数 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=%d\n",s); }
【实验 7.2】编制程序,在主函数中从键盘输入的一个整数,并调用子函数判断该整数是否 是素数,然后在主函数中输出判断结果。 【提示】 (1)编制一个能判断任意整数 x 是否为素数的子程序 int prime(int x)。该函数的返回 值为 1(x 是素数)或 0(x 不是素数) ; (2)在主函数中输入一个任意整数 y,通过变量值传递的方式将该整数 y 传递到子函数 prime() ,并根据 prime()的返回值来输出 y 是或不是素数。 【实验 7.3】编写程序,要求主函数自动生成 20 个元素的一维数组,每个元素的值在 50~ 100 之间(含 50,但不含 100) ,子函数 mymin()能求一维数组的最大值,并将最大值返回。 【提示】产生 50~100 之间的随机数的方法
【实验 7.6】请编制程序,功能是从键盘输入一组字符串,用二分法查找指定的字符串是否 在这一组字符串中。 【提示】 (1)使用二维字符数组存放多个字符串。数组行下标代表每个字符串的首地址。 (2)读入字符串时可使用 gets()函数,scanf()函数遇空格结束。 (3)对字符串的操作可使用字符串处理函数,要在程序开头使用#include<string.h>命 令。 【实验 7.7】编一个程序,用递归方法求 C m 。 【指导】算法分析: C m 的递归定义为:
函数实验
【实验目的】
1 2 3 4
掌握函数的定义及函数的调用方法。 掌握函数间参数传递和返回值传递的方法。 掌握递归程序设计的方法。 学会使用模块化程序设计方法解决比较复杂的问题。
【实验 7.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<stdio.h> int gcd(int u, int v) { int r; if (u<v) { r=u; u=v; v=r;} r=u%v; while(r!=0) { u=v; v=r; r=u%v; } return v; } int lcm(int u, int v) { return u*v/gcd(u, v); } void main( ) { int x, y; //求 u 和 v 的最小公倍数 //保证 u>v //求 u 除以 v 的余数 //求 u 和 v 的最大公约数,其中,u 为被除数,v 为除数
n n
1 m Cm=
n
n=0 n=1
mn
Cm
n
n>
n 1
m 2
C m 1 +C m 1
其他
【参考程序】 int cmn(int m, int n) { if (n==0) return 1; else if (n==1)
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=%d\n",m,n,cmn(m,n)); } 【实验 7.8】请编制递归程序计算 s n =1+2+3+……+n。 【提示】 ① 所给累加和问题的递归数学模型为: 0 (n=0)
其中,srand()和 rand()定义在头文件 stdlib.h 中,time()定义在头文件 time.h 中。 # include<stdio.h> # include<time.h> # include<stdlib.h> int maxvalue(int a[20]) { int i; for(i=1;i<20;i++) if(a[0]<a[i]) a[0]=a[i]; return a[0]; } void main() { int b[20],j; srand((unsigned)time(NULL)); //srand()按时间产生不同的随机数种子 for(j=0;j<20;j++) b[j]=50+50*rand()/32767; //rand()产生 0~32767 之间的随机整数 for(j=0;j<20;j++) printf("%3d",b[j]);
maxvalue(b); printf("\n%d\n",b[0]); } 【实验 7.4】编制程序,子函数 trans()的功能是将一个 n×n 的二维数组转置(即将二维数 组的列变成行,行变成列) ,主函数用来输入二维数组元素的值,接收子函数传递过来的转 置后的数组,并打印出来。 【提示】数组的行数和列数用宏定义确定,函数间用数组名进行参数传递。 【实验 7.5】请编制程序,功能是从键盘输入一组数,用二分法查找指定的数是否在这一组 数中。要求在 main( )中输入原始数据和待查数,search( )用来进行二分查找,main( )先调用 数据排序函数 sort( ),再调用二分查找函数 search( )。 【指导】二分查找算法(也称作“折半查找” )用于有序数据的查询。它要求待查询数 据是有序的, 且与数据的排序顺序有关。 因此, 该算法与排序程序配合使用。 算法思路如下: 先将整个数组(存放待查询数据)作为搜索区间,取该区间的中点,看其是否为待查询 数。若是,查找结束;否则,检查待查询数是在搜索区间的上半部分还是下半部分,从而将 搜索区间压缩一半,继续采用折半查找的方法。当搜索区间的上界和下界重合时,用仍未找 到待查询数,可判定为待查询数不在原始数据中。 【参考程序】
void main( ) { int a[20], i, n, k, x; printf("请输入数据数量(1~20 之间)\n"); scanf("%d", &n); if(n>20 || n<0) { printf("数据数量大于 0 或小于等于 20\n"); exit(1); } printf("请输入数据\n"); for(i=0;i<n;i++) scanf("%d", &a[i]); printf("请输入查询数据\n"); scanf("%d", &x); bubblesort(a,n); k=search(a,n,x); if(k) printf("has been found\n"); else printf("hasn't been found\n"); }
#include <stdio.h> #include <stdlib.h> int search(int a[], int n, int key) { int low, high, mid; low=0; high=n-1; mid=(low+high)/2; while(low<high && key!=a[mid]) { if (key<a[mid]) high=mid-1; else low=mid+1; mid=(low+high)/2; } if (key==a[mid]) return 1; else return 0; } void bubblesort (int a[ ], int n) { int i, j,t; for(i=0; i<n-1; i++) for(j=0; j<n-1; j++) if(a[j]>a[j+1]) {t=a[j]; a[j]=a[j+1];a[j+1]=t;} } //a 为待查数组,n 为原始数据的个数,key 位待查的关键字
printf(“input x,y:\n”); scanf(“%d%d”,&x, &y); printf(“The gcd of %d and %d is %d\n”,x,y, gcd(x,y)); printf(“The lcm of %d and %d is %d\n”,x,y,lcm(x,y)); }
sn =
1
(n=1) (n>1)
s n 1 +n
② 递归函数 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=%d\n",s); }