C++大学基础教程第4章_第1页
C++大学基础教程第4章_第2页
C++大学基础教程第4章_第3页
C++大学基础教程第4章_第4页
C++大学基础教程第4章_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、1C+大学基础教程大学基础教程第第4 4章章 数组和其他自定义类型数组和其他自定义类型北京邮电大学信通院北京邮电大学信通院 网络搜索中心网络搜索中心-2-4.14.1数组数组4.2 4.2 枚举类型枚举类型4.3 4.3 结构类型结构类型4.4 4.4 联合类型联合类型第第4 4章章 数组和其他自定义类型数组和其他自定义类型-3-思考?题目:题目: 任意输入任意输入8 8个整数,将其按从小到大的顺序个整数,将其按从小到大的顺序输出。输出。分析: 1、如何存储这8个整数? 2、如何进行比较?数组-4-为什么使用数组?表示1个整数 int a;表示2个整数 int a1, a2;表示3个整数 in

2、t a1, a2, a3;表示8个整数 int a8; a0 a1 a2 a3 a4 a5 a6 a7表示n个整数 const int num=50; int anum;5 4.1.1 4.1.1 数组定义及初始化数组定义及初始化 -6-4.1.1数组基本概念数组: 具有一定顺序关系的若干同类型元素的集合。元素: 组成数组的变量称为该数组的元素。特征: 数组元素都有相同的变量名(数组名),但是有不同的下标。 -7-一维数组的定义语法: 类型说明符 数组名常量表达式1;比如: int a8; /数组定义 1、数组长度是8,每个元素的类型是int 2、 该数组有效的元素: a0 a1 a2 a3

3、a4 a5 a6 a7 0、1、2、3、4、5、6、7表示元素的下标,数组下标从0开始, 即该元素在数组中的位置。-8-数组的定义一般格式 类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22 常量常量表达式表达式nn;例如: int ages5; 含有5个元素的一维整型数组 int table53; 含有5行3列的二维整型数组-9-数组在内存中的存放 数组元素都是存放在一片连续的内存单元中的。数组元素都是存放在一片连续的内存单元中的。下图显示下图显示 int a6的内存情况的内存情况a0a1a2a3a4a5地址递增a-10-数组元素的下标在使用数组元素时需要注

4、意:在使用数组元素时需要注意: 数组元素的下标表达式:必须为正整数。数组元素的下标表达式:必须为正整数。 数组元素的下标值:不得超过声明时所定义数组元素的下标值:不得超过声明时所定义的上下界。的上下界。 例例 int a5; 有效的下标范围:有效的下标范围:0-40-4-11-初始化数组的方法在使用数组元素之前,必须先对它们赋值。在使用数组元素之前,必须先对它们赋值。有以下两种初始化数组的方法:有以下两种初始化数组的方法: 1 1、在定义数组时初始化(整体赋值)、在定义数组时初始化(整体赋值) 2 2、在程序中对数组进行初始化(单独赋值)、在程序中对数组进行初始化(单独赋值)-12- 1 1、

5、在定义数组时初始化、在定义数组时初始化数组初始化时,用作初始化的数组元素值放在一数组初始化时,用作初始化的数组元素值放在一个大括号个大括号中中例如:例如: int a5= 1, 2, 3 ,4, 5; /含五个元素的整型数组,元素的值从1递增 -13-数组的大小编译器原则:编译器原则: 编译器必须知道数组的大小才能编译。通常,声明数编译器必须知道数组的大小才能编译。通常,声明数组时方括号内的数字决定了数组的大小。组时方括号内的数字决定了数组的大小。 但有时,初始化的数组定义省略但有时,初始化的数组定义省略 中的数组大小时,编中的数组大小时,编译器统计译器统计 之间的元素个数,以求出数组的大小。

6、之间的元素个数,以求出数组的大小。 例如,下面的代码产生相同的结果:例如,下面的代码产生相同的结果: int array15=0,1,2,3,4; int array2=0,1,2,3,4; -14-注意 1、初始化值的个数可少于数组元素个数。没有被初始化的元素将赋值为0。 例如: int a5=1, 2, 3; 等效于 int a5=1, 2, 3, 0, 0; int a5=1, 2, 3, 4, 5, 6 -15-2、在程序中进行初始化 大多数情况下,在定义数组时并不知道它的内容,需要在程序中,由用户输入或读磁盘文件数据对数组进行初始化。这时,for循环语句是一个强有力的工具。-16-例

