C/C++中有很多可以直接调用的内置函数,例如math头文件中提供的\(pow\)、\(sqrt\)、\(abs\)等数学函数,又例如stdio头文件中提供的格式化输入输出函数\(scanf\)和\(printf\)。所谓内置函数,可以理解为编程语言已经定义好的“工具”,我们先引入函数所在的头文件,然后就可以按照“工具的使用规则”调用函数。
使用内置函数时,需要先引入函数所在的头文件(函数在这个头文件里被定义)否则会出现编译错误:
#include<iostream> #include<cmath> //使用pow、sqrt等数学函数,需要引入cmath头文件 using namespace std; int main() { cout<<pow(60,2)<<endl; cout<<sqrt(9)<<endl; return 0; }
#include<iostream> #include<cstring> //使用字符串函数,引入cstring头文件 using namespace std; int main() { char str[] = "Hello World"; cout<<strlen(str)<<endl; cout<<str<<endl; return 0; }
#include<iostream> #include<algorithm> //使用sort函数排序,需要引入算法库algorithm头文件 using namespace std; int main() { int a[10] = {1,5,9,0,2,4,8,3,7,6}; sort(a,a+10); //sort函数用于排序 for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
如果我们要使用很多函数(或者后面介绍的STL中的容器、算法等),那么很可能要引入大量的头文件,有些头文件的名称还很复杂不好记忆,这个时候要全部记住这些头文件也是一件痛苦的事情啊。好在我们可以使用一个“万能”头文件来避免这样尴尬的局面:#include<bits/stdc++.h>
#include<bits/stdc++.h> //引入万能头文件 using namespace std; int main() { cout<<max(123,456)<<endl; cout<<log(exp(1))<<endl; char str[] = "Hello World"; cout<<strlen(str)<<endl; cout<<str<<endl; int a[10] = {1,5,9,0,2,4,8,3,7,6}; sort(a,a+10); //sort函数用于排序 for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; return 0; }
关于万能头文件(
#include<bits/stdc++.h>
)的使用需要强调的是,在使用前需要确定编程环境或者竞赛测试环境是否允许使用(在洛谷平台可以放心使用,目前NOI系列比赛也能使用)。使用万能头文件可能会有一些潜在的隐患,例如自己使用的某个变量在万能头文件涉及的头文件中已经被定义了,那么会出现编译错误(变量命名冲突),所以要确保自己编写的程序能够在测评环境编译通过的情况下谨慎使用万能头文件,例如竞赛时进入NOI提供的官方虚拟机测试编写的程序。
函数就像一个工具,能够完成特定的功能。函数也像一个“黑盒”,按照函数的使用规则去调用函数,一般需要提供函数计算的对象(称之为参数),函数处理结束后,可能会返回一个计算结果(例如math库中的pow
、sqrt
函数),也可能没有返回值但对参数进行了处理(例如swap
函数,语句swap(a,b)
执行后变量a、b的值会交换,这里swap
函数内部就修改了参数a、b
的值)。
#include<iostream> #include<cmath> using namespace std; int main() { double x,y; cin>>x>>y; cout<<x<<" "<<y<<endl; cout<<pow(x,y)<<endl; //调用pow函数,函数返回\(x^y\)的结果并被cout输出 cout<<x<<" "<<y<<endl; //调用函数pow后,变量x,y的值不会发生变化 return 0; }
#include<iostream> #include<cstring> using namespace std; int main() { char str1[110],str2[110]; cin>>str1>>str2; cout<<str1<<" "<<str2<<endl; strcpy(str1,str2); //调用strcpy函数,参数(变量)str1会被修改成str2的值 cout<<str1<<" "<<str2<<endl; return 0; }
调用函数时可以不关心函数具体是如何实现的,关心的是函数的功能和使用规则。也就是说函数的内部像一个“黑盒子”一样,使用者不用关心内部实现细节。而所谓函数的使用规则,就以pow函数为例,函数有两个参数,第一个参数是底数,第二个参数是指数,所以要计算\(x^y\),应该调用\(pow(x,y)\),而不是\(pow(y,x)\)。
只使用内置函数往往是不够的,解决实际问题时,很多时候需要我们根据实际情况自定义函数并调用自定义函数解决问题。