第5讲C数组及自定义数据类型-1.5.ppt

上传人:本田雅阁 文档编号:2257139 上传时间:2019-03-12 格式:PPT 页数:57 大小:480.51KB
返回 下载 相关 举报
第5讲C数组及自定义数据类型-1.5.ppt_第1页
第1页 / 共57页
第5讲C数组及自定义数据类型-1.5.ppt_第2页
第2页 / 共57页
第5讲C数组及自定义数据类型-1.5.ppt_第3页
第3页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第5讲C数组及自定义数据类型-1.5.ppt》由会员分享,可在线阅读,更多相关《第5讲C数组及自定义数据类型-1.5.ppt(57页珍藏版)》请在三一文库上搜索。

1、2019年3月12日12时25分,1,C+面向对象程序设计,普通高等教育“十一五”国家级规划教材 中国高等院校计算机基础教育课程体系规划教材,谭浩强 编著,2019年3月12日12时25分,2,第5讲 C+数组及自定义数据类型,5.1授课内容 C+数组及自定义数据类型的使用。主要包括: 1一维和二维数组; 2字符数组与字符串; 3字符串函数; 4结构体的定义; 5结构变量的定义、初始化、结构成员的访问等; 6结构体与数组; 7结构与链表; 8共用体和枚举类型。,2019年3月12日12时25分,3,第5讲 C+数组及自定义数据类型,5.2授课要求 1掌握数组的基本概念; 2掌握一维数组和二维数

2、组的使用; 3掌握字符数组与字符串的关系以及字符串变量的表示; 4掌握结构体的概念和结构类型的定义; 5掌握结构体变量的定义和初始化; 6掌握结构体成员的访问、结构体赋值的含义以及结构体与指针的关系; 7掌握共用体和枚举类型。,2019年3月12日12时25分,4,第5讲 C+数组及自定义数据类型,5.3授课重点 1一维数组和二维数组的定义及使用; 2结构的定义和使用。 5.4授课难点 1数组名作函数的参数; 2结构体与指针的结合。,2019年3月12日12时25分,5,1一维数组的定义和引用,(1)定义一维数组 格式为: 类型标识符 数组名常量表达式; 例如: int a10; 它表示数组名

3、为a,此数组为整型,有10个元素。,2019年3月12日12时25分,6,1一维数组的定义和引用,说明: A数组名定名规则和变量名相同,遵循标识符定名规则。 B用方括号括起来的常量表达式表示下标值,如下面的写法是合法的: int a10; int a2*5; int an*2; /假设前面已定义了n为常变量,2019年3月12日12时25分,7,1一维数组的定义和引用,C常量表达式的值表示元素的个数,即数组长度。 例如:在“int a3;”中,3表示a数组有3个元素,下标从0开始,这3个元素是: a0,a1,a2。 注意最后一个元素是a2而不是a3。 D常量表达式中可以包括常量、常变量和符号常

4、量,但不能包含变量。 即:C+不允许对数组的大小作动态定义。,非法定义数组: int n; cinn; /输入a数组的长度 int an; /企图根据n的值决定数组的长度,2019年3月12日12时25分,8,1一维数组的定义和引用,(2)引用一维数组的元素 数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。 数组元素的表示形式为: 数组名下标 下标可以是整型常量或整型表达式。例如 a0= a5+ a7- a2*3,2019年3月12日12时25分,9,1一维数组的定义和引用,例1 数组元素的引用。 #include using namespace st

5、d; int main( ) int i,a10; for (i=0;i=0;i-) coutai“ “; coutendl; return 0; ,运行结果如下: 9 8 7 6 5 4 3 2 1 0 程序使a0a9的值为09,然后按逆序输出。,2019年3月12日12时25分,10,1一维数组的定义和引用,(3)一维数组的初始化 A在定义数组时分别对数组元素赋予初值。 例如 int a10=0,1,2,3,4,5,6,7,8,9; B可以只给一部分元素赋值。 例如: int a10=0,1,2,3,4; /剩余的元素值为0,2019年3月12日12时25分,11,1一维数组的定义和引用,

