一、实验项目名称函数二、实验目的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<n和m=n 的情况作分别处理后调用函数combinNum(m,n),在主函数内输出结果值。
(2)对m>n、m<n和m=n 的情况各取一组数据进行测试,检查程序的正确性。
(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<stdio.h>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);elseprintf("%d is prime",num);}int PrimeNum(int num){int n,m;if (num==1)/*1不是素数*/m=0;else{for (n=2;n<num;++n)if (num%n==0)break;/*若能被整除,说明不是素数,停止循环*/ if (n>=num)m=num;elsem=0;}return (m);/*返回m*/}二、#include <stdio.h>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<stdio.h>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;elsec=0;return c;}四、#include <stdio.h>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<n || m<0 || n<0)/*判断输入的两个数是否符合数学要求*/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”,将主程序保存为main.cpp,被调用程序保存为user.cpp,在命令提示符中先后输入cl user.cpp /c、cl main.cpp /c、link main.obj user.obj,得到程序main.exe。
五#include <stdio.h>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 <stdio.h>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.小结函数的定义及调用方法;答:函数的定义的一般形式为:类型标识符函数名(形式参数表列){声明部分语句部分}函数的调用很灵活,可以由主函数点用其他函数,其他函数也可以互相调用,要调用函数必须要先声明“类型标识符函数名();”然后才能调用。