7、4.2题目题目 给定给定8 8个整数,将其存储在整型数组中;然个整数,将其存储在整型数组中;然后输出到屏幕。后输出到屏幕。-17-#include using namespace std;void main() int a8=1, 2, 3, 4, 5, 6, 7, 8; int b8; for(int i=0;i8;i+) bi = i; /或者bi=ai for(i=0;i8;i+) coutai“,”biendl;定义时初始化程序中初始化-18-例4.3题目题目 输入任意输入任意8 8个整数,将其存储在整型数组中;个整数,将其存储在整型数组中;然后输出到屏幕。然后输出到屏幕。-19-#i

8、nclude using namespace std;void main() int a8; for(int i=0;iai; for(i=0;i8;i+) coutaiendl;输入初始化-20-注意1、不能直接把一个数组赋给另一个数组。 int a5=1,2,3,4,5; int b5; b=a; /error2、应使用一个循环语句逐个赋值: for (int i=0;iARRAY_SIZE;i+) bi =ai;为什么?-21-int a3=1,2,3;int b3; a,b是指向数组首地址的指针,当数组定义时,随着内存分配而赋值,是常量。a0a1a2b2b1b0地址递增ab-22-例4

9、.5题目: 任意输入8个整数,将其中最大的一个输出? 分析: 1、数据存储? 2、数据比较?假设max=a0;max、a1比较,max=?max、a2比较,max=? max、a7比较,max= ?int a8;-23-#include using namespace std;void main() int max, a8; _; _; for(int i=1;iai; if ( _ ) _ ; /边输入边比较 coutmaxendl;max = a0;maxa0;-24-例4.6题目: 使用数组存储任意输入8个整数,将其中最大的元素的下标输出? -25-#include using name

10、space std;void main() int k, a8; cina0; _k=0_; for(int i=1;iai; if ( _akai_ ) _k=i_ ; /边输入边比较 coutkai+1,ai和ai+1交换。 a0 a1: a1是前2个数中最大的一趟循环a1 a2: a2是前3个数中最大的a6 a7: a7是前8个数中最大的a2 a3: a3是前4个数中最大的-28-第一次两两比较?原纪录:12 2 9 45 11 21 4 151: 2 12 9 45 11 21 4 15 2 9 12 45 11 21 4 15 2 9 12 45 11 21 4 15 2 9 12

11、11 45 21 4 15 2 9 12 11 21 45 4 15 2 9 12 11 21 4 45 15 2 9 12 11 21 4 15 45 最大数-29-第二次两两比较?第一次:第一次:2 9 12 11 21 4 15 45第二次第二次:2 9 12 11 21 4 15 2 9 12 11 21 4 15 2 9 11 12 21 4 15 2 9 11 12 21 4 15 2 9 11 12 4 21 15 2 9 11 12 4 15 21 次大数-30-冒泡排序法总体步骤总体步骤 n n个数据排序,总共需要个数据排序,总共需要n-1n-1趟趟 第一趟:比较n-1次,从

12、(a0a1)(an-1 an) 第二趟:比较n-2次,从(a0a1)(an-2an-1) 第n-2躺:比较2次,(a0a1),(a1a2) 第n-1趟:比较1次, a0a1-31-void main() int a8; for(int i=0;iai; for(i=0;i8;i+) coutai;for(i=1;i8;i+) bool flag=true; for(int j=0; jaj+1) int t=aj; aj=aj+1; aj+1=aj; flag=false; if(flag) break;32 4.1.2 4.1.2 数组的大小和越界数数组的大小和越界数组组 -33-4.1.2

13、数组的大小和数组越界定义数组时,编译器必须知道数组的大小。 那么,如果数组定义时省略了大小,只是由初始化的值来决定其大小。在程序中怎么知道数组的大小呢? sizeof操作解决了该问题。-34-sizeofsizeof(): 1、能够返回传递给它的数据类型所占用内存的字节数。 2、如果将一个数组变量传给sizeof(),则它将返回系统为此数组在内存中预留的字节数。因此,数组的大小可用用以下公式来计算: 数组大小 = sizeof(数组名) / sizeof(数组类型)-35- 使用sizeof确定不定长数组的长度. #include using namespace std; void main(

14、) int a =1, 1 , 2, 3, 5; coutsizeof(a)/sizeof(int)endl; 技巧-36-数组和字符串对于字符串的初始化,要注意数组实际分配的空间大小是: 字符串中字符个数加上末尾的0结束符。 例子 char name=“marry”; coutsizeof(name)endl; 6-37-作业题目:题目: 随机产生随机产生7 7个不重复的个不重复的1-71-7范围内的整数。范围内的整数。 分析: 1、如何产生随机数? 2、如何使其不重复?-38-void main() int i=0, a7; srand(time(NULL); while(i7) ai=r

15、and()%7+1; /算法一算法1: 1、产生随机数ai 2、将其和已有进行比较,如果重复,返回1; 不重复,i+,返回1;for(int j=0;ji;j+) if(ai=aj) break;if(j=i) i+ ;-39-void main() int i=0,; int a7=1,2,3,4,5,6,7, b7; srand(time(NULL); while(is4;程序中赋值 char s20; for(int i=0;isi; si=0;-43-比较第一种方法用途较广,初始化时,系统自动填加0。 char s110=“hello”; char s2=“hello”;第二种方法,如

16、同初始化整型数组。这种方法通常用于输入不容易在键盘上生成的那些不可见字符。 例如 char array10= t, t, t, t, 0;-44-4.1.3字符数组字符数组的输出字符数组的输出 char s=“hello”; 两种方式: 1、coutsendl; 2、for(int i=0; si!=0; i+) coutsi;-45-例1:输出结果?void main() char s1=“hello”; char s210=“hello”; couts1:sizeof(s1)endl; couts2: sizeof(s2)endl;-46-例2:输出结果?void main() int a

17、=0,1,2,3,4; char b=“hello”; coutaendl; coutbendl;字符数组的特殊-47-例3:输出结果?void main() int a5; char b20; for(int i=0;iai; cinb;字符数组的特殊-48-注意字符串整体输入/输出时,要注意: 1、输出字符不包括0。 2、输出字符串时,输出项是字符数组名,输出时遇到0结束。 例:char str=“Hello”; coutstrendl; 3、输入多个字符串时,以空格分隔;输入单个字符串时其中不能有空格。-49-思考?题目:题目: 输入任意1个字符串,将其按逆序输出。例:输入abcde,

18、输出edcba。分析: 1、如何输入字符串? 2、如何逆序?-50-#include using namespace std;void main() int str20; cinstr; for(int n=0; strn!=0;n+); coutstrendl;for(int i=0; in/2 ; i+) char ch=stri; stri=strn-i-1; strn-i-1=ch; 方法:头尾对调 假设字符串长度为n, 则 s0sn-1 s1sn-2 -51-void Convert(char s, int pos) if (spos!=0) Convert(s,pos+1); co

19、utsi; return;方法:递归假设s =“abcd”; pos=0Convert(a) Convert(b) Convert(c) Convert(d) Convert(0) 无输出 coutd; coutc; coutb;couta;52 4.1.4 4.1.4 多维数组多维数组 -53-4.1.4理解多维数组一维数组: 多个数值的单列表示多维数组: 数值的表格,甚至多表格表示,它具有多个下标值。 例如: int a5; /一维 int b34; /二维 int c345; /三维-54-例子 假定要记录一个垒球队中每个队员的击球数。队中有6个队员,进行了3场比赛。表中所示为击球记录。

20、 int teams63;队员姓名队员姓名1 1场2 2场3 3场张大明张大明2 22 22 2李方春李方春3 33 33 3林志松林志松2 22 22 2崔明东崔明东1 11 11 1刘屈武刘屈武0 00 00 0安度璧安度璧1 11 11 1-55-三维表的图示C+提供存储多维数据的能力,尽管现实世界很少碰到三维以上的情况。 int cube463; -56-总元素个数多维数组的总的元素个数可以通过下标相乘获得。 假如你要记录年度使用的账单,如下数组声明所示: float utilities124; 数组长度: 12*4 = 48 -57-二维表的内存映象C+按行把多维数组映射到线性内存图

21、示一个3行4列的数组nint table34 的内存映象table00table01table02table03table10table11table12table13table20table21table22table23第一行第二行第三行-58-二维数组:一维数组的一维数组ara_name44 一维数组的4个元素是ara_name0 ara_name3。每一个元素则是其对应的一维数组的首地址。-59-定义初始化数组方式1 初始化三个数组:aral,ara2和 ara3。 int aral58, 5, 3, 25, 41; int ara224=4, 3, 2, 1, 1, 2, 3, 4;

22、 int ara334=l, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;-60-定义初始化数组方式2 C+允许多维数组以一维数组的形式进行初始化,但必须注意要按行排列 下面是ara2和ara3的另一种初始他形式: int ara224=4, 3, 2, 1,1,2,3,4; int ara334= l,2,3,4,5,6,7,8,9,10,11,12;-61-定义初始化数组方式3 使用嵌套循环初始化多维数组,注意到for循环的循环次数与数组的下标数目相同,外层循环代表第一个下标(行下标);内层循环代表第二个下标(列下标)。 嵌套for循环将遍历表中的每一个元素。-6

23、2-例4.13嵌套for循环处理多维表void main() int t 23; for (r=0;r2;r+) for (c=0;ct rc; coutrow” ”col“:” t rc; 输出结果 1 2 3 4 5 6 0 0 : 1 0 1 : 2 0 2 : 3 1 0 : 4 1 1 : 5 1 2 : 6-63-本章小结 1、数组的定义和初始化? 2、一维数组和多维数组的使用。-64-作业2、Josephus问题 n个人排成一圈,从编号为1的人开始数1、2、3,数到m的人被开除出圈,再继续从1开始数,直至剩下一个人,问编号为几? 任意输入n和m的值,返回最后一个出圈人的编号。-6

24、5-void main()Josephus(int a, int n,int m)int a=1,2,3,4,5,6,7,8,9; int m=4; int k=-1, ret; /k表示出局的小孩编号for ( int i=0; i9; i+) for( int j=0; jm; ) k = (k+1) % n; if ( ak != -1) j+;coutakendl;ak = -1;66 4.2 4.2 枚举类型枚举类型-67-4.2 4.2 枚举枚举类型类型枚举类型 一种自定义类型,这种数据类型将变量的所有可能值一一列举出来,然后就可以使用这种数据类型来定义变量了。这种新的数据类型称为

25、枚举类型,声明形式为: enum 数据类型名 变量值列表; -68-例如: enum weekday sun, mon, tue, wed, thu, fri, sat; 数据类型名 枚举元素或枚举常量 4.2 4.2 枚举枚举类型类型-69-枚举类型 enum weekday sun, mon, tue, wed, thu, fri, sat;定义一个weekday类型的变量: weekday day; 变量day的取值范围: sun, mon, tue, wed, thu, fri, sat ,把这些标识符看作符号常量对待。 例如: day = mon;4.2 4.2 枚举枚举类型类型-7

26、0-使用注意: 1、枚举元素具有默认值, 依次为:0、1、2、。 也可以在类型声明时另行指定枚举元素的值。 2、枚举值可以进行关系运算。 3、整数值不能直接赋给枚举变量;如需要将整数值赋给枚举变量,应进行强制类型转换 4.2 4.2 枚举枚举类型类型-71-内存映射 1、枚举常量在机器内部仍然是用整型数来存取 2、在定义变量时要给变量分配存储空间,那么定义某个枚举类型的变量时,分配几个字节的内存空间呢? 4.2 4.2 枚举枚举类型类型 枚举元素的值是整数,所以说,在计算机内部处理时,是把枚举类型按整型(int)对待的。-72-例子题目题目 有有RED、BLUE、YELLOW三种颜色,将其所有

27、的排列打印出来。-73-enum COLOR RED,BLUE, YELLOW;void main() for(int i=RED;i=YELLOW;i+) for(int j=RED; j=YELLOW; j+) if (i=j) continue; for(int k=RED; k=YELLOW; k+) if(i=k | j=k) continue; Print(i); Print(j); Print(k); coutendl; -74-void Print (COLOR c) switch (c) case RED: cout“REDt”; break; case BLUE: cout

28、“BLUEt”; break; case YELLOW: cout“YELLOWt”; break; default: cout”error”; 75 4.3 4.3 结构类型结构类型-76-结构类型 把现实生活中意义密切相关的一组数据组合成一个整体,即由各种数据类型(可以是基本数据类型或已声明的自定义数据类型)的数据组成一个集合,称为结构类型。 4.3 4.3 结构结构类型类型-77-结构的声明形式如下: struct 结构类型名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;4.3 4.3 结构结构类型类型-78-定义结构体类型studentstruct student long num; /学号 char name20; /姓名 int age; /年龄 float score;/成绩; 4.3 4.3 结构结构类型类型-79-定义student类型的变量: struct student s1;结构类型的变量所占的存储空间是结构中所有成员所占空间的总和 4.3 4.3 结构结构类型类型numname20

温馨提示

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

评论

0/150

提交评论