C 语言-数组

1. 数组

1.1 引入

需求:记录班级10个学员的成绩

需要定义10个变量存在的问题:变量名起名困难变量管理困难

需求:记录班级1000个学员的成绩

1.2 概念

作用:容纳 数据类型相同 的多个数据的容器

特点:

  • 长度不可变
  • 容纳 数据类型相同

名词:

元素:数组中存储的数据
下标:元素在数组中的位置,下标从0开始,长度-1结束
长度:数组中可存储元素个数

注意:

  • 数组中的数据在 内存中是连续存储的。

1.3 分类

  • 安存储的数据类型存储

    字符数组
    整形数组
    浮点型数组
    ...
    
  • 按维度分类

    一维数组
    二维数组
    ...
    

1.4 使用

1.4.1 定义与初始化

① 定义:

语法:

数据类型 数组名[长度] = {值1, 值2, 值3, 值4...};
② 初始化

全部初始化:

此时可省略长度不写

如:

int nums[5] = {1, 3, 5, 7, 9}
//此时可以长度不写
int nums01[] = {1, 3, 5, 7, 9}

部分初始化:

没初始化的部分,值默认为0。

如:

int num02[5] = {1, 3, 5}
③ 字符数组与字符串

比如:

char str01[5] = {'h','e','l','l','o'};char str02[] = "hello";

注意:

  • 字符串 赋值给字符数组 系统将 默认为其在尾部加 \0
  • \0:字符串结束
#include <stdio.h>
int main(int argc, char const *argv[])
{char str01[5] = {'h','e','l','l','o'};char str02[] = "hello";printf("str01大小为:%d\n",sizeof(str01));printf("str02大小为:%d\n",sizeof(str02));return 0;
}// 输出
// str01大小为:5
// str02大小为:6

1.4.2 使用

① 获取指定位置元素

语法:

数组名[下标]

如:

int nums[5] = {1, 3, 5, 7, 9};取出并打印 第4个数printf("%d\n", nums[3]);
取出后赋值给别的变量int x = nums[4];
取出后赋值给数组的其他位置nums[1] = nums[4];
#include <stdio.h>
void fun01()
{int nums[5] = {1,3,5,7,9};printf("nums中下标为4的元素是:%d\n",nums[4]);
}
void fun02()
{int nums[5] = {1,3,5,7,9};int x = nums[4];printf("x=%d\n",x);
}int main(int argc, char const *argv[])
{fun01();fun02();return 0;
}// 输出:
// nums中下标为4的元素是:9
// x=9
② 修改指定位置元素

语法:

数组名[下标] = 值;

如:

int nums[5] = {1,3,5,7,9};
将数组中下标为1的元素修改为33
nums[1] = 33;

例:

#include <stdio.h>void fun03()
{int nums[5] = {1,3,5,7,9};nums[1] = 33;printf("nums修改后下标为1的值是:%d\n",nums[1]);
}int main(int argc, char const *argv[])
{fun03();return 0;
}// 输出:
// nums修改后下标为1的值是:33
③ 计算数组长度

思路:

数组所占字节数大小/单个元素所占大小 = 长度

如:

int nums[] = {1,2,3,4,5,6,7,8,89,9,10,1,21,121,121,21,3,32};
int len = sizeof(nums) / sizeof(nums[0]);
int len = sizeof(nums) / sizeof(int);

例:

#include <stdio.h>void fun04()
{int nums[] = {1,2,3,4,5,6,7,8,89,9,10,1,21,121,121,21,3,32};int len = sizeof(nums) / sizeof(nums[0]);//int len = sizeof(nums) / sizeof(int);printf("数组的长度为:%d\n",len);
}int main(int argc, char const *argv[])
{fun04();return 0;
}// 输出:
// 数组的长度为:18
④ 遍历

含义:将数组中的数据逐个取出

例:

