admin 管理员组文章数量: 1184232
2024年1月10日发(作者:load ssl error是什么意思)
一、 实验项目名称
函数
二、 实验目的
1.掌握C函数的定义方法、函数的调用方法、参数说明以及返回值。掌握实参与形参的对应关系以及参数之间的“值传递”的方式;掌握函数的嵌套调用及递归调用的设计方法;
2.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法;
3.在编程过程中加深理解函数调用的程序设计思想。
三、实验内容
1.多模块的程序设计与调试的方法;
2.函数的定义和调用的方法;
3.用递归方法进行程序设计。
具体内容:
1.编写一个函数primeNum(int num),它的功能是判别一个数是否为素数。如果num是素数,返回该数;否则返回0值。
要求:
(1)在主函数输入一个整数num,调用该函数后,输出num是否是素数的信息。输出格式为:num is prime或num is not prime。
(2)分别输入以下数据:0,1,2,5,9,13,59,121,运行程序并检查结果是否正确。
2.编写函数computNum( int num),它的功能是计算任意输入的一个正整数的各位数字之和,结果由函数返回(例如:输入数据是123,返回值为6)。
要求: num由主函数输入,调用该函数后,在主函数内输出结果。
3.编写函数,mulNum(int a,int b),它的功能是用来确定a和b是否是整数倍的关系。如果a是b的整数倍,则函数返回值为1,否则函数返回值为0。
要求:
(1)在主函数中输入一对数据a和b,调用该函数后,输出结果并加以相应的说明。例如:在主函数中输入:10,5 ,则输出:10 is multiple of 5.
(2)分别输入下面几组数据进行函数的正确性测试:1与5、5与5、6与2、6与4、20与4、 37与9等,并对测试信息加以说明。
4.编写一个计算组合数的函数combinNum(int m,int n)。计算结果由函数返回。
计算组合数的公式是:
c(m,n)=m!/(n!*(m-n)!)
要求:
(1)从主函数输入m和n的值。对m>n、m (2)对m>n、m (3)修改程序,把两个函数分别放在两个程序文件中,作为两个文件进行编译、链接和运行。 5.整数a,b的最大公约数是指既能被a整除又能被b整除的最大整数。整数a,b的最小公倍数是指既是a的倍数又是b的倍数的最小整数。编写两个函数,一个函数gcd()的功能是求两个整数的最大公约数,另一个函数mul()的功能是求两个整数的最小公倍数。 要求: (1)两个整数在主函数中输入,并在主函数中输出求得的最大公约数和最小公倍数。 (2)首先将两个整数a和b作为实参传递给函数gcd(),求出的最大公约数后,由函数gcd()带值返回主函数,然后将最大公约数与两个整数a、b一起作为实参传递给函数mul(),以此求出最小公倍数,再由函数mul()带值返回主函数。 (3)修改函数gcd(),函数gcd()采用递归调用的编写方法,两个整数a和b的最大公约数的递归公式是: 如果b=0,那么gcd(a,b)=x,否则gcd(a,b)= gcd(b,a%b)。 然后将最大公约数与两个整数a、b一起传递给函数mul(),求出最小公倍数,再由函数mul()将最小公倍数返回主函数。 (4)修改程序,采用全局变量的处理方法,将最大公约数和最小公倍数都设为全局变量,分别用函数gcd()和函数mul()求最大公约数和最小公倍数,但其值不是由函数返回,而是通过全局变量在函数之间传递的特性将结果反映在主函数中。 四、实验步骤及结果 打开编程软件,分别写入以下代码: 一、 #include int PrimeNum(int num);/*声明判断函数*/ void main() { int i,num; printf("Please input num: "); scanf("%d",&num); i=PrimeNum(num);/*调用判断函数*/ if (i==0) printf("%d is not prime",num); else printf("%d is prime",num); } int PrimeNum(int num) { int n,m; if (num==1)/*1不是素数*/ m=0; } else{ for (n=2;n if (num%n==0) break;/*若能被整除,说明不是素数,停止循环*/ if (n>=num) m=num; else m=0;} return (m);/*返回m*/ 二、 #include int computNum(int num);/*声明函数*/ void main() { int num,n; printf("请输入不多于10位的整数:"); scanf("%d",&num); n=computNum(num);/*调用函数*/ printf("%d",n); } int computNum(int num) { int n,j; n=1;j=0; for (n=1;n<11;++n) } { j=j+num%10;/*将数的每一位数加到j上*/ num=num/10; } return j;/*直接返回j*/ 三、 #include int mulNum(int a,int b);/*声明函数*/ void main() { int a,b,c; printf("Please input a and b:n"); scanf("%d,%d",&a,&b); c=mulNum(a,b);/*调用函数*/ if (b>a)/*大的数是小的数的倍数,所以要判断两个数的大小*/ { c=b; b=a; a=c; } if (c==1)/*两数是倍数关系*/ printf("%d is multiple of %d",a,b); else/*不成倍数关系*/ printf("%d is not multiple of %d",a,b); } int mulNum(int a,int b) { int c; if (a%b==0 || b%a==0)/*判断是否能被整除*/ c=1; else c=0; return c; } 四、 #include int combinNum(int m,int n);/*声明函数*/ void main() { int m,n,c; printf("Please input m and n: "); scanf("%d,%d",&m,&n);/*输入两个数*/ if (m printf("Math error!n"m" cannot smaller than "n"!n"m" or "n" can`t smaller than 0!"); else { c=combinNum(m,n);/*调用函数*/ printf("c(m,n)=m!/(n!*(m-n)!)=%d",c); } } int combinNum(int m,int n) { int accmulNum(int m);/*声明阶乘函数*/ int i,j,k,h; i=accmulNum(m);/*调用阶乘函数*/ j=accmulNum(n); k=accmulNum(m-n); h=i/(j*k); return h; } int accmulNum(int m)/*求数的阶乘的函数*/ { } int i,j; j=1; for (i=1;i<=m;++i) j=j*i; return j; 修改方案: 在文件目录下创建头文件user.h,头文件内有如下内容: int combinNum(int a,int b); int accmulNum(int a); 在主程序预处理中加入#include”use.h”,将主程序保存为,被调用程序保存为,在命令提示符中先后输入cl /c、cl /c、link ,得到程序。 五 #include int gcd(int a,int b);/*声明求公约数函数*/ int mul(int a,int b);/*声明公倍数函数*/ void main() { int a,b,c,d; printf("请输入a,b:n"); scanf("%d,%d",&a,&b); c=gcd(a,b);/*调用公约数函数*/ d=mul(a,b);/*调用公倍数函数*/ printf("最大公约数是:%d,最小公倍数是:%d",c,d); } int gcd(int a,int b)/*公约数函数*/ { int i,j,k; j= (a>b)? b:a; for (i=j;i>=1;--i) { if (a%i==0 && b%i==0) { k=i;break;/*第一次出现能同时被ab整除的是最小公约数*/ } } return k; } int mul(int a,int b) { int gcd(int a,int b);/*调用公约数函数*/ int h,k; k=gcd(a,b); h=a*b/k;/*公约数和公倍数的数学关系*/ return h; } 使用递归调用修改方案: 将函数int gcd(int a,int b)的定义改为: int gcd(int a,int b) { int c,i; for (;b!=0;) { i=a; a=b; b=i%b; c=gcd(a,b); } if(b==0) c=a; return c; } 采用全局变量修改方案 #include int k=0,h=0; int gcd(int a,int b); int mul(int a,int b); void main() { int a,b,c,d; scanf("%d,%d",&a,&b); gcd(a,b); mul(a,b); printf("最大公约数是:%d,最小公倍数是:%d",k,h); } int gcd(int a,int b) { int i,j; j= (a>b)? b:a; for (i=j;i>=1;--i) { if (a%i==0 && b%i==0) { k=i;break; } } return k; } int mul(int a,int b) { int gcd(int a,int b); k=gcd(a,b); h=a*b/k; return h; } 五、思考题或实验感想 1.小结函数的定义及调用方法; 答:函数的定义的一般形式为: 类型标识符 函数名 (形式参数表列) { } 声明部分 语句部分 函数的调用很灵活,可以由主函数点用其他函数,其他函数也可以互相调用,要调用函数必须要先声明“类型标识符 函数名 ();”然后才能调用。 2.小结函数中形参和实参的结合规则; 答:(1)、在定义函数中指定的形参,在未出现函数调用时,它们不占内存中的存储单元。(2)、实参可以是常量、变量或表达式,在调用时将实参的值赋给形参。(3)、在被定义的函数中,必须指定形参的类型。(4)、实参和形参和类型应相同或赋值兼容。(5)、在C语言中,实参向形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。 3.编写和调试包含多模块的程序时,容易出现什么样的错误?根据自己的实践总结一下。 答:容易出现变量的重定义,被定义函数中有未声明的标识符,函数返回值的类型和函数类型不对应,几个函数互相调用时未声明。
版权声明:本文标题:C语言程序设计实验报告——函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1704863774a464848.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论