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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

EM算法学习

1.EM算法的介绍 可以发现&#xff1a;计算出θA和θB的值的前提是知道A、B币种的抛掷情况。 所以我们需要使用EM算法&#xff1a;求出每轮选择硬币种类的概率 2.EM算法执行过程&#xff1a; 第一步&#xff1a;首先初始化设置一组PA和PB证明的值。然后通过最大似然估计得到每…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 &#x1f551;流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…

MySQL【知识改变命运】08

数据库约束 1&#xff1a;约束的几个类型2&#xff1a;NOT NULL非空约束3&#xff1a;UNIQUE 唯⼀约束4&#xff1a;PRIMARY KEY 主键约束4.1:回顾 5&#xff1a;FOREIGN KEY 外键约束5.1&#xff1a;创建班级表(主表)&#xff0c;并初始化数据5.2&#xff1a;重构学⽣表(从表)…

【Golang】Go语言http编程底层逻辑实现原理与实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 &#xff08;推荐使用&#xff09;参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件&#xff1a; sudo gedit …

STM32F4- SD卡和 FATFS文件系统

单片机系统常需大容量存储设备&#xff0c;如U盘、FLASH芯片、SD卡等。 其中&#xff0c;SD卡因容量大、支持SPI/SDIO驱动、尺寸多样&#xff0c;成为单片机系统的优选。 STM32F4开发板自带SD卡接口&#xff0c;使用SDIO接口驱动&#xff0c;支持高速数据传输。 1.1 SDIO 简介…

JavaWeb学习(1)

目录 一、什么是JavaWeb 二、静态web和动态web 三、Web服务器&#xff08;Tomcat&#xff09; 四、Http 4.1 是什么 4.2 两个时代 4.3 Http请求 4.4 Http响应 五、Maven 六、Servlet 七、HttpServletResponse 7.1 常见应用 7.1.1 向浏览器输出消息 7.1.2 下载文件 …

为您的人工智能数据提供类似 Git 的版本管理功能

您过去肯定有过版本控制代码。但是&#xff0c;您是否对数据进行了版本控制&#xff1f;您是否曾经想过与不同的团队协作处理大量数据&#xff0c;而无需提交大量数据&#xff1f;想象一下&#xff0c;使用类似 git 的命令来运行类似存储库的生态系统&#xff0c;在该生态系统中…

Unity实现自定义图集(三)

以下内容是根据Unity 2020.1.0f1版本进行编写的   1、实现编辑器模式下进游戏前Pack全部自定义图集 同Unity的图集一样,Unity的编辑器模式会在进游戏前把全部的SpriteAtlas都打一次图集,如图: 我们也实现这样的效果。 首先需要获取全部的图集路径。因为目前使用的是以.…

RISC-V笔记——RVWMO基本体

1. 前言 RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;它是Release Consistency的扩展&#xff0c;因此&#xff0c;RVWMO的基本特性类似于RC模型。 2. RC模型 Release consistency(RC)的提出是基于一个观察&#xff1a;将所有同步操作用FENCE围在一…

全国职业技能大赛——信息安全管理与评估第一阶段BC、FW、WAF题目详细解析过程

💗需要职业技能大赛环境+WP,请联系我!🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 一个想当文人的黑客 ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【edusrc漏洞挖掘】 【VulnHub靶场复现】【面试分析】 🎉欢迎关注💗一起学习👍一起讨论⭐️一起…

【WPF】中ListBox的ListBox选项的选中状态在弹出MessageBox后失效的解决办法

1.问题描述 1.1 ListBox选项的样式 在WPF中&#xff0c;可以通过定义ListBoxItem的样式来改变ListBox选项的选中状态。这通常涉及到使用ControlTemplate和Trigger来指定当ListBoxItem处于不同状态时&#xff08;如被选中、鼠标悬停等&#xff09;的外观。ListBoxItem设置不同…

TikTok零播放的原因及解决方法

TikTok作为一个月活跃用户数已经超过15亿的社媒平台&#xff0c;巨大的流量不断吸引着用户加入&#xff0c;其中不乏需要推广获客的卖家。在运营推广工作中&#xff0c;视频播放量是重要的评估维度&#xff0c;如果出现零播放的情况&#xff0c;需要卖家找出原因并尽快解决。 一…

『Mysql集群』Mysql高可用集群之主从复制 (一)

Mysql主从复制模式 主从复制有一主一从、主主复制、一主多从、多主一从等多种模式. 我们可以根据它们的优缺点选择适合自身企业情况的主从复制模式进行搭建 . 一主一从 主主复制 (互为主从模式): 实现Mysql多活部署 一主多从: 提高整个集群的读能力 多主一从: 提高整个集群的…

vulnhub靶场之digitalworld.local: MERCY v2

一.环境搭建 1.靶场描述 MERCY is a machine dedicated to Offensive Security for the PWK course, and to a great friend of mine who was there to share my sufferance with me. :-) MERCY is a name-play on some aspects of the PWK course. It is NOT a hint for the …

快速排序-加餐

1.快排性能的关键点分析 决定快排性能的关键点是每次单趟排序后&#xff0c;key对数组的分割&#xff0c;如果每次选的key基本都二分居中&#xff0c;那么快排的递归树就是一棵均匀的满二叉树&#xff0c;性能达到最佳。 但是在实践中虽然不可能每次都是二分居中&#xff0c;…

[CTF夺旗赛] CTFshow Web13-14 详细过程保姆级教程~

前言 ​ CTFShow通常是指网络安全领域中的“Capture The Flag”(夺旗赛)展示工具或平台。这是一种用于分享、学习和展示信息安全竞赛中获取的信息、漏洞利用技巧以及解题思路的在线社区或软件。参与者会在比赛中收集“flag”&#xff0c;通常是隐藏在网络环境中的数据或密码形…

面向对象--继承

文章目录 1. 继承概念及定义&#xff1a;继承的定义&#xff1a;继承关系和访问限定符&#xff1a;继承基类成员访问方式的变化 &#xff08;在派生类中访问方式&#xff09; 2. 基类和派生类对象赋值转换3 .继承中的作用域4. 派生类的默认成员函数5. 继承与友元6. 继承与静态成…

《Python爬虫逆向实战》内存漫游

所谓内存漫游&#xff0c;就是说我们可以在浏览器内存中随意检索任何想要的数据。在JS逆向过程中&#xff0c;最麻烦和最浪费时间的步骤就是跟值。本篇文章介绍内存漫游工具能够帮助我们快速定位某个加密值的生成位置&#xff0c;即可以直接搜索变量的值(value)&#xff0c;而不…

【Linux】Linux进程基础

1.进程介绍与概念 进程的本质是在计算机内存中运⾏的程序&#xff0c;但是这⼀个概念太过于⼴泛 每个应用程序运行于现代操作系统之上时&#xff0c;操作系统会提供一种抽象&#xff0c;好像系统上只有这个程序在运行&#xff0c;所有的硬件资源都被这个程序在使用。这种假象…