Sei sulla pagina 1di 19

C


言 第七讲 数组(一)

序 在实际中我们会碰到一些成批出现的变量,比如数学中

计 常用的向量和矩阵等,这就需要把一组有序的变量或数据作
为一个整体来处理。
数组的概念:具有一定顺序关系的若干同数据类型的变
量组成的集合体,组成数组的变量称为该数组的元素变量,
简称元素。

7.1 一维数组的定义和引用

7.1.1 一维数组的定义:

七 类型说明符 数组名 [ 常量表达式
讲 ]
C 如: char str[10]; 表示数组名为 str ,数组有 10 个元素。
语 说明:
言  数组名命名规则与变量名命名规则相同。
程  常量表达式的值为元素的长度,而非数组下标的最大值。数组的下标从 0
序 开始。如数组 str 的元素为: str[0],str[1],str[2],...,str[8],str[9] 。
设  C 不允许做数组大小的动态定义,即常量表达式式子中不能含有变量。

例 int i=15;
int data[i]; ×( 不能用变量定义数组维数 )




C
语 7.1.2 一维数组元素的引用

程 数组必须先定义,后使用
序 数组元素表示形式: 数组名 [ 下标 ]

计 其中:下标可以是常量或整型表达式
只能 逐个 引用数 值数 组元素 ,不 能一次 引用 整个数 组


引用时下 标值int a[10];出数组 长度 范围
不要超
printf(“%d”,a); (×)
如: int
必须 a[3]; 则数组 a 总共有 3 个元素,
for(j=0;j<10;j++)
引用时分别为printf(“%d\t”,a[j]);
a[0] a[1] a[2] ()
若引用 a[3] ,编译时不 指出 “下标 越界 ”的错
误,而是把 a[2] 下面一个单元的内容作为 a[3] 引
第 用,从而引起程序潜在的错误。


C 7.1.3 一维数组的初始化


初始化方式  
程 int a[5]={1,2,3,4,5};
在定义数组时,为数组元素赋初值

设 等价于: a[0]=1;( 在编译阶段使之得到初值)
a[1]=2; a[2]=3; a[3]=4; a[4]=5;

说明:
若对动态数组不初始化,其元素值为随机数
若对静态数组元素不赋初值,系统会自动赋以 0 值或空串
只给部分静态数组元素赋初值时,其余元素被赋予 0
值或空字串
当全部数组元素赋初值时,可不指定数组长度

static
如 static intint a[5]={6,2,3};
a[5];
等价于: int a[]={1,2,3,4,5,6};
a[0]=6; a[1]=2;a[2]=3; a[3]=0;
等价于: a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0;
第 a[4]=0; 编译系统根据初值个数确定数组维数


C

言 7.1.4 动态赋值 ch7_1.c

序 可以在程序执行过程中,对数组作动态赋值。 这时可用
设 循环语句配合 scanf 函数逐个对数组元素赋值。

#include”stdio.h”
main()
{
int i,max,a[10];
printf("input 10 numbers:\n");
for(i=0;i<10;i++) 错误:
scanf("%d",&a[i]); scanf(“%d”,a[i]);
max=a[0]; 正确:(用指针)
for(i=1;i<10;i++) scanf(“%d”,a + i);
第 if(a[i]>max) max=a[i];
七 printf("max num=%d\n",max);

}
C

言 例 输入 十个学 生的 成绩, 求平 均成绩 ,并将 低于
程 平均成绩 的分 数打印 出来 。

设 92 85 68 75 54 88 98 45 61 79

a[0] 92
a
a[1] 85
a[2] 68
a[3] 75
a[4] 54
a[5] 88
a[6] 98
a[7] 45
a[8] 61
第 79
a[9]


C
#include“stdio.h”

言 main()
程 { int k;

float a[10],sum=0, av;

计 printf(“Input score:\n”);
for(k=0;k<10;k++)
{scanf(“%f”,&a[k]);
sum+=a[k]; }
av=sum/10;
printf(“Average is %8.2f\n”,av);
printf(“The scores which are below the average:\n ”);
for (k=0; k<10; k++)
if (a[k] <av)
第 printf(“%8.0f”,a[k]);
七 } ch7_2.c

C 举例 : 用数组求 Fibonacci 数列的前 20 项

言 Fibonacci 数列为: 1 、 1 、 2 、 3 、 5 、 8 、 13 、
程 21……
序 0 1 f[0]
设 程序如下:
1 1 f[1]
计 main() 2 2 f[2]
{ int i; 3 3 f[3]
static int f[20]={1,1}; 4 5 f[4]
for (i=2;i<20;i++) 5 f[5]
f[i]=f[i-1]+f[i-2];

……...
for(i=0;i<20;i++)
{
if(i%5= =0) printf("\n"); 19 f[19] f[19]

第 printf("%12d",f[i]);


}
} Ch7_3.c
0 c[0][0][0]
C 7.2 二维数组及多维数组 1 c[0][0][1]
c[0][0][2]
语 2

7.2.1 二维数组的定义 元素个数 = 3行数
int c[2][3][4]
行数 列数 * c[0][0][3]
列数
程 定义方式:  4 c[0][1][0]
5 c[0][1][1]
序  数据类型 数组名 [ 常量表达式 ][ 常量表达式 ];
c[0][1][2]
设 6
数组元素的存放顺序 c[0][1][3]
计 例 int a[3][4]; 7
c[0][2][0]
原因 : 内存是一维的
float b[2][5];

