第4章 利用函数实现指定的功能
定义函数注意的几个问题
1 、函数定义在何处?
一个程序中至少有一个函数,main函数。
其他的函数定义与main平行的。不要把函数定义在main内部。
可以在main前也可以在main后。
2、 函数声明在何处?
如果函数的定义在使用前。可以不用声明。(不常用)
如果函数的定义在使用的后面。必须事先声明。两个位置声明。(1)在main前声明所有的函数。(2)在调用的函数中声明被调用的函数。
3 、尽量不在函数中输入输出(求两个数的和)。
不好的示范
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f796abf985cf19a416ceaa79ce213ee9.png)
要计算哪两个数的和由调用者决定。
计算之后的结果,由调用者决定如何使用。
#include< iostream>
using namespace std;
int sum(int a,int b)
{
int c;
c=a+b;
return c;
}
int main()
{
int x,y;
x=20;
y=30;
int z;
z=sum(x,y);
cout<<z<<endl;
return 0;
}
4 、不同的函数中可否使用相同的变量名?(求两个数的和,最大值)。
在不同的函数中定义 同名的变量,互不影响。占据的是不同的内存地址。
5、 实参变量名是必须与形参变量名相同吗?(求两个数的和)
不必
6 、调用一个函数能得到多个结果吗?
不能。调用只能得到一个值。
例题:
1 求两个数之间所有数的和。
1 是否需要返回值 需要 int
2 函数名 sumBetween
3 是否需要参数 需要
4 几个参数 两个参数 int
5 如何编写函数体。 循环
#include < iostream>
using namespace std;
int sum(int a,int b)
{
int c,d,s=0;
if(b>a)
{
c=a;
a=b;
b=c;
}
for(d=b;d<=a;d++)
{
s+=d;
}
return s;
}
int main()
{
int a,b,c;
cin>>a>>b;
c=sum(a,b);
cout<<c<<endl;
system (“pause”);
return 0;
}
写两个函数,求两个正整数的最大公约数和最小公倍数。
1 是否需要返回值 int
2 函数名 gcd (greatest common divisor)
3 参数个数与类型 2个,int
4 函数体 逐个测试,高效
#include
using namespace std;
int main()
{
int m,n;
cout<<“求两个正整数的最大公约数,请输入两个正整数:”<<endl;
cin>>m>>n;
int k;
k=m<n?m:n;
while(k>1)
{
if(m%k= =0 && n%k= =0)
{
break;
}
k–;
}
cout<<m<<“与”<<n<<“的最大公约数是”<<k<<endl;
return 0;
}
#include < iostream>
using namespace std;
int gcd(int x,int y)
{
int k;
k=x<y?x:y;
while(k>1)
{
if(x%k= =0 && y%k= =0)
{
break;
}
k–;
}
return k;
}
int main()
{
int m,n;
cout<<“求两个正整数的最大公约数,请输入两个正整数:”<<endl;
cin>>m>>n;
int k;
k=gcd(m,n);
cout<<m<<“与”<<n<<“的最大公约数是”<<k<<endl;
eturn 0;
}
#include < iostream>
using namespace std;
int gcd(int x,int y)
{
int k;
k=x<y?x:y;
while(k>1)
{
if(x%k0 && y%k0)
{
return k;//在函数中允许出现多条return语句。但只会执行其中一条。
}
k–;
}
return 1;//在函数中允许出现多条return语句。但只会执行其中一条。
}
int main()
{
int m,n;
cout<<“求两个正整数的最大公约数,请输入两个正整数:”<<endl;
cin>>m>>n;
int k;
k=gcd(m,n);
cout<<m<<“与”<<n<<“的最大公约数是”<<k<<endl;
return 0;
}
#include < iostream>
using namespace std;
int gcd(int x,int y)
{
int k;
k=x%y;
while(k!=0) //while(k)
{
x=y;
y=k;
k=x%y;
}
return y;
}
int main()
{
int m,n;
cout<<“求两个正整数的最大公约数,请输入两个正整数:”<<endl;
while(true)// while(1) while(3>1)
{
cin>>m>>n;
if(m>0 && n>0)
break;
cout<<“你输入的不是两个正整数,请重新输入!”<<endl;
}
int k;
k=gcd(m,n);
cout<<m<<“与”<<n<<“的最大公约数是”<<k<<endl;
return 0;
}
如何把在main中实现的功能通过函数的形式来实现。
M N t
12 8 4
8 4 0
5 7 5
7 5 2
5 2 1
2 1 0
如果函数的实现方式改变了。只要函数名没变。参数个数与类型不变。调用函数的方式不变。
(如果一个函数的返回值只有两种结果,一般将返回值类型定义为bool 真true 假 false)(int 真 1 假 0)
判断一个数是否为偶数。
判断一个数是否为水仙花数。(3位数,每位数字立方和等于这个数)
再次体会,为什么不要在函数中输入输出。
#include < iostream>
using namespace std;
bool isDaffodils(int num)
{
int g,s,b;
g=num%10;
s=num/10%10;
b=num/100;
int t=ggg+sss+bbb;
/*
if(t= =num)
return true;
else
return false;
*/
return t= =num;
}
int main()
{
int n;
cout<<“输入一个数判断是否为水仙花数!”<<endl;
cin>>n;
if(isDaffodils(n)) //if(isDaffodils(n)==true)
cout<<n<<“是一个水仙花数!”<<endl;
else
cout<<n<<“不是一个水仙花数!”<<endl;
return 0;
}
#include < iostream>
using namespace std;
bool isDaffodils(int num)
{
int g,s,b;
g=num%10;
s=num/10%10;
b=num/100;
int t=ggg+sss+bbb;
/*
if(t= =num)
return true;
else
return false;
*/
return t= =num;
}
int main()
{
int n;
for(n=100;n<=999;n++)
{
if(isDaffodils(n)) //if(isDaffodils(n)==true)
cout<<n<<endl;
}
return 0;
}
判断一个数是否为完数。(一个数为其所有因子之和)
6 =1+2+3
体会为什么不在函数内输入输出
#include < iostream>
using namespace std;
bool isPerfect(int num)
{
int t=0;
int i;
for(i=1;i<=num/2;i++)
{
if(num%i= =0)
t=t+i;
}
return t= =num;
}
int main()
{
int n;
cout<<“输入一个数判断是否为完数!”<<endl;
cin>>n;
if(isPerfect(n)) //if(isisPerfect(n)==true)
cout<<n<<“是一个完数!”<<endl;
else
cout<<n<<“不是一个完数!”<<endl;
return 0;
}
#include < iostream>
using namespace std;
bool isPerfect(int num)
{
int t=0;
int i;
for(i=1;i<=num/2;i++)
{
if(num%i= =0)
t=t+i;
}
return t= =num;
}
int main()
{
int n;
for(n=1;n<=10000;n++)
{
if(isPerfect(n)) //if(isisPerfect(n)==true)
cout<<n<<endl;
}
return 0;
}
判断一个年份是否为闰年。
判断一个数是否为素数。(从2开始到此数一半,逐个测试是否能整除此数)
isPrime
#include
#include
using namespace std;
bool isPrime(int num)
{
int i;
for(i = 2; i<= sqrt(num); i++)
{
if((num % i) == 0)
return false;
}
return true;
}
int main()
{
int n;
cout<<“输入一个数判断是否为素数!”<<endl;
cin>>n;
if(isPrime(n)) //if(isPrime(n)==true)
cout<<n<<“是一个素数!”<<endl;
else
cout<<n<<“不是一个素数!”<<endl;
return 0;
}