数组的概念
什 么是数组
数组是 相同类型, 有序数据的集合。
数 组的特征
数组中的数据被称为数组的 元素,是同构的
数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间)
衍生概念:
下标(索引)
下标或索引代表了数组中元素距离第一个元素的偏移位置。
数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址)。
数组的下标是从0开始的
一维数组
数 1 组的定义
说明:
数组的 类型说明符由数组中的 元素来决定,也就是元素是什么类型,数组就是什么类型
数组名也是标识符, 我们所说的 数组(名),大家可以理解为 数据类型是数组的变量(名)。
数组容量也可以叫做常量表达式,举例: int ages[10]、int lcd[1024*768]
类型:代表了数组中元素的类型
容量:数组中能存储多少个元素,数组容量可以是一个常量、常量表达式,还可以是符号常量,但必 须是整型。
深入理解:
定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单元是连续 的。
定义一个数组,相当于定义了多个匿名变量,这些变量可以通过
举例:
// 定义一个数组
int arr[10];
// 问题:上面数组中,最小下标0,最大下标9 数组名[下标] 来标识。
经过上面的案例,分析得到
数组的最大下标 = 数组元素个数(数组容量) - 1
数 组元素的访问
原则:数组中的元素不能一次性访问所有元素,只能一个一个的访问。
访问方式:
数组名[下标];
举例:
注意:数组元素的访问一定不能越界。
案例:
数组的初始化
定义
数组的同时,用指定数据来给对应元素赋值。
简化数组定义后,需要对元素一一赋值操作。
语法规则:
类型 数组名[容量] = {常量1,常量2,常量3...};
注意事项:
数组可以部分初始化:也就是可以给数组中前几个元素初始化,未被初始化的元素系统将自动初始 化,如0;如果定义数组时未指定数据容量,则系统会根据初始化元素的个数来决定数组容量。
衍生概念:
柔性数组:柔性数组的概念是在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数 组;
广义简单理解:数组容量待定或者待确定的数组,举例:int arr[] = {1,2,3,4,5}
面试题: 在不知道数组类型的情况下,如何确定数组元素的个数
int length = sizeof(arr) / sizeof(arr[0]) int arr[] = {1,2,3,4,5}
说明:
一维数组案例
案例1:
数组的典型应用:
数据排序
冒泡排序
向后冒泡
思想:
-
一次只排好一个数,针对n个数,最差情况需要 n-1次就可以排好
-
每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,将较 大/较小的数就会出现在最后,这也是该数应该有的位置。
-
在余下的数中,再次应用第2步的操作,直到只剩下一个数。
向前冒泡
思想:
-
一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好
-
每次排序假定第一个元素是最大/最小的,用第一个元素的后面的元素一一与第一个元素比较, 遇到较大/较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数;
-
在余下的数中,再次应用第2步的操作,直到只剩下一个数。
一维数组案例
案例2:
#include <stdio.h>
int main()
{
int arr[11];
int k,j,t;
int length=sizeof(arr)/sizeof(int);
printf("请输入11个数组:\n");
for(k=0;k<length;k++)
{
scanf("%d",&arr[k]);
}
printf("\n");
for(int i=0;i<length-1;i++)
{
for(int j=0;j<length-1-i;j++)
{
if(arr[j]>arr[j+1])
{
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
printf("冒泡排序后的遍历数组:\n");
for(k=0;k<length;k++)
{
printf("%4d",arr[k]);
}
printf("\n");
return 0;
}
案例3:
章节作业
一维数组练习题
-
键盘录入一组数列,利用冒泡排序将数据由大到小排序
-
从键盘输入年、月、日,计算并输出该日是该年第几天
-
键盘录入一组数列,求最大数、最小数、均值
-
从键盘录入一组数列,判断是否是回文,举例:12321,abba,121
-
用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值;
-
通过键盘输入 10 个学员成绩,
1)输出不及格学员的成绩和下标。
2)求最高分的下标值
3)求最低成绩的下标值
4)求总成绩及平均成绩
二维数组练习题
-
一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则 提示。
-
二维整型数组,求所有元素平均值,求每行最大值,求每列最小值。
-
在行列相等数组计算主对角线元素的和
-
计算一个矩阵下三角元素的和
-
电影院为了答谢影迷的支持,在某一排的某一列座位上放置了一个大礼包,放置礼物的位置具有这 样的规则(行和列的平方和为开店日期 512(5月12日)); 请设计程序找出大礼包的位置,(假定电影院有20排,每排25个座位)
字 符数组练习题
-
编写一个程序,读取用户输入的字符串,并将其反转输出。
-
编写一个程序,判断用户输入的字符串是否为回文(即正反读都一样的字符串)。
思 考题【选做】:
- 求出一个矩阵的鞍点。鞍点的含义为行上最大同时列上也最大。