………...
c[0][2][1]
二维数组:按行序优先
int c[2][3][4]; c[0][2][2]
c[0][2][3]
多维数组:最右下标变化最快
int a[3,4]; (×) c[1][0][0]
c[1][0][1]
c[1][0][2]
0 a[0][0] c[1][0][3]
int a[3][2]
1 a[0][1] c[1][1][0]
2 c[1][1][1]
a[1][0] c[1][1][2]
a[0][0] a[0][1] 3 a[1][1] c[1][1][3]
20 c[1][2][0]
第 a[1][0] a[1][1] 4 a[2][0] 21 c[1][2][1]
七 a[2][0] a[2][1] 5 a[2][1] 22 c[1][2][2]
讲 23 c[1][2][3]
C

7.2.2 二维数组元素的引用

程 形式:数组名 [ 下标 ][ 下标 ]


注意:行、列下标均从 0 开始,下标不要越界

7.2.3 二维数组元素的初始化
第一维长度省略初始化
部分初始化 全部初始化
分行初始化: 将二维数组分解为多个一维数组,
第一维长度省略初始化
按元素排列顺序初始化 部分初始化 全部初始化
然后再赋予初值,每个一维数组初值用 { } 括起来
。 例
例例 int a[2][3]={{1,2,3},{4,5,6}};
static int a[][3]={{1},{4,5}};
a[2][3]={{1,2},{4}};

例 int a[2][3]={1,2,3,4,5,6};
static int a[][3]={1,2,3,4,5};
a[2][3]={1,2,4};
11 02 03 44 505 06

a[0][0]
1
a[0][0] a[0][1]
2
a[0][1] a[0][2]
43
a[0][2] a[1][0]
04
a[1][0] a[1][1]
05
a[1][1] a[1][2]
06
a[1][2]
Ch7.c

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]


第 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
七 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

C


程 举例


将一个二维数组的行、列元素互换,存到另一个
计 数组中。例如:

1 4
123 2 5
456 3 6

b[0 ][0]
] b[0] [1]
a[0 ][0]
] a[0] [1] a[0] [2] b[1 ][0]
] b [1] [1]
a[1 ][0]
] a[1] [1] a[1] [2] b[2 ][0]
] b [2] [1]



C

程序:
言 main()
程 { static int a[2][3]={{1,2,3},{4,5,6}},b[3][2],i,j;
序 Ch7_4.c


printf("array a:\n");
计 for(i=0;i<=1;i++)
{for(j=0;j<=2;j++)
{ printf("%5d",a[i][j]); b[j][i]=a[i][j]; }
printf("\n");
}
printf("array b:\n");
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
第 }
七 }

C
语 7.3 应用举例




例:对 n 个数由小到大排序。

冒泡法:将相邻两个数 a[0] 和 a[1] 比较,按要求
将这两个数排好序;再将 a[1] 和 a[2] 比较,•••;
直到将最后两个数比较并处理完毕。这时,最大的
一个数已经换到最后一个位置。这是第一轮的比较
和处理。每进行一轮,把剩下的数中最大的一个移
到最后位置,共进行若干轮。
下面以 n=6 为例。



C 共有 n=6
语 个数

程 第 3 次: 第 4 次: 第 5 次:

第 1 次: 第 2 次:
a[0] 与 a[1] 与 a[2] 与 a[3] 与 a[n-2]

a[1] a[2] a[3] a[4] 与 a[n-1]

10 8 8 8 8 8
8 10 5 5 5 5
5 5 10 7 7 7
7 7 7 10 3 3
3 3 3 3 10 1
1 1 1 1 1 10
第 共进行—— n-1 次比较,即
七 令 j 从 1 至 n-1, 每取一个值
讲 第一轮:
,把 a[j-1] 与 a[j] 进行比较
C


剩余 n-1=5 个数

序 第 1 次: 第 2 次: 第 3 次: 第 4 次:
设 a[0] 与 a[1] 与 a[2] 与 a[3] 与 a[4]
计 a[1] a[2] a[3]
8 5 5 5 5
5 8 7 7 7
7 7 8 3 3
3 3 3 8 1
1 1 1 1 8

共进行—— n-2 次比较即令



七 第二轮: j 从 1 至 n-2, 每取一个值,
讲 把 a[j-1] 与 a[j] 进行比较。
C





根据以上分析:可以用双重循环来排序:

2.外循环的循环控制变量 i 控制第几轮,
共进行 n-1 轮比较交换,即 i 从 1 到 n-
1;
3.内循环控制每一轮的比较次数,第 i 轮
共要比较 n-i 次,令循环控制变量 j 从 1
到 n-i, 每次比较 a[j-1] 与 a[j] (或从 0



到 n-i-1 ,每次比较 a[j] 与 a[j+1]) 。
main()
C
语 { int i, j, temp;



int a[6]={10,8,5,7,3,1}; ch7_5.c


计 for (i=1; i<=6-1; i++)
for (j=1; j<=6-i; j++)
if (a[j-1]>a[j])
{ temp=a[j-1];
a[j-1] =a[j] ;
a[j] =temp; }
第 for(i=0;i<6;i++)

讲 printf(“%d\n”,a[i]);
例:求二维数组的最大元素及其所在的行、列坐标。
C
语 #include"stdio.h"
言 Ch7_6.c
程 main()

设 {static int a[2][3]={{1,2,3},{6,5,4}},i,j,m,n,max;

max=a[0][0];
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
if(a[i][j]>max)
{max=a[i][j];
m=i+1;n=j+1;}
第 printf("%d is max,it is on %d column %d row\n",max,m,n);


}
C

言 作业与 上机

序 1. 将一个 数组 的值按 逆序


重新存 放。
2. 求两个矩阵的和矩阵。
3. 打印杨 辉三 角,要 求打
印出 10 行。(课 后习
题)



Potrebbero piacerti anche