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;}

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

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

相关文章

JavaWeb合集08-项目开发实战

八、项目开发 1、项目搭建 1.1 配置配置文件 application.properties文件 spring.application.namemybatis_testspring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.urljdbc:mysql://localhost:3306/homepage spring.datasource.usernameroot sp…

闪迪sd卡如何恢复删除的内容?这3种方法很实用

在数字时代&#xff0c;闪迪SD卡因其便携性、高容量和稳定性&#xff0c;成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;数据丢失的风险也如影随形&#xff0c;一个不小心的误删除、格式化或是其他意外情况&#xff0c;都可能让我们珍贵的照片、视频、文档等重要…

Vue详细入门(语法【一】)

今天滴学习目标&#xff01;&#xff01;&#xff01; Vue1. 什么是Vue.js2. Vue是怎么使用的嘞3. MVVM是什么嘞&#xff1f;4. Vue有哪些指令1. v-bind2.v-model3.v-if 和 v-else4. v-for5. v-show6. v-on 咱们先了解一下什么是Vue&#xff0c;Vue是怎么使用的嘞&#xff0c;V…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19目录1. What makes your model a low-empathy or warmth person: Exploring theOrigins of Personality in LLMs摘要研究背景算…

小公司团队管理:8个你需要知道的要点

小公司要想管理好团队&#xff0c;关键在于明确的目标与愿景、有效的沟通机制、灵活的激励制度、培养团队协作精神、领导者以身作则。其中&#xff0c;有效的沟通机制尤为重要。建立畅通的沟通渠道&#xff0c;不仅可以提高工作效率&#xff0c;还能及时发现并解决问题&#xf…

MatLab Desired port was :31515解决方案

前言&#xff1a;使用的MatLabR2022b今天突然出现了错误&#xff0c;在程序中打不开文件。后尝试了下面的方法&#xff0c;可以解决。 解决方法一&#xff1a; 搜索栏输入&#xff1a;firewall.cpl 找到相关项&#xff0c;右键属性&#xff0c;设置为允许。 之后就可以了…

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…

FloodFill 算法(DFS)

文章目录 FloodFill 算法&#xff08;DFS&#xff09;图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 FloodFill 算法&#xff08;DFS&#xff09; 漫水填充(Flood Fi)算法是一种图像处理算法&#xff0c;在计算机图形学和计算机视觉中被广泛…

阿里开源Multi-(llm)Agent应用框架: Agentscope探究与学习

1. 架构图 2. 核心概念 Core Concepts 2.1 Message&#xff08;消息&#xff09; 是信息的载体&#xff08;例如指令、多模态数据和对话内容&#xff09;。在AgentScope中&#xff0c;消息是Python字典的子类&#xff0c; 具有name和content作为必要字段&#xff0c;url作为可…

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…

【CSS in Depth 2 精译_048】7.2 CSS 响应式设计中的媒体查询原则(中):页面断点(breakpoint)样式的添加

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

「数学::快速幂」矩阵快速幂运算|快速斐波那契数列 / LeetCode 509(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 LeeCode 509&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff…

linux--库指令

ldd ldd 可执行文件路径 显示依赖的库的查找路径以及是否查找到了。

Request2:Post请求和Json

百度翻译拿到自己想看的数据&#xff0c;下图查看请求到数据的请求 preview提前看下 取出对应的RequestUrl &#xff0c;看出来要使用的话得用post请求 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json if __name__ "__main__":#1.指定…

SAP物料凭证报表字段调整

业务场景&#xff1a; 报表MB51的输入和输出字段调整&#xff1a; 输入&#xff08;选择界面&#xff09; 输出界面 可以看到在这是没有布局调整的 后台路径&#xff1a; SPRO-物料管理-库存管理和实际库存-报表-定义物料凭证列表的字段选择 事务码&#xff1a;SM30-V_MMI…

FPGA学习(6)-基础语法参数化设计阻塞与非阻塞

目录 1.两种参数化不改变源文件&#xff0c;只改仿真文件的值 2.参数化设计实现模块的重用 2.1不用参数化方法 2.1.1源文件 2.1.2仿真文件 2.1.3仿真波形及实验 2.2 用参数方法 2.2.1调用之前写的led灯闪烁模块&#xff0c;在本源函数中&#xff0c;例化4次调用之前的模…

史上最烂 spring transaction 原理分析

史上最烂 spring transaction 原理分析 事务定义、事务作用、事务特性、生命周期、数据库事务三种运行模式、数据库事务控制、并发事务问题、隔离级别、数据库事务实现原理、spring 事务传播行为、spring 事务核心组件、spring boot 事务相关组件、事务嵌套原理、编程式事务与声…

51单片机的万年历【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块时钟模块按键蜂鸣器等模块构成。适用于电子万年历、数字时钟万年历等相似项目。 可实现功能: 1、LCD1602实时显示年月日星期和北京时间&#xff0c;具备闰年判断功能 2、按键可设置闹钟时间 3、按键可修改当前时…

[Halcon矩阵] 通过手眼标定矩阵计算相机旋转角度

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

06.队列介绍+实现

目录 一、队列的概念 二、队列的实现 1、头文件定义 2、功能函数实现 3、主函数测试 一、队列的概念 队列就像吃饭排队类似&#xff0c;先来先吃&#xff0c;先进先出。 队头&#xff1a;队列的头部。 队尾&#xff1a;队列的尾部。 入队&#xff1a;在队尾操作。 出队&…