第六章 数组(最终版)
C++程序设计 第六章 数组

C++程序设计第6章数组单个变量只能存放一个数据值。
当程序中要处理一组相同类型、彼此相关的一组数据时,单个变量就不适合了,就需要一种特殊的数据结构来处理,这就是数组。
数组(array)是一种派生类型。
一个数组能同时存放多个数据值,并能对每个数据进行访问。
本章将介绍一维数组、二维数组和字符数组的定义及使用。
6.1 一维数组一个数组(array)是由相同类型的一组变量组成的一个有序集合。
数组中的每个变量称为一个元素(element),所有元素共用一个变量名,就是数组的名字。
数组中的每个元素都有一个序号,称为下标(index)。
访问一个元素就可以用数组名加下标来实现。
数组必须先定义后使用。
6.1.1 一维数组的定义一维数组就是具有一个下标的数组。
定义一个数组有3个要素:类型、名称与大小。
语法格式为:<数据类型> <数组名> [<常量表达式>]其中,<数据类型>确定了该数组的元素的类型,可以是一种基本数据类型,也可以是已定义的某种数据类型。
<数组名>是一个标识符,作为数组变量的名字。
方括号中的<常量表达式>必须是一个正整型数据,其值为元素的个数,即数组的大小或长度。
注意这里的方括号[]表示数组,而不是表示可缺省内容。
例如,下面定义了三个不同类型的数组:int a[5]; //定义了一个int数组afloat b[20]; //定义了一个float数组bdouble c[5]; //定义了一个double数组c对于上面数组a,元素类型为int,a是数组名,方括号中的10表示数组的长度,即该数组包含了5个元素,分别是a[0]、a[1]、a[2]、a[3]、a[4]。
如果一个数组有n个元素,那么数组中元素的下标从0开始到n-1。
具有相同类型的数组可以在一条说明语句中定义。
例如:int a1[5], a2[4]; //同时定义两个整型数组具有相同类型的单个变量和数组也可以在一条语句中定义。
完整版第6章数组

第6章数组6.1怎样定义和引用一维数组6.1.1怎样定义一维数组一般格式:类型数组名[常量表达式]; 如: int a[10];说明:(1) 数组名的命名规则遵循C 语言的标识符;(2) 常量表达式,用来指定该数组中元素的个数,也就是该数组的长度。
该长度必须在这里是一个常量表达式(数字常量、符号常量) ,不能是变量。
由 于前面已经指定了类型,指定了元素个数后,该数组一共占用的空间大小就确定 了,^口:上例,a 是int 型,每个int 型在VC 中占4字节,而后面又定义了 10 个元素,所以,a 共占用了 4*10=40个字节的空间;(3) 可以使用sizeof 运算来求出某个数组占用了多少空间; 特别强调,其中常量表达式不能是变量,如:int n=10;int a[n];//错误,因为n 是变量 #defi ne N 10 int b[N]; //正确,因为N 是符号常量 int c[N+3]; //正确的,因为N+3是常量表达式对于以下定义: int a[10];那么,系统就会在内存中划出一片存储空间,女口 右图:显然,每个元素在内存中都是连续的,从而可以 根据上一个元素的地址,来计算出下一个元素的地址, 假设a 的第0个元素存在1000地址上,那么,a[5]的 地址:Add (a[0])+5*4=1020。
而对 a[i]的地址:Add (a[i])=Add (a[0]+i*4)(4) 数组定义后,元素的排列是从a[0]开始的,因此定义的int a[10] 中, 只有a[0]~a[9],并不存在a[10]这个元素。
(5) 数组定义后,其中的每个元素的值都是不确定的(就是不知道值为多 少,也可以说是随机的),如果想要在定义时就有初值,可以有两种方法:方法一:用static 来修饰,那么,该数组中的每个元素都会被初始化为 0: static int b[10]; //数组b 中的10个元素每个值都是010001004 100810201036int a[10]; //数组a中的10个元素值不确定方法二:在定义时,同时给出值,如:int c[10]={1,2,3}; // 给出了3 个值如果所给的值比数组元素少,那么后面的每个元素都会自动初始化成0,如上面的 c 数组,后面的c[3]~c[9] 都是0(6)前面第 4 点说了,定义的a[10] 的元素是从a[0]~a[9] ,没有a[10] 这个元素,如果在程序中引用了a[10],实际上是一种“越界错误”,但是在VC中,一般还发现不了。
C++课件第六章数组

