《交互式程序设计 第2版》一2.5 函数

2.5 函数

函数是什么?
我们会把代码分组,每个组里有一行或多行代码,而函数则是这些代码组的名字。函数与变量很相似,函数也有类型和名字,只不过它不只是存放信息,还会处理信息。这跟基础代数的概念很接近,变量可以用一个字母x表示,而函数则是一个指令,向指令输入一些内容,期待它返还一个结果。如果用简单的文字描述一个函数,大概会像这样:“收到一笔钱,把收到的金额加在原来的金额上,最后把总金额告诉我。”
这件事可以分解成三部分:

  • 收到一笔钱
  • 累加金额
  • 报告总金额

以上三部分可以这样来考虑:函数收到什么,做了什么,返回什么。函数是程序中的指定行为,接收和处理特定类型的数据,完成后返回结果。

2.5.1 定义函数

我们就把上文提到的收钱的例子用代码实现一下。定义一个变量放你所有的钱:

int myBank = 0;

创建一个用来收钱的函数,把钱放到myBank里,返回钱的总数:

int moneyReceived(int money){
    myBank += money;
    return myBank;
}

现在你已经创建了一个名叫moneyReceived()的函数。伪代码和文字描述都有助于我们理解函数。“取得一个整数,加到银行里的现有金额中,报告总金额。”从图2-6可以看到函数做了些什么。

图2-6:函数的声明
注意,return语句所返回的内容要和标在函数名前面的数据类型一致,这里函数返回的myBank就是一个整型变量。

2.5.2 向函数传递参数

函数定义好之后,就可以开始调用了。要调用函数,需要向它传递类型匹配的参数。在函数moneyReceived()的例子里,函数指定输入一个整型参数。下面的语句都是正确的:

moneyReceived(4);

int priceOfDinner = 17;
moneyReceived(priceOfDinner);

但是这样就不对了:

float f = 1.32;
moneyReceived(f);

错误在于传递给函数的参数类型不对,所以要看清楚函数的声明,包括返回值的类型、名字和参数。
return语句指出这个方法函数返回的值的类型,就跟数据类型指定了变量可以存放什么数据的道理一样。不返回任何值的函数会被声明为void类型,其他情况下函数返回值的类型需要明确声明。例如,创建一个返回一个字符的函数,可以这样写:

char myFunction()

函数肯定是这样一种格式:类型、函数名、括号以及被传入的参数,如下所示。

int multiplyByTwo(int value){
    return value * 2;
}

这个函数接收了一个整型值,把这个值和2相乘,返回相乘的结果。我们可以用带有返回值的函数去设置变量的值:

int x = 5;
int twoTimesX = multiplyByTwo(x); // twoTimesX 等于10

而下面这个例子则是调用了一个返回字符的函数,返回的结果取决于输入的参数:

char convertIntToChar(int i){
    char ch = char(i);
    return ch;
}

新变量的值可由函数的返回值设置:

string addExclamationPoints(string s) {
    return s+"!!!";
}

string myStr = addExclamationPoints("hello"); // myStr被设置为'hello!!!' 

由此可见函数类型是多么重要。任何属于整型的东西都可以为整型变量赋值。

int squareOfEight = square(8);

其中square()定义如下:

int square(int val) {
    return val*val;
}

square()返回一个整型值,你可以用它来设置一个整型变量。如果它返回的是浮点型或是其他类型的结果,那就不可以用来设置整型变量了。再强调一次,函数返回值的类型很重要。

2.5.3 有关写函数的一些建议

给函数起个好名字,名字最好能指明函数的功能。上面例子里的square就是个好名字,指明了这个函数是用来做平方运算的。一般情况下,把函数命名为动词大有好处,因为这能从一开始就让你去考虑这个函数的功能,而此后回过头再次看这个函数的时候,函数名也能提醒你这个函数是做什么用的。
函数规模要适中。如果一个函数包含了两三百行的代码,那么我劝你还是把它分解为几个小函数。这样便于你把不同部分的代码用在别的地方,也便于定位问题。把一个大函数分解为几个小函数之后,原来两三百行代码的问题就可以精确定位为某几行代码的问题,从而能节省不少时间。
当你又要解决以前遇到过并解决好的问题时,就把以前使用过的代码包装成一个函数吧。例如你要经常调整图片尺寸,并把调好的图片存放到线上某个目录下,你就可以写一个函数来完成这些重复的操作:
resizeAndSave(int picHeight, int picWidth, String urlToSave)
这样看起来简洁、省事又方便调试。代码越短小,越容易查找内容和定位问题。

