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