C语言第九天笔记

数组的概念

什 么是数组

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

数 组的特征

数组中的数据被称为数组的 元素,是同构的

数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间)

衍生概念:

下标(索引)

下标或索引代表了数组中元素距离第一个元素的偏移位置。

数组中元素的地址值,下标越大,地址值越大。(每一块内存空间都有一个独有的内存地址)。

数组的下标是从0开始的

一维数组

数 1 组的定义

说明:

数组的 类型说明符由数组中的 元素来决定,也就是元素是什么类型,数组就是什么类型

数组名也是标识符, 我们所说的 数组(名),大家可以理解为 数据类型是数组的变量(名)。

数组容量也可以叫做常量表达式,举例: int ages[10]、int lcd[1024*768]

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

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

深入理解:

定义一个数组,相当于申请了一个可以容纳所指定元素数量的内存单元。所申请的内存单元是连续 的。

定义一个数组,相当于定义了多个匿名变量,这些变量可以通过

举例:

// 定义一个数组

int arr[10];

// 问题:上面数组中,最小下标0,最大下标9 数组名[下标] 来标识。

经过上面的案例,分析得到

数组的最大下标 = 数组元素个数(数组容量) - 1

数 组元素的访问

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

访问方式:

数组名[下标];

举例:

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

案例:

数组的初始化

定义

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

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

语法规则:

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

注意事项:

数组可以部分初始化:也就是可以给数组中前几个元素初始化,未被初始化的元素系统将自动初始 化,如0;如果定义数组时未指定数据容量,则系统会根据初始化元素的个数来决定数组容量。

衍生概念:

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

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

面试题: 在不知道数组类型的情况下,如何确定数组元素的个数

int length = sizeof(arr) / sizeof(arr[0]) int arr[] = {1,2,3,4,5}

说明:

一维数组案例

案例1:

数组的典型应用:

数据排序

冒泡排序

向后冒泡

思想:

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

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

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

向前冒泡

思想:

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

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

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

一维数组案例

案例2:

#include <stdio.h>

int main()

{

int arr[11];

int k,j,t;

int length=sizeof(arr)/sizeof(int);

printf("请输入11个数组:\n");

for(k=0;k<length;k++)

{

scanf("%d",&arr[k]);

}

printf("\n");

for(int i=0;i<length-1;i++)

{

for(int j=0;j<length-1-i;j++)

{

if(arr[j]>arr[j+1])

{

t=arr[j];

arr[j]=arr[j+1];

arr[j+1]=t;

}

}

}

printf("冒泡排序后的遍历数组:\n");

for(k=0;k<length;k++)

{

printf("%4d",arr[k]);

}

printf("\n");

return 0;

}

案例3:

章节作业

一维数组练习题

  1. 键盘录入一组数列,利用冒泡排序将数据由大到小排序

  2. 从键盘输入年、月、日,计算并输出该日是该年第几天

  3. 键盘录入一组数列,求最大数、最小数、均值

  4. 从键盘录入一组数列,判断是否是回文,举例:12321,abba,121

  5. 用数组存储10个整型数,通过键盘输入一个数,找出该数在数组中的下标值;

  6. 通过键盘输入 10 个学员成绩,

1)输出不及格学员的成绩和下标。

2)求最高分的下标值

3)求最低成绩的下标值

4)求总成绩及平均成绩

二维数组练习题

  1. 一个二维数组赋了初值,用户输入一个数,在该二维数组中查找。找到则返回行列位置,没找到则 提示。

  2. 二维整型数组,求所有元素平均值,求每行最大值,求每列最小值。

  3. 在行列相等数组计算主对角线元素的和

  4. 计算一个矩阵下三角元素的和

  5. 电影院为了答谢影迷的支持,在某一排的某一列座位上放置了一个大礼包,放置礼物的位置具有这 样的规则(行和列的平方和为开店日期 512(5月12日)); 请设计程序找出大礼包的位置,(假定电影院有20排,每排25个座位)

字 符数组练习题

  1. 编写一个程序,读取用户输入的字符串,并将其反转输出。

  2. 编写一个程序,判断用户输入的字符串是否为回文(即正反读都一样的字符串)。

思 考题【选做】:

  1. 求出一个矩阵的鞍点。鞍点的含义为行上最大同时列上也最大。
相关推荐
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer3 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq3 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
aloha_7894 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
hikktn5 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust