摘要
教师工资管理系统设计,利用c语言编程实现,具有输入教师信息,修改教师信息,删除教师信息,输出教师信息和教师数据查询等功能。教师工资包括教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。采用结构体类型,通过数组的形式在内存中保留所有教师工资的信息,并且运用了链表的功能和函数的调用来进行数据的处理如:删除,修改等基本功能,并在退出系统前将全部学生信息写入文件存储。
关键词:教师工资信息 结构体 链表 文件
1.需求分析
本程序的主要目的是为了实现对教师工资的管理,包括储存,删除和修改的基本功能,使教师的基本工资信息通过系统陈列出并进行计算来输出教师实发工资、应发工资、合计扣款计算,同时支持教师单人工资信息查询以及所有教师工资查询。数据的输入以中文和数字为主,其中姓名、性别、单位名称等通过中文输入,编号、电话号码、各种费用通过数字输入。数据输出的形势和数据的输入一样都是以中文和英文为主。全部的数据通过结构体数组形式来进行输入,
2. 概要设计
2.1 主界面设计
主界面共有五个模块,分别为:输入教师信息、修改教师信息、删除教师信息、查询教师信息以及保存并退出,通过switch函数进行选择后再通过函数的调用来实现各部分功能的正常运行。
2.2储存结构设计
本系统采用的是顺序储存的结构体数组
struct teacher
{
int number;
char name[10];
float sex,unit,address,phone,salary,allowance,life,tel,utilities,rent,due,health,fund,total,should,actual;
}tea[500];
首先建立一个结构体来输入所有信息,后定义一个结构体数组变量,最大储存值为500,每一位教师的工资信息都有相对应的位置。
采用顺序储存结构的主要目的是因为顺序储存结构适宜于做查找这样的静态操作,而且对于教师工资的信息输出可以更加简单明了。同时也有利于本系统的修改、删除等操作功能。
2.3系统功能设计
2.3.1输入教师信息
主界面通过函数调用后进入输入教师工资信息界面,然后我们就可以把所知道的信息按照顺序一个一个的输入到界面中去,同时在输入完后,还要进行教师实发工资、应发工资、合计扣款计算以方便后续的教师工资信息输出,同样的在输入完每一位教师的工资信息之后,会进行是否继续添加的询问(Y/N),如若需要继续添加,则再次进行函数的调用。最后运用return返回主函数。
2.3.2修改教师信息
主界面通过函数调用后进入修改教师工资信息界面,然后输入需要修改工资信息的教师编号,通过for循环和if选择的结合找到以及储存在文件中的与所需要修改的教师编号相同的数字,然后将其所有信息全部列出,并且再次询问以下是你要修改的教师信息后,选择请重新输入以下信息来实现教师工资信息的修改。
2.3.3删除教师信息
主界面通过函数调用后进入删除教师工资信息界面,然后输入所需要删除工资信息的教师编号,通过寻找后如若没有相关教师工资信息,则输出对不起, 文件中无任何教师工资信息记录同时返回主界面,如果找到了相关教师工资信息,则将该教师信息全部列出,并再次询问是否要进行删除,选择是则删除成功,并且询问是否要继续删除,如果继续删除就再次进行函数调用,否则返回主界面。
2.3.4查询教师信息
主界面通过函数调用后进行查询教师工资信息界面,然后就会进入查询菜单,查询菜单共有三个选项,分别为:显示所有、按编号查询以及返回主菜单。如果选择显示所有,则会显示所有以及保存在文件中的教师工资信息。如果选择按编号查询,则输入所需要查询的教师编号后通过for循环和if选择出对应的教师信息,如果选择返回主菜单,则会返回主界面。
2.3.5保存并退出
主界面通过函数调用后进行保存处理,将以及整理好的教师工资信息写入文件中,进行数据的保存后退出系统。
2.4各个程序模块之间的层次关系
2 详细设计
3.1数据类型定义
所有数据类型定义
int number;
char name[10];
float sex,unit,address,phone,salary,allowance,life,tel,utilities,rent,due,health,fund,total,should,actual;
3.2核心算法的实现
主程序和各个子程序的流程图见2.4各个程序模块之间的层次关系
3.2.1主界面
//主菜单
void mainmenu()
{
char choic;
system("cls"); //清屏
printf("\t-------------------WELCOME------------------------\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(); //所有case项都不满足时执行
}
}
3.2.2输入教师信息
//教师工资信息的输入
void tea_new()
{
printf("请输入教师号: ");
scanf("%d",&tea[num].number);
printf("请输入教师姓名:");
scanf("%s",tea[num].name);
printf("请输入教师性别: ");
scanf("%f",&tea[num].sex);
printf("请输入教师单位名称: ");
scanf("%f",&tea[num].unit);
printf("请输入教师地址: ");
scanf("%f",&tea[num].address);
printf("请输入教师手机号码: ");
scanf("%f",&tea[num].phone);
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;
}
3.2.3修改教师信息
//教师工资信息的修改
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].sex);
printf("\n\t 单位名称: %.5f",tea[i].unit);
printf("\n\t 地址: %.5f",tea[i].address);
printf("\n\t 电话号码: %.5f",tea[i].phone);
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[i].number);
printf("请输入教师姓名:");
scanf("%s",tea[i].name);
printf("请输入教师性别: ");
scanf("%f",&tea[i].sex);
printf("请输入教师单位名称: ");
scanf("%f",&tea[i].unit);
printf("请输入教师地址: ");
scanf("%f",&tea[i].address);
printf("请输入教师手机号码: ");
scanf("%f",&tea[i].phone);
printf("请输入教师基本工资: ");
scanf("%f",&tea[i].salary);
printf("请输入教师的津贴: ");
scanf("%f",&tea[i].allowance);
printf("请输入教师的生活补贴: ");
scanf("%f",&tea[i].life);
printf("请输入教师的电话费: ");
scanf("%f",&tea[i].tel);
printf("请输入教师的水电费: ");
scanf("%f",&tea[i].utilities);
printf("请输入教师的房租: ");
scanf("%f",&tea[i].rent);
printf("请输入教师的所得税: ");
scanf("%f",&tea[i].due);
printf("请输入教师的卫生费: ");
scanf("%f",&tea[i].health);
printf("请输入教师的公积金: ");
scanf("%f",&tea[i].fund);
tea[i].should =tea[i].salary +tea[i].allowance +tea[i].life;
tea[i].total=tea[i].tel+tea[i].utilities
+tea[i].rent+tea[i].due+tea[i].health+tea[i].fund;
tea[i].actual=tea[i].should-tea[i].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].sex);
printf("\n\t 单位名称: %.5f",tea[i].unit);
printf("\n\t 地址: %.5f",tea[i].address);
printf("\n\t 电话号码: %.5f",tea[i].phone);
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;
}
3.2.4删除教师工资信息
//删除菜单
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].sex);
printf("\n\t 单位名称: %.5f",tea[i].unit);
printf("\n\t 地址: %.5f",tea[i].address);
printf("\n\t 电话号码: %.5f",tea[i].phone);
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;
}
else
return;
}
continue;
}
if(deletemark==0)
{
printf("\n\t 没有该教师的记录");
printf("\n\t 是否继续删除?(y/n)");
if(getch()=='y')
delete_id();
}
}
3.2.5保存并退出
//写入文件
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);
}
3 测试分析
- 教师工资信息的输入
图表 1
输入完成后可以选择继续输入或者返回主菜单
(2)教师工资信息的修改
图表 2
输入了需要修改的教师编号后会出现我需要修改的教师全部信息然后重新输入信息即可
图表 3
(3)教师工资信息的删除
图表 4
选择完需要删除的教师编号后会进行再次的询问避免错误的删除并且最后可以选择是否继续删除。
(4)教师工资信息的查询
图表 5
可以选择所有查询或者编号查询
查询所有
图表 6
按编号查询
图表 7
(5)保存并退出
图表 8