第五章 数组
数据结构第五章 数组与广义表

压缩存储方法:只需要存储下三角 (含对角线)上的元素。可节省一 半空间。
可以使用一维数组Sa[n(n+1)/2]作为n阶对称矩阵A的存 储结构,且约定以行序为主序存储各个元素,则在Sa[k]和矩
阵元素aij之间存在一一对应关系: (下标变换公式)
i(i+1)/2 + j 当i≥j k = j(j+1)/2 + i 当i<j
q = cpot[col];
T.data[q].i = M.data[p].j; T.data[q].j = M.data[p].i; T.data[q].e = M.data[p].e; ++cpot[col]; }
分析算法FastTransposeSMatrix的时间 复杂度:
for (col=1; col<=M.nu; ++col) … … for (t=1; t<=M.tu; ++t) … … for (col=2; col<=M.nu; ++col) … … for (p=1; p<=M.tu; ++p) … …
//对当前行中每一个非零元
处
brow=M.data[p].j;
理
if (brow < N.nu ) t = N.rpos[brow+1];
M
else { t = N.tu+1 }
的
for (q=N.rpos[brow]; q< t; ++q) { ccol = N.data[q].j; // 乘积元素在Q中列号
一、三元组顺序表
对于稀疏矩阵,非零元可以用三元组表示, 整个稀疏矩阵可以表示为所有非零元的三元组所 构成的线性表。例如:
第5章 数组(C++版) 第三节 字符数组和字符串类型02

【分析】 首先要将给定的原文保存在字符数组里。然后,在原文中,从头开始寻找字符A,找 到一个字符A,便将其替换成字符B;继续寻找下一个字符A,找到了就替换,……,直到 将原文都处理完。如下程序只能处理单个字符替换,无法处理单词替换,I U中间只能有 一个空格。getchar()输入的使用方法详见教材的第二章第四节,单词替换详见《信息学 奥赛一本通拓展教程》。 程序如下: #include<cstdio> #include<iostream> using namespace std; int main() { char st[200]; char A,B; int i,n=0; while((st[n++]=getchar())!='\n') //将原文存放在字符数组st中 A=getchar();getchar();B=getchar(); //读取A和B,中间getchar()读空格 for (i=0;i<n;i++) if (st[i]==A) cout<<B; else cout<<st[i]; cout<<endl; return 0; }
#include<iostream> #include<iomanip> using namespace std; int main() { for (char letter='a'; letter<='z'; letter+=2) cout<<setw(3)<<letter; cout<<endl; for (char letter='z'; letter>='a'; letter-=2) cout<<setw(3)<<letter; return 0; }
java教程_第5章 数组

第5章数组什么是数组?数组在实际程序中起到什么作用?数组用来存储数据,类似数据的缓存,是一组有序列的数据集合。
通过本章的学习,可以了解数组如何进行数据存储,并且结合编程实例,掌握数组的设计和操作。
5.1数组概念的引入本节将介绍数组的一些基本概念。
这些概念有助于在以后的编程过程中,更好的使用数组。
5.1.1实例的引入走进一家运动器材店,会看到很多的体育运动器材,有篮球、排球、足球、羽毛球、乒乓球、高尔夫、滑板、健身器材等等。
如果要为这家店作一个数据库系统,首先要建立一个类似于集合的表格,如下所示。
{篮球,排球,足球,羽毛球,乒乓球,高尔夫,滑板,健身器材}在程序开发中,将这种集合形式经过改装,变成了本章要重点讲述的数组,将上述的例子用数组来表示:运动器材{篮球,排球,足球,羽毛球,乒乓球,高尔夫,滑板,健身器材}5.1.2数组的概念数组是具有相同数据类型的数据的集合,例如上一小节中提到的运动器材集合。
相同的数据类型,意味着数组中每个数据都是同一类型数据,或者属于基本数据类型中相同类型的数据,或者属于对象类型中相同类型的数据。
在生活中,一个班级的学生、一个学校的所有人、一个汽车厂的所有汽车等等,这些都可以形成一个数组。
数组如果按照维数来分,分为一维数组、二维数组、三维数组和多维数组等,每一维代表一个空间的数据。
一维数组代表的就是一维空间的数据,例如自然数从1~10。
{1,2,3,4,5,6,7,8,9,10}二维数组代表的就是二维空间的数据,例如在数学中的坐标。
{(1,2),(3,4),(5,6),(7,8)}这里的每一组数据都代表了二维空间中的x和y的坐标值。
三位数组代表的就是三维空间的数据,所谓三维空间就是指立体空间,例如立体坐标。
{(1,2,3),(2,3,4),(3,4,5),(4,5,6),(5,6,7)}这里的每一组数据都代表了三维空间中的(x,y,z)轴的坐标值。
5.1.3用实例说明数组的用处本节重点是说明数组的优点,可能会遇到后面小节讲述的内容,先不要理会。
C语言程序设计第5章数组.ppt

2019/3/19
F
冒泡法排序 (续)
程序如下:
#define N 6 #include "stdio.h" void main( ) {int a[N]; int i,j,t; printf("请输入%d个成绩,用空格隔开:\n",N); for (i=0; i<N; i++) scanf("%d",&a[i]);
2019/3/19
5.2.2 数组元素的引用(续)
2.说明
① 下标从0开始(下界为0),数组的最大下标 (上界)是数组长度减1。 例如: int a[10],i; scanf ("%d",&a[10]); /* 下标越界 */ C编译系统不做越界检查。
2019/3/19
5.2.2 数组元素的引用(续)
【例5-4】用冒泡法(也称起泡法)对输入的一组 成绩按从低分到高分的顺序排序并输出。
例如将6个数:4、7、5、6、8、1按从小到大顺序用冒泡 法排序,方法如下: 在第一趟排序中, 6个数比较了5次,把6个数中 第一趟排序情况如下: 的最大数8排在最后。 4 7 5 6 8 1 第一次 4和7比较,不交换 4 7 5 6 8 1 第二次 7和5比较,交换 457681 第三次 7和6比较,交换 456781 第四次 7和8比较,不交换 4 5 6 7 8 1 第五次 8和1比较,交换 456718
2019/3/19
5.1概述(续)
2.数组与数组元素的概念
数组:是用一个名字表示的一组相同类型的数据的集合, 这个名字就称为数组名。 如定义:float a[10]; a是数组名。 下标变量(或数组元素):数组中的数据分别存储在用下 标区分的变量中,这些变量称为下标变量或数组元素。 如:a[0]、a[1]…a[i]。 每个下标变量相当于一个简单变量,数组的类型也就是该 数组的下标变量的数据类型。 数组属于构造类型。构造类型的数据是由基本类型数据按 一定规则构成的。
《C语言程序设计》第5章数组、字符串、指针

相当于声明了5个整型变量
说明: ① 数组的所有元素的数据类型都是相同的。 ② 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同: int a; float a[10]; 是错误的。
③ C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。
④ 不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如: int n=5,a[n]; 是错误的。
二维数组在内存的存放顺序是“先行后列”
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0]
…
a[2][3]
5.3.2 二维数组元素的引用
二维数组的元素的引用形式为: 数组名[下标][下标] 使用二维数组的情况举例: 学生多门功课的成绩,如: a[100][3]可以用来记录100个学生3门功 课的成绩。 矩阵,如: a[3][3]可以用来记录3×3的矩阵。一个 数组元素正好存放一个矩阵的元素。
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]); }
C++程序设计:第5章 数组