解决方法
在使用数组之前,应该为其所有元素 分配初始值。可以使用循环来遍历数 组并为每个元素赋值。同时,也可以 考虑使用标准库中的容器类,如 std:vector或std:array,它们可以自 动管理元素的初始化和销毁。
数组下标从0开始还是从1开始
总结词
详细描述
在C中,数组的下标从0开始而不是从 1开始。
C++课件第六章 数 组
目录
CONTENTS
• 数组的概述 • 数组的声明与初始化 • 数组的操作 • 数组的应用 • 数组的常见错误与注意事项 • 练习题与答案
01
数组的概述
数组的概述
• 请输入您的内容
02
数组的声明与初始 化
一维数组的声明与初始化
总结词
一维数组是具有线性结构的数组,可以通过指定数组大小来 声明和初始化。
插入排序
将数组分为已排序和未排序两部分,初始时已排序部分包含一个元素,之后从未排序部分 取出元素,并在已排序部分找到合适的插入位置插入,并保持已排序部分一直有序。重复 此过程,直到未排序部分元素为空。
数组在查找算法中的应用
线性查找
从数组的第一个元素开始,逐个比较,直到找到目标元素或遍历完整个数组。
详细描述
在C中,一维数组的声明需要指定数组的大小,例如int array[10]表示一个包含10个整数的数组。可以通过指定初始 值来初始化数组,例如int array[5] = {1, 2, 3, 4, 5}。如果没 有指定初始值,数组将自动被初始化为0或空值。
二维数组的声明与初始化
总结词
二维数组是具有矩阵结构的数组,可以通过指定行数和列数来声明和初始化。
详细描述
在C中,二维数组的声明需要指定行数和列数,例如int array[3][4]表示一个包含3行4列的二维数组。可以通过指 定初始值来初始化二维数组,例如int array[2][3] = {{1, 2, 3}, {4, 5, 6}}。如果没有指定初始值,数组将自动被初 始化为0或空值。
F第6章数组

2
3
4 100 110 200 210
READ(*,*) NS, S GOTO 2 本题要点: ENDIF 设置一个存放学生 WRITE(*,100) 号与成绩的数组 WRITE(*,110)((T(I,J), J=1,2), I=1,N) WRITE(*,200) DO 4 I=1, 4 WRITE(*,210) I, NUM(I) CONTINUE FORMAT(5X,’STUDENT NUM’, 4X, ‘LEVEL’) FORMAT(8X, I6, 8X, I2, ‘L’) FORMAT(5X, ‘LEVEL’, 6X, ‘NO. STUD’) FORMAT(7X, I2, ‘L’, 8X, I6) END
6.1 引言
前几章研究了对单个数的处理,那么对一 批数据如何处理?例如人口普查,大型方程 组的求解,图象处理等等,都涉及到大批量 “数”的处理和“数”的组织。 例1,在六万人口区进行人口普查,统计各 年龄段人数。
I=1 20 If (I <= 60000) Then Read(*,*) AGE If AGE = 1 Then A1 = A1 + 1 If AGE = 2 Then A2 = A2 + 1 ... ... If AGE = 110 Then A110 = A110 + 1 I=I+1 有110 Goto 20 行, Endif 太冗 长 ... ...
7 6 4 10
第二轮
20 30
…….. DO 30 I=1, 19 K=20-I DO 20 J=1, K IF(A(J) .GT. A(J+1)) THEN TEMP=A(J) A(J)=A(J+1) A(J+1)=TEMP ENDIF CONTINUE CONTINUE WRITE(*,1010) ……..
C语言 第六章 数组

6
6.1 排序问题
3. 初始化
类型名 数组名[数组长度]={初值表}; 初值表中依次放着数组元素的初值。例如: int a[10]={1,2,3,4,5,6,7,8,9,10}; 静态存储的数组如果没有初始化,系统自动给所有的数组元素赋0。 即 static int b[5]; 等价于 static int b[5]={0,0,0,0,0}; 初始化也可以只针对部分元素,如 static int b[5]={1,2,3}; 只对数组b的前3个元素赋初值,其余元素的初值为0。又如 int f[20]={0,1}; 对数组f的前两个元素赋初值,其余元素的值 不确定。
18
6.2 矩阵中最大值的位置
4. 使用二维数组编程
例7:定义一个3*2的二维数组a,数组元素的值由下式给 出,按矩阵的形式输出a。a[i][j]=i+j(0≤i ≤2, 0≤j ≤1), 见文件p131ex7-6.cpp
i
j
第1次 第2次 第3次 第4次 第5次
第6次
0 0 1 1 2
2
0 1 0 1 0
9
6.1 排序问题
4. 使用一维数组编程
例4:输入一个正整数n(1<n≤10), 再输入n个整数,将它们存入 数组a中。 ① 输出最小值和它所对应的下标。 ② 将最小值与第一个数交换,输 出交换后的n个数。 数组的长度在定义时必须确定, 如果无法确定需要处理的数据 数量,至少也要估计其上限, 并将该上限值作为数组长度。 因为n ≤10,数组长度就取上 限10。此外,如果用变量 index记录最小值对应的下标, 则最小值就是a[index]。 见p124ex7-4.cpp
8
6.1 排序问题
4. 使用一维数组编程
第6章 数组

