1、为了解决比较复杂的问题,本章介绍为了解决比较复杂的问题,本章介绍C C语言提供的语言提供的一种最简单的一种最简单的构造类型构造类型数组。数组。数组含义数组含义:多个变量的有序排列多个变量的有序排列.从存储角度看,从存储角度看,如果一个变量代表一个存储单元,那么一个数组则代表如果一个变量代表一个存储单元,那么一个数组则代表一批连续排列在一起的存储单元,并且存放相同类型的一批连续排列在一起的存储单元,并且存放相同类型的数据。数据。6.1 6.1 一维数组的定义和引用一维数组的定义和引用6.2 6.2 二维数组的定义和引用二维数组的定义和引用6.3 6.3 字符数组与字符串字符数组与字符串Retur
2、nReturn第6章 数 组6.1 一维数组的定义和引用6.1.1 6.1.1 一维数组的定义一维数组的定义6.1.2 6.1.2 一维数组元素的引用一维数组元素的引用6.1.3 6.1.3 一维数组元素的初始化一维数组元素的初始化6.1.4 6.1.4 一维数组应用举例一维数组应用举例 Return数组同变量一样,也必须数组同变量一样,也必须先定义、后使用先定义、后使用。一维数组是只有一维数组是只有1 1个下标的数组,定义形式如下:个下标的数组,定义形式如下:数据类型数据类型 数组名数组名 常量表达式常量表达式,数组名数组名22常量表达式常量表达式22;(1 1)“数据类型数据类型”是指数组
3、是指数组元素元素的数据类型。的数据类型。(2 2)数组名数组名,与变量名一样,必须遵循,与变量名一样,必须遵循标识符命名规则标识符命名规则。(3 3)“常量表达式常量表达式”必须用方括号必须用方括号括起来,指的是数组的元括起来,指的是数组的元素个数(又称数组长度),它是一个整型值,其中可以包含素个数(又称数组长度),它是一个整型值,其中可以包含常数和符号常量,但常数和符号常量,但不能包含变量不能包含变量。6.1.1 6.1.1 一维数组的定义一维数组的定义特别说明特别说明:在数组定义时,:在数组定义时,“常量表达式常量表达式”外的方括号;外的方括号;以及元素引用时,以及元素引用时,“下标表达式
4、下标表达式”外的方括号,都是外的方括号,都是C C语语言语法规则所要求的,不是本书所约定的可选项的描述言语法规则所要求的,不是本书所约定的可选项的描述符号。符号。(4 4)数组元素的下标,是元素相对于数组起始地址的偏)数组元素的下标,是元素相对于数组起始地址的偏移量,所以从移量,所以从 开始顺序编号。开始顺序编号。(5 5)数组名中存放的是一个)数组名中存放的是一个地址地址常量,它代表整个数组常量,它代表整个数组的的首地址首地址。同一数组中的所有元素,按其下标的顺序占。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。用一段连续的存储单元。a a 等价于等价于&a0.(a&a0.(a
5、已经不是一个变量已经不是一个变量,而是一个地址而是一个地址)6.1.1 6.1.1 一维数组的定义一维数组的定义地址计算地址计算:例如:intint a5;a5;数组数组a a的起始地址为的起始地址为1000.1000.a0a1a2a3a410001000Loc(a4)Loc(a4)计算公式计算公式:loc(ai:loc(ai)=loc(a0)+i)=loc(a0)+i*b b 其中其中b b代表每个元素所占的字节数代表每个元素所占的字节数.例如例如:上图中数组上图中数组a a的起始地址为的起始地址为1000,a1000,a的类型为整型的类型为整型(2(2字节字节),),则则a4a4的起始地址
6、为的起始地址为1008.1008.Return6.1.2 6.1.2 数组元素的引用数组元素的引用 6.1.2 6.1.2 数组元素的引用数组元素的引用2 2一个一个数组元素数组元素,实质上就是一个,实质上就是一个变量变量,它具有和相同类型单个变量一样的属性,它具有和相同类型单个变量一样的属性,可以对它进行可以对它进行赋值和参与各种运算。赋值和参与各种运算。3 3在在C C语言中,数值型数组不能作为一个语言中,数值型数组不能作为一个整体整体参加数据运算,只能对单个的数组参加数据运算,只能对单个的数组元素进行处理。元素进行处理。6.1.3 6.1.3 一维数组元素的初始化一维数组元素的初始化 初
7、始化格式初始化格式:(1 1)如果对数组的全部元素赋以初值,定义时)如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动可以不指定数组长度(系统根据初值个数自动确定)。如果被定义数组的长度,与初值个数确定)。如果被定义数组的长度,与初值个数不同,则数组长度不能省略。不同,则数组长度不能省略。例例:int:int a=1,3,5,7,9;a=1,3,5,7,9;6.1.3 6.1.3 一维数组元素的初始化一维数组元素的初始化 Return示例示例1(max.c):求数组元素的最大值:求数组元素的最大值#includemain()int i,a10,max;for(i=0;
8、i10;i+)scanf(%d,&ai);max=a0;for(i=1;imax)max=ai;printf(%d ,max);示例示例2(jiaohuan.c):交换数组元素,使第一个和最后一:交换数组元素,使第一个和最后一个交换,第二个和倒数第二个交换,依次类推。如数组为个交换,第二个和倒数第二个交换,依次类推。如数组为1,2,3,4,5,6,7,8,9,10,交换后为交换后为10,9,8,7,6,5,4,3,2,1(或者称为:逆置数组元素中的值)(或者称为:逆置数组元素中的值)#includemain()int i,a10,t;for(i=0;i10;i+)scanf(%d,&ai);f
9、or(i=0;i10/2;i+)t=ai;ai=a10-1-i;a10-1-i=t;for(i=0;i10;i+)printf(%d ,ai);示例示例3(exp3.c):请补充函数:请补充函数fun,该函数的功能是:把数,该函数的功能是:把数组组aa中的偶数元素按原来的先后顺序放在原数组后面。例中的偶数元素按原来的先后顺序放在原数组后面。例如,输入如,输入“33,67,42,58,25,76,85,16,41,56”,输出结果,输出结果“33,67,25,85,41,42,58,76,16,56”。#include#define N 10void fun(int aa)int I,j=0,k
10、=0;int bbN;for(I=0;IN;I+)if()bbk+=aaI;elseaaj+=aaI;for(I=0;I+,j+)aaj=bbI;aaI%2=0 Ikvoid main()int i,aaN=33,67,42,58,25,76,85,16,41,56;fun(aa);for(i=0;iN;i+)printf(%4d,aai);示例示例4:排序问题:排序问题用冒泡法对数组元素进行升序排序用冒泡法对数组元素进行升序排序n对对n n个数进行排序的思路是:个数进行排序的思路是:n如果要对如果要对n n个数据排序,就需要进行个数据排序,就需要进行n-1n-1轮的比较,每次都对轮的比较,每
11、次都对相邻相邻两个数进行比较,将较大的数交换到后一个元素中。每一轮的比两个数进行比较,将较大的数交换到后一个元素中。每一轮的比较都找出未排好的数据中的最大数放在这几个数的后面。较都找出未排好的数据中的最大数放在这几个数的后面。n例如,第一轮需要比较例如,第一轮需要比较n-1n-1次,在次,在n n个数中找出个数中找出最大数最大数放在数组的放在数组的最后一个元素中;最后一个元素中;n第二轮将对剩下的前第二轮将对剩下的前n-1n-1个数进行比较,需要比较个数进行比较,需要比较(n-1)-1(n-1)-1次,将次,将前前n-1n-1个数中的最大者放入数组的倒数第二个元素中;个数中的最大者放入数组的倒
12、数第二个元素中;n以此类推,第以此类推,第n-1n-1轮需要进行轮需要进行1 1次比较,将剩下的次比较,将剩下的2 2个数中的较个数中的较大者放入大者放入a1a1中,将最小的数放入中,将最小的数放入a0a0中。中。n当第当第n-1n-1轮比较进行完后,所有的数据都按照升序在数组中排列。轮比较进行完后,所有的数据都按照升序在数组中排列。用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法例如:例如:a数组中有数组中有10个元素的值如果为:个元素的值如果为:1 5 9 -2 8 7 3 10 0 4第一轮第一轮(比较比较9次次):第第1次:次:a0与与 a11 5 9 -2 8
13、 7 3 10 0 4第第2次:次:a1与与 a21 5 9 -2 8 7 3 10 0 4第第3次:次:a2与与 a31 5 -2 9 8 7 3 10 0 4第第4次:次:a3与与 a41 5 -2 8 9 7 3 10 0 4第第5次:次:a4与与 a51 5 -2 8 7 9 3 10 0 4第第6次:次:a5与与 a61 5 -2 8 7 3 9 10 0 4第第7次:次:a6与与 a71 5 -2 8 7 3 9 10 0 4第第8次:次:a7与与 a81 5 -2 8 7 3 9 0 10 4第第9次:次:a8与与 a91 5 -2 8 7 3 9 0 4 10用冒泡法对数组元素
14、进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第一轮后第一轮后a数组中有数组中有10个元素的值为:个元素的值为:1 5 -2 8 7 3 9 0 4 10第二轮第二轮(比较比较8次次):第第1次:次:a0与与 a11 5 -2 8 7 3 9 0 4 10第第2次:次:a1与与 a21 -2 5 8 7 3 9 0 4 10第第3次:次:a2与与 a31 -2 5 8 7 3 9 0 4 10第第4次:次:a3与与 a41 -2 5 7 8 3 9 0 4 10第第5次:次:a4与与 a51 -2 5 7 3 8 9 0 4 10第第6次:次:a5与与 a61 -2 5 7 3 8 9
15、 0 4 10第第7次:次:a6与与 a71 -2 5 7 3 8 0 9 4 10第第8次:次:a7与与 a81 -2 5 7 3 8 0 4 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第二轮后第二轮后a数组中有数组中有10个元素的值为:个元素的值为:1 -2 5 7 3 8 0 4 9 10第三轮第三轮(比较比较7次次):第第1次:次:a0与与 a1-2 1 5 7 3 8 0 4 9 10第第2次:次:a1与与 a2-2 1 5 7 3 8 0 4 9 10第第3次:次:a2与与 a3-2 1 5 7 3 8 0 4 9 10第第4次:次:a3与与
16、a4-2 1 5 3 7 8 0 4 9 10第第5次:次:a4与与 a5-2 1 5 3 7 8 0 4 9 10第第6次:次:a5与与 a6-2 1 5 3 7 0 8 4 9 10第第7次:次:a6与与 a7-2 1 5 3 7 0 4 8 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第三轮后第三轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 1 5 3 7 0 4 8 9 10第四轮第四轮(比较比较6次次):第第1次:次:a0与与 a1-2 1 5 3 7 0 4 8 9 10第第2次:次:a1与与 a2-2 1 5 3 7 0 4 8
17、9 10第第3次:次:a2与与 a3-2 1 3 5 7 0 4 8 9 10第第4次:次:a3与与 a4-2 1 3 5 7 0 4 8 9 10第第5次:次:a4与与 a5-2 1 3 5 0 7 4 8 9 10第第6次:次:a5与与 a6-2 1 3 5 0 4 7 8 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第四轮后第四轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 1 3 5 0 4 7 8 9 10第五轮第五轮(比较比较5次次):第第1次:次:a0与与 a1-2 1 3 5 0 4 7 8 9 10第第2次:次:a1与与 a2-
18、2 1 3 5 0 4 7 8 9 10第第3次:次:a2与与 a3-2 1 3 5 0 4 7 8 9 10第第4次:次:a3与与 a4-2 1 3 0 5 4 7 8 9 10第第5次:次:a4与与 a5-2 1 3 0 4 5 7 8 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第五轮后第五轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 1 3 0 4 5 7 8 9 10第六轮第六轮(比较比较4次次):第第1次:次:a0与与 a1-2 1 3 0 4 5 7 8 9 10第第2次:次:a1与与 a2-2 1 3 0 4 5 7 8 9 1
19、0第第3次:次:a2与与 a3-2 1 0 3 4 5 7 8 9 10第第4次:次:a3与与 a4-2 1 0 3 4 5 7 8 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第六轮后第六轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 1 0 3 4 5 7 8 9 10第七轮第七轮(比较比较3次次):第第1次:次:a0与与 a1-2 1 0 3 4 5 7 8 9 10第第2次:次:a1与与 a2-2 0 1 3 4 5 7 8 9 10第第3次:次:a2与与 a3-2 0 1 3 4 5 7 8 9 10用冒泡法对数组元素进行升序排序的算法
20、用冒泡法对数组元素进行升序排序的算法第七轮后第七轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 0 1 3 4 5 7 8 9 10第八轮第八轮(比较比较2次次):第第1次:次:a0与与 a1-2 0 1 3 4 5 7 8 9 10第第2次:次:a1与与 a2-2 0 1 3 4 5 7 8 9 10用冒泡法对数组元素进行升序排序的算法用冒泡法对数组元素进行升序排序的算法第八轮后第八轮后a数组中有数组中有10个元素的值为:个元素的值为:-2 0 1 3 4 5 7 8 9 10第九轮第九轮(比较比较1次次):第第1次:次:a0与与 a1-2 0 1 3 4 5 7 8 9 10用
21、冒泡法对数组元素进行升序排序的算法程序用冒泡法对数组元素进行升序排序的算法程序main()int a10;int i,j,t,n=10;printf(“Input 10 numbers:n);for(i=0;in;i+)scanf(%d,&ai);printf(n);for(i=0;in-1;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;printf(the sorted numbers:n);for(i=0;in;i+)printf(%d ,ai);为数组元素赋值为数组元素赋值外循环控制比较轮数外循环控制比较轮数内循环控制每轮比较次数内循环控制每轮比较次数相邻两个
22、元素进行比较相邻两个元素进行比较如果后一个元素比前如果后一个元素比前一个元素小,二者交换一个元素小,二者交换输出排序后的数组输出排序后的数组用选择法对数组元素进行升序排序用选择法对数组元素进行升序排序n选择法对选择法对n n个数进行排序的思路是:个数进行排序的思路是:n如果要对如果要对n n个数据排序,就需要进行个数据排序,就需要进行n-1n-1轮的比较,每次都从数组中轮的比较,每次都从数组中未排好的子序列中找出一个最小数,与子序列最前面的一个元素交未排好的子序列中找出一个最小数,与子序列最前面的一个元素交换,使小数放在子序列的最前面。换,使小数放在子序列的最前面。n例如,第一轮需要比较例如,
23、第一轮需要比较n-1n-1次,在次,在n n个数中找出最小数与数组中的第个数中找出最小数与数组中的第一个元素(即一个元素(即a0a0)交换,使数组中的最小数放在数组的最前面;)交换,使数组中的最小数放在数组的最前面;n第二轮将对剩下的第二轮将对剩下的n-1n-1个数进行比较,需要比较个数进行比较,需要比较(n-1)-1(n-1)-1次,将次,将n-1n-1个个数中的最小的数与子序列最前面的元素交换,也就数组中的第二个数中的最小的数与子序列最前面的元素交换,也就数组中的第二个元素(即元素(即a1a1)交换,使子序列中的最小数放在子序列的最前面;)交换,使子序列中的最小数放在子序列的最前面;n以此
24、类推,第以此类推,第n-1n-1轮需要进行轮需要进行1 1次比较,将剩下的次比较,将剩下的2 2个数中的小数个数中的小数与子序列的前面即与子序列的前面即an-2an-2交换,使子序列中的最小数子序列中的前交换,使子序列中的最小数子序列中的前面。面。n当第当第n-1n-1轮比较进行完后,所有的数据都按照升序在数组中排列。轮比较进行完后,所有的数据都按照升序在数组中排列。用选择法对数组元素进行升序排序的算法用选择法对数组元素进行升序排序的算法例如:例如:a数组中有数组中有10个元素的值如果为:个元素的值如果为:1 5 9 -2 8 7 3 10 0 4第一轮第一轮(比较比较9次次):第第1次:次:
25、a0与与 a11 5 9 -2 8 7 3 10 0 4第第2次:次:a0与与 a21 5 9 -2 8 7 3 10 0 4第第3次:次:a0与与 a3第第4次:次:a3与与 a4第第5次:次:a3与与 a5第第6次:次:a3与与 a6第第7次:次:a3与与 a7第第8次:次:a3与与 a8第第9次:次:a3与与 a91 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7 3 10 0 41 5 9 -2 8 7
26、3 10 0 4用选择法对数组元素进行升序排序的算法用选择法对数组元素进行升序排序的算法第一轮后将第一轮后将a3与与a0交换即可:交换即可:-2 5 9 1 8 7 3 10 0 4第二轮第二轮(比较比较8次次):第第1次:次:a1与与 a2-2 5 9 1 8 7 3 10 0 4第第2次:次:a1与与 a3第第3次:次:a3与与 a4第第4次:次:a3与与 a5第第5次:次:a3与与 a6第第6次:次:a3与与 a7第第7次:次:a3与与 a8第第8次:次:a8与与 a9-2 5 9 1 8 7 3 10 0 4-2 5 9 1 8 7 3 10 0 4-2 5 9 1 8 7 3 10
27、0 4-2 5 9 1 8 7 3 10 0 4-2 5 9 1 8 7 3 10 0 4-2 5 9 1 8 7 3 10 0 4-2 5 9 1 8 7 3 10 0 4找出第二小的找出第二小的a8直接与直接与a1 交换,以此类推交换,以此类推用选择法对数组元素进行升序排序用选择法对数组元素进行升序排序main()int a10,int i,j,t,k,n=10;printf(“Input 10 numbers:n);for(i=0;in;i+)scanf(%d,&ai);printf(n);for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(ajak)k=j;i
28、f(k!=i)t=ak;ak=ai;ai=t;printf(the sorted numbers:n);for(i=0;in;i+)printf(%d ,ai);记下子序列中最小数的下记下子序列中最小数的下标标子序列中最前边的元子序列中最前边的元素素ai与最小元素与最小元素ak交换交换子序列中当前最小元子序列中当前最小元素素ak与其它元素与其它元素aj比较比较题库摘题:题库摘题:排序题目:排序题目:选择法:选择法:94-294-2、95-295-2、74-374-3;插入法:插入法:81-281-22007年4月1、有以下程序、有以下程序main()int i,j;for(i=1;i4;i+)
29、for(j=i;j4;j+)printf(“%d*%d=%d“,i,j,i*j);printf(“n”);程序运行后的输出结果是程序运行后的输出结果是 A)1*1=1 1*2=2 1*3=3 B)1*1=1 1*2=2 1*3=3 2*1=2 2*2=4 2*2=4 2*3=6 3*1=3 3*3=9C)1*1=1 D)1*1=1 1*2=2 2*2=4 2*1=2 2*2=4 1*3=3 2*3=6 3*3=9 3*1=3 3*2=6 3*3=92007年4月2、以下程序的功能是:求出数组、以下程序的功能是:求出数组x中各相邻两个元素的中各相邻两个元素的和依次存放到和依次存放到a数组中,然后
30、输出。请填空。数组中,然后输出。请填空。main()int x10,a9,I;for(i=0;i10;i+)scanf(“%d”,&xi);for(_;i10;i+)ai-1=xi+_ ;for(i=0;i9;i+)printf(“%d”,ai);printf(“n”);i=1xi-12007年9月1、执行以下程序的输出结果是:、执行以下程序的输出结果是:#include main()int i,n4=1;for(i=1;i3;i+)ni=ni-1*2+1;printf(“%d”,ni);372008年4月1、执行以下程序的输出结果是:、执行以下程序的输出结果是:#include main()
31、int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,I;for(i=0;i12;i+)csi+;for(i=1;i5;i+)printf(“%d”,ci);printf(“n”);43322008年9月1、执行以下程序的输出结果是:、执行以下程序的输出结果是:#include void fun(int a,int n)int i,t;for(i=0;in/2;i+)t=ai;ai=an-1-i;an-1-i=t;main()int k10=1,2,3,4,5,6,7,8,9,10,I fun(k,5);for(i=2;i8;i+)printf(“%d”,ki);print
32、f(“n”);3216782008年9月2、若有定义语句:、若有定义语句:int m=5,4,3,2,1,i=4;,则下面则下面对对m数组元素的引用中错误的是:数组元素的引用中错误的是:A)m-i B)m2*2 C)mm0 D)mmi有以下程序有以下程序#include stdio.h#include main()main()int int a=2,3,5,4,i;a=2,3,5,4,i;for(ifor(i=0;i4;i+)=0;i4;i+)switch(i%2)switch(i%2)case 0:switch(ai%2)case 0:switch(ai%2)case 0:ai+;break
33、case 0:ai+;break;case 1:aicase 1:ai-;-;break;break;case 1:aicase 1:ai=0;=0;for(ifor(i=0;i4;i+)printf(%d,ai);printf(n);=0;i4;i+)printf(%d,ai);printf(n);程序运行后的输出结果是(程序运行后的输出结果是()。)。A A)3 3 4 4 B3 3 4 4 B)2 0 5 0 C2 0 5 0 C)3 0 4 0 D3 0 4 0 D)0 3 0 40 3 0 4 2009年9月2010年3月有以下程序:有以下程序:#include main()int
34、a5=1,2,3,4,5,b5=0,2,1,3,0,i,s=0;for(i=0;i5;i+)s=s+abi;printf(“%dn”,s);A 6 B 10 C 11 D 152010年3月2.下列选项中能正确定义数组的是:下列选项中能正确定义数组的是:A int num0.2008;B int num;C int N=2008;D#define N 2008 int numN;int numN;2011-3(30)以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。#include#define N 10 void fun(int xN)int i=0;While(iN)scanf(
35、%d,_);在程序中下划线处应填入的是 A)x+i B)&xi+1 C)x+(i+)D)&x+i 题盘(26道)数组元素逆置或交换位置:数组元素逆置或交换位置:4-14-1;36-336-3;46-146-1;51-151-1;52-152-1(逆置);(逆置);56-156-1;83-283-2;满足条件的数组元素存入数组:满足条件的数组元素存入数组:51-251-2;54-154-1;55-255-2;64-264-2;84-384-3;96-196-1;计算:计算:6-26-2;素数:(;素数:(8-38-3;80-380-3)13-313-3;26-126-1;41-341-3;42-
36、142-1;45-345-3;47-347-3;70-270-2;92-392-3;其它:其它:61-261-2;进制转换;进制转换21-221-2Return6.2 6.2 二维数组的定义和引用二维数组的定义和引用6.2.1 6.2.1 二维数组的定义二维数组的定义6.2.2 6.2.2 二维数组元素的引用二维数组元素的引用6.2.3 6.2.3 二维数组元素的初始化二维数组元素的初始化6.2.4 6.2.4 二维数组应用举例二维数组应用举例 Return 二维数组的定义方式如下:二维数组的定义方式如下:数据类型 数组名行常量表达式列常量表达式,数组名2行常量表达式2列常量表达式2;1 1数
37、组元素在内存中的排列顺序为数组元素在内存中的排列顺序为“按行存放按行存放”,即先顺序,即先顺序存放第一行的元素,再存放第二行,以此类推。存放第一行的元素,再存放第二行,以此类推。2.2.设有一个设有一个m m*n n的数组的数组x x,则第,则第i i行第行第j j列的元素列的元素xijxij在数组在数组中的位置(或前面存储元素的个数)为:中的位置(或前面存储元素的个数)为:i i*n+jn+j(注意:行号、:行号、列号均从列号均从0 0开始计数开始计数)地址计算地址计算:Loc(xij)=loc(x00)+(i:Loc(xij)=loc(x00)+(i*n+jn+j)*b b6.2.1 6.
38、2.1 二维数组的定义二维数组的定义3 3可以把二维数组看作是一种特殊的一维数组:它的可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。元素又是一个一维数组。例如,对例如,对a34a34,可以把,可以把a a看作是一个看作是一个1 1维数组,它有维数组,它有3 3个元素:个元素:a0a0、a1a1、a2a2,每个元素又是一个包含,每个元素又是一个包含4 4个元素个元素的的1 1维数组,如图所示。即把维数组,如图所示。即把a0a0、a1a1、a2a2看作是看作是3 3个个1 1维维数组的名字。数组的名字。int a34;a0 a00 a01 a02 a03 a1 a10 a11
39、a12 a13a2 a20 a21 a22 a23 Return第0行:0 1 2 j n-1第1行:0 1 2 j n-1第i行:0 1 2 n-16.2.2 6.2.2 二维数组元素的引用二维数组元素的引用引用二维数组元素的形式为:引用二维数组元素的形式为:数组名数组名 行下标表达式行下标表达式列下标表达式列下标表达式 1 1“行下标表达式行下标表达式”和和“列下标表达式列下标表达式”,都应是整,都应是整型表达式或符号常量。型表达式或符号常量。2 2“行下标表达式行下标表达式”和和“列下标表达式列下标表达式”的值,都应的值,都应在已定义数组大小的范围内。假设有数组在已定义数组大小的范围内。
40、假设有数组x34x34,则可用,则可用的行下标范围为的行下标范围为0 02 2,列下标范围为,列下标范围为0 03 3。3 3对基本数据类型的变量所能进行的操作,也都适合对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的于相同数据类型的2 2维数组元素。维数组元素。Return1 1按行赋初值按行赋初值数据类型数据类型 数组名数组名 行常量表达式行常量表达式列常量表达列常量表达式式 第第0 0行初值表行初值表,第第1 1行初值表行初值表,最后最后1 1行初值表行初值表;赋值规则:将赋值规则:将“第第0 0行初值表行初值表”中的数据,依次中的数据,依次赋给第赋给第0 0行中各元素;将行
41、中各元素;将“第第1 1行初值表行初值表”中的数据,中的数据,依次赋给第依次赋给第1 1行各元素;以此类推。值不够用时行各元素;以此类推。值不够用时,没没被赋值的变量为被赋值的变量为0.0.2 2按二维数组在内存中的排列顺序给各按二维数组在内存中的排列顺序给各元素赋初值元素赋初值数据类型数据类型 数组名数组名 行常量表达式行常量表达式列常列常量表达式量表达式 初值表初值表;赋值规则:按二维数组在内存中的排列顺序,将赋值规则:按二维数组在内存中的排列顺序,将初值表中的数据,依次赋给各元素。初值表中的数据,依次赋给各元素。如果对全部元素都赋初值,则如果对全部元素都赋初值,则“行数行数”可以省略。可
42、以省略。注意:注意:只能省略只能省略“行数行数”。Return6.2.4 6.2.4 二维数组应用举例二维数组应用举例 例例6.2 6.2 给一个给一个2 23 3 的二维数组各元素赋值,并的二维数组各元素赋值,并输出全部元素的值。输出全部元素的值。需要考虑的问题需要考虑的问题:1.1.如何给二维数组赋初值如何给二维数组赋初值?实现方法实现方法:用:用2 2层嵌套的循环层嵌套的循环,一层控制行下标一层控制行下标;一层一层控制列下标。控制列下标。2.2.如何按我们习惯的矩阵形式输出二维数组如何按我们习惯的矩阵形式输出二维数组?实现方法实现方法:在外循环的内部、内循环的外部加输出:在外循环的内部、
43、内循环的外部加输出空行语句。空行语句。/*案例代码文件名:案例代码文件名:6_2.C*/*功能功能:从键盘上给从键盘上给23数组赋值,并在屏幕上显数组赋值,并在屏幕上显示出来。示出来。*/#include stdio.h“main()int i,j,array23;/*定义二维数组定义二维数组*/for(i=0;i2;i+)/*外循环:控制数组的行外循环:控制数组的行*/for(j=0;j3;j+)/*内循环控制数组的列内循环控制数组的列*/scanf(%d,&arrayij);printf(n);/*输出2维数组array*/for(i=0;i2;i+)for(j=0;j3;j+)print
44、f(%dt,arrayij);printf(n);12 345 67 8 914 72 5 83 6 9转置程序设计思路:程序设计思路:1 1、首先生成原始矩阵、首先生成原始矩阵a a。(从键盘输入或赋值得到二维数组)。(从键盘输入或赋值得到二维数组)2 2、思路、思路1 1,定义另一个矩阵,将定义另一个矩阵,将a aijij赋值给赋值给b bjiji。思路思路2 2,以对角线为基准,交换相应元素。(以对角线为基准,交换相应元素。(a aijij-a ajiji)。思考:如何思考:如何循环变量的上、下界?循环变量的上、下界?main()int a33,i,j,k=1;for(i=0;i3;i+
45、)for(j=0;j3;j+)aij=k;k+;/*对数组对数组a a赋初值赋初值*/for(i=0;i3;i+)for(j=0;j3;j+)printf(“%d ”,aij);/*按按3 3行行3 3列列格式输出格式输出数组数组a a*/printf(“n”);for(i=0;i3;i+)for(j=0;ji;j+)k=aij;aij=aji;aji=k;/*交换交换(转置转置)*/for(i=0;i3;i+)for(j=0;j3;j+)printf(“%d ”,aij);printf(“n”);/*输出转置之后的数组输出转置之后的数组a a*/思考:如果交换时思考:如果交换时j j的上界定
46、为的上界定为33,结果会如何?,结果会如何?典型算法典型算法1 求二维数组中最大元素及其下标(程序)求二维数组中最大元素及其下标(程序)main()int a34=1,2,3,4 ,9,8,7,6 ,-10,10,-5,2 ,i,j;int max,row,cloum;max=a 0 0;row=0;colum=0;/*假定假定a 0 0 为最大值为最大值*/for(i=0;i3;i+)for(j=0;j4;j+)if(maxa i j )max=a i j ;row=i;colum=j;/*记下记下a 0 0 的行和列下标的行和列下标 */printf(max=%d,row=%d,colum
47、=%dn,max,i ,j );/*max(最大值最大值),row(行下标行下标)和和colun(列下标列下标)*/*记下新的最大值和下标记下新的最大值和下标*/定义二维数组定义二维数组a并初始化并初始化 row,colum典型算法典型算法2 矩阵所有元素求和矩阵所有元素求和main()int i,j,a34=1,2,3,4,5,6,7,8,9,10,11,12;int sum=0;for(i=0;i3;i+)for(j=0;j4;j+)sum+=a i j ;for(i=0;i3;i+)for(j=0;j4;j+)printf(%d ,a i j );printf(n);printf(sum
48、=%dn,sum);定义二维数组定义二维数组a并初始化并初始化输出数组输出数组a的元素的元素输出数组输出数组a的一行元素的一行元素输出换行符输出换行符求数组求数组a的元素之和的元素之和典型算法典型算法3 求方阵主对角线元素之和求方阵主对角线元素之和1main()int i,j,a44=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;int sum=0;for(i=0;i4;i+)for(j=0;j4;j+)sum+=a i j ;printf(sum=%dn,sum);定义二维数组定义二维数组a并初始化并初始化求数组求数组a的主对角线元素之和的主对角线元素之和*i
49、f(i=j)典型算法3 求方阵主对角线元素之和2main()int i,j,a44=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;int sum=0;for(i=0;i4;i+)sum+=;printf(sum=%dn,sum);定义二维数组定义二维数组a并初始化并初始化求数组求数组a的主对角线元素之和的主对角线元素之和*a i i 例4 求方阵副对角线元素之和1main()int i,j,a44=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;int sum=0;for(i=0;i4;i+)for(j=0;j4;j+)sum+=a
50、 i j ;printf(sum=%dn,sum);定义二维数组定义二维数组a并初始化并初始化*if(i+j=3)典型算法典型算法4 求方阵副对角线元素之和2main()int i,j,a44=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;int sum=0;for(i=0;i4;i+)sum+=;printf(sum=%dn,sum);定义二维数组定义二维数组a并初始化并初始化*a i 3-i 典型算法典型算法5 求方阵主对角线以上的元素之和求方阵主对角线以上的元素之和1main()int i,j,a44=1,2,3,4,5,6,7,8,9,10,11,12,
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。