6、C如果想使一个数组中全部元素值为1,可以写成 int a10=1,1,1,1,1,1,1,1,1,1; 不能写成 int a10=1*10; D在对全部数组元素赋初值时,可以不指定数组长度。 例如 int a5=1,2,3,4,5; 可以写成 int a=1,2,3,4,5;,2019年3月12日12时25分,12,数组的赋值,1. 用“=”赋值 要在数组之间进行赋值,也只能一个一个元素地赋值。 例如:将数组a的值 赋给另一个同样大小的数组b,可以利用下面的循环完成赋值操作: for (i=0;i数组名;或 cin数组名下标; 例如:对一个大小为5的字符型数组a赋值,可以用下列两种方式: ch

7、ar a5; cina;,2019年3月12日12时25分,13,数组的赋值,3. 用scanf()函数, 其语法格式为: scanf(“类型标识”,数组名);或 scanf(“类型标识”,数组元素地址); 4. 用C+库函数中的strcpy()函数(字符串拷贝函数), 其常见语法格式为: strcpy(数组名,字符串); /将一个字符串赋值到一个字符数组中 例如: char str110; strcpy(str1,”hello”); 注意,此例不能写为:str1=”hello”; /不合法 另一种常见的语法格式为: strcpy(数组名1,数组名2); /将数组2中的字符串赋值到数组1中 例

8、如: strcyp(str1,str2); 注意,上例不能写为:str1=str2; /不合法,2019年3月12日12时25分,14,数组越界,在给数组元素赋值或对数组元素进行引用时,一定要注意下标的值不要超过数组的范围,否则会产生数组越界问题。因为当数组下标越界时,编译器并不认为它是一个错误,但这往往会带来非常严重的后果。 例如:定义了一个整型数组a: int a10; 数组a的合法下标为09。如果程序要求给a10赋值,将可能导致程序出错,甚至系统崩溃。,2019年3月12日12时25分,15,数组越界,常用下面的式子确定数组的大小,预防数组越界情况的发生 。 假定对于一个整型数组a,它的

9、大小为: sizeof(a)/sizeof(int) sizeof(a)表示求数组a在内存中所占字节数,sizeof(int)表示求整型数据在内存中所占字节数。使用上面这个式子,可以使数组大小计算在16位机器和32位机器之间移植。,2019年3月12日12时25分,16,2二维数组的定义和引用,具有两个下标的数组称为二维数组。 (1)定义二维数组 定义二维数组的一般形式为: 类型标识符 数组名常量表达式常量表达式 例如: float a34,b510; 定义a为34(3行4列)的单精度数组,b为510(5行10列)的单精度数组。 注意:不能写成“float a3,4,b5,10;”。,2019

10、年3月12日12时25分,17,2二维数组的定义和引用,可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。,例如: 可以把a看作是一个一维数组,它有3个元素:a0 a1, a2,每个元素又是一个包含4个元素的一维数组,,图1。,2019年3月12日12时25分,18,2二维数组的定义和引用,C+中,二维数组中元素排列的顺序是:按行存放,图2表示对a34数组存放的顺序。,图2,2019年3月12日12时25分,19,2二维数组的定义和引用,C+允许使用多维数组。 例如,定义三维数组的方法是: float a234; 定义float型三维数组a,它有234=24个元素。,2019年

11、3月12日12时25分,20,2二维数组的定义和引用,(2)二维数组的引用 二维数组的元素的表示形式为 数组名 下标下标 例如: B12=a23 / 2; 在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。,2019年3月12日12时25分,21,2二维数组的定义和引用,(3)二维数组的初始化 A分行给二维数组赋初值。如: int a34=1,2,3,4,5,6,7,8, 9,10,11,12; B可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 效果与前相同。但以第1种方法为好,一行对一行

12、,界限清楚。,2019年3月12日12时25分,22,2二维数组的定义和引用,C可以对部分元素赋初值,其余元素值自动置为0。 如:int a34=1,0,6,0,0,11; 初始化后的数组元素如下: 1 0 0 0 0 6 0 0 0 0 11 0 也可以只对某几行元素赋初值: int a34=1,5,6; 数组元素为 1 0 0 0 5 6 0 0 0 0 0 0,第3行不赋初值。也可以对第2行不赋初值: int a34=1,9;,2019年3月12日12时25分,23,2二维数组的定义和引用,D如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长

13、度不能省。 如 int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以写成 int a4=1,2,3,4,5,6,7,8,9,10,11,12; 在定义时也可以只对部分元素赋初值而省略第一维的长度, 但应分行赋初值。如 int a4=0,0,3,0,10;,数组各元素为 : 0 0 3 0 0 0 0 0 0 10 0 0,2019年3月12日12时25分,24,2二维数组的定义和引用,(4)二维数组程序举例 例2 将一个二维数组行和列元素互换,存到另一个二维数组中。 例如: a= 1 2 3 b=1 4 4 5 6 2 5 3 6,2019年3月12日12时25分,25

14、,2二维数组的定义和引用,coutendl; coutarray b:endl; for (i=0;i=2;i+) for(j=0;j=1;j+) coutbij ; coutendl; return 0; ,程序如下: #include using namespace std; int main( ) int a23=1,2,3,4,5,6; int b32,i,j; coutarray a:endl; for (i=0;i=1;i+) for (j=0;j=2;j+) coutaij ; bji=aij; ,2019年3月12日12时25分,26,2二维数组的定义和引用,运行结果如下: a

15、rray a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,2019年3月12日12时25分,27,3用数组名作函数参数,数组名也可以作实参和形参,传递的是数组的起始地址。 例3 用选择法对数组中10个整数按由小到大排序。 根据此思路编写程序如下:,所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。,2019年3月12日12时25分,28,3用数组名作函数参数,#include using namespace std; int main( ) void select_sort(int

16、 array,int n); /函数声明 int a10,i; coutai; coutendl; select_sort(a,10); /函数调用,数组名作实参 coutthe sorted array:endl; for(i=0;i10;i+) /输出10个已排好序的数 coutai ; coutendl; return 0; ,void select_sort(int array , int n) /形参array是数组名 int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk;