数组的声明- 6.2 数组的声明-二维数组
• 二维数组即下标个数为 的数组,其声明形式为: 二维数组即下标个数为 的数组, 声明形式为 即下标个数为2的数组 •
数组名[常量表达式 常量表达式2]; 常量表达式1][常量表达式 数据类型 数组名 常量表达式 常量表达式 例如,如果要存储60名学生 门课程的成绩, 名学生3门课程的成绩 例如,如果要存储 名学生 门课程的成绩,就可 以声明一个二维数组: 以声明一个二维数组: float score[60][3]; 或 const int row = 60, col = 3; float score[row][col]; 二维数组可以看做一个二维表(如图6-2所示 所示), 二维数组可以看做一个二维表(如图 所示), 因此,通常将数组中的第1个下标 即常量表达式1) 个下标( 因此,通常将数组中的第 个下标(即常量表达式 ) 称为行下标 行下标, 个下标( 称为行下标,第2个下标(即常量表达式 )称为列 个下标 即常量表达式2)称为列 下标。如score[row][col]中,row为行下标,col为 下标。 中 为行下标, 为 为行下标 列下标。 列下标。
比如,要存储60名学生 门课程的成绩, 名学生3门课程的成绩 比如,要存储 名学生 门课程的成绩,也可以 采用如下形式的一维数组: 采用如下形式的一维数组: float score[180]; 该一维数组长度为180,所以可以用来存储60名 该一维数组长度为 ,所以可以用来存储 名 学生*3门课程 门课程=180份成绩信息。 份成绩信息。 学生 门课程 份成绩信息
存储和分析的情况, 存储和分析的情况,而仅使用先前所学习的基本数 据类型来解决这类问题会非常烦琐。 据类型来解决这类问题会非常烦琐。 比如要对一个班中50名学生的成绩求平均值,就需 比如要对一个班中 名学生的成绩求平均值, 名学生的成绩求平均值 要定义50个变量 个变量score1, score2, …, score50来保存这 要定义 个变量 来保存这 50名学生的成绩,然后再通过计算 名学生的成绩, 名学生的成绩 (score1+score2+…+score50)/50得到平均成绩。如 得到平均成绩。 … 得到平均成绩 果求10000名儿童的平均体重,这种方法的编程工 名儿童的平均体重, 果求 名儿童的平均体重 作量就会非常大。 作量就会非常大。
C++课件 第六章 数组讲课稿

• 定义的一般形式: 存储属性 数据类型 数组名[常量表达式][常量
表达式]… 常量表达式:常量或符号常量,其值必须为正,
不能为变量 !如:int n=5;int a[n];这样定义是错 误的,如下为正确的:int a[10],b[5][4]; char name[8], ch[2][3]; static float x[8*2+1], table[2][3][4];
f[i] = f[i-1] + f[i-2]; for(i=0; i<20; i++)
{ if (i%5 == 0) cout<<endl;
cout<<setw(12)<<f[i]; } }
【例】以下程序的运行结果 是什么?
#include <iostream.h> void main() {int a[][3]={{1,2,3},{4,5},{6},{0}};
Байду номын сангаас 【例】void main()
{int a[]={1,2,3,4,5,6}; static int b[6]={2,3,0,4}; int i;
结果: a=1,b=2
sum(int,int,int);
a=2,b=3
for (i=0;i<6;i++) {sum(a[i],b[i],i);
a=3,b=0
C++课件 第六章 数组
问题的引入
例:输入10个学生某门学科的成绩,求平均成绩。
开始
1、当读入下一分数时,前一分数值是否还能找到? 2、如何将低记于数平器均i=成1、绩总的分分z数f=打0 印出来?
C++课件第6章数组

C++课件第6章数组介绍了数组的概念、使用方法以及与指针的关系。学习数 组的多种用途和技巧,让你的程序设计更加高效和灵活。
一维数组
定义
了解一维数组的概念和声明方法。
遍历
掌握一维数组的遍历方法和技巧。
操作
学习如何对一维数组进行插入、删除和修改操作。
排序
掌握一维数组的排序算法和实现。
二维数组
定义
遍历
了解二维数组的概念和声明方法。
学习如何对二维数组进行遍历操 作。
操作
掌握二维数组的操作技巧和常见 应用。
多维数组
1 定义
了解多维数组的概念和声明方法。
3 操作
掌握多维数组的操作技巧和应用场景。
2 遍历
学习如何对多维数组进行遍历操作。
4 排序
学习多维数组的排序算法和实现。
数组作为参数
1
传递方式
了解数组作为参数的传递方式,如按值传递和按引用传递。
2
使用方法
学习数组作为参数时的使用方法和注意事项。
3
示例
掌握数组作为参数的实例和常见应用。
动态数组
定义
了解动态数组的概念和声明方法。
申请和释放
学习如何在程序运行过程中动态申请和释放内存。
使用方法
掌握动态数组的使用方法和常见问题。
STL中的数组
概述
了解STL中数组的概念和用处。
定义和初始化
学习如何定义和初始化STL中的数 组。
元素的访问
掌握STL数组中元素的访问方法和 技巧。
总结与思考
1 应用场景和注意事项
总结数组在实际应用中的常见场景和注意事项。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例6.3
用冒泡法对10个数排序
动画演示
排序过程: (1)比较第一个数与第二个数,若为逆序 a[0]>a[1],则交换;然后比较第二个数与第三个 数;依次类推,直至第n-1个数和第n个数比较为 止——第一趟冒泡排序,结果最大的数被安置在 最后一个元素位置上。 (2)对前n-1个数进行第二趟冒泡排序,结果使次 大的数被安置在第n-1个元素位置上。 (3)重复上述过程,共经过n-1趟冒泡排序后,排 序结束。
j
j
j
j
kБайду номын сангаас
49 38 27 ] j 49 49 j 38 ] 65 ]
四趟: 13
五趟: 13 六趟: 13
27
27 27
38
38 38
49
49 49
[76
65 65
97
[97 76
65 ]
76 ] [97 ]
计算机科学学院
Ch5_201.c
输入n 个数给a[1] 到 a[n] for i=1 to n-1 k=i for j=i+1 to n a[j]<a[k] 真 k=j
第六章 数组
西安工程大学
本章内容:
6.1 一维数组的定义和引用 6.2 二维数组的定义和引用 6.3 字符数组
请做练习
计算机科学学院
6.1
一维数组的定义和引用
基本数据类型有: 整型 实型 字符型 C语言还提供了构造类型的数据: 数组类型 结构体类型 共用体类型 构造类型数据是由基本类型数据按一定规则组成 的,也称 “导出类型”。 数组是有序数据的集合,数组中的每一个元素属于 同一数据类型,用数组名和下标唯一标识数组元素。
6.2
二维数组的定义和引用
6.2.1 二维数组的定义 二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式]
例如: float a[3][4],b[5][10]; a为3行4列的数组,b为5行10列的数组。
[注意]:不能写成 float a[3,4],b[5,10];
计算机科学学院
C语言对二维数组采用这样的定义方式, 使我们可以把二维数组看作是一种特殊的一维 数组:它的元素又是一个一维数组。 例如:
可以把a看作是一个一维数组,它有3个元 素:a[0]、a[1]、a[2]。每个元素又是一 个包含4个元素的一维数组。可以把a[0]、a[1]、 a[2]看作是3个一维数组的名字。 如图:
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 计算机科学学院
计算机科学学院
二维数组a是由3个元素组成
例 int a[3][4];
a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[2] a[2][0] a[2][1] a[2][2] a[2][3] 行名
每个元素a[i]由包含4个元素 的一维数组组成
在第二种写法中,花括弧中有5个数,系 统就会据此自动定义a数组的长度为5。
计算机科学学院
但若被定义的数组长度与提供初值 的个数不相同,则数组长度不能省略。 例如: 想定义数组长度为10,就不能省略 数组长度的定义,而必须写成 int a[10]={1,2,3,4,5}; 只初始化前5个元素,后5个元素为0。
计算机科学学院
6.2.2
二维数组的引用
数组名[下标][下标]
二维数组元素的引用形式: 二维数组元素的初始化
分行初始化: 按元素排列顺序初始化 例 int a[2][3]={{1,2,3},{4,5,6}}; 例 int a[][3]={1,2,3,4,5}; a[2][3]={1,2,4}; 例 int a[2][3]={1,2,3,4,5,6}; a[][3]={{1},{4,5}}; 例例 int int a[2][3]={{1,2},{4}};
计算机科学学院
数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先 多维数组:最右下标变化最快
int a[3][2]
0 1 2
3 4 5
a[0][0] a[1][0] a[2][0]
a[0][1] a[1][1] a[2][1]
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
6.1.3 一维数组的初始化
对数组元素的初始化可以用以下方法实现:
(1) 在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8, 9};
a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
0
1
2
3
4
5
6
计算机科学学院
[注意]: 不能使用数组元素a[6]。
计算机科学学院
(4) 常量表达式中可以包括常量和符号 常量,不能包含变量。
例如: 下面这样定义数组是不行的: int n; scanf("%d",&n); int a[n];
计算机科学学院
6.1.2
一维数组元素的引用
数组必须先定义,后使用。c语言规定 只能逐个引用数组元素而不能一次引用整 个数组。 数组元素的表示形式为: 数组名 [下标] 下标可以是整型常量或整型表达。例如: a[0]=a[5]+a[7]-a[2*3]
计算机科学学院
#include “stdio.h” void main() { int i,a[10]; for (i=0; i<=9;i++) a[i]=i; for(i=9;i>=0; i--) printf("%d ",a[i]); } 运行结果如下: 9 8 7 6 5 4 3 2 1 0 计算机科学学院
i != k 真 a[i]a[k] 输出a[1] 到 a[n]
计算机科学学院
假
假
#include <stdio.h> void main() { int a[11],i,j,k,x; printf("Input 10 numbers:\n"); for(i=1;i<11;i++) scanf("%d",&a[i]); printf("\n"); for(i=1;i<10;i++) { k=i; for(j=i+1;j<=10;j++) if(a[j]<a[k]) k=j; if(i!=k) { x=a[i]; a[i]=a[k]; a[k]=x;} } printf("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); 计算机科学学院 }
例6.2 用数组求Fibonacci数列前20个数。
0 1 2
3 4 5
1 1 2 3 5 ……...
f[0] f[1] f[2] f[3] f[4] f[5]
19
f[19] 计算机科学学院
main() {
}
int i; int f[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0) printf("\n"); printf("%12d",f[i]); }
计算机科学学院
int c[2][3][4]
0 1 2 3 4 5 6 7 ………...
20 21 22 23
c[0][0][0] c[0][0][1] c[0][0][2] c[0][0][3] c[0][1][0] c[0][1][1] c[0][1][2] c[0][1][3] c[0][2][0] c[0][2][1] c[0][2][2] c[0][2][3] c[1][0][0] c[1][0][1] c[1][0][2] c[1][0][3] c[1][1][0] c[1][1][1] c[1][1][2] c[1][1][3] c[1][2][0] c[1][2][1] c[1][2][2] c[1][2][3]
全部初始化 第一维长度省略初始化 第一维长度省略初始化 部分初始化 部分初始化 全部初始化
1 2 3 4 5 6 1 2 3 4 5 0 4 0 0 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 1 2 0 4 0 0 1 1 2 0 3 0 4 4 5 5 6 0
计算机科学学院
#define SIZE 10 void main() x[SIZE],i,max,min; 6.1.4 { int 一维数组程序举例 printf("Enter 10 integers:\n"); 例6.1 输入 10个整数,找出其中最大值和最小 for(i=0;i<SIZE;i++) 值。 { printf("%d:",i+1); 步骤: scanf("%d",&x[i]); 1. 输入:for } 循环输入10个整数 2. 处理: max=min=x[0]; for(i=1;i<SIZE;i++) (a) 先令max=min=x[0] { x[i] if(max<x[i]) max=x[i]; (b) 依次用 和max,min 比较(循环) if(min>x[i]) min=x[i]; 若max<x[i],令max=x[i] } 若min>x[i], 令 min=x[i] printf("Maximum value is %d\n",max); 3. 输出:max 和min printf("Minimum value is %d\n",min); 计算机科学学院 }