13.5 数组
考点12 一维数组
1.定义方法
格式:类型说明符 数组名 [常量表达式];
其中,类型说明符是指数组元素的数据类型;常量表达式是一个整型值,指定数组元素的个数,即数组的长度,数组的长度必须用[]括起来;常量表达式可以是常量或符号常量,不能包含变量。
例如:int array[5]; /* 定义了一个数组元素类型为整型,长度为5的数组* /
注意:数组的元素下标从0开始,即该数组元素分别为:a[0]、a[1]、a[2]、a[3]、a[4],这也是数组元素的访问方法。
2.一维数组的初始化
一般采用在定义的时候为数组赋值。
例如:int array[5] ={0,1,2,3,4}; /* 分别赋值0,1,2,3,4* /
int array[5] ={0,1,2}; /* 前面三个元素赋值0,1,2,后面两个元素默认为0* /
int array[5] ={0}; /* 给所有5个元素均赋值为0* /
int array[ ] ={0,1,2,3,4}; /* 定义并初始化了一个长度为5的整型数组* /
3.一维数组元素的输入输出
如果需要逐个输入或输出数组元素,则均会使用循环语句实现,以intarray[5]为例:
#include<stdio.h>
void main(){
int array[5],i;
for(i = 0;i < 5;i ++){ /* 输入* /
scanf("% d",&array[i]);
}
for(i = 0;i < 5;i ++){ /* 输出* /
printf("% d",array[i]);
}
}
输入:01234
输出:01234
注意:数组名a本身就是一个指向数组内存区域首地址的指针,其类型与数组元素类型相同。也就是说,数组元素a[i]可以写成*(a+i)。
题型剖析:一维数组的考查比较频繁,其考查形式有:
(1)数组元素的引用,可以使用数组下标和指针两种形式实现,其中最常见的方法是使用数组下标。
例如,要引用整型数组a[5]的第3个元素,使用数组下标的方式为a[2],使用指针的方式为*(a+3)。
(2)数组的遍历,常使用循环语句实现,此时要注意数组的上下界。
例如,要遍历的数组a[5],则该数组的下界为0,上界为4,用程序实现为:
for(i=0;i<5;i++)
...
考点13 排序算法
1.冒泡排序算法
以升序为例,冒泡排序算法的基本思想是:将元素两两进行比较,把大数向后边移动,经过一趟比较,使最大的数移动到数组的最后一位,经过第二趟比较,使第二大的数移动到数组的倒数第二位,依此类推,最终得到一个升序序列。
排序过程如下。
(1)比较第一个数和第二个数,若为逆序a[0] >a[1],则交换;然后比较第二个数与第三个数;依此类推,直到第n-1个数和第n个数比较完成为止,完成第一趟冒泡排序,结果使最大的数放到了最后的位置。
(2)下面需要排序前n-1个元素,按照步骤(1),将这n-1个元素中最大的元素放到前面n-1个元素的最后的位置,也就是整体的倒数第二个位置。
(3)重复上述步骤,直到n-1趟排序过后,整体冒泡排序算法结束。
程序如下:
#include<stdio.h>
void main(){
int a[10],i,j,t;
printf(“Input 10 numbers:\n”);
for(i = 0;i < 10;i++){
/* 由终端接收10 个整数,一般情况下是无序的* /
scanf("% d",&a[i]);
}
printf("\n");
for(i= 0;i < 9;i++){
/* 代表的是执行冒泡排序的次数,统一为从0开始* /
for(j = 0;j < 9-i;j++){
/* 从0开始,两两比较,不用比较已经确定位置的大数* /
if(a[j] >a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(i = 0;i < 10;i++){
printf("% d",a[i]);
}}
2.选择排序算法
仍然以升序排序为例,选择排序算法的基本思想是:在第一趟进行排序时,从所有的元素中找到最小的元素,与第一个元素交换。在进行第二趟排序时,从剩下的n-1个元素中找到最小的,与第二个元素交换。依此类推,完成排序。
排序过程如下:
(1)首先通过n-1次比较,从n个数中找到最小的数,将它与第一个数交换,任最小的数被放到第一个元素的位置上。
(2)再通过n-2次比较,从剩余的n-1个数中找出次小的数,将它与第二个数交换,使次小的数被放到第二个元素的位置上。
(3)重复上述过程,经过n-1趟排序过后得到一个升序序列。
程序如下:
#include<stdio.h>
void main(){
int a[10],i,j,k,x;
printf("Input 10 numbers:\n");
/* 从终端接收是个整数* /
for(i = 0;i < 10;i++){scanf("% d",&a[i]);
}
printf("\n");
for(i=0;i<9;i++){/* 开始进行选择排序算法* /
k = i;
for(j = i+1;j < 10;j ++){
if(a[j] < a[k]){k=j;}
}
if(i!=k)
{ x = a[i];
a[i] = a[k];
a[k] = x;
}
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
{printf("% d",a[i]);}
}
题型剖析:将这两个算法的完整代码写在这里,是为了强调这两个算法的基础性和重要性,排序是解决上机编程的重要工具,要学会灵活运用。要着重理解两重循环中内层循环和外层循环在算法中各自起到的作用,以及它们的联系和区别。
考点14 二维数组
1.定义方法
格式:类型说明符 数组名[常量表达式1][常量表达式2]
例如:int array[3][4]; /* 定义了一个3 ×4 = 12个元素的数组,元素类型为整型* /
注意:(1)二维数组的定义不能写成intarray[3,4];(2)二维数组中元素的排列顺序是按行排列,即存放完第一行的元素之后接着存放第二行的元素,数组名array代表二维数组首地址,a[0]代表数组第0行的首地址,a[i]代表数组第i行的首地址;(3)允许定义多维数组。
2.二维数组的初始化
例如:int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};/* 为3行数组元素分别赋值* /
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; /* 为12个元素赋值* /
int a[3][4] = {{0},{4},{8}} /* 同一维数组一样,没有赋值的元素默认为0* /
int a[][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; /* 为全部元素赋值的时候可以省去第一个常量* /
3.二维数组的输入输出
如果需逐个输入或输出数组元素,则需要使用一个两层循环实现,以array[3][3]为例:
#include<stdio.h>
void main(){
int array[3][3],i,j;
for(i=0;i<3;i++) /* 输入* /
for(j=0;j<3;j++)
scanf("% d",&array[i][j]);
for(i=0;i<3;i++)
{for(j=0;j<3;j++)
printf("% d ",array[i][j]);
printf("\n");
}
}
输入:1 2 3 4 5 6 7 8 9
输出:1 2 3
4 5 6
7 8 9
题型剖析:二维数组考查形式如下:
(1)二维数组元素的引用,多使用数组下标实现,常用于矩阵的运算。
例如,用二维数组a[3][3]存放三阶矩阵A,则该短阵的对角线元素为a[0][0]、a[1][1]、a[2][2]。
(2)二维数组的遍历,常使用嵌套循环语句实现,此时要注意内外两层循环分别表示的意义。
例如,要遍历二维数组a[3][3],用程序实现为:
for(i=0;i<3;i++) /* i表示行坐标/
for(j=0;j<3;j++) /* j表示列坐标/