目录
一维数组
数组定义
- 在 C 语言中,数组是一种数据结构,它是一组相同类型元素的有序集合。这些元素在内存中是连续存储的。可以把数组想象成一排连续的小盒子,每个盒子里装着相同类型的数据,比如都是整数或者都是字符。
- 例如,定义一个包含 5 个整数的数组
int arr[5];
,这里arr
就是数组的名字,int
表示数组中的元素类型是整数,5
表示这个数组可以容纳 5 个整数元素。
数组的声明和初始化
声明方式:
- 一般形式为
数据类型 数组名[数组大小];
。例如,float scores[10];
声明了一个名为scores
的数组,它可以存储 10 个float
类型(单精度浮点数)的数据。
初始化方法:
- 可以在声明数组的时候对其进行初始化。例如,
int numbers[3] = {1, 2, 3};
,这里将数组numbers
的三个元素分别初始化为 1、2 和 3。 - 如果初始化时提供的初始值个数少于数组大小,剩余的元素会被自动初始化为 0(对于数值类型)或者空字符
'\0'
(对于字符数组)。例如,int another_array[5]={1, 2};
,那么another_array
的前两个元素是 1 和 2,后三个元素是 0。 - 可以省略数组大小,例如,
int auto_size_array[] = {4, 5, 6};使用sizeof关键字计算数组大小
数组元素的访问
- 通过索引(也称为下标)来访问数组中的元素。在 C 语言中,数组的索引是从 0 开始的。例如,
int a[3] = {1, 2, 3},
对于a[3]
数组,a[0]
表示第一个元素,a[1]
表示第二个元素,a[2]
表示第三个元素。 - 对数组元素进行读取和写入操作。例如:
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
// 读取并打印数组元素
printf("The second element is %d\n", arr[1]);
// 修改数组元素
arr[3] = 45;
printf("The fourth element after modification is %d\n", arr[3]);
return 0;
}
- 也可以使用循环对数组元素进行读取和写入
#include <stdio.h>
int main()
{
int i;
int array[10]; //定义一个名为array的数组,可以存储10个int类型大小的元素
for( i = 0; i < 10; i++ ) //使用循环,用下标的方式对数组进行写入
{
array[i] = i + 1;
}
printf("对数组array赋值后的结果\n");
for( i = 0; i < 10; i++ ) //使用循环,用下标的方式对数组进行读取
{
printf("%d ",array[i]);
}
return 0;
}
编程案例
1. 数组初始化及逆序输出
#include <stdio.h>
int main()
{
int array[10];
int i;
for( i = 0; i < 10; i++ )
{
array[i] = i + 1;
}
printf("对数组array赋值后的结果\n");
for( i = 0; i < 10; i++ )
{
printf("%d ",array[i]);
}
printf("\n对数组array逆向输出后的结果:\n");
for( i = 9; i >= 0; i-- )
{
printf("%d ",array[i]);
}
return 0;
}
2. 斐波那契数列
#include <stdio.h>
int main()
{
int array[15];
int size = sizeof(array) / sizeof(array[0]);
array[0] = 0;
array[1] = 1;
for( int i = 2; i < size; i++ )
{
array[i] = array[i-1] + array[i-2];
}
for( int i = 0; i < size; i++ )
{
printf("%d ",array[i]);
}
printf("\ndone\n");
return 0;
}
3. 冒泡排序法——从大到小输出
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止,这时该数列已经排序完成。
冒泡排序的基本思想是:
- 从数列的第一个元素开始,比较相邻的两个元素。
- 如果第一个元素比第二个元素大(对于升序排序),则交换它们的位置。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
算法步骤:
- 从数列的第一个元素开始,重复以下步骤:
- 比较相邻的两个元素,如果第一个比第二个大,则交换它们。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
- 在每次的外层循环之后,最大的元素会“冒泡”到数列的末尾。
- 重复步骤1,但是每次比较时忽略掉已经排序好的最后一部分元素。
#include <stdio.h>
int main()
{
int array[5];
int i;
int j;
int tmp;
printf("请输入5个整数:\n");
for( i = 0; i < 5; i++ )
{
scanf("%d",&array[i]);
}
printf("显示输入的数据\n");
for( i = 0; i < 5; i++ )
{
printf("%d ",array[i]);
}
printf("\n");
for( i = 0; i < 5 -1; i++ )
{
for( j = 0; j < 5 - i - 1; j++ )
{
if( array[j] < array[ j + 1 ] )
{
tmp = array[j];
array[j] = array[ j + 1 ];
array[ j + 1 ] = tmp;
}
}
}
printf("显示排序后的数据\n");
for( i = 0; i < 5; i++ )
{
printf("%d ",array[i]);
}
printf("\n");
return 0;
}
4. 简单选择排序法
简单选择排序法基本原理
简单选择排序(Simple Selection Sort)是一种基本的排序算法。它的基本思想是:在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
#include <stdio.h>
int main()
{
int array[5];
int i;
int j;
int max;
printf("请输入5个整个数:\n");
for (i = 0; i < 5; i++)
{
scanf("%d",&array[i]);
}
for ( i = 0; i < 5 - 1; i++ )
{
for ( j = i + 1; j < 5; j++ )
{
if( array[i] < array[j] )
{
max = array[j];
array[j] = array[i];
array[i] = max;
}
}
}
for (i = 0; i < 5; i++)
{
printf("%d ",array[i]);
}
return 0;
}
二维数组
什么时候用二维数组
二维数组的定义
在 C 语言中,二维数组可以看作是一种特殊的一维数组,它的每个元素本身又是一个一维数组。例如,定义一个二维数组int a[3][4];
,可以理解为定义了一个包含 3 个元素的一维数组,而这 3 个元素中的每一个又是一个包含 4 个int
类型元素的一维数组。
二维数组在内存中是按行存储的,也就是说,先存储第一行的元素,接着存储第二行的元素,以此类推。对于int a[3][4]
这个数组,其存储顺序是a[0][0]
、a[0][1]
、a[0][2]
、a[0][3]
、a[1][0]
、a[1][1]
、a[1][2]
、a[1][3]
、a[2][0]
、a[2][1]
、a[2][2]
、a[2][3]
。
二维数组的初始化
- 分行初始化:可以按行对二维数组进行初始化,例如:
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
- 按顺序初始化:也可以将所有元素按顺序写在一个大括号内,例如:
int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
- 部分初始化:如果只对部分元素进行初始化,未初始化的元素会被自动初始化为 0。例如:
int a[3][4] = {
{1, 2},
{3, 4}
};
此时,a[0][2]
、a[0][3]
、a[1][2]
、a[1][3]
、a[2][0]
、a[2][1]
、a[2][2]
、a[2][3]
的值都为 0。
- 可以不写行,但是一定要写列
二维数组的遍历
- 最常见的遍历二维数组的方法是使用嵌套的
for
循环。外层循环控制行,内层循环控制列。
在这个示例中,外层循环for (int i = 0; i < 3; i++)
中,i
从 0 变化到 2,代表遍历数组的 3 行。对于每一行i
,内层循环for (int j = 0; j < 4; j++)
使得j
从 0 变化到 3,用于访问该行中的 4 个元素。在循环内部,printf("%d\t", array[i][j]);
语句用于打印出当前元素的值,并且在每一行结束后,通过printf("\n");
进行换行。
编程案例
//输入一个3*4的矩阵,并且求出这个矩阵最大的元素值,及其所在的行号和列号
#include <stdio.h>
int main()
{
int i,j;
int tmp;
int row,column;
int array[3][4] = {0};
printf("请输入12个整数:\n");
for( i = 0; i < 3; i++ )
{
for( j = 0; j < 4; j++ )
{
scanf("%d",&array[i][j]);
}
}
for( i = 0; i < 3; i++ )
{
for( j = 0; j < 4; j++ )
{
printf("%d\t",array[i][j]);
}
printf("\n");
}
tmp = array[0][0];
for( i = 0; i < 3; i++ )
{
for( j = 0; j < 4; j++ )
{
if( tmp < array[i][j] )
{
tmp = array[i][j];
row = i;
column = j;
}
}
}
printf("最大的元素值:%d,行:%d,列:%d\n",tmp,row+1,column+1);
return 0;
}