工资管理系统
课程设计报告
编写人:
同组成员、0922305026 (课程设计负责人)
0922305023
、0922305022
完成日期: 20##、6、23
辅导教师:
批阅日期:
分数:
1 功 能 描 述
本程序主要的数据结构是单链表,它由四大模块组成(如下图所示):
工资管理系统功能模块图
(1) 输入记录模块:输入记录模块主要完成数据存入单链表的工作。在此工资管理系统中提供了从键盘读入。即从键盘一一输入员工的信息(包括编号,姓名,性别,年龄,工资等)并且读入过程会显示在屏幕上。
(2) 查询记录模块:查询也提供了两种关键字方式,按编号和按姓名查询。该模块的主要工作是在单链表中查找满足关键字的员工信息,用户可以选择以中方式进行查询,如果找到返回该员工节点并且打印该员工的工资信息,否则返回空指针NULL,并打印没有找到的提示。
(3) 更新记录模块:更新数据包括对员工工资信息的删除、插入、和排序(排序是对链表节点的修改而不修改员工信息)。删除功能是彻底删除掉某员工的工资信息,也就是单链表的删除操作,在删除某员工的同时也要修改他所在的部门的信息;插入功能是增添以员工的工资信息,采用的是链表的插入操作,在插入的同时也修改他所在部门的工资信息;排序功能用到的是冒泡排序,可以按照工资的实发和应发升序排序。
(4) 输出记录模块:输出功能是将所有员工的工资信息输出到屏幕中,输出在屏幕上的为表格形式,以便读取方便。
2 总 体 设 计
2.1 功能模块设计
1. 主函数main()执行流程
本系统提供了5个选项供用户选择,先显示目录菜单,提示用户输入选择。有效值为0到4,输入1则进入键盘输入员工信息功能模块,系统将会循环调用ADD()函数键盘添加员工信息。输入2进入查询记录模块,主要工作是在单链表中查找满足关键字的员工信息。输入3进入更新记录模块:更新数据包括对员工工资信息的删除、插入、和排序(排序是对链表节点的修改而不修改员工信息)。输入4进入输出记录模块:输出功能是将所有员工的工资信息输出到屏幕中,输出在屏幕上的为表格形式,以便读取方便。输入0退出本系统,操作结束。
main()会循环显示主界面直到输入0。(如下图所示)
主控函数流程图
2.输入记录模块
输入记录模块主要实现将数据存入单链表中,这部分的操作较为简单。从键盘输入,键盘输入则是循环调用Add()函数一一提示用户输入员工各项信息包括(姓名,编号,性别,年龄,工资等),也同时修改部门信息。这里的字符串和数值的输入分别采用了函数来实现,在函数中完成输入数据任务,并对数据进行条件判断,直到满足条件判断为止,这样减少了代码的重复和冗余,符合模块化程序设计的特点。
3.查询记录模块
查询记录模块主要实现了在单链表中按员工姓名和编号查找满足相关条件的员工记录。在查询函数Sq()中,调用了Query()函数,根据*name查询信息,结果保存于link指针数组中,避免找到的姓名相同的员工被覆盖。
4.更新数据模块
更新数据包括插入、删除、排序,前二项用ADU()函数控制,删除调用Del()函数删除满足要求的员工信息,该操作需要遍历单链表,时间复杂度为O(n);插入是调用Add()函数 从键盘一一输入员工节点信息,然后插入到链表中时间复杂度为O(1);排序调用Sort()函数采用冒泡排序的算法对链表排序,时间复杂度为O(n*n)。
5. 输出信息模块
输出模块屏幕输出,屏幕输出为Display()函数按照TFORM2的格式按表格输出所有链表中的员工信息。文件输出是Save()函数将信息以TFORM3的格式写入C盘的data.txt中,以方便下次读取。
3 数据结构体设计
1、工资信息结构体
typedef struct //--------------员工工资信息结构体;
{
char gonghao[100]; //------------工人工号;
char name[100]; //------------工人姓名;
char bumen[1000]; //------------工人部门;
int phone[100]; //------------工人基本工资;
char addr[100]; //------------工人特殊津贴;
}datatype;
2、单链表node结构体
typedef struct node{
datatype data;
struct node * next;
}listnode;
4 程 序 实 现
1、 源代码分析
⑴程序预处理
#include<stdio.h> //---------------标准输入输出头文件 ;
#include <stdlib.h> //---------------开辟空间头文件;
#include <string.h> //---------------字符串处理函数头文件;
typedef struct //--------------员工工资信息结构体;
{
char gonghao[100]; //------------工人工号;
char name[100]; //------------工人姓名;
char bumen[1000]; //------------工人部门;
int phone[100]; //------------工人基本工资;
char addr[100]; //------------工人特殊津贴;
}datatype;
typedef struct node{
datatype data;
struct node * next;
}listnode;
typedef listnode * linklist;
linklist head; //----------定义一全局变量 head 计链表头指针;
listnode *p; //----------定义一全局变量 p ;
int count=0; //----------定义一全局变量 count 统计工人的总数;
⑵主函数main()
void main() //主函数
{
int hh,uu;
while(1)
{ system(" color D"); //--------颜色调用;
menu();
printf( " :请输入你的选择:\n ");
scanf("%d",&hh)
switch(hh)
{
case 1:
system(" color F"); //--------颜色调用;
head=createlist();
system("pause");//--------系统暂停调用;
system("cls");
break;
case 2: system(" color 2"); //--------颜色调用;
printf(" ******************** 信息添加 *******************\n");
printf(" ** 工号 姓名 部门 基本工资 特殊津贴 **\n");
printf(" *************************************************\n");
p=(listnode *)malloc(sizeof(listnode));
scanf("%s%s%s%d%s",p->data.gonghao,p->data.name,p->data.bumen,p->data.phone,p->data.addr);
insertnode(head,p);
count+=1;
printf(" 工人总数为 %d \n",count);
system("pause"); //--------系统暂停调用;
system("cls");
break;
case 3:
system(" color 3"); //--------颜色调用;
printf(" ************** 信息查询 ***********\n");
p=listfind(head);
if(p!=NULL){
printf("工号 姓名 部门 基本工资 特殊津贴\n");
printf(" -------------------------------------\n");
printf(" %s %s %s %d %s\n",p->data.gonghao,p->data.name,p->data.bumen,*(p->data.phone),p->data.addr);
printf(" -------------------------------------\n");
}
else
printf(" 没有找到 ! \n");
system("pause"); //--------系统暂停调用;
system("cls");
break;
case 4:
system(" color 6"); //--------颜色调用;
delnode(head);
system("pause"); //--------系统暂停调用;
system("cls");
break;
case 5:
system(" color 8"); //--------颜色调用;
sort_worker( head);
printf(" 排序完成 !\n");
system("pause"); //--------系统暂停调用;
system("cls");
break;
case 6:
system(" color A"); //--------颜色调用;
printlist(head);
system("pause"); //--------系统暂停调用;
system("cls");
break;
default:
system(" color B"); //--------颜色调用;
printf("\t 对不起,请输入指定的功能,谢谢!\n");
system("pause"); //--------系统暂停调用;
system("cls");
break;
}
printf("\n 是否退出,是->1,否->0 \n");//--------是否退出程序,进行判断;
scanf("%d",&uu);
system("pause"); //--------系统暂停调用;
system("cls");
if(uu==1)
{xx();
system(" color C"); //--------颜色调用;
system("pause"); //--------系统暂停调用;
system("cls");
break;
}
else ;
}
}
⑶主菜单界面
void menu() //------------------菜单函数;
{
printf(" \n");
printf(" \n");
printf(" \n");
printf(" 工资管理系统 \n");
printf(" \n");
printf(" ========================\n");
printf(" ==1. 工资管理系统建立 ==\n");
printf(" ==2. 新员 工 插入 ==\n");
printf(" ==3. 员工 信息 查询 ==\n");
printf(" ==4. 员工 信息 删除 ==\n");
printf(" ==5. 员工 工资 排序 ==\n");
printf(" ==6. 员工 信息 输出 ==\n");
printf(" ========================\n");
}
5 运 行 结 果
1、主界面
2、 工资管理系统建立
3、 新 员 工 插 入
4、 员工 信息 查询
5、员工 信息 删除
6、员工 工资 排序
7、 员工 信息 输出
6设 计 小 结
1、人员分工
马晓红:输入函数、插入函数。
王 秀:排序函数、查找函数。
胡燕秀:删除函数、输出函数。
主函数、菜单函数、结束函数:马晓红、王 秀、胡燕秀。
2、小结
优点:(1)该程序没有错误、没有警告,结构严谨。
(2)该程序设计内容较全面,操作方便。
不足:(1)输入太多个信息时,屏幕不能一页一页显示。
(2)没有设计修改类函数,因此若想修改某员工的信息只能先进行删除然后再重新插入,比较繁琐。
第二篇:C语言课程设计报告-工资管理系统
C语言课程设计报告-工资管理系统一. 系统功能设计一个职工工资管理系统,其功能包括:(1) 职工基本工资信息录入包括工号,姓名,应发工资,奖金,扣款,应发工资,扣税,实发工资。(2) 职工基本工资信息保存(3) 职工基本工资信息查询按照工号查询按照姓名查询(4) 职工基本工资信息显示在屏幕上显示所有的职工基本工资信息。(5) 职工基本工资信息更新能够实现修改,删除,插入,排序功能。(6) 职工基本工资信息统计统计公司员工工资在各等级的人数主界面系统主界面应有如下功能选项录入职工基本工资信息查询职工基本工资信息保存职工基本工资信息删除职工基本工资信息插入职工基本工资信息修改职工基本工资信息统计职工基本工资信息排序职工基本工资信息显示职工基本工资信息退出代码如下:#include <stdio.h>typedef struct employee{char num[10]; //保存职工编号char name[15]; //保存职工姓名float jbgz; //保存职工基本工资float jj; //保存职工奖金float kk; //保存职工扣款float yfgz; //保存职工应发工资float sk; //保存职工税款float sfgz; //保存职工实发工资}ZGGZ;void menu(){printf(" Empoyee System\n");printf("--<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@\n");printf(" *1 input record *2 delete record\n");printf(" *3 search record *4 modify record\n");printf(" *5 insert record *6 count record\n");printf(" *7 sort record *8 save record\n");printf(" *9 display record *0 quit record\n");printf("--<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@ --<-<-<@\n");printf("Please enter you choice(0-9)\n");}int input(ZGGZ a[],int k){int j,x;char str[10];j=x=0;while(1){printf("----------------------------\n");printf("请输入职工的编号:(按0返回主菜单)");scanf("%s",str);strcpy(a[k].num,str);for(j=0;j<k;j++) {if(strcmp(a[j].num,str)==0){printf("已经有工号为%s的员工信息!请重新输入员工号。\n",str);printf("请输入职工的编号:");
scanf("%s",str);strcpy(a[k].num,str);}}if(strcmp(a[k].num,"0")==0)break;printf("请输入职工的姓名:");scanf("%s",a[k].name);printf("请输入职工的基本工资:");scanf("%f",&a[k].jbgz);printf("请输入职工的奖金:");scanf("%f",&a[k].jj);printf("请输入职工的扣款:");scanf("%f",&a[k].kk);a[k].yfgz=a[k].jbgz+a[k].jj-a[k].kk;a[k].sk=a[k].yfgz*(0.05);a[k].sfgz=a[k].yfgz*(0.95);k++;}return k;}int del(ZGGZ a[],int y){int i=0;int x=0;char str[15];printf("请输入你要删除的编号或姓名:");scanf("%s",str);printf("--------删除成功--------\n");for(i=0;i<y;i++)if(!strcmp(str,a[i].num)||!strcmp(str,a[i].name)){while(i<y){strcpy(a[i].num,a[i+1].num);strcpy(a[i].name,a[i+1].name);a[i].jbgz=a[i+1].jbgz;a[i].jj=a[i+1].jj;a[i].kk=a[i+1].kk;a[i].sfgz=a[i+1].sfgz;a[i].sk=a[i+1].sk;a[i].yfgz=a[i+1].yfgz;i++;}x++;}if(x==0){printf("输入的编号或姓名不存在,请重新输入:\n");}return y-x;}int sear(ZGGZ a[],int y){int i;int x=0;char str[15];printf("请输入你要查找的编号或姓名:");scanf("%s",str);for(i=0;i<y;i++)if(!strcmp(str,a[i].num)||!strcmp(str,a[i].name)){printf("员工编号为%s\n",a[i].num);printf("员工姓名为%s\n",a[i].name);printf("基本工资:%f\n",a[i].jbgz);printf("奖金:%f\n",a[i].jj);printf("扣款:%f\n",a[i].kk);printf("应发工资:%f\n",a[i].yfgz);printf("税款:%f\n",a[i].sk);printf("实发工资:%f\n",a[i].sfgz);x++;}if(x==0){printf("未找到该记录\n");return -1;}}void mod(ZGGZ a[],int y){int i;int x=0;char str[15];printf("请输入你要修改的编号:");scanf("%s",str);for(i=0;i<y;i++)if(!strcmp(str,a[i].num)||!strcmp(str,a[i].name)){
printf("请输入修改后职工的姓名:");scanf("%s",a[i].name);printf("请输入修改后职工的基本工资:");scanf("%f",&a[i].jbgz);printf("请输入修改后职工的奖金:");scanf("%f",&a[i].jj);printf("请输入修改后职工的扣款:");scanf("%f",&a[i].kk);printf("-------------修改成功------------\n");a[i].yfgz=a[i].jbgz+a[i].jj-a[i].kk;a[i].sk=a[i].yfgz*(0.05);a[i].sfgz=a[i].yfgz*(0.95);x++;}if(x==0){printf("未找到要修改的编号\n");}}int insert(ZGGZ a[],int y){int i;int x=0;char str[15];printf("请输入你要插入的编号:");scanf("%s",str);printf("请输入一条新的记录信息:\n");for(i=0;i<y;i++)if(strcmp(str,a[i].num)==0){x=i;for(i=y;i>x+1;i--){a[i].jbgz=a[i-1].jbgz;a[i].jj=a[i-1].jj;a[i].kk=a[i-1].kk;a[i].sfgz=a[i-1].sfgz;a[i].sk=a[i-1].sk;a[i].yfgz=a[i-1].yfgz;strcpy(a[i].name,a[i-1].name);strcpy(a[i].num,a[i-1].num);}}x++;printf("请输入职工的编号:");scanf("%s",a[x].num);printf("请输入职工的姓名:");scanf("%s",a[x].name);printf("请输入职工的基本工资:");scanf("%f",&a[x].jbgz);printf("请输入职工的奖金:");scanf("%f",&a[x].jj);printf("请输入职工的扣款:");scanf("%f",&a[x].kk);a[x].yfgz=a[x].jbgz+a[x].jj-a[x].kk;a[x].sk=a[x].yfgz*(0.05);a[x].sfgz=a[x].yfgz*(0.95);return y+1;}void count(ZGGZ a[],int y){int q[11]={0,0,0,0,0,0,0,0,0,0,0};int i;int x;for(i=0;i<y;i++){x=(int)a[i].yfgz/1000;switch(x){case 9:q[1]++;break;case 8:q[2]++;break;case 7:q[3]++;break;case 6:q[4]++;break;case 5:q[5]++;break;case 4:q[6]++;break;case 3:q[7]++;break;cas
e 2:q[8]++;break;case 1:q[9]++;break;case 0:q[10]++;break;default:q[0]++;break;}}printf("应发工资在 10000以上 的人数为%d\n",q[0]);printf("应发工资在 9000到10000 的人数为%d\n",q[1]);printf("应发工资在 8000到9000 的人数为%d\n",q[2]);printf("应发工资在 7000到8000 的人数为%d\n",q[3]); printf("应发工资在 6000到7000 的人数为%d\n",q[4]);printf("应发工资在 5000到6000 的人数为%d\n",q[5]);printf("应发工资在 4000到5000 的人数为%d\n",q[6]);printf("应发工资在 3000到4000 的人数为%d\n",q[7]);printf("应发工资在 2000到3000 的人数为%d\n",q[8]);printf("应发工资在 1000到2000 的人数为%d\n",q[9]);printf("应发工资在 1000以上 的人数为%d\n",q[10]);}void sort(ZGGZ a[],int y){int i,j;float t;char str[15];for(j=0;j<y-1;j++)for(i=0;i<y-1-j;i++)if(a[i].sfgz>a[i+1].sfgz){t=a[i].sfgz;a[i].sfgz=a[i+1].sfgz;a[i+1].sfgz=t;t=a[i].jbgz;a[i].jbgz=a[i+1].jbgz;a[i+1].jbgz=t;t=a[i].jj;a[i].jj=a[i+1].jj;a[i+1].jj=t;t=a[i].kk;a[i].kk=a[i+1].kk;a[i+1].kk=t;t=a[i].yfgz;a[i].yfgz=a[i+1].yfgz;a[i+1].yfgz=t;t=a[i].sk;a[i].sk=a[i+1].sk;a[i+1].sk=t;strcpy(str,a[i].num);strcpy(a[i].num,a[i+1].num);strcpy(a[i+1].num,str);strcpy(str,a[i].name);strcpy(a[i].name,a[i+1].name);strcpy(a[i+1].name,str);}}void save(ZGGZ a[],int n){FILE *fp;int i;if((fp=fopen("sj.txt","wb"))==NULL){printf("cannot open file\n");return;}for(i=0;i<n;i++)if(fwrite(&a[i],sizeof(struct employee),1,fp)!=1)printf("file write error\n");fclose(fp);}void display(ZGGZ a[],int n){int i=0;if(n==0){printf("Files are empty\n");return;}do{
printf("----------------------------\n");printf("员工编号为%s\n",a[i].num);printf("员工姓名为%s\n",a[i].name);printf("基本工资:%f\n",a[i].jbgz);printf("奖金:%f\n",a[i].jj);printf("扣款:%f\n",a[i].kk);printf("应发工资:%f\n",a[i].yfgz);printf("税款:%f\n",a[i].sk);printf("实发工资:%f\n",a[i].sfgz);i++;}while(i<n);}void main(){int selete,c=0;int i=0;int z=0;char q,p,x,s;ZGGZ b[100];FILE *fp;if((fp=fopen("sj.txt","rb"))==NULL)printf("Not Found!\n");else{do{fread(&b[i],sizeof(struct employee),1,fp);i++;}while(!feof(fp));fclose(fp);c=i-1;}while(1){menu();scanf("%d",&selete);if(selete==0){printf("Thank you for your use ( ^_^ ) Bye\n");break;}switch(selete){case 1:c=input(b,c);break;case 2:{display(b,c);do{c=del(b,c);printf("是否继续删除,是按y,否则请按任意值\n");getchar();scanf("%c",&p);}while(p=='Y'||p=='y');break;}case 3:{do{sear(b,c);printf("是否继续查找,是按y,否则请按任意值\n");getchar();scanf("%c",&x);}while(x=='Y'||x=='y');break;}case 4:{display(b,c);do{mod(b,c);printf("是否继续修改,是按y,否则请按任意值\n");getchar();scanf("%c",&q);}while(q=='Y'||q=='y');break;}case 5:{do{c=insert(b,c);printf("是否继续插入,是
按y,否则请按任意值\n");getchar();scanf("%c",&s);}while(s=='Y'||s=='y');break;}case 6:count(b,c);break;case 7:display(b,c);sort(b,c);break;case 8:save(b,c);break;case 9:display(b,c);break;default:printf("Please try again\n");}}}