17、 arrayk= arrayi;arrayi=t; ,2019年3月12日12时25分,29,3用数组名作函数参数,关于用数组名作函数参数有两点要说明: A如果函数实参是数组名,形参也应为数组名(或指针变量) 。实参数组与形参数组类型要一致。 B数组名代表数组首元素的地址,并不代表数组中的全部元素。形参数组的长度不要超过实参数组的长度。实参数组必须定义为具有确定长度的数组,而形参数组可以不定义长度,只在数组名后跟一个空的方括号,同时在被调用的函数中另设一个参数用来传递元素的个数。 函数首部的下面几种写法都合法,作用相同。 void select_sort(int array10,int n)

18、void select_sort(int array,int n) void select_sort(int array5,int n),C+实际上只把形参数组名作为一个指针变量来处理,用来接收从实参传过来的地址。,/指定元素个数与实参数组相同,/不指定元素个数,/指定元素个数与实参数组不同,2019年3月12日12时25分,30,4字符数组,用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。 定义字符数组的方法与前面介绍的类似。 例如:char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h; c6=a;c7=p;c8=p; c9=y;,2019年3

19、月12日12时25分,31,4字符数组,(1)字符串和字符串结束标志 C+规定了一个“字符串结束标志,以字符0代表。 例如:字符串I am happy共有10个字符,但在内存中它共占11个字节,最后一个字节0是由系统自动加上的。 如果用以下语句输出一个字符串: coutHow do you do?; 系统在执行此语句时逐个地输出字符, 提问:那么它怎么判断应该输出到哪个字符就停止了呢?,解答:系统会自动在How do you do?字符串的结尾加上字节0,作为结束标记。,2019年3月12日12时25分,32,4字符数组,下面再对字符数组初始化补充一种方法: 用字符串常量来初始化字符数组。 例

