C语言 10 数组

news2024/9/20 22:25:35

简单来说,数组就是存放数据的一个组,所有的数据都统一存放在这一个组中,一个数组可以同时存放多个数据。

一维数组

比如现在想保存 12 个月的天数,那么只需要创建一个 int 类型的数组就可以了,它可以保存很多个 int 类型的数据,这些保存在数组中的数据,称为元素

// 12个月的数据全部保存在了一起
int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

可以看到,数组的定义方式也比较简单:

类型 数组名称[数组大小] = {数据1, 数据2...};
  • 后面的数据可以在一开始的时候不赋值
  • 数组大小必须是整数

注意数组只能存放指定类型的数据,一旦确定是不能更改的。

因为数组声明后,会在内存中开辟一块连续的区域,来存放这些数据,所以类型和长度必须在一开始就明确。

创建数组的方式有很多种:

// 直接声明int类型数组,容量为10
int a[10];   

// 声明后,可以赋值初始值,使用{}囊括,不一定需要让10个位置都有初始值,比如这里仅仅是为前三个设定了初始值
// 注意,跟变量一样,如果不设定初始值,数组内的数据并不一定都是0
int b[10] = {1, 2, 4};   

// 也可以通过 [下标] = 的形式来指定某一位的初始值
// 注意下标是从0开始的,第一个元素就是第0个下标位置,比如这里数组容量为10,那么最多到9
int c[10] = {1, 2, [4] = 777, [9] = 666}; 

// 也可以根据后面的赋值来决定数组长度
int c[] = {1, 2, 3};  

基本类型都可以声明数组:

#include <stdio.h>

int main() {
    // 多个字符
    char str[] = {'A', 'B', 'C'};   

    // 实际上字符串就是多个字符的数组形式
    char str2[] = "ABC";  
}

那么数组定义好了,如何去使用它呢?比如现在需要打印 12 个月的天数:

#include <stdio.h>

