第5章-数组1
数据结构:第5章 数组与广义表1-数组
中的元素均为常数。下三角矩阵正好相反,它的主对
数据结构讲义
第5章 数组与广义表
—数组
数组和广义表
数组和广义表可看成是一种特殊的 线性表,其特殊在于,表中的数据 元素本身也是一种线性表。
几乎所有的程序设计语言都有数组 类型。本节重点讲解稀疏矩阵的实 现。
5.1 数组的定义
由于数组中各元素具有统一的类型,并且 数组元素的下标一般具有固定的上界和下 界,因此,数组的处理比其它复杂的结构 更为简单。
nm
aa1221
aa2222
…………....
aam2n2 ………………..
aamm11 aamm22 ………….... aammnn LLoocc(a( iaj)ij=)L=Loco(ca(a111)1+)[+([j(-i1-)1m)n++((i-j1-1)])*]*l l
aa1mn 1 aa2mn2 …………....
其存储形式如图所示:
15137 50800 18926 30251
a00 a10 a 11 a20 a21 a23 ………………..
70613
an-1 0 a n-1 1 a n-1 2 …a n-1 n-1
图 5.1 对称矩阵
在这个下三角矩阵中,第i行恰有i+1个元素,元素总
数为:
n(n+1)/2
5.2 数组的顺序表示和实现
由于计算机的内存结构是一维的,因此用 一维内存来表示多维数组,就必须按某种 次序将数组元素排成一列序列,然后将这 个线性序列存放在存储器中。
又由于对数组一般不做插入和删除操作, 也就是说,数组一旦建立,结构中的元素 个数和元素间的关系就不再发生变化。因 此,一般都是采用顺序存储的方法来表示 数组。
[工学]《C语言程序设计》第5章___数组、字符串、指针
5.2.2 一维数组的初始化
1、数组声明时初始化 在编译阶段进行的。这样将减少运行时间, 提高效率。 数组初始化的一般形式为: 类型符 数组名[常量表达式]={值,值…值}; 例如: int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0; a[1]=1;... a[9]=9;
…
a[9]
#include <stdio.h> 声明有10个元素 void main() 的一维数组a {int n,i; float s=0, ave, a[10]; a[0] a[1] … a[9] for(i=0;i<10;i++) a[i] { scanf("%f",&a[i]); a[i] s=s+a[i]; } ave=s/10; for(i=0;i<10;i++) a[i] a[i] if (a[i]>ave) printf("%f ",a[i]); }
说明: ① int a[10]={0,1,2,3,4};
给前5个元素赋 值,其余赋0值 不能给数组整体 赋值,改成{1} 静态存储类型, 初值为0 可以省略数组元 素个数。 初值的个数不能 超过元素个数
② int a[10]=1;
③ static int a[3]; ④ int a[ ]={1,2,3,4,5}; ⑤ int a[5]={1,2,3,4,5,1 };
代码: for(i=0; i<N-1; i<5; i++) { p=i; for(j=i+1; i<N; j<6; j++) if(a[j]<a[p]) p=j; t=a[i]; a[i]=a[p]; a[p]=t; } 5-5.c
《数据结构与算法》第五章-数组和广义表学习指导材料
《数据结构与算法》第五章数组和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n列的二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
例如一个2×3二维数组,逻辑结构可以用图5.2表示。
以行为主序的内存映象如图5.3(a)所示。
分配顺序为:a11 ,a12 ,a13 ,a21 ,a22,a23 ; 以列为主序的分配顺序为:a11 ,a21 ,a12 ,a22,a13 ,a23 ; 它的内存映象如图5.3(b)所示。
《数据结构——用C语言描述(第二版)》第5章 数组和广义表
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c
高中信息学奥赛C++ 第5章 数组(C++版)
例5.3 宾馆里有一百个房间,从1100编了号。第一个服务员把所有的房 间门都打开了,第二个服务员把所有编 号是2的倍数的房间“相反处理”,第 三个服务员把所有编号是3的倍数的房 间作“相反处理”…,以后每个服务员 都是如此。当第100个服务员来过后, 哪几扇门是打开的。(所谓“相反处理” ห้องสมุดไป่ตู้:原来开着的门关上,原来关上的门 打开。) 【分析】此题较简单,用 a[1],a[2],…,a[n]表示编号为1,2, 3,…,n的门是否开着。模拟这些操作 即可,参考程序如下: #include<cstdio> #include<cstring> #define MAXN 100+10 int a[MAXN]; int main() { int n,k,first=1; memset(a,0,sizeof(a)); for (int i=1;i<=100;++i) for (int j=1;j<=100;++j) if (j%i==0) a[j]=!a[j];
for (int i=1;i<=100;++i) if (a[i]) { if(first) first=0; else printf(" "); printf("%d",i); } printf("\n"); return 0; } 运行结果: 1 4 9 16 25 36 49 64 81 100 【说明】: memset(a,0,sizeof(a))的作用是把 数组a清零,它在cstring中定义。虽 然也能用for循环完成相同的任务,但 是用memset又方便又快捷。另一个 技巧在输出:为了避免输出多余空格, 设置了一个标志变量first,可以表示 当前要输出是否为第一个。第一个变 量前不应该有空格,但其他都有。
数据结构-第5章--数组练习题
数据结构-第5章--数组练习题第5章数组一、选择题3.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为(A)。
A.BA+141B.BA+180C.BA+222D.BA+2254.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(A)。
A.808B.818C.1010D.10205.数组A[0..5,0..6]的每个元素占五个字节,将其按列优先次序存储在起始地址为1000的内存单元中,则元素A[5,5]的地址是()。
1195A.1175B.1180C.1205D.12107.将一个A[1..100,1..100]的三对角矩阵,按行优先存入一维数组B[1‥298]中,A中元素A6665(即该元素下标i=66,j=65),在B数组中的位置K为()。
供选择的答案:A.198B.195C.1972+64某3=19410.若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij(iA.i某(i-1)/2+jB.j某(j-1)/2+iC.i某(i+1)/2+jD.j某(j+1)/2+i11.设A是n某n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij(1≤i,j≤n,且i≤j)在B中的位置为(C)。
A.i(i-l)/2+jB.j(j-l)/2+iC.j(j-l)/2+i-1D.i(i-l)/2+j-112.A[N,N]是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组T[N(N+1)/2]中,则对任一上三角元素a[i][j]对应T[k]的下标k是(AB)。
《数据结构》第五章 数组 习题
《数据结构》第五章 数组 习题基本概念题:5-1 分别写出一维数组和二维数组的存储映象公式。
5-2 什么叫二维数组的行序优先存储?什么叫二维数组的列序优先存储?C 语言采用的是行序优先存储还是列序优先存储?5-3 什么叫随机存储结构?为什么说数组是一种随机存储结构?5-4 动态数组和静态数组在使用方法上有什么不同?5-5 什么样的矩阵叫特殊矩阵?特殊矩阵压缩存储的基本思想是什么?5-6 什么样的矩阵叫稀疏矩阵?稀疏矩阵压缩存储的基本思想是什么?5-7 什么叫稀疏矩阵的三元组?什么叫稀疏矩阵的三元组线性表?5-8 稀疏矩阵主要有哪些压缩存储结构?复杂概念题:5-9 设一个系统中二维数组采用以行序为主的存储方式存储,已知二维数组a[n][m]中每个数据元素占k 个存储单元,且第一个数据元素的存储地址是Loc(a[0][0]),求数据元素a[i][j](0≤i≤n -1, 0≤j≤m -1)的存储地址。
5-10 设一个系统中二维数组采用以行序为主的存储方式存储,已知二维数组a[10][8]中每个数据元素占4个存储单元,且第一个数据元素的存储地址是1000,求数据元素a[4][5]的存储地址。
5-11 画出一个3行3列二维动态数组存储结构示意图。
5-12 对于如下所示的稀疏矩阵A(1)写出该稀疏矩阵的三元组线性表;(2)画出稀疏矩阵A 的三元组顺序表结构;(3)画出稀疏矩阵A 的带头结点单链表结构;(4)画出稀疏矩阵A 的行指针数组链表结构;(5)画出稀疏矩阵A 的三元组十字链表结构。
算法设计题:5-13 为节省内存,n 阶对称矩阵采用压缩存储,要求:(1)编写实现C = A + B 操作的函数。
设矩阵A 、矩阵B 和矩阵C 均采用压缩存储方式存储,矩阵元素均为整数类型。
(2)编写一个采用压缩存储的n 阶对称矩阵的输出函数,要求输出显示成矩阵形式,设矩阵元素均为整数类型。
(3)设矩阵A 和矩阵B 为如下所示的矩阵,编写一个用矩阵A 和矩阵B 作为测试例子的测试上述函数的主程序。
C语言 第5章 数组
北京科技大学
2014-10-10
5.2.4 一维数组应用举例
【例5-2】设计一个程序,将n个人某门课程的成绩输入计 算机后输出最高分和最低分。 思路:①首先将n个人的成绩输入到一个一维数组中。 ②求若干个数的最大值或最小值常采用打擂台的方法: 首先指定某数为最大值或最小值的擂主: 如:max=a[0], min=a[0] 将其他各数依次与擂主进行比较(循环嵌套分支),
2014-10-10
5.1概述(续)
2.数组与数组元素的概念
数组:一组相同类型的数据的集合,数组的名字就称为数 组名。 如定义:float a[10]; a是数组名。 下标变量(或数组元素):数组中的每个数据用下标进行 区分,这些变量称为下标变量或数组元素。 如:a[0]、a[1]…a[i]。 每个数组元素相当于一个简单变量,数组的类型也就是该 数组的数组元素的数据类型。 数组属于构造类型。构造类型的数据是由基本类型数据按 一定规则构成的。
91.5 34.5 67.5 72.0
84.0
score[0]
score[1]
score[2] score[3] score[4]
组如 范果 围引 会用 破的 坏数 其组 他元 变素 量超 的出 值数 。
5.2.3 一维数组的初始化
初始化:在定义数组时给数组元素赋初值。
1.在定义数组时,对全部数组元素赋初值 例如:int a[5]={0,1,2,3,4}; 此时可以省略数组长度,例如:int a[ ]={0,1,2,3,4}; 2.在定义数组时,对部分数组元素赋初值 例如:int a[5]={1,2,3};系统为其余元素赋 0 。 3.当初值的个数多于数组元素的个数时,编译出错 例如: int a[5]={0,1,2,3,4,5};
vb第五章 数组
5.2 数组的基本操作
VB不允许对数组整体操作,例如: Dim A(2,3) As Integer A=2 不允许! 只能对数组元素进行操作,例如: A(1,1)=1 A(1,3)=2 A(2,2)=A(1,1)*2+A(1,3)
25
一、数组元素的赋值
1、用赋值语句给数组元素赋值 例如:A(1,1)=1 A(1,2)=5 2、通过循环语句给数组元素赋值 例如: For I=1 To 10 A(I)=Int(100*Rnd)+1 Next I 该循环语句产生10个100以内的随机整数,存 入数组A中。
22
For Each –Next举例(一维数组的使用) P90例
运行结果: Option base 1 14 21 28 35 42 49 Private Sub Form_Click() 56 63 Dim A(12) As Integer, V As Variant 70 77 84 91 Dim I%, Js% Js = 0 Js = 14 For Each V In A For I = 1 To 12 Js = Js + 1 A(I) = Js Print V; If Js Mod 6 = 0 Then Print Js = Js + 7 输出每行 Next V Next I 6个元素 Print End Sub
数组是具有相同数据类型的多个 值的集合,数组的所有元素按一定顺 序存储在连续的存储单元中。
14
一维数组的结构
逻辑结构 内存的存 放次序
StrA(0) StrA(1) StrA(2) StrA(3) StrA(4) StrA(5) StrA(6) StrA(7) StrA(8)
存储结构
第5章 数组
说明
► “类型说明符”、“数组名”及“常量表达
式”的含义与一维数组中的相关定义相同。 ► 二维数组中有两个下标,每一维的下标都 是从0算起。
第16页
共49页
5-2-2 二维数组元素的引用
► 二维数组元素的引用格式为: ► 数组名[行下标表达式][列下标表达式]
第17页
共49页
说明
► 字符数组的定义 ► 字符数组的初始化 ► 字符数组的引用
► 字符串和字符串结束标志
► 字符数组的输入输出
► 字符串处理函数
► 字符数组的应用
第23页 共49页
5-3-1 字符数组的定义
► 字符数组的定义与前面介绍的数值数组的
定义类似。
第24页
共49页
5-3-2 字符数组的初始化
► 逐个字符赋值 ► 用字符串对字符数组赋初值
第42页 共49页
5-4 程序案例
► 筛选完成后,筛子中剩下的即为素数。 ► #include <stdio.h> ► main() ►{
► ►
int i,a[100]; /*筛子数组*/ int i,n=0; /*n为素数个数,用于输出格 式控制*/ ► int minp,doub; /* minp为筛选种 子,doub为倍数*/ ► for(i=0;i<100;i++) /*建立筛子*/
第27页
共49页
5-3-3 字符数组的引用
► 字符数组的引用和前面几节数组的引用没
有什么区别,也是通过对数组元素的引用 实现的,每次得到一个字符,只是要注意 数据元素的类型现在是字符型。
第28页
共49页
5-3-4 字符串和字符串结束标志
第5章-数组ppt课件(全)
③执行粘贴命令(Ctrl+V),将显示一个对话框,询 问“已经有一个控件为’Shape1’,是否创建控 件数组?”
④选择“是”,窗体左上角将出现一个控件,它就 是控件数组的第二个元素。
⑤执行粘切命令(Ctrl+V),建立控件数组的其它元 素。将其放在合适的位置并可用菜单栏的“格式”
外,还用到列表框(Llistbox)控件,这个控件及其 相关的内容将在本章作详细的讲解。 (2)编写代码时出现的 Dim Name(n) as string属于 数组的定义,具体相关数组的使用及有关概念是本 章的主要内容之一。 (3)排序交换数据时,应让姓名和成绩同时交换,若 只交换成绩,则最终结果会张冠李戴。
对其进行设置。
(2)编写代码
在窗体中只放置控件数组,而要输入对应的 标号需通过print方法来实现,对于Shape1控件 数组中各元素的形状由Shape控件的Shape属性 来完成,形状的填充由Shape控件的FillStyle属 性实现,具体的过程如下:
Private Sub Form_Click()
(2)编写代码使用了控件数组Shape1,注意掌握 创建数组控件的方法的使用,对于建立控件数组 的另一方法将在后面介绍。
5.2 数组
VB中将具有相同名字、不同下标值的一组变量称为 数组。数组中的每个变量称为数组元素或下标变量。可用 数组名和下标唯一地标识一个数组元素,如Score(5)就表 示数组名为Score的数组中下标为5的数组元素。一个数 组如果只用一个下标就能确定一个数组元素在数组中的位 置,则称为一维数组,而由两个或多个下标所组成的数组 称为二维数组或多维数组。在其它语言中数组用来存储相 同类型的数据,但是在VB中数组可用来存放不同类型的 数据。
《C语言程序设计》课件 第五章 数组
a(5948)
a[2](5964) a[1](5956) a[0](5948) 图 5-10
a[2][1] (5968) a[2][0] (5964) a[1][1] (5960) a[1][0] (5956) a[0][1] (5952) a[0][0](5948)
return 0;
}
5.1.4一维数组程序举例
3.用选择法对输入的n个学生的单科成绩进行 从小到大排序。
编程思路: 直接选择排序的过程是:首先在所有数据中找出值 最小(最大)的数据,把它与第1个数据交换,然后 在其余的数据中找出值最小(最大)的数据,与第2 个数据交换......依次类推,这样,n个数据经过n-1轮 交换后可得到有序结果。
printf("%3d ",a[i]); printf("\n"); return 0; }
5.1.3 一维数组的初始化 5.1.3 一维数组的初始化
数组初始化常见的格式:
1.用大括号括起来的常量表达式列表,常量表达式 之间用逗号进行分隔: int a[10]={1,2,3,4,5,6,7,8,9,10};
注意:
不要将a[i][j]写成a[i,j],否则编译系统会将逗号分隔 符作为逗号运算符处理,即将a[i,j]视为a[j]。
5.2.2二维数组元素的引用
可以将二维数组看成是特殊的一维数组。
例如,二维数组a[3][2]可以看成是长度为3的一维数组, 所含的3个数组元素分别为:a[0]、a[1]、a[2]
for(i=0;i<3;i++) for(j=0;j<5;j++)
第五章 判断题-数组
第五章判断题1.下标用于指出数组中某个元素位置的数字。
()2.把数组中元素按某种顺序排列的过程叫做查找。
()3.确定数组中是否含有某个关键字的过程叫做排序。
()4.一个数组可以存放许多不同类型的数值。
()5.数组的下标通常是float型。
()6.数组的某个元素被传递给一个方法并被该方法修改,当被调用方法执行完毕时,这个元素中含有修改过的数值。
()7.数组可以声明为任何数据类型。
()8.数组由具有一名字和相同类型的一组连续内存单元构成。
()9.在数组声明中可以用等号及一个逗号分隔的初始值表初始化数组元素,该数组大小只能有用户来决定。
()10.将一个数组传递给一个方法,必须加在数组名后加方括号。
()第五章选择题1.线性表和表可以存储在▁▁中。
A.数组B.堆栈C.文件D.字符串2.数组元素之所以相关,是因为它们具有相同的▁▁。
A.名字B.类型C.下标D.地址3.二维数组使用几个下标。
A.1B.2C.3D.44.请看下面的程序段:public class Person{static int arr[] = new int[10];public static void main(String a[]) {System .out .println(arr[1]);}}下面说法正确的是:A.当编译时会发生错误B.编译不会发生错误但执行是会发生错误C.输出结果为0D.不会输出结果5.请看下面的程序段:public class Person{int arr[] = new int[10];public static void main(String a[]) {System .out .println(arr[1]);}}下面说法正确的是:A.当编译时会发生错误B.编译不会发生错误但执行是会发生错误C.输出结果为0D.不会输出结果6.下面哪个选项正确的声明一个字符型数组:A.char str[]B.char str[][]C.String str[]D.String str[10]7.下面那一个选项正确创建一个空的含有6个元素的字符数组:A.String s[6];B.String [6]s;C.String s[ ]={“”,””,””,””,””,””};D.String s[ ]=new String[6];For(int m=0;m<6;m++) { s[m]=””;}E. String s[ ]=new String[6];For(int m=0;m<6;m++) { s[m]=null;}8.请看下面的程序段:public class MyClass {public static void main(String arg[ ]) {int arr[ ]= new int[3];System .out .println(“it is “+ arr[1]);}}当编译和执行这段代码时会出现:A.有一个编译错误为“possible reference before assignment”B.有一个编译错误为“illegal array declaration syntax”C.有异常出现为“NullPointerException”D.正确执行并且输出09.请看下面的程序段public class Person{String name;int age;public Person(String n,int a){ name=n;age=a;}public static void main(String arg[ ]){//point x}}下面选项可以添加到//point x处:A.Person p[ ]=new Person[3];P[1]=new Person(“user1”;24);B.Person p[ ];P=new Person[3];P=new Person(“user2”;56);C.Person p[ ]={ new Person(“user1’,34),(“user2”,34)}D.Person p[ ]=new Person{(“user1’,34),(“user2”,34)}10.请看下面的程序段public class Test{String s;int m;public Test(String t ,int n){s=t;m=n;}public static void main(String arg[ ]){Test t[ ]={ new Test(“abc”,3);new Test(“ddf”,23) };//point x}}下面选项可以添加到//point x处:A.System .out .println(“the value is”+t[3].s);B.System .out .println(“the value is”+t[2].m);C.System .out .println(“the value is”+t[1].s);D.System .out .println(“the value is”+t[1].m);第五章程序设计题1.编写程序,接受用户输入的若干字符串,并按字典排序输出。
第5章 数组
练
习
练习5-3:从键盘输入10个整数,将其存入数组a中,再输
入一个随机值k,然后在数组中查找k在数组a中出现的次 数。
练习5-4: 从键盘输入10个整数,分别统计其中正数、负
数和0的个数。
5.3 二维数组
5.3.1二维数组的定义 二维数组定义的一般形式为: 类型名 数组名[常量表达式1][常量表达式2];
5.2 一维数组
5.2.5一维数组的应用 for(i=0;i<9;i++) { for(j=0;j<9-i;j++) /*进行9次循环,实现9轮比较*/ /*在每一轮比较中,进行9-i次比较*/
{ if(a[j]>a[j+1]) /*相邻两个数比较*/ { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } printf("The sorted number:"); for(i=0;i<10;i++) printf("%8d",a[i]5一维数组的应用
原始 数据 8 6 9 7 2 8 6 9 7 2
第二趟比较 3次 第三趟 比较2次
第四 趟比 较1次
第一趟比较4次
排序 后的 数据
6 8 9 7 2
6 8 9 7 2
6 8 7 9 2
6 8 7 2 9
6 8 7 2 9
6 8 7 2 9
6 7 8 2 9
第5章
数组
信息学院计算机基础组
本章主要内容:
1. 一维数组 2. 二维数组 3. 字符数组 4. 字符串处理函数 5. 用文件处理数据
5.1 引例
数据结构讲义第5章-数组和广义表
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改为1行不行? 改为1行不行?
就是对array1指向的内存的 个字节进行赋值 就是对array1指向的内存的20个字节进行赋值,每个 指向的内存的20个字节进行赋值, 都用ASCII为 的字符去填充,转为二进制后, 都用ASCII为1的字符去填充,转为二进制后,1就是 00000001,占一个字节 一个int元素是 字节, 00000001,占一个字节。一个int元素是4字节,合一起 占一个字节。 元素是4 就是1000000010000000100000001, 就是1000000010000000100000001,就等于 16843009,就完成了对一个int元素的赋值了 16843009,就完成了对一个int元素的赋值了。 元素的赋值了。
字符数组之间 不能相互赋值
strcpy(字符数组1,字符数组2):2复制1 strcpy(字符数组1 字符数组2):2复制1 字符数组
字符串拷贝函数: 字符串拷贝函数 char s1[10],s2[]=“hello”; strcpy(s1,s2); 将s2中的字符串 中的字符串 strcpy(s1,s2) √ 赋给s1 赋给
直到不相同字符或‘ 为止 直到不相同字符或‘\0’为止
向函数传递一维数组
假设定义了一个称为scores的一维整型数组, 假设定义了一个称为scores的一维整型数组,6 scores的一维整型数组 个数组元素, scores传给一个称为 传给一个称为print_it() 个数组元素,把scores传给一个称为print_it() 的函数。 的函数。 调 注意 用:print_it(scores) 函数定义: 函数定义:void print_it(int scores[6]) 或:void print_it(int scores[]) 传递一维数组时,一维元素数目可省略。 传递一维数组时,一维元素数目可省略。
5.1 数组的概念
变量x 变量x只能存放当前 学生的成绩,不能保存; 学生的成绩,不能保存; 人数统计困难
从键盘上输入20个学生的成绩, 从键盘上输入 个学生的成绩,求平 个学生的成绩 均分,并统计高于平均分的人数? 均分,并统计高于平均分的人数?
解决方法:数组 解决方法: 简化程序
定义数组 cj[20]
二、用单个字符串常量
char c[]="I am happy"; char c[30]="I am happy"; 区别-长度不同 区别 长度不同 长度可省略或给定
字符串结束符 ‘\0’自动添加 自动添加 6 7
char s1[]={’h’,’a’,’p’,’p’,’e’,’n’}; char c1[]="happen";
第五章 数组
5.1 5.2 5.3 5.4 数组概念 一维数组 二维数组 字符数组
一组数据 遵循一定规则
本节内容复习
知识点】 【知识点】 什么是数组? 什么是数组? 一维数组的定义和存储? 一维数组的定义和存储? 一维数组元素的输入/输出及初始化 一维数组元素的输入 输出及初始化 的方法? 的方法?
C[0] C[1] C[2] C[i] C[18] C[19]
50 67 80 … 76 90
每个数组元素cj(i) 每个数组元素cj(i) 能保 存当前输入学生的成绩; 存当前输入学生的成绩; 可统计高于平均分的人数
什么是数组? 什么是数组?
处理批量数据
★ 特点 是具有相同数据类型的多个变量集合 多个变量集合。 ①:是具有相同数据类型的多个变量集合。 各元素在内存中存放是有先后顺序 先后顺序的 ②: 各元素在内存中存放是有先后顺序的。
元素下标越界不报错
一维数组元素的初始化 int a[5]={1,2,3,4,5};
1 a[0] 2 a[1] 3 a[2] 4 a[3] 5 a[4] 按照书写顺序 可以不指定数组 长度
int a[ ]={1,2,3,4,5}; int a[5 ]={1,2};
允许部分赋值,其余为0 允许部分赋值,其余为0
memset(参数 memset(参数1,参数2,参数3):一字节一字 参数1 参数2 参数3):一字节一字 节地把整个数组设置为一个指定的值 把整个数组设置为一个指定的值。 节地把整个数组设置为一个指定的值。 参数1 数组的起始地址。 参数1:数组的起始地址。 参数2 设置数组每个字节的值。 参数2:设置数组每个字节的值。 参数3 数组的长度。 参数3:数组的长度。 #include<memory.h>
字符数组元素的使用 char c[10]; ; c[0]='d'; for (i=1;i<10;i++) c[i]=c[i-1]+2;
下标从0开始 下标从 开始
字符数组元素的输入 char a[20]; cin>>a; ★ cout<<a;
读取字符,直到遇到“空格” 读取字符,直到遇到“空格” 回车符” 和“回车符”为止 用数组名实现
字符串处理函数-引入string.h 字符串处理函数-引入string.h
Happy new yearto you!
比较 复制 长度 连接
strlen(字符数组名):字符个数 strlen(字符数组名):字符个数 字符数组名):
11
不包括结 束符‘ 束符‘\0’
s1=“hello”; s2=s1;
4 int age[ ]={1,2,6,10,23,24}() (
//可省略数组大小。 可省略数组大小。 可省略数组大小
5. int a[10]=1。 () 。
//不能给数组整体赋值 不能给数组整体赋值
一维数组元素的输入输出
int a[10]; a[10];
for (i=0;i<10;i++) cin>>a[i]; 输入
思考? 思考? 输入: 输入:how do you 出或 数组名实现 用数组名实现
char c[20]=“hello”; cout<<c; ★ cout<<“hello”;
二维数组 行元素表示
char c[3][10]={“who”,”am”,”i”}; for(int i=0;i<3;i++) … cout<<c[i]<<endl; ★
循环变量 兼做下标
for (i=0;i<10;i++) cout<<a[i]<<endl; 输出
运行结果-思考? 运行结果 思考? 思考
i=3,s=0+a[3]*1=4 i=2,s=4+a[2]*10=34 i=1,s=34+a[1]*100=234 i=0,s=234+a[0]*1000=1234
一维数组 int a[6] 75 a[0] 78 a[1] 83 a[2] 72 a[3] 69 a[4] 63 a[5]
5.2 一维数组
一维数组的定义
[ ]是数组标志 ]是数组标志
int
类型说明 数组名 a[0] a[1]
a[6];
常量表达式 a[6]
a[2]
a[3]
a[4]
a[5]
下标从0开始 下标从 开始
数组定义-思考? 数组定义 思考? 思考
错误
定义: 数组名[常量表达式]; 定义:数据类型 数组名[常量表达式];
一维数组元素的表示
数组元素的引用: 数组元素的引用: int a[6];
a[0] a[1] a[2] a[3]
数组名[下标] 数组名[下标]
a[4] a[5]
a[0]=2;
a[1] = a[2]+a[4]*2
运行结果-思考? 运行结果 思考? 思考
a[0]=4 a[1]=3 a[2]=2 a[1]=1 4321
从键盘上输入10个整 从键盘上输入 个整 求出最大值, 数,求出最大值,最 小值和平均值。 小值和平均值。
编写程序
假设
数组的大小和数组越界 sizeof() 返回传递给它的数据类型所占用内存 的字节数。 的字节数。
strcpy(s1,”hello”) √
S2中的‘\0’也拷贝 中的‘ 也拷贝 中的
If(s1==s2) cout<<“s1=s2”
字符串之间不 能用关系运算 符比较
strcmp(字符串1,字符串2):比较 strcmp(字符串1 字符串2):比较 字符串
int m=strcmp("Hello","here"); int n=strcmp("Hello",“Hello w"); n=strcmp("Hello", Hello p=strcmp(“zello","here"); int p=strcmp( zello","here");
例: 一个10个 一个10个 整数的数组 (34,91,3,56,2 9,93,56,12,88 ,72)。 ,72)。 找出最小数和 其下标, 其下标,并在 主函数中打印 最小数和下标. 最小数和下标.
1、 int age[5]={1,2,3,4,5,6};() 、 (
//初始化值个数多于数组元素个数 初始化值个数多于数组元素个数
判断? 判断?
2、int age[5]={12,10,15} () 、
//可少于 个 可少于5个 可少于
3、int age[5]={1,,2,3,4};() 、 ()
//不能通过跳过逗号的方式省略数组元素值 不能通过跳过逗号的方式省略数组元素值
5.5 字符数组-处理字符串问题 字符数组-
字符数组的定义
char a=“Z”;√ char a=“china”; ×