在日常生活中,我们经常会用到工具。比如我们画一个表格需要用到直尺,它可以告诉我们线段的长度;我们开瓶子的时候需要用开瓶器,它可以把瓶子打开;我们在做计算题的时候需要用到计算器,它能够告诉我们计算结果。
使用工具有些什么好处呢?首先,如果这个工具是现成的,我们就可以不必要自己去做一个这样的工具,直接拿来就能用(比如开瓶器、计算器)。其次,不管是现成的工具,还是自己做的工具(比如自己做的直尺),一定是能够多次反复使用的(比如直尺不是用完一次就不能再用的),而且是能够在各种合适的情况下使用的。(直尺在量程范围内能量这条线段的长度,也能够量那条线段的长度。)
在程序设计中,我们也会有各种各样的“工具”。你告诉比较大小的“工具”两个不相等的数,这个“工具”能够告诉你哪个数大;你告诉求正弦值的“工具”一个弧度,这个工具能够求出这个弧度对应的正弦值等等……这些工具的名字就是函数(Function)。要注意,在程序设计中的函数和数学中的函数有相似的地方,但是它们却完全是两码事,请不要将两者等同起来。
函数和工具的性质是一样的。如果有一个现成求正弦值的函数,我们就不必自己去“造”一个这样的函数。求正弦值的函数是可以多次使用的,并且可以求出任意实数的正弦值(合适的情况下),但是它却求不出一个虚数的正弦值(不合适的情况下)。
有时候我们会知道一个工具有什么功能,但是却因为对其陌生而不会使用,这时候要使用它可能会发生一些困难。除了自己有空去摸索一下以外,最有效的办法就是去看说明书了。说明书里会告诉你什么东西放在什么位置上,使用了以后会产生什么效果之类的。
同工具一样,每个函数也有其自己的说明书,告诉用户如何调用(就是使用的意思)这个函数。这份说明书就称为这个函数的原型。它的格式为:
产生结果类型 函数名(参数1,参数2,……参数n);
函数名相当于工具的名字,比如直尺、计算器等等。产生效果类型相当于使用该工具产生的效果,比如直尺能够读出一个长度,计算器能够显示一个结果等等。而参数(Parameter)则是表示合适的使用情况,比如直尺应该去量长度而不能去量角度,计算器能计算数值而不能去画图等等。
那么我们如何来阅读函数的“说明书”呢?我们先来看两个例子:
⑴int max(int a,int b);
这个函数名称为max,即求出最大的值。运行该函数以后,产生的结果是一个整数。在数学中,我们会有一元函数比如f(x)=2*x+3,也会有多元函数比如g(x,y)=x/4+y等等。我们在使用f(x)或g(x,y)的时候括号内数的位置必须和自变量的字母对应,比如g(4,1)=4/4+1=2,此时x=4并且y=1。我们既不能将其颠倒,也不能写出g(4)或者g(4,2,1,5)之类的表达式,否则就是错误的。程序设计中参数的作用和自变量x,y的作用是类似的。在函数“说明书”中,也交待了哪个位置应该放置什么类型的参数,我们在调用函数的时候要注意参数的类型、顺序、个数都要一一对应。
具体使用请看以下的程序:(程序6.1.1)
#include "iostream.h"
int max(int a,int b);//函数原型,假设函数已经定义
int main()
{
int r=3,s=5,t;
t=max(r,s);//使用函数,并记录产生的结果
cout<<t <<endl;
return 0;
}
运行结果:5
对于上面这段程序,有两点要说明。首先,调用函数时放入括号内的变量名r和s与函数原型里a和b的名字是可以不一样的。就像我可以用尺量各种各样的纸。但是,它们的数据类型必须相同,如果把一个字符型变量放在这个位置上,就如同用尺去量角度一样,无法成功的。其次,调用函数后的结果可以认为是一个表达式的值。我们可以把这个结果赋值给一个变量或者将其输出。当然,我们也可以不保存不输出这个结果,但是那样的话,就像是量了长度却没有把结果记录下来。
⑵void output(char c);
这个函数名为output,即输出。void表示空类型,它同整型、实型一样,也是一种数据类型。它表示调用该函数后,不会产生任何定量的结果。这是什么意思呢?我们知道,例如榔头这种工具,它只能产生一些效果,如把钉子砸进木头里,但是它不会给使用者一个定量的结果。不过我们大可不必担心它是否完成了我们要它完成的工作。如果榔头没把钉子砸进木头里,要么是榔头本身质量有问题,要么就是使用者没有按照要求去使用。若这把榔头不是用户自己造的,那么用户没有任何责任。
下面我们就来尝试一下使用这个函数:(程序6.1.2)
#include "iostream.h"
void output(char c); //函数原型,假设函数已经定义
int main()
{
char temp;
cin >>temp;
output(temp);
return 0;
}
运行效果:
T
T
虽然函数没有产生什么定量的结果,但是其在屏幕上输出的功能还是达到了。对于产生void(空类型)的函数,我们不必去保存结果了。程序6.1.1和6.1.2的代码是不完善的,如果仅用这些代码去编译会被告知函数未定义。由于涉及更多的知识,这些代码将在下一节得到完善。