int main() {
    int arr[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for (int i = 0; i < 12; i++) {
        // 直接通过数组 名称[下标] 来访问对应的元素值
        int days = arr[i];   
        printf("2022年 %d 月的天数是:%d 天\n", (i + 1), days);
    }
}
20221 月的天数是:3120222 月的天数是:2820223 月的天数是:3120224 月的天数是:3020225 月的天数是:3120226 月的天数是:3020227 月的天数是:3120228 月的天数是:3120229 月的天数是:30202210 月的天数是:31202211 月的天数是:30202212 月的天数是:31

当然也可以对数组中的值进行修改:

#include <stdio.h>

int main() {
    int arr[] = {666, 777, 888};
    // 比如现在想要让第二个元素的值变成999
    arr[1] = 999;
    // 打印一下看看是不是变成了999
    printf("%d", arr[1]);
}
999

和变量一样,如果只是创建数组但是不赋初始值的话,因为是在内存中随机申请的一块空间,有可能之前其他地方使用过,保存了一些数据,所以数组内部的元素值并不一定都是 0:

#include <stdio.h>

int main() {
    int arr[10];
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
}
10566448 0 -962063554 32758 1 0 10566394 0 10566554 0

不要尝试去访问超出数组长度位置的数据,虽然可以编译通过,但是会给警告,这些数据是毫无意义的:

#include <stdio.h>

int main() {
    int arr[] = {111, 222, 333};
    // 不能去访问超出数组长度的元素,很明显这里根本就没有第四个元素
    printf("%d", arr[3]);
}
42

多维数组

数组不仅仅只可以有一个维度,也可以创建二维甚至多维的数组,简单来说就是,存放数组的数组:

// 可以看到,数组里面存放的是数组
int arr[][2] = {{20, 10}, {18, 9}};

存放的内层数组的长度是需要确定的,存放数组的数组和之前一样,可以根据后面的值决定

比如现在要存放 2020 - 2022 年每个月的天数,那么此时用一维数组就不方便了,可以使用二维数组来处理:

// 2020年是闰年,2月有29天
int arr[3][12] = {{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                  {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};

这样,就通过二维数组将这三年每个月的天数都保存下来了。

那么二维数组又该如何去访问呢?

#include <stdio.h>

int main() {
    // 2020年是闰年,2月有29天
    int arr[3][12] = {{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
                      {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                      {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
    // 比如现在想要获取2020年2月的天数,首先第一个是[0]表示存放的第一个数组,第二个[1]表示数组中的第二个元素
    printf("%d", arr[0][1]);   
}
29

当然除了二维还可以上升到三维、四维:

int arr[2][2][2] = {{{1, 2}, {1, 2}}, {{1, 2}, {1, 2}}};

多维数组比较复杂,使用得也比较少,这里就不深入研究了。

实战:冒泡排序算法

现在有一个 int 数组,但是数组内的数据是打乱的,现在通过 C 语言,实现将数组中的数据按从小到大的顺序进行排列。

这里使用冒泡排序算法来实现,此算法的核心思想是:

  1. 假设数组长度为 N
  2. 进行 N 轮循环,每轮循环都选出一个最大的数放到后面
  3. 每次循环中,从第一个数开始,让其与后面的数两两比较,如果更大,就交换位置,如果更小,就不动

动画演示:https://visualgo.net/zh/sorting?slide=2-2

#include <stdio.h>

// 冒泡排序
int main() {
    // 乱序数组
    int arr[10] = {16, 5, 7, 32, 59, 10, 64, 1, 38, 41};
    // 遍历数组元素
    for (int i = 0; i < 10; i++) {
        // 是否交换
        _Bool flag = 0;
        // 循环实现交换
        for (int j = 0; j < 10 - i; j++) {
            // 比较当前元素和下一个元素
            if (arr[j] > arr[j + 1]) {
                // 交换两个元素
                int temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
                // 发生了交换,设为1
                flag = 1;
            }
        }
        // 如果都没有发生交换,说明已经排好序了,跳出循环
        if (flag == 0) {
            break;
        }
    }
    // 打印排序后数组
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
}

实战:斐波那契数列解法其二

学习了数组,再来看看如何利用数组来计算斐波那契数列,这里采用动态规划的思想。

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

可以在一开始创建一个数组,然后从最开始的条件不断向后推导,从斐波那契数列的规律可以得知:

fib[i] = fib[i - 1] + fib[i - 2](这里fib代表斐波那契数列)

得到这样的一个关系(递推方程)就好办了,要求解数列第i个位置上的数,只需要知道i - 1i - 2的值即可,这样,一个大问题,就分成了两个小问题,比如现在要求解斐波那契数列的第 5 个元素:

  • fib[4] = fib[3] + fib[2]现在我们只需要知道fib[3]fib[2]即可,那么我们接着来看:
  • fib[3] = fib[2] + fib[1]以及fib[2] = fib[1] + fib[0]
  • 由于fib[0]fib[1]我们已经明确知道是1了,那么现在问题其实已经有结果了

现在设计一个 C 语言程序,利用动态规划的思想解决斐波那契数列问题。

#include <stdio.h>

// 斐波那契数列解法其二
int main() {
    // 斐波那契数列的元素位置
    int index = 6;
    // 根据位置建立数组
    int arr[index];
    // 第一个元素固定为1
    arr[0] = 1;
    // 第二个元素固定为1
    arr[1] = 1;
    // 遍历数组
    for (int i = 2; i < index; i++) {
        // 根据斐波那契数列定义,从第三项开始,每一项都等于前两项之和
        arr[i] = arr[i - 1] + arr[i -2];
    }
    // 打印数组元素
    printf("%d", arr[index - 1]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络编程IO管理

网络 IO 涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 等待内核协议栈的数据准备就绪&#xff1b;将内核中的数据拷贝到用户态的…

vue3 json格式化显示数据(vue3-json-viewer) 对比修改前后数据

需求&#xff1a;对比变更前后数据 npm包下载 npm install vue3-json-viewer --savemain.ts中全局引用 // json可视化 import JsonViewer from "vue3-json-viewer" import "vue3-json-viewer/dist/index.css";app.use(JsonViewer).mount("#app&quo…

鸿蒙界面开发——组件(6):属性字符串(StyledString)文本输入

属性字符串StyledString/MutableStyledString MutableStyledString继承于StyledString&#xff0c;以下统一简称StyledString。 是功能强大的标记对象&#xff0c;可用于字符或段落级别设置文本样式。 通过将StyledString附加到文本组件&#xff0c; 可以通过多种方式更改文本…

深度学习-用神经网络NN实现足球大小球数据分析软件

文章目录 前言一、 数据收集1.1特征数据收集代码实例 二、数据预处理清洗数据特征工程&#xff1a; 三、特征提取四、模型构建五、模型训练与评估总结 前言 预测足球比赛走地大小球&#xff08;即比赛过程中进球总数是否超过某个预设值&#xff09;的深度学习模型是一个复杂但有…

霍尼韦尔、书客、米家护眼大路灯怎么样?终极测评对比和护眼灯王者机型

霍尼韦尔、书客、米家护眼大路灯怎么样&#xff1f;护眼大路灯的重要性不容忽视&#xff0c;它是我们日常生活中用眼的必备工具&#xff0c;也是眼睛能够得到保护重要一环。近年来&#xff0c;护眼大路灯市场呈现出国际大牌的垄断局面&#xff0c;但这也带来了一些问题。为了争…

油猴插件录制请求,封装接口自动化参数

参考&#xff1a;如何使用油猴插件提高测试工作效率 一、背景 在酷家乐设计工具测试中&#xff0c;总会有许多高频且较繁琐的工作&#xff0c;比如&#xff1a; 查询插件版本&#xff1a;需要打开Chrome控制台&#xff0c;输入好几个命令然后过滤出版本信息。 查询模型商品&…

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)

5&#xff0c;结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“…

SpingBoot中使用Swagger快速生成接口文档

目录 一.Swagger快速上手 二.Swagger中的基本注解 三.使用Swagger进行测试 一.Swagger快速上手 Swagger是⼀个接⼝⽂档⽣成⼯具&#xff0c;它可以帮助开发者⾃动⽣成接⼝⽂档。当项⽬的接⼝发⽣变更时&#xff0c;Swagger可以实时更新⽂档&#xff0c;确保⽂档的准确性和时…

【神经网络系列(高级)】神经网络Grokking现象的电路效率公式——揭秘学习飞跃的秘密【通俗理解】

【通俗理解】神经网络Grokking现象的电路效率公式 论文地址&#xff1a; https://arxiv.org/abs/2309.02390 参考链接&#xff1a; [1]https://x.com/VikrantVarma_/status/1699823229307699305 [2]https://pair.withgoogle.com/explorables/grokking/ 关键词提炼 #Grokkin…

组合优化与凸优化 学习笔记3 凸函数

目前学到了73页 凸函数的定义&#xff1a; 人话&#xff1a;函数f的定义域是凸集&#xff08;在一般的情况下就是不能是断开的定义域&#xff08;一般的情况是1维的嘛&#xff09;&#xff0c;假如x是什么多维向量的话就是说x的取值范围是一个凸集内&#xff09;&#xff0c;并…

基于云原生向量数据库 PieCloudVector 的 RAG 实践

近年来&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;已然成为最热门的话题之一。工业界出现了各种内容生成工具&#xff0c;能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现&#xff0c;归功于创新的算法、模型规模的大幅扩展&#xff0c;以及海…

XXL-JOB调度中心与执行器

XXL-JOB是一个轻量级的分布式任务调度平台&#xff0c;主要由调度中心和执行器两部分组成。下面详细讲解调度中心与执行器的功能和作用。 调度中心 调度中心是XXL-JOB的核心组件&#xff0c;负责任务的调度管理。其主要功能包括&#xff1a; 任务管理&#xff1a;调度中心提供…

计算组合数:scipy.special.comb()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 计算组合数&#xff1a; scipy.special.comb() 选择题 以下代码两次输出的结果是&#xff1f; from scipy.special import comb print("【执行】print(comb(3,2))") print(comb(3…

011. Oracle-约束

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

小白学装修 之 硬装阶段

在准备阶段 了解了 装修的基本概念 顺利收房 进行了需求和预算的大致规划 并且完成了简单的自主设计接下来就是带着自己的设计图 预算和想法 去找公司或者施工方了 找施工方 可以是 设计师和施工方分开找 也可以找有设计的装修公司 或者 有施工能力的设计室都行 但不 管哪…

【#第三期实战营闯关作业 ## 茴香豆:企业级知识库问答工具】

今天学习了《 茴香豆&#xff1a;企业级知识库问答工具》这一课&#xff0c;对大模型的应用有了更深得认识。以下是记录本课实操过程及截图&#xff1a; 搭建茴香豆虚拟环境&#xff1a; 输入以下命令 studio-conda -o internlm-base -t huixiangdou 成功安装虚拟环境截图 …

OpenAI gym CarRacing-v2 episode termination

题意&#xff1a;OpenAI Gym CarRacing-v2 赛道终止处理 问题背景&#xff1a; I am using gym0.26.0 library and am trying to understand what means that an episode is finished/done in the CarRacing-v2 environment. In the documentation is written this. 我正在使…

用Python实现时间序列模型实战——Day 12: 状态空间模型

一、学习内容 1. 状态空间模型的基本概念 状态空间模型是一种用于时间序列分析的强大工具&#xff0c;能够描述具有潜在状态动态变化的系统。该模型通过显式地建模时间序列中的潜在状态&#xff08;即隐藏变量&#xff09;&#xff0c;能够捕捉复杂的动态结构&#xff0c;适用…

如何选择合适的变压吸附制氧设备

在选择合适的变压吸附(Pressure Swing Adsorption, PSA)制氧设备时&#xff0c;需要综合考虑多个因素以确保设备能够高效、稳定地运行&#xff0c;满足特定应用场景的需求。以下是一些关键步骤和考虑因素&#xff0c;帮助您做出明智的决策。 1. 明确应用需求 明确您的制氧需求至…

GNU_HASH确定函数地址

前言&#xff1a; 最近看了以下pwntoos的DynELF方法&#xff0c;对其中是如何获取到函数地址的过程很感兴趣&#xff0c;就研究了一下&#xff0c;对通过DT_GNU_HASH获取函数地址的过程有了比较清晰的了解 漏洞&#xff1a; 我这里使用2013-PlaidCTF进行测试&#xff0c;首先…