#include <stdio.h>void fun05()
{int nums[] = {1,2,3,4,5,6,7,8,89,9,10,1,21,121,121,21,3,32};//计算数组长度int len = sizeof(nums) / sizeof(nums[0]);//开启循环for(int i = 0; i < len; i++){//取值int x = nums[i];//打印printf("%d,",x);}printf("\n");
}int main(int argc, char const *argv[])
{fun05();return 0;
}// 输出:
// 1,2,3,4,5,6,7,8,89,9,10,1,21,121,121,21,3,32,
⑤ 键盘输入数据存储到数组中

注意:字符串除外

例1:

void fun06()
{char cs[10] = {0};scanf("%c",&cs[0]);printf("%c\n",cs[0]);
}/*
输入: 56
输出: 5
因为%c是char的占位符, 占一个字节
*/

例:

#include <stdio.h>void fun07()
{int nums[5] = {0};for(int i = 0; i < 5; i++){printf("请输入第%d个数",(i+1));scanf("%d",&nums[i]);}for(int i = 0; i < 5; i++){printf("%d,",nums[i]);}printf("\n");
}int main(int argc, char const *argv[])
{fun07();return 0;
}/*
输出:
请输入第1个数12
请输入第2个数23
请输入第3个数12
请输入第4个数23
请输入第5个数25
12,23,12,23,25,
*/
⑥ 字符串录入

scanf

问题:不能录入空格
void fun08()
{char str[50] = {0};//会将空格或回车作为录入结束scanf("%s",str);printf("str=%s\n",str);
}

gets

问题:会出现bug假如没有定义数组长度,会报错
#include <stdio.h>void fun09()
{char str[] = "";gets(str,sizeof(str),stdin);printf("str=%s\n",str);
}int main(int argc, char const *argv[])
{fun09();return 0;
}/*
hello
str=hello
*** stack smashing detected ***: ./a.out terminated
已放弃 (核心已转储)
*/

fgets

最优选择
语法:char *fgets(char *restrict str, int size, FILE *restrict stream))fgets(数组名,sizeof(数组名),stdin);
假如没有定义数组长度,会直接结束。
#include <stdio.h>void fun10()
{char str[50] = "";fgets(str,sizeof(str),stdin);printf("str=%s\n",str);
}int main(int argc, char const *argv[])
{fun10();return 0;
}/*
输出:
hello world
str=hello world*/
⑦ 数组与函数

注意:

  • 数组的本质是一个地址
  • 所以调用函数时传入数组其实传递的是数组名对应的地址
  • 此时当函数中将该数组中的内容修改
  • 那么调用该函数所传递的数组的值也将被修改

如:

#include <stdio.h>
void funA(int a)
{a = 10;
}void funB(int nums[5])
{nums[0] = 10;
}
/*
要求定义一个函数,计算两数之和,要求返回和,加数,被加数*/ 
void add(int a,int b,int nums[3])
{int x = a + b;nums[0] = x;nums[1] = a;nums[2] = b;
}
int main(int argc, char const *argv[])
{int x = 1;funA(x);printf("x= %d\n",x);int xs[5] = {1};funB(xs);printf("xs[0] = %d\n",xs[0]);int adds[3] = {0};add(10,2,adds);for(int i = 0; i < 3; i++){printf("%d\n",adds[i]);}return 0;
}/*
输出:
x= 1
xs[0] = 10
12
10
2
*/

1.5 扩展

因为数组本质是地址,所以 遍历时:nums[i] == *(nums+i)

