【员工工资册】————大一期末答辩近满分作业分享

前言

大家好吖,欢迎来到 YY 滴项目系列 ,热烈欢迎! 本章主要内容面向接触过C语言的老铁
主要内容含:

欢迎订阅 YY滴C++专栏!更多干货持续更新!以下是传送门!

  • PS:以下内容是部分展示,完整可以下载该博客相关资料,里面有所有资料,包括完整代码和项目要求

目录

  • 实验要求
  • 目录板块
  • 1.实践内容
  • 2.小组成员分工及任务分配
  • 3.系统分析及设计
    • 3.1 数a据结构设计
    • 3.2 模块划分
  • 4.系统实现
    • 4.1 各模块程序流程图
    • 4.2 各模块程序程序实现
      • 【PS备注部分】
      • 一:主函数部分
      • 二:密码板块
        • 修改密码板块:(采取直接覆盖)
      • 三:初始化模块
      • 四:保存板块
      • 五:排序id(冒泡排序)
      • 六:检查名字/职工代码是否重复
      • 七/八:按照职工名字排序板块/按应发工资排序(同理)
      • 九:计算职工应发工资模块
      • 十/十一:添加职工,修改职工信息同理
      • 十二.查找模块
      • 十三:删除模块(与查找模块类似)
    • 5.系统测试
      • 【1】测试功能:密码功能
      • 【2】测试功能:按照职工姓名排序(成功到二级菜单)
      • 【2】测试功能:计算职工的应发工资,实发工资 (截取部分)
      • 【3】测试功能:按照应发工资排序,输出
      • 【4】添加职工及其工资信息
      • 【5】修改给定职工的工资信息
      • 【6】查看给定职工的工资信息 (看下如何能够对齐)要修改的部分
      • 【7】删除职工
      • 【8】修改职工密码
      • 【9】最终测试:退出软件
  • 6. 总结和展望

实验要求

1 1 实践内容 【小项目】学生成绩管理系统 学生 2 人到 3 人一组,按组完成《学生成绩管理系统》,具体要求是: 1)
已知存放学生信息的有三个 ASCII 文件,分别是: Stu_Info.txt 中有学生信息,包括学号、姓名、学院代码、性别代码、 10
门成绩 S_Code.txt 中有性别代码及其所对应的性别名称 C_Code.txt 中有学院代码及其所对应的学院名称 2)
设计至少三个结构体,分别包含上述三个文件中包含的内容 3) 《学生成绩管理系统》的框架(至少 4 个函数,至少 3 个源代码文件)
学生成绩系统菜单*

  1. 读取数据
  2. 按姓名排序,输出
  3. 按平均成绩排序,输出
  4. 输出给定学院学生
  5. 修改给定学生成绩信息(修改后的信息,需输出到文件)
  6. 按姓名查询学生,输出
  7. 修改系统密码*
  8. 返回上一级菜单
    ***************************** 设计要求为交互式,程序执行后,显示上述菜单;比如输入 2 后,执行按姓 名排序;进入 2 后,也可以再设计子菜单,从大到小?还是从小到大?还是返 回上一级菜单?可由用户输入,比如:
  9. 从大到小排序
  10. 从小到大排序
  11. 返回上一级菜单 菜单中的修改密码为提高模块*,即程序执行需有密码(密码可以存放在一个 3 文件中,但是不得以明文出现);密码修改模块。 可增加模块,但是不能减少模块。

目录板块

目 录

2021—_2022_学年第_1_学期 1 1 实践内容 1 2 小组成员分工及任务分配 2 3 系统分析及设计 3
3.1 数a据结构设计 3
3.2 模块划分 3 4 系统实现 4
4.1 各模块程序流程图 4
4.2 各模块程序程序实现 5 5 系统测试 17
6. 总结和展望 23 参考文献 24

1.实践内容

