版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022年4月30日7时20分1C+面向对象程序设计普通高等教育“十一五”国家级规划教材中国高等院校计算机基础教育课程体系规划教材谭浩强 编著 第1页/共57页2022年4月30日7时20分2第5讲 C+数组及自定义数据类型 授课内容 C+数组及自定义数据类型的使用。主要包括: 1一维和二维数组; 2字符数组与字符串; 3字符串函数; 4结构体的定义; 5结构变量的定义、初始化、结构成员的访问等; 6结构体与数组; 7结构与链表; 8共用体和枚举类型。第2页/共57页2022年4月30日7时20分3第5讲 C+数组及自定义数据类型 授课要求 1掌握数组的基本概念; 2掌握一维数组和二维数组的使
2、用; 3掌握字符数组与字符串的关系以及字符串变量的表示; 4掌握结构体的概念和结构类型的定义; 5掌握结构体变量的定义和初始化; 6掌握结构体成员的访问、结构体赋值的含义以及结构体与指针的关系; 7掌握共用体和枚举类型。 第3页/共57页2022年4月30日7时20分4第5讲 C+数组及自定义数据类型 授课重点 1一维数组和二维数组的定义及使用; 2结构的定义和使用。 授课难点 1数组名作函数的参数; 2结构体与指针的结合。第4页/共57页2022年4月30日7时20分51一维数组的定义和引用 (1)定义一维数组 格式为: 类型标识符 数组名常量表达式; 例如: int a10; 它表示数组名
3、为a,此数组为整型,有10个元素。第5页/共57页2022年4月30日7时20分61一维数组的定义和引用 说明: A数组名定名规则和变量名相同,遵循标识符定名规则。 B用方括号括起来的常量表达式表示下标值,如下面的写法是合法的: int a10; int a2*5; int an*2; /假设前面已定义了n为常变量 第6页/共57页2022年4月30日7时20分71一维数组的定义和引用 C常量表达式的值表示元素的个数,即数组长度。 例如:在“int a3;”中,3表示a数组有3个元素,下标从0开始,这3个元素是: a0,a1,a2。 注意最后一个元素是a2而不是a3。 D常量表达式中可以包括常
4、量、常变量和符号常量,但不能包含变量。 即:C+不允许对数组的大小作动态定义。非法定义数组:int n;cinn; /输入a数组的长度int an; /企图根据n的值决定数组的长度 第7页/共57页2022年4月30日7时20分81一维数组的定义和引用 (2)引用一维数组的元素 数组必须先定义,然后使用。只能逐个引用数组元素的值而不能一次引用整个数组中的全部元素的值。 数组元素的表示形式为: 数组名下标 下标可以是整型常量或整型表达式。例如 a0= a5+ a7- a2*3第8页/共57页2022年4月30日7时20分91一维数组的定义和引用 例1 数组元素的引用。 #include usin
5、g 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,然后按逆序输出。第9页/共57页2022年4月30日7时20分101一维数组的定义和引用 (3)一维数组的初始化 A在定义数组时分别对数组元素赋予初值。 例如 int a10=0,1,2,3,4,5,6,7,8,9; B可以只给一部分元素赋值。 例如: int a10=0,1,2,3,4; /剩余的元素值为0第10页/共57页2022年4月3
6、0日7时20分111一维数组的定义和引用 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;第11页/共57页2022年4月30日7时20分12数组的赋值 1. 用“=”赋值 要在数组之间进行赋值,也只能一个一个元素地赋值。 例如:将数组a的值 赋给另一个同样大小的数组b,可以利用下面的循环完成赋值操作:for (i=0;i数组名;或 cin数组名下标;例如:对一个大小为
7、5的字符型数组a赋值,可以用下列两种方式:char a5;cina;第12页/共57页2022年4月30日7时20分13数组的赋值3. 用scanf()函数, 其语法格式为: scanf(“类型标识”,数组名);或 scanf(“类型标识”,数组元素地址); 4. 用C+库函数中的strcpy()函数(字符串拷贝函数), 其常见语法格式为: strcpy(数组名,字符串); /将一个字符串赋值到一个字符数组中例如: char str110;strcpy(str1,”hello”); 注意,此例不能写为:str1=”hello”; /不合法 另一种常见的语法格式为:strcpy(数组名1,数组名
8、2); /将数组2中的字符串赋值到数组1中例如: strcyp(str1,str2);注意,上例不能写为:str1=str2; /不合法 第13页/共57页2022年4月30日7时20分14数组越界在给数组元素赋值或对数组元素进行引用时,一定要注意下标的值不要超过数组的范围,否则会产生数组越界问题。因为当数组下标越界时,编译器并不认为它是一个错误,但这往往会带来非常严重的后果。例如:定义了一个整型数组a:int a10;数组a的合法下标为09。如果程序要求给a10赋值,将可能导致程序出错,甚至系统崩溃。第14页/共57页2022年4月30日7时20分15数组越界 常用下面的式子确定数组的大小,
9、预防数组越界情况的发生 。假定对于一个整型数组a,它的大小为:sizeof(a)/sizeof(int)sizeof(a)表示求数组a在内存中所占字节数,sizeof(int)表示求整型数据在内存中所占字节数。使用上面这个式子,可以使数组大小计算在16位机器和32位机器之间移植。第15页/共57页2022年4月30日7时20分162二维数组的定义和引用 具有两个下标的数组称为二维数组。 (1)定义二维数组 定义二维数组的一般形式为: 类型标识符 数组名常量表达式常量表达式 例如: float a34,b510; 定义a为34(3行4列)的单精度数组,b为510(5行10列)的单精度数组。 注意
10、:不能写成“float a3,4,b5,10;”。第16页/共57页2022年4月30日7时20分172二维数组的定义和引用 可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如:可以把a看作是一个一维数组,它有3个元素:a0a1,a2,每个元素又是一个包含4个元素的一维数组,图1。第17页/共57页2022年4月30日7时20分182二维数组的定义和引用 C+中,二维数组中元素排列的顺序是:按行存放 图2表示对a34数组存放的顺序。 图2第18页/共57页2022年4月30日7时20分192二维数组的定义和引用 C+允许使用多维数组。 例如,定义三维数组的方法是: floa
11、t a234; 定义float型三维数组a,它有234=24个元素。 第19页/共57页2022年4月30日7时20分202二维数组的定义和引用 (2)二维数组的引用 二维数组的元素的表示形式为 数组名 下标下标 例如: B12=a23 / 2; 在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。第20页/共57页2022年4月30日7时20分212二维数组的定义和引用 (3)二维数组的初始化 A分行给二维数组赋初值。如: int a34=1,2,3,4,5,6,7,8, 9,10,11,12; B可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如: int a34
12、=1,2,3,4,5,6,7,8,9,10,11,12; 效果与前相同。但以第1种方法为好,一行对一行,界限清楚。第21页/共57页2022年4月30日7时20分222二维数组的定义和引用 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;第22页/共57页2022年4月30日7时20分232二
13、维数组的定义和引用 D如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。 如 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 00 0 0 00 10 0 0第23页/共57页2022年4月30日7时20分242二维数组的定义和引用 (4)二维数组程序举例 例2 将一个二维数组行和列元素互换,存到另一
14、个二维数组中。 例如: a=123 b=14 456 25 36第24页/共57页2022年4月30日7时20分252二维数组的定义和引用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 ;
15、bji=aij; 第25页/共57页2022年4月30日7时20分262二维数组的定义和引用 运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6第26页/共57页2022年4月30日7时20分273用数组名作函数参数 数组名也可以作实参和形参,传递的是数组的起始地址。 例3 用选择法对数组中10个整数按由小到大排序。 根据此思路编写程序如下:所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。第27页/共57页2022年4月30日7时20分283用数组名作函数
16、参数 #include using namespace std; int main( ) void select_sort(int array,int n); /函数声明 int a10,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 ,
17、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= arrayi;arrayi=t; 第28页/共57页2022年4月30日7时20分293用数组名作函数参数 关于用数组名作函数参数有两点要说明: A如果函数实参是数组名,形参也应为数组名(或指针变量) 。实参数组与形参数组类型要一致。 B数组名代表数组首元素的地址,并不代表数组中的全部元素。形参数组的长度不要超过实参数组的长度。实参数组必须定义为具有确定长度的数组,而形参数组
18、可以不定义长度,只在数组名后跟一个空的方括号,同时在被调用的函数中另设一个参数用来传递元素的个数。 函数首部的下面几种写法都合法,作用相同。 void select_sort(int array10,int n) void select_sort(int array,int n) void select_sort(int array5,int n)C+实际上只把形参数组名作为一个指针变量来处理,用来接收从实参传过来的地址。/指定元素个数与实参数组相同/不指定元素个数/指定元素个数与实参数组不同第29页/共57页2022年4月30日7时20分304字符数组 用来存放字符数据的数组是字符数组,字符
19、数组中的一个元素存放一个字符。 定义字符数组的方法与前面介绍的类似。 例如:char c10; c0=I;c1= ;c2=a; c3=m;c4= ;c5=h; c6=a;c7=p;c8=p; c9=y;第30页/共57页2022年4月30日7时20分314字符数组 (1)字符串和字符串结束标志 C+规定了一个“字符串结束标志,以字符0代表。 例如:字符串I am happy共有10个字符,但在内存中它共占11个字节,最后一个字节0是由系统自动加上的。 如果用以下语句输出一个字符串: coutHow do you do?; 系统在执行此语句时逐个地输出字符, 提问:那么它怎么判断应该输出到哪个字
20、符就停止了呢?解答:系统会自动在How do you do?字符串的结尾加上字节0,作为结束标记。第31页/共57页2022年4月30日7时20分324字符数组 下面再对字符数组初始化补充一种方法: 用字符串常量来初始化字符数组。 例如; 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;注意第32页/共57页2022年4月30日7时20分334字符数
21、组 如果有: char str10=China; 数组str的前5个元素为C,h,i,n, a,第6个元素为0,后4个元素为空字符。见图3。图3第33页/共57页2022年4月30日7时20分344字符数组 需要说明的是 : 字符数组并不要求它的最后一个字符为0,甚至可以不包含0。 如以下这样写完全是合法的: char str5=C,h,i,n,a;强调:字符数组和字符串的不同。字符串常量有一个结束字符,即0。 第34页/共57页2022年4月30日7时20分355C+处理字符串的方法 5C+处理字符串的方法:字符串类与字符串变量 C+提供了一种新的数据类型字符串类型(string类型)。 V
22、C+中提供了一个字符串类:CString。 (1)定义字符串变量 如: string string1; /定义string1为字符串变量 string string2=China; /定义string2同时对其初始化应当注意: 要使用string类的功能时,必须在本文件的开头加上#include /注意头文件名不是第35页/共57页2022年4月30日7时20分36扩充与 #include与#include的区别:viostream是C+的头文件,是C的头文件,即标准的C+头文件没有.h扩展名,将以前的C的头文件转化为C+的头文件后,有时加上c的前缀表示来自于c,例如cmath就是由变来的。v
23、里面定义的所有类以及对象都是在全局空间里,所以可以直接用cout 。 但在iostream里面,它所定义的东西都在名字空间std里面,所以必须加上using namespace std才能使用cout。v一般一个C+的老的带“.h”扩展名的库文件,比如,在新标准后的标准库中都有一个不带“.h”扩展名的相对应,区别除了后者的好多改进之外,还有一点就是后者的内容都塞进了“std”名字空间中。 第36页/共57页2022年4月30日7时20分37扩充与 唯独string特别。 v由于C+要兼容C的标准库,而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件,包含一些常用的C字符串处理函
24、数,比如strcmp。 v头文件跟C+的string类没有关系,并非的“升级版本”,他们是毫无关系的两个头文件。 v是旧的C 头文件,对应的是基于char*的字符串处理函数;是包装了std 的C+头文件,对应的是新的string 类。 是c+ 的头文件,其内包含了一个string类,string s1就是建立一个string类的对象 的c语言的东西, 没有类,所以不能 string s1。 文件实际上只是在一个命名空间std中include了 第37页/共57页2022年4月30日7时20分385C+处理字符串的方法 (2)对字符串变量的赋值 如:string1=Canada; (3)字符串变
25、量的输入输出 如:cin string1; cout(大于)、=(大于或等于)、成员名。如p-num。“-”称为指向运算符。1001Zhang XinM1990.5Shanghaip第44页/共57页2022年4月30日7时20分456结构体类型 (4)用结构体变量和指向结构体变量的指针构成链表 链表是一种常见的重要的数据结构。 图6表示最简单的一种链表(单向链表)的结构。图6Head为“头指针”一个结点NULL:链表结束第45页/共57页2022年4月30日7时20分466结构体类型 例如,可以设计这样一个结构体类型: struct Student int num; float score;
26、 Student *next; /next指向Student结构体变量 ;参见图7所示。图7第46页/共57页2022年4月30日7时20分476结构体类型 (5)结构体类型数据作为函数参数 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: A用结构体变量名作参数。一般较少用这种方法。 B用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 C用结构体变量的引用变量作函数参数。第47页/共57页2022年4月30日7时20分487共用体 有时需要使几种不同类型的变量存放到同一段内存单元中。 例如,可把一个整型变量、一个字符型变量、一个双精度型变量放在同一个地址开始的内存单元中(
27、见图8)。这就是共用体。图8第48页/共57页2022年4月30日7时20分497共用体 (1)声明共用体 声明共用体类型的一般形式为 union 共用体类型名 成员表列 ; 定义共用体变量的一般形式为: 共用体类型名 共用体变量名;比如:union data int i; char ch; double d; a,b,c;第49页/共57页2022年4月30日7时20分507共用体 (2)对共用体变量的访问方式 不能引用共用体变量,而只能引用共用体变量中的成员。 例如: a.i (引用共用体变量中的整型成员i) (引用共用体变量中的字符型成员ch) a.f (引用共用体变量中的双精度型成员d)不能只引用共用体变量,例如:couta; 是错误的,应该写成couta.i;或couta.ch;等。第50页/共57页2022年4月30日7时20分518枚举类型 如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。 所谓“枚举”是指将变量的值一一列举出来,变量的值只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 改性聚苯板的施工方案(3篇)
- 普通铁路隧道施工方案(3篇)
- 海飞丝内容营销方案(3篇)
- 烟筒补强施工方案(3篇)
- 装修消防施工方案范本(3篇)
- 转移钢结构施工方案(3篇)
- 钢楼梯施工方案模板(3篇)
- 香味营销方案批发(3篇)
- 高考志愿填报-城市选择篇
- 2026一年级道德与法治下册 认真仔细不马虎
- 2026年一级建造师《建设工程项目管理》真题及答案
- 2026年政府采购评审专家测试卷【完整版】附答案详解
- 【长沙】2025年湖南长沙市芙蓉区公开招聘事业单位工作人员20人笔试历年典型考题及考点剖析附带答案详解
- 2026内蒙古和林格尔新区建设管理咨询有限公司招聘6人建设笔试参考题库及答案解析
- 区块链金融(第二版)课件 项目四 区块链赋能证券业务
- 东北三省三校2026届高三下学期第二次模拟考试 化学+答案
- GB/T 47241-2026虚拟电厂技术导则
- 政策工具选择分析-洞察与解读
- 社区团购合作合同协议书模板
- 2026绵阳数据发展有限公司面向社会招聘公司员工10人考试参考题库及答案解析
- 1.《郑人买履》课件PPT
评论
0/150
提交评论