目录
前言
一.一维数组的定义和初始化
二.二维数组的定义和初始化
三.向函数传递一维数组
四.排序
1.交换法排序
2.选择法排序
五.查找
1.线性查找
2.折半查找
六.向函数传递二维数组
总结
预告
终于来到数组这部分,这部分开始,我个人认为C语言的难度就上来了,希望大家能认真学习,如果文章有问题,欢迎各位指出。
本篇文章主要讲数组类型,数组的定义和初始化,以及对数组名特殊含义的理解,排序,查找,求最大最小值等常用算法
数组(array)是一组具有相同类型的变量的集合,它是一种顺序存储,随机访问的顺序表结构。
使用一个统一的名字来标识这组相同类型的数据,这个名字叫做数组名,构成数组的每个数据项称为数组元素。C程序通过数组的下标实现对数组元素的访问。
例如:定义如下数组来存储5个学生的成绩
Int score[5];
int代表该数组的基类型,即数组中元素的类型下标的个数表面数组的维数
注意:C语言中数组的下标都是从0开始的。在上面定义的数组中,第一个元素为score[0],第五个元素为score[4] 。
例题:计算5个学生的平均成绩
代码如下:
#include
int main(void)
{
int score[5];
int totalscore=0;
int i;
printf("Input the scores of five students:\n");
for (i = 0; i < 5; i++)
{
scanf("%d", &score[i]);
totalscore = totalscore + score[i];
}
printf("The average score is %f\n", totalscore / 5.0);
return 0;
}
我们在编程时,习惯把数组的长度用宏常量或const常量来定义。例如,将第四行代码改为int score[SIZE];,然后在第一行和第二行之间加#define SIZE 5
但是,C89规定在定义数组时不能使用变量定义数组的大小,即下方代码
scanf("%d",&n);
int score[n];
从上面我们可以知道,一维数组的一般定义格式为:
类型 数组名[元素个数];
如果要定义一个二维数组,只需要增加一维数组下标即可,二维数组的一般定义格式为:
类型 数组名[第一维长度][第二维长度];
例如,short matrix[3][4];
注意:
一维数组在内存中占用的字节数为:数组长度×sizeof(基类型)
二维数组在内存中占用的字节数为:第一维长度×第二维长度×sizeof(基类型)
二维数组,既可以按元素初始化,也可以按行初始化,下面俩个语句是等价的:
short matrix[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; //按元素初始化
short matrix[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; //按行初始化
数组第二维的长度声明永远都不能省略。因为C语言中的二维数组元素在C编译程序为其分配内存的连续存储空间是按行存放的,即存放完第一行后存第二行,然后第三行,以此类推。存放时必须知道每一行有多少个元素才能正确计算出该元素相对于二维数组第一个元素的偏移量,这样就必须知道数组第二维的长度,例如:
short matrix[][4] = { 1,2,3,4,5,6,7,8,9 };
运行后只有一种结果
而下面这个就不一定了
short matrix[3][0] = { 1,2,3,4,5,6,7,8,9 };
数组元素和基本型变量一样,既可以出现在任何合法的C表达式中,也可以用作函数参数
例:从键盘输入某班学生某门课成绩(已知每班人数最多不超过40人,具体人数由键盘输入),试编程计算其平均分
代码如下:
#include
#define N 40
int Average(int score[], int n); //Average()函数原型
void ReadScore(int score[], int n); //ReadScore()函数原型
int main(void)
{
int score[N], aver, n;
printf("Input n:");
scanf("%d", &n);
ReadScore(score, n);
aver = Average(score, n);
printf("Average score is %d\n", aver);
return 0;
}
//函数功能:计算n个学生成绩的平均分
int Average(int score[], int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
{
sum += score[i];
}
return sum / n;
}
//函数功能:输入n个学生的某门课成绩
void ReadScore(int score[], int n)
{
int i;
printf("Input score:");
for (i = 0; i < n; i++)
{
scanf("%d", &score[i]);
}
}
若要把一个数组传递给一个函数,那么只要使用不带方括号的数组名作为函数实参调用函数即可(例如上面代码的第10和11行),注意,仅仅是数组名,不带方括号和下标 。
由于数组名代表数组的第一个元素的地址,因此用数组名作函数实参实际上是将数组的首地址传给被调函数。
排序是把一系列无序的数据按照特定的顺序,重新排列为有序序列的过程。
交换法排序借鉴了求最大值、最小值的思想。
在数组中搜索一个特定元素的处理过程,称为查找
线性查找也称顺序查找,算法简单,但效率低下
线性查找数组元素就是使用查找键逐个与数组元素进行比较以实现查找,基本过程为:利用循环顺序扫描整个数组,依次将每个元素与待查找值比较;若找到,则停止循环,输出其位置值;若所有元素都比较后仍未找到指定的数据值,则结束循环,输出“未找到”的提示信息。
折半查找也称对分搜索, 折半查找算法稍复杂,但效率很高。
折半查找的基本思想为:首先选取位于数组中间的元素,将其与查找键进行比较,如果它们的值相等,则查找键被找到,返回数组中间元素的下标。否则,将查找的区域缩小为原来区域的一半,即在一半的数组元素中查找。
———————————————————————————————————————————当待查找信息有序排列时,折半查找比顺序查找的平均查找速度快得多
利用一维数组可以处理一组相关的数据,而对于多组相关的处理则需要使用多维数组。
像需要俩个下标才能表示某个元素的表称为二维表,对二维表格进行数据处理,必须使用二维数组。
1.声明一维数组时,在方括号内可以给出数组长度,也可以不给出数组长度,这时一般用另一个整型形参给定数组的长度
2.数组名作为函数实参时,形参数组和实参数组既可以同名,也可以不同名。
3.在被调函数中改变形参数组元素值时,实参数组元素值也会随之改变。
之后的几篇文章会把排序和查找以及向函数传递二维数组的例子发出来。
感谢大家支持
各位加油!!!