#include <stdio.h>
int main(int argc, char const *argv[])
{int nums[5] = {2,4,6,8,9};for(int i = 0; i < 5; i++){printf("%d,",nums[i]);// printf("%d,",*(nums+i));}printf("\n");return 0;
}/*
两个打印输出相同,如下:
2,4,6,8,9,
*/

2. 二维数组

2.1 概念

一维数组作为元素存储的数组 。

2.2 使用

2.2.1 定义与初始化

语法:

数据类型 数组名[x][y] = {{值1,值2,值3,...},{值11,值22,值33,...},{值111,值222,值333,...},...
};

x:二维数组中存储的一维数组的个数

y:一维数组中可存储的元素的个数

如:

#include <stdio.h>
int main(int argc, char const *argv[])
{int nums[5][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};// 当数组全部初始化时可以省略长度不写// 二维数组的长度是一维数组的个数int nums[][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12},{13,14,15}};int nums[3][3] = {{0},{0},{0}};int nums[3][3] = {0};int nums[3][3] = {{1,2,3},{4,5,6},{7,8,9}};int nums01[3][3] = {1,2,3,4,5,6,7,8,9};int nums02[3][3] = {0};return 0;
}

2.2.2 使用

① 取值
获取二维数组中下标为x的一维数组数组名[x]
获取二维数组中下标为x中下标为y的元素数组名[x][y]

例:

#include <stdio.h>
int main(int argc, char const *argv[])
{int nums01[3][3] = {1,2,3,4,5,6,7,8,9};int nums02[3][3] = {0};printf("nums01[0][2] = %d\n",nums01[0][2]);printf("nums02[0][2] = %d\n",nums02[0][2]);char strs[3][50] = {"hello", "world", "boboy"};printf("strs[0] = %s\n",strs[1]);return 0;
}/*
输出:
nums01[0][2] = 3
nums02[0][2] = 0
strs[0] = world
*/
② 赋值
数组名[x][y] = 值;

注意:

因为数组不能修改其指向的地址(因为数组是常指针),所以数组不能重复初始化

所以以下语法是错误的

数组名[x] = 新数组;

常指针:可以修改其指向的内容中的值,但是不能修改其指向的地址

③ 长度
sizeof(数组名) / sizeof(数组中第一个元素) = 长度
④ 遍历

思路:

1,获取二维数组中一维数组的个数,即二维数组的长度,为x
2,获取一维数组中元素的个数,即一维数组的长度,为y
3,开启循环,逐个获取二维数组中的一维数组
4,在循环内遍历获取到的一维数组

例1:

#include <stdio.h>
void fun01()
{int nums[5][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};int xlen = sizeof(nums) / sizeof(nums[0]);int ylen = sizeof(nums[0]) / sizeof(nums[0][0]);for(int i = 0; i < xlen; i++){//nums[i]for(int j = 0; j < ylen; j++){int x = nums[i][j];printf("%d,",x);}printf("\n");}
}void fun02()
{char strs[3][5] = {{'a','b','c','d','e'},{'h','e','l','l','o'}};int xlen = sizeof(strs) / sizeof(strs[0]);int ylen = sizeof(strs[0]) / sizeof(strs[0][0]);for(int i = 0; i < xlen; i++){for(int j = 0; j < ylen; j++){printf("%c ",strs[i][j]);            }printf("\n");}
}int main(int argc, char const *argv[])
{fun01();printf("###################\n");fun02();fun03();return 0;
}/*
输出:
1,2,3,
4,5,6,
7,8,9,
10,11,12,
13,14,15,
###################
a b c d e 
h e l l o */

例2:遍历字符串

#include <stdio.h>void fun03()
{char strs[3][6] = {"abcde","hello"};int xlen = sizeof(strs) / sizeof(strs[0]);for(int i = 0; i < xlen; i++){printf("%s",strs[i]);            printf("\n");}
}int main(int argc, char const *argv[])
{fun03();return 0;
}/*
输出:
abcde
hello*/

例3:键盘录入

#include <stdio.h>//键盘录入多个字符串存储到数组中
void fun04()
{char strs[3][128] = {0};for(int i = 0; i < 3; i++){fgets(strs[i],sizeof(strs[i]),stdin);}for(int i = 0; i < 3; i++){printf("%s",strs[i]);}
}
int main(int argc, char const *argv[])
{fun04();return 0;
}/*
输入:
hello
world
tom
输出:
hello
world
tom
*/

3. 算法

软件 = 算法 + 数据结构

算法 = 数学公式使用代码实现

优点:提高代码运行效率

如:

  • 代码
//计算100以内数之和
int sum = 0;
for(int i = 0; i < 100; i++){sum = sum + i;} 
printf("sum=%d\n",sum);分析得知:以上代码共执行了303行
  • 数学
在数学中该问题的公式为: (首项+尾项) * 项数 / 2int sum = (0 + 99) * 100 / 2;
分析得知:以上代码共执行了1行

评判算法是否优良

  • 时间复杂度
  • 空间复杂度

3.1 常用算法

3.1.1 两数交换位置

int a = 1;
int b = 2;
int c = a;
a = b;
b = c;

3.1.2 寻找最值

思路:
1,假设数组中的一个数为最值
2,在使用数组中元素与其一一对比
3,如果取出的元素大于或小于最值,将假设的最值换为改值
4,当对比完成后,假设的最值就是真的最值

代码:

int nums[] = {6,21,33,67,1,29,32,14};
//寻找最小值
int min = nums[0];
for(int i = 0; i < sizeof(nums)/sizeof(nums[0]); i++){if(nums[i] < min){min = nums[i];}
} 
printf("最小值为:%d\n",min);

寻找最值下标

思路:
1,假设数组中的位置上的数为最小值,记录该位置为最值下标
2,在使用数组中元素与下标对应的值一一对比
3,如果取出的元素大于或小于下标对应的值,将假设的下标改为该数的下标
4,当对比完成后,假设的最下标就是最值下标

代码:

int nums[] = {6,21,33,67,1,29,32,14};排序
//寻找最小值下标
int minIndex = 0;
for(int i = 0; i < sizeof(nums)/sizeof(nums[0]); i++){if(nums[i] < nums[minIndex]){minIndex = i;}} 
printf("最小值下标为:%d\n",minIndex);

3.2 排序

目的:将数组中的数据从大到小(降序)或从小到大(升序)排序

3.2.1 冒泡排序

核心思想:相邻比较,交换位置

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//生成随机数
void setNums(int nums[],int len)
{for(int i = 0; i < len; i++){nums[i] = rand() % 100;}
}
//打印数组中的内容
void printNums(int nums[],int len)
{for(int i = 0; i < len; i++){printf("%d ",nums[i]);}printf("\n");
}void sort01(int nums[],int len)
{//冒泡排序for (int i = 0; i < len - 1; i++){for(int j = 0; j < len-1; j++){if (nums[j] > nums[j+1]){//交换位置int x = nums[j];nums[j] = nums[j+1];nums[j+1] = x;}}}
}
int main(int argc, char const *argv[])
{int nums[10] = {0};srand(time(NULL));int len = sizeof(nums)/ sizeof(nums[0]);setNums(nums,len);printNums(nums,len);sort01(nums,len);printNums(nums,len);return 0;
}
//25 70 74 40 78 42 91 54 50 20 
//20 25 40 42 50 54 70 74 78 91 

3.2.2 选择排序

核心思想:确定位置,与最值,交换位置

在这里插入图片描述

void sort02(int nums[],int len)
{//选择排序,外层循环一次找到一个最值并且放到目标位置for(int j = 0; j < len -1 ; j++){int tagIndex = j;int minIndex = tagIndex;//取值: 目标位置~lenfor(int i = tagIndex; i < len; i++){//寻找最值下标if(nums[minIndex] > nums[i]){minIndex = i;}}//目标位置不等于最值位置,则交换位置if (tagIndex != minIndex){//交换位置,此时最值交换到目标位置int x = nums[tagIndex];nums[tagIndex] = nums[minIndex];nums[minIndex] = x;}}
}
//7 82 4 2 42 19 69 70 19 52 
//2 4 7 19 19 42 52 69 70 82

简化:

void sort02(int nums[],int len)
{for(int j = 0; j < len -1 ; j++){int minIndex = j;for(int i = j; i < len; i++){if(nums[minIndex] > nums[i]){minIndex = i;}}if (j != minIndex){//交换位置int x = nums[j];nums[j] = nums[minIndex];nums[minIndex] = x;}}
}
//7 82 4 2 42 19 69 70 19 52
//2 4 7 19 19 42 52 69 70 82

3.3 查找

目的:查询数组中是否存在指定元素

3.3.1 顺序查找

核心思想:逐个比较

/*定义一个函数查找指定数据是否存在如果存在返回1否则返回0nums:要查找的数组len:数组长度tag:查找的数据
*/
int find01(int nums[],int len,int tag)
{for(int i = 0; i < len; i++){if (nums[i] == tag){return 1;}}return 0;
}/*定义一个函数查找指定数据是否存在如果存在返回下标否则返回-1nums:要查找的数组len:数组长度tag:查找的数据
*/
int find02(int nums[],int len,int tag)
{for(int i = 0; i < len; i++){if (nums[i] == tag){return i;}}return -1;
}

3.3.2 二分查找

要求:查找的数组必须 是有序的

int find03(int nums[],int len,int tag)
{//排序sort01(nums,len);printNums(nums,len);//二分查找法//定义开始和结束下标int start = 0;int end = len - 1;while(start <= end){//中间值下标int center = (start + end) / 2;//等于直接返回if (nums[center] == tag){return center;}else if(nums[center] < tag){start = center + 1;}else{end = center - 1;}}return -1;
}

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

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

相关文章

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架&#xff0c;不仅在构建功能复杂的网站应用中表现出色&#xff0c;还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中&#xff0c;认证和权限管理尤其重要。接下来&#xff0c;我们就来探…

数据之美:数据可视化的力量与必要性

在当今信息爆炸的时代&#xff0c;数据量呈指数级增长&#xff0c;它们是我们日常生活和工作中的重要组成部分。然而&#xff0c;数据本身是无生命的数字和统计&#xff0c;若不能有效地被理解、传达和利用&#xff0c;其潜力就难以实现。这正是数据可视化变得越来越重要的原因…

深入了解Java8新特性-日期时间API之ChronoUnit、ChronoField

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概3000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

基于gitlab的webhook集成jenkins,并在gitlab流水线中展示jenkins的job状态信息

文章目录 1. 环境信息2. gitlab 部署3. jenkins部署4. gitlab集成jenkins4.1 jenkins的凭据上保存gitlab的账号信息4.2 jenkins中配置gitlab的连接信息4.3 编写jenkins上pipeline文件4.4 jenkins上创建pipeline项目4.5 gitlab上配置webhooks事件4.6 测试 1. 环境信息 gitlab服…

LangChain 16 通过Memory记住历史对话的内容

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

Windows系列:windows2003-建立域

windows2003-建立域 Active Directory建立DNS建立域查看日志xp 加入域 Active Directory 活动目录是一个包括文件、打印机、应用程序、服务器、域、用户账户等对象的数据库。 常见概念&#xff1a;对象、属性、容器 域组件&#xff08;Domain Component&#xff0c;DC&#x…

snat与dnat

一.SNAT的原理介绍 1.应用环境 局域网主机共享单个公网IP地址接入Internet &#xff08;私有IP不能在Internet中正常路由&#xff09; 2.SNAT原理 源地址转换&#xff0c;根据指定条件修改数据包的源IP地址&#xff0c;通常被叫做源映谢 数据包从内网发送到公网时&#xf…

Loki安装部署

Loki安装部署 1、Loki介绍 Loki 是受 Prometheus 启发由 Grafana Labs 团队开源的水平可扩展&#xff0c;高度可用的多租户日志聚合系统。开发语 言: Google Go。它的设计具有很高的成本效益&#xff0c;并且易于操作。使用标签来作为索引&#xff0c;而不是对全文进行检索&…

<avue-crud/>,二级表头,children下字典项的dicUrl失效问题

目录 1.提出问题&#xff1a; 1.1 代码&#xff1a; 1.2 效果图&#xff1a;会发现处在children下的dicUrl失效了 2. 解决思路 3. 解决代码&#xff08;你要的都在这&#xff0c;看这里&#xff09; 1.提出问题&#xff1a; 在使用<avue-crud/>组件实现二级表头时&…

C++中异常的栈展开概念

C中的异常栈展开是指&#xff0c;当某个函数中有异常产生&#xff08;这里不考虑是主动抛出的还是被动产生的&#xff09;&#xff0c;在异常被捕获之前的函数调用链上&#xff0c;函数不会正常执行返回&#xff0c;即异常产生之后的程序逻辑不会被执行。 &#xff08;注意&…

Kafka的存储机制和可靠性

文章目录 前言一、Kafka 存储选择二、Kafka 存储方案剖析三、Kafka 存储架构设计四、Kafka 日志系统架构设计4.1、Kafka日志目录布局4.2、Kafka磁盘数据存储 五、Kafka 可靠性5.1、Producer的可靠性保证5.1.1、kafka 配置为 CP(Consistency & Partition tolerance)系统5.1.…

建堆的时间复杂度和堆排序

文章目录 建堆的时间复杂度向下调整建堆向上调整建堆 堆排序实现 建堆的时间复杂度 下面都以建大堆演示 向下调整建堆 void Adjustdown(HPDataType* a, int size,int parent) {int child parent * 2 1;while (child < size){if (child1<size&&a[child 1] &…

Pandas进阶:transform 数据转换的常用技巧

引言 本次给大家介绍一个功能超强的数据处理函数transform&#xff0c;相信很多朋友也用过&#xff0c;这里再次进行详细分享下。 transform有4个比较常用的功能&#xff0c;总结如下&#xff1a; 转换数值 合并分组结果 过滤数据 结合分组处理缺失值 一. 转换数值 pd.…

贪心算法的介绍

贪心算法&#xff08;又称贪婪算法&#xff09;是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解&#…

Windows 基于 VMware 虚拟机安装银河麒麟高级服务器操作系统

前言 抱着学习的态度研究一下麒麟系统的安装 银河麒麟&#xff08;KylinOS&#xff09;原是在“863计划”和国家核高基科技重大专项支持下&#xff0c;国防科技大学研发的操作系统&#xff0c;后由国防科技大学将品牌授权给天津麒麟&#xff0c;后者在2019年与中标软件合并为…

如何选择共模噪声滤波器

在当前电子产品中&#xff0c;绝大多数的高速信号都使用地差分对结构。 差分结构有一个好处就是可以降低外界对信号的干扰&#xff0c;但是由于设计的原因&#xff0c;在传输结构上还会受到共模噪声的影响。 共模噪声滤波器就可以用于抑制不必要的共模噪声&#xff0c;而不会对…

RNN:文本生成

文章目录 一、完整代码二、过程实现2.1 导包2.2 数据准备2.3 字符分词2.4 构建数据集2.5 定义模型2.6 模型训练2.7 模型推理 三、整体总结 采用RNN和unicode分词进行文本生成 一、完整代码 作者在文章开头地址中使用C实现了这一过程&#xff0c;为了便于理解&#xff0c;这里我…

Java将JavaFX程序最小化托盘

Windows最小化拖盘其实就是将程序放到托盘里面,需要的时候再点击托盘里面的应用图标,此时就可以正常使用应用了,托盘如下: 下面是一个简单的Java程序,可以把窗口最小化到系统托盘: import java.awt.*; import java.awt.event.*; import javax.swing.*;public class Tray…

Paraformer 语音识别原理

Paraformer(Parallel Transformer)非自回归端到端语音系统需要解决两个问题&#xff1a; 准确预测输出序列长度&#xff0c;送入预测语音信号判断包含多少文字。 如何从encoder 的输出中提取隐层表征&#xff0c;作为decoder的输入。 采用一个预测器&#xff08;Predictor&…

GPT带我学Openpyxl操作Excel

注&#xff1a;以下文字大部分文字和代码由GPT生成 一、openpyxl详细介绍 Openpyxl是一个用于读取和编写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它允许您使用Python操作Excel文件&#xff0c;包括创建新的工作簿、读取和修改现有工作簿中的数据、设置单元格格式以及编…