20、如; char str=I am happy; 也可以省略花括号,直接写成 char str=I am happy; 上面的初始化与下面的初始化等价: char str=I, ,a,m, ,h,a,p,p,y,0;,而不与下面的等价: char str=I, , a, m, , h, a, p, p,y;,注意,2019年3月12日12时25分,33,4字符数组,如果有: char str10=China; 数组str的前5个元素为C,h,i,n, a,第6个元素为0,后4个元素为空字符。见图3。,图3,2019年3月12日12时25分,34,4字符数组,需要说明的是 : 字符数组并不要求它的

21、最后一个字符为0,甚至可以不包含0。 如以下这样写完全是合法的: char str5=C,h,i,n,a;,强调:字符数组和字符串的不同。 字符串常量有一个结束字符,即0。,2019年3月12日12时25分,35,5C+处理字符串的方法,5C+处理字符串的方法:字符串类与字符串变量 C+提供了一种新的数据类型字符串类型(string类型)。 VC+中提供了一个字符串类:CString。 (1)定义字符串变量 如: string string1; /定义string1为字符串变量 string string2=China; /定义string2同时对其初始化,应当注意: 要使用string类的功

22、能时,必须在本文件的开头加上 #include /注意头文件名不是string.h,2019年3月12日12时25分,36,扩充与,#include与#include的区别: iostream是C+的头文件,iostream.h是C的头文件,即标准的C+头文件没有.h扩展名,将以前的C的头文件转化为C+的头文件后,有时加上c的前缀表示来自于c,例如cmath就是由math.h变来的。 iostream.h里面定义的所有类以及对象都是在全局空间里,所以可以直接用cout 。 但在iostream里面,它所定义的东西都在名字空间std里面,所以必须加上using namespace std才能使用

23、cout。 一般一个C+的老的带“.h”扩展名的库文件,比如iostream.h,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者的好多改进之外,还有一点就是后者的内容都塞进了“std”名字空间中。,2019年3月12日12时25分,37,扩充与,唯独string特别。 由于C+要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函数,比如strcmp。 头文件跟C+的string类没有关系,并非的“升级版本”,他们是毫无关系的两个头文件。 是旧的C 头文件,对应的是基于char*的字符串处理函数;是包装了std

24、的C+头文件,对应的是新的string 类。 是c+ 的头文件,其内包含了一个string类,string s1就是建立一个string类的对象 的c语言的东西, 没有类,所以不能 string s1。 文件实际上只是在一个命名空间std中include了 ,2019年3月12日12时25分,38,5C+处理字符串的方法,(2)对字符串变量的赋值 如:string1=Canada; (3)字符串变量的输入输出 如:cin string1; cout string2; (4)字符串变量的运算 A字符串复制用赋值号 string1=string2; 其作用与“strcpy(string1,stri

25、ng2);”相同。,2019年3月12日12时25分,39,5C+处理字符串的方法,B字符串连接用加号 string string1=C+; /定义string1并赋初值 string string2=Language; /定义string2并赋初值 string1=string1 + string2; /连接string1和string2 连接后string1为C+ Language。,2019年3月12日12时25分,40,5C+处理字符串的方法,C字符串比较直接用关系运算符 可以直接用 =(等于)、(大于)、=(大于或等于)、=(小于或等于)等关系运算符来进行字符串的比较。,2019年3

26、月12日12时25分,41,6结构体类型,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。和C+允许用户自己指定这样一种数据类型,它称为结构体。 它相当于其他高级语言中的记录(record)。 (1)结构体类型的声明 声明一个结构体类型的一般形式为: struct 结构体类型名 成员表列; 成员表列声明为:类型名 成员名;,struct 结构体名 成员表列 变量名表列;,或者,2019年3月12日12时25分,42,6结构体类型,例如,可以通过下面的声明来建立如图4所示的数据类型。 struct Student /声明一个结构体类型Student int num; /学号 char

