教师工资管理系统一.选题背景二.需求分析一、设计选题与目标1.选题要求:教师工资管理系统每个教师的信息为:教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。
注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资-合计扣款。
A、教师信息处理(1)输入教师信息(2) 插入(修改)教师信息:(3) 删除教师信息:(4) 浏览教师信息:提示:具体功能及操作参考题1。
B、教师数据处理:(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。
(2) 教师实发工资、应发工资、合计扣款计算。
提示:计算规则如题目。
(3) 教师数据管理提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件(4) 教师数据查询:提示:输入教师号或其他信息,即读出所有数据信息,并显示出来。
(5) 教师综合信息输出提示:输出教师信息到屏幕。
2.目标教师数据处理:(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。
(2) 教师实发工资、应发工资、合计扣款计算。
计算规则如题目。
(3) 教师数据管理输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件(4) 教师数据查询:输入教师号或其他信息,即读出所有数据信息,并显示出来。
(5) 教师综合信息输出输出教师信息到屏幕三.总体设计利用六个模块分别实现教师信息的输入,修改,删除,查询,保存以及信息文件的读入功能。
并使用不同的函数实现不同的功能。
使用链表存储及处理数据。
程序流程图如下:四.详细设计1.功能模块共分为六个模块:(1)输入教师信息模块在主菜单中运用结构体teacher,输入教师信息,首先建立链表,将用户信息储存到链表中,输入完成后提示用户是否继续输入,如果用户输入“Y”,则再次调用,实现继续输入教师信息的操作。
如果用户输入”NO“,则返回主菜单界面。
(2)修改教师信息模块在主函数中调用void change_id(),修改记录操作需要对数组中目标元素的数据域中的值进行操作。
首先请用户输入要修改的教师编号,然后若找到该记录就提示用户输入各个信息。
(3)删除教师信息模块在主函数中调用void delete_id(),以删除教师信息,首先按学号查询教师信息,如果没有找到教师信息,给出提示。
如果找到教师信息,将教师信息显示出来,提示用户删除。
(4)查询教师信息查询分三种,调用void show_all()显示所有教师信息;调用void search_id()按编号查询教师信息;调用void search_name()按姓名查询教师信息。
(5)读入教师信息文件模块调用void readfromfile()函数从文件导入教师信息(6)保存并退出模块调用void writetofile()写入文件。
2.函数的设计与调用(1)主函数的设计编写主函数的主要任务就是确定调用函数以及控制屏幕显示。
(2)其他函数1)原型void show_all;功能展出所有录入文件参数无返回值无工作方式调用 char name[10]; float salary;float allowance; float life; float tel;float utilities;float rent;float due; float health; float fund;1float total; float should; float actual;2)原型void tea_new功能创建新的信息录入参数无返回值无工作方式创建file3)原型void searchmenu;功能查找菜单参数无返回值无工作方式调用void search_id;void search_name;4)原型void search_id;功能查找信息按编号查找参数无返回值整个信息工作方式调用 number5)原型void search_name;功能查找信息按姓名查找参数无返回值整个信息工作方式调用char name6)原型void delete_id功能删除数据按编号删除参数无返回值无工作方式调用 id7)原型 void change_id; 功能改变数据按编号改参数无返回值整个录入信息3.数据结构的设计定义结构体teacher,用于存放教师的信息。
struct teacher{int number; 教师编号char name[10]; 教师姓名float salary; 教师基本工资float allowance; 教师津贴float life; 教师生活补贴float tel; 教师电话费float utilities; 教师水电费float rent; 教师房租float due; 教师所得税float health; 教室卫生费float fund; 教师公积金float total; 教师合计扣款float should; 教师应发工资float actual; 教师实发工资}tea[500];4.算法实现链表是算法的关键。
在添加新的数据时,可以表头插入也可以表尾插入,这两种插入方法决定了其他成员函数数据的处理。
本系统中采取的是表尾插入的方法。
在删除某信息时需要判断数据是在表头,表中还是表尾,如果删除的是在表中,则需要将删除的前后链表连接起来。
统大量运用了链表的5种基本操作:建立链表、链表的插入、删除、输入和查找。
5.程序清单#include<stdio.h>#include<string.h>#include <stdlib.h>#include<conio.h>/*教师工资管理系统结构体定义*/struct teacher{int number;char name[10];float salary;float allowance;float life;float tel;float utilities;float rent;float due;float health;float fund;float total;float should;float actual;}tea[500];int num=0;FILE *fp;void mainmenu();void readfromfile();void writetofile();void show_all();void tea_new ();void searchmenu();void search_id();void search_name();void delete_id();void change_id();void main(){readfromfile();while(1){mainmenu();}}//主菜单void mainmenu(){char choic;system("cls");printf("\t----------------欢迎使用\(^o^)/~-------------------\n");printf("\t****************教师工资管理系统******************\n\n"); printf("\t---------------[1]输入教师信息--------------------\n");printf("\t---------------[2]修改教师信息--------------------\n");printf("\t---------------[3]删除教师信息--------------------\n");printf("\t---------------[4]查询教师信息--------------------\n");printf("\t---------------[5]保存并退出----------------------\n");printf("\t**************************************************\n"); printf("\t请输入所需的服务项目序号: \n");choic=getch();switch(choic){case'1':tea_new ();break;case'2':change_id ();break;case'3':delete_id ();break;case'4':searchmenu();break;case'5':writetofile();break;default:mainmenu();}}//从文件导入void readfromfile(){if((fp=fopen("teacher.bin","rb"))==NULL){printf("\n\t教师工资信息文件不存在哟(*/ω╲*)");if((fp=fopen("teacher.bin","wb"))==NULL){printf("\n\t建立失败");exit(0);}else{printf("\n\t教师工资信息文件已建立(~o ̄3 ̄)~");printf("\n\t按回车键进入主菜单");getch();return;}exit(0);}fseek(fp,0,2);if(ftell(fp)>0){rewind(fp);for(num=0;!feof(fp) && fread(&tea[num],sizeof(struct teacher),1,fp);num++);printf("\n\t教师工资信息文件导入成功(* ̄3 ̄)╭");printf("\n\t文件中无任何记录(=@__@=)");printf("\n\t按回车键进入主菜单");getch();return;}}//写入文件void writetofile(){int i;if((fp=fopen("teacher.bin","wb"))==NULL){printf("\n\t打开文件失败(*/ω╲*)");}for(i=0;i<num;i++){if(fwrite(&tea[i],sizeof(struct teacher),1,fp)!=1){printf("\n\t文件写入错误!(>﹏<)\n");}}fclose(fp);printf("\n\t教师工资信息文件已保存");printf("\n\t按任意键退出程序(* ̄ω ̄)\n\t");exit(0);}//添加记录void tea_new(){printf("请输入教师号:");scanf("%d",&tea[num].number);printf("请输入教师姓名:");scanf("%s",tea[num].name);printf("请输入教师基本工资:");scanf("%f",&tea[num].salary);printf("请输入教师的津贴:");scanf("%f",&tea[num].allowance);printf("请输入教师的生活补贴:");scanf("%f",&tea[num].life);printf("请输入教师的电话费:");scanf("%f",&tea[num].tel);printf("请输入教师的水电费:");scanf("%f",&tea[num].utilities);printf("请输入教师的房租:");scanf("%f",&tea[num].rent);printf("请输入教师的所得税:");scanf("%f",&tea[num].due);printf("请输入教师的卫生费:");scanf("%f",&tea[num].health);printf("请输入教师的公积金:");scanf("%f",&tea[num].fund);tea[num].should =tea[num].salary +tea[num].allowance +tea[num].life;tea[num].total=tea[num].tel+tea[num].utilities+tea[num].rent+tea[num].due+tea[num].health+tea[num].fund;tea[num].actual=tea[num].should-tea[num].total;num++;printf("是否继续添加?(Y/N)");if(getch()=='y')tea_new ();return;}//查询菜单void searchmenu(){char choic;system("cls");printf("\n\t------------查询-------------------");printf("\n\t--------[1]显示所有----------------");printf("\n\t--------[2]按编号查询--------------");printf("\n\t--------[3]按姓名查询--------------");printf("\n\t--------[4]返回主菜单--------------");printf("\n\t请选择:\n");choic=getch();switch(choic){case'1':show_all();break;case'2':search_id();break;case'3':search_name();break;case'4':mainmenu();break;}}//显示所有void show_all(){int i;system("cls");if(num!=0){for(i=0;i<num;i++){printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);if(i+1<num){printf("\n\t_____________________");system("pause");}}printf("\n\t*************************************");}elseprintf("\n\t文件中无记录┭┮﹏┭┮");printf("\n\t按回车键回到主菜单");getch();return;}//按编号查询void search_id(){int mark=0;int i,a=0;int id;printf("\n\t请输入编号:");scanf("%d",&id);for(i=0;i<num;i++){if(id==tea[i].number){printf("\n\t******以下是你要查找的教师工资信息******\n");printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);printf("\n\t*************************************");printf("\n\t按回车键回到主菜单");mark++;getch();return;}}if(mark==0){printf("\n\t没有该编号的信息");printf("\n\t按回车键返回主菜单");getch();return;}}//按姓名查询void search_name(){int mark=0;int i,a=0;char name[10];printf("请输入姓名:");scanf("%s",name);for(i=a;i<num;i++){if(strcmp(tea[i].name,name)==0){printf("\n\t******以下是你要查找的教师工资信息******\n");printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);printf("\n\t*************************************");mark++;if((i+1)<num){printf("\t\n是否继续查找相同名字的教师信息:(y/n)");if(getch()=='y'){a=i;continue;}elsereturn;}else{printf("\n\t按回车键返回主菜单");getch();return;}}}if(mark!=0){printf("\n\t没有相同姓名的教师信息记录");printf("\n\t按回车键回到主菜单");getch();return;}else{printf("\n\t没有相同姓名的教师信息记录");printf("\n\t按回车键回到主菜单");getch();return;}}//删除菜单void delete_id(){int i,j;int deletemark=0;int id;printf("\n\t情输入要删除的编号:");scanf("%d",&id);if(num==0){printf("\n\t对不起,文件中无任何教师工资信息记录");printf("\n\t按回车键回到主菜单");getch();return;}for(i=0;i<num;i++){if(id==tea[i].number){printf("\n\t******以下是你要删除的教师工资信息******\n");printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);printf("\n\t是否删除?(y/n)");if(getch()=='y'){for(j=i;j<num-1;j++)tea[j]=tea[j+1];num--;deletemark++;printf("\n\t删除成功");printf("\n\t是否继续删除?(y/n)");if(getch()=='y')delete_id();return;}elsereturn;}continue;}if(deletemark==0){printf("\n\t没有该教师的记录");printf("\n\t是否继续删除?(y/n)");if(getch()=='y')delete_id();}}//修改菜单void change_id(){int a=0,findmark=0;int i;int id;printf("\n\t请输入要修改教师的编号:");scanf("%d",&id);for(i=a;i<num;i++){if(id==tea[i].number){printf("\n\t******以下是你要修改的教师工资信息******\n");findmark++;printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);i=i;break;}else continue;}printf("\n\t请重新输入以下信息:\n");printf("请输入教师号:");scanf("%d",&tea[num].number);printf("请输入教师姓名:");scanf("%s",tea[num].name);printf("请输入教师基本工资:");scanf("%f",&tea[num].salary);printf("请输入教师的津贴:");scanf("%f",&tea[num].allowance);printf("请输入教师的生活补贴:");scanf("%f",&tea[num].life);printf("请输入教师的电话费:");scanf("%f",&tea[num].tel);printf("请输入教师的水电费:");scanf("%f",&tea[num].utilities);printf("请输入教师的房租:");scanf("%f",&tea[num].rent);printf("请输入教师的所得税:");scanf("%f",&tea[num].due);printf("请输入教师的卫生费:");scanf("%f",&tea[num].health);printf("请输入教师的公积金:");scanf("%f",&tea[num].fund);tea[num].should =tea[num].salary +tea[num].allowance +tea[num].life;tea[num].total=tea[num].tel+tea[num].utilities+tea[num].rent+tea[num].due+tea[num].health+tea[num].fund;tea[num].actual=tea[num].should-tea[num].total;printf("\n\t以下是你修改后的教师工资信息:\n");findmark++;printf("\n\t_________________________________");printf("\n\t编号: %d",tea[i].number);printf("\n\t姓名: %s",tea[i].name);printf("\n\t基本工资: %.5f",tea[i].salary);printf("\n\t津贴: %.5f",tea[i].allowance);printf("\n\t生活补贴: %.5f",tea[i].life);printf("\n\t电话费: %.5f",tea[i].tel);printf("\n\t水电费: %.5f",tea[i].utilities);printf("\n\t房租: %.5f",tea[i].rent);printf("\n\t所得税: %.5f",tea[i].due);printf("\n\t卫生费: %.5f",tea[i].health);printf("\n\t公积金: %.5f",tea[i].fund);printf("\n\t应发工资: %.5f",tea[i].should);printf("\n\t合计扣款: %.5f",tea[i].total);printf("\n\t实发工资: %.5f",tea[i].actual);printf("\n\t_________________________________");printf("\n\t按回车键回到主菜单");getch();return;}五.程序运行结果测试六.结论与心得在设计与编写程序的过程中,我捡起了很多自己以前没有注意到的细节,并对一些知识特别是链表的运用有了更好的掌握,巩固了所学,提升了自己的能力。