函数
一、函数的引入及定义
在程序中,有一些重复操作的模块,我们在编程时对这些模块进行“封装”,这个封装就是函数。
函数的定义
返回值类型 函数名称(参数表)
{
函数的内容
return 返回值 ; //把函数运算的结果回送给主调函数
}
int max(int x,int y)
{
return x>y?x:y;
}
函数的形式
无参函数
无参函数顾名思义即为没有参数传递的函数,无参函数一般不需要带回函数值,所以函数类型说明为void。如void fun()
有参函数
有参函数即有参数传递的函数,一般需要带回函数值。
例:int fun(int x,int y)函数
空函数
空函数即函数体只有一对花括号,花括号内没有任何语句的函数。空函数不完成什么工作,只占据一个位置。在大型程序设计中,空函数用于扩充函数功能。
fun ()
{ }
介绍在线IDE平台
lightly.teamcode.com
二、函数的声明及调用
#include<iostream>
using namespace std;
int js(int n){
int i,item=1;
for(i =1 ;i<=n;i++) item*=i;
cout<<i-1<<"!="<<item<<endl;return item;
}
int main()
{
int i,sum=0;
for(i=1;i<=10;i++){
sum+=js(i);
}
cout<<"sum="<<sum<<endl;
return 0;
}
函数的调用
函数的调用步骤为:
- 在主调函数中调用功能函数js(i)
- 主调函数暂停执行;
- 将主调函数中的实参传递给功能函数的形参;
- 功能函数利用传入的形参值进行计算,并返回计算结果,给主调函数。
- 主调函数得到返回结果后,恢复执行。
参数的传递
参数传递:实参->形参 单向传递
在参数传递过程中,实参把值复制给形参。
形参和实参一一对应:数量一致,类型一致,顺序一致。
形参:变量,用于接受实参传统过和的值。
实参:常量、变量或表达式。
三、函数的值传递
- 传值调用
将实参的数据值传递给形参,即将实参值拷贝一个副本存放在被调用函数的栈区中。在被调用函数中,形参值可以改变,但不影响主调函数的实参值。参数传递方向只是从实参到形参,简称单向值传递。 - 传址调用
将实参变量的地址值传递给形参,这时形参实际是指针,即让形参的指针指向实参地址,这里不再是将实参拷贝一个副本给形参,而是将实参的地址拷贝给形参,即让形参直接指向实参,这就提供了一种利用被调函数的形参改变主调函数实参变量的值的方法。
例3 swap1()是否能实现主调函数参数a、b的交换
…
swap1(a,b);
……
void swap1(int x,int y){
int t;
t = x;
x = y;
y = t;
}
void swap2(int &x,int &y){
int t;
t = x;
x = y;
y = t;
}
例4 冒泡法对数组元素按小到大排序
思路:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。
表中红色部分是待排元素
四 、全局变量与局部变量
局部变量
在函数内定义的变量(包括形参)
作用范围:本函数内部
全局变量
在函数以外定义的变量,不从属于任一函数。
作用范围:从定义处到源文件结束(包括各函数)
int x,y;
int main()
{
}
注意:一个局部变量和一个全避变量是可以重名的,在相同的作用域内局部变量有效时全局变量无效。即局部变量可以屏蔽全局变量。
例 6,输入两个正整数,编程计算两个数的最小公倍数。
求解:
- 输入2个正整数x,y
- 求出最大公约数gcd(x,y)
- 通过2个数的乘积除以最大公约数求最小公倍数,x*y/gcd(x,y)
#include<iostream>
using namespace std;
int gcd(int x,int y);//最大公约数
int lcm();//求最小公倍数
int main(){
cin>>x>>y;
cout<<lcm()<<"是最小公倍数"<<endl;
return 0
}
int lcm(){return x*y/gcd(x,y)}
int gcd(int x,int y){
int r=x%y;
while(r!=0){
y=x;
y=r;
r=x%y;
}
cout<<"最大公约数为"<<y<<endl;
}
五、函数的综合应用
例:编程输入十进制数,输出它对应的二进制、八进制、十六进制数。
略