当前位置: 首页 > news >正文

c语言基础09

c语言基础07

数组

数组的概念

数组是相同类型有序数据的集合。

在这里插入图片描述

数组的特征
  • 数组里的数据被称为数组的元素
  • 数组中的元素存放在内存空间
衍生概念:下标(索引)
  • 下标或者索引代表了数组中元素距离第一个元素的偏移量。
  • 数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址,内存中每8个bit编一个号,也就是内存地址)
  • 数组的下标是从0开始的。

一维数组

数组的定义
类型说明符/数据类型  数组名[数组容量]

说明:

  • 数组的类型说明符由数组中的元素来决定,类型说明符也就是数据类型。元素是什么类型,数组就是什么类型。同一个数组中,所有元素的类型都是一致的。
  • 数组名也是标识符,数组名,可以理解为数据类型是数组的变量。
  • 数组容量也可以叫做常量表达式或者元素个数,其值必须为整型,可以包含常量和符号常量,但不能是变量

类型:

​ 代表了数组中元素的类型

容量:

​ 数组中能存储多少个元素,数组容量可以是一个常量、常量表达式、还可以是符号常量,但必须是整型。

数组的最大下标 = 数组元素个数 - 1
数组元素的访问

原则:数组中的元素不能一次性访问所有,只能一个一个的访问。

访问方式:

数组名[下标]

注意:数组元素的访问一定不能越界

案例:

  • 利用循环结构给数组元素a[0]~a[9]赋值0~9,并且逆序输出。
#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建一个数组,用来存放0~9的数字
int a[10];
// 使用for循环给数组元素赋值(一般数组配套的都是for循环)
// C语言中,没有提供数组的大小,需要我们自己计算,数组大小 = 数组总字节数 / 1个元素的字节数
int len = sizeof(a) / sizeof(a[0]); // 等价与 int len = sizeof(a) / sizeof(int)
for(int i = 0;i < len; i++)
{
a[i] = i;
}
// 逆序输出
// 遍历:通过循环将数组中的元素一个一个取出来
for(int j = len -1; j>= 0; j--)
{
printf("%4d",a[j]);
}
printf("\n");// 纯粹换行
    
    return 0;
}
数组初始化

定义数组的同时,用指定数据来给对应的元素赋值。

简化数组定义后,需要对元素一一赋值。

语法:

数据类型 数组名[数组容量] = {常量1,常量2,常量3...};

注意事项:

  • 数组可以部分初始化,也就是可以给数组中前几个元素初始化,未被初始化的元素将自动初始化,大概率是0;
int arr[10] = {11,12,13,14,15};
int arr[10] = {11,12,13,14,15,0,0,0,0,0};

int arr[] = {11,12,13,14,15};
int arr[5] = {11,12,13,14,15};
  • 柔性数组

​ 在C99标准,针对结构体的最后一个成员可以是一个未指定大小的数组;

广义理解:数组容量待定或者待确定的数组,举例: int arr[] = {1,2,3,4,5}

面试题:

  • 在不知道数组类型的情况下,如何确定数组元素的个数
int length = sizeof(arr) / sizeof(arr[0])

说明:

​ 1.arr就是我们计算的数组本身, sizeof(arr) 用来计算该数组中总的字节大小。

​ 2.sizeof(arr[0]) 用来计算数组中一个元素所占的字节大小,因为数组中的元素类型相同,

所以计算哪一个都行。

​ 3.sizeof(arr)/sizeof(arr[0]) 就是用数组中总的字节数除以每一个元素所占的字节数,从

而得到元素的个数。

一维数组的案例

案例:

  • 斐波拉契数列
  • 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{
int i;// 循环变量
// 定义一个数组,用来存储数列,默认存储的第1和第2的值是1
int f[20] = {1,1};
// 计算数组的大小
int len = sizeof(f) / sizeof(f[0]);
// 使用for循环,将生成的数据存入数组
for(i = 2;i < len; i++)// i=3
{
f[i] = f[i-2]+f[i-1];// 给数组元素赋值,从数组的第3个元素开始 1,1,2,3,5..
}
// 遍历数组
for(i = 0; i < len; i++)
{
// 遍历的时候,要求每5个换一行,也就是1行显示5个
if(i % 5 == 0)
{
printf("\n");
}
printf("%8d",f[i]);
}
printf("\n");
return 0;
}

