《第5章 数组教学课件PPT.ppt》由会员分享,可在线阅读,更多相关《第5章 数组教学课件PPT.ppt(66页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、完整版教学课件完整版教学课件第5章 数组第五章第五章 数数 组组 第第5 5章章 数组数组u5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用u5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用u5.3 5.3 戴帽成串:字符数组和字符串戴帽成串:字符数组和字符串u5.4 5.4 思维训练:几种重要的算法思维训练:几种重要的算法u5.5 5.5 知识拓展:向函数传递数组知识拓展:向函数传递数组u5.6 5.6 本章小结本章小结4 数组数组是是C C语言中提供的一种专门用来组织批量数据的语言中提供的一种专门用来组织批量数据的数据类型,它可以将性
2、质相同且需要共同参与某项操作的数据类型,它可以将性质相同且需要共同参与某项操作的多个数据有效地组织起来,是一种应用十分频繁且非常重多个数据有效地组织起来,是一种应用十分频繁且非常重要的数据类型。要的数据类型。 所谓所谓数组就是一批同类型数据的有序集合,每个数组数组就是一批同类型数据的有序集合,每个数组在内存中占一片连续的存储空间,用一个统一的数组名和在内存中占一片连续的存储空间,用一个统一的数组名和下标来唯一确定数组中的元素,其中每一个元素通常称为下标来唯一确定数组中的元素,其中每一个元素通常称为下标变量。下标变量。只有一个下标的数组称为一维数组,有二个下只有一个下标的数组称为一维数组,有二个
3、下标的数组称为二维数组,依此类推。标的数组称为二维数组,依此类推。5 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用 5.1.1 5.1.1 一维数组的定义方式一维数组的定义方式 数组作为带有下标的变量,也需要数组作为带有下标的变量,也需要经历定义、初始化和引用经历定义、初始化和引用3 3个阶段个阶段。一维数组定义的一般形式为:一维数组定义的一般形式为: 类型说明符类型说明符 数组名数组名 常量表达式常量表达式 其中:其中: 类型说明符用于说明数组的基类型,即数组中每一个元素的类型,可类型说明符用于说明数组的基类型,即数组中每一个元素的类型,可以是任一种基本数据类
4、型或构造数据类型。以是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符,应符合标识符的书写规定。数组名是用户定义的数组标识符,应符合标识符的书写规定。 方括号中的常量表达式表示数组元素的个数,也称为数组的长度。方括号中的常量表达式表示数组元素的个数,也称为数组的长度。 例如:例如: int a10; /int a10; /* *说明整型数组说明整型数组a a,有,有1010个元素个元素* */ / float score20; / float score20; /* *说明实型数组说明实型数组scorescore,有,有2020个元素个元素* */ / char letter2
5、6; / char letter26; /* *说明字符数组说明字符数组letterletter,有,有2626个元素个元素* */ /6对于数组类型说明应注意以下几点:对于数组类型说明应注意以下几点: 1 1. .允许在同一个类型说明中,说明多个数组和多个变量。允许在同一个类型说明中,说明多个数组和多个变量。如:如: int a,b,c,d,k110,k220int a,b,c,d,k110,k220; 2 2. .方括号中的常量表达式通常取整型常量或整型常量表达方括号中的常量表达式通常取整型常量或整型常量表达式(包括符号常量)。如:式(包括符号常量)。如: #define N 20#def
6、ine N 20 / /* *用此命令行定义符号常量用此命令行定义符号常量N N,方便程序修改,方便程序修改* */ / float scoreN;float scoreN; / /* *正确的定义方式,提倡使用正确的定义方式,提倡使用* */ / C C语言中不允许用变量下标形式对数组进行动态定义。如语言中不允许用变量下标形式对数组进行动态定义。如n n为一个普通变量,定义:为一个普通变量,定义: float scoren;float scoren; 是非法的。是非法的。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用7 3 3. .与其他高级语言(如与其他高级
7、语言(如PASCALPASCAL、BASICBASIC)不同,)不同,C C语言语言中规定数组元素的下标总是从中规定数组元素的下标总是从0 0开始开始,例如,例如int a10int a10;说明整;说明整型数组型数组a a,有,有1010个元素。这个元素。这1010个元素是:个元素是: a0,a1,a2,a3,a4,a5,a6,a7,a8, a9a0,a1,a2,a3,a4,a5,a6,a7,a8, a9; 注意最后注意最后一个元素是一个元素是a9a9,而不是,而不是a10a10,该数组不存在数组元素,该数组不存在数组元素a10a10。 并且特别值得注意的是,并且特别值得注意的是,C C编译
8、器对数组下标越界不作检编译器对数组下标越界不作检查。查。如上述数组不存在数组元素如上述数组不存在数组元素a10a10,但是在程序中不小心,但是在程序中不小心引用了引用了a10a10,程序编译时仍认为是合法的。但程序运行后可,程序编译时仍认为是合法的。但程序运行后可能会出现逻辑错误,因为能会出现逻辑错误,因为a10a10已不是数组中的元素,越界的已不是数组中的元素,越界的操作可能破坏操作可能破坏a9a9后面的数据或程序,要特别引起注意。后面的数据或程序,要特别引起注意。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用8 4 4. .在说明一个数组后,系统会在内存中分
9、配一段连续的空在说明一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素,并且数组名代表首地址。间用于存放数组元素,并且数组名代表首地址。如说明如说明int a10int a10; 则其在内存中的存放形式如图则其在内存中的存放形式如图4-14-1所示:所示: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 图图4-1 4-1 数组数组a a在内存中的存放形式在内存中的存放形式 在内存中一维数组所占用的总字节数为:数组长度在内存中一维数组所占用的总字节数为:数组长度* *sizeof(sizeof(基类型基类型) ),
10、如在如在Turbo CTurbo C环境中,整型数组环境中,整型数组a a所占用的总所占用的总字节数为:字节数为:1010* *2=202=20。从上面可以发现每一个元素都相当于一。从上面可以发现每一个元素都相当于一个整型变量,其中可存放一个整型数值。个整型变量,其中可存放一个整型数值。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用9 5.1.2 5.1.2 一维数组的初始化一维数组的初始化 数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的化是在编译阶段进行的。 初始化赋值的
11、一般形式为:初始化赋值的一般形式为: 类型说明符类型说明符 数组名数组名 常量表达式常量表达式=初值表初值表 其中其中 初值表初值表 中的各数据值即为各元素的初值,各值之间用逗号分中的各数据值即为各元素的初值,各值之间用逗号分隔。例如:隔。例如: int a10= 0,1,2,3,4,5,6,7,8,9 int a10= 0,1,2,3,4,5,6,7,8,9 ; 相当于相当于a0=0a0=0;a1=1a1=1; . a9=9. a9=9; 语言对语言对数组的初始化赋值还有以下几点规定:数组的初始化赋值还有以下几点规定: 1. 1.可以只对部分元素赋初值。可以只对部分元素赋初值。 当当 中值的
12、个数少于元素个数时,只给前面部分元素赋值。例如:中值的个数少于元素个数时,只给前面部分元素赋值。例如: int a10=0,1,2,3,4int a10=0,1,2,3,4; 表示只给表示只给a0a0a45a45个元素赋值,而后个元素赋值,而后5 5个元素自动赋个元素自动赋0 0值。值。 如果想使一个数组中全部元素值为如果想使一个数组中全部元素值为0 0,可以写成:,可以写成: int a10=0 int a10=0; / /* *第第1 1个元素赋值个元素赋值0 0,后面,后面9 9个元素自动为个元素自动为0 0* */ / 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的
13、定义和使用10 2. 2.只能给元素逐个赋值,不能给数组整体赋值。只能给元素逐个赋值,不能给数组整体赋值。 例如给十个元素全部赋例如给十个元素全部赋1 1值,只能写为:值,只能写为: int a10=1,1,1,1,1,1,1,1,1,1;int a10=1,1,1,1,1,1,1,1,1,1; 而而不能写不能写为:为: int a10=1;int a10=1; 3. 3.如给全部元素赋值,则在数组说明中,可不指定数组长度。如给全部元素赋值,则在数组说明中,可不指定数组长度。 例如:例如: int a5=1,2,3,4,5int a5=1,2,3,4,5; 可写为:可写为: int a=1,2
14、,3,4,5int a=1,2,3,4,5; 4. 4.当数组被说明为当数组被说明为静态静态(static(static)或或外部存储类型(即在所有函外部存储类型(即在所有函数外部定义)数外部定义)时,若不赋初值,则在程序编译阶段对数值型数组时,若不赋初值,则在程序编译阶段对数值型数组全部元素赋初值全部元素赋初值0 0,对字符型数组全部元素赋空字符(,对字符型数组全部元素赋空字符(ASCIIASCII码为码为0 0的字符的字符00)。)。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用11 5.1.3 5.1.3 一维数组元素的引用一维数组元素的引用 数组是由若干
15、个元素组成,数组名只能表示整个数组(首数组是由若干个元素组成,数组名只能表示整个数组(首地址),而并不能说明其中某一个元素。如果希望指出具体的地址),而并不能说明其中某一个元素。如果希望指出具体的元素,需要按照下列格式书写:元素,需要按照下列格式书写: 数组名数组名 下标表达式下标表达式 其中数组名是一个已经定义的数组,其中数组名是一个已经定义的数组, 下标表达式下标表达式 的结果应的结果应该是一个介于数组下标取值范围内的整型数值,通常是一个整该是一个介于数组下标取值范围内的整型数值,通常是一个整型表达式(其中可以包含整型常量或已赋值的整型变量)。型表达式(其中可以包含整型常量或已赋值的整型变
16、量)。 数组元素也是一种变量,对数组元素的访问是通过下标来数组元素也是一种变量,对数组元素的访问是通过下标来进行的,进行的,因此,可用循环语句操作数据,这在处理数据时带来因此,可用循环语句操作数据,这在处理数据时带来很大方便。很大方便。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用12 【案例【案例5.1】用数组来处理求用数组来处理求Fibonacci数列问题(具体描述见【案例数列问题(具体描述见【案例3.23】)。】)。#include #define N 40int main() int i; long int fN=1, 1; /*数组初始化,数组初始化,
17、f0及及f1分别为分别为1,其它为,其它为0*/ for(i=2; iN; i+) fi=fi-2+fi-1; /*计算从第计算从第3个月起每月的总兔子对数个月起每月的总兔子对数*/ for(i=0;iN;i+) if(i%5=0) printf(n); /*控制一行输出控制一行输出5个数个数*/ printf(%12ld, fi); printf(n); return 0; 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用13 5.1.4 5.1.4 一维数组程序举例一维数组程序举例 【案例案例5.25.2】某电视台举办青年歌手大奖赛。假设有某电视台举办青年歌手大
18、奖赛。假设有1111个评委参个评委参与评分工作。计算每位歌手最终得分的与评分工作。计算每位歌手最终得分的方法方法是:首先去掉一个最高分和是:首先去掉一个最高分和一个最低分,然后计算剩余一个最低分,然后计算剩余9 9个分数的平均值,所得结果就是选手的最个分数的平均值,所得结果就是选手的最终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。 分析分析:要考虑两个问题:(:要考虑两个问题:(1 1)数据结构:数据结构:程序所要处理的数据如何程序所要处理的数据如何存储和表示。显然选用一维数组来存储比较合适。(存储和表示。显然选用一维数组来
19、存储比较合适。(2 2)算法算法: :根据计算根据计算每位歌手最终得分的方法,关键是如何求出每位歌手所得的最高分和最每位歌手最终得分的方法,关键是如何求出每位歌手所得的最高分和最低分?求最高分可以采用打擂台的方法:先假设第一个得分为最高分(低分?求最高分可以采用打擂台的方法:先假设第一个得分为最高分(即擂主),然后把其他的每个得分依次与最高分(即擂主)进行比较,即擂主),然后把其他的每个得分依次与最高分(即擂主)进行比较,若发现后面的得分高于前面的最高分,则将把最高分修改为后面的得分若发现后面的得分高于前面的最高分,则将把最高分修改为后面的得分(产生新擂主)。如此一直下去。(产生新擂主)。如此
20、一直下去。 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用14 5.1.4 5.1.4 一维数组程序举例一维数组程序举例 【案例案例5.25.2】某电视台举办青年歌手大奖赛。假设有某电视台举办青年歌手大奖赛。假设有1111个评委参个评委参与评分工作。计算每位歌手最终得分的与评分工作。计算每位歌手最终得分的方法方法是:首先去掉一个最高分和是:首先去掉一个最高分和一个最低分,然后计算剩余一个最低分,然后计算剩余9 9个分数的平均值,所得结果就是选手的最个分数的平均值,所得结果就是选手的最终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。终得分。希望编写一个程序
21、,帮助工作人员计算每个歌手的分数。 分析分析:要考虑两个问题:(:要考虑两个问题:(1 1)数据结构:数据结构:程序所要处理的数据如何程序所要处理的数据如何存储和表示。显然选用一维数组来存储比较合适。(存储和表示。显然选用一维数组来存储比较合适。(2 2)算法算法: :根据计算根据计算每位歌手最终得分的方法,关键是如何求出每位歌手所得的最高分和最每位歌手最终得分的方法,关键是如何求出每位歌手所得的最高分和最低分?求最高分可以采用打擂台的方法:先假设第一个得分为最高分(低分?求最高分可以采用打擂台的方法:先假设第一个得分为最高分(即擂主),然后把其他的每个得分依次与最高分(即擂主)进行比较,即擂
22、主),然后把其他的每个得分依次与最高分(即擂主)进行比较,若发现后面的得分高于前面的最高分,则将把最高分修改为后面的得分若发现后面的得分高于前面的最高分,则将把最高分修改为后面的得分(产生新擂主)。如此一直下去。(产生新擂主)。如此一直下去。#include #include #define NUM 11 #define NUM 11 / /* *评委人数评委人数* */ /int main( )int main( ) float scoreNUM, sum; float scoreNUM, sum; / /* *一维数组一维数组scorescore用于保存用于保存1111位评委的评分位评委的
23、评分* */ / int i, maxvalue, minvalue; int i, maxvalue, minvalue; printf(nEnter 11 score:); printf(nEnter 11 score:); for (i=0; iNUM; i+) for (i=0; iNUM; i+) scanf(%f, &scorei); scanf(%f, &scorei); / /* *用循环语句配合用循环语句配合scanfscanf函数逐个对数组元素赋值函数逐个对数组元素赋值* */ / maxvalue=minvalue=score0; maxvalue=minvalue=sc
24、ore0; / /* *把第一个得分作为最高分与最低分把第一个得分作为最高分与最低分* */ / for(i=0; iNUM; i+) for(i=0; imaxvalue) maxvalue=scorei; if (scoreimaxvalue) maxvalue=scorei; else if (scoreiminvalue) minvalue=scorei; else if (scoreiminvalue) minvalue=scorei; sum=sum+scorei; sum=sum+scorei; sum=(sum-maxvalue-minvalue)/(NUM-2); sum=(
25、sum-maxvalue-minvalue)/(NUM-2); / /* *计算歌手的最终得分计算歌手的最终得分* */ / printf(nFinal score is %6.2f, sum); printf(nFinal score is %6.2f, sum); return 0; return 0; 5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用1515 第第5 5章章 数组数组u5.1 5.1 批量处理:一维数组的定义和使用批量处理:一维数组的定义和使用u5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用u5.3 5.3 戴帽成
26、串:字符数组和字符串戴帽成串:字符数组和字符串u5.4 5.4 思维训练:几种重要的算法思维训练:几种重要的算法u5.5 5.5 知识拓展:向函数传递数组知识拓展:向函数传递数组u5.6 5.6 本章小结本章小结16 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用5.2.1 5.2.1 二维数组的定义二维数组的定义假设一个学习小组有假设一个学习小组有5 5个人,个人,每个人有每个人有3 3门课的考试成绩。门课的考试成绩。求全组各科的平均成绩和求全组各科的平均成绩和每人的总成绩,如表格所示。每人的总成绩,如表格所示。对于上述问题,对于上述问题,若用一维数组来进行表示
27、和处理若用一维数组来进行表示和处理,以课程(行),以课程(行)为单位至少要定义三个一维数组,以人(列)为单位至少要定义为单位至少要定义三个一维数组,以人(列)为单位至少要定义五个一维数组。并且在处理全组各科的平均成绩和每人的总成绩五个一维数组。并且在处理全组各科的平均成绩和每人的总成绩时,必须涉及到多个一维数组中的数据。显然这种表示方法不能时,必须涉及到多个一维数组中的数据。显然这种表示方法不能很好地反映上述二维表中数据间的整体关系,处理起来也比较困很好地反映上述二维表中数据间的整体关系,处理起来也比较困难。这时难。这时引入两维数组可以方便地表示和处理这个问题。引入两维数组可以方便地表示和处理
28、这个问题。张张王王李李赵赵周周MathMath80806161595985857676C C75756565636387877777FoxproFoxpro9292717170709090858517二维数组定义二维数组定义的一般形式为:的一般形式为: 类型说明符类型说明符 数组名数组名 常量表达式常量表达式11常量表达式常量表达式22其中:常量表达式其中:常量表达式1 1及及常量表达式常量表达式2 2分别表示分别表示数组的行数和列数,数组的行数和列数,经常也称为行数常量经常也称为行数常量表达式和列数常量表达式和列数常量表达式。表达式。 例如:例如: float s35; float s35;
29、 定义了一个定义了一个3 3行行5 5列实型数组列实型数组s s,有,有1515个元素。逻辑上可以用个元素。逻辑上可以用一个矩阵(二维表格)来表示,如图一个矩阵(二维表格)来表示,如图4-64-6所示。所示。 把图把图4-54-5与图与图4-64-6比较,可以发现图比较,可以发现图4-64-6刚好可用来存储学习刚好可用来存储学习小组中有小组中有5 5个人,每个人有三门课的个人,每个人有三门课的1515个考试成绩。个考试成绩。说明:说明: (1 1)与一维数组相同,二维数组)与一维数组相同,二维数组的行标与列标也总是从的行标与列标也总是从0 0开始。开始。 (2 2)观察图)观察图4-64-6,
30、可以发现同一,可以发现同一行上的元素的行标是一样的,列标行上的元素的行标是一样的,列标从从0 0开始增长。如第开始增长。如第1 1行上的元素的行上的元素的行标都是行标都是0 0,若用,若用b b来代替来代替s0,s0,第第1 1行上的元素可以改写为行上的元素可以改写为b0,b1,b2,b3,b4b0,b1,b2,b3,b4。显然这是。显然这是一个一维数组,数组名为一个一维数组,数组名为b b,因此第,因此第1 1行可以看成一维数组,数组名为行可以看成一维数组,数组名为s0s0。所以二维数组。所以二维数组s s可以看成是由可以看成是由s0s0、s1s1、s2s2三个元素组成的一三个元素组成的一维
31、数组,而每个元素维数组,而每个元素s0s0、s1s1、s2s2本身又是一个包含本身又是一个包含5 5个元素的一个元素的一维数组。因此我们可以把维数组。因此我们可以把二维数组二维数组看作是一种特殊的一维数组,它的看作是一种特殊的一维数组,它的元素又是一个一维数组。元素又是一个一维数组。 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用18 必须强调的是:必须强调的是:s0,s1,s2s0,s1,s2不能当作下标不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量使用,它们是数组名,不是一个单纯的下标变量。图变量。图4-74-7数组数组a a在内存中的存放形式在内
32、存中的存放形式 (3 3)尽管二维数组在概念上是二维的尽管二维数组在概念上是二维的,而不象,而不象一维数组只是一个向量。但是,实际的硬件存储一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说器却是连续编址的,也就是说存储器单元是按一存储器单元是按一维线性排列的维线性排列的。因此在语言中,二维数组与一。因此在语言中,二维数组与一维数组一样,在被说明为一个数组后,系统会在维数组一样,在被说明为一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素,内存中分配一段连续的空间用于存放数组元素,并且数组名代表首地址。只是数组元素存放时是并且数组名代表首地址。只是数组元素存放时是按
33、行优先排列的,即先存放第一行,再存放第二按行优先排列的,即先存放第一行,再存放第二行,依此类推。行,依此类推。a00a01a02a10a11a12a00a01a02a10a11a12 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用19 5.2.2 5.2.2 二维数组的初始化二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。按行分段赋值,也可按行连续赋值。 例如对数组例如对数组float s35float s35: (1) (1)按行分段赋值
34、按行分段赋值可写为可写为: : float s35=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 float s35=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85; (2) (2)按行连续赋值按行连续赋值可写为可写为: : float s35= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 float s35= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85; 这两种赋初值的结果是完全相同的。这两种赋初值的结果是完全相同的
35、。 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用20 对于二维数组初始化赋值还可以用下列方式:对于二维数组初始化赋值还可以用下列方式: (1 1)可以只对部分元素赋初值,未赋初值的元素自动取可以只对部分元素赋初值,未赋初值的元素自动取0 0值。值。 例如:例如: int a33=1,2,3int a33=1,2,3; 是对每一行的第一列元素赋值,未赋值的元素取是对每一行的第一列元素赋值,未赋值的元素取0 0值。值。 赋值后各元素赋值后各元素的值为:的值为: 1 0 0 1 0 0 2 0 0 2 0 0 3 0 0 3 0 0 而对于而对于int a33=0,1
36、,0,0,2,3;int a33=0,1,0,0,2,3; 赋值后的元素值为赋值后的元素值为: 0 1 0: 0 1 0 0 0 2 0 0 2 3 0 0 3 0 0 (2 2)如对全部元素赋初值,则第一维的长度可以不给出。如对全部元素赋初值,则第一维的长度可以不给出。 例如:例如: int a33=1,2,3,4,5,6,7,8,9int a33=1,2,3,4,5,6,7,8,9; 可以写为:可以写为: int a 3=1,2,3,4,5,6,7,8,9int a 3=1,2,3,4,5,6,7,8,9; 注意:不能出现省略第二维长度的情况。注意:不能出现省略第二维长度的情况。 5.2
37、5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用215.2.3 5.2.3 二维数组元素的引用二维数组元素的引用 二维数组的元素二维数组的元素也称为双下标变量,其也称为双下标变量,其表示的形式表示的形式为:为: 数组名数组名 行下标行下标 列下标列下标 其中下标应为整型常量或整型表达式,其取值范围从其中下标应为整型常量或整型表达式,其取值范围从0 0开始,分别开始,分别到行数到行数-1-1和列数和列数-1-1。 例如:例如: a34a34 表示表示a a数组中行标为数组中行标为3 3列标为列标为4 4的元素。的元素。 如果要引用数组中的全部元素,只要利用如果要引用数组中的全
38、部元素,只要利用循环语句循环语句即可实现,这是即可实现,这是对数组中元素进行操作的基本算法。对于一维数组,已知道只需用单对数组中元素进行操作的基本算法。对于一维数组,已知道只需用单重循环就可完成;而对于二维数组则需要使用两重循环来完成,外循重循环就可完成;而对于二维数组则需要使用两重循环来完成,外循环控制行标变化,内循环控制列标变化。环控制行标变化,内循环控制列标变化。下列程序段实现对数组下列程序段实现对数组float s35float s35的动态赋值:的动态赋值: for(i=0; i=2; i+)for(i=0; i=2; i+) / /* *行标行标i i从从0 0开始变化到开始变化到
39、2 2* */ / for(j=0; j=4; j+)for(j=0; j=4; j+) / /* *列标列标j j从从0 0开始变化到开始变化到4 4* */ / scanf(%f, &sij) scanf(%f, &sij);/ /* *二维数组元素如同普通二维数组元素如同普通 实型变量操作实型变量操作* */ / 通过前面的学习,对数组也可以这样理解:通过前面的学习,对数组也可以这样理解:单个变量描述单个变量描述了空间中了空间中“点点”的概念,一维数组是对单个变量的扩展,它描述的概念,一维数组是对单个变量的扩展,它描述了空间中了空间中“线线”的概念,而二维数组又对一维数组做了扩展,描的概
40、念,而二维数组又对一维数组做了扩展,描述了空间中述了空间中“平面平面”的概念的概念。人们可以模仿二维数组的使用方法。人们可以模仿二维数组的使用方法来实现多维数组等各种数据容器。例如,可用如下方法定义三维来实现多维数组等各种数据容器。例如,可用如下方法定义三维数组数组: : float a234float a234; 多维数组元素在内存中的排列顺序为:第一维的下标变化多维数组元素在内存中的排列顺序为:第一维的下标变化最慢,最右边的下标变化最快。最慢,最右边的下标变化最快。 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用225.2.4 5.2.4 二维数组程序举例二维
41、数组程序举例 【案例案例5.35.3】调用随机函数产生一个调用随机函数产生一个5 5行行5 5列的矩阵列的矩阵a,a,要求每个要求每个元素值均为整数,并且元素值均为整数,并且10aij99,10aij99,输出该矩阵。然后把矩阵输出该矩阵。然后把矩阵a a转置转置( (行、列互换),再输出转置后的矩阵。行、列互换),再输出转置后的矩阵。 分析分析:在:在C C语言中,主要提供两个用于产生随机数的函数语言中,主要提供两个用于产生随机数的函数, ,它它们的原型声明在们的原型声明在stdlib.hstdlib.h头文件中:(头文件中:(1 1)函数原型:)函数原型:void void randomi
42、ze( )randomize( );功能是初始化随机数发生器。(;功能是初始化随机数发生器。(2 2)函数原型)函数原型: :int random(int num)int random(int num);功能是产生一个介于;功能是产生一个介于0 0numnum的随机整的随机整数。数。 5 5行行5 5列的矩阵可以存放在一个二维数组中,数组元素值由列的矩阵可以存放在一个二维数组中,数组元素值由上述的两个随机函数产生。矩阵转置上述的两个随机函数产生。矩阵转置( (行、列互换)主要通过对数行、列互换)主要通过对数组元素的行标和列标的控制来实现。组元素的行标和列标的控制来实现。 5.2 5.2 完美矩
43、形:二维数组的定义和使用完美矩形:二维数组的定义和使用23#include #include #include #include #define N 5#define N 5#define MAX 99#define MAX 99#define MIN 10#define MIN 10int main( )int main( ) int i, j, aNN, temp; int i, j, aNN, temp; randomize( ); / randomize( ); /* *初始化随机数发生器初始化随机数发生器* */ / clrscr( ); clrscr( ); for(i=0; iN
44、; i+)for(i=0; iN; i+) for(j=0; jN; j+) for(j=0; jN; j+) aij=MIN+random(MAX-MIN+1); / aij=MIN+random(MAX-MIN+1); /* *随机产生随机产生10aij9910aij99* */ / printf(“ printf(“随机产生的随机产生的a a矩阵如下矩阵如下:n);:n); for(i=0; iN; i+) for(i=0; iN; i+) for (j=0; jN; j+) for (j=0; jN; j+) printf(%5d, aij); printf(%5d, aij);pri
45、ntf(“n); printf(“n); for(i=0; iN; i+)for(i=0; iN; i+) for(j=i+1; jN; j+) / for(j=i+1; jN; j+) /* *只扫描右上半部只扫描右上半部* */ / temp=aij; aij=aji; aji=temp; / temp=aij; aij=aji; aji=temp; /* *交换元素交换元素* */ / printf(a printf(a矩阵转置后如下矩阵转置后如下:n);:n); for(i=0; iN; i+) for(i=0; iN; i+) for(j=0; jN; j+) printf(%5d,
46、 aij); for(j=0; jN; j+) printf(%5d, aij); printf(n); printf(n); return 0; return 0; 24【案例【案例5.45.4】一个学习一个学习小组有小组有5 5个人,每个人个人,每个人有有3 3门课的考试成绩。门课的考试成绩。求全组各科的平均成绩求全组各科的平均成绩和每人的总成绩,如图所示。和每人的总成绩,如图所示。 分析分析:要存放五个人三门课的成绩显然只要设一个二维数组:要存放五个人三门课的成绩显然只要设一个二维数组s35s35( (或或s153)s153)即可。接下来,要计算全组各科的平均成绩和每人的总成即可。接下来
47、,要计算全组各科的平均成绩和每人的总成绩,需要对上述的二维数组的每一行及每一列分别扫描计算,对所得绩,需要对上述的二维数组的每一行及每一列分别扫描计算,对所得结果的结果的存放有两种方法:(存放有两种方法:(1 1)再设二个一维数组再设二个一维数组ave3(ave3(用于存放各用于存放各科平均成绩科平均成绩) )及及sum5(sum5(用于存放每人的总成绩用于存放每人的总成绩); ); (2)(2)直接对上述的二维直接对上述的二维表格进行扩充:增加一行用于存放每人的总成绩,再增加一列用于存表格进行扩充:增加一行用于存放每人的总成绩,再增加一列用于存放各科平均成绩,对应的二维数组改为放各科平均成绩
48、,对应的二维数组改为s46(s46(或或s164)s164)即可。比较即可。比较上面两种方法,后者更为合适,也更利于对程序功能的扩展,如要在上面两种方法,后者更为合适,也更利于对程序功能的扩展,如要在前面的基础上增加按五个人的总分进行排序等功能。前面的基础上增加按五个人的总分进行排序等功能。张张王王李李赵赵周周MathMath80806161595985857676C C75756565636387877777FoxproFoxpro92927171707090908585 5.2 5.2 完美矩形:二维数组的定义和使用完美矩形:二维数组的定义和使用25#include #include #d
49、efine M 4#define M 4#define N 6#define N 6main()main() int i, j; int i, j; float sMN=80, 75, 92, 61, 65,71, 59, 63, 70, 85,87, 90, 76, 77, float sMN=80, 75, 92, 61, 65,71, 59, 63, 70, 85,87, 90, 76, 77, 85; / 85; /* *以上用表中成绩对以上用表中成绩对s s数组部分初始化(前数组部分初始化(前3 3行和前行和前5 5列)列)* */ / / /* *下面统计每门课程的平均成绩并填入二
50、维数组中的最后一列下面统计每门课程的平均成绩并填入二维数组中的最后一列* */ / for(i=0; iM-1; i+) for(i=0; iM-1; i+) for(j=0; jN-1; j+) for(j=0; jN-1; j+) si5+=sij; / si5+=sij; /* *对同一行元素扫描要保持行标不变,列标变化对同一行元素扫描要保持行标不变,列标变化* */ / si5/=N-1; si5/=N-1; / /* *下面统计每人的总成绩并填入二维数组中的最后一行下面统计每人的总成绩并填入二维数组中的最后一行* */ / for(j=0; jN-1; j+) for(j=0; jN