一.数组的基本概念
数组是按序排列的具有相同类型的数据的集合。用统一的符号 (数组名)来表示,数组中的每一个分量(元素)用下标来区分。
- 下标标明了元素在数组中的位置,从0开始。
- 用数组名和下标就能惟一确定数组中的元素。
二.数组的分类
1.根据数组的维度不同,分为:
- 一维数组
- 二维数组
- 多维数组
2.根据数组元素的数据类型不同,分为:
- 数值数组
- 字符数组
与其他变量相类似,数组也要先定义后使用。
三.一维数值数组的定义
定义形式:
类型说明符 数组名[常量表达式];
类型说明符: 说明数组中各元素的数据类型
常量表达式: 说明数组的大小(即数组中元素的个数)
PS:
-
数组名的命名规则与变量名相同,遵循标识符命名规则,且数组名不能与程序中其他变量同名。
-
说明数组大小的常量表达式必须为整型,并且用方括号括起来(不能用圆括号)。
-
说明数组大小的常量表达式中可以包含常量和符号常量,但不能是变量。
-
数组定义之后,其大小不能再改变。
-
数组被定义后,实际是定义了若干个类型相同的有关联的变量,即数组元素的作用相当于简单变量。
四.一维数值数组的引用
形式:
数组名[下标];
PS:
下标可以是整型常量、整型表达式,或已经有值的整型变量。
定义数组时,下标表示数组的长度或元素的个数;
引用数组元素时,下标表示元素在数组中的序号或位置。
int a[5]; /*定义数组的长度为10*/
t=a[3]; /*使用数组元素a[6]*/
五.一维数值数组的存储
- 数组名是整个数组的首地址,用来唯一标识该数组,是一个由系统分配的常量值。
- 数组名+下标,表示数组中某元素的地址。
- 还可以用取地址运算符“&”,表示数组中某元素的地址。
六.一维数值数组的赋值
1.静态赋值
数据类型 数组名[常量表达式]={初始值,初始值,……};
(1)对数组各元素均赋初值。如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
此时方括号中的常量表达式也可以省略,即可以写成:
int a[ ]= {0,1,2,3,4,5,6,7,8,9};
(2)可以只给数组的前若干个元素赋初值,此时后面的元素均将自动赋以初值0。如:
int a[10]={0,1,2,3,4};
相当于:
int a[10]={0,1,2,3,4,0,0,0,0,0};
部分初始化时,方括号中的常量表达式不能省略。
(3)若要全部元素值为0,可以写成:
int a[10]={0};
相当于:
int a[10]={0,0,0,0,0,0,0,0,0,0};
PS:若定义数组长度与提供的初值个数不相同,则数组长度不能缺省。
2.动态赋值
定义float类型数组price[4];
可以通过scanf函数来进行赋值,例如对第三个元素赋值:
scanf("%f”,&price[2]);
一次只能给一个元素赋值,如果想给数组中多个元素赋值,可以用循环改变下标来实现。例如对这个数组中四个元素进行赋值:
for (i=0;i<= 3; i++)
{
scanf(“%f",&price[i]);}
对单个元素也可以采用直接赋值,例如直接对第三个元素赋值:
prince[2]=5.2;
常见错误:在执行程序过程中,直接对一个数组赋值。
prince[4]={1.3,2.4,5.12,13.14};
在定义数组时可以对数组初始化赋值,但是在程序运行中,只能对单个元素赋值。
七.一维数值数组的输入和输出
原则:只能逐个对数组元素进行操作。
int a[10];
1.输入方法:
输入下标为i的数组元素:
scanf("%d",&a[i]);
输入所有数组元素:
for(i=0;i<10;i++)
scanf("%d",&a[i]);
2.输出方法:
输出下标为i的数组元素
printf("%d",a[i]);
输出所有数组元素:
for(i=0;i<10;i++)
printf("%d",a[i]);
八.一维数值数组的应用
例1:假设某班人数最多不超过40人,具体人数由键盘输入。试编程输出该班某门课成绩的最高分及其学号(学号从0开始顺序编号)。
问题分析:
如何定义数据结构描述该班某门课成绩?
定义一维数组a[40]。
如何输入具体人数?
定义变量n,输入成绩的次数即代表学生人数。
打擂台法:
① 将a[0]作为参考赋给max,将其下标赋给h;
②然后将其它元素依次与max比较,遇到比max大的就将其赋给max,其对应下标赋给h=i;
③全部比较完毕,则max便是最大元素,h就是其学号。
代码如下:
#include<stdio.h>
void main()
{
int a[40],i,n,max,h;
printf("请输入学生的人数:");
scanf("%d",&n);
printf("请输入学生的成绩");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
max=a[0],h=0;
for(i=0;i<n;i++)
if(max<a[i])
{
max=a[i];
h=i;
}
printf("最高成绩是%d 其学号为%d:",max,h);
}
例2:将一个数组中的值按逆序重新存放。例如,原来顺序为5,4,3,2,1,要求改1,2,3,4,5。
问题分析:
假设总共有k个值,对应数组元素的下标从0到k-1,将下标为0的数组元素与下标为k-1的数组元素交换,将下标为1的数组元素与下标为k-2的数组元素交换,将下标为2的数组元素与下标为k-3的数组元素交换,..,如此一直交换到中间的数值。
代码如下:
#include<stdio.h>
void main()
{
int a[5]={5,4,3,2,1},i,n=4,t;
printf("原数组:");
for(i=0;i<5;i++)
printf("%d ",a[i]);
printf("\n");
for(i=0;n>i;i++,n--)
{
t=a[i];
a[i]=a[n];
a[n]=t;
}
printf("逆序后:");
for(i=0;i<5;i++)
printf("%d ",a[i]);
}