1、高级语言程序设计C+,张海威 南开大学信息技术科学学院,基于函数思想的程序设计,函数的基本概念,1,函数编程的基本思想,2,函数程序设计举例,3,函数程序设计练习,4,2,Database & Information System Lab,函数的基本概念,函数的引入 程序中功能相同,结构相似的代码段可以用函数进行描述 程序的功能相对独立,用来解决某个问题 具有明显的入口和出口 入口:参数 出口:返回值,Database & Information System Lab,3,函数的基本概念,函数说明 原型 定义 函数参数 函数返回值 函数的调用,Database & Information Sy
2、stem Lab,4,函数的基本概念,Database & Information System Lab,5,函数的基本概念,函数原型 也称为函数声明 用来指明函数的名称、参数以及返回值类型 函数原型格式为: (); 例如 int add(int a, int b); inline void swap(float ,Database & Information System Lab,6,函数的基本概念,函数原型 属性说明:可缺省,一般可以是下面的关键字之一 inline:表示该函数为内联函数 static:表示该函数为静态函数 virtual:表示该函数为虚函数 friend:表示该函数为某类
3、(class)的友元函数 返回值类型 函数处理得到的结果的类型 函数名 标识符,Database & Information System Lab,7,函数的基本概念,函数原型 参数表 空参数表 void printroot(); void型参数 void printroot(void); ,* float cuberoot(float); float cuberoot(float x);,Database & Information System Lab,8,函数的基本概念,函数定义 函数定义与函数原型的主要区别是它还包括函数体,其格式为 () 函数体 复合语句即程序块,由完成函数功能所需的
4、全部语句构成,Database & Information System Lab,9,函数的基本概念,函数的说明和定义 “函数原型”的说明方式“函数定义”的说明方式,Database & Information System Lab,10,#include using namespace std; void printStar(int);/函数原型 int main() printStar(10);/调用函数 void printStar(int k)/函数定义,#include using namespace std; void printStar(int k)/函数定义 int main(
5、)printStar(10); /调用函数,函数的基本概念,函数的说明和定义 两种说明方式的区别 函数原型的参数表中,参数名可以省略;函数定义的参数表中,必须给出参数名(省略参数名为无名参数) 函数原型的函数体,可以出现在函数调用之后;函数定义的函数体,必须出现在调用之前 函数原型的参数表后面加分号“;”,函数定义的参数表后面是函数体,即花括号“” 函数定义不能出现在任何函数体中,函数原型可以出现在其它函数体中,Database & Information System Lab,11,函数的基本概念,函数的参数 C+语言的函数分为无参函数和有参函数 函数的参数 无参数 一个参数 多个参数 函数
6、参数表的写法 一般写法 省略参数名(无名参数) 参数赋初值,Database & Information System Lab,12,函数的基本概念,函数的参数 形参和实参 函数说明中的参数称为形式参数(形参),函数调用中的参数称为实际参数(实参) 实参表在参数个数、参数顺序、以及参数类型等方面要与被调函数的形参表之间有一个一一对应的相互匹配关系 编译器将根据参数的顺序,来逐一实现实参与对应形参的“结合”,而后执行一遍函数体(而完成本次的函数调用),Database & Information System Lab,13,函数的基本概念,函数的参数 全部数据类型都可以作函数的参数 基本类型 导
7、出类型 用户定义类型 形参与实参的一致性 注意数组、指针等导出类型作参数时的一致性,Database & Information System Lab,14,函数的基本概念,函数的调用 函数调用是已定义函数的一次实际运行,与某类型的一个变量和后文中某类的一个对象类似,函数调用是函数定义的一个“实例” 在C+程序中,除main函数外,其它任一函数的执行都是通过在main函数中直接或间接地调用该函数而引发的。调用一个函数就是去执行该函数之函数体的过程,Database & Information System Lab,15,函数的基本概念,函数的调用 函数调用过程,Database & Infor
8、mation System Lab,16,函数的基本概念,函数的调用 函数调用的执行顺序 根据调用语句中的函数名在整个程序中搜索同名函数定义; 对实参数的参数个数,类型,顺序进行核对,判定是否与函数定义中的形参表对应一致 根据参数的类型(值参数或引用参数)进行值参数的值传递或引用参数的换名 运行函数体代码 返回调用点,并返回所要求的函数值,Database & Information System Lab,17,函数的基本概念,函数的调用 无参函数调用格式 () 例如:printStar(); 有参函数调用格式( ) 例如:printStar(26);,Database & Informati
9、on System Lab,18,函数的基本概念,函数的返回 函数的返回表示函数执行结束,将执行结果(无论是否有具体的数据)返回到调用函数的地方 函数返回时完成的任务 把运行控制从函数体返回到函数调用点 根据返回值要求,返回所需要的数据值 返回值类型 void 数值型 引用类型,Database & Information System Lab,19,函数的基本概念,函数的返回 返回值类型 空型(void) 如果函数无值返回,应说明为void 类型。未作类型说明的函数,系统认为是int 类型函数,应返回一整型值 值型:返回一个具有类型的值,包括int、float、char、bool等 当函数要
10、返回的值不止一个时,情况比较复杂,一般它可以以结构或类的形式,也可以以结构,数组或对象指针类型方式实现,这样的实例在后面的章节可以见到 引用类型:详见第6章,Database & Information System Lab,20,函数的基本概念,函数的返回 函数返回用return语句表示 return语句有如下几种写法 return;/函数返回值类型为空(void) return ;/与函数返回值的类型一致 return ();/与前一种写法等价,Database & Information System Lab,21,第一种格式的return用于立即从被调函数中返回, 当函数类型为void
11、时,应使用这种格式的返回语句。当函数类型为非void型时,应使用第二或第三种格式的return语句,此两种格式的语句效果完全相同(可将第二种格式看成是第三种格式的省略形式),系统此时都将计算出表达式的值,并“携带”该值立即从被调函数中返回,函数的基本概念,无返回值函数 完成固定的功能 例如,输入输出某些数据 有返回值函数 在调用的位置,当做与返回值类型相同的变量使用 例如:函数add(a,b),返回值为int 程序中:int c = add(a,b); 是将add(a,b)的值赋给整型变量c,Database & Information System Lab,22,基于函数思想的程序设计,函数
12、的基本概念,1,函数编程的基本思想,2,函数程序设计举例,3,函数程序设计练习,4,23,Database & Information System Lab,函数的设计思想,任务分解 将要解决的问题分为若干子问题,判断哪些子问题可以用函数实现 函数的设计 设计函数的入口:参数 设计函数的出口:返回值 函数返回值的使用 函数体设计 根据解决问题的逻辑,构造函数体 注意函数返回的时机,Database & Information System Lab,24,函数的设计思想,函数体的构成 对参数进行操作 参数为“地址”,操作影响实参,对主调函数有影响 参数为“数值”,操作不影响实参,只有返回值对主调
13、函数有影响 返回语句 分支语句块中 函数体结束前 必须保证函数的每种执行流程,都能返回,Database & Information System Lab,25,函数的设计思想,例1. 求一元二次方程的平方根 任务分解 输入系数:a,b,c 求 求实根 函数设计 设计函数求,参数为:a,b,c;返回值为值 返回值的使用 大于等于0,则将返回值代入求根公式 小于0,输出“无实根”,Database & Information System Lab,26,函数的设计思想,例2. 输入一个字符串,按字符ASCII码由小到大的顺序输出 任务分解 输入字符串 由小到大排序 输出排序后的结果 函数设计 排
14、序函数,参数为:字符数组,无返回值 交换函数,参数为:引用类型字符,无返回值 返回值使用 void型,无返回值,Database & Information System Lab,27,函数的设计思想,例3.找出1000以内的水仙花数 任务分解 从1至1000遍历 判断水仙花数 输出水仙花数 函数设计 判断水仙花数,参数为1000以内的整数,返回值为bool类型,true为是,false为不是 返回值使用 逻辑值,可以用于逻辑表达式,Database & Information System Lab,28,基于函数思想的程序设计,函数的基本概念,1,函数编程的基本思想,2,函数程序设计举例,3
15、,函数程序设计练习,4,29,Database & Information System Lab,函数设计示例,1742年6月7日,哥德巴赫写信给欧拉,提出了以下猜想:任何一个大于等于6的偶数都可以表示成为两个奇素数之和;任何一个大于等于9的奇数都可以表示成为三个奇素数之和这就是著名的哥德巴赫猜想。 请编写程序验证在10000以内哥德巴赫猜想是否成立。如果成立输出Yes否则输出No,Database & Information System Lab,30,函数设计示例,程序设计过程 任务分解 从6至10000之内,验证每一个大于等于6的偶数是否符合猜想 从6至10000之内,验证每一个大于等于
16、9的奇数是否符合猜想 判断一个数是否为素数 将两个猜想放在一起判断是否符合猜想,Database & Information System Lab,31,函数设计示例,程序设计过程 函数设计 判断大于等于6的偶数是否符合猜想 参数:要去判断的偶数 返回值:整型,1符合猜想,0不符合 判断大于等于9的奇数是否符合猜想 参数:要去判断的奇数 返回值:整型,1符合猜想,0不符合 判断一个数是否为素数 参数:要判断的数 返回值:整型,1为素数,0为非素数,Database & Information System Lab,32,函数设计示例,判断偶数的函数,Database & Information
17、 System Lab,33,int even(int n) for ( int i=3;in;i+=2) if(isprime(i) ,函数设计示例,判断奇数的函数,Database & Information System Lab,34,int odd(int n) for ( int i=3;in;i+=2) if(isprime(i) ,函数设计示例,判断是否为素数的函数,Database & Information System Lab,35,int isprime(int n)for(int i=2;in/2;i+)if(n%i=0)return 0;return 1; ,函数设计
18、示例,主函数,Database & Information System Lab,36,void main()bool g1=true,g2=true;for(int i=6;i=10000;i+=2) g1=g1 ,基于函数思想的程序设计,函数的基本概念,1,函数编程的基本思想,2,函数程序设计举例,3,函数程序设计练习,4,37,Database & Information System Lab,函数设计练习,【练习1】以下代码是计算1000以内水仙花数的程序,将该程序进行改写,至少使用两个函数(不包括主函数),Database & Information System Lab,38,#i
19、nclude void main() const int n=3;int start,end,num,sum,power;int i,j,bit,bit_power; power =1; for(i=1;in;i+)power = power*10;start = power;end = power*10;,函数设计练习,Database & Information System Lab,39,for(num = start;numend;num+) sum=0;power=10;for(i=1;i=n;i+) bit = (num%power)/(power/10);bit_power=1;
20、for(j=1;j=n;j+)bit_power*=bit;sum = sum+bit_power;power= power*10;if(sum=num)coutnumendl; ,函数设计练习,【练习2】用户任意输入一个年份以及该年的1月1日是星期几,而后再输入该年的任意一个月份,由程序负责在屏幕上按照所涉及的格式显示出这个月的月历(实验指导P83自立题十四),Database & Information System Lab,40,函数设计练习,根据如下主函数,完成该程序 至少使用5个函数,每个函数完成独立的功能,Database & Information System Lab,41,int main() int year,month,date;coutyear;coutdate;coutmonth;printCalendar(year,month,date);return 0; ,结束!,