【1】数组
1.概念:
一组同种类型的数据的集合
2.特点:
1)类型相同
2)顺序存储
3)地址连续
3.定义格式:
[存储类型] [数据类型] 数组名[大小];
(auto) int num[10];
大小:元素个数
数组名:1)遵守标识符命名规则
2)数组名代表数组的首地址 num <=> &num[0]
数组元素:下标从0开始到n-1 num[0] ~ num[9]
4.数组初始化:
1.全部初始化
int num[5] = {1,2,3,4,5};
初始化完成后的效果:
num[0] = 1;
num[1] = 2;
num[2] = 3;
num[3] = 4;
num[4] = 5;
2.部分初始化
int num[5] = {1,2};
初始化完成后的效果:
num[0] = 1;
num[1] = 2;
num[2] = 0;
num[3] = 0;
num[4] = 0;
数组部分初始化时,未被初始化的元素默认为0.
3.未初始化
int num[5];
数组未初始化时,元素均为随机值。
//int num[5];
num[0] = 1;
num[1] = 2;
//未初始化,后对前两个元素分别赋值,所以未被赋值仍是随机值。
数组的大小:
元素个数 * 数据类型字节数
char ch[5] = {'!','@'}; //5字节
int num[5] = {1,2,3,4,5}; //20字节
double db[8]; //64字节
5.数组的输入和输出:
int num[5] = {0};
scanf("%d",&num[0]);
scanf("%d",&num[1]);
....
scanf("%d",&num[4]);
循环优化:
int i;
for(i=0;i<5;i++)
{
scanf("%d",&num[i]);
}
数组的遍历:
for(i=0;i<5;i++)
{
printf("%d ",num[i]);
}
putchar(10);
练习:按学生学号给22031班10位同学录入C语言成绩,
学号:2203101~2203110
要求:求出该班C语言的平均分,
以及成绩最高的同学学号和成绩不及格的同学学号打印到终端。
【2】排序算法示例
1.冒泡排序
将5 4 3 2 1
五个数按照冒泡排序算法
从小到大排
第一轮:
4 5 3 2 1
4 3 5 2 1
4 3 2 5 1
4 3 2 1 5
第二轮:
3 4 2 1 5
3 2 4 1 5
3 2 1 4 5
第三轮:
2 3 1 4 5
2 1 3 4 5
第四轮:
1 2 3 4 5
算法实现:
N个数从大到小排序:
for循环嵌套:外层循环控制比较轮数,内存循环控制每轮比较次数。
比较轮数:N - 1
比较次数:从N-1逐渐递减
for(i=0;i<N-1;i++)
{
for(j=0;j<N-1-i;j++)
{
if(num[j]<num[j+1])
{
tmp = num[j];
num[j] = num[j+1];
num[j+1] = tmp;
}
}
}
2.选择排序
N个数从小到大排序:
红色箭头i(锁定):从第一个数开始走到倒数第二个数
0 -> N-2
绿色箭头j(遍历):从红色箭头的下一个一直走到最后一个
i+1 -> N-1
黄色箭头k(标记):如果绿色箭头找到目标数据,标记位置。
一开始先让k指向i指向的数据,便于后续j和k进行比较。
算法实现:
for(i=0;i<N-1;i++)
{
k = i;
for(j=i+1;j<N;j++)
{
if(num[j]<num[k])
{
k = j;
}
}
if(k!=i)
{
tmp = num[i];
num[i] = num[k];
num[k] = tmp;
}
}
【3】二维数组
1 概念:
有行有列的数组称为二维数组
2.定义格式:
[存储类型] [数据类型] 数组名[行数][列数];
(auto) int num[10][10];
元素个数:行数 * 列数
3.数组初始化:
1.全部初始化
int num[2][3] = {1,2,3,4,5,6};
int num[2][3] = {{1,2,3},{4,5,6}};
初始化完的效果:
num[0][0] = 1;
num[0][1] = 2;
num[0][2] = 3;
num[1][0] = 4;
num[1][1] = 5;
num[1][2] = 6;
| 1 2 3 |
| 4 5 6 |
2.部分初始化
int num[2][3] = {1,2};
| 1 2 0 |
| 0 0 0 |
int num[2][3] = {{1},{2}};
| 1 0 0 |
| 2 0 0 |
数组部分初始化时,未被初始化的元素默认为0.
3.未初始化
int num[2][3];
//均为随机值
数组的大小:
行数 * 列数 * 数据类型字节数
int num[2][3]; //2*3*4 = 24字节
4.二维数组的输入输出:
int num[2][3] = {0};
scanf("%d",&num[0][0]);
scanf("%d",&num[0][1]);
...
scanf("%d",&num[1][2]);
用for循环优化:
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
scanf("%d",&num[i][j]);
}
}
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",num[i][j]);
}
putchar(10);
}
练习:定义一个三行四列的二维数组,从终端录入数据,
找到最大值和最小值输出,输出时带上元素下标。
例如:
max : num[1][2] = 99
min : num[0][2] = 1
练习:有一个三行三列的矩阵,如下:
| 1 2 3|
| 4 5 6|
| 7 8 9|
求出其非对角线上的元素值的和。