C语言——数组

目录

一维数组

数组定义

数组的声明和初始化

数组元素的访问

编程案例

1. 数组初始化及逆序输出

2. 斐波那契数列

3. 冒泡排序法——从大到小输出

4. 简单选择排序法

二维数组

什么时候用二维数组

二维数组的定义

二维数组的初始化

二维数组的遍历

编程案例


一维数组

数组定义

  • 在 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. 从数列的第一个元素开始,比较相邻的两个元素。
  2. 如果第一个元素比第二个元素大(对于升序排序),则交换它们的位置。
  3. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大数。
  4. 针对所有的元素重复以上的步骤,除了最后一个。
  5. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

算法步骤:

  1. 从数列的第一个元素开始,重复以下步骤:
    • 比较相邻的两个元素,如果第一个比第二个大,则交换它们。
    • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
  2. 在每次的外层循环之后,最大的元素会“冒泡”到数列的末尾。
  3. 重复步骤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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值