C语言数组_04

概念:数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。

在C语言中使用数组必须先进行定义。

一维数组:

一维数组的定义方式为:  类型说明符 数组名 [常量表达式]

例如:int a [10] 它表示定义了一个整型数组,数组名为a,此数组有10个元素,都是整型变量。

需要注意的是:

1)类型说明符是任一种基本数据类型或构造数据类型。对于同一数组,其所有元素的数据类型都是相同的。

2)数组名是用户定义的数组标示符。书写规则应符合标示符的书写规定。

3)方括号中的常量表达式表示数据元素的个数,也称为数组的长度。

4)允许在同一类型说明中,说明多个数组和多个变量。如: 1 int a, b, c, d [10], k[20]; 

5)a[10],表示数组中有10个元素,下标是从0~9。a[0]~a[9],不存在a[10]。

6)C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。

1     // 错误
2     int n;
3     scanf("%d", &n);/*在程序中临时输入数组的大小*/
4     int a [n];
1     // 常见的错误
2     float a[0]; /* 数组大小为0没有意义 */
3     int b(2)(3); /* 不能使用圆括号 */
4     int k, a[k]; /* 不能用变量说明数组大小 */
5     
6     // 正确演示
7     int a[10];
8     float b[10], c[20];
9     char ch[20];

一维数组在内存中的存放,如图:

 

一维数组元素的引用一般形式: 数组名[下标]

一维数组的初始化赋值:

1)类型说明符 数组名[常量表达式] = {值,……值};

2)可以只给一部分元素赋值(表示只给前面元素赋初值,后面元素值为0)。例如:

1     int i;
2     int a[10] = {0, 1, 5, 6};
3     
4     for (i = 0; i < 9; i ++) {
5         printf("%d  ", a[i]);
6     }
7     /*
8      打印结果:0  1  5  6  0  0  0  0  0
9      */

3)在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度),如下:

1     int a[6] = {0, 1, 5, 6, 10, 12};
2     int a[]  = {0, 1, 5, 6, 10, 12}; // 系统会据此自动定义a数组的长度为5

使用冒泡排序对数组进行排序:

 1 void bubble_sort(int arr[], int len) {
 2     int i, j, temp;
 3     for (i = 0; i < len - 1; i ++) {
 4         for (j = 0; j < len - 1 - j; j ++) {
 5             if (arr[j > arr[j + 1]]) {
 6                 temp = arr[j];
 7                 arr[j] = arr[j + 1];
 8                 arr[j + 1] = temp;
 9             }
10         }
11     }
12 }
13 
14 int main(int argc, const char * argv[]) {
15     int arr[] = {20, 54 , 10, 32, 56, 82, 89, 5, 66, 47, 101};
16     int len = (int)sizeof(arr)/sizeof(int);
17     bubble_sort(arr, len); // 从小到大进行排序
18     int i;
19     for (i = 0; i < len; i ++) {
20         printf("%d\n", arr[i]);
21     }
22     return 0;
23 }

 

二维数组:

1、二维数组定义的一般形式为: 类型说明符 数组名[常量表达式] [常量表达式]

例如: 1 float a [6] [8]; // 定义a为6x8(6行8列)的二维数组 

二维数组在概念上是二维的,但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。

如何在一维存储器中存放二维数组,有两种方式:

1)按行排列:即放完一行之后顺次放入第二行。

2)按列排列:即放完一列之后顺次放入第二列。

在C语言中,二维数组是按行排列的。

2、二维数组初始化:

1)直接分行给二维数组赋初值:

1 int a [3] [4] = {{1, 2, 3, 4}, {5, 7, 1, 2}, {6, 1, 4, 3}};

 

2)将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值:

1 int a [3] [4] = {1, 2, 3, 4, 5, 7, 1, 2, 6, 1, 4, 3};

 

3)可以对部分元素赋初值: 1 int a [3] [4] = {{6}, {5}, {9}};

可以对各行中某一元素赋初值: 1 int a [3] [4] = {{6}, {8, 5}, {9, 1, 6}}; 

4)如果对全部元素都赋初值,则定义数组时,对第一维的长度可以不指定,但第二维的长度不能省:

1 int a [] [4] = {1, 2, 3, 4, 5, 7, 1, 2, 6, 1, 4, 3};

3、利用数组进行数据查找--(二分法)这折半查找法介绍

适用情况:在一堆有序数据中查找某数据

 1 #define M 10 

 1 static int a[M] = {-10, 6, 10, 15, 20, 29, 30, 66, 89, 90};
 2     int temp, low, mid, high, found;
 3     low = 0;
 4     high = M - 1;
 5     found = 0;
 6     int d;
 7     
 8     printf("Please input a number:\n");
 9     // 查找 temp 这个数
10     d = scanf("%d", &temp);
11     
12     printf("d = %d\n", d);
13     
14     
15     if (temp < a[0] || temp > a[M - 1]) {
16         printf("There is no %d.\n", temp);
17     }
18     
19     while (low <= high) {
20         mid = (low + high) / 2;
21         if (temp == a[mid]) {
22             found = 1;
23             break;
24         } else if (temp > a[mid]) {
25             low = mid + 1;
26         } else {
27             high = mid - 1;
28         }
29     }
30     if (found) {
31         printf("temp = %d\n", temp);
32     }

  尊重作者劳动成果,转载请注明: 转载自【kingdev】

posted @ 2016-03-07 22:21  Kingdev  阅读(448)  评论(0编辑  收藏  举报