实验五 函数(一)
1.实验学时
2 学时
2.实验目的
- 熟练掌握函数的定义和调用。
- 掌握使用函数编写程序。
- 掌握函数的实参、形参和返回值的概念及使用。
- 掌握单步调试进入函数和跳出函数的方法。
3.实验设备
PC 计算机,Windows7 或 Windows10 操作系统,Office2010 及以上版本,
Dev-C++5.11 及以上版本或 Code Blocks16.01 及以上版本。
4.实验内容
1.程序调试
统计各位数字之和是 5 的数:统计 100~999 之间有多少个其各位数字之和
是
5 的整数,并计算这些整数的和。要求定义并调用函数 is(number)判断 number
的各个数字之和是否等于 5。
源程序(有错误)
#include<stdio.h>
int is(int number);
int main()
{
int count, i, sum;
count=0;
sum=0;
for(i=100;i<=999;i++){ if(is(i)=1)
{
count++;
sum=sum+i;
}
}
printf("count= %d, sum= %d \n", count, sum);
return 0;
}
/判断一个三位数各位数字之和是否等于 5 的函数/
int is(int number)
{
int a, b, c, result, sum;
a=number/100;
b=(number/10)/10;
c=number%10;
sum=a+b+c; if
if(sum==5)
{
result=1;
}
else
{
result=0;
}
}
修改后的代码如下:
#include<stdio.h>
int is(int number);
int main()
{
int count,i,sum;
count=0;
sum=0;
for(i=100;i<=500;i++)
{
if(is(i))
{
count++;
sum=sum+i;}
}
printf("count= %d, sum= %d \n", count, sum);
return 0;
}
int is(int number)
{
int a,b,c,result,sum;
a=number/100;
b=(number/10)%10;
c=number%10;
sum=a+b+c; if
if(sum==5)
{
return 1;
}
else
{
return 0;
}
}
程序运行结果如图 1 所示:
图一
2.基础编程
(1)采用穷举法,用函数编程实现计算两个正整数的最小公倍数(Least
Common Multiple, LCM)的函数,在主函数中调用该函数计算并输出从键盘输入
的两个整数的最小公倍数。
编程提示:可以从正整数 a 和 b 的公倍数中寻找其最小公倍数。首先,从
a 的倍数中寻找 b 的倍数(或从 b 的倍数中寻找 a 的倍数),由于 b x a 一定是
a 和 b 的公倍数,故寻找 a 和 b 公倍数的范围不会超过 b x a。其次,在所有 a 的倍数 a,2 x a,3 x a,4 x a,…,b x a 中,从小到大依次判断是否是 b 的倍数,
a 的倍数中第一个是 b 的倍数的数必然是 a 和 b 的最小公倍数。
代码如下:
#include<stdio.h>
int multiple(int m,int n);//找最小公倍数函数
int multiple(int m,int n)
{
int i;
if(m==n)
return m;
if(m<n)
{
for(i=m;;i++)
{
if(i%m==0&&i%n==0)
return i;
}
}
if(m>n)
{
for(i=n;;i++)
{
if(i%m==0&&i%n==0)
return i;
}
}
}
int main()
{
int m,n;
printf("please input m and n:");
scanf("%d %d",&m,&n);
printf("%d",multiple(m,n));
return 0;
}
程序运行结果如图二所示:
图二
(2)两个整数的最大公约数(Greast Common Divisor, GCD)是能够整除这两
个整数的最大整数。计算最大公约数常用的算法是欧几里得算法,算法描述如下:
对整数 a 和 b 连续进行求余运算,直到余数为 0 为止,此时非零的除数就是最
大公约数。假设 r=a mod b,表示 a 除以 b 的余数,若 r≠0,则将 b 作为新的
a, r 作为新的 b,重复 a mod b 运算,直到 r=0,此时 b 即为所求的最大公约
数。
请分别使用递归和不使用递归两种方法实现编写求两数最大公约数的函数。
代码如下:(递归)
#include<stdio.h>
int gcd(int m,int n);
int gcd(int m,int n)
{
return n%m==0?m:gcd(n%m,m);
}
int main()
{
int m,n;
scanf("%d,%d",&m,&n);
printf("%d",gcd(m,n)); return 0;
}
(不递归)
#include<stdio.h>
int gcd(int ,int );
int gcd(int a,int b)
{
int r;
while(a%b!=0)
{
r=b;
b=a%b;
a=r;
}
return b;
}
int main()
{
int m,n;
scanf("%d,%d",&m,&n);
printf("%d",gcd(m,n));
return 0;
}
两者运行结果如图三所示:
图三
(3)最小公倍数问题:对于给定的正整数 a 和 b,如果用 gcd(a, b)表示其最
大公约,则其最小公倍数可用下列公式计算: a*b/gcd(a,b)。
试编写程序,对用户输入的两个整数,采用上述方法计算两个整数的最小公
倍数,要求,在主函数中完成数据的输入输出和函数调用,编写采用上述公式的
求最小公倍数的函数 LCM(),在函数中调用(2)中编写的最大公约数函数。
代码如下:
#include<stdio.h>
int gcd(int ,int );
int gcd(int a,int b)
{
int r;
while(a%b!=0)
{
r=b;
b=a%b;
a=r;
}
return b;
}
int lcm(int ,int );
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int main()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d",lcm(m,n));
return 0;
}
程序运行结果如图四所示:
图四
(4)素数探求素数(Prime Number),又称质数,是不能被 1 和它本身之
外的其他整数整
除的正整数。按照这个定义,负数,0, 1 都不是素数。
采用试商法判断素数,用 i=2~m-1 之间的整数去试商,若存在某个 m 能被 1 和
m 本身以外的整数 i 整除(余数为 0),则 m 不是素数;若上述范围内的每个整
数都不能整除 m,则 m 是素数。
试采用试商法,编写判断素数的函数 isPrime(),从键盘任意输入一个整数,
判断 m 是否是素数,若 m 是素数,输出“%d is a prime number \n”,否则输出
“%d is not a prime number \n”。代码如下:
#include<stdio.h>
#include<math.h>
int isprime(int x);
int isprime(int x)
{
int i;
if(x<=1)
return 0;
for(i=2;i<=x/2-1;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main()
{
int m;
printf("please input a number:");
scanf("%d",&m);
if(isprime(m))
{
printf("%d is a prime number \n",m);
}
else
printf("%d is not a prime number \n",m);
return 0;
}
程序运行结果图五所示:
图五
2)数学上已经证明,不能被 2~
(取整)之间的数整除的数一定是素
数。是采用该方法编写素数判断函数 isPrime(),从键盘任意输入一个整数,判
断 m 是否是素数,若 m 是素数,输出“%d is a prime number \n”,否则输出
“%d is not a prime number \n”。程序代码如下:
#include<stdio.h>
#include<math.h>
int isprime(int x);
int isprime(int x)
{
int i; if(x<=1) return 0;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)return 0;
}
return 1;
}
int main()
{
int m;
printf("please input a number:");
scanf("%d",&m);
if(isprime(m))
{
printf("%d is a prime number \n",m);
}
else
printf("%d is not a prime number \n",m);
return 0;
}
程序运行结果如图六所示:
图六
3)从键盘输入一个整数 n,编写程序计算 1~n 之间的所有素数的和。
程序代码如下:
#include<stdio.h>
#include<math.h>
int isprime(int x);
int isprime(int x)
{
int i;
if(x<=1)
return 0;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return 0;
}
return 1;
}
int main()
{
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
if(isprime(i))
sum+=i;
}
printf("%d",sum);
return 0;
}
程序运行结果如图七:
图七