数组
定义
|
|
当定义数组时不填写元素个数,即赋值n个,就会自动初始化为n+1
|
|
在定义数组时,如果有赋值,赋值的个数不能超过元素个数;若是超过,则溢出报错;
|
|
当赋值个数<元素个数,则多余元素自动初始化为0;
|
|
数组元素键盘输入(基本都是靠循环)
|
|
|
|
例题
-
数组逆序输出
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); }
-
找出最大值,以及其位置
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; }
-
数据查找,从键盘输入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; }
-
统计,从键盘输入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; }
-
数组插入,从键盘输入一个位置 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; }
-
有序插入,将数组中存储数据是有顺序的,把 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; }
-
删除:定位再删除;输入位置 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");
-
指定数据删除:假如要删除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,t,j=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");
-
数组合并,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; }
注:
- 编译器不检查下标是否越界;
- 数组传递给函数,不带方括号的数组名即可;