27、 name20; /姓名 char sex; /性别 int age; /年龄 float score; /成绩 char addr30; /地址 ; Student student1,student2;,2019年3月12日12时25分,43,6结构体类型,(2)结构体变量的引用 引用结构体变量中成员的一般方式为 结构体变量名.成员名 比如: 上例中,student1.num 代表引用student1的学号。,2019年3月12日12时25分,44,6结构体类型,(3)指向结构体变量的指针 一个结构体变量的指针就是该变量所占据的内存段的起始地址。 比如:Student *p; p = 引用p

28、中成员的方法: A(*p).成员名。如(*p).num。 Bp-成员名。如p-num。“-”称为指向运算符。,p,2019年3月12日12时25分,45,6结构体类型,(4)用结构体变量和指向结构体变量的指针构成链表 链表是一种常见的重要的数据结构。 图6表示最简单的一种链表(单向链表)的结构。,图6,Head为“头指针”,一个结点,NULL:链表结束,2019年3月12日12时25分,46,6结构体类型,例如,可以设计这样一个结构体类型: struct Student int num; float score; Student *next; /next指向Student结构体变量 ;,参见图

29、7所示。,图7,2019年3月12日12时25分,47,6结构体类型,(5)结构体类型数据作为函数参数 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: A用结构体变量名作参数。一般较少用这种方法。 B用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 C用结构体变量的引用变量作函数参数。,2019年3月12日12时25分,48,7共用体,有时需要使几种不同类型的变量存放到同一段内存单元中。 例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(见图8)。这就是共用体。,图8,2019年3月12日12时25分,49,7共用体,(1)声明共用体

30、 声明共用体类型的一般形式为 union 共用体类型名 成员表列 ; 定义共用体变量的一般形式为: 共用体类型名 共用体变量名;,比如: union data int i; char ch; double d; a,b,c;,2019年3月12日12时25分,50,7共用体,(2)对共用体变量的访问方式 不能引用共用体变量,而只能引用共用体变量中的成员。 例如: a.i (引用共用体变量中的整型成员i) a.ch(引用共用体变量中的字符型成员ch) a.f (引用共用体变量中的双精度型成员d),不能只引用共用体变量,例如: couta; 是错误的, 应该写成couta.i;或couta.ch;

31、等。,2019年3月12日12时25分,51,8枚举类型,如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。 所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。 (1)声明枚举类型 声明枚举类型的一般形式为 enum 枚举类型名 枚举常量表列;,2019年3月12日12时25分,52,8枚举类型,例如: enum weekdaysun,mon,tue,wed,thu,fri,sat; 在声明了枚举类型之后,可以用它来定义变量。 如: weekday workday,week_end; 这样,workday和week_end被定义为枚举类型we

32、ekday的变量。 可以赋值,例如: workday=mon; week_end=sun; 是正确的。,2019年3月12日12时25分,53,8枚举类型,说明: A对枚举元素按常量处理,故称枚举常量。 B枚举元素作为常量,它们是有值的,C+编译按定义时的顺序对它们赋值为0,1,2,3,。也可以在声明枚举类型时另行指定枚举元素的值。 C枚举值可以用来做判断比较。 D一个整数不能直接赋给一个枚举变量。,2019年3月12日12时25分,54,9用typedef声明类型,可以用typedef声明一个新的类型名来代替已有的类型名。 如:typedef int INTEGER; typedef flo

33、at REAL; 这样,以下两行等价: int i,j; float a,b; INTEGER i,j; REAL a,b;,2019年3月12日12时25分,55,9用typedef声明类型,也可以声明结构体类型: typedef struct int month; int day; int year; DATE; 可以用DATE定义变量: DATE birthday; DATE *p; /p为指向此结构体类型数据的指针,注意DATE是新类型名,而不是结构体变量名,2019年3月12日12时25分,56,课后总结,(1)一维和二维数组的定义和使用; (2)字符串与字符数组; (3)结构体的定义、使用; (4)链表; (5)共用体的定义、使用; (6)枚举类型的定义、使用。,重要,2019年3月12日12时25分,57,课后作业,P36: 14、15、16 本讲结束,学好C+的要点: 多编程,多上机,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1