初识c++中的函数
c++中的函数(模块化编程)
c++中的函数有两类,一类为标准函数,既c++定义好的函数,如我们可以使用getline()函数输入字符串等;
一类是自定义函数,要根据实际需要定义。总体上来说函数就是为了提高代码的重复使用。不能每一次用都用重复写一次代码。如
我们要计算平面上两个点的曼哈顿距离,(x1,y1)和(x2,y2)的曼哈顿距离为|x1-x2|+|y1-y2|
正常的写法就是:
#include<iostream> using namespace std; int main() { double x1,y1,x2,y2; double dx,dy; cin>>x1>>y1>>x2>>y2; if(x1>x2) //计算|x1-x2| dx=x1-x2; else dx=x2-x1; if(y1>y2) dy=y1-y2; else dy=y2-y1; cout<<dx+dy<<endl; retrun 0; }
这仅仅是个简单的问题,我们并不希望在写代码的时候做重复的工作,而且也不希望main()中有太多的代码,要进可能的减少main()中的代码
所以我们修改了以上的程序:
#include<iostream> using namespace std; double abs(double x) { if(x>0) return x; else return -x; } int main() { double x1,y1,x2,y2; double dx,dy; cin>>x1>>y1>>x2>>y2; dx=abs(x1-x2); dy=abs(y1-y2); cout<<dx+dy<<endl; return 0; }
其中double abs(double x)是我们自定义的用来求绝对值的函数,函数定义的语法为:
返回类型 函数名(参数列表)
{
函数体
}
1、返回类型可以是我们之前学过的各种类型,如int double char等,但是函数体内必须返回一个同类型的值;返回类型也可以是void表示不需要返回类型
2、函数名是标识符,一个程序除了主函数名必须为main外,其他的函数都必须按照标识符的命名规则命名。
函数的形式:无参数函数,有参数函数和空函数,空函数主要用来以后拓展程序所用,没有具体的工作。
函数的声明和调用
自定义函数必须要在main函数前面声明我们才能够使用,如前面求绝对值的函数abs。但是实际上我们并不希望main函数前面有太多的函数,我们希望把函数放在main函数的后面,如果把前面程序中abs函数放在main函数后面,调试时会提示找不到abs函数,这也就是说函数要“先有后用”,所以为了解决这个问题,我们只要把abs函数的声明放在main函数前,其函数体的定义放在main函数后即可。
#include<iostream> using namespace std; double abs(double x); //函数的声明,其中x可有可无 int main() { double x1,y1,x2,y2; double dx,dy; cin>>x1>>y1>>x2>>y2; dx=abs(x1-x2); // 函数调用 dy=abs(y1-y2); cout<<dx+dy<<endl; return 0; } double abs(double x) { if(x>0) return x; else return -x; }
函数的调用要遵循参数类型一致性原则,既传递给函数的值要和自定函数的参数的类型一致。如上面的函数调用x1-x2的类型是double 和abs函数参数的类型double一致。
利用函数对数组进行排序
#include<iostream> using namespace std; void px(int x[],int n); //排序 ,要把数组和数组元素的个数传进去 int main() { int a[]={3,2,8,10,1,12 ,18,50,6,9,45}; int n=sizeof(a)/sizeof(int);// 数组元素的个数 px(a,n);// 为什么是a而不是a[n]?实际上a是数组a[n]的地址 for(int i=0;i<n;i++) cout<<a[i]<<" "; return 0; } void px(int x[],int n) { int temp; for(int i=0;i<n-1;i++) { for(int j=i+1;j<n;j++) { if(x[i]>x[j]) { temp=x[i]; x[i]=x[j]; x[j]=temp; } } } }