资源描述
1.1,面向对象程序设计,1.2,C+,程序设计,1.3,C+,程序的开发过程,1.4,面向对象程序的组成元素,第,1,章 绪论,1.5,C+,程序的编译与调试,1.6,本章小结,2.1,C+,数据类型,2.2,变量与常量,2.3,运算符与表达式,2.4,控制结构,2.5,数组,2.6,函数,第,2,章,C+,基础知识,2.7,结构体,2.8,联合体,2.9,指针,2.10,面向过程程序设计规范,2.11,菜单结构的设计与实现,2.12,本章小结,返回目录,2.1.1,C+,字符集,C+,基本数据类型,2.1.2,C+,构造数据类型,2.1.3,引用,2.1.4,面向对象程序设计的基本特征,2.1.5,面向对象的程序设计方法与步骤,2.1.7,面向对象程序设计与面向过程程序设计的比较,2.1.6,2.1 C+,数据类型,C+,字符集,C+,字符集,字母,:,az,;,AZ,数字,:,0 1 2 3 4 5 6 7 8 9,其他符号,:,+-*/=,._ :;?|!#%&()(,空格,),C+,基本数据类型,知识点概述,1.,字符类型,字符常量:括在单引号中的字符。如:,A,,特殊的字符常量:转义字符,如:,n,字符变量:使用,char,进行声明的标识符。如:,char ch,;,字符串常量:括在双引号内的字符序列,如:,”hello,world!”,2.,整数类型,整型常量:十进制、八进制、十六进制的整型常量。,整型变量:使用,int,进行声明的变量,3.,浮点类型与双精度类型,浮点常量:实数和科学计数法两种形式,浮点变量与双精度变量:分别使用,float,和,double,进行声明,4.,空类型,:,void,C+,构造数据类型,什么是,构造类型,?,构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的,数组,:由具有相同数据类型的元素组成的集合,结构体,:由不同的数据类型构成的一种混合的数据结构,联合,:构成联合体的数据成员共用同一段内存单元,枚举类型,:将变量的值列举,指针类型,:存储另一变量的地址,类类型,:它定义的是一种对象类型,由数据和方法组成,知识点概述,引用,概念,:变量的别名,和所引用变量共享内存,定义,:数据类型,&,引用变量名,=,变量名,;,使用,:,引用函数的参数,引用还可以做函数的返回值,程序举例,int main(),int a=1;,int/,定义,b,是,a,的引用,cout ,初始化后:,n;,cout ,cout ,b=3;,cout b=3,后:,n;,cout ,cout ,int/,定义,c,是,b,的引用,别名的别名,c=4;,cout c=4,后:,n;,cout ,cout ,cout ,system(pause);,return 0;,程序举例,void swap(int,int main(),int a=2,b=3;,cout a=a t a:address=,cout b=b t b:address=,swap(a,b);/,调用函数交换,a,b,的值,cout a=a t a:address=,cout b=b t b:address=,system(pause);,return 0;,/,函数的定义,void swap(int&x,int&y),int tmp;,tmp=x;,x=y;,y=tmp;,程序举例,int vals10;/,定义的全局数组变量,int error=-1;,int max=0;,int/,引用做函数返回值,int/,返回值是引用类型,int main(),res=0;,cout ,引用仅作函数返回值:,n;,res=maxValue(2,3);,cout res=res tmax=max endl;,cout ,引用作函数返回值,返回值作了左值:,n;,put(0)=10;/,以,put(0),函数值作为左值,等价,vals0=10;,put(9)=20;/,以,put(9),函数值作为左值,等价,vals9=20;,cout vals0 t;,cout vals9 y?x:y;,return max;,/*,功能:处理数组越界,函数名称:,put,参数:,n-,整数类型,返回值:整形变量的引用,*/,int&put(int n),if(n=0,else,cout subscript error;,return error;,返回目录,2.2.1,标识符与关键字,变量的定义与初始化,2.2.2,2.2,变量与常量,常量与符号常量,2.2.3,标识符与关键字,标识符,:程序或系统定义的符号,用来作为变量名、常量名、函数名、类型名、文件名等。,由字母、数字、下划线组成,且由字母或下划线开头的字符串,中间不能有空格,_sum,sum,stu_name,price,等为合法的标识符。,cout,,,52select,,,a lot,,,-W,,,sin,等为不合法标注符。,关键字,:也称保留字,是,C+,编译器预定义的、具有固定含义的标识符,不允许另作它用,常用关键字,int,false,if,default,enum,sizeof,public,const_cast,short,void,else,return,union,new,protected,static_cast,unsigned,typedef,switch,struct,delete,private,reinterpret_cast,long,typeid,case,class,auto,virtual,dynamic_cast,float,do,template,static,using,explicit,double,while,typename,extern,namespace,try,char,for,register,this,catch,w_char_t,break,volatile,operator,throw,bool,goto,mutable,friend,true,continue,const,inline,变量的定义与初始化,变量定义,的语法:,变量的类型变量的名称;,初始化,的方法,int a=,;,int,b(1);,int c;c=1;,常量与符号常量,常量通过,关键字,const,来定义,语法规则,const,变量类型变量名称;,或,const,变量类型变量名称,=,初始值;,如:,const double pi=3.14;,返回目录,2.3.1,运算符,表达式,2.3.2,类型转换,2.3.3,2.3,运算符与表达式,运算符,查看详情,1.,算术运算符,:,+,、,-,、*、,/,、,%,、,+,、,-,2.,赋值运算符,:,=,、,+=,、,-=,、*,=,、,/=,、,%=,3.,关系运算符,:,、,=,、,=,、,!=,4.,逻辑运算符,:,!,、,&,、,|,5.,条件运算符,:,?:,6.,位运算符,:,、,、,|,、,、,&,7.,sizeof,运算符,(求字节运算符):,sizeof,8.,逗号运算符,:,9.,其它运算符,:,指针运算符(*、,&,)、分量运算符(,*,、,-,)、函数调用运算符()、强制类型转换运算符(,type,),返回,运算符的优先级与结合性,运算符优先级决定了在表达式中各个运算符执行的先后顺序,括号会改变优先级,运算符的结合方式有两种:左结合和右结合,左结合表示运算对象先与其左边的运算符结合,右结合表示运算对象优先与其右边的运算符结合,表达式,表达式是用于计算的式子,它由运算符、运算数和括号组成,算术表达式,:由算术运算符和位操作运算符组成的表达式,逻辑表达式,:由逻辑运算符组成的表达式。,其表达式值的类型为逻辑型,关系表达式,:由关系运算符组成的表达式。,其表达式值的类型为逻辑型,赋值表达式,:由赋值运算符组成的表达式,条件表达式,:由三目运算符组成的表达式,逗号表达式,:用逗号将若干个表达式连起来组成的表达式,类型转换,命名空间,1.,隐式类型转换,隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算,2,显式类型转换,显式类型转换是由程序员显式指出的类型转换,转换形式有两种,类型名(表达式),(类型名)表达式,3,转换规则,当参与运算的操作数必须是,bool,型时,如果操作数是其它类型,编译系统会自动将非,0,数据转换为,true,,,0,转换为,false,位运算的操作数必须是整数,赋值运算要求左值与右值的类型相同,若不同,系统自动转换为左值的类型,返回目录,2.4.1,选择结构,循环结构,2.4.2,2.4,控制结构,选择结构,多分支结构:,if(,条件表达式,1),语句,1;,else if(,条件表达式,2),语句,2;,else if(,条件表达式,n),语句,n;,else,语句,n+1;,单分支结构:,if(,条件表达式,),语句,1;,双分支结构,:,if(,条件表达式,),语句,1;,else,语句,2;,switch,语句,switch,(判断表达式),case,常量表达式,1:,语句,1;break;,case,常量表达式,2:,语句,2;break;,/,default:,语句,n+1;,循环结构,三要素:,循环变量、,循环体,和循环终止条件,循环结构,for,循环的一般结构,for(,表达式,1;,表达式,2;,表达式,3),语句,;,while,循环的一般结构,while(,表达式,),语句,;,do-while,循环的一般结构,do,语句,;,while(,表达式,);,expr,循环体,假,(0),真,(,非,0),while,do,循环体,expr,假,(0),真,(,非,0),while,程序举例,程序,2-7,:计算这一天是这一年的第几天,int monthDays=0,30,28,31,30,31,30,31,31,30,31,30,31;,int main(),int year,month,day;cout year month day;,int sumDays=day;/,总天数,for(int i=1;i month;i+)/,忽略闰年,sumDays=sumDays+monthDaysi;,cout year-month-day is,cout year ,年的第,sumDays ,天,n;,system(pause);return 0;,程序举例,程序,2-8,:输入两个整数,m,,,n,,计算其最大公约数,int main(),int a,b;cout a b;,int m=a,n=b;,int r=m%n;,while(r!=0),m=n;n=r;r=m%n;,cout a ,,,b ,的最大公约数是:,n 1e-8);,cout setprecision(15)s*4 endl;,system(pause);,return 0;,返回目录,2.5.1,一维数组,二维数组,2.5.2,字符数组和字符串类,2.5.3,2.5,数组,一维数组,概念:,同一类型的多个数据分配一段连续的内存空间,定义:,数据元素类型数组变量名称,数组元素的个数,;,数据元素类型数组变量名称,=,初值,初值,,.,;,初始化:,全部初化,,int a=1,2,3,4,5,6;,部分初始化,,int a5=1,2,3,;,访问:,下标运算符,,数组名,下标,程序举例,:,数组使用,#include,#include,using namespace std;,int main()/,数组逆置处理,int myArray=1,2,3,4,5;,int n=sizeof(myArray)/sizeof(myArray0);/,计算数组元素的个数,int i,j,,,tmp;,for(i=0,j=n-1;i j;i+,j-),tmp=myArrayi;myArrayi=myArrayj;myArrayj=tmp;,for(i=0;i n;i+),cout setw(5)myArrayi;,cout endl;system(pause);return 0;,二维数组,概念:数组的元素又是数组,可看作矩阵,定义:,数据元素类型数组变量名称,数组元素的行数,数据元素的列数,;,数据元素类型数组变量名称,数据元素的列数,=,初值,初值,,.,;,初始化,分行初始化:例,int a3=1,4,5;,不分行初始化:例,int a3=1,2,3,4,5;,访问:,数组名,下标,下标,程序举例:设计二维数组程序,输出九九乘法表,:,#include,#include,#include,using namespace std;,#define COL 10,#define COLUMN 10,int main(),int mat COLCOLUMN=0;,int i,j;,for(i=1;i COL;i+)/,矩阵元素赋值,乘法表,for(j=1;j=i;j+),mat ij=i*j;,for(i=1;i COL;i+)/,输出乘法表,for(j=1;j=i;j+),cout setw(3)j *i =mat ij;,cout endl;,/,将结果写到文件中,ofstream outFile(res.txt);/,定义输出文件流,for(i=1;i COL;i+),for(j=1;j=i;j+),/,将结果写到输出文件流中,outFile setw(3)j *i =mat ij;,outFile endl;,outFile endl;,outFile.close();/,关闭输出文件流,fflush(stdin);/,清空输入缓冲区,getchar();,return 0;,字符数组和字符串类,概念,:,数组的每一个元素均为字符类型,定义,:,char,字符数组名称,字符数组最多存放的字符元素个数,;,char*,字符指针名,=new charN;,string,字符串变量名,;,程序举例:将数字字符串变为数字,#include,#include/C+,字符串,是类类型,using namespace std;,int main(),string numStr;,long int number=0;,int singleNum;,cout ,输入一个数字字符串,numStr;,int i=0;,while(numStri!=0),/,将单个字符变为数字,,48,是,0,的,ASC,码值,singleNum=numStr.at(i)-48;,number=number*10+singleNum;,i+;,cout numStr=numStr endl;,cout number=number endl;,fflush(stdin);getchar();return 0;,返回目录,2.6.1,函数的定义,函数原型的声明,2.6.2,函数的调用,2.6.3,内联函数,2.6.4,函数的重载,2.6.5,递归函数,2.6.7,带缺省值的函数,2.6.6,2.6,函数,函数的定义,概念:,实现某一功能的相关语句组织在一起,并给之注明相应的名称,这种形式的组合就称为函数,功能:,C+,程序的基本模块,函数组成,C+,程序,至少含有一个,main,函数,main,是程序运行的入口,分类:,是否为系统预定义,分为库函数和用户自定义函数,是否有参:有参函数和无参函数,函数原型的声明,编译器遇到一个函数调用时,需要判断该函数调用是否正确,该机制即函数原型。,C+,中,函数声明就是函数原型,函数原型的声明,函数原型是一条程序语句,它,必须以“,;,”分号结束,;,由函数返回类型、函数名和参数表构成,函数返回值类型 函数名,(),;,int area(int,int);,int area(int length,int width);,函数原型和函数定义在返回类型、函数名和参数表上必须完全一致,函数的调用,直接调用,适用于函数的返回值为空,或返回值不需要被保存的情况,表达式调用,将函数调用放到一个表达式中,让其参与运算,一般用在赋值表达式中,y=sin(x);,嵌套调用,一个函数调用的结果作另一个函数调用的参数,m=max(a,max(b,c);,参数传递,传值,传引用,传地址,C+,的函数调用过程就是,栈空间操作的过程,(,1,)建立被调函数的栈空间;,(,2,)保护调用函数的运行状态和返回地址;,(,3,)传递参数;,(,4,)将控制权转交给被调函数;,(,5,)函数运行完成后,复制返回值到函数数据块的底部;,(,6,)恢复调用函数的运行状态;,(,7,)返回到调用函数。,分析程序的执行过程,int funcA(int x,int y);,int main(),int a=6,b=12;,a=funcA(a,b);,int funcA(int x,int y),int n=5;,n=x+y;,return n;,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,运行程序,执行,main(),funcA(),n,5,y,12,x,6,main(),运行状态及返回地址,返回值,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA(a,b),main,函数的临时空间,funcA(),n,5 18,y,12,x,6,main(),运行状态及返回地址,返回值,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA(a,b),,,执行,n=x+y;,funcA(),n,18,y,12,x,6,main(),运行状态及返回地址,返回值,18,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA(a,b),,执行,return n;,18,12,6,main(),运行状态及返回地址,18,main(),b,12,a,6 18,操作系统运行状态及返回地址,返回值,0,返回到,main(),函数中,,a=funcA(a,b);,内联函数,内联扩展(,inline expansion,)简称为内联(,inline,),内联函数也称为内嵌函数,函数的定义或声明前加上关键字,inline,一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数调用的空间分配、保存现场、参数传递和返回操作等,从而加快整个程序的执行速度,内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明,函数的重载,功能相似而参数类型不同的函数可以使用相同的函数名,这就是函数重载,参数类型不同,void sort(int*arr,int n);,void sort(float*arr,int n);,参数个数不同,int max(int a,int b);,int max(int a,int b,int c);,参数顺序不同,void find(float*arr,int n,float x);,void find(float*arr,float x,int n);,#include,using namespace std;,int ABS(int);,double ABS(double);,float ABS(float);,int main(),int x1=-12;,double x2=-12.0;,float x3=-12.0;,coutABS(x1)endl;,coutABS(x2)endl;,coutABS(x3)0?a:-a);,double ABS(double a),return(a0?a:-a);,float ABS(float a),return(a0?a:-a);,程序举例:返回一个数的绝对值,只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,只是返回类型不同则不允许重载。,void func(int a);,void func(char a);,void func(char a,int b);,void func(int a,char b);,char func(int a);,C+,按下列三个步骤的先后顺序找到匹配的函数并调用之。,寻找一个,严格匹配,,如果找到了,就调用那个函数。,通过相容类型的,隐式转换,寻求一个匹配。,通过,用户定义的转换寻求一个匹配,,若能查出唯一的一组转换,就用那个函数。,#include,using namespace std;,void print(int);,void print(double);,int main(),print(1);,print(1.0);,print(a);,print(3.14f);,输出:,int:1,double:1,int:97,double:3.14,void print(int a),coutint:aendl;,void print(double a),coutdouble:aendl;,程序举例:编程求圆、矩形、梯形的面积,double area(double r),return 3.14*r*r;,double area(double h,double w),return h*w;,double area(double a,double b,double h),return(a+b)*h/2;,#include,using namespace std;,double area(double r);,double area(double h,double w);,double area(double a,double b,double h);,int main(),double r=23.3;,double h1=12,w=5,,,a=7,b=8,h2=3;,coutarea(r)endl;,coutarea(h1,w)endl;,coutarea(a,b,h2);,带缺省值的函数,C+,可以给函数声明中的参数使用默认值,这样在函数调用时,对应的实参就可以省略。,#include,using namespace std;,int func(int a=2);,int main(),coutfunc(5)endl;,coutfunc()endl;,int func(int a),return a;,默认参数规则,一般来说,默认参数总是在函数声明时描述。,函数参数默认值只能从后往前设置,而实参只能从前往后给出。,例:,void func(int a=1,int b,int c=3);,void func(int a,int b=2,int c=3);,func(10,15,20);,func();,func(12,13);,func(2,20);,递归函数,在函数体中出现调用自身的函数称为递归函数。,例:阶乘,n!,的数学函数描述为,其对应的,C+,函数描述为:,unsigned f(unsigned n),if(n=1),return 1;,return n*f(n-1);,注意:,n,的取值范围,1n12,例:,Fibonacci,数列的数学描述为,其等价的,C+,函数为:,unsigned int f(unsigned int n),if(n=0|n=1),return n;,return f(n-1)+f(n-2);,n,的取值范围,1n46,递归函数,递归函数在运行中,其调用与被调函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点,作为状态的一部分,在栈中被分别保护起来。因此,是,C+,的函数机制决定了递归操作的可能性与形式。,递归函数,例:,n!,的函数,当调用,f(3),时,其运行栈描述如图所示,f(1),n=1,f(2),函数的状态及返回地址,返回值,1,f(2),n=2,f(3),函数的状态及返回地址,返回值,2*f(1),f(3),n=3,调用函数的状态及返回地址,返回值,3*f(2),递归条件,递归不能无限制地调用下去,因为栈空间是有限的,所以递归函数是有条件地调用自身。例如阶乘函数中的“,if(n=1)return 1;”,当,n,为,1,时,函数就不再递归了。,递归函数就有递归调用语句,且递归调用应有参数,参数值应该是逐渐逼近停止条件。例如,f(n-1),相对,f(n),来说,是逐渐逼近了停止条件。,递归条件应先测试,后递归调用。无条件递归的逻辑错误,编译器是检查不出来的。,返回目录,2.7,结构,体,概念:,结构体则是任意类型元素的一个聚集,把类型不一样的一组数据放到一块连续的内存空间,结构体类型的定义:,struct,结构体类型名称,数据类型,1,成员名称;,数据类型,2,成员名称;,.,;,结构体变量的定义,结构体类型名称 结构体变量的名称,;,结构体成员的访问,结构体变量名,.,结构体成员名,程序举例:结构体类型的定义,数组,指针的综合应用,#include,#include,using namespace std;,/Point,类型结构体的定义,struct Point,int x,y;,;,/,函数原型的声明,void inputPoint(Point*poly,int n);,void outputPoint(Point*poly,int n);,int main(),Point polygon5;/,定义五边形,int n=sizeof(polygon)/sizeof(polygon0);,inputPoint(polygon,n);,outputPoint(polygon,n);,fflush(stdin);,getchar();,return 0;,/,输入结构体数组元素的值,void inputPoint(Point*poly,int n),cout ,输入点数组元素的,x,y,值:,endl;,for(int i=0;i n;i+),cout ,第,i polyi.x polyi.y;,/,输出,Point,结构体元素的值,void outputPoint(Point*poly,int n),cout ,输出数组元素的值,endl;,Point*pt=poly;,for(;pt poly+n;pt+),cout x y )endl;,返回目录,2.8,联合体,概念:,union,可以用相同的存储空间存储不同类别的数据类型,从而节省内存空间,所有成员相对于基地址的偏移量都为,0,联合体,(union),中的各变量是“互斥”的,联合类型的,定义,形式,union,联合类型名,数据类型,1,成员名称;,数据类型,2,成员名称;,.,;,程序举例:联合体类型的定义与应用,typedef union,char a;,int b;,double c;,Demo;,int main(),char ch=H;,int i=5;,double c=3.14;,cout ch ,占,sizeof(ch),个字节,n;,cout i ,占,sizeof(i),个字节,n;,cout c ,占,sizeof(c),个字节,nn;,Demo d;,cout Demo,类型 变量,d ,占,sizeof(d),个字节,n;,d.a=ch;,cout d.a=d.a endl;,d.b=i;,cout d.b=d.b endl;,d.c=c;,cout d.c=d.c endl;,cout a=d.a b=d.b c=d.c endl;,system(pause);,return 0;,返回目录,2.9.1,指针的定义与使用,指针变量的基本操作,2.9.2,动态内存分配,2.9.3,指针与函数,2.9.4,指针数组,2.9.5,2.9,指针,指针的定义与使用,程序运行中的每一个变量都分配有一块内存空间,对应的内存的起始编号称为这个变量的,地址,直接访问,:程序通过变量名来访问这块空间中的数据的访问方式,指针变量:保存另一个变量地址的变量,间接访问,:通过指针变量来访问它所存的变量的方式,多级指针,:若指针变量所指向的变量的类型是指针类型,指针变量的定义格式,一级指针,定义:数据类型,*变量名,;,二级指针,定义:数据类型,*,变量名;,三级指针,定义:数据类型,*变量名;,程序举例:一级指针的简单使用,int main(),int num1=3;,/,定义整型变量的指针,并初始化指针变量的地址为,num1,的地址,int*pointer=,cout num1=num1 tnum1:address=,cout pinter=pointer tpoint:address=&pointer,cout *pointer=*pointer endl;,system(“pause”);,return 0;,指针变量的基本操作,指针变量,初始化,与,赋值,的语法格式,数据类型*指针变量,=,初始地址表达式;,指针变量赋值,指针变量名,=,地址表达式;,其他运算,取值运算,:*,算术运算,:,+n,-n,相减运算,:p1-p2,比较运算,:p1p2,程序举例:指针的各种运算,通过数组中地址的运算呈现,#include,#include,using namespace std;,void output(int*arr,int n);,int main(),int intArray=1,2,3,4,5;,int n=sizeof(intArray)/sizeof(intArray0);,output(intArray,n);/,数组名作函数的参数,int*pPointer=intArray;,int i=0;,while(pPointer=arr;p-)/,指针,-,运算,cout setw(3)*p;,cout endl;,动态内存分配,运行的程序的内存空间内存分成,5,个区,全局数据区,(,datat area,),,代码区,(,code area,),,栈区,(,stack area,)、,堆区,(,heap area,)、,字符串常量区,程序运行过程中才能确定数据大小时,需要根据问题的规模,动态分配,动态地分配内存,new,运算符,指针变量名,=,new,类型名,(,初值列表,);,指针变量名,=,new,类型名,下标表达式,;,指针变量,=,new,类型名,下标表达式,1,下标表达式,2.;,内存释放,delete,delete,指针变量名;,delete ,指针变量名;,程序举例:动态申请一维数组,int*NewArray(int n);,/,动态申请一维数组的内存空间,void output(int*arr,int n,);/,显示数组元素的值,int main(),int n;,cout ,输入动态数组的长度:,n;,int*array=NewArray(n);,for(int i=0;in;i+),arrayi=i;,output(array,n);,deletearray;,system(pause);return 0;,/,动态申请一维数组的内存空间,int*NewArray(int n),int*p;,p=new intn;,return p;,/,显示数组元素的值,void output(int*arr,int n),int*pointerArr=arr;,for(;pointerArrarr+n;pointerArr+),cout *pointerArr;,cout endl;,指针与函数,指针作函数的参数,指针作函数的参数是一种地址传递方式,指针可以作为函数的形参,也可以作为函数的实参,实参和形参指针变量指向同一内存地址,实现参数双向传递,指针函数,:指针类型函数,函数声明其返回值为指针类型时,这个函数就称为指针型函数,主要目的就是要在函数调用结束时把大量的数据从被调用函数返回到主调函数,指针函数定义:,数据类型*函数名,(,参数表,),函数体,函数指针,:函数指针就是用来存储函数的入口地址的指针变量,函数的指针定义格式:返回类型(*函数指针名)(形式参数表);,函数指针赋值:函数指针名,=,函数名;,调用函数指针指向的函数:函数指针名(实参表);,程序举例:使用函数指针实现各类函数的调用,#include,#include,using namespace std;,#define FUN_MAX 0,#define FUN_MIN 1,#define SIZE sizeof(map)/sizeof(fun_map),string menu=,计算两数的最大值,输入,0,计算两数的最小值,输入,1;,int max(int x,int y);,int min(int x,int y);,void dispMenu(string menu,int n);,struct fun_map,int msg;,int(*pfn)(int,int,);/,定义指向函数的指针作结构体的成员,;,int main(),int a,b,m;,int sel;,/,定义,fun_map,类型的数组并初始化,fun_map map=FUN_MAX,/map0.msg=0;map0.pfn=,/map1.msg=1;map1.pfn=,int lenMenu=sizeof(menu)/sizeof(menu0);,for(int i=0;iSIZE;i+),cout ,输入,a,b,的值,:a b;,dispMenu(menu,lenMenu);,cin sel;,if(sel=mapi.msg),m=mapi.pfn(a,b);,cout m=m y?x:y);,int min(int x,int y),return(xy?x:y);,void dispMenu(string menu,int n),for(int i=0;i n;i+),cout menui endl;,cout endl;,指针数组,指针数组,:数组元素为指针的数组,一维指针数组的,定义形式,数据类型*数组名,数组元素的个数,;,使用方式,指针数组作为函数参数,指针数组用于指向若干字符串,程序举例:带参的,main,函数,#include stdafx.h,#include,using namespace std;,int main(int argc,_TCHAR*argv),for(int i=0;i argc;i+),cout argvi endl;,system(pause);,return 0;,返回目录,2.10,面向过程程序设计规范,写清楚的注释,使用有意义的名字,使程序结构清晰,使用缩进来表示程序中的控制范围,用户交互时能给出有效的提示信息,不要直接使用,ASC,码值。这样会影响程序的可移植性,注意整数的溢出,尽量少的使用难理解的表示方式,在写关系表达式时,不要连用关系运算符,使用循环结构时,不管循环体几个语句,最好都用花括号括起来,每个函数只做一件事情,不要将多个功能组合在一个函数中,返回目录,2.11,菜单结构的设计与实现,综合应用数组、循环、选择结构,菜单结构的设计与实现,数组元素的输入输出、排序、最大值、最小值、均值的计算,给用户提供一个交互的界面,根据用户的选择执行数组的相应操作,程序中的函数有,:,void dispMenu(string menu,int n);/,显示菜单,void inputArray(int arr,int n);/,输入数组元素的值,void outputArray(int arr,int n);/,输出数组元素的值,int maxValue(int arr,int n);/,计算数组元素的最大值,int minValue(int arr,int n);/,计算数组元素的最小值,int average(int arr,int n);/,计算数组元素的平均值,void sortSel(int arr,int n);/,对数组元素做选择
展开阅读全文