一、函数的定义
1.函数定义的语法形式
数据类型 函数名(形式参数表)
{
函数体 //执行语句
}
*说明:
*函数的数据类型是函数的返回值类型(若数据类型为void,则无返回值)
*函数名是标识符,一个程序中除了主函数名必须为main外,其余函数的名字按照标识符的取名规则可以任意选取
*形式参数表可以是空的,也可以有多个形参,形参间用逗号隔开,不管有无参数,函数名后的圆括号都必须有。形参必须有类 型说明,形参可以是变量名、数组名或指针名,它的作用是实现主调函数与被调函数之间的关系
*函数中最外层一对花括号“{ }”括起来的若干个说明语句和执行语句组成了一个函数的函数体。由函数体内的语句决定该函数功能。函数体实际上是一个复合语句,它可以没有任何类型说明,而只有语句,也可以两者都没有
*函数不允许嵌套定义。在一个函数内定义另一个函数是非法的,但是允许嵌套使用
例:定义一个函数,返回两个数中的较大值。
int max(int x,int y)
{
return x>y? x:y;
}
二、函数的声明和调用
1.函数的声明
在主调函数中或所有函数定义之前,按如下形式声明:
类型说明符 被调函数名(含类型说明的形参表);
下面对js()函数原型声明是合法的
int js(int n);
也可以:
int js(int);
2.函数的调用
声明了函数原型之后,便可以按如下形式调用函数:
函数名(实参列表);
实参列表中应给出与函数原型形参个数相同、类型相符的实参
3.函数的返回值
在组成函数体的各类语句中,值得注意的是返回语句return。它的一般形式是:
return(表达式);
其功能是把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数的返回
三、函数的传值调用
1.传值调用
这种调用方式是将实参的数据值传递给形参。在被调用函数中,形参值可以改变,但不影响主调函数的实参值
例:
#include<iostream>
using namespace std;
void swap(int a,int b)
{
int tmp=a;a=b;b=tmp;
}
int main()
{
int c=1,d=2;
swap(c,d);
cout<<c<<' '<<d<<endl;
return 0;
} //程序输出为:1 2
2.传址调用
这种调用方式是将实参变量的地址值传递给形参,这时形参是指针,即将形参的指针指向实参地址
例:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int tmp=a;a=b;b=tmp;
}
int main()
{
int c=1,d=2;
swap(c,d);
cout<<c<<' '<<d<<endl;
return 0;
} //程序输出为:2 1
四、函数的应用举例
例1:计算组合数C(m,n)的值(n<=m<=10)
#include<cstdio>
using namespace std;
int fac(int x);
int main()
{
int m,n;
scanf("%d%d",&m,&n);
printf("%d",fac(m)/(fac(m-n)*fac(n)));
}
int fac(int x)
{
int s=1;
for(int i=1;i<=x;i++)
s*=i;
return s;
}
例2:输入两个正整数,输出两个数的最小公倍数
#include<bits/stdc++.h>
using namespace std;
int x,y;
int gcd(int,int);
int bei();
int main()
{
cin>>x>>y;
if(x<y) swap(x,y);
cout<<bei();
return 0;
}
int gcd(int x,int y)
{
int r;
r=x%y;
while(r!=0)
{
x=y;
y=r;
r=x%y;
}
return y;
}
int bei()
{
return x*y/gcd(x,y);
}
*学习心得:
学习了函数部分,我逐渐感觉我可以像一个真正的程序员一样编程,但还有很多需要注意的地方,比如要足够细心,不漏掉任何一个关键的小细节。同时要有大局观,在编程之前先在心里设计好一个大致方案,才不会茫然不知所措。