c语言(第六章)数组-谭

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

§6.4 二维数组 一、二维数组的定义
形式: 类型说明符 数组名[常量表达式1] [常量表达式2]
例: int a[4] [10];
float x[8] [20];
注意:
1. 不可将定义写为int a[4,10]。
2. 可将二维数组的元素看成为若干个特殊 的一维数组。 如: int b[3] [4]; 可看成:有三个特殊的一维数组b[0],b[1], b[2],每一个又有四个元素:
§6.2 一维数组 一、一维数组的定义
形式: 类型说明符 数组名[常量表达式]; 例: int a [20]; float x [100];
代表数组元 素的个数
其中 a 和 x 都是数组名。
1. 数组名的确定方法同变量名。
2. C语言用方括号[ ]表示数组元数个数。 对于 int a[5]; 表示有5个元素, 元素的下标从0开始. 数组a的元素分别为:a[0],a[1], a[2], a[3], a [4]
printf("a[%d]=%d, ch[%d]=%c\n", i, a[i], i, ch[i]); printf("%s", ch);
}
a[0]=0, ch[0]=a
a[1]=1, ch[1]=b a[2]=2, ch[2]=c a[3]=3, ch[3]=d a[4]=4, ch[4]=e a[5]=25185, ch[5]=] a[6]=25699, ch[6]= a[7]=23909, ch[7]= a[8]= 22, ch[8]= a[9]=285, ch[9]= Abcde]
可以对部分元素赋初值,但需表达清楚。 如: static int a[3][4]={{1,2},{3},{8}}。 则相当于 1 2 0 0 3 0 0 0 8 0 0 0 若: static int a[3][4]={1,2,3,8}
则相当于 1 2 3 8 0 0 0 0 0 0 0 0
第六章 数组
本章目标 1. 了解数组的数据结构 2. 理解一维和多维数组的定义和关系
3. 了解数组元素在内存的存放规则
4. 了解数组元素和数组名的作用 5. 掌握数组的使用方法 6. 掌握基本的排序算法
§6.1 引言
一、数组具有的特征
数组名 数组元素的个数 数组元素的类型。
二、数组的作用
数组元素的作用相当于简单变量 数组名代表的是数组在内存中的首地址 同一个数组中的元素在内存中是按顺 序连续存放的
例:用冒泡法对10个数进行排序(冒泡排序法) 算法:(从小到大)将两个相邻的数进行比较,将小的 数调换到前头 .
9 8 5 4 2 0 第 1 次 8 9 5 4 2 0 8 5 9 4 2 0
8 5 4 9 2 0
8 5 4 2 9 0
第 5 次
8 5 4 2 0 9
结 果
8 5 4 2 0
第 1 次
例 用冒泡法对10个数排序
排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1], 则交换;然后比较第二个数与第三个数;依次 类推,直至第n-1个数和第n个数比较为止 ——第一趟冒泡排序,结果最大的数被安置在最 后一个元素位置上
(2)对前n-1个数进行第二趟冒泡排序,结果使次大
的数被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后, 排序结束
三、程序举例
例: 将一个二维数组行和列元素互换,存到另 一个二维数组中。例如: 14 b= 2 5 36
123 a= 456
例:将一个二维数组的行列互换存放到另一个数组中. 1 4 即: a= 1 2 3 b= 2 5 4 5 6 3 6 main() { static int a[2][3]={{1,2,3},{4,5,6}}; static int b[3][2],i,j; printf(“array a:\n”); for(i=0;i<=1;i++) { for(j=0;j<=2;j++) { printf(“%5d”,a[i][j]);b[j][i]=a[i][j];} printf(“\n”);} printf(“array b:\n”); for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf(“%5d”,b[i][j]);printf(“\n”);} }
例:一维数组的输入与输出。 main() {int i,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=0;i<=9;i++) printf(“%4d”,a[i]); } 问题? 将输入数据按逆序输出.
例:一维数组的输入与输出。 main() {int i,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=0;i<=9;i++) printf(“%4d”,a[i]); } 将输入数据按逆序输出. for(i=9;i>0;i- -) printf(“%d”,a[i]);
b[0][0], b[0][1], b[0][2], b[0][3], b[1][0], b[1][1], b[1][2], b[1][3], b[2][0], b[2][1], b[2][2], b[2][3],
3. 二维数组的存放方式为: 按行优先。由此可 推广 至三维、n维数组的定义和存放。 即: 最右边的下标变化最快。 4. 初始化: 按行给二维数组赋初值: static int a[3][4]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; 或: static int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
将n个数送入a[1]~a[n] for(j=1 to n-1) for(i=1 to n-j) a[i]>a[i+1]
t
a[i]a[i+ 1] 输出a[1]~a[n]
f
例 用简单选择法对10个数排序
排序过程: (1)首先通过n-1次比较,从n个数中找出最小的, 将它与 第一个数交换—第一趟选择排序,结果最小的数被安 置在第一个元素位置上
运行结果如下:
1
1
2
3
5
8
89
13
144
21
133
34
377
55
610
987
1597
1584
4181
6765
例: 歌手比赛,10位评委打分,去掉最高分,最低 分,得成绩。
main() {int score[10],i,max=-1,min=101,sum=0; float mark; for(i=0;i<10;i++) { printf(“please enter the score %d:”,i+1); scanf(“%d\n”,&score[i]); sum=sum+score[i]; } for(i=0;i<10;i++) { if(score[i]>max)max=score[i]; if(score[i]<min)min=score[i]; } mark=(sum-max-min)/8.0; printf(“The mark of this singer is %f\n”,mark);
二、内存与数组的关系
前面已讲过:数组元素在内存中是按顺 序连续存放的;
重要特性:系统对超出数组元素的使用 不查错。
例:# include <stdio.h>
main( )
{ int a[5]={0, 1, 2, 3, 4}, i; char ch[5]={'a', 'b', 'c', 'd', 'e'}; for (i=0; i<10; i++)
数组 a 在内存中的存放顺序:
a[0]的值 a[1]的值 a[2]的值 a[3]的值 a[4]的值 :
注意:在没有给数组元素赋值以前,没有确 定的值。
二、一维数组的引用
1. 必须象使用变量那样,先定义,后使用
2. 引用数组元素的方式: 数组名[下标]
例:int a[5]; a[0]=1; a[1]=2; : 则 a [0]5+a[1] 6 为正确的算术表达式
用循环for求数列的后18项: for (i=2; i<20; i++) f [i]=f [i –1]+f [i –2];
注意: 下标越界问题: i =2 且 i<20
程序如下:
#include <stdio.h> main ( ) { int i; static int f [20]={1, 1}; for (i=2; i<20; i++) f [i]=f [i–1]+f [i–2]; for (i=0; i<20; i++) { if (i%5 = =0) printf("\n"); printf("%12d",f [i] ); } }
5 8 4 2 0
第 2 次
5 4 8 2 0
第 3 次
5 4 2 8 0
5 4 2 0 8
第 第 第 2 3 4 次 次 次
第 结 4 果 次
第一趟
第二趟
Baidu Nhomakorabea
main() {int a[11], i,j,t; printf(“input 10 number:\n”); for(i=1;i<11;i++) scanf(“%d”,&a[i]); printf(“\n”); for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1]; a[i+1]=t; } printf(“the sorted numbers:\n”); for(i=1;i<11;i++) printf(“%4d”,a[i]); }
表示数组元素的值为:
b[0]=0; b[1]=1; b[2]=2; b[3]=3; b[4]=4; 在此, 只有前5个元素初值确定。
注意:不能只对不连续部分元素或后面的连续
元素赋初值。 语句: int a[10]={, , , , ,1,2,3,4,5};
int a[10]={1, ,3, ,5 , ,7, ,9, ,}; 是错误的。
三、一维数组的应用
求Fibonacci 数列的前20项。 fi=fi-1+fi-2 ,且f1 = f2= 1。 定义数组,并赋初值
static int f [20]={1,1};
/*定义数组的前两个元素*/
注:c规定只有静态数组static和外部存储数组extern才能 进行初始化!(对于构造数据类型如数组、结构体进行 初始化通常定义为静态存储类别)
(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小
的记录,将它与第二个数交换—第二趟选择排序 (3)重复上述过程,共经过n-1趟排序后,排序结束
例:用选择法对10个数进行排序。(记录下标)
main() { int a[10], i,j,t,k; for(i=0;i<10;i++) scanf(“%d”,&a[i]); printf(“\n”); for(i=0;i<9;i++) { k=i; /* min=>k */ for(j=i+1;j<10;j++) if(a[j]<a[k]) k=j; t=a[k];a[k]=a[i];a[i]=t; } printf(“the sorted numbers:\n”); for(i=0;i<10;i++) printf(“%4d”,a[i]); printf(“\n”); }
如对数组元素赋同一初值,必须一一写出:
static int a[10]={2,2,2,2,2,2,2,2,2,2}; 不可写成任何其他形式。
若赋全部元素的初值,可省略常量表达式
int a [ ]={0,1,2,3}; 表示a[4],即只有4个元素。
§6.3 数组应用实例
一、采用循环方式对数组元素赋初值
可通过赋初值决定数组大小。如为二维, 则只可省略第一维的大小。 static int a[ ][4]={1,2,3,…,12};
二、二维数组元素的引用
形式: 数组名[下标1][下标2]
其中的下标为整型表达式,但不得越界。 与一维数组元素一样,二维数组元素相当于同类 型的简单变量。
注意下标值应在已定义的数组大小范围内; 如:int a[2][3];则a[2][3]=3的引用是不合法的。 请区分定义数组a[2][3]和引用元素a[2][3]的不同。
三、数组元素赋初值
对全部元素赋初值。如: int a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19} 表示数组元素的值为: a[0]=10; a[1]=11; : a[9]=19;
对部分元素赋初值(前面的连续元素)。如: int b[10]={0,1,2,3,4};
相关文档
最新文档