2.5.4 重载函数

函数声明之所以重要是因为两个原因。第一,函数声明告诉你向函数传递什么参数,函数对数据作一些什么处理,以及返回什么结果。第二,在编译器看来,函数声明以及它所接收的参数是独一无二的。就算两个函数拥有相同的名字,但如果其中一个接收的参数是2个字符串,而另一个接收3个字符串,则它们仍然是两个不同的函数。一系列名字相同但参数不同的函数,可以让你把同一个功能用在不同的场景。这种做法叫“重载”,同名函数拥有不同的参数。
我们拿动词“draw”(画)来打个比方。显然“drawing a picture”(画一幅画)和“drawing a card”(画一张卡片)是不一样的。编译器也是这样看函数的。我们大可放心地定义同名的函数,编译器能够根据传递参数的不同分辨出它们。例如我们可以让检测视频大小的函数接收整型或浮点型参数,编译器会把它看成两个独立的函数,一个接收整型参数,另一个接收浮点型参数,就算它们都是同一个名字。调用这个函数的时候,如果传入的参数是浮点型的,那么就是调用浮点型参数对应的那一个函数。
这里是Processing里重载函数的一个例子:

char multiplyByTwo(char value){ 

    return char(int(value) * 2);
} 

String multiplyByTwo(String value) {
    return value+value;
} 

int multiplyByTwo(int value){ 

    return value * 2;
} 

int[] multiplyByTwo(int value[]){
    for(int i = 0; i<value.length; i++) {
        value[i] *= 2;
    }
    return value;
}

这个函数接收整型、字符串、字符以及整型数组。哪个版本的函数被调用,取决于传入的参数的类型。

Processing里的可以这样做:
println(multiplyByTwo('z'));    // 打印出
println(multiplyByTwo(5));     // 打印出10
println(multiplyByTwo("string"));    // 打印出stringstring
int[] foo = {1, 2, 3, 4};
println(multiplyByTwo(foo));    //打印出2, 4, 6, 8

警告:重载函数是非常强大的工具,一种方法只需要经过轻微的改动(通过接收不同类型的参数)就能用在不同的场合。不过要注意,指定不同类型的参数,函数重载有效,例如:

int function(int i) {
}
int function(float f) {
}
int function(char c) {
}
而指定了不同类型的返回值,函数重载却未必总能凑效:
int function(int i) {
}
float function(float f) {
}
char function(char c) {
}
上面三个声明在Arduino和C++里都会报错,Processing则不会。一般不建议用这种写法,但如果你坚持要这样做,相信肯定有你的原因。 
时间: 2024-09-16 00:21:58

《交互式程序设计 第2版》一2.5 函数的相关文章

《C语言课程设计》一导读

前 言 C语言课程设计是计算机程序设计的主要实践课程,为帮助读者熟练掌握基本的程序设计方法,我们编写了本书. 本书将程序设计题目分为文件类.字符串类.算法类.综合类和其他类共五大类,集同类题目于一章,方便读者集中学习:不少题目提供了多种实现方法,启发读者多角度思考:题目分析力求重点突出.简洁明了,而非面面俱到,希望读者能够结合参考程序阅读思考. 本书对C程序设计语言的编程环境.调试程序的基本方法.编码风格等方面进行了介绍.参考程序均按照编码风格并使用标准C语言撰写,以增强程序的可读性,方便读者自

c语言课程设计总结心得大全

c语言课程设计心得体会范文一: 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在.因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的. 回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固

c语言-C语言课程设计字符串题目匹配单词,求大神~~~~~~~~~~~~~~~~~

