第5、7、8章函数与结构体_第1页
第5、7、8章函数与结构体_第2页
第5、7、8章函数与结构体_第3页
第5、7、8章函数与结构体_第4页
第5、7、8章函数与结构体_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++语言程序设计函数结构体函数

函数的定义

函数的调用

全局变量和局部变量

变量的存储类型参数的传递方式

数组作函数参数函数递归函数的默认参数值函数的定义

格式:函数类型名函数名(形参说明表){

语句序列

}

说明:1°函数由函数首部和函数体构成

2°函数名的命名规则同变量名

函数首部函数体P913°函数类型名规定了函数返回值的类型。

使用return返回函数值执行到第一个return时函数结束无返回值时,函数类型名用void函数的定义

说明:4°函数的参数会参与函数的执行

形参说明表中的多个参数之间

用逗号隔开每个参数都要有类型说明无参数时,()内可用void函数的定义

说明:函数的调用

格式:函数名(实参列表)如:m=2*max(x,y);

pick();//调用无参函数//调用有参函数

说明:函数的调用1°形参:出现在函数定义中

实参:出现在函数调用中两者的类型、个数必须一致并一一对应。2°调用函数前先声明函数原型

(functionprototype)。声明格式:函数首部;e.g.

设计函数判断某个整数是否为质数,并求100以内的所有质数。

#include<iostream>

usingnamespacestd;

voidmain()

{

boolIsPrime(intn);

intx;

for(x=2;x<100;x++)

if(IsPrime(x))//函数的调用cout<<x<<‘\t’;

}//函数原型声明boolIsPrime(intn)//函数的定义

{

inti;

for(i=2;i<n;i++)

if(n%i==0)return0;

return1;

}10函数调用的执行过程main()调fun()结束fun()返回①②④⑥⑦保存:返回地址当前现场③恢复:主调程序现场返回地址⑤参数的传递方式

数组作函数参数函数间的参数传递

方式:实参的值传给形参。1.值传递

特点:不会影响实参的值,

实现数据的单向传递。(5)(3)voidmain()

{

intmax(inta,intb);

intx=5,y=3,z;

z=max(x,y);

cout<<“Thebiggeroneis:”<<z;

}intmax(inta,intb)

{

if(a>=b)returna;

returnb;

}如:交换两个整数的值。

voidmain()

{inta=3,b=7;

swap(a,b);

cout<<“交换后:a=”<<a<<“,b=”<<b<<endl;

}

voidswap(intx,inty)

{

intt;

t=x;

x=y;

y=t;

}/*无法交换实参a和b的值*/(3)(7)2.引用传递

引用是一个变量的别名。类型名&引用名=已定义的同类型变量名intx=10,&y=x;//创建int型的引用y,

//并初始化为变量x的别名cout<<y;//输出10

y=100;

cout<<x;//输出100函数间的参数传递2.引用传递三、函数调用时的参数传递方式

创建引用时,须对其进行初始化,使其指向一个已存在的对象。引用一旦被初始化后,就不能改为指向其它对象。

引用可作函数形参。如:交换两个整数的值。

voidmain()

{inta=3,b=7;

swap(a,b);

cout<<“交换后:a=”<<a<<“,b=”<<b<<endl;

}

voidswap(int&x,int&y)

{

intt;

t=x;

x=y;

y=t;

}P96数组作函数参数

形参:一维数组无需指定大小,二维数组无需指定第二维大小,但需指定第一维大小

实参:使用数组名即可,无需带[]如:voidsort(chars[]){……}voidmain()

{

charc[100];……sort(c);……}数组名函数参数是数组

函数调用时,形参数组得到的是实参数组的地址,它们表示的是同一个对象。数组作函数参数

数组名是数组的地址。

函数执行时对形参数组的任何操作即是对实参数组操作。e.g.编写函数统计某字符串中字母、数字及其他字符的个数。在主函数中输入字符串和输出统计结果。

#include<iostream>usingnamespacestd;voidmain(){voidcount(chars[],intd[]);chars[100];intd[3]={0,0,0}; cout<<“请输入s:"; gets(s); count(s,d); cout<<"s中有"<<d[0]<<"个字母、"<<d[1]<<"个数字和"<<d[2]<<"个其他字符。"<<endl;}voidcount(chars[],intd[]){inti;for(i=0;s[i]!=0;i++){ if(s[i]>=65&&s[i]<=90||s[i]>=97&&s[i]<=122) d[0]++; elseif(s[i]>=48&&s[i]<=57) d[1]++; elsed[2]++;}}

声明函数原型时,可为一个或多个形参指定缺省参数值。调用函数时如给出实参,则采用实参值,否则采用对应的缺省参数值。函数的缺省参数值voidmain(){cout<<add(10,20);//10+20cout<<add(10);//10+6cout<<add();//5+6}intadd(intx,inty)

{returnx+y;}如:intadd(intx=5,inty=6);P102

函数原型中,所有取默认值的形参都必须出现在不取默认值的形参的右边。函数的缺省参数值如:intf(intx,inty=5,intz=6);//正确

intf(intx=1,inty=5,intz=6);//正确

intf(intx=1,inty=5,intz);//错误

intf(intx=1,inty,intz=6);//错误

函数调用时,若省略某个实参,则其后的实参都应省略。如:f(,10,20);//错误函数的调用

函数的嵌套调用

在调用一个函数的过程中又调用另一个函数。函数的递归调用不做要求25e.g.输入两个整数,求平方和。#include<iostream>usingnamespacestd;intmain(){inta,b;intfun1(intx,inty);cin>>a>>b;cout<<"a、b的平方和:"

<<fun1(a,b)<<endl; return0;}26intfun1(intx,inty){intfun2(intm);return(fun2(x)+fun2(y));}intfun2(intm){return(m*m);}运行结果:34a、b的平方和:2526

