第七课 数组

数组

定义

1
2
3
4
5
6
7
8
数据类型 数组名[数组元素个数]
// 数据类型是存储的第一条件
// 数据名引用数组的依据
// 元素的个数必须是常量!
int a[10];   // 定义一个数组,存储 10 个 int 型数据,10 为元素个数,最大下标为 9

// 引用方法
数组名[下标]  // 假设数组的元素个数为 n 个,即下标为 0 至 n-1;

当定义数组时不填写元素个数,即赋值n个,就会自动初始化为n+1

1
数据类型 数组名[] = {value1,value2,...}

在定义数组时,如果有赋值,赋值的个数不能超过元素个数;若是超过,则溢出报错;

1
int a[5] = {1,2,3,4,5,6}         // 溢出

当赋值个数<元素个数,则多余元素自动初始化为0;

1
int a[100] = {0};  // 数组所有元素初始化为0,在移植上似乎有问题,详见笔记"三种初始化数组的方法"

数组元素键盘输入(基本都是靠循环)

1
2
3
4
5
int a[10];
for (int i=0; i<10; i++)
{
  scanf("%d",&a[i]);       // 可以不加取址符
}
1
2
3
4
// 数组不用取值符号的情况
a[10] = {1};             // 依然初始化为 0
scanf("%d",a);           // 从键盘获取一个数值给 a
scanf("%d",a+2);         // 从键盘获取一个value 给 a[2];

例题

  1. 数组逆序输出

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    #include <stdio.h>
    
    void print(int a[], int size) {
    	int i = size;
    	while (i > 0) {
    		i--;
    		printf("%d ", a[i]);
    	}
    	printf("\n");
    }
    
    int main(int argc, char const* argv[]) {
    	int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    	int i = sizeof(a) / sizeof(a[0]);
    	print(a, i);
    }
    
  2. 找出最大值,以及其位置

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        int n;
        int a[100];
        printf("有多少个数: ");
        scanf("%d", &n);
        printf("请依次输入这些数值\n");
    
        /* code */
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
    
        int max = 0;
        for (int j = 1; j < n; j++) {
            if (a[max] < a[j])
                max = j;
        }
        printf("%d %d\n", a[max], max);
        return 0;
    }
    
  3. 数据查找,从键盘输入x,查找首次出现x,在数组中的位置,如果没有返回-1

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        const int a[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
        printf("请输入待查找的值:");
        int x = 0;
        scanf("%d", &x);
    
        int idx = -1;
        for (int i = 0; i < 10; i++) {
            if (x == a[i]) {
                idx = i;
                break;
            }
        }
    
        printf("%d\n", idx);
        return 0;
    }
    
  4. 统计,从键盘输入10个同学成绩存入数组,统计小于平均分的人数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #include <stdio.h>
    #define ArrayLen 10
    
    int main(int argc, char const *argv[])
    {
        printf("请输入 10 位同学的分数:\n");
        int number[ArrayLen];
        int sum = 0;
        for (int i = 0; i < ArrayLen; i++) {
            scanf("%d", &number[i]);
            sum += number[i];
        }
        printf("正在统计中...\n");
        int j = 0;
        for (int i = 0; i < ArrayLen; i++) {
            // 区分 float 和 int 除法
            if (sum / 10.0 > number[i])
                j++;
        }
    
        printf("小于平均分的人数: %d\n", j);
        return 0;
    }
    
  5. 数组插入,从键盘输入一个位置 l,一个数 x,将 x 插入到 l 的位置

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        int a[5] = {1, 2, 3, 5};
        printf("请输入位置和数值:");
        int idx, v;
        scanf("%d%*c%d", &idx, &v);
        if (idx < 0) {
            printf("输入下标有误\n");
            return -1;
        }
        for (int i = 4; i > idx; i--) {
            a[i] = a[i - 1];
        }
        a[idx] = v;
    
        for (int i = 0; i < 5; i++) {
            printf("%d\t", a[i]);
        }
        return 0;
    }
    
  6. 有序插入,将数组中存储数据是有顺序的,把 x 插入到数组中,还有保证数组中元素值仍然有序。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        printf("请输入参数:");
        int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90};
        int v = 9;
    
        scanf("%d", &v);
    
        int idx = 0;
        // 判断 x 插入的位置
        for (int i = 0; i < 10; i++) {
            if (v <= a[i]) {
                idx = i;
                break;
            }
        }
        // 将该位置及以后的所有值全部后移动一位
        for (int i = 9; i > idx; i--) {
            a[i] = a[i - 1];
        }
        // 插入该值
        a[idx] = v;
        // 输出结果
        for (int i = 0; i < 10; i++) {
            printf("%d\t", a[i]);
        }
    
        return 0;
    }
    
  7. 删除:定位再删除;输入位置 L,删除 L 位置的值

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    int a[10] = {23,4,67,3,46,8,40,10,90,40};
    int l,i;
    scanf("%d",&l);
    
    for(i=l; i<10; i++){            // 删除一个数,直接将后面的数向前覆盖
        a[i] = a[i+1];
    }
                                    // Q:删除覆盖后,最后面空出来的值依然保持原值
    for(i=0; i<9; i++){             // 输出结果
        printf("%d ",a[i]);
    }
    printf("\n");
    
  8. 指定数据删除:假如要删除x,if(x==a[i])移动覆盖,记住可能有多个要删除的数据,这时我们删除一个不能停止。必须要把数组中所有数都要删除。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    int a[] = {1,2,3,4,6,2,4,5,6,2};
    int x,tj=0;
    scanf("%d",&x);
    // 首先对删除的数据进行计数,删除走到最后,保证指定的 valve 全部删除
    
    for(int i=0; i<10; ){
        if(x==a[i]){
            t = i;
            for(int i=t; i<10-j; i++){
                a[i] = a[i+1];
                j++;
            }
         if(a[i]!=x) i++;
        }
    }
    
    for(int i=0; i<10-j; i++){
        printf("%d ",a[i]);
    }
    printf("\n");
    
  9. 数组合并,ab合并到c

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    #include <stdio.h>
    #define arrayLen 8
    void print(int a[], int size) {
    	for (int i = 0; i < size; i++) {
    		printf("%d ", a[i]);
    	}
    	printf("\n");
    }
    
    void merge(const int a[], const int b[], int c[], int size) {
    	int i = 0, j = 0;
    	int k = 0;
    	while (i < 4 && j < 4) {
    		if (a[i] <= b[j]) {
    			c[k] = a[i];
    			i++;
    		} else {
    			c[k] = b[j];
    			j++;
    		}
    		k++;
    	}
    	for (int n = i; n < 4; n++) {
    		c[k] = a[n];
    		k++;
    	}
    	for (int n = j; n < 4; n++) {
    		c[k] = b[n];
    		k++;
    	}
    }
    
    int main(int argc, char const* argv[]) {
    	const int a[] = {12, 40, 98, 100};
    	const int b[] = {25, 79, 86, 300};
    	// 12,25,40,79,86,98,100,300
    	int c[arrayLen];
    
    	// 两个数组无序时,先合并在排序
    	// 两个数据有序时,一一比较
    	merge(a, b, c, arrayLen);
    	print(c, arrayLen);
    	return 0;
    }
    

注:

  • 编译器不检查下标是否越界;
  • 数组传递给函数,不带方括号的数组名即可;
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy