对于工资管理系统一点小小的改进

您所在的位置:网站首页 scanf一直报错 对于工资管理系统一点小小的改进

对于工资管理系统一点小小的改进

2023-03-11 13:08| 来源: 网络整理| 查看: 265

这是个工资管理系统,这个程序是班上大佬大一上学期的期末大作业,功能十分完善,截两张图感受一下!

我就觉得这个系统做的真的是很完美,没什么好改的,但是在我测试的过程中发现了一个问题!

该系统在使用者申请账号时没有查询功能,在我输入文件中已经存进去的账号时,依旧能输入密码,没有提到该账号已注册,同时,注册账号的流程过于简单,这样的话系统的管理者申请过于简单,导致随便就可以修改系统中的相关信息,这算是这个完美系统中的一点点小缺憾了,如图:

于是我对于该系统进行了一个小小的修改,修改前的代码如下:

//新建账号 void addUser(void) { FILE *fp; int i; char userinput[30]; printf("\t\t\t请输入账号:\n\n\t\t\t "); scanf("%s",userinput); strcpy(user_account[userlength].AcName,userinput); printf("\t\t\t请输入密码:\n\n\t\t\t "); scanf("%s", user_account[userlength].password); userlength++; //用户数据数+1 saveUser(); savenum(); printf("\t\t\t\t账号申请成功!!\n\n\t\t\t"); system("PAUSE"); }

修改后代码如下:

