数组概念
数组:是一种构造数据类型,用以处理批量的同种类型的数据。
主要特点:数据量大 ,类型相同
一维数组的定义
语法:
类型说明符 数组名[整型常量表达式];
注意:
方括号里面的内容用于指明数组长度,即数组的元素个数,必须是整型常量表达式
定义数组的实质是在内存中预留一段连续的储存空间以存放数组的全部元素。数组名表示这段连续的存储空间的起始地址(也称为首地址),空间大小由数组类型和元素个数确定。
一维数组的使用
- 一维数组的初始化
同普通变量一样,数组元素也要初始化赋值以后才能使用。 数组属构造数据类型,数组元索是组成数组的基本单位,每个元素是一个下标变量,因此有两种初始化数组元素的方法。
(1)在定义数组的同时初始化数组元索一般形式如下:
类型说明符 数组名[整型常量表达式]={数据值 1,数据值 2,…数据值N};
其中在{}中的各数据值即为对应的各元素初值,各值之间用逗号间隔。
例如,执行语句“int score[10]={90,78,80,85,61,70,95,81,58,76};”后,数组元素score[0]~score[10]的值依次为90,78,80,85,61,70,95,81,58,76
C语言对数组的初始化赋值还有以下几点规定。
① 可以只给部分元素赋初值。
当{}中值的个数少于元素个数时,这时只给前面部分元素赋值,其余未获得初值的元素系统默认赋值为 0。但{}中值的个数不能多于元素个数,也不能一个也没有。例如:
int score[10]={90,78,80,85,61};
表示只给 score[0]~score[4]赋值,而元素 score[5]-score[9]将自动赋0值。
② 只能给元素逐个赋值,不能给数组整体赋值。例如:给 10个元素全部赋1值,只能写为: int score[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为: int a[10]=1;
③ 若给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。系统会自动把(}中的数据个数定义为数组的长度。
(2)先定义数组,再初始化数组元素,这时通常采用循环结构。
#include <stdio.h>
int main()
{
int i, score[10];
for (i = 0; i < 10; i++)
{
scanf("%d", &score[i]);
}
printf("%d", score[1]);
return 0;
}
- 一维数组元素的引用
在C语言中只能逐个地引用数组元素,而不能对数组进行整体引用。例如:
要输出 score 数组中的 50 个数组元素,必须使用循环语句逐个输出各数组元素 (即下标变量):
#include <stdio.h>
int main()
{
int i, score[10];
for (i = 0; i < 10;)
{
score[i++] = 2 * i;
}
for (i = 0; i <= 9; i++)
{
printf("%4d", score[i]);
}
return 0;
}
一维数组的应用举例
- 删除数组元素
已知数组a已经存放有N个其值互不相同的整数。现从键盘输入一个数 x,要求从数组中删除与 x 相等的元素,并将其后的元素逐个向前递补,且将最后一个元素置 0 值。输出删除后的数组。如原数组中无此数,则输出相应提示信息,提示不存在该值的元素。
#include <stdio.h>
#define N 10
int main()
{
int i, x, flag = 0, k;
int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("原数组值:\n");
for (i = 0; i < N; i++)
{
printf("%d", a[i]);
}
printf("请输入要删除的元素值:\n");
scanf("%d", &x);
for (i = 0; i < N; i++)
{
if (a[i] == x)
{
flag = 1;
k = i;
break;
}
}
if (flag == 0)
{
printf("该数组中不存在该值!\n");
}
else
{
if (k == N - 1)
{
a[N - 1] = 0;
}
else
{
for (i = k; i < N - 1; i++)
{
a[i] = a[i + 1];
}
a[i] = 0;
}
printf("\n删除元素%d后的数组值:", x);
for (i = 0; i < N; i++)
{
printf("%4d", a[i]);
}
}
return 0;
}
终端:
- 一维数组的排序
从键盘输入 N 个整数,将其升序排列
A.冒泡排序法
#include <stdio.h>
#define N 10
int main()
{
int a[N], i, j, t; // 定义中间变量 t
printf("请输入%d个数据\n", N);
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
for (j = 0; j < N - 1; j++) // 一共 N 个数 要进行 N - 1 趟比较
{
for (i = 0; i <= N - 1 - j; i++) // 每一趟中需要两两比较的次数
{
if (a[i] > a[i + 1])
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
printf("升序排列如下:\n");
for (j = 0; j < N; j++)
{
printf("%3d", a[j]);
}
return 0;
}
终端:
B.选则排序法
具体实现思路:
逐次选择数组 a中的元素a[i] (i = 0,1,2,3,4,…,N - 2) 与它后边的每一个元素 a[j] (j = i+1,…,N - 1) 进行逐个比较,将a[i]至a[N-1]中的最小值与a[i]交换 (要保证a[i]比任何a[j]都要小)。重复这个过程 N - 1 次,最后 a 数组中元素便被升序排列。
#include <stdio.h>
#define N 10
// 定义数组a[N],下标变量i,j,交换使用中间变量 t,记录 a[i] 至 a[N] 中最小元素的下标变量
int main()
{
int a[N], i, j, k, t;
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < N - 1; i++)
{
k = i;
for (j = i + 1; j < N; j++)
{
if (a[j] < a[k])
{
k = j;
}
if (k != i)
{
t = a[k];
a[k] = a[i];
a[i] = t;
}
}
}
printf("升序排列后的结果为:\n");
for (i = 0; i < N; i++)
{
printf("%3d", a[i]);
}
return 0;
}
终端:
- 数组中递推的应用
利用一维数组,输出斐波那契数列:
1,1,2,3,5,8,13,21,34,55,89…
分析:显然这是一个典型的递推问题,其递推公式如下:
{
当 i = 1; a [i] = 1;
当 i = 2; a [i] = 2;
当 3 <= i <= N; a[i] = a[i-1] + a[i+1];
}
利用循环结构实现设计:
#include <stdio.h>
#define N 10
int main()
{
long i, a[N] = {1, 1};
for (i = 2; i < N; i++)
{
a[i] = a[i - 1] + a[i - 2]; // 用递推公式依次计算出a[2].......
}
for (i = 0; i < N; i++)
{
printf("%ld\t", a[i]);
if ((i + 1) % 5 == 0)
{
printf("\n"); // 每输入 5 个数就换行
}
}
return 0;
}