[计算机软件及应用]chap7数组

上传人:tia****nde 文档编号:70534495 上传时间:2019-01-17 格式:PPT 页数:35 大小:493.31KB
返回 下载 相关 举报
[计算机软件及应用]chap7数组_第1页
第1页 / 共35页
[计算机软件及应用]chap7数组_第2页
第2页 / 共35页
[计算机软件及应用]chap7数组_第3页
第3页 / 共35页
[计算机软件及应用]chap7数组_第4页
第4页 / 共35页
[计算机软件及应用]chap7数组_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《[计算机软件及应用]chap7数组》由会员分享,可在线阅读,更多相关《[计算机软件及应用]chap7数组(35页珍藏版)》请在金锄头文库上搜索。

1、第 7 章 数组 数组是同类元素的集合、占据连续的存储空间,数组名标识了数组的起始地址。 7.1 一维数组 定义一维数组语法:类型说明符 数组名整形常量表达式 类型说明符说明了数组元素的数据类型; 数组名符合标识符命名规则; 整形常量表达式的值为数组中元素的数目。 数组元素:数组元素可以和基本数据类型变量一样使用。 数组元素可以通过如下形式引用: 数组名下标 其中:下标为整形常量或变量、也可以是表达式形式,其值为数组元素序号,下标依次为0、1、2、(元素数目-1)。 如:int num5;定义了具有5个整形元素的数组;数组元素依次为num0、 num1、 num2、 num3、 num4。 C

2、编译对数组下标越界不作检查,如num5不属于数组num的元素、但引用了内存中紧邻数组num之后的整数,这点要特别注意!, 严格说来、C编译将 理解为一运算符,定义语句的 为数组运算符,左右两边为运算对象、驱动C编译在内存中建立指定数据类型及指定大小的数组并将首地址与数组名相关联。其它地方的 为下标运算符,下标值指称了数组中的一个元素。 数组运算符 中的运算对象“数组大小”必须为整形常量,如下语句序列是错误的: int n; scanf(“%d”,系统认为a有5个元素。分析下面程序结果:,#include int num1=1,2,3,4; /数组4个大、依次初始化外部数组为: /1、2、3、4

3、;num14不是num1的元素! void main() static char num25; /静态局部数组、未初始化全为0 int num35=1,2; /局部数组 方式初始化依次为: /num30:1、num31:2、其余:0 int num45; /局部数组、未初始化、全部未知 int i; num23=a; /赋值语句改变静态局部数组元素值num23:97 for (i=0;i=2;i+) /赋值语句改变局部数组元素值 num4i=i+1; /num40:1、num41:2、num42:3 printf(“itnum1tnum2tnum3tnum4n“); printf(“-n“);

4、 for(i=0;i5;i+) printf(“%d:t%dt%dt%dt%dn“, i,num1i,num2i,num3i,num4i); ,7.2 一维数组应用实例 例7.2 将一个十进制正整数转换成二进制数。 #include void main( ) int i, k, r, x, b16; printf(“Enter an integer x :“); scanf(“%d“, ,附:如何获取0100不同的随机数序列,与产生不同随机数有关的三个函数原型: int rand(void);返回随机整数 void srand (unsigned int n);n初始化随机数产生器 long

5、time(NULL);获取当前时间(参数要大写) 说明:srand()函数使用自变量n作为种子,用来初始化随机数产生器。如果把相同的种子先传入srand(),然后调用rand()时,就会产生相同的随机数序列。因此,我们可以把时间作为srand()函数的种子,就可以避免多次运行程序出现重复的随机数序列。,#include #include /使用rand、srand #include /使用time void main( ) srand(unsigned)time(NULL); /初始化 for (int i=0; i10; i+) printf(“%d ”, rand( )%100); /%1

6、00使随机数范围0100 printf(“n“);,排序是数组的主要操作,“冒泡排序法”和“选择排序法”是两种常用方法。 例7.3_1 用冒泡法将N个数按从小到大排序。 冒泡(升序)算法:将序列(数组)中的N个数进行N-1轮比较操作: 从首个开始、作相邻比较、若大于-交换;经N-1次、N个数的最大者已置于序列尾。 将次短的序列进行同样操作、直至(次短的)序列为一个数。,#include #include #define N 10 void main( ) int i, j,t,aN; printf(“the first numbers :n“); for(i=0;iaj+1) t=aj;aj=

7、aj+1;aj+1=t; /交换 printf(“the sorted numbers :n“); for(i=0;iN;i+) printf(“%-4d“,ai); printf(“n“); ,本次比较中N-1-i单元不参与下次大循环比较、正好保存本次比较得出的最大数!,for(i=0;ii;j-) if(ajaj-1) t=aj;aj=aj-1;aj-1=t;,例7.3_2 用选择法将整形数组aN中数升序排列。 算法一:假设序列中首数最小、将其与后续序列各数相比,若 小交换、直至序列尾; 第二数作为新序列首数、重复、直至首数为一个。,for(i=0;iN-1;i+) for(j=i+1;j

8、N;j+) /寻找比序列首更小的数 if(ajai) /遇到更小的数(交换) t=aj;aj=ai;ai=t; /一次大循环有可能交换多次,for(i=0;iN-1;i+) k=i; /保存序列首下标 for(j=i+1;jN;j+) /寻找序列中最小数下标k if(ajak) k=j; /保存更小数下标、小循环完成保存最小数下标 if(k!=i) t=ak;ak=ai;ai=t; /大循环只作一次交换或不作,算法二: 假设序列中首数最小、将其与后续序列各数相比、寻 找最小数下标,若最小数下标不为首数下标、与首数交换。 第二数作为新序列首数、重复、直至首数为一个。,分析如下程序,作业:将数组定

9、义为外部的、用六个函数:main()、冒泡函数、选择排序一函数、选择排序二函数、随机数初始化数组函数、打印输出函数处理aN数组排降序!,7.3 二维数组 1)二维数组的定义: 类型名 数组名常量表达式1常量表达式2 常量表达式1的值指明了二维数组有多少行元素、表达式2指明了每行中有多少列元素。如:float f23 ; 定义了一个2行3列的float型二维数组f,可用于保存6个float型数。 2) 二维数组元素的引用 二维数组元素采用双下标引用,行列下标都是从0开始编号、最大下标为常量表达式指定的值减1。上面定义的f数组各元素用下标表示为: 第一行:f00、 f01、 f02 第二行:f10

