C语言中使用数组来存储相同类型的大批量数据。
数组:
数组名:起名规则和变量名一样;
定义数组:数组每个元素存储的数据类型+数组名[常量(时表示数组分配存储数据类型的个数也就是长度)]={每个元素,以逗号(,)分割每个数组元素来初始化数组};
以下表读取数组元素,从下标开始,以此累加,分别代表对应数组元素;
该写数组中的元素也是通过下标来读写数组中的元素;
注意数组越累问题,C语言中,程序不能检测数组越界,所以要注意
数组在内存中是一段连续的内存空间
定义方式:
int a[10]={1}; //数组初值只给一个,相当于把第一个元素赋初值,其它元素清零
int a[]={1,2,3,4,5,6,7,8,9,10}; //数组元素赋值个数确定时,可以省略括号中的数组长度
实例:
1、使用键盘输入十个数,保存在数组中,并循环输出:
int a[10]; for (int i=0; i<10;i++ ) { scanf("%d",&a[i]);//阻塞式:程序运行到这里,或者遇到一个函数,函数必须完成某项任务程序才能继续向下执行 } for (int i=0; i<10; i++) { printf("%d ", a[i]); }
2、输入一个数,查询是否在数组中,如果是,输出它所在的位置(该数组元素的下标),如果不是,输出提示。
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int m=0; int b=0; int i=0; for (int k=0; k<10; k++) { printf("请输入要查找的数:"); scanf("%d",&b); for (i=0; i<10; i++) { if (a[i]==b) { m=i; break; } } if (i==10) { printf("未找到要查找的数字 "); }else{ printf("%d ",m); } }
3、输入一个数,插入到一个从大到小排列的有序数组中,我使用的方法比较笨,但是可以得出结果,最简单的办法是定义个flag,用来检测是否插入,如果插入,后续的数组元素后移一位即可
// 输入一个数,插入到一个从大到小排列的有序数组中 int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; int b[11] = {}; int insert = 0; scanf("%d",&insert); for (int i=0; i<10; i++) { if (a[i]>=insert && a[i+1]<=insert) { for (int j=0; j<i; j++) { b[j]=a[j]; } b[i]=insert; for (int j=i; j<10; j++) { b[j+1]=a[j]; } }else{ if (insert>a[0]) { b[0]= insert; for (int j=1; j<=10; j++) { b[j]=a[j-1]; } }else{ for (int j=0; j<10; j++) { b[j]=a[j]; } b[10]=insert; } } } for (int i=0; i<=10; i++) { printf("%d ",b[i]); } printf(" ");
4、输入十个数,使用选择法对十个数进行排序,使用数组存储是个数。最终输出排好的顺序。
int a[10]; int max; int tmp; for (int i=0; i<10; i++) { scanf("%d",&a[i]); } for (int i=0; i<10-1; i++) { max = i; for (int j=i+1; j<10; j++) { if (a[max]<a[j]) { max = j; } } tmp = a[max]; a[max] = a[i]; a[i] = tmp; }
for (int i=0; i<10; i++) {
printf("%d ", a[i]);
}
5、使用冒泡法进行排序:
#define SIZE 10 int a[SIZE]; int b[SIZE]; int max = 0; for (int i=0; i<SIZE; i++) { scanf("%d",&a[i]); } for (int i=0; i<SIZE-1; i++) { max=0; for (int j=0; j<SIZE-i-1; j++) { if (a[j] > a[j+1]) { max=j; } } b[SIZE-i-1]=a[max]; } for (int i=0; i<SIZE; i++) { printf("%d ",a[i]); } for (int i=0; i<SIZE; i++) { printf("%d ",b[i]); }
6、二维数组的使用:把二位数组相同的列的数字加起来赋给另一个一维数组:
int a[4][3] = {0}; int b[3] = {0}; for (int i=0; i<4; i++) { for (int j=0; j<3; j++) { a[i][j]=i+j; printf("%d ", a[i][j]); } printf(" "); } printf(" "); for (int i=0; i<3; i++) { for (int j=0; j<4; j++) { b[i]+=a[j][i]; } printf("%d ",b[i]); } printf(" ");
7、使用选择法对五个学生的成绩进行排序,数组表示五个学生,{学号,数学,语文,英语}下面的程序按照数学成绩进行排序:
#define ID 5 #define KEMU 4 int a[ID][KEMU] = { {1, 89, 87, 76}, {2, 92, 31, 90}, {3, 60, 75, 34}, {4, 70, 43, 71}, {5, 54, 89, 45} }; int tmp=0,m=0; for (int i=0; i<ID; i++) { m=i; for (int j=i; j<ID;j++) { if (a[m][1]<a[j][1]) { m=j; } } for (int k=0; k<4; k++) { if (m!=i) { tmp=a[i][k];; a[i][k]=a[m][k]; a[m][k]=tmp; } } } for (int i=0; i<5; i++) { for (int j=0; j<4;j++) { printf("%d ",a[i][j]); } printf(" "); }
结果:
2 92 31 90 1 89 87 76 4 70 43 71 3 60 75 34 5 54 89 45 Program ended with exit code: 0
8、给出一个数组,求最大值,最小值,平均值,和:
int a[10] = {9, 7, 10, 6, 5, 3, 2, 4, 1, 8}; int min = 0, max = 0; int sum = 0; float avg = 0; min = a[0]; max = a[0]; sum = a[0]; for (int i=1; i<10; i++) { if (min>a[i]) { min=a[i]; } if (max<a[i]) { max=a[i]; } sum+=a[i]; } avg=(float)sum/10; printf("sum=%d,max=%d,min=%d,avg=%.1f ",sum,max,min,avg);