《C数组及自定义数据类型实用.pptx》由会员分享,可在线阅读,更多相关《C数组及自定义数据类型实用.pptx(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023/4/13 21:401第5讲 C+数组及自定义数据类型5.2授课要求1掌握数组的基本概念;2掌握一维数组和二维数组的使用;3掌握字符数组与字符串的关系以及字符串变量的表示;4掌握结构体的概念和结构类型的定义;5掌握结构体变量的定义和初始化;6掌握结构体成员的访问、结构体赋值的含义以及结构体与指针的关系;7掌握共用体和枚举类型。第第2页页/共共56页页第1页/共56页2023/4/13 21:402第5讲 C+数组及自定义数据类型5.3授课重点1一维数组和二维数组的定义及使用;2结构的定义和使用。5.4授课难点1数组名作函数的参数;2结构体与指针的结合。第第3页页/共共56页页第2页/
2、共56页2023/4/13 21:4031一维数组的定义和引用(1)定义一维数组格式为:类型标识符 数组名常量表达式;例如:int a10;它表示数组名为a,此数组为整型,有10个元素。第第4页页/共共56页页第3页/共56页2023/4/13 21:4041一维数组的定义和引用说明:A数组名定名规则和变量名相同,遵循标识符定名规则。B用方括号括起来的常量表达式表示下标值,如下面的写法是合法的:int a10;int a2*5;int an*2;/假设前面已定义了n为常变量 第第5页页/共共56页页第4页/共56页2023/4/13 21:4051一维数组的定义和引用C常量表达式的值表示元素的
3、个数,即数组长度。例如:在“int a3;”中,3表示a数组有3个元素,下标从0开始,这3个元素是:a0,a1,a2。注意最后一个元素是a2而不是a3。D常量表达式中可以包括常量、常变量和符号常量,但不能包含变量。即:C+不允许对数组的大小作动态定义。非法定义数组:int n;cinn;/输入a数组的长度int an;/企图根据n的值决定数组的长度 第第6页页/共共56页页第5页/共56页2023/4/13 21:4061一维数组的定义和引用(2)引用一维数组的元素 数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。数组元素的表示形式为:数组名下标下标可
4、以是整型常量或整型表达式。例如a0=a5+a7-a2*3第第7页页/共共56页页第6页/共56页2023/4/13 21:4071一维数组的定义和引用例1 数组元素的引用。#include using namespace std;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,然后按逆序输出。第第8页页/共共56页页第7页/共56页2023/4/13 21:4081一维数组的定义和引用(3)一维数组的初始化A在定义数组时分别对数组元素赋予初值。
5、例如int a10=0,1,2,3,4,5,6,7,8,9;B可以只给一部分元素赋值。例如:int a10=0,1,2,3,4;/剩余的元素值为0第第9页页/共共56页页第8页/共56页2023/4/13 21:4091一维数组的定义和引用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;第第10页页/共共56页页第9页/共56页2023/4/13 21:4010数组的赋值1.用“=
6、”赋值 要在数组之间进行赋值,也只能一个一个元素地赋值。例如:将数组a的值 赋给另一个同样大小的数组b,可以利用下面的循环完成赋值操作:for(i=0;i数组名;或 cin数组名下标;例如:对一个大小为5的字符型数组a赋值,可以用下列两种方式:char a5;cina;第第11页页/共共56页页第10页/共56页2023/4/13 21:4011数组的赋值3.用scanf()函数,其语法格式为:scanf(“类型标识”,数组名);或 scanf(“类型标识”,数组元素地址);4.用C+库函数中的strcpy()函数(字符串拷贝函数),其常见语法格式为:strcpy(数组名,字符串);/将一个字
7、符串赋值到一个字符数组中例如:char str110;strcpy(str1,”hello”);注意,此例不能写为:str1=”hello”;/不合法 另一种常见的语法格式为:strcpy(数组名1,数组名2);/将数组2中的字符串赋值到数组1中例如:strcyp(str1,str2);注意,上例不能写为:str1=str2;/不合法 第第12页页/共共56页页第11页/共56页2023/4/13 21:4012数组越界在给数组元素赋值或对数组元素进行引用时,一定要注意下标的值不要超过数组的范围,否则会产生数组越界问题。因为当数组下标越界时,编译器并不认为它是一个错误,但这往往会带来非常严重的
8、后果。例如:定义了一个整型数组a:int a10;数组a的合法下标为09。如果程序要求给a10赋值,将可能导致程序出错,甚至系统崩溃。第第13页页/共共56页页第12页/共56页2023/4/13 21:4013数组越界 常用下面的式子确定数组的大小,预防数组越界情况的发生。假定对于一个整型数组a,它的大小为:sizeof(a)/sizeof(int)sizeof(a)表示求数组a在内存中所占字节数,sizeof(int)表示求整型数据在内存中所占字节数。使用上面这个式子,可以使数组大小计算在16位机器和32位机器之间移植。第第14页页/共共56页页第13页/共56页2023/4/13 21:
9、40142二维数组的定义和引用具有两个下标的数组称为二维数组。(1)定义二维数组定义二维数组的一般形式为:类型标识符 数组名常量表达式常量表达式例如:float a34,b510;定义a为34(3行4列)的单精度数组,b为510(5行10列)的单精度数组。注意:不能写成“float a3,4,b5,10;”。第第15页页/共共56页页第14页/共56页2023/4/13 21:40152二维数组的定义和引用可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如:可以把a看作是一个一维数组,它有3个元素:a0a1,a2,每个元素又是一个包含4个元素的一维数组,图1。第第16页页/
10、共共56页页第15页/共56页2023/4/13 21:40162二维数组的定义和引用C+中,二维数组中元素排列的顺序是:按行存放 图2表示对a34数组存放的顺序。图2第第17页页/共共56页页第16页/共56页2023/4/13 21:40172二维数组的定义和引用C+允许使用多维数组。例如,定义三维数组的方法是:float a234;定义float型三维数组a,它有234=24个元素。第第18页页/共共56页页第17页/共56页2023/4/13 21:40182二维数组的定义和引用(2)二维数组的引用二维数组的元素的表示形式为数组名 下标下标例如:B12=a23/2;在使用数组元素时,应
11、该注意下标值应在已定义的数组大小的范围内。第第19页页/共共56页页第18页/共56页2023/4/13 21:40192二维数组的定义和引用(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种方法为好,一行对一行,界限清楚。第第20页页/共共56页页第19页/共56页2023/4/13 21:40202二维数组的定义和引用C可以对部分元素赋初值,其余元素值自动置为
12、0。如:int a34=1,0,6,0,0,11;初始化后的数组元素如下:1 0 0 00 6 0 00 0 11 0也可以只对某几行元素赋初值:int a34=1,5,6;数组元素为 1 0 0 05 6 0 00 0 0 0第3行不赋初值。也可以对第2行不赋初值:int a34=1,9;第第21页页/共共56页页第20页/共56页2023/4/13 21:40212二维数组的定义和引用D如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成int a4=1,2
13、,3,4,5,6,7,8,9,10,11,12;在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如int a4=0,0,3,0,10;数组各元素为:0 0 3 00 0 0 00 10 0 0第第22页页/共共56页页第21页/共56页2023/4/13 21:40222二维数组的定义和引用(4)二维数组程序举例例2 将一个二维数组行和列元素互换,存到另一个二维数组中。例如:a=123 b=14 456 25 36第第23页页/共共56页页第22页/共56页2023/4/13 21:40232二维数组的定义和引用coutendl;coutarray b:endl;for(i
14、=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;第第24页页/共共56页页第23页/共56页2023/4/13 21:40242二维数组的定义和引用运行结果如下:array a:1 2 3 4 5 6 array b:1 4 2 5 3 6第第25页页/共共56页页第
15、24页/共56页2023/4/13 21:40253用数组名作函数参数数组名也可以作实参和形参,传递的是数组的起始地址。例3 用选择法对数组中10个整数按由小到大排序。根据此思路编写程序如下:所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。第第26页页/共共56页页第25页/共56页2023/4/13 21:40263用数组名作函数参数#include using namespace std;int main()void select_sort(int array,int n);/函数声明 int a1
16、0,i;coutenter the originl array:endl;for(i=0;iai;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;arrayk=ar
17、rayi;arrayi=t;第第27页页/共共56页页第26页/共56页2023/4/13 21:40273用数组名作函数参数关于用数组名作函数参数有两点要说明:A如果函数实参是数组名,形参也应为数组名(或指针变量)。实参数组与形参数组类型要一致。B数组名代表数组首元素的地址,并不代表数组中的全部元素。形参数组的长度不要超过实参数组的长度。实参数组必须定义为具有确定长度的数组,而形参数组可以不定义长度,只在数组名后跟一个空的方括号,同时在被调用的函数中另设一个参数用来传递元素的个数。函数首部的下面几种写法都合法,作用相同。void select_sort(int array10,int n)v
18、oid select_sort(int array,int n)void select_sort(int array5,int n)C+实际上只把形参数组名作为一个指针变量来处理,用来接收从实参传过来的地址。/指定元素个数与实参数组相同/不指定元素个数/指定元素个数与实参数组不同第第28页页/共共56页页第27页/共56页2023/4/13 21:40284字符数组 用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。定义字符数组的方法与前面介绍的类似。例如:char c10;c0=I;c1=;c2=a;c3=m;c4=;c5=h;c6=a;c7=p;c8=p;c9=y;第第2
19、9页页/共共56页页第28页/共56页2023/4/13 21:40294字符数组(1)字符串和字符串结束标志C+规定了一个“字符串结束标志,以字符0代表。例如:字符串I am happy共有10个字符,但在内存中它共占11个字节,最后一个字节0是由系统自动加上的。如果用以下语句输出一个字符串:coutHow do you do?;系统在执行此语句时逐个地输出字符,提问:那么它怎么判断应该输出到哪个字符就停止了呢?解答:系统会自动在How do you do?字符串的结尾加上字节0,作为结束标记。第第30页页/共共56页页第29页/共56页2023/4/13 21:40304字符数组下面再对字
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;注意注意第第31页页/共共56页页第30页/共56页2023/4/13 21:40314字符数组如果有:char str10=China;数组str的前5个元素为C,h,i,n,a,第6个元素为0,后4个元素为空字符。见图3。图3第第32页页/共共56页页第31页/共56页20
21、23/4/13 21:40324字符数组需要说明的是:字符数组并不要求它的最后一个字符为0,甚至可以不包含0。如以下这样写完全是合法的:char str5=C,h,i,n,a;强调:字符数组和字符串的不同。字符串常量有一个结束字符,即0。第第33页页/共共56页页第32页/共56页2023/4/13 21:40335C+处理字符串的方法5C+处理字符串的方法:字符串类与字符串变量C+提供了一种新的数据类型字符串类型(string类型)。VC+中提供了一个字符串类:CString。(1)定义字符串变量如:string string1;/定义string1为字符串变量string string2=
22、China;/定义string2同时对其初始化应当注意:要使用string类的功能时,必须在本文件的开头加上#include /注意头文件名不是string.h第第34页页/共共56页页第33页/共56页2023/4/13 21:4034扩充与#include与#include的区别:viostream是C+的头文件,iostream.h是C的头文件,即标准的C+头文件没有.h扩展名,将以前的C的头文件转化为C+的头文件后,有时加上c的前缀表示来自于c,例如cmath就是由math.h变来的。viostream.h里面定义的所有类以及对象都是在全局空间里,所以可以直接用cout。但在iostr
23、eam里面,它所定义的东西都在名字空间std里面,所以必须加上using namespace std才能使用cout。v一般一个C+的老的带“.h”扩展名的库文件,比如iostream.h,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者的好多改进之外,还有一点就是后者的内容都塞进了“std”名字空间中。第第35页页/共共56页页第34页/共56页2023/4/13 21:4035扩充与唯独string特别。v由于C+要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函数,比如strcmp。v头文件跟C+的str
24、ing类没有关系,并非的“升级版本”,他们是毫无关系的两个头文件。v是旧的C 头文件,对应的是基于char*的字符串处理函数;是包装了std 的C+头文件,对应的是新的string 类。是c+的头文件,其内包含了一个string类,string s1就是建立一个string类的对象 的c语言的东西,没有类,所以不能 string s1。文件实际上只是在一个命名空间std中include了 第第36页页/共共56页页第35页/共56页2023/4/13 21:40365C+处理字符串的方法(2)对字符串变量的赋值如:string1=Canada;(3)字符串变量的输入输出如:cin string
25、1;cout(大于)、=(大于或等于)、成员名。如p-num。“-”称为指向运算符。1001Zhang XinM1990.5Shanghaip第第43页页/共共56页页第42页/共56页2023/4/13 21:41436结构体类型(4)用结构体变量和指向结构体变量的指针构成链表链表是一种常见的重要的数据结构。图6表示最简单的一种链表(单向链表)的结构。图6Head为“头指针”一个结点NULL:链表结束第第44页页/共共56页页第43页/共56页2023/4/13 21:41446结构体类型例如,可以设计这样一个结构体类型:struct Student int num;float score;
26、Student*next;/next指向Student结构体变量;参见图7所示。图7第第45页页/共共56页页第44页/共56页2023/4/13 21:41456结构体类型(5)结构体类型数据作为函数参数将一个结构体变量中的数据传递给另一个函数,有下列3种方法:A用结构体变量名作参数。一般较少用这种方法。B用指向结构体变量的指针作实参,将结构体变量的地址传给形参。C用结构体变量的引用变量作函数参数。第第46页页/共共56页页第45页/共56页2023/4/13 21:41467共用体有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个双精度型变量放
27、在同一个地址开始的内存单元中(见图8)。这就是共用体。图8第第47页页/共共56页页第46页/共56页2023/4/13 21:41477共用体(1)声明共用体声明共用体类型的一般形式为union 共用体类型名成员表列;定义共用体变量的一般形式为:共用体类型名 共用体变量名;比如:union data int i;char ch;double d;a,b,c;第第48页页/共共56页页第47页/共56页2023/4/13 21:41487共用体(2)对共用体变量的访问方式不能引用共用体变量,而只能引用共用体变量中的成员。例如:a.i(引用共用体变量中的整型成员i)a.ch(引用共用体变量中的字
28、符型成员ch)a.f(引用共用体变量中的双精度型成员d)不能只引用共用体变量,例如:couta;是错误的,应该写成couta.i;或couta.ch;等。第第49页页/共共56页页第48页/共56页2023/4/13 21:41498枚举类型如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。(1)声明枚举类型声明枚举类型的一般形式为enum 枚举类型名 枚举常量表列;第第50页页/共共56页页第49页/共56页2023/4/13 21:41508枚举类型例如:enum weekdaysun,m
29、on,tue,wed,thu,fri,sat;在声明了枚举类型之后,可以用它来定义变量。如:weekday workday,week_end;这样,workday和week_end被定义为枚举类型weekday的变量。可以赋值,例如:workday=mon;week_end=sun;是正确的。第第51页页/共共56页页第50页/共56页2023/4/13 21:41518枚举类型说明:A对枚举元素按常量处理,故称枚举常量。B枚举元素作为常量,它们是有值的,C+编译按定义时的顺序对它们赋值为0,1,2,3,。也可以在声明枚举类型时另行指定枚举元素的值。C枚举值可以用来做判断比较。D一个整数不能直
30、接赋给一个枚举变量。第第52页页/共共56页页第51页/共56页2023/4/13 21:41529用typedef声明类型 可以用typedef声明一个新的类型名来代替已有的类型名。如:typedef int INTEGER;typedef float REAL;这样,以下两行等价:int i,j;float a,b;INTEGER i,j;REAL a,b;第第53页页/共共56页页第52页/共56页2023/4/13 21:41539用typedef声明类型也可以声明结构体类型:typedef struct int month;int day;int year;DATE;可以用DATE定
31、义变量:DATE birthday;DATE *p;/p为指向此结构体类型数据的指针注意DATE是新类型名,而不是结构体变量名第第54页页/共共56页页第53页/共56页2023/4/13 21:4154课后总结(1)一维和二维数组的定义和使用;(2)字符串与字符数组;(3)结构体的定义、使用;(4)链表;(5)共用体的定义、使用;(6)枚举类型的定义、使用。重要第第55页页/共共56页页第54页/共56页2023/4/13 21:4155课后作业P36:14、15、16 本讲结束 学好C+的要点:多编程,多上机第第56页页/共共56页页第55页/共56页2023/4/13 21:4156感谢您的欣赏!第56页/共56页