已经给出三个ASCII文件,分别是:
Employee_Info.txt中有职工工资信息,包括职工号、所属部门编号、姓名、性别代码、基本工资、津贴、个人所得税、其他扣款
S_Code.txt中有性别代码及其所对应的性别名称 D_ Code.txt中有部门编号及其名称 要求如下:
1)设计三个结构体,至少能够描述上述三个文件中包含的内容;
2)进入系统前要求用户首先登陆,密码正确方可进入(要求建立一个保存密码密文的文件,如果文件不存在,首先创建文件并设置密码)
void passage() 1) 设计《职工工资管理系统》的框架(要求至少4个函数,至少3个源文件):
职工工资系统菜单* Void menu()

  1. 按职工姓名排序,输出
    void Sortname(struct Contact* ps)
    void SortRollname(struct Contact* ps, int flag)
    void ShowRollname(const struct Contact* ps)
  2. 计算职工的应发工资(基本工资+津贴),实发工资(应发工资-个人所得税-其他扣款);
    void Countpay(struct Contact* ps)
  3. 按应发工资排序,输出
    void Sortpayp(struct Contact* ps)
    void Sortpay(struct Contact* ps, int flag)
    void pSortpay(const struct Contact* ps)
  4. 添加职工及其工资信息
    void AddStaff(struct Contact* ps)
  5. 修改给定职工的工资信息(修改后的信息,需输出到文件)
    void ModifyStaff(struct Contact* ps)
  6. 按姓名查询职工,输出
    void Sortname(struct Contact* ps)
    void SortRollname(struct Contact* ps, int flag)
    void ShowRollname(const struct Contact* ps)
  7. 删除职工
    void DeletePayroll(struct Contact* ps)
  8. 修改系统密码
    void Moditywordl(struct Contact* ps)
  9. 返回上一级菜单//ps修改为退出程序
    EXIT
    添加:保存写入文件板块:
    void Savepayroll(struct Contact* ps)
    查找重复职工,id板块:
    int FindByName(const struct Contact* ps, char name[MAX_NAME])
    int Checkrepeat(const struct Contact* ps, int id)
    按照职工代码排序板块:
    void sortid(struct Contact* ps)
    【提示1】开始进入菜单前,除了登陆外,还需要进行系统初始化:即读取原始文件数据,并以链表或数组保存。
    void InitContact(struct Contact* ps)
    void LoadRoll(struct Contact* ps)
    【提示2】设计为交互式,程序执行后,显示上述菜单;比如输入2后,执行按姓名排序;进入2后,也可以再设计子菜单,从大到小?还是从小到大?还是返回上一级菜单?可由用户输入,比如:
  10. 从大到小排序
  11. 从小到大排序
  12. 返回上一级菜单 //设置在修改模块中 【提示3】可增加模块,但是不能减少模块,即0-8是必须的

2.小组成员分工及任务分配

马佳彬:全包

3.系统分析及设计

3.1 数a据结构设计

在这里插入图片描述

3.2 模块划分

(根据要求,划分为几个独立的模块-函数)
个人全包

4.系统实现

4.1 各模块程序流程图

在这里插入图片描述

4.2 各模块程序程序实现

【PS备注部分】

Ps:本项目划分为三大实现区域

  1. pay.h:实现结构体的声明,和若干.c文件的声明
  2. main.c:实现项目的主干功能,包含菜单和密码,以及枚举。
  3. 若干.c模块(ps:各.c文件均声明pay.h)

Ps:本项目的核心,是初始化模块以及保存模块

Ps:由于使用了枚举,所以先行展示
(ps:二级菜单没有使用枚举,怕冲突)
在这里插入图片描述

Ps:使用了清屏函数(避免报告冗余,略去插入思路)
在这里插入图片描述

Ps:头文件中声明的结构体以及定义
在这里插入图片描述
在这里插入图片描述

一:主函数部分

在这里插入图片描述

  • 进入密码模块(密码模块在main函数前,省去声明,menu()同理)
  • 初始化iuput为后续do while嵌套switch case的分类标识
  • 创建Contact结构体(可见上图声明的结构体)
    在这里插入图片描述

二:密码板块

在这里插入图片描述

修改密码板块:(采取直接覆盖)

