编写程序时经常会碰到需要存储大量数据的情况,例如,某个班有30名学生,要求输入30个学生的考试成绩并计算平均成绩,找出有多少个学生的成绩高于平均成绩。程序需要先输入这些数据并存储起来,计算平均值后,然后用每个成绩与平均值比较,统计大于平均值的数的个数。如果直接使用前面的知识,那么需要定义30个变量。从实际角度出发,这是不可行的,所以需要有一种好的方式去管理和存储大量数据。
包括C语言在内的高级语言都提供称为数组来存储大量数据。
一维数组
一维数组是数组中最简单的,只需要数组名与一个下标就能唯一地确定数组元素。定义一维数组时需要说明:数组名、数组元素的类型和数组元素的个数。其一般形式如下:
数据类型说明符 数组名[整型表达式];
说明:
(1) 数据类型说明符指定了数组中存放数据的数据类型。
(2) 数组名的命名规则与变量名相同,遵循标识符命名规则。
(3) 数组名后面方括号中说明了数组可以存放的元素的个数,通常是整型常量表达式。部分编译器也允许整型变量,但要求变量有确定的值。
(4) 数组定义后,其下标范围也就确定了。起始下标是0,最大下标是数组元素个数减1。
一维数组的存储
例如语句:
int a[10];
定义了一个数组名为a的数组,其中可以存放10个int类型数据。通过定义,在内存中分配了一段连续的内容空间,这段内存空间的起始地址存放在数组名中,内存空间有10个存储单元,每个存储单元可以存放1个int类型数据,该数组的下标范围是从0到9。
一维数组的引用
定义一维数组后就可以在程序中使用。C语言规定:只能引用数组的元素而不能一次引用整个数组和全部元素。
引用数组元素的一般形式如下:
数组名[下标]
说明:
(1) 下标是整型表达式,如果是浮点数,则系统自动去掉小数部分。
(2) 下标必须在合法的范围之内,即在0到元素个数减1之间。如果下标超出了合法范围,称为下标越界,有可能会导致程序运行过程中发生错误。
(3) 一个数组元素的使用方式与同类型的简单变量相同。
例:从键盘输入10个整数存放到数组中,然后将该数组中元素进行逆序排列,最后输出数组的全部数据。
思路分析:在程序定义一个能够存放10个整数的数组,使用循环语句依次输入每一个元素。对数组元素进行逆序可以对数组的前一半元素进行循环,每次将第i个元素与其对应的第9-i个元素进行交换。最后再使用循环语句依次输出所有元素。
答案参考:
#include <stdio.h>
#define N 10 //数组元素的个数
int main()
{
int i, temp;
int a[N]; //定义数组
for(i=; i<N; i++) //循环输入N个整数
{
scanf("%d", &a[i]); //输入第i个元素
}
for(i=; i<=(N-1)/; i++) //循环进行交换
{
temp = a[i];
a[i] = a[N-1-i];
a[N-1-i] = temp;
}
for(i=; i<N; i++) //循环输入N个整数
{
printf("%d ", a[i]); //输出第i个元素
}
return ;
}
结果示例:
一维数组的初始化
定义数组的同时可以给数组的各个元素赋值,称为数组的初始化。对一维数组进行初始化可以有以下几种形式。
(1) 在定义数组时,为数组全部元素赋予初值。例如:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
(2) 定义数组时,可以给数组的部分元素赋值。例如:
int a[10] = {1, 2, 3, 4, 5};
(3) 对数组的全部元素赋初值时,可以省略数组定义中的数组长度。例如:
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
例:从键盘输入10个整数,使用冒泡法对这10个整数进行从小到大的排序。
思路分析:冒泡排序是一种比较简单的排序算法,对n个数进行升序排序,需要进行n-1趟比较和交换,排序的基本过程如下。
第1趟需要进行n-1次比较,依次对第1和第2个、第2和第3个、…、第n-1和第n个比较,如果有不满足从小到大的就交换,第1趟完成后最大的数放到末尾;
第2趟需要进行n-2次比较,依次对第1和第2个、第2和第3个、…、第n-2和第n-1个比较,如果有不满足从小到大的就交换,第2趟完成后第2大的数放到倒数第2位;
依次类推,第n-1趟就只需比较第1和第2个数1次。
答案参考:
#include <stdio.h>
#define N 10 //参加排序的数据的个数
int main()
{
int i, j, temp;
int a[N];
for(i=; i<N; i++)
{
scanf("%d", &a[i]);
}
for(i=; i<N-1; i++) //排序的趟
{
for(j=; j<N-1-i; j++) //第i趟中相邻数据的比较与交换
{
if(a[j]>a[j+]) //如果相邻数据不是升序, 则交换
{
temp = a[j];
a[j] = a[j+];
a[j+] = temp;
}
}
}
for(i=; i<N; i++)
{
printf("%d ", a[i]);
}
return ;
}
结果示例: