一维数组的定义(精)
第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]); }
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项)
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]); } }
a[0] a[2] a[4] a[6] a[8] a[1] a[3] a[5] a[7] a[9]
④ 常量表达式中可以包括常量和符号常量,不能包含变 量,即定义时必须确定数组的大小。
二、一维数组元素的引用
数组必须先定义,然后使用。 C语言规定只能逐个引用数 int n; 组元素而不能一次引用整个数组。 scanf("%d",&n); 引用形式为: int a[n]; 数组名[下标]
可以用赋值语句或输入语句使数组中的元 素得到值,但占运行时间,同时也可以使数组 在程序运行之前初始化,即在编译期间使之得 到初值。
对数组元素的初始化可以用以下方法实现: ⒈ 在定义数组时,对数组元素赋以初值。 如: 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]
例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;
整型常量或整型表达式 (数组元素的表示形式)
例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个数据来说明以上的算法。
程序:
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"); }
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"); }
假设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次比较操作。