在这里插入图片描述

三:初始化模块

在这里插入图片描述

  • 用memset函数开辟对ps指向的成员data开辟一块空间,由max来控制开辟空间
  • 注意sizeof(结构体),要注意内存对齐的问题
  • Ps:内存对齐的本质是牺牲空间来换取时间,也许会多开辟空间无伤大雅
  • Ps:要做到既节省空间又节省时间,可以在设置结构体成员的时候,尽量把小的结构成员放在一起。
    在这里插入图片描述
  • 接下来采取同样的方式,将剩下两个转化“代码-部门/性别”的文件内容读取到对应的结构体中
    在这里插入图片描述
    在这里插入图片描述

四:保存板块

在这里插入图片描述

五:排序id(冒泡排序)

在这里插入图片描述

六:检查名字/职工代码是否重复

原理:设置两个参数,一个是输入的数组,一个是职工册结构体的地址。

  • Ps:strcmp的两个参数都是指针
  • 不同点/设计重点:返回参数
  • FindByName,返回要找到的名字的序号i(非职工代码)
  • Checkrepeat,只需要标识找到与否的状态
    在这里插入图片描述
    在这里插入图片描述

七/八:按照职工名字排序板块/按应发工资排序(同理)

  • 原理:冒泡排序后,用序号打印结构体PeoInform中对应的name成员
  • 二级菜单原理:用goto语句自由穿梭
    在这里插入图片描述

九:计算职工应发工资模块

原理:用for运行实现每个对应序号的PeoInform结构体成员的对应成员计算;
用for运行打印结构体中存储的数据;
在这里插入图片描述

十/十一:添加职工,修改职工信息同理

  • 原理:添加到PeoInfrom结构体中;由保存函数导入文件
    在这里插入图片描述
    在这里插入图片描述

十二.查找模块

原理:

  • 创建一个数组,填入待查找的名字
  • 通过FindByname函数填入,在之中用strcmp比较
  • 利用结构体打印
  • Tran函数实现的功能是在展示的时候,将性别代码和部门代码转化成对应的性别和部门。x,y是全局变量,分别储存了性别代码和部门代码的种类。在遍历的时候以它为终止条件。可以实现精确的查找。
    在这里插入图片描述

十三:删除模块(与查找模块类似)

原理:

  • 创建一个数组,填入要删除的名字
  • 通过FindByname函数填入,在之中用strcmp比较
  • 用下一位PeoInform的内容填入
  • Size–(比如删除最后一位,虽然填入没有内容,后通过保存函数保存也能实现删除)
    在这里插入图片描述

5.系统测试

【1】测试功能:密码功能

在这里插入图片描述

【2】测试功能:按照职工姓名排序(成功到二级菜单)

在这里插入图片描述

【2】测试功能:计算职工的应发工资,实发工资 (截取部分)

在这里插入图片描述

【3】测试功能:按照应发工资排序,输出

在这里插入图片描述

【4】添加职工及其工资信息

在这里插入图片描述

【5】修改给定职工的工资信息

在这里插入图片描述

【6】查看给定职工的工资信息 (看下如何能够对齐)要修改的部分

在这里插入图片描述

【7】删除职工

在这里插入图片描述
在这里插入图片描述

【8】修改职工密码

在这里插入图片描述

【9】最终测试:退出软件

在这里插入图片描述

6. 总结和展望

