一维数组的定义(精)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可以用赋值语句或输入语句使数组中的元 素得到值,但占运行时间,同时也可以使数组 在程序运行之前初始化,即在编译期间使之得 到初值。
对数组元素的初始化可以用以下方法实现: ⒈ 在定义数组时,对数组元素赋以初值。 如: int a[10]={0,1,2,3,4,5,6,7,8,9}; ⒉ 可以只给一部分元素赋值。 如: int a[10]={0,1,2,3,4}; 表示只给前5个元素赋初值,后5个元素自动赋以0 值。 ⒊ 对static数组不赋初值,系统会对所有元素自动赋 以0值。 即, 如果想使数组a中全部元素值为0,可以这样定 义数组: static int a[5]
a[0] a[2] a[4] a[1] a[3] 0 0 0 0 0
也可以 int a[5]={0};
⒋ 在对全部数组元素赋初值时,可以不指定数组长度。 static int a[5]={1,2,3,4,5};
static int a[ ]={1,2,3,4,5};
例2.用数组来处理求Fibonacci数列问题(求前40项)
b
b[0][0] b[1][0] b[2][0]
b[0][1] b[1][1] b[2][1]
for(i=0;i<=1;i++) for( j=0;j<=2;j++) b[j][i]=a[i][j];
main( ) {static int a[2][3]={{1,2,3},{4,5,6}}; 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]); printf("\n"); } for(i=0;i<=1;i++) for( j=0;j<=2;j++) b[j][i]=a[i][j]; printf("array b:\n"); for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } }
上述算法已经把N个数中最大的数放到了A[N]中,再重 复上述算法,把A[1]到A[N-1]中最大的数放到A[N-1]中,这 样A[N-1]中存放的就是第二大的数,接着把A[1]到A[N-2]中 最大的数放到A[N-2]中,……最后把A[1]到A[2]中大的那个 数放到A[2]中,每重复一次两两比较后,比较的范围就朝前 移动一个位置,此算法经过N-1次就完成了A[1]到A[N]中的 的数由小到大的排列。 注意:如果要由大到小排列则在比较时前一个数比后一个数 小就进行对调,方法相反。 由此可以看出,冒泡法的基本思想就是:在待排序的数据中 ,先找到最大的数据将它放到最后面,再从第二个数据开始 ,找到第二大的数据将它放到第二个位置,以此类推,直到 只剩下最后一个数为止。这种排序方法在排序的过程中,是 小的数就如气泡一样逐层上浮,而使大的数逐个下沉,于是 就形象地取名为起泡排序,又名冒泡排序。
int a[3][3]={1,0,3,4,0,0,0,8,0} int a[ ][3]={1,0,3,4,0,0,0,8,0} int a[ ][3]={{1,0,3},{4,0,0},{0,8,0}}
例1.将一个二维数组行和列元素互换,放到另个二 维数组中。
a
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
三、二维数组的初始化
⒈ 分行给二维数组赋初值。如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
⒉ 可以将所有数据写在花括弧内,按数组排列的顺 序对各 元素赋初值。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ⒊ 可以对部分元素赋初值,不赋的为0。如: int a[3][4]={{1},{5},{9}} int a[3][4]={{1},{0,6},{0,0,11}}; ⒋ 如果对全部元素都赋初值,则定义数组时对第一 维的长 度可以不指定,但第二维的长度不能省。
a[0] a[2] a[4] a[6] a[8] a[1] a[3和符号常量,不能包含变 量,即定义时必须确定数组的大小。
二、一维数组元素的引用
数组必须先定义,然后使用。 C语言规定只能逐个引用数 int n; 组元素而不能一次引用整个数组。 scanf("%d",&n); 引用形式为: int a[n]; 数组名[下标]
2.打擂法: 求10个数最大值和最小值
#include <stdio.h> main() 步骤: { int x[10],i,max,min; 1. 输入:for循环输入10个整数 for(i=0;i<10;i++) 2. 处理: scanf("%d",&x[i]); (a) 先令max=min=x[0] max=min=x[0]; (b) 依次用x[i]和max,min比较 (循环) 若max<x[i],令max=x[i] for(i=1;i<10;i++) 若min>x[i],令min=x[i] { if(max<x[i]) max=x[i]; if(min>x[i]) min=x[i]; 3. 输出:max和min } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }
例2.有一个3×4的矩阵,编程求出其中值最大的那 个元素,以及其所在的行号和列号。(最大值唯一)
第6章
§6.1.1
数 组
一维数组的定义和引用
一、一维数组的定义
⒈ 定义方式: 类型说明符 数组名[整型常量表达式]; 例:int a[10]; ⒉ 说明: ① 数组名的定名规则和变量名相同,遵循标识符定名规 则。 ② 数组名后的常量表达式用[ ]括起来。 ③ 常量表达式表示数组元素的个数,即数组长度。 例: a[10]表示数组a中包括10个元素,分别为 a[0]~a[9]
例1.1 main( ) {int i,a[10]; 通过赋值语句给 for (i=0;i<=9;i++) 数组元素赋值 a[i]=i; (i=9;i>=0;i-) for (i=0;i<=9;i++) (i=0;i<=9;i++) printf("%4d",a[i] ); a[9-i]); a[i]); }
2 3 45
t
程序:
main( ) { int x[50],t,n,i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&x[i]); for(i=0;i<=(n-1)/2;i++) { t=x[i]; x[i]=x[n-1-i]; x[n-1-i]=t; } for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }
输入n 个数给a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
真 a[i]>a[i+1]
a[i]a[i+1]
输出a[1] 到 a[n]
#include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\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("%d ",a[i]); }
f[0] f[1] f[2] f[3] f[4] f[5] f[6] f[7] f[8] f[9] .............
1
1
2 0
3 0
5 0
8 0
13 0
21 0
34 0
55 0
.........
main( ) { int i; static long int f[40]={1,1}; for(i=2;i<40;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<40;i++) { if(i%5= =0) printf("\n"); printf("%12ld",f[i]); } }
例3.将n个整数按逆序重放在数组中(n<=50)。
算法: 设n=7 3 45 2 6 17 66 50
x[0] x[1] x[2] x[3] x[4] x[5] x[6]
50 3 45 66 17 2 6 17 2 45 66 50 3
t=x[i]; x[i]=x[n-i-1]; x[n-i-1]=t;
假设6个数据是: A[1] A[2] A[3] A[4] A[5] A[6] 5 7 4 3 8 6 第一次,A[1]和A[2]比较,5<7 ,不进行对调。 5 7 4 3 8 6 第二次,A[2]和A[3]比较,7>4,进行对调, 5 4 7 3 8 6 第三次,A[3]和A[4]比较,7>3,进行对调, 5 4 3 7 8 6 第四次,A[4]和A[5]比较,7<8,不进行对调。 5 4 3 7 8 6 第五次,A[6]和A[5]比较,8>6,进行对调, 5 4 3 7 6 8 由上例可以看出,对于6个数,排好一个数(最大的数 )需要进行5次比较,可以推断出,对于N个数,一趟 (排好一个数的过程)需要N-1次比较操作。
程序:
main( ) { int x[50],t,n,i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&x[i]); for(i=0,j=n-1;i<j;i++,j--) { t=x[i]; x[i]=x[j]; x[j]=t; } for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }
整型常量或整型表达式 (数组元素的表示形式)
例1.2 main( ) {int i,a[10]; for (i=0;i<=9,i++) scanf("%d",&a[i]); for (i=0;i<=9;i++) printf("%4d",a[9-i] ); }
通过输入语句给 数组元素赋值
三、一维数组的初始化
§6.1.2 一维数组的应用 1.冒泡排序算法 :用冒泡法对10个数排序
(1)从数组A[1]到A[10],把相临的两个数两两进 行比较。即A[1]和A[2]比较,比较完后,A[2]再 与A[3]比较,……最后是A[9]和A[10]比较。 (2)在每次进行比较的过程中,如果前一个数比后一 个数大,则对调两个数,也就是说把较大的数调 到后面,较小的调到前面。比如在第一次的比较 中,如果A[1]比A[2]大则A[1]和A[2]的值就互换。 下图用6个数据来说明以上的算法。
② 二维数组在内存中按行存放
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[1][3]
a[2][2]
a[2][1] a[2][3]
③ 多维数组定义方式与二维数组类似 int x[3][4][2]; float y[4][2][3]; 二、二维数组的引用 引用形式为: 数组名[下标][下标] 注:下标可以是整型表达式,但应在已定义的数组大小的 范围内。
§ 6. 2
二维数组的定义和引用
一、二维数组的定义 类型说明符 数组名[常量表达式][常量表达式] 例:float a[3][4],b[5][10]; 说明: ① 可以把二维数组看作是一种特殊的一维数组。 a[0] a[1] a[2] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
对数组元素的初始化可以用以下方法实现: ⒈ 在定义数组时,对数组元素赋以初值。 如: int a[10]={0,1,2,3,4,5,6,7,8,9}; ⒉ 可以只给一部分元素赋值。 如: int a[10]={0,1,2,3,4}; 表示只给前5个元素赋初值,后5个元素自动赋以0 值。 ⒊ 对static数组不赋初值,系统会对所有元素自动赋 以0值。 即, 如果想使数组a中全部元素值为0,可以这样定 义数组: static int a[5]
a[0] a[2] a[4] a[1] a[3] 0 0 0 0 0
也可以 int a[5]={0};
⒋ 在对全部数组元素赋初值时,可以不指定数组长度。 static int a[5]={1,2,3,4,5};
static int a[ ]={1,2,3,4,5};
例2.用数组来处理求Fibonacci数列问题(求前40项)
b
b[0][0] b[1][0] b[2][0]
b[0][1] b[1][1] b[2][1]
for(i=0;i<=1;i++) for( j=0;j<=2;j++) b[j][i]=a[i][j];
main( ) {static int a[2][3]={{1,2,3},{4,5,6}}; 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]); printf("\n"); } for(i=0;i<=1;i++) for( j=0;j<=2;j++) b[j][i]=a[i][j]; printf("array b:\n"); for(i=0;i<=2;i++) {for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } }
上述算法已经把N个数中最大的数放到了A[N]中,再重 复上述算法,把A[1]到A[N-1]中最大的数放到A[N-1]中,这 样A[N-1]中存放的就是第二大的数,接着把A[1]到A[N-2]中 最大的数放到A[N-2]中,……最后把A[1]到A[2]中大的那个 数放到A[2]中,每重复一次两两比较后,比较的范围就朝前 移动一个位置,此算法经过N-1次就完成了A[1]到A[N]中的 的数由小到大的排列。 注意:如果要由大到小排列则在比较时前一个数比后一个数 小就进行对调,方法相反。 由此可以看出,冒泡法的基本思想就是:在待排序的数据中 ,先找到最大的数据将它放到最后面,再从第二个数据开始 ,找到第二大的数据将它放到第二个位置,以此类推,直到 只剩下最后一个数为止。这种排序方法在排序的过程中,是 小的数就如气泡一样逐层上浮,而使大的数逐个下沉,于是 就形象地取名为起泡排序,又名冒泡排序。
int a[3][3]={1,0,3,4,0,0,0,8,0} int a[ ][3]={1,0,3,4,0,0,0,8,0} int a[ ][3]={{1,0,3},{4,0,0},{0,8,0}}
例1.将一个二维数组行和列元素互换,放到另个二 维数组中。
a
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
三、二维数组的初始化
⒈ 分行给二维数组赋初值。如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
⒉ 可以将所有数据写在花括弧内,按数组排列的顺 序对各 元素赋初值。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ⒊ 可以对部分元素赋初值,不赋的为0。如: int a[3][4]={{1},{5},{9}} int a[3][4]={{1},{0,6},{0,0,11}}; ⒋ 如果对全部元素都赋初值,则定义数组时对第一 维的长 度可以不指定,但第二维的长度不能省。
a[0] a[2] a[4] a[6] a[8] a[1] a[3和符号常量,不能包含变 量,即定义时必须确定数组的大小。
二、一维数组元素的引用
数组必须先定义,然后使用。 C语言规定只能逐个引用数 int n; 组元素而不能一次引用整个数组。 scanf("%d",&n); 引用形式为: int a[n]; 数组名[下标]
2.打擂法: 求10个数最大值和最小值
#include <stdio.h> main() 步骤: { int x[10],i,max,min; 1. 输入:for循环输入10个整数 for(i=0;i<10;i++) 2. 处理: scanf("%d",&x[i]); (a) 先令max=min=x[0] max=min=x[0]; (b) 依次用x[i]和max,min比较 (循环) 若max<x[i],令max=x[i] for(i=1;i<10;i++) 若min>x[i],令min=x[i] { if(max<x[i]) max=x[i]; if(min>x[i]) min=x[i]; 3. 输出:max和min } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }
例2.有一个3×4的矩阵,编程求出其中值最大的那 个元素,以及其所在的行号和列号。(最大值唯一)
第6章
§6.1.1
数 组
一维数组的定义和引用
一、一维数组的定义
⒈ 定义方式: 类型说明符 数组名[整型常量表达式]; 例:int a[10]; ⒉ 说明: ① 数组名的定名规则和变量名相同,遵循标识符定名规 则。 ② 数组名后的常量表达式用[ ]括起来。 ③ 常量表达式表示数组元素的个数,即数组长度。 例: a[10]表示数组a中包括10个元素,分别为 a[0]~a[9]
例1.1 main( ) {int i,a[10]; 通过赋值语句给 for (i=0;i<=9;i++) 数组元素赋值 a[i]=i; (i=9;i>=0;i-) for (i=0;i<=9;i++) (i=0;i<=9;i++) printf("%4d",a[i] ); a[9-i]); a[i]); }
2 3 45
t
程序:
main( ) { int x[50],t,n,i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&x[i]); for(i=0;i<=(n-1)/2;i++) { t=x[i]; x[i]=x[n-1-i]; x[n-1-i]=t; } for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }
输入n 个数给a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
真 a[i]>a[i+1]
a[i]a[i+1]
输出a[1] 到 a[n]
#include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\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("%d ",a[i]); }
f[0] f[1] f[2] f[3] f[4] f[5] f[6] f[7] f[8] f[9] .............
1
1
2 0
3 0
5 0
8 0
13 0
21 0
34 0
55 0
.........
main( ) { int i; static long int f[40]={1,1}; for(i=2;i<40;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<40;i++) { if(i%5= =0) printf("\n"); printf("%12ld",f[i]); } }
例3.将n个整数按逆序重放在数组中(n<=50)。
算法: 设n=7 3 45 2 6 17 66 50
x[0] x[1] x[2] x[3] x[4] x[5] x[6]
50 3 45 66 17 2 6 17 2 45 66 50 3
t=x[i]; x[i]=x[n-i-1]; x[n-i-1]=t;
假设6个数据是: A[1] A[2] A[3] A[4] A[5] A[6] 5 7 4 3 8 6 第一次,A[1]和A[2]比较,5<7 ,不进行对调。 5 7 4 3 8 6 第二次,A[2]和A[3]比较,7>4,进行对调, 5 4 7 3 8 6 第三次,A[3]和A[4]比较,7>3,进行对调, 5 4 3 7 8 6 第四次,A[4]和A[5]比较,7<8,不进行对调。 5 4 3 7 8 6 第五次,A[6]和A[5]比较,8>6,进行对调, 5 4 3 7 6 8 由上例可以看出,对于6个数,排好一个数(最大的数 )需要进行5次比较,可以推断出,对于N个数,一趟 (排好一个数的过程)需要N-1次比较操作。
程序:
main( ) { int x[50],t,n,i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&x[i]); for(i=0,j=n-1;i<j;i++,j--) { t=x[i]; x[i]=x[j]; x[j]=t; } for(i=0;i<n;i++) printf("%5d",x[i]); printf("\n"); }
整型常量或整型表达式 (数组元素的表示形式)
例1.2 main( ) {int i,a[10]; for (i=0;i<=9,i++) scanf("%d",&a[i]); for (i=0;i<=9;i++) printf("%4d",a[9-i] ); }
通过输入语句给 数组元素赋值
三、一维数组的初始化
§6.1.2 一维数组的应用 1.冒泡排序算法 :用冒泡法对10个数排序
(1)从数组A[1]到A[10],把相临的两个数两两进 行比较。即A[1]和A[2]比较,比较完后,A[2]再 与A[3]比较,……最后是A[9]和A[10]比较。 (2)在每次进行比较的过程中,如果前一个数比后一 个数大,则对调两个数,也就是说把较大的数调 到后面,较小的调到前面。比如在第一次的比较 中,如果A[1]比A[2]大则A[1]和A[2]的值就互换。 下图用6个数据来说明以上的算法。
② 二维数组在内存中按行存放
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[2][0]
a[1][3]
a[2][2]
a[2][1] a[2][3]
③ 多维数组定义方式与二维数组类似 int x[3][4][2]; float y[4][2][3]; 二、二维数组的引用 引用形式为: 数组名[下标][下标] 注:下标可以是整型表达式,但应在已定义的数组大小的 范围内。
§ 6. 2
二维数组的定义和引用
一、二维数组的定义 类型说明符 数组名[常量表达式][常量表达式] 例:float a[3][4],b[5][10]; 说明: ① 可以把二维数组看作是一种特殊的一维数组。 a[0] a[1] a[2] a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]