6.1数组的定义
-
数组
数组就是一组具有相同数据类型的若干变量有序组织起来的数据元素集合。
数组声明格式:数据类型 数组名[元素个数];
例:int a[5]; //定义了a[0]到a[5]五个int类型的变量。 -
数组和变量的区别:数组元素在内存中必须储存在一段连续的存储空间里,且顺序必须按由小到大依次存放。
-
一维数组的输入输出
设有定义:int a[3], i;
输入方法:
输入第i个数组元素
scanf(“%d”, &a[i]);
输入整个数组元素
for(i = 0; i < 3; i++)
scanf(“%d”, &a[i]);
输出方法:
输出第i个数组元素
printf(“%d”, a[i]);
输出整个数组元素
for(i = 0; i < 3; i++)
printf(“%d”, a[i]);
6.2数组的应用
- 任务:输入50个学生的某门课程成绩,打印出低于平均分的学生成绩。
#include<stdio.h>
#define N 50//方便修改
int main()
{
int score[N], i, sum = 0;
float avgScore = 0;
for(i = 0; i < N; i++)
{
scanf("%d", &score[i]);
sum = sum + score[i];
}
avgScore = sum/50.0; //sum是整型数据
for(i = 0; i < N; i++)
{
if(score[i]<avgScore)
{
printf("%4d", score[i]);
}
}
}
- 注意事项
1.定义格式:数据类型 数组名[整型常量表达式]; //存储下标必须为整型常量,表示存储元素的个数
2.数组的下标都是从0开始,引用数组元素时下标可为任意表达式,动态决定访问哪个元素
3.数组元素在内存中必须储存在一段连续的存储空间里,且顺序必须按由小到大依次存放。数组名就是存放数组的首地址。
4.一维数组的初始化(即给数组元素赋初值)
int a[5] = {12, 34, 56, 78, 9}; //定义数组的同时赋初值
int a[10] = {12, 34, 56, 78, 9}; //给一部分元素赋初值,后五个元素值为0
int a[] = {12, 34, 56, 78, 9}; //对全部数组元素赋初值,可以不指定数组长度
5.使一个数组中元素值全部为0
正确:
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int a[10] = {0};
错误:
int a[10] = {0*10};
int a[10] = { };
6.建议数组大小使用宏常量,以适应未来可能的变化
#define SIZE 10
int a[SIZE];
6.3顺序查找
- 给定一个分数,查找所有成绩中是否有获得该分数的。
#include<stdio.h>
#define N 10
int main()
{
int a[N] = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
int i, num;
printf("input the num you find:");
scanf("%d", &num);
for(i = 0; i < N; i++)
if(a[i] == num)
break;
if(i != N)
{
printf("The num is in a[N]");
}
else{
printf("The num is not in a[N]");
}
return 0;
}
6.4折半查找
要求:必须是有序数列
- 例:给定一个分数,查找所有成绩中是否有获得该分数的。
#include<stdio.h>
#define N 9
int main()
{
int a[N] = {8, 14, 23, 37, 46, 55, 68, 79, 91};
int num, low=0, high=N-1, mid;
printf("input num:");
scanf("%d", &num);
while(low <= high)
{
mid = (low + high)/2;
if(a[mid] == num)
{
printf("The num is in a[N]");
break;
}
else if(a[mid] > num)
high = mid - 1;
else
low = mid + 1;
}
if(low > high)
printf("The num is not in a[N]");
return 0;
}
6.5比较交换排序
问题:
1.如何解决定义n个变量?
2.如何避免重复,简化代码?
- 对6个数,进行从小到大排序并输出
从第一个数开始,把后面的每个数与第一个数比较,若小于第一个数,就交换。
从第二个数开始,重复上述操作。
#include<stdio.h>
#define N 6
int main()
{
int a[N], i, j, t;
printf("请输入需要排序的值:");
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
for(i = 0; i < N - 1; i++)
for(j = i + 1; j < N; j++)
{
if(a[j] < a[i])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
for(i = 0; i < N; i++)
printf("%4d", a[i]);
}
6.6 冒泡排序
依次和相邻的数比较,最小数逐渐浮到最右侧,如同“冒泡”。
如果有n个数,要进行n-1次比较。第1次比较中要进行n-1次两两比较,第j次比较中要进行n-j次两两比较。
- 对6个数,进行从小到大排序并输出
#include<stdio.h>
#define N 6
int main()
{
int a[N], i, j, t;
printf("请输入需要排序的值:");
for(i = 0; i < N; i++)
scanf("%d", &a[i]);
for(i = 0; i < N - 1; i++)
for(j = 0; j < N - i - 1; j++)
{
if(a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
for(i = 0; i < N; i++)
printf("%4d", a[i]);
}
6.7 二维数组定义
-
二维数组的定义
格式:数据类型 数组名[常量表达式1][常量表达式2]
例如:int a[3][4];//定义三行四列,共有12个元素
在逻辑上,可以把二维数组看成是一个具有行和列的表格或一个矩阵。 -
二维数组在内存中的存放
按行存放:先顺序存放第一行的元素,再存放第二行的元素。 -
二维数组的初始化
初始化有以下四种形式:
1.分行进行初始化
int b[2][3] = {{1, 2, 3}, {4, 5, 6}}
2.不分行的初始化
int b[2][3] = {1, 2, 3, 4, 5, 6}
3.省略第一维的定义,不省略第二维的定义
int b[ ][3] = {1, 2, 3, 4, 5, 6}
4.部分数组元素初始化
int a[3][4] = {{1}, {5}, {9}}; //默认赋给每行的第一个元素,其他元素默认为0
也可以对各行中的某一元素赋初值,如
int a[3][4] = {{1}, {0, 5}, {0, 0, 0, 9}};
也可以只对某几行元素赋初值,如
int a[3][4] = {{1}, {5, 9}};
5.从动态键盘给二维数组元素赋初值
例:int a[3][4]
for (i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
scanf(“%d”, &a[i][j]);
for (i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
printf(“%d”, a[i][j]);
6.8二维数组行列互换
- 例:将一个二维数组行和列元素互换,存到另一个二维数组中。
#include<stdio.h>
int main()
{
int a[2][3] = {1, 2, 3, 4, 5, 6};
int b[3][2];
int i, j;
for(i = 0; i < 3; i++)
for(j = 0; j < 2; j++)
b[i][j] = a[j][i];
for(i = 0; i < 3; i++)
{
for(j = 0; j < 2; j++)
printf("%4d", b[i][j]);
printf("\n");
}
return 0;
}
6.9数组作参数
-
数组作形参时,数组名后面跟[ ]或者[N]。
数组作实参时,数组名后面为空。 -
传递整个数组给另一个函数,可将数组的首地址作为参数传过去。
用数组名作函数参数,只复制一个地址自然比复制全部数据效率高。
由于首地址相同,故实参数组与形参数组占用同一段内存。
在该函数内,不仅可以读这个数组的元素,还可以修改它们。