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

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录

  • 2015年
    • 1.c语言程序设计部分
    • 2.数据结构程序设计部分
  • 2016年
    • 1.c语言程序设计部分
    • 2.数据结构程序设计部分

2015年

1.c语言程序设计部分

1.从一组数据中选择最大的和最小的输出。

void print_maxandmin(double a[],int length) //在一组数据中选择最大的或者最小的输出
{double max=-10000000000;  //初始化max是一个极小值double min=100000000000;   // 初始化min是一个极大值for(int i=0;i<length;i++){if(a[i]>max) max=a[i];if(a[i]<max) min=a[i];}printf("最大值为:%lf\n",max);printf("最小值为:%lf\n",min);}int main()
{double a[]={22,55,34,2,5,9,11}; //假定一组数据由数组a存储int length=sizeof(a)/sizeof(a[0]);  //取得数组长度print_maxandmin(a, length); //调用函数
}

运行结果:
在这里插入图片描述


本题积累复盘:
如何在未知数组长度的情况下,得到数组的长度

 int length=sizeof(a)/sizeof(a[0]);  //取得数组长度

2.从一组数据中计算出平均值并输出

double count_avarage(double a[],int length)  //计算一组数据的平均值
{double sum=0;for(int i=0;i<length;i++){sum+=a[i];}return sum/length;
}int main()
{double a[]={22,55,34,2,5,9,11}; //假定一组数据由数组a存储int length=sizeof(a)/sizeof(a[0]);  //取得数组长度printf("平均值为:%lf\n",count_avarage(a, length));
}

在这里插入图片描述

3.一个超市有8名员工,每个员工的数据包括员工号、姓名、工资、职位。
请写出描述员工数据的结构体,并编写函数计算工资最高的员工号,工资最低的员工号,以及员工的平均工资,之后将大于平均工资的员工号和姓名输出。

结构体如下:

struct employee{int ID;              //员工号char name[100];      //姓名double wage;         //工资char degree[100];   //职位};

代码如下:

void func_wage(struct employee a[],int length) //在一组数据中选择最大的或者最小的输出
{double max=-10000000000;  //初始化max是一个极小值double min=10000000000;  //初始化max是一个极小值double sum=0;double avarage=0;int flagmax=0; //记录取得最高工资的员工号int flagmin=0; //记录取得最高工资的员工号for(int i=0;i<length;i++){if(a[i].wage>max){max=a[i].wage;flagmax=a[i].ID;}if(a[i].wage<min){min=a[i].wage;flagmin=a[i].ID;}sum+=a[i].wage;}avarage=sum/length;printf("工资最高的员工号:%d\n",flagmax);printf("工资最低的员工号:%d\n",flagmin);printf("平均工资为:%lf\n",avarage);//工资大于平均工资的员工号和姓名输出printf("工资大于平均工资的员工号和姓名如下:\n");for(int i=0;i<length;i++){if(a[i].wage>avarage){printf("%d %s\n",a[i].ID,a[i].name);}}
}int main()
{struct employee a[8]={1,"小A",2000,"普通员工",2,"小B",3000,"普通员工",3,"小C",2200,"普通员工",4,"小D",3100,"普通员工",5,"小E",4000,"高级员工",6,"小F",4500,"高级员工",7,"小G",5000,"副组长",8,"小H",6000,"副组长"};   //定义一个含有8个员工的员工结构体数组func_wage(a, 8);
}

在这里插入图片描述

2.数据结构程序设计部分

1.写出线性表的结构体,并基于线性表结构体快速排序第一趟排序

typedef int ElemType; //将int定义为元素数据类型
typedef struct Sqlist
{ElemType *plist; //指向连续的顺序存储空间int sqListLength; //顺序表元素个数int sqListSize; //整个表的总存储空间数
}Sqlist;//手写一个快速排序第一趟的过程
int partation(int a[],int low,int high)
{while(low<high){int pivot=a[low];//先移动high指针while(a[high]>=pivot&&low<high) //假如找不到呢,总得停止,low和high相遇的时候就停止(在没找到的情况下){high--;}  //直到发现指向了一个小的数a[low]=a[high];a[high]=pivot;pivot=a[high];  //交换//再移动low指针while(a[low]<=pivot&&low<high){low++;} //直到发现了一个大的数a[high]=a[low];a[low]=pivot;pivot=a[low];  //交换}return low;  //一趟已经排好了,需要再进行递归的操作完成接下来的趟,返回的其实就是中间那个轴,它左边的都比他小,右边的都比他大
}void quicksort(int a[],int low,int high)
{if(low<high)  //在保证low<high的前提下递归{int piovt=partation(a, low, high); //每次找轴的过程中把数组都排好quicksort(a, low, piovt-1);quicksort(a, piovt+1, high);}
}
int main()
{int arr[5]={22,7,1,99,3};Sqlist L;L.plist=arr;L.sqListLength=5;printf("快速排序结束:\n");quicksort(L.plist, 0, L.sqListLength-1);for(int i=0;i<5;i++){printf("%d ",L.plist[i]);}printf("\n");
}
  1. 写出二叉树的结构体,并基于二叉树查找指定结点的所有祖先结点

什么叫基于二叉树查找指定结点的所有祖先结点?
某一个结点的所有祖先节点,就是二叉树深搜遍历到的那条路径上,除了目标结点本身的其他结点。
祖先结点的定义是:一个结点在从根结点到目标结点的路径上,位于目标结点之上的结点。特别的因此,结点本身不能作为它的祖先结点。

该题本质就是在深搜的基础上进行一些操作。

写出二叉树的结构体

Typedef char ElemType;
Typedef struct BiTNode{ElemType data;struct BiTNode * lchild;struct BiTNode * rchild;
}BiTNode,*BiTree;

输出所有的指定祖先结点的函数

bool find(BiTree T,ElemType s)  //找s结点的全部祖先结点
{if(T==NULL) return false;if(T->data==s) return true;if(find(T->lchild,s)||find(T->rchild,s)){printf("%c ",T->data);return  true;}return  false;
}

2016年

1.c语言程序设计部分

1.给了一组年龄,求出最高年龄,最低年龄,平均年龄。

这道题没什么好说的,送分题

2.计算∑ (xi-8)4,其中i从1到n,n和xi由键盘输入

int main()
{    int n;int sum=0; //答案保存在sum中scanf("%d",&n);while(n--){int x=0;scanf("%d",&x);sum=sum+(x-8)*(x-8)*(x-8)*(x-8);}printf("%d\n",sum);
}

在这里插入图片描述

3.定义结构体,里面有英语,数学,软件工程,计算机网络四科成绩,有三个学生,计算每个学生总分和每科的平均分。

typedef struct Course{int English_score;int Math_score;int software_score;int com_net_score;
}Course;typedef struct student
{char name[100];Course course;int sum_score;
}student;int main()
{   student stu[3]={"小李",100,68,22,44,0,"小刘",66,55,44,55,0,"小王",77,55,77,77,0};//计算每个学生的总分并存储下来for(int i=0;i<3;i++){stu[i].sum_score=stu[i].course.English_score+stu[i].course.Math_score+stu[i].course.com_net_score+stu[i].course.software_score;printf("%s的总分是:%d\n",stu[i].name,stu[i].sum_score);}//计算每科的平均分double ava_English=0;double ava_Math=0;double ava_net=0;double ava_software=0;for(int i=0;i<3;i++){ava_English+=stu[i].course.English_score;ava_Math+=stu[i].course.Math_score;ava_net+=stu[i].course.com_net_score;ava_software+=stu[i].course.software_score;}ava_English/=3;ava_Math/=3; ava_net/=3;ava_software/=3;printf("英语平均分为:%lf\n",ava_English);printf("数学平均分为:%lf\n",ava_Math);printf("计算机网络平均分为:%lf\n",ava_net);printf("软件工程平均分为:%lf\n",ava_software);
}

2.数据结构程序设计部分

1.用拉链法处理冲突,写出散列表的创建函数,插入函数,查找函数。
(1)写出拉链法处理冲突时散列表的结构体
(2)写出创建函数,插入函数,查找函数的算法思想并编程。

写出写出拉链法处理冲突时散列表的结构体
首先回忆拉链的结构,是由多个单链表和一个头指针数组表示的,‘
所以,首先定义一个单链表结构体,再定义一个哈希表结构体,这个哈希表结构体中,含有指向指针数组的指针,哈希表的一些信息,如表长,关键字个数。

(1)拉链法处理冲突时散列表的结构体如下

typedef int ELemType;
typedef struct Node
{ElemType data;struct Node *next;
}Node;typedef struct CLHashTable
{Node ** PList;int Table_length;  //哈希表长度int kum; //关键字个数
}CLHashTable;

初始化哈希表,思路,定义一个函数,向个函数中传入哈希表名的实参和哈希表长度。
从哈希表的构成三元素考虑,初始化问题。
首先就是为指针数组分配空间,将哈希表传入的长度=哈希表长度,循环遍历每一个指针数组中的头指针,将指针置空,关键字设置为0

void creat_Hash(CLHashTable &CHT,int Hashlength)
{CHT.PList=(struct Node ** )malloc(sizeof(struct Node *)*Hashlength);CHT.Table_length=Hashlength;for(int i=0;i<Hashlength;i++){CHT.PList[i]->next=NULL;}CHT.kum=0;
}

链地址法哈希表的插入函数,本质上就是单链表的插入,首先通过Hash函数确定在指针数组中选定哪一个头指针作为待插入的点,注意,此时分情况讨论,如果当前头指针指向空,就直接插入,如果不为空,定义一个pre指针,尾插法将新结点插入,注意传入哈希表的参数为,哈希表,插入的key值,和divisor(Hash函数中的除数)

void insert(CLHashTable &CHT,int key,int divisor)
{int index=key/divisor;Node *cur=CHT.PList[index];Node *pre=NULL;if(cur==NULL){Node *p=(struct Node *)malloc(sizeof(Node));p->data=key;p->next=NULL;cur->next=p;}else{while(cur!=NULL){pre=cur;cur=cur->next;}Node *p=(struct Node *)malloc(sizeof(Node));p->data=key;p->next=pre->next;pre->next=p;}
}

哈希表的查找,跟插入很类似

int find_Hashkey(CLHashTable CHT,int key,int divisor)
{int index=key/divisor;Node * cur=CHT.PList[index];if(cur==NULL) return 0; //查找失败while(cur!=NULL){if(cur->data==key) return 1; //查找成功cur=cur->next;}return 0; //查找失败
}

2.存在一个二叉排序树,给定一个value值,若查找value值,就返回比value值大的所有值中最小的值。若value最大就返回空。

本质就是二叉排序树的搜索,搜索一遍,记录值,由于二叉排序树,保持着左子树小,右子树大的性质,返回比value值大的所有值中最小的值,也就是搜到第一个比value值大的数,若搜索完整个二叉排序树之后还没搜到,就返回空

回顾知识:
二叉排序树的结构体和树的结构体是一样的
二叉排序树的构造是通过递归构造
二叉树排序的遍历跟正常二叉树没有区别

(1)写出二叉树排序树的结构体

typedef int Elemtype;
typedef struct BiTNode
{Elemtype data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;

(2)说出上述算法思想并编程

给出错误思路:

这个错误思路就是,不去递归,就大于就右子树,小于就左子树,这个不能找到比它大的最小的值,只能找到一个比它大的值

int max_value_min(BiTree T,ElemType value)
{BiTNode *p=T;while(p!=NULL){if(p->data<=value){p=p->rchild;}else if(p->data>value){return p->data;}}return 0;  //返回0表明,没有值比它大
}

正确答案:
代码刨析:

这个模版本质就是二叉排序树的中序遍历模版,因为二叉排序树的中序遍历是有序的。
首先明确,最后返回的值,是递归开始那里返回的值,开始递归,层层深入,再逐层返回。
if-else,那里是停止二叉树的继续遍历,如果找到了就停止二叉树的遍历,flag值已经被修改就逐层将flag值传递回去。假如都搜完也没有,还是逐层将flag值传递回去,但是此时flag没有被修改过为0

值得注意的是最后的return flag不能改成return 0,如果return 0了,就没有意义了,只是flag作为全局变量已经被保存下来了,与题目中要求有瑕疵。
if(T==NULL) return 0;这个0其实就是说T是空树,没有什么实际意思,最后怎么返回还都是flag

int flag=0; //标记第一次大于value,为0就是没有这个值,为其他的就是要返回的值
int max_value_min(BiTree T,ElemType value)
{if(T==NULL) return 0;max_value_min(T->lchild, value);if(T->data>value&&flag==0){flag=T->data;return flag;}else{max_value_min(T->rchild, value);}return flag;}

相关文章:

2015年-2016年 软件工程程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 2015年1.c语言程序设计部分2.数据结构程序设计部分 2016年1.c语言程序设计部分2.数据结构程序设计部分 2015年 1.c语言程序设计部分 1.从一组数据中选择最大的和最小的输出。 void print_maxandmin(double a[],int length) //在一组数据中选择最大的或者最小的输出…...

整理一下实际开发和工作中Git工具的使用 (持续更新中)

介绍一下Git 在实际开发和工作中&#xff0c;Git工具的使用可以说是至关重要的&#xff0c;它不仅提高了团队协作的效率&#xff0c;还帮助开发者有效地管理代码版本。以下是对Git工具使用的扩展描述&#xff1a; 版本控制&#xff1a;Git能够跟踪代码的每一个修改记录&#x…...

Axios 的基本使用与 Fetch 的比较、在 Vue 项目中使用 Axios 的最佳实践

文章目录 1. 引言2. Axios 的基本使用2.1 安装 Axios2.2 发起 GET 请求2.3 发起 POST 请求2.4 请求拦截器2.5 设置全局配置 3. Axios 与 Fetch 的比较3.1 Axios 与 Fetch 的异同点3.2 Fetch 的基本使用3.3 使用 Fetch 处理 POST 请求 4. 讨论在 Vue 项目中使用 Axios 的最佳实践…...

Dockerfile样例

一、基础jar镜像制作 ## Dockerfile FROM registry.openanolis.cn/openanolis/anolisos:8.9 RUN mkdir /work ADD jdk17.tar.gz fonts.tar.gz /work/ RUN yum install fontconfig ttmkfdir -y && yum clean all && \chmod -R 755 /work/fonts ADD fonts.conf …...

MYSQL-多表查询

一、概述 1、定义 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 2、前提条件 这些一起查询的表之间是有关系的&#xff08;一对一、一对多&#xff09;&#xff0c;它们之间一定是有关联字段&#xff0c;这个关联字段可能建立了外键…...

MySQL改密码后不生效问题

MySQL修改密码后连接报密码错误 1.mysql修改密码命令&#xff1a; 这两种连接方式密码都必须修改 修改远程连接密码 ALTER USER ‘root’‘%’ IDENTIFIED BY ‘password’; 修改本地连接密码 ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘password’; 修改完后必须刷新…...

15分钟学Go 第1天:Go语言简介与特点

Go语言简介与特点 1. Go语言概述 Go语言&#xff08;又称Golang&#xff09;是由谷歌于2007年开发并在2009年正式发布的一种开源编程语言。它旨在简单、高效地进行软件开发&#xff0c;尤其适合于网络编程和分布式系统。 1.1 发展背景 多核处理器&#xff1a;随着计算机硬件…...

UDP/TCP协议

网络层只负责将数据包送达至目标主机&#xff0c;并不负责将数据包上交给上层的哪一个应用程序&#xff0c;这是传输层需要干的事&#xff0c;传输层通过端口来区分不同的应用程序。传输层协议主要分为UDP&#xff08;用户数据报协议&#xff09;和TCP&#xff08;传输控制协议…...

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件&#xff0c;右击&#xff0c;选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…...

在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。

在 Windows 环境下&#xff0c;Git 默认会自动处理 CRLF 和 LF 之间的转换。 要确保这一点并自动处理换行符差异&#xff0c;你可以按照以下步骤配置 1. 配置 Git 自动转换 CRLF 使用 Git Bash 或命令行执行以下命令&#xff0c;设置 Git 自动处理换行符&#xff1a; git con…...

Kibana可视化Dashboard如何基于字段是否包含某关键词进行过滤

kinana是一个功能强大、可对Elasticsearch数据进行可视化的开源工具。 我们在dashboard创建可视化时&#xff0c;有时需要将某个index里数据的某个字段根据是否包含某些特定关键词进行过滤&#xff0c;这个时候就可以用到lens里的filter功能很方便地进行操作。 如上图所示&…...

架构师之路-学渣到学霸历程-23

实战&#xff1a;NFS安装部署 接早上了解过了NFS的一些基本原理&#xff0c;咋们就看看一些实战&#xff1b; 尝试自己部署一下实验&#xff1b;然后实验成功了是我们最大的鼓励来着&#xff1b; 实战过程中&#xff0c;我们也面临了很多报错&#xff1b;所以每个实战的报错我…...

怎么修改编辑PDF的内容,有这4个工具就行了。

PDF 软件在现代的办公或者是学习当中的应用非常广泛&#xff0c;编辑PDF内容对很多人来说也是一件常有的事情。如果有了PDF 编辑软件&#xff0c;查看&#xff0c;编辑&#xff0c;修改&#xff0c;分享也会变得更加方便简单&#xff0c;所以今天要给大家介绍几款这样的工具。 …...

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…...

C语言的结构体定义 java赋值关系运算符

1. /*#include<stdio.h> struct student { int num; //成员列表 int score; float avg; }; int main(void) { struct student Tom;//Tom结构体变量 struct student class4[50];//结构体数组 return 0; }*/ struct student { int nu…...

重学SpringBoot3-Spring WebFlux简介

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux简介 1. 什么是 WebFlux&#xff1f;2. WebFlux 与 Spring MVC 的区别3. WebFlux 的用处3.1 非阻塞 I/O 操作3.2 响应式编程模型3.3 更高…...

distinct 和 group by

最近生产加了一个新字段 a、然后将主键赋值给 a 然后投产后验证是否有漏网之鱼。当时使用的是 select count(distinct pk),count(distinct a) from tableName当时在想这样子跟 group by 有啥区别 select a from tableName group by a having count(a) > 1所以查一下两者…...

RTThread-Nano学习一-基于MDK移植

一、简介 关于RTThread-nano的介绍&#xff0c;这里不做过多解释&#xff0c;官方文档已经介绍的非常详细了&#xff0c;有兴趣的可以参考如下文档&#xff1a;RT-Thread 文档中心 二、移植 1.准备一个能正常运行的代码 手头有M0内核的板子&#xff0c;那就以…...

Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)

文章目录 v-bind对样式控制的增强2.1 操作class2.1.1 语法2.1.2 对象语法2.1.3 数组语法2.1.4 使用2.1.5 Test 2.2 操作style2.2.1 语法2.2.2 使用2.2.3 Test v-bind对样式控制的增强 2.1 操作class 2.1.1 语法 <div> :class "对象/数组">这是一个div&l…...

【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》

**《ZooKeeper 深度探秘&#xff1a;分布式协调的强大利器》 ** 摘要&#xff1a;本文将深入详解 ZooKeeper&#xff0c;涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值&#xff0c;为构…...

打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路

导读&#xff1a;本文主要阐述了 Docs 在线表格为打造极致渲染性能所做的关键优化和过程思考&#xff0c;作为首个在在线电子表格领域自研基于WebGL渲染引擎的「吃螃蟹」者&#xff0c;整个过程面临诸多不确定性与挑战&#xff0c;Kola2d 的整体设计在此期间也经历了几轮推倒重…...

深入理解WPF中的命令机制

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础&#xff0c;具有强大的图形和媒体处理能力。在WPF中&#xff0c;“命令”是一个重要的概念&#xff0c;它为应用程序开发…...

基础算法(6)——模拟

1. 替换所有的问号 题目描述&#xff1a; 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;尝试用 a ~ z 的每一个字符替换即可 注意点&#xff1a;需考虑数组开头和结尾是问号的边界情况 代码实现&#xff1a; class Solution {public …...

2025年广西高考报名流程图解(手机端)

广西 2025 年高考报名时间已经确定啦&#xff0c;从 2024 年 10 月 21 日开始&#xff0c;到 10 月 31 日 17:30 结束 &#x1f4bb;【报名路径】 有电脑端和手机端两种选择哦。 电脑端&#xff1a;登录 “广西招生考试院” 网站&#xff08;https://www.gxeea.cn&#xff0…...

十、结构型(外观模式)

外观模式&#xff08;Facade Pattern&#xff09; 概念 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在为复杂子系统提供一个简化的统一接口。通过外观模式&#xff0c;客户端可以与子系统交互&#xff0c;而无需了解子系统的内部复杂性…...

10.12Python数学基础-矩阵(上)

矩阵 1.矩阵定义 1.1 矩阵的定义 矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示&#xff0c;例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为&#xff1a; A ( a 1 n a 12 … a 1 n a 21 a 22 … a 2 n ⋮ a m 1 a m 2…...

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI&#xff1f;2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装&#xff08;适…...

代码复现(五):GCPANet

文章目录 net.py1.class Bottleneck&#xff1a;残差块2.class ResNet&#xff1a;特征提取3.class SRM&#xff1a;SR模块4.class FAM&#xff1a;FIA模块5.class CA&#xff1a;GCF模块6.class SA&#xff1a;HA模块7.class GCPANet&#xff1a;网络架构 train.pytest.py 论文…...

联邦学习实验复现—MNISIT IID实验 pytorch

联邦学习论文复现&#x1f680; 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码&#xff0c;用于开展之后的相关研究&#xff0c;首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…...

2015年-2017年 计算机技术专业 程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 20151.C语言算法设计部分2.数据结构算法设计部分 20161.C语言算法设计部分2.数据结构算法设计部分 2017年1. C语言算法设计部分2.数据结构算法设计部分 2015 1.C语言算法设计部分 int total(int n) {if(n1) return 1;return total(n-1)n1; } //主函数测试代码已省略…...