C 程序设计教程(18)—— 数组和指针(一):数组
该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。
目录
- C 程序设计教程(18)—— 数组和指针(一):数组
- 一、一维数组
- 1、一维数组的定义
- 2、一维数组的初始化
- 3、一维数组的应用举例
- 二、二维数组
- 1、二维数组的定义
- 2、二维数组的初始化
- 3、二维数组的应用举例
一、一维数组
数组是一个由若干同类型变量组成的集合。数组由连续的存储单元组成,最低地址对应数组的第一个元素,最高地址对应数组的最后一个元素,数组可以是一维数组,也可以是多维数组。
1、一维数组的定义
在 C 语言中,数组必须显示定义,以便编译程序为它们分配存储空间。一维数组的定义形式如下:
类型 name[size];
说明:类型说明指明数组的类型,也就是数组中每一个元素的数据类型。
数组元素是组成数组的基本单元。数组元素也是一种变量,数组元素的一般形式如下:
数据名[下标]
其中:下标只能为整型常量或整型表达式,下标表示元素在数组中的序号。例如:
int i=1,j=1;
int a[10];
a[5]=10;
a[i+j]=8;
a[i++]=6;
数组元素也称为下标变量。
例如:输入 5 个数,求其平局值。程序如下:
#include<stdio.h>
int main()
{
int i;
float a[5],sum=0;
for(i=0;i<5;i++){
printf("请输入第%d个数值:",i+1);
scanf("%f",&a[i]);
sum+=a[i];
}
printf("五个数的平均值为:%f",sum/5);
}
以上程序的运行结果如下:
说明:
(1)对变量的任何操作都适合于数组元素,因为数据元素本身等价于同一数据类型的变量。
(2)在定义数组时,下标不能使用变量,但在引用数组元素时下标可以使用变量。
(3)引用数组元素时下标不能超出范围。
2、一维数组的初始化
数组的初始化是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的,可以减少运行时间,提高效率。数组初始化的一般形式为:
类型说明符 数组名[常量表达式]={值1, 值2, ..., 值n};
数组初始化可以采用以下几种形式:
(1)对所有数组元素赋值
例如:
int a[10]={,1,2,3,4,5,6,7,8,9,10};
(2)给部分数组元素赋值
例如:
int a[10]={1,2,3,4};
给前 4 个数组元素赋值,后 6 个数组元素的值为 0。
(3)如果使一个数组全部的数组元素值为 0,可以使用如下格式:
int a[10]={0};
如果定义一个全局数组或静态数组,并且没有进行初始化,系统自动将所有数组元素赋值为 0。
(4)在对全部数组元素赋值时,可以不指定数组的长度,系统会自动计算长度。
例如:
int a[]={1,2,3,4,5};
//等价于
int a[5]={1,2,3,4,5};
3、一维数组的应用举例
(1)输出斐波那契(Fibonacci)数列的前 20 项
斐波那契数列有如下规律:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)。
程序如下:
#include<stdio.h>
int main()
{
int a[20]={1,1},i;
printf("%10d%10d",a[0],a[1]);
for(i=2;i<20;i++){
if(i%5==0){
printf("\n");
}
a[i]=a[i-1]+a[i-2];
printf("%10d",a[i]);
}
}
以上程序的运行结果如下:
(2)输入10 个整数存入数组,求最大值
程序如下:
#include<stdio.h>
int main()
{
int a[10],i,max;
for(i=0;i<10;i++){
printf("请输入第%d个整数:",i+1);
scanf("%d",&a[i]);
}
max=a[0];
for(i=1;i<10;i++){
if (max<a[i]){
max=a[i];
}
}
printf("10个整数中的最大值为:%d",max);
}
以上程序的运行结果如下:
二、二维数组
1、二维数组的定义
二维数组是以一维数组为元素构成的数组,定义形式如下:
类型 数组名[size1][size2];
二维数组在逻辑上是二维的,即下标在两个方向上变化,数组元素在数组中的位置也处于一个平面之中。但是,实际的硬件存储器确实连续输入的,也就是说存储单元是按一维(线性)排列的。
二维数组在内存中的存储方式有两种:一种是按行排列,即放完一行之后顺次放入第二行;另一种是按列排列,即放完一列之后再顺次放入第二列。在 C 语言中,二维数组是按行排列的。
二维数组可以看成一个一维数组,其中的每一个元素又是一个一维数组。例如:数据 a[3][4] 可以看成一个一维数组,它有 3 个元素:a[0]、a[1]、a[2],每个元素又是一个包含 4 个元素的一维数组。例如元素 a[0] 有 4 个元素:a[0][0]、a[0][1]、a[0][2]、a[0][3]。
2、二维数组的初始化
二维数组的初始化也是在数组定义时给各数组元素赋予初值。二维数组的初始化有以下几种形式:
(1)按行分段赋值
int a[3][5]={{33,44,55,66,77},{12,13,14,15,16},{101,102,103,104,105}};
(2)按行连续赋值
#include<stdio.h>
int main()
{
int a[3][5]={33,44,55,66,77,12,13,14,15,16,101,102,103,104,105};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<5;j++){
printf("%8d",a[i][j]);
}
printf("\n");
}
}
以上程序的运行结果如下:
(3)可以只对部分元素赋初值,为赋值的元素自动取值为 0
例如:
int a[3][3]={{1},{2},{3}};
//对每一行的第一个元素赋值,赋值的结果为
1 0 0
2 0 0
3 0 0
(4)如对全部元素赋初值,则第一维的长度可以不给出
例如:
int a[3][3]={1,2,3,4,5,6,7,8,9};
//可以写成以下格式
int a[][3]={1,2,3,4,5,6,7,8,9};
3、二维数组的应用举例
(1)一个学习小组有 5 位同学,每人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。成绩如下:
张 | 王 | 李 | 赵 | 刘 | 平均成绩 | |
---|---|---|---|---|---|---|
数学 | 80 | 61 | 59 | 85 | 76 | 72 |
C 语言 | 75 | 65 | 63 | 87 | 77 | 73 |
数据库 | 92 | 71 | 70 | 90 | 85 | 82 |
程序如下:
#include<stdio.h>
int main()
{
int a[3][5]={{80,61,59,85,76},{75,65,63,87,77},{92,71,70,90,85}};
float v1[3]={0},avg=0;
int i,j;
for(i=0;i<3;i++){
for(j=0;j<5;j++){
v1[i]+=a[i][j];
}
v1[i]/=5;
}
printf("数学平均分为:%f\n",v1[0]);
printf("C语言平均分为:%f\n",v1[1]);
printf("数据库平均分为:%f\n",v1[2]);
printf("各科总平均分为:%f\n",(v1[0]+v1[1]+v1[2])/3);
}
以上程序的运行结果如下:
(2)有一个矩阵,编写程序求出其中元素的最大值,以及其所在的行号和列号。
程序如下:
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
int i,j,max=a[0][0],row=0,col=0;
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if (max<a[i][j]){
max=a[i][j];
row=i;
col=j;
}
}
}
printf("元素的最大值为:%d\n",max);
printf("该元素位于第%d行第%d列。",row,col);
}
以上程序的运行结果如下: