实验4 函数-模块化程序设计
一、实验目的
1.掌握C函数的定义方法、函数的调用方法、参数说明以及返回值。掌握实参与形参的对应关系以及参数之间的“值传递”的方式;掌握函数的嵌套调用及递归调用的设计方法;
2.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法;
3.在编程过程中加深理解函数调用的程序设计思想。
二、实验环境
PC微机
Windows 操作系统
VS 2019 程序集成环境
三、实验内容与步骤
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 的情况各取一组数据进行测试,检查程序的正确性。
代码:
#include <stdio.h>
int fac(int m)
{
int sum = 1;
printf函数返回值 for (int i = m; i >= 1; i--) {
sum *= i;
}
return sum;
}
int combin(int m, int n)
{
int a = fac(m);
int b = fac(n);
int N = fac(m - n);
return a / (b * N );
}
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if (m == n || n == 0) printf("1");
else if (m < n || m < 0 || n < 0) printf("please input right number");
else printf("%d", combin(m, n));
return 0;
}
实验结果:
1m > n:
2m == n:
3m < n:
实验分析:
本题首先要将m和n的所有情况讨论清楚,然后求组合数时在combin函数里嵌套三个求阶乘的函数分别求公式中三个成分的值比递归调用combin函数来求解简单。
5.整数a,b的最大公约数是指既能被a整除又能被b整除的最大整数。整数a,b的最小公倍数是指既是a的倍数又是b的倍数的最小整数。编写两个函数,一个函数gcd()的功能是求两个整数的最大公约数,另一个函数mul()的功能是求两个整数的最小公倍数。
要求:
(1)两个整数在主函数中输入,并在主函数中输出求得的最大公约数和最小公倍数。
代码:
#include <stdio.h>
int main()
{
int n, m, max = 0;
scanf("%d %d", &n, &m);
int N = n > m ? n : m;
for (int i = 1; i <= N; i++) {
if (m % i == 0 && n % i == 0 && i > max) max = i;
}
printf("%d和%d的最大公约数为:%d\n", n, m, max);
printf("%d和%d的最小公倍数为:%d", n, m, max * (n / max) * (m / max));
return 0;
}
实验结果:
(2)首先将两个整数a和b作为实参传递给函数gcd(),求出的最大公约数后,由函数gcd()带值返回主函数,然后将最大公约数与两个整数a、b一起作为实参传递给函数mul(),以此求出最小公倍数,再由函数mul()带值返回主函数。
代码:
#include <stdio.h>
int gcd(int m,int n);
int mul(int a,int b,int c);
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int temp = gcd(m, n);
printf("最大公约数为:%d\n", temp);
int Mul = mul(temp, m, n);
printf("最小公倍数为:%d", Mul);
return 0;
}
int gcd(int m, int n)
{
int N = m < n ? m : n;
int max = 0;
for (int i = 1; i <= N; i++) {
if (m % i == 0 && n % i == 0 && i > max) max = i;
}
return max;
}
int mul(int a, int b, int c)
{
return a * (b / a) * (c / a);
}
实验结果:
(3)修改函数gcd(),函数gcd()采用递归调用的编写方法,两个整数a和b的最大公约数的递归公式是:
如果b=0,那么gcd(a,b)=x,否则gcd(a,b)= gcd(b,a%b)。 然后将最大公约数与两个整数a、b一起传递给函数mul(),求出最小公倍数,再由函数mul()将最小公倍数返回主函数。
代码:
#include <stdio.h>
int gcd(int m, int n);
int mul(int a, int b, int c);
int main()
{
int m, n;
scanf("%d %d", &m, &n);
int Gcd = gcd(m, n);
printf("最大公约数为:%d\n", Gcd);
int Mul = mul(Gcd, m, n);
printf("最小公倍数为:%d", Mul);
return 0;
}
int gcd(int m, int n)
{
return n == 0 ? m : gcd(n, m % n);
}
int mul(int a, int b, int c)
{
return a * (b / a) * (c / a);
}
实验结果:
实验分析:本题在求最大公约数时用到了辗转相除法。
(4)修改程序,采用全局变量的处理方法,将最大公约数和最小公倍数都设为全局变量,
分别用函数gcd()和函数mul()求最大公约数和最小公倍数,但其值不是由函数返回,而是通过全局变量在函数之间传递的特性将结果反映在主函数中。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论