实验完成情况。还有那些不足,会如何改进

  1. 低级错误:
  • 把结构体指针当作文件指针,导致程序运行起来自动崩溃
  • 规划函数名字时没有清晰规划,调用时出现不知名bug
  • 由于思路不够清晰,初始化阶段出现bug;创建多余结构体成员num承担size功能
  1. 重点错误:
  • 在读取数据,实现读取注释功能时。忽略了读取到总数100时,下一个读取的num跳过1直接到0;
  • 解决方法:用fseek函数,将指针向前偏移一个字节
  1. 一些思路上的反思:
  • 在面对添加板块时:一开始想直接在文件中进行添加,采用了w/w+的方式,发现文档直接只剩下添加的成员;后明白w/w+都会直接创建新文件,若存在同名文件则覆盖。
  • 后采取追加的方式a。发现添加数据直接添加到最后的数据后面,没有换行;后加入“写入换行”方式。
  • 此时并没有设计保存方式,还面临排序问题;(好比1 3 序号,缺少2;在尾部填入2,需要其回嵌入到13中间);此时发现直接在文件中修改不是很可靠。
  • 最后决定,采取一并把数据导入到结构体con中,再对con的成员结构体PeoInform进行排序,最后再直接覆盖旧文件的方案;这种思路具有统一性,且十分清晰,具备很高的调整属性(按职工序号或其余方式)
  • 在面对保存板块时:想过直接用二进制方式,直接把PeoInform成员全部导入到文件中。为保证文档中的代码可读(非二进制形式),遂放弃。
  1. 个人总结
  • 本次项目(含报告)大概耗时30小时左右,其中大量的时间在程序的调试和bug的查找中。由于调试经验不足以及对调试功能的陌生,以至于造成许多细小的错误浪费了大量的时间的结果。
  • 在不断的调试过程中,一步一步深化了对指针和结构体的理解。[在结构体中嵌套次级结构体成员,并通过一级结构体成员的部分成员(size)来调控结构体成员的方式。]
  • 对程序与文件的交互有了更进一步的了解。[程序和文件之间可以通过结构体成员来搭建联系(上文中思路的反思),具备更多的可调节性]
  • 补全了对(w/w+/a/fseek)的认识和实际应用经验

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

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

相关文章

springboot升级到3.2导致mybatis-plus启动报错

在springboot升级到3.2时,服务启动报错 java.lang.IllegalArgumentException: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String: java.lang.IllegalArgumentException: Invalid value type for attribute factoryBeanOb…

55 代码审计-JAVA项目注入上传搜索或插件挖掘

目录 必备知识点演示案例:简易Demo段SQL注入及预编译IDEA审计插件FindBugs安装使用Fortify_SCA代码自动审计神器使用Ofcms后台SQL注入-全局搜索关键字Ofcms后台任意文件上传-功能点测试 涉及资源: 我们一般针对java项目,进行漏洞分析的话,主要…

【计算机视觉--解耦视频分割跟踪任何物体】

UIUC&Adobe开源|无需监督,使用解耦视频分割跟踪任何物体!视频分割的训练数据往往昂贵且需要大量的标注工作。这限制了将端到端算法扩展到新的视频分割任务,特别是在大词汇量的情况下。为了在不为每个个别任务训练视频数据的情况下实现“跟…

HPM6750系列--第九篇 GPIO详解(中断操作)

一、目的 在上篇中《HPM6750系列--第九篇 GPIO详解(基本操作)》我们讲解了GPIO的基本操作,本篇继续讲解GPIO的中断处理。 二、介绍 将一个引脚设置为中断涉及到以下几个步骤(此处我们以PZ02举例): 1.设置IO…

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题(论文详情请点击阅读原文),分为三个主要集群: 1)驾驶…

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 + 去匿名化技术 + 推理攻击技术 + k-匿名 + 基于聚类的隐私保护算法

社交网络分析3:社交网络隐私攻击、保护的基本概念和方法 去匿名化技术 推理攻击技术 k-匿名 基于聚类的隐私保护算法 写在最前面社交网络隐私泄露用户数据暴露的途径复杂行为的隐私风险技术发展带来的隐私挑战经济利益与数据售卖防范措施 社交网络 用户数据隐私…

centOS7 安装tailscale并启用子网路由

1、在centOS7上安装Tailscale客户端 #安装命令所在官网位置:https://tailscale.com/download/linux #具体命令为: curl -fsSL https://tailscale.com/install.sh | sh #命令执行后如下图所示2、设置允许IP转发和IP伪装。 安装后,您可以启动…

Shell三剑客:正则表达式(元字符)