案例:

  • 从键盘输入年、月、日,计算并输出该日是该年的第几天
  • 分析:
    • 首先创建一个数组,用来存放每一个月的天数,因为二月比较特殊,初始化的时候设置为0,int t[] = {31,0,31…}
    • 从控制台输入年、月、日
    • 闰年判断,修改数组中二月对应的天数(闰年:29,平年:28)
    • 定义一个变量,用来记录天数,默认值是我们输入的天数:int sum = 14
    • 将当前月之前所有的天数,从数组中取出来进行相加 sum += t[0]+t[1]…
    • 最后打印输出sum
  • 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{
// 定义一个数组,用来存放1~12月的天数,二月比较特殊,暂时不初始化
int t[] = {31,0,31,30,31,30,31,31,30,31,30,31};
// 定义三个变量,用来接收控制台输入的年,月,日
int year,month,day;
printf("请输入年份、月份、天:\n");
scanf("%d-%d-%d",&year,&month,&day);
// 润年的判断,给数组中的二月份赋值天数
if((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0))
t[1] = 29;// 润年
else
t[1] = 28;// 平年
// 创建一个变量,用来记录当前是第几天,默认位当前输入的天数
int sum = day;
// 将对应月份之前的所有月份天数加起来
for(int k = 0; k < month - 1; k++)
{
sum += t[k]; // 叠加前几个月的天数
}
printf("%d月%d日是%d年第%d天。\n",month,day,year,sum);
    return 0;
}
数组的典型应用:冒泡排序
向后冒泡
  • 思想:

    1.一次只排好一个数,针对n个数,最差情况需要n-1次排好

    2.每次排序将相邻数据两两比较,将较大或较小的数据向后交换,等所有数据都比较完成,较大或较小的数就会出现在最后。

    3.在余下的数中再次应用第二步的操作,直到只剩下1个数。

向前冒泡
  • 思想:

​ 1… 一次只排好一个数,针对n个数,最差情况需要n-1次就可以排好

​ 2.每次排序假定第一个元素是最大或者最小的,用第一个元素的后面的元素一一与第一个元素比较,遇到较大或者较小的和第一个元素交换,访问完数组的最后一个元素,就排好了一个数。

​ 3… 在余下的数中,再次应用第2步的操作,直到只剩下1个数。

  • 代码:
#include <stdio.h>
int main(int argc,char *argv[])
{
// 创建一个数组,用来存储排序的序列
	int arr[10];
// 定义三个变量 i:比较的轮数(0~len-1)j:每一轮比较的次数(0~len-1-i)temp:临时变量,用来实
	现两个变量值的交换
	int i,j,temp;
	printf("请输入10个整数:\n");
// 计算数组的大小
	int len = sizeof(arr) / sizeof(arr[0]);
// 通过循环录入数据
	for(i = 0; i < len; i++)
	{
		scanf("%d",&arr[i]);
	}
		printf("\n");
    
// 冒泡排序
// 第一次循环:控制比较的轮数:轮数 = len -1;
	for(i = 0; i < len - 1; i++)
	{	
// 第二层循环:控制每一轮的比较次数:次数 = len - 1 - i
		for(j = 0; j < len - 1 - i; j++)
	{
// 相邻两个数进行比较,满足条件交换位置
		if(arr[j] > arr[j+1]) // 1 2
	{
		temp = arr[j];
		arr[j] = arr[j+1];
   		 arr[j+1] = temp;
  		}
	}
}
printf("冒泡排序后的数列:\n");
for(i = 0; i < len; i++)
{
	printf("%4d",arr[i]);
}
	printf("\n");
	return 0;
}

二维数组

定义

二维数组本质上是一个行列式的组合,也就是说二维数组由行和列两部分组成。属于多维数组。二维数组数据是通过行列进行解读。

语法
数据类型 数组名[行数][列数]; // 二维数组外层表示行数,内层表示列数
特殊写法
  • 下标可以是整型表达式,如: a[2-1] [2*2-1]
  • 下标可以是已经有值的变量或数组元素,如:a[2*x-1] [b[3] [1]]
  • 数组元素可以出现在表达式中,如:b[1][2] = a[2][3]/2

相关文章:

  • 什么决定了硬件设计质量?
  • Web后端 - Maven管理工具
  • 深入解析计算机网络请求头:常见类型与安全性影响
  • FFmpeg源码:url_find_protocol函数分析
  • maven——使用idea创建maven项目(文件夹上颜色)
  • 15.2 ProcessStartInfo类
  • 浏览器Cookies、SessionStorage 和 LocalStorage
  • RL--2
  • 机器学习:十大算法实现汇总
  • 组件库地址
  • 神经网络新手入门(3)光明顶复出(2006-2012)
  • 每日OJ_牛客_Pre-Post(英文题树的遍历_排列组合)
  • Linux下的Python开发环境
  • 动态规划part7|198. 打家劫舍、213.打家劫舍II、337.打家劫舍III
  • Ruby 文件的输入与输出
  • 深入理解 JVM 的栈帧结构
  • [JVM篇]分代垃圾回收
  • 记忆力训练day19
  • C语言中qsort函数使用技巧
  • AI预测福彩3D新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年2月16日第8弹
  • 张巍任中共河南省委副书记
  • 国防部:赖清德歪曲二战历史,背叛民族令人不齿
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • 独行侠以1.8%概率获得状元签,NBA原来真的有剧本?
  • “75万买299元路由器”事件进展:重庆市纪委等三部门联合介入调查
  • 专访|韩国世宗研究所中国研究中心主任:李在明若上台将推行均衡外交