10、、 f11、 f12 如此类推、也可以定义多维数组,如:int a345;定义了一个三维数组a,可用于保存60(3*4*5)个 int型数。,3) 多维数组元素在内存中的存放次序 C编译保存多维数组元素的原则是:从首个开始、右边下标优先递增、依次存放。 前面讨论一维数组时介绍过, C编译将 理解为一运算符,一维数组名指称了第一个元素的第一个字节地址;二维数组的定义语句、如 int a34;也要按照数组运算符 的运算对象及优先级和结合性去理解其含义。 具有左结合性、因此这样说: “3左边的运算对象a是一数组名、数组包含有(左边方括号中的运算对象)3个元素:a0、a1、a2,a的每个元素是一维数组

11、(考虑右边 号)、a0等又为作为右边4的运算对象、因此a0、a1、a2都是一维数组名;每个一维数组又包含有4个元素,如a0包括:a00、 a01、 a02、 a03,而它的每个元素是int型数据”。 由此可见、a指称了a0的地址;a0指称了a00的地址,a当然也指称了a00的地址;a2为a数组第3行的一维数组名、指称了a20的地址。,多维数组的定义语句 、看起来虽然简单、其内涵却十分丰富,不仅仅只定义了一个程序对象,同时依据该程序对象名所带 个数不同、也定义了不同大小的子数组,这些子数组名在源程序中是可以引用的。 依据多维数组元素存放原则、不难理解:多维数组“各级别的元素”都是连续存放的!2维

12、3维等只是个逻辑概念,其元素对应着物理上是一维的、不同大小的连续内存块。使用“最小的元素”如同使用基本数据类型变量一样。 4)二维数组的初始化 初始化二维数组时可以内嵌、内嵌的代表行;所赋给的值是按行按列对号入座;缺少的内嵌或内未指定的为0。 如: int a34=1,5,9;/每行首个分别为1,5,9其余为0 static int a34=1,0,6,0,0,11; int a34=1,5,6; /第三行全为0 static int a34=1, ,9; /第二行全为0,对二维数组的全部元素赋初值时,可以不指定第一维的长度,但不得省去第二维的长度。如: static int a34=1,2,

13、3,4,5,6,7,8,9,10,11,12; 可以写成: static int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 同样,static int a 4=0,0,3, ,0,10; 也是正确的 常采用如下方式将所有元素初始化为0: int a56=;或int a56=0; 对二维数组常采用二重循环访问。 二维数组的常应用于矩阵元素查找、矩阵运算、特殊矩阵的生成等。,例7.4 将二维数组行和列的元素互换后存到另一个数组中。,#include void main( ) static int a23=1,2,3,4,5,6; static int b32, i, j; p

14、rintf(“array a:n“); for (i=0; i=1; i+) for ( j=0; j=2; j+) printf(“%5d“,ai j);b ji=ai j; printf(“n“); printf(“array b:n“); for (i=0; i=2; i+) for ( j=0; j=1; j+) printf(“%5d“,bi j); printf(“n“); ,例7.5 输出一个34数组中每行中的最大元素之值及其位置。 #include void main( ) int i,j,c,max ; static int a34=6,-5,11,3,8,9,4,7,2,13,1,-10; for (i=0; imax)max=aij;c=j; printf(“max=%2d,row=%d,colum=%dn“,max,i+1,c+1); ,输出结果: max=11, row=1, colum=3 max= 9, row=2, colum=2 max=13, row=3, colum=2,7.4 字符数组与字符串 C语言没有字符串变量、C编译以一维字符数组的方式处理字符串;字符数组的最后一个元素为0、作为字符串的结束标志。 第二章讨论过涉及字符操作的几个库函数,有控制台与流操作、单

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号