//新建账号 void addUser(void) { FILE *fp; int i; char userinput[30]; printf("\t\t\t请输入账号:\n\n\t\t\t "); scanf("%s",userinput); for(i=0;iname); fprintf(fp, "%s\n",head->name); printf("新增员工性别:"); scanf("%s",head->sex); fprintf(fp, "%s\n",head->sex); printf("新增员工所属部门:"); scanf("%s",head->belong); fprintf(fp, "%s\n",head->belong); printf("新增员工基本工资:"); scanf("%d",&head->basic_pay); fprintf(fp, "%d\n",head->basic_pay); printf("新增员工奖励工资:"); scanf("%d",&head->reward_pay); fprintf(fp, "%d\n",head->reward_pay); printf("新增员工补贴项目:"); scanf("%s",head->add_project); fprintf(fp, "%s\n",head->add_project); printf("新增员工补贴金额:"); scanf("%d",&head->add_pay); fprintf(fp, "%d\n",head->add_pay); printf("新增员工扣款项目:"); scanf("%s",head->deductions_project); fprintf(fp, "%s\n",head->deductions_project); printf("新增员工扣款金额:"); scanf("%d",&head->deductions_pay); fprintf(fp, "%d\n",head->deductions_pay); head->all_pay=head->add_pay+head->basic_pay+head->reward_pay-head->deductions_pay; fprintf(fp, "%d\n",head->all_pay); length++; } else if(judge()==1) { p1=(struct staff*)malloc(sizeof(struct staff)); p2=tail; printf("新增员工工号:"); scanf("%d",&p1->id); fprintf(fp, "%d\n",p1->id); printf("新增员工姓名:"); scanf("%s",p1->name); fprintf(fp, "%s\n",p1->name); printf("新增员工性别:"); scanf("%s",p1->sex); fprintf(fp, "%s\n",p1->sex); printf("新增员工所属部门:"); scanf("%s",p1->belong); fprintf(fp, "%s\n",p1->belong); printf("新增员工基本工资:"); scanf("%d",&p1->basic_pay); fprintf(fp, "%d\n",p1->basic_pay); printf("新增员工奖励工资:"); scanf("%d",&p1->reward_pay); fprintf(fp, "%d\n",p1->reward_pay); printf("新增员工补贴项目:"); scanf("%s",p1->add_project); fprintf(fp, "%s\n",p1->add_project); printf("新增员工补贴金额:"); scanf("%d",&p1->add_pay); fprintf(fp, "%d\n",p1->add_pay); printf("新增员工扣款项目:"); scanf("%s",p1->deductions_project); fprintf(fp, "%s\n",p1->deductions_project); printf("新增员工扣款金额:"); scanf("%d",&p1->deductions_pay); fprintf(fp, "%d\n",p1->deductions_pay); p1->all_pay=p1->add_pay+p1->basic_pay+p1->reward_pay-p1->deductions_pay; fprintf(fp, "%d\n",p1->all_pay); p2->next=p1; p2=p1; p2->next=NULL; tail=p2; length++; } } else { tail=head=(struct staff*)malloc(sizeof(struct staff)); tail->next=NULL; p1=head; p2=tail; printf("新增员工工号:"); scanf("%d",&p1->id); fprintf(fp, "%d\n",p1->id); printf("新增员工姓名:"); scanf("%s",p1->name); fprintf(fp, "%s\n",p1->name); printf("新增员工性别:"); scanf("%s",p1->sex); fprintf(fp, "%s\n",p1->sex); printf("新增员工所属部门:"); scanf("%s",p1->belong); fprintf(fp, "%s\n",p1->belong); printf("新增员工基本工资:"); scanf("%d",&p1->basic_pay); fprintf(fp, "%d\n",p1->basic_pay); printf("新增员工奖励工资:"); scanf("%d",&p1->reward_pay); fprintf(fp, "%d\n",p1->reward_pay); printf("新增员工补贴项目:"); scanf("%s",p1->add_project); fprintf(fp, "%s\n",p1->add_project); printf("新增员工补贴金额:"); scanf("%d",&p1->add_pay); fprintf(fp, "%d\n",p1->add_pay); printf("新增员工扣款项目:"); scanf("%s",p1->deductions_project); fprintf(fp, "%s\n",p1->deductions_project); printf("新增员工扣款金额:"); scanf("%d",&p1->deductions_pay); fprintf(fp, "%d\n",p1->deductions_pay); p1->all_pay=p1->add_pay+p1->basic_pay+p1->reward_pay-p1->deductions_pay; fprintf(fp, "%d\n",p1->all_pay); p2->next=p1; p2=p1; p2->next=NULL; tail=p2; length++; } fclose(fp); savedata_LB(); savenum(); system("PAUSE"); system("cls"); } void savedata_LB() { int i; struct staff *p1,*p2; FILE *fp; fp = fopen("缓存区.txt", "w"); p1=p2=head; for(;p1!=NULL;) { fprintf(fp, "%d\n",p1->id); fprintf(fp, "%s\n",p1->name); fprintf(fp, "%s\n",p1->sex); fprintf(fp, "%s\n",p1->belong); fprintf(fp, "%d\n",p1->basic_pay); fprintf(fp, "%d\n",p1->reward_pay); fprintf(fp, "%s\n",p1->add_project); fprintf(fp, "%d\n",p1->add_pay); fprintf(fp, "%s\n",p1->deductions_project); fprintf(fp, "%d\n",p1->deductions_pay); fprintf(fp, "%d\n",p1->add_pay+p1->basic_pay+p1->reward_pay-p1->deductions_pay); p1=p1->next; p2->next=p1; p2=p1; } p1=p2=NULL; fclose(fp); } void savenum(void) { FILE *fp; fp = fopen("数据个数.txt", "w"); fprintf(fp, "%d\n", length); fprintf(fp, "%d\n", userlength); fclose(fp); } void loadnum(void) { FILE *fp; fp = fopen("数据个数.txt", "r"); fscanf(fp, "%d", &length); fscanf(fp, "%d", &userlength); fclose(fp); } int judge() { FILE *fp; char ch; fp=fopen("缓存区.txt","r"); ch=fgetc(fp); if(ch==EOF) return 0; else return 1; } void loaddata_LB() { if(judge()==0) { printf("Tips:未检索到预设的文本文件!\n"); printf("请及时添加工资信息:)\n") ; length=0; savenum(); } else { int i; struct staff *p1,*p2; freopen("缓存区.txt", "r", stdin); p1=p2=head; for(i=0;iid); scanf("%s",p1->name); scanf("%s",p1->sex); scanf("%s",p1->belong); scanf("%d",&p1->basic_pay); scanf("%d",&p1->reward_pay); scanf("%s",p1->add_project); scanf("%d",&p1->add_pay); scanf("%s",p1->deductions_project); scanf("%d",&p1->deductions_pay); scanf("%d",&p1->all_pay); if(i!=length-1) { p1=(struct staff*)malloc(sizeof(struct staff)); p2->next=p1; p2=p1; } } tail=p2; p2->next=NULL; freopen("CON", "r", stdin); } } void remove_LB() { int num; struct staff *p1,*p2; printf("\n请输入删除员工工号:"); scanf("%d", &num); for(p2=p1=head;p1!=NULL;) //p1和p2从头开始走 { if(p1->id!=num) //如果不是,往下一个节点走 { p2=p1; p1=p1->next; p2->next=p1; } else if(p1->id==num) //如果找到了 { if(p1==head) //处理“删除第一个”的情况 { head=p2->next; p1=p2=head; length--; printf("\n删除成功!\n"); printf("摁下回车|查询删除后的结果\n"); system("PAUSE"); showall_LB(); break; } if(p1==tail) { tail=p2; p2->next=NULL; length--; printf("\n删除成功!\n"); printf("摁下回车|查询删除后的结果\n"); system("PAUSE"); showall_LB(); break; } p1=p1->next; //p1直接往下走 p2->next=p1; //p2直接跳过中间这个,链接p1,实现删除 length--; printf("\n删除成功!\n"); printf("摁下回车|查询删除后的结果\n"); system("PAUSE"); showall_LB(); break; } } if(p1==NULL) { printf("\n查无此人!\n"); getchar(); getchar(); } savedata_LB(); savenum(); printf("\n\n请摁下回车键继续"); system("cls"); } void put_edit() { system("cls"); printf("**********************************\n"); printf("**** 1.姓名 2.性别 *****\n"); printf("**** 3.所属部门 4.基本工资 *****\n"); printf("**** 5.奖励工资 6.补贴项目 *****\n"); printf("**** 7.补贴金额 8.扣款工资 *****\n"); printf("**** 9.扣款金额 10.退出 *****\n"); printf("**********************************\n"); printf("***** 请输入需要修改的内容: *****\n"); } int edit_LB2() { struct staff *p1; int num; printf("\n请输入需要修改的员工工号:"); scanf("%d", &num); printf("\n"); for(p1=head;p1!=NULL;) //p1和p2从头开始走 { if(p1->id!=num) //如果不是,往下一个节点走 { p1=p1->next; } else if(p1->id==num) { printf("修改姓名:"); scanf("%s", p1->name); printf("\n"); printf("修改性别:"); scanf("%s", p1->sex); printf("\n"); printf("修改所属部门:"); scanf("%s", p1->belong); printf("\n"); printf("修改基本工资:"); scanf("%d", &p1->basic_pay); printf("\n"); printf("修改奖励工资:"); scanf("%d", &p1->reward_pay); printf("\n"); printf("修改补贴项目:"); scanf("%s", p1->add_project); printf("\n"); printf("修改补贴金额:"); scanf("%d", &p1->add_pay); printf("\n"); printf("修改扣款项目:"); scanf("%s", p1->deductions_project); printf("\n"); printf("修改扣款金额:"); scanf("%d", &p1->deductions_pay); printf("\n"); p1->all_pay=p1->add_pay+p1->basic_pay+p1->reward_pay-p1->deductions_pay; printf("修改成功!\n"); printf("摁下回车|查询修改后的结果\n"); system("PAUSE"); showall_LB(); break; } } if(p1==NULL) printf("\n查无此人!\n"); savedata_LB(); savenum(); printf("请摁下回车键继续"); getchar(); system("cls"); return 0; } int edit_LB() { int option; printf("\n请输入你想要修改的方式:\n"); printf("1.批量修改\t2.选择单项修改\t3.取消修改|返回\n"); scanf("%d",&option); if(option==1) { edit_LB2(); } else if(option==2) { struct staff *p1; int num; int choose; printf("\n请输入需要修改的员工工号:"); scanf("%d", &num); printf("\n"); for(p1=head;p1!=NULL;) //p1和p2从头开始走 { if(p1->id!=num) //如果不是,往下一个节点走 { p1=p1->next; } else if(p1->id==num) { put_edit(); scanf("%d",&choose); if(choose==10) { system("cls"); return 0; } if(choose9) { for(choose=0;choose9;) { printf("请输入正确的标号!\n"); scanf("%d",&choose); } } switch(choose) { case 1: printf("修改姓名:"); scanf("%s", p1->name); printf("\n"); break; case 2: printf("修改性别:"); scanf("%s", p1->sex); printf("\n"); break; case 3: printf("修改所属部门:"); scanf("%s", p1->belong); printf("\n"); break; case 4: printf("修改基本工资:"); scanf("%d", &p1->basic_pay); printf("\n"); break; case 5: printf("修改奖励工资:"); scanf("%d", &p1->reward_pay); printf("\n"); break; case 6: printf("修改补贴项目:"); scanf("%s", p1->add_project); printf("\n"); break; case 7: printf("修改补贴工资:"); scanf("%d", &p1->add_pay); printf("\n"); break; case 8: printf("修改扣款项目:"); scanf("%s", p1->deductions_project); printf("\n"); break; case 9: printf("修改扣款工资:"); scanf("%d", &p1->deductions_pay); printf("\n"); break; } p1->all_pay=p1->add_pay+p1->basic_pay+p1->reward_pay-p1->deductions_pay; printf("修改成功!\n"); printf("摁下回车|查询修改后的结果\n"); system("PAUSE"); showall_LB(); break; } } if(p1==NULL) { printf("\n查无此人!\n"); getchar(); } savedata_LB(); savenum(); printf("请摁下回车键继续"); getchar(); system("cls"); } if(option!=1&&option!=2) system("cls"); return 0; } //彩蛋 void process() { int order; printf("---------------------------------------------\n"); printf("1.打印海大校徽 2.打印制作人员\n"); printf("---------------------------------------------\n"); printf("请选择彩蛋:"); scanf("%d",&order); printf("\n"); switch(order){ case 1: painter(); break; case 2: worker(); break; } } void worker() { printf("2152130 计算一班 洪彬铭\n"); printf("2152114 计算一班 容数\n"); printf("2152105 计算一班 马英臻\n"); system("PAUSE"); system("cls"); return ; } int search_LB() { int i = length; int num; struct staff *p1,*p2; const char* str[11] = {"工号", "姓名", "性别", "部门", "基本工资", "奖励工资", "补贴项目","补贴金额","扣款项目","扣款金额","总工资"}; printf("\n请输入需要查询员工工号:"); scanf("%d", &num); printf("\n\n"); int n; for(n=0;nid!=num) //如果不是,往下一个节点走 { p1=p1->next; } else if(p1->id==num) //如果找到了 { printf(" %-10d", p1->id); printf(" %-10s", p1->name); printf(" %-10s", p1->sex); printf("%-10s", p1->belong); printf(" %-10d", p1->basic_pay); printf(" %-10d", p1->reward_pay); printf(" %-10s", p1->add_project); printf(" %-10d", p1->add_pay); printf(" %-10s", p1->deductions_project); printf(" %-10d", p1->deductions_pay); printf(" %-10d", p1->all_pay); printf("\n\n"); printf("\n查询成功!\n\n"); break; } } if(p1==NULL) printf("\n查无此人!\n"); getchar(); getchar(); system("cls"); } //按姓名首字母排序判断 int cmp1(staff a, staff b)//结构体变量作函数参数 { if(strcmp(a.name, b.name)sex,data[i].sex); strcpy(p1->belong,data[i].belong); p1->basic_pay=data[i].basic_pay; p1->reward_pay=data[i].reward_pay; strcpy(p1->add_project,data[i].add_project); p1->add_pay=data[i].add_pay; strcpy(p1->deductions_project,data[i].deductions_project); p1->deductions_pay=data[i].deductions_pay; p1->all_pay=data[i].all_pay; p1=p1->next; } } //首名字首字母排序 void SortByFirst_Letter() { int i; struct staff data[length+1]={}; struct staff *p1; for(p1=head,i=0;inext; } sort(data, data+length,cmp1);//c++预置的sort函数,格式为(要排序数组的首地址,末地址,排序方式) Sort_Save(data); savedata_LB();//还没写存储 printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); showall_LB(); system("PAUSE"); } //按工号排序 void SortByID() { int i; struct staff data[length+1]={}; struct staff *p1; for(p1=head,i=0;inext; } sort(data, data+length,cmp4);//c++预置的sort函数,格式为(要排序数组的首地址,末地址,排序方式) Sort_Save(data); savedata_LB();//还没写存储 //写完啦 printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); showall_LB(); system("PAUSE"); } //按基本工资升序排序 void SortByTotal_Wages_ascending() { int i; struct staff data[length+1]={}; struct staff *p1; for(p1=head,i=0;inext; } sort(data, data+length, cmp2);//c++预置的sort函数,格式为(要排序数组的首地址,末地址,排序方式) Sort_Save(data); savedata_LB();//还没写存储 //写完啦 printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); showall_LB(); system("PAUSE"); } //按基本工资降序排序 void SortByTotal_Wages_descending() { int i; struct staff data[length+1]={}; struct staff *p1; for(p1=head,i=0;inext; } sort(data, data+length, cmp3);//c++预置的sort函数,格式为(要排序数组的首地址,末地址,排序方式) Sort_Save(data); savedata_LB();//还没写存储 //写完啦 printf("\n\t\t\t\t排序完成!!\n\n\t\t\t "); showall_LB(); system("PAUSE"); } int PrintSort() { printf("\t ************************************************************\n"); printf("\t * *\n"); printf("\t * 您可以进行以下操作: *\n"); printf("\t * *\n"); printf("\t * 按员工姓名首字母排序 请按 1 *\n"); printf("\t * *\n"); printf("\t * 按工号排序 请按 2 *\n"); printf("\t * *\n"); printf("\t * 按总工资升序排序 请按 3 *\n"); printf("\t * *\n"); printf("\t * 按总工资降序排序 请按 4 *\n"); printf("\t * *\n"); printf("\t * 返回上一级菜单 请按 5 *\n"); printf("\t * *\n"); printf("\t ************************************************************\n\n"); } //排序 int Sort() { system("cls"); int input,number; while(1){ system("cls"); PrintSort(); input=scanf("%d",&number); if(!input){ //inwrong(); //我想后期写一个排错函数 continue; } switch(number){ case 1: SortByFirst_Letter(); break; case 2: SortByID(); break; case 3: SortByTotal_Wages_ascending(); break; case 4: SortByTotal_Wages_descending(); break; case 5: system("cls"); return 0; default: system("cls"); break; } } getchar(); getchar(); system("cls"); return 0; } //查询全部数据 int showall_LB() { if(judge()==0) { printf("\n\tW A R N I N G\n数据库内容为空,请先添加信息\n\n"); printf("请输入回车继续\n"); getchar(); getchar(); system("cls"); return 0; } struct staff *p1; int i; const char* str[11] = {"工号", "姓名", "性别", "部门", "基本工资", "奖励工资", "补贴项目","补贴金额","扣款项目","扣款金额","总工资"}; i=length-1; printf("\n"); printf("查询成功!\n\n"); int n; for(n=0; nnext) { printf(" %-10d", p1->id); printf(" %-10s", p1->name); printf(" %-10s", p1->sex); printf("%-10s", p1->belong); printf(" %-10d", p1->basic_pay); printf(" %-10d", p1->reward_pay); printf(" %-10s", p1->add_project); printf(" %-10d", p1->add_pay); printf(" %-10s", p1->deductions_project); printf(" %-10d", p1->deductions_pay); printf(" %-10d", p1->all_pay); printf("\n\n"); } savenum(); system("PAUSE"); system("cls"); return 0; } //隐藏光标 void hide() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void statistics() { enum option {leave,thesame,part}; //在菜单上用枚举可读性更好一点,建议主菜单使用 //好,之后再改——rs int input; do { system("cls"); printf("********************************\n"); printf("***** 0.退出统计功能 *********\n"); printf("***** 1.相同工资范围人数 *****\n"); printf("***** 2.各部门工资总数 *****\n"); printf("********************************\n"); printf("*****请输入需实现功能代号: *****\n"); scanf("%d",&input); switch(input) { case thesame: thesamesum_LB(); break; case part: partsum_LB(); break; case leave:printf("退出统计功能(摁下回车键返回)"); break; dafault:printf("选择错误,请输入正确代号!\n"); break; } }while(input); getchar(); getchar(); system("cls"); } void thesamesum_LB() { struct staff *p1,*p2; int min,max,i,sum=0; printf("请输入需要查找的工资范围(输入格式为:“最小值-最大值”): \n"); scanf("%d-%d",&min,&max); for(p2=p1=head;p1!=NULL;) //最好先用#define定义数量,在数量发生变化时便于修改 //这里用不了,length一直在变动的——rs { if(p1->all_pay>=min&&p1->all_paynext; p2->next=p1; p2=p1; } printf("工资在%d-%d范围里的人数有%d个。\n",min,max,sum); printf("请摁下回车键继续"); getchar(); getchar(); system("cls"); } void partsum_LB() { struct staff *p1,*p2; int i,sum=0; char a[81]; printf("请输入要查找的工作部门:\n"); scanf("%s",a); for(p2=p1=head;p1!=NULL;) { if(strcmp(a,p1->belong)==0) sum=sum+p1->all_pay; p1=p1->next; p2->next=p1; p2=p1; } printf("\n该部门工资总和为%d\n\n",sum); printf("请摁下回车键继续"); getchar(); getchar(); system("cls"); } //主菜单 void printsystem() { printf("\t\t\t____________________________\n"); printf("\t\t\t|********主菜单************|\n"); printf("\t\t\t| 1.输入员工信息 |\n"); printf("\t\t\t| 2.删除员工信息 |\n"); printf("\t\t\t| 3.修改员工信息 |\n"); printf("\t\t\t| 4.排序员工信息 |\n"); printf("\t\t\t| 5.查询员工信息 |\n"); printf("\t\t\t| 6.统计员工信息 |\n"); printf("\t\t\t| 7.显示所有员工信息 |\n"); printf("\t\t\t| 8.彩蛋 |\n"); printf("\t\t\t| 9.退出系统 |\n"); printf("\t\t\t****************************\n"); printf("\t\t\t____________________________\n"); printf("\t\t\t ---请输入菜单项:---\n\t\t\t\t"); } //主菜单系统 int main(void) { tail=head=(struct staff*)malloc(sizeof(struct staff)); tail->next=NULL; int input; loadnum(); loaddata_LB(); login(); printf("\t\t\t\t登录成功!欢迎使用员工工资管理系统!\n"); system("PAUSE"); system("cls"); while(1){ printsystem();//打印主菜单 scanf("%d",&input); if(input==9){ system("cls"); //清屏退出 return 0; } switch(input){ case 1: /*create();*/add_LB();break; case 2: remove_LB();break; case 3: edit_LB();break; case 4: Sort();break; case 5: search_LB(); break; case 6: statistics();break; case 7: showall_LB();break; case 8: process();break; default: printf("\n选择错误!请输入菜单中含有的数字项!\n摁下回车键继续>"); getchar(); getchar(); system("cls"); } } return 0; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3