2022年职工工资信息管理系统实验报告 .pdf
1 安徽科技学院计算机科学与技术专业数据结构课程设计实验报告学院: 理学院班级: 计算机 102 班组长: 裴桂林学号:1881100215 成员:汤芸 1881100217 张静 1881100227 汪娟 1881100220 裴桂林 1881100215 开课学期: 2011年2012 年实验日期: 2011 年 12 月 14 日-2011 年 12 月 28 日指导教师 : 庄锁法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 30 页 - - - - - - - - - 2 实验名称职工工资信息管理系统实验场所力行楼六楼实验室四1概要设计:一:这是一个用链表的方法来设计一个职工工资信息的管理程序,该程序应该具有下列功能:(1)添加功能: 添加一个职工的基本信息,包括工资卡号、身份证号、姓名、基本工资、职务工资、各种补助、应发工资、水电费、公积金、税金、实发工资等(2)删除功能: 能够对一个职工的信息进行删除,例如按姓名进行删除、(3)显示功能: 显示所有职工的主要信息包括工资卡号、身份证号、姓名、基本工资、职务工资、各种补助、应发工资、水电费、公积金、税金、实发工资等(4)查找功能: 根据你键入的职工姓名,显示其详细信息;(5)修改功能: 根据你键入的职工姓名,对该职工工资信息进行修改;(6)排序功能: 对职工的信息按照实发工资进行排序。二:系统功能模块图如下所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 30 页 - - - - - - - - - 3 2. 详细设计一: 头文件及结构体#include #include #include typedef struct Staff char no7; /工资卡号char ide19;/身份证号char name10;/姓名char sex4;/性别int age;/ 出生年份double jsal; /基本工资double zhsal; /职务工资double buzhu; /补助double ysal;/应发工资double fare;/水电费double gjj;/公积金double tax;/税金double shsal;/实发工资 Worker; typedef struct Linker Worker workperson; struct Linker *next; Link; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 30 页 - - - - - - - - - 4 二:声明函数void Menu(); /菜单void Add(); /添加void Del(); /删除void Show();/浏览void Search();/查找void Update();/修改void Sort();/排序void ExitManger();/ 退出三:主函数的编写void main() system(color 4d); Link *List = NULL; int n, flag; char a; Menu(); do printf(请选择你需要操作的步骤(1-7):n); scanf(%d, &n); if (n = 1 & n = 7) flag = 1; break; else flag = 0; printf( 您输入有误,请重新选择!); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 30 页 - - - - - - - - - 5 while (flag = 0); while (flag = 1) switch (n) / 下面通过 switch 来实现多条件的选择case 1:printf( 添加职工信息n); printf(n); Add(List); break; case 2:printf( 显示职工信息n); printf(n); Show(List); break; case 3:printf( 按姓名查询职工信息n); printf(n); Search(List); break; case 4:printf( 删除职工信息n); printf(n); Del(List); break; case 5:printf( 按实发工资排序n); printf(n); Sort(List); break; case 6:printf( 修改职工信息n); printf(n); Update(List); break; case 7:ExitManger();break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 30 页 - - - - - - - - - 6 default:break; if (n = 7) /直接退出 flag = 0; break; getchar(); printf(n); printf( 是否继续使用该管理系统(y or n):n ); scanf(%c, &a); if (a = y) flag = 1; system(cls); /清屏Menu(); /*调用菜单函数 */ printf( 请选择你需要操作的步骤(1-7):n); scanf(%d, &n); else flag = 0; break; 四:对各个函数的定义1: 主菜单函数void Menu() system(color 4d); printf( 计算机科学与技术学系 n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 30 页 - - - - - - - - - 7 printf(n); printf( 102 班 裴桂林 张静 汤芸 汪娟 n); printf(n); printf( *职工工资信息管理系统*n); printf( 1.添加职工信息 n); printf( 2.显示职工信息 n); printf( 3.查询职工信息 n); printf( 4.删除职工信息 n); printf( 5.排序职工信息 n); printf( 6.修改职工信息 n); printf( 7.退出 n); printf( *谢谢使用 *n); printf(n); printf(n); 2:添加函数在添加的过程中,性别应为男或女,工资卡号规定为6 位,年份应为4 位 , 身份证号应为18位,对与不符合要求的输入,可以通过比较,通过do while这个循环来进行重新输入。Add 函数中调用 search3 函数int search3(Link *L, char str); /返回 1 表示有重复, 0 表示没有void Add(Link *&L) /头插法 int right; Worker e; Link *newworker; printf( 请输入该职工的信息n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 30 页 - - - - - - - - - 8 do printf( 输入工资卡号 (6 位):n); scanf(%s, &e.no); if (strlen(e.no) != 6) printf( 输入错误 ,请重新输入 !n); right = 1; else if (search3(L, e.no) printf( 亲!你输入的卡号已存在,请重新输入吧 !); right = 1; else right = 0; while (right = 1); do printf( 输入身份证号 (18 位):n); scanf(%s, &e.ide); if (strlen(e.ide) != 18) printf( 输入错误 ,请重新输入 !n); right = 1; else if (search3(L, e.ide) printf( 亲!你输入的身份证号已存在,请重新输入吧 !); right = 1; else right = 0; while (right = 1); printf( 输入姓名 :n); scanf(%s, &e.name); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 30 页 - - - - - - - - - 9 do printf( 输入性别 :n); scanf(%s, &e.sex); if (strcmp(e.sex, 男) != 0 & strcmp(e.sex, 女) != 0) printf( 输入错误 ,请重新输入 !n); right = 1; else right = 0; while (right = 1); printf( 输入出生年份 :n); scanf(%d, &e.age); printf( 输入基本工资 :n); scanf(%lf, &e.jsal); printf( 输入职务工资 :n); scanf(%lf, &e.zhsal); do printf( 输入补助 :n); scanf(%lf, &e.buzhu); if (e.buzhu 0) printf( 输入错误 ,请重新输入 !n); right = 1; else right = 0; while (right = 1); printf( 输入水电费 :n); scanf(%lf, &e.fare); printf( 输入公积金 :n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 30 页 - - - - - - - - - 10 scanf(%lf, &e.gjj); printf( 信息输入完毕 n); e.ysal = e.jsal + e.zhsal + e.buzhu; if (e.ysal workperson = e; newworker-next = L; L = newworker; int search3(Link *L, char str) Link *p = L; while (p != NULL) if (strcmp(p-workperson.no, str) = 0| strcmp(p-workperson.ide, str) = 0) return 1; p = p-next; return 0; 3.删除函数按姓名查到职工信息删除,Del 函数调用 del1;void del1(Linker *&L, char person) Linker *p = L, *q; /q指向 p 的前面一个人名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 30 页 - - - - - - - - - 11 while (p != NULL) if (strcmp(p-workperson.name, person) = 0) break; q = p; p = p-next; q-next = p-next; free(p); printf( 删除完毕 !n); void Del(Linker *&L) /按姓名进行删除 char person10; char ch; int flag = 0; while (flag = 0) printf( 请输入你要删除的姓名:); scanf(%s, person); del1(L, person); printf( 你还想继续删除吗?y or n n); getchar(); scanf(%c, &ch); if (ch = y) del1(L, person); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 30 页 - - - - - - - - - 12 else flag = 1; break; 4.显示函数显示职工所有信息;void Show(Link *L) Link *p = L; int k = 1; while (p != NULL) printf( 第%d 个职工的信息如下:n, k+); printf( 工资卡号 : %sn, p-workperson.no); printf( 身份证号 : %sn, p-workperson.ide); printf( 姓名: %sn, p-workperson.name); printf( 性别: %sn, p-workperson.sex); printf( 年龄: %dn, p-workperson.age); printf( 基本工资 : %.1lfn, p-workperson.jsal); printf( 职务工资 : %.1lfn, p-workperson.zhsal); printf( 补助: %.1lfn, p-workperson.buzhu); printf( 应发工资 : %.1lfn, p-workperson.ysal); printf( 水电费 : %.1lfn, p-workperson.fare); printf( 公积金 : %.1lfn, p-workperson.gjj); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 30 页 - - - - - - - - - 13 printf( 税金: %.1lfn, p-workperson.tax); printf( 实发工资 : %.1lfn, p-workperson.shsal); printf(n); p = p-next; 5.查找函数按姓名查找职工信息,Search 函数中调用search1;int search1(Link *L, char person) Link *p = L; int flag = 0; int k = 1; while (p != NULL) if (strcmp(p-workperson.name, person) = 0) flag = 1; printf( 这是为你找到的第%d 个职工的信息如下:n, k+); printf( 工资卡号 : %sn, p-workperson.no); printf( 身份证号 : %sn, p-workperson.ide); printf( 姓名: %sn, p-workperson.name); printf( 性别: %sn, p-workperson.sex); printf(年龄 : %dn, p-workperson.age); printf( 基本工资 : %.1lfn, p-workperson.jsal); printf( 职务工资 : %.1lfn, p-workperson.zhsal); printf( 补助: %.1lfn, p-workperson.buzhu); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 30 页 - - - - - - - - - 14 printf( 应发工资 : %.1lfn, p-workperson.ysal); printf( 水电费 : %.1lfn, p-workperson.fare); printf( 公积金 : %.1lfn, p-workperson.gjj); printf( 税金: %.1lfn, p-workperson.tax); printf( 实发工资 : %.1lfn, p-workperson.shsal); printf(n); p = p-next; if (flag = 0) printf( 啊哈!还没有该职员信息呢n); return 0; return 1; void Search(Link *L) char person10; char ch; int flag = 0; while (flag = 0) printf( 请输入你要查询的姓名:); scanf(%s, person); search1(L, person); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 30 页 - - - - - - - - - 15 printf( 你还想继续查询吗?y or n n); scanf(%c, &ch); if (ch = y) continue; else flag = 1; 6.修改函数其修改菜单功能如下图:先按姓名查找到所要查找的职工,在修改菜单中选择所需要修改信息;void Update(Linker *&L) int right; Linker *p = L; int num = 0,ch,j; char person100; Worker e; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 30 页 - - - - - - - - - 16 int flag; do printf( 请输入你要修改的职工的姓名: ); scanf(%s, person); if (!search1(L, person) flag = 1; printf( 没有该职员信息 ,请重新输入姓名吧n); else flag = 0; while (flag = 1); system(cls); system(color 9a); printf( *你具有的修改权限如下*n); printf( -n); printf( |t 1.姓名 2.性别 3. 身份证号 4.出生年份 5. 工资卡号 t |n); printf( |t 6.基本工资 7. 补 助 8. 公积金 9. 职务工资 10. 水电费 t |n); printf( -11.返回主菜单 -n); printf( -n); printf( 请输入你想修改的总项数: ); scanf(%d,&j); printf(n); for (int i = 0 ;i j;i+) printf( 请输入你想选择的序号: ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 30 页 - - - - - - - - - 17 scanf(%d,&ch); if (ch = 1) printf( 修改姓名 :n); scanf(%s, &e.name); else if (ch = 2) do printf(输入性别 :n); scanf(%s, &e.sex); if(strcmp(e.sex,男)!=0&strcmp(e.sex,女)!=0) printf( 输入错误 ,请重新输入 !n); right=1; else right=0; while(right=1); else if (ch = 3) do printf( 输入身份证号 (18 位):n); scanf(%s, &e.ide); if (strlen(e.ide) != 18) printf( 输入错误 ,请重新输入 !n); right = 1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 30 页 - - - - - - - - - 18 else if (search3(L, e.ide) printf( 亲!你输入的身份证号已存在,请重新输入吧 !); right = 1; else right = 0; while (right = 1); else if (ch = 4) printf( 修改出生年份 :n); scanf(%d, &e.age); else if (ch = 5) do printf( 输入工资卡号 (6 位):n); scanf(%s, &e.no); if (strlen(e.no) != 6) printf( 输入错误 ,请重新输入 !n); right = 1; else if (search3(L, e.no) printf( 亲!你输入的卡号已存在,请重新输入吧 !); right = 1; else right = 0; while (right = 1); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 30 页 - - - - - - - - - 19 else if (ch = 6) printf( 修改基本工资 :n); scanf(%lf, &e.jsal); else if (ch = 7) do printf(输入补助 :n); scanf(%1f, &e.buzhu); if(e.buzhu0) printf(输入错误 ,请重新输入 !n); right=1; else right=0; while(right=1); else if (ch = 8) printf( 修改公积金 :n); scanf(%lf, &e.gjj); else if (ch = 9) printf( 修改职务工资 :n); scanf(%lf, &e.zhsal); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 30 页 - - - - - - - - - 20 else if (ch = 10) printf( 修改水电费 :n); scanf(%lf, &e.fare); else if (ch = 11) return; else printf( 没有其它选项,请重新输入!n); continue ; e.ysal = e.jsal + e.zhsal + e.buzhu; if (e.ysal workperson.name, person) = 0) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 30 页 - - - - - - - - - 21 break; num+; pnum.workperson = e; printf( 成功修改完毕 !n); 7.排序函数按实发工资排序,在计算实发工资中,其中税金不是输入进去的而是通过函数计算而得;补助不能为负值,通过比较判断;void Sort(Link *&L)/ Link *p = L, *tail, *q; if (p != NULL) tail = L-next; p-next = NULL; p = tail; while (p != NULL) tail = p-next; q = L; if (L-workperson.shsal p-workperson.shsal) /如果一开始比头结点就大 p-next = L; L = p; else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 30 页 - - - - - - - - - 22 while (q-next != NULL & q-next-workperson.shsal workperson.shsal) q = q-next; p-next = q-next; q-next = p; p = tail; printf( 成功排序完毕 !n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 30 页 - - - - - - - - - 23 8.在编程中,程序中存在的不足、可优化的地方;( 1) 工资卡号、身份证号可能会重复解决方法:通过查询比较int search3(Link *L, char str) Link *p = L; while (p != NULL) if (strcmp(p-workperson.no, str) = 0| strcmp(p-workperson.ide, str) = 0) return 1; p = p-next; return 0; (2)在显示中,工资卡号后直接跟着显示出身份证号解决方法:输入6 位工资卡号,定义char no7; /工资卡号(3)补助可以输入负值,与实际不符解决方法: if (e.buzhu 0) printf( 输入错误 ,请重新输入 !n); right = 1; else right = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 23 页,共 30 页 - - - - - - - - - 24 3. 调试分析(1)添加模块存在的问题是,输入的性别如何判断是男女,以及工资卡号怎么判断是6 位且不重复,身份证号怎么判断是18 位且不重复,以及出生年的判断是否符合日常规则等,都是通过和规定的值进行比较,不符合就通过do while这个循环重新输入,直到正确为止名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 24 页,共 30 页 - - - - - - - - - 25 (2). 显示模块名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 25 页,共 30 页 - - - - - - - - - 26 (3). 查找模块(4). 删除模块名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 26 页,共 30 页 - - - - - - - - - 27 (5). 修改模块(6). 排序模块按工资排序并显示名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 27 页,共 30 页 - - - - - - - - - 28 (7) 退出模块名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 28 页,共 30 页 - - - - - - - - - 29 4. 总结与体会经过一学期数据结构学习,我们基本掌握了基础知识,基本能够读懂别人用c 语言设计的程序。平时的程序设计大多是是按书本输入程序代码,虽然有所接触,但都不完全相同。而这两周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。这是一个新的挑战,也是一种新的学习。我们组选择的是选题目中的第五个职工信息管理系统。这需要我们自己设计一个系统,可以输入信息、使之显示在屏幕上,进行删除、添加等对信息的修改。当我们拿到这道题目时,觉得好难。以前的C 语言学的不怎么好,导致现在课题中的某些算法不知道怎么去实现。后来,老师对我们的课题内容进行了分析,为我们建好了程序的轮廓,让我们明白了我们的目标是什么,要做些什么,为我们指明了道路。在此基础之上,我们小组确定了各自的分工,各自去完成自己的任务。私底下,我们独立在做自己负责的模块。实验课上,我们按照老师的要求,把完成的模块组合到主程序上。组合简单,但是要让个部分没有分歧地融为一体,“和睦相处”,却是比登天还难。往往组合之后会有很多错误的地方,我们要一个一个地去解决。有些错误很容易修正,但有些却是绞尽脑汁都弄不明白的。比如说,有个显示的模块,程序写的是对的,但不知道为什么,工资卡号明明设置的是五位数字,在显示的时候,它的后面会跟上身份证号。无论怎么改,都不行。当然,在我们没有能力去解决的时候,也会去向学长求助。每改对一个错误,每完成一个模块的融入,我们都欣喜若狂,因为我们离成功又近了一步。最后,在老师、学长以及我们小组成员的努力之下,终于完成了课题设计这个艰巨的任务。感觉这次不仅仅是做课题,我们同时也学到了许多课堂上学不到的东西。其一,课堂上学到的知识,能否真正变成自己的东西,自如地运用到实际问题中,这需要通过实践去检验。其二,遇到问题,不可怕,可怕的是你遇到问题后置之不理。我们应该在错误中修正自己的错误,在失败中为成功积累经验。其三,小组是一个集体,我们个人在集体中应该发挥各自的长处,为集体奉献自己的力量,让小组发挥出最大的能量。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 29 页,共 30 页 - - - - - - - - - 30 5. 评语:成 绩签 名年月日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 30 页,共 30 页 - - - - - - - - -