问题描述 C语言课程设计字符串题目匹配单词,求大神~~~~~~~~~~~~~~~~~ 详细题目如下:设有n个单词的字典表(1<=n<=100),计算某单词在字典表中的4种匹配情况(字典中的单词和待匹配的单词长度上限为255):1)i :该单词在字典表中的序号:2)Ei:在字典表中仅有一个字符不匹配的单词不匹配的单词序号:3)Fi:在字典表中多(或少)一个字符(其余字符匹配)的单词序号:4)N:其他情况.当查找时有多个单词符合条件,仅要求第1个单词的序号即可.1)输入文件,文件格式为:n(字典表

c语言-C语言课程设计---商品订购系统 调试

问题描述 C语言课程设计---商品订购系统 调试 #include #include int inumber = 0; //商品量的统计 int ibuy = 0; //订单的统计 void secondmain(); //管理维护子菜单 void jianpanload(); //输入商品 void scanproduct(); //浏览商品 void searchproduct(); //搜索商品 void dinggou(); //订购商品 void lookdinggou(); //查询

c c++-c语言课程设计 仓库物资管理

问题描述 c语言课程设计 仓库物资管理 仓库物资管理() (问题描述) 设计某仓库物资管理系统,有四大类物资:黑色金属.有色金属.非金属.机电设备.(基本要求) 按类管理物资,管理功能如下: (1)物资按四大类入库,记录库存明细账(包括账号.品名.规格.单价.数量.金额.产地.入库日期). (2)出库:记录出库明细账 (3)查询 (4)分类统计:月报表.季报表.年报表 解决方案 http://zhidao.baidu.com/link?url=7QetsNgaTw1gdxr8ajsbSvKhX5

图论-c语言课程设计分油问题

问题描述 c语言课程设计分油问题 输入三个油瓶容量与目标容量, 用邻接矩阵求它的最短路径 ,先判断两点间有没有路 最短路是什么, 调用邻接矩阵函数求 . 解决方案 http://www.it165.net/pro/html/201407/16957.html 解决方案二: C语言课程设计具体安排说明关于操作系统课程设计的问题<c语言课程设计>---职工信息管理系统

学生信息管理系统-c++语言课程设计任务选项

问题描述 c++语言课程设计任务选项 用c++语言编写学生信息管理系统 解决方案 http://wenku.baidu.com/link?url=u6qLhXbR7ZoieB8qD283ls-uBy-95oNz0JNQ--R7_PoL1PS0t1yn-V0T64CzvUFMwLHZ31ENgdLgW4MaUxGgjBcVpR6J55pgpOiic3kd7VS 解决方案二: http://blog.csdn.net/bdmh/article/details/6112631 有一个简单的学生成绩管理

《C语言课程设计》一3.1 文件复制

3.1 文件复制 [例3.1]编写文本文件复制程序,命令行格式为:mycopy filename1 filename2. 题目分析每个C语言程序必须定义一个main函数作为程序的入口.程序启动从main函数开始执行,main函数返回时程序终止,若main函数末尾没有返回语句,则默认执行return 0语句. 标准C语言的main函数有两种形式:接受0个参数的int main(void),即int main():接受2个参数的int main(int argc, char *argv[]).对于后

《C语言课程设计》一2.5 函数

2.5 函数 用void明确表示函数无参数或返回值.例如: void DisplayMenu(void); / 无参无返回值/ 函数参数是指针且仅作输入使用时,应在类型前加const,以防止该指针所指内容在函数体内被意外修改.例如: char MyStrcpy(char s1, const char s2); / 类型前加const*/ 函数体内一般应对参数的有效性进行检查.调用函数时,一般应对其返回值进行判断,对于错误的返回值,应进行相应处理.例如: if ((fp = fopen(argv[

《C语言课程设计》一1.1 VC 6.0简介

1.1 VC 6.0简介 Visual C++ 6.0是Microsoft公司推出的开发Win32程序的集成开发环境,可将"高级语言"翻译为"机器语言(低级语言)",并支持面向对象可视化编程.它具有程序框架自动生成.灵活方便的类管理.代码编写和界面设计集成交互操作.可开发多种程序等优点,而且通过简单的设置即可使其生成的程序框架支持数据库接口.OLE和WinSock网络. Visual C++ 6.0, 简称VC 6.0或VC 6,是微软公司于1998年推出的Visu