P144函数重载

引例:求不同类型数据的绝对值#include<iostream>#include<cmath>usingnamespacestd;voidmain(){

intx1=-1;doublex2=2.5;longx3=3L;cout<<abs(x1)<<endl;//库函数abs求整型数的绝对值

cout<<fabs(x2)<<endl;//库函数fabs求实型数的绝对值

cout<<labs(x3)<<endl;//库函数labs求长整型数的绝对值

}如果两个函数的函数名相同,参数个数不同或参数的数据类型不完全相同,则称它们互为重载函数。函数重载voidf(intx,charh,floatd)voidf()形参个数不同voidf(intx)voidf(intx,charh,floatd)voidf(inta,charb,doublec)形参类型不完全相同函数重载

重载函数的参数必须不同:个数不同或类型不同。编译器根据实参和形参在类型及个数上的最佳匹配来选择调用重载函数中的哪一个。

参数名的不同或函数返回值的不同均不能构成重载条件e.g.设计数据交换重载函数。

#include<iostream>usingnamespacestd;voidswap(int&a,int&b);//交换两个整数voidswap(char&a,char&b);//交换两个字符voidswap(double&a,double&b);//交换两个实型数voidswap(chara[],charb[]);//交换两个字符串voidmain(){inti1=1,i2=2;charc1='A',c2='B';doubled1=1.123,d2=2.123;chars1[]="abc",s2[]="def";swap(i1,i2);swap(c1,c2);swap(d1,d2);swap(s1,s2);cout<<i1<<","<<i2<<endl;cout<<c1<<","<<c2<<endl;cout<<d1<<","<<d2<<endl;cout<<s1<<","<<s2<<endl;}voidswap(int&a,int&b){intt;t=a;a=b;b=t;}voidswap(char&a,char&b){……}voidswap(double&a,double&b){……}voidswap(chara[],charb[]){chart[100];strcpy(t,a);strcpy(a,b);strcpy(b,t);}局部变量与全局变量

P99351。局部变量定义在函数内或块内的变量称为局部变量。局部变量在程序运行到它所在的块时建立,

该块执行完毕局部变量占有的空间即被释放。2。全局变量全局变量说明于所有函数之外,可以为本源程

序文件中的所有函数共同使用。全局变量可以在各个函数之间建立数据传输通

道,但滥用会破坏程序的模块化结构。36#include<iostream>usingnamespacestd;intx; //声明全局变量intfunc1(intx)//函数func1()有一个名为x的参数{ return(x+5)*(x+5);}intfunc2(inty){ intx=y+5; //函数func2()中声明了一个名为x的局部变量

returnx*x;}37intmain(){ x=0;//在主函数中为全局变量x赋值

cout<<"Theresultinfunc1:"<<func1(5)<<endl; cout<<"Theresultinfunc2:"<<func2(2)<<endl; cout<<"x="<<x<<endl; return0;}结构体

P163

特殊的类39结构体一、概述结构体是C++语言中的一种构造数据类型,各种结构体的类型是由用户根据需要自己来定义的.结构体与数组不同。数组是一批同类型数据组成的集合;而结构体多用来表示一些不同类型的数据组成的一个有机整体。40二、结构体类型的定义1、语法:

struct

结构体类型名{成员定义表};其中,成员定义表中需要声明该结构体中每个成员的类型,其形式为:

类型名成员名结构体类型名和成员名都是用户自定义的标识符。412、举例:

structstudent{charnum[11],name[21];charsex;intage;};

3、注意:

定义的结构体类型中的成员也可以是某种结构体类型的变量。但此时该成员所属的结构体类型一定要定义在之前。42例如,以下定义结构体类型rect来表示直角坐标系下的任意一个矩形。它有四个成员,分别是矩形的四个顶点;其中每个顶点又都是point这种结构体类型的变量。point类型包含两个成员,分别表示点的横坐标和纵坐标:structrect

/*后定义*/{structpointpt1;structpointpt2;structpointpt3;structpointpt4;};

structpoint/*先定义*/{floatx;floaty;};

43三、结构体变量的声明若定义了某种结构体类型,则只是定义了这样一种数据类型的模板;若要表示属于这种类型的具体的个体数据,就还需要声明这种结构体类型的变量后,才能使用它。441、先定义某结构体类型再声明其变量格式:

struct结构体类型名{成员定义表};

struct结构体类型名结构体变量名表声明结构体变量的三种等价的方法:声明了某结构体类型的变量后,系统会为之分配相应的内存单元(若只是定义了一种结构体类型,系统不会为之分配内存单元)。例如:structstudent/*先*/{charnum[11],name[21];charsex;intage;};

structstudentstu1,stu2;

/*后*/462、在定义结构体类型的同时声明其变量格式:struct结构体类型名{

成员定义表}结构体变量名表;例如:

structstudent{charnum[11],name[21];charsex;intage;}stu1,stu2

;473、直接定义结构体类型的变量例如:

struct{charnum[11],name[21];charsex;intage;}stu1,stu2

;它与方法2的区别:定义中未指定结构体类型名。以后就无法利用结构体类型名来声明这种类型的变量。48四、结构体变量的引用1、引用结构体变量中成员的格式:结构体变量名.成员名其中的“.”称为成员运算符,其优先级在所有运算符中属于最高级别.例如,引用前面已声明的变量stu1中的num成员的形式为:

stu1.num声明了一个结构体变量后就可以使用它,但一般不整体地引用这个结构体变量,而是对其中的各个成员分别地进行引用.492、注意:(1)结构体变量的成员与同类型的变量一样,可以对它进行各种运算、操作。例如:

stu1.sex=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论