一、定义:元字符字符是这样一类字符,它们表达的是不同字面本身的含义 二、分类: 1、基本正则表达式元字符 # ^ 行首定位 [rootlocalhost ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/…

webgpu demo阅读 A-Buffer

A-Buffer 简单看看原理code 简单看看原理 这个是OIT里的链表方式&#xff0c;说的是首先把每个像素搞一个链表&#xff0c;然后把深度<opaque的存起来&#xff0c;最后排序&#xff0c;然后混合 code 这里就有这么一个depht判断 再看最后合成 可以看到&#xff0c;确实是…

六:爬虫-数据解析之BeautifulSoup4

六&#xff1a;bs4简介 基本概念&#xff1a; 简单来说&#xff0c;Beautiful Soup是python的一个库&#xff0c;最主要的功能是从网页抓取数据官方解释如下&#xff1a; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱…

hive常用SQL函数及案例

1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似于Java中的函数。 好处&#xff1a;避免用户反复写逻辑&#xff0c;可以直接拿来使用。 重点&#xff1a;用户需要知道函数叫什么&#xff0c;能做什么。 Hive提供了大量的内置函数&#xff0c;按照其特…

React系列:嵌套路由的使用

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc 🤞嵌套路由的使用🤞 🎈嵌套路由是什么 在一级路由中又内嵌了其他路由,这…

企业安全建设与实践-复习资料

文章目录 二、企业安全建设与实践1、复习Windows及Linux基础命令。例如&#xff1a;用户创建、权限提升等。2、复习docker 基础命令&#xff1a;启动、关闭、导入、导入、下载等命令复习建议docker菜鸟教程。3、复习Windows策略相关知识点。4、复习基线加固部分内容。5、渗透测…

STM32启动过程

STM32启动模式&#xff08;自举模式&#xff09; M3/3/7等内核&#xff0c;复位后做的第一件事&#xff1a; 从地址0x0000 0000处取出栈指针MSP的初始值&#xff0c;该值就是栈顶地址。从地址0x0000 0004处取出程序计数器指针PC的初始值&#xff0c;该值是复位向量。 芯片厂商…

DevEco Studio IDE 创建项目时候配置环境

DevEco Studio IDE 创建项目时候配置环境 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、在配置向导的时候意外关闭配置界面该如何二次配置IDE环境。 打开IDE的界面是这样的。 点击Create Project进行环境配置。 点击OK后出现如…

嵌入式人工智能(钱多?好学?前景好?)

概念 嵌入式人工智能&#xff08;Embedded AI&#xff09;是指将人工智能&#xff08;AI&#xff09;技术集成到各种设备和系统中&#xff0c;使其具备智能化和自主性。与传统的中央化计算模型不同&#xff0c;嵌入式人工智能将AI能力嵌入到设备本身&#xff0c;使其能够在本地…

FPGA简易加减法计算器设计

题目要求&#xff1a; &#xff08;1&#xff09;设计10以内的加减法计算器。 &#xff08;2&#xff09;1个按键用于指定加法或减法&#xff0c;一个用于指定加数或被加数&#xff0c;还有两个分别控制加数或被加数的增加或减少。 &#xff08;3&#xff09;设置的结果和计算的…

“华为杯” 第二十届中国研究生数学建模竞赛 数模之星、华为之夜与颁奖大会

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 不以物喜&#xff0c;不以己悲。见众生&#xff0c;见自己。 作为荣获一等奖的学生代表&#xff0c;我有幸参加了 “华为杯” 第二十届中国研究生数学…

Linux c++开发-08-使用Linux API mmap文件内存映射

用途&#xff1a;超大文件&#xff0c;进程间共享内存 API: 示例&#xff1a; 结果&#xff1a;

【ArkTS】样式复用

如下代码&#xff0c;可以发现每个元素的样式一致&#xff0c;这时就可以将公共样式封装起来 此时可以使用Styles修饰符将公共样式进行封装 Styles修饰符 Entry Component struct Index{build() {Column(){Text(我是Text).ComStyle()Button(我是Button).ComStyle()Image().Co…