• 数组元素是组成数组的基本单元。数组元 素也是一种变量。
• 数组元素的一般形式为:
•
数组名[下标]
• 其中的下标只能为整型表达式或为字符型
表达式。
相当于a[5]
• 例如:a[5], a[i+j], a[i++], a[‘A’-60]
• 都是合法的数组元素。 元素也称下标变量。
• 设有:int b[5],a[5]={1,2,3,4,5}; • 如果想要将数组a赋值给数组b,则:
78 99
for (j=1; j<=n-1; j++) for (i=1; i<=n-j ; i++)
第五趟 比较1次 4到位
{ if (a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1];
将小的交换 到前面
a[i+1]=t; }
}
由于元素的序号从0开始,程序可以变动如下:
for (j=0; j<n-1; j++) for (i=0; i<n-1-j; i++) { if (a[i]>a[i+1]) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } }
333 3
665 5 556 4 444 6 777 7 999 9
第一趟 比较5次
9到位
第二趟 比较4次
7到位
第三趟 比较3次
6到位
333 554 445 666 777 999
第四趟 比较2次 5到位
33
总结:
44 55 66
共有6个数
n
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 字符串和字符串结束标志
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
25
数组的初始化
int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 效果: a[0]=0;a[1]=1...a[9]=9;
26
数组的初始化
数组初始化时,{ }中值的个数可以少于元素个数。相当于只给前面部分元素 赋值,而后面的元素,其存储空间里的每个字节都被写入二进制数0:
days += 366;
else
days += 365;
}
if( year%4 ==0 && year%100!= 0 || year%400 == 0)
monthDays[2] = 29;
for(int m = 1; m < month; ++m)
days += monthDays[m];
36
days += date; days -= 22; //2012年1月22日是星期天 cout << days % 7 << endl; return 0; }
30
用数组取代复杂分支结构
#include <iostream> #include <string> //使用string须包含此“头文件”
using namespace std;
string weekdays[] = { //string是字符串类型。可存放字符串常量
"Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday","Sunday" }; //字符串数组
5
倒序问题
接收键盘输入的100个整数,然后将它们按和原顺序相反的顺序输出。 如何存放这100个整数? 定义100个int型变量,n1, n2, n3 ……n100,用来存放这100个整数???!!!! 使用数组!!
6
数组
可以用来表达类型相同的元素的集合,集合的名字就是数组名。
7
数组
可以用来表达类型相同的元素的集合,集合的名字就是数组名。 数组里的元素都有编号,元素的编号叫下标。通过数组名和下标,就能访问 元素。
{
int year,month,date; int days = 0; //从2012-01-22开始过了多少天
cin >> year >> month >> date;
for(int y = 2012; y < year; ++y) {
if( y%4 ==0 && y%100!= 0 || y%400 == 0)
15
数组
int a[100];
a[0] a[1] a[2]
......
a[99]
数组下标从0开始,N个元素的数组,下标从0 至 N-1
数组名a代表数组的地址,假设为p,则变量a[i]的地址就是 p+i*sizeof(int)
16
倒序问题
接收键盘输入的100个整数,然后将它们按和 原顺序相反的顺序输出
for( int i = 2;i <= MAX_NUM; ++i) //开始假设所有数都是素数 isPrime[i] = true;
for( int i = 2;i <= MAX_NUM; ++i) { //每次将一个素数的所有倍数标记为非素数 if( isPrime[i]) //只标记素数的倍数 for( int j = 2 * i; j <= MAX_NUM; j += i) isPrime[j] = false; //将素数 i 的倍数标记为非素数
#include <iostream>
using namespace std;
#define NUM 100 //使用符号常量,便于修改 int a[NUM]; //数组一般不要定义在main里面,尤其是大数组
int main() {
for(int i = 0;i < NUM; ++i)
cin >> a[i];
数组越界
用变量作为数组下标时,不小心会导致数组越界(变量下标值 变为负数,或者太大) 可能引起意外修改其他变量的值,导致程序运行结果不正确 可能试图访问不该访问的内存区域,导致程序崩溃 数组越界的程序,用某些编译器编译后可能可以正确运行,换一 个编译器编译后就运行错误
数组越界
用变量作为数组下标时,不小心会导致数组越界(变量下标值 变为负数,或者太大)
数组越界
用变量作为数组下标时,不小心会导致数组越界(变量下标值 变为负数,或者太大) 可能引起意外修改其他变量的值,导致程序运行结果不正确
数组越界
用变量作为数组下标时,不小心会导致数组越界(变量下标值 变为负数,或者太大) 可能引起意外修改其他变量的值,导致程序运行结果不正确 可能试图访问不该访问的内存区域,导致程序崩溃
2 3 4 5 6 7 8 9 10
空间换时间,加快了计算速度
22
#include <iostream> //筛法求素数 #include <cmath> using namespace std; #define MAX_NUM 10000000 bool isPrime[MAX_NUM + 10]; //最终如果isPrime[i]为1,则表示i是素数 int main() {
int a[10]={0,1,2,3,4}; 只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值
27
用数组取代 复杂分支结构
罗马古城遗址
用数组取代复杂分支结构
有时会用一个数组存放一些固定不变的值,以取代复杂的程序分支结构。
29
用数组取代复杂分支结构
有时会用一个数组存放一些固定不变的值,以取代复杂的程序分支结构。 例:接受一个整数作为输入,如果输入1,则输出“Monday”,输入2,则 输出“Tuesday”……输入7,则输出“Sunday”,输入其他数,则输出 “Illegal”。
int main()
{
int n;
cin >> n;
if( n > 7 || n < 1 )
cout << "Illegal";
else
cout << weekdays[n-1];
return 0;
}
33
用数组取代复杂分支结构
例题: 已知2012年1月25日是星期三,编写一个程序, 输入用“年 月 日”表示的一个2012年1月25日以后的期, 输出该日期是星期几(星期天输出0)。
思路:2012年1月22日是星期天。算出给定日期是从该天起过了x天,然后 输出x%7
33
#include <iostream>
using namespace std;
int monthDays[13] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
第五章
数组
数组的概念
瑞士少女峰
倒序问题
接收键盘输入的100个整数,然后将它们按和原顺序相反的顺序输出。
3
倒序问题
接收键盘输入的100个整数,然后将它们按和原顺序相反的顺序输出。 如何存放这100个整数?
4
倒序问题
接收键盘输入的100个整数,然后将它们按和原顺序相反的顺序输出。 如何存放这100个整数? 定义100个int型变量,n1, n2, n3 ……n100,用来存放这100个整数???!!!!
名字为a的数组,有100个元素,每个元素都是一个int型变量。
T a[ N ]; //T为类型名,如char,double,int等。 //N为正整数或值为正整数的常量表达式。
数组a有N个元素,每个元素都是一个类型为T的变量。 N个元素在内存里是一个挨一个连续存放的。 a数组占用大小总共为 N × sizeof(T)字节的存储空间。
判断一个数n是不是素数,可以用2到 n之间的所有整数去除n, 看能否整除。如果都不能整除,那么n是素数(慢)。
筛法求素数:把2到n中所有的数都列出来,然后从2开始,先划掉n内所有2 的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍 数。最后剩下的数,就都是素数。
20
筛法求n以内素数
21
筛法求n以内素数
判断一个数n是不是素数,可以用2到 n之间的所有整数去除n, 看能否整除。如果都不能整除,那么n是素数(慢)。
筛法求素数:把2到n中所有的数都列出来,然后从2开始,先划掉n内所有2 的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍 数。最后剩下的数,就都是素数。
int a[10]; a[-2] = 5; a[200] = 10; a[10] = 20; int m = a[30];
但运行时很可能会出错!!!
38
数组越界
int a[10];
a[-2] a[-1] a[0] a[1] a[2]
......
a[9] a[10] a[11]
a[-2] = 10; a[11] = 100; 均可能导致程序运行出错!!! 因为可能写入了别的变量的内存空间,或者写入指令的内存空间
T a[ N ]; //T为类型名,如char,double,int等。 //N为正整数或值为正整数的常量表达式。
数组a有N个元素,每个元素都是一个类型为T的变量。 N个元素在内存里是一个挨一个连续存放的。 a数组占用大小总共为 N × sizeof(T)字节的存储空间。