教师工资管理系统C实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.选题背景
二.需求分析
、设计选题与目标
1.选题要求:
教师工资管理系统
每个教师的信息为:教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。
注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电
费+房租+所得税+卫生费+公积金;实发工资=应发工资-合计扣款。
A、教师信息处理
(1) 输入教师信息
(2) 插入(修改)教师信息:
(3) 删除教师信息:
(4) 浏览教师信息:
提示:具体功能及操作参考题1。
B、教师数据处理:
(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得
税、卫生费、公积金等基本数据。
(2) 教师实发工资、应发工资、合计扣款计算。
提示:计算规则如题目。
(3) 教师数据管理
提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文
(4) 教师数据查询:
提示:输入教师号或其他信息,即读出所有数据信息,并显示出来。
(5) 教师综合信息输出
提示:输出教师信息到屏幕。
2. 目标
教师数据处理:
(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得
税、卫生费、公积金等基本数据。
(2) 教师实发工资、应发工资、合计扣款计算。
计算规则如题目。
(3) 教师数据管理
输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件
(4) 教师数据查询:
输入教师号或其他信息,即读出所有数据信息,并显示出来。
(5) 教师综合信息输出
输出教师信息到屏幕
三.总体设计
利用六个模块分别实现教师信息的输入,修改,删除,查询,保存以及信息文件的读入功能。
并使用不同的函数实现不同的功能。
使用链表存储及处理数据。
程序流程图如下:
四.详细设计
1.功能模块
共分为六个模块:
(1)输入教师信息模块
在主菜单中运用结构体teacher,输入教师信息,首先建立链表,将用户信息储存到链
表中,输入完成后提示用户是否继续输入,如果用户输入“丫”则再次调用,实现继续输入教师信息的操作。
如果用户输入”NO “,则返回主菜单界面。
(2)修改教师信息模块
在主函数中调用void change_id(),修改记录操作需要对数组中目标元素的数据域中的值进行操作。
首先请用户输入要修改的教师编号,然后若找到该记录就提示用户输入各个信息。
(3)删除教师信息模块
在主函数中调用void delete_id(),以删除教师信息,首先按学号查询教师信息,如果没有找到教师信息,给出提示。
如果找到教师信息,将教师信息显示出来,提示用户删除。
(4)查询教师信息
查询分三种,调用void show_all()显示所有教师信息;调用void search_id()按编号查询教师信息;调用void search_name(按姓名查询教师信息。
(5)读入教师信息文件模块
调用void readfromfile()函数从文件导入教师信息
(6)保存并退出模块
调用void writetofileO写入文件。
2 .函数的设计与调用
(1)主函数的设计
编写主函数的主要任务就是确定调用函数以及控制屏幕显示。
(2 )其他函数
1)原型void show_all;
功能展出所有录入文件
参数无
返回值无
工作方式调用char name[10]; float salaryfloat allowanee; float life;
1
float tel;float utilities;float
ren t;float due; float health; float fund; float
total; float should; float actual;
2)原型void tea_new
功能创建新的信息录入
参数无
返回值无
工作方式创建file
3)原型void searchmenu;
功能查找菜单
参数无
返回值无
工作方式调用void search_id;void search_name;
4)原型void search_id;
功能查找信息按编号查找
参数无
返回值整个信息
工作方式调用number
5)原型void search_name;
功能查找信息按姓名查找
参数无
返回值整个信息
工作方式调用char name
6)原型void delete_id
功能删除数据按编号删除
参数无
返回值无
工作方式调用id
7)原型void change_id;
功能改变数据按编号改
参数无
返回值整个录入信息
工作方式调用id
int nu mber; 教师编号
char n ame[10]; 教师姓名
float salary; 教师基本工资
float allowa nee; 教师津贴
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 ---------------
printf("\t**************** printf("\t -------------- [1]
printf("\t -------------- [2]
printf("\t -------------- [3]
printf("\t -------------- [4]
printf("\t -------------- [5]
printf("\t*************************************************
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 教师工资信息文件不存在哟
(*/ 3、*)");
if((fp=fopen("teacher.bin","wb"))==NULL)
{ printf("\n\t 建立失败 "); exit(0);
} else
{ printf("\n\t 教师工资信息文件已建立
(〜厂3—)〜”);
printf("\n\t 按回车键进入主菜单 ");
getch(); 欢迎使用\(5 ------------------------ \n");
教师工资管理系统 ******************\n\n");
输入教师信息 修改教师信息 删除教师信息 查询教师信息 保存并退出 - \n"); \n"); \n"); \n"); \n"); *\n");
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
printf("\n\t printf("\n\t getch();
return;
}
} //写入文件
void writetofile()
{
int i;
if((fp=fopen("teacher.bin","wb"))==NULL)
{
printf("\n\t 打开文件失败(*/ co\*)");
} for(i=0;i<num;i++)
{
if(fwrite(&tea[i],sizeof(struct teacher),1,fp)!=1) {
printf("\n\t 文件写入错误!(>—V )\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);
教师工资信息文件导入成功 (* — 3—)厂”);
文件中无任何记录 (=@__@=)"); 按回车键进
入主菜单 ");
}
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() {
choic=getch();
switch(choic)
{ case'1':show_all();break;
case'2':search_id();break; case'3':search_name();break;
case'4':mainmenu();break;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);
"); "); "); "); "); ");
printf("\n\t ----------- 查询 ----
printf("\n\t- ------ [1] 显示所有 ---
printf("\n\t- ------ [2] 按编号查询
printf("\n\t- ------ [3] 按姓名查询
printf("\n\t- ------ [4] 返回主菜单
printf("\n\t 请选择 :\n");
"); ---"); ---- "); ---- "); ---- "); char choic;
system("cls");
}
//显示所有 void show_all()
{
int i; system("cls");
if(num!=0)
{
for(i=0;i<num;i++)
{
编号 : %d",tea[i].number); 姓名: %s",tea[i].name); 基
本工资 : %.5f",tea[i].salary); 津
贴 : %.5f",tea[i].allowance); 生活补
贴 : %.5f",tea[i].life); 电话费 : %.5f",tea[i].tel); 水电
费 : %.5f",tea[i].utilities); 房租 : %.5f",tea[i].rent); 所
得税 : %.5f",tea[i].due); 卫生费 : %.5f",tea[i].health);
公积金 : %.5f",tea[i].fund); 应发工
资 : %.5f",tea[i].should); 合计扣
款 : %.5f",tea[i].total); 实发工
资 : %.5f",tea[i].actual);
if(i+1<num) {
printf("\n\t _______
system("pause");
}
printf("\n\t*************************************");
}
else
printf("\n\t 文件中无记录〒〒—「 ”);
printf("\n\t 按回车键回到主菜单 "); getch(); return;
}
//按编号查询
void search_id()
{
int mark=0;
int i,a=0;
int id;
printf("\n\t 请输入编号 :");
printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t
scanf("%d",&id);
for(i=0;i<num;i++)
{
if(id==tea[i].number)
{
以下是你要查找的教师工资信息 ******\n"); 编号 : %d",tea[i].number); 姓
名: %s",tea[i].name); 基本工资 : %.5f",tea[i].salary); 津贴 : %.5f",tea[i].allowance); 生活补贴 : %.5f",tea[i].life); 电话费 : %.5f",tea[i].tel); 水电
费 : %.5f",tea[i].utilities); 房租 : %.5f",tea[i].rent); 所得税 : %.5f",tea[i].due); 卫生
费 : %.5f",tea[i].health); 公积金 : %.5f",tea[i].fund); 应发工资 : %.5f",tea[i].should); 合计扣
款 : %.5f",tea[i].total); 实发工资 : %.5f",tea[i].actual);
}
} if(mark==0) {
没有该编号的信息 ");
按回车键返回主菜单 ");
}
//按姓名查询
void search_name()
{
printf("\n\t*
printf("\n\t printf("\n\t printf("\n\t
printf("\n\t printf("\n\t printf("\n\t
printf("\n\t printf("\n\t printf("\n\t
printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t
printf("\n\t* printf("\n\t 按回车键回到主
菜单 ");
mark++;
getch();
return;
printf("\n\t
printf("\n\t
getch();
return;
int mark=0;
int i,a=0;
char name[10];
printf(" 请输入姓名:");
scanf("%s",name); for(i=a;i<num;i++) {
以下是你要查找的教师工资信息
******\n"); 编号 : %d",tea[i].number);
姓名 : %s",tea[i].name); 基本工
资 : %.5f",tea[i].salary);
津贴 : %.5f",tea[i].allowance); 生活补
贴 : %.5f",tea[i].life); 电话
费 : %.5f",tea[i].tel); 水电费 : %.5f",tea[i].utilities); 房租 : %.5f",tea[i].rent); 所得
税 : %.5f",tea[i].due); 卫生
费 : %.5f",tea[i].health); 公积
金 : %.5f",tea[i].fund); 应发工
资 : %.5f",tea[i].should); 合计扣
款 : %.5f",tea[i].total); 实发工
资 : %.5f",tea[i].actual);
printf("\t\n 是否继续查找相同名字的教
师信息 :(y/n)"); if(getch()=='y')
{
a=i;continue;
}
else
return;
}
else
{
printf("\n\t 按回车键返回主菜单 "); getch();
return;
}
}
}
if(mark!=0)
{
printf("\n\t 没有相同姓名的教师信息记录 ");
printf("\n\t 按回车键回到主菜单 ");
getch();
return;
} else
if(strcmp(tea[i].name,name)==0) { printf("\n\t* printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t* mark++;
if((i+1)<num)
{
{
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
} for(i=0;i<num;i++) {
if(id==tea[i].number)
{ 以下是你要删除的教师工资信息 ******\n"); 编号 : %d",tea[i].number); 姓
名 : %s",tea[i].name);
基本工资 : %.5f",tea[i].salary); 津贴 : %.5f",tea[i].allowance); 生活补贴 : %.5f",tea[i].life);
电话费 : %.5f",tea[i].tel); 水电费 : %.5f",tea[i].utilities); 房租 : %.5f",tea[i].rent); 所得税 : %.5f",tea[i].due); 卫生费 : %.5f",tea[i].health); 公积金 : %.5f",tea[i].fund); 应发工资 合计扣款 实发工资 是否删除 if(getch()=='y') { for(j=i;j<num-1;j++)
对不起,文件中无任何教师工资信息记录 "); 按
回车键回到主菜单 ");
getch();
return;
printf("\n\t******
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t
printf("\n\t : %.5f",tea[i].should); : %.5f",tea[i].total); : %.5f",tea[i].actual); ?(y/n)");
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();
}
//修改菜单
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 printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t 编号: %d",tea[i].number); 姓名: %s",tea[i].name); 基本工资: %.5f",tea[i].salary); 津贴: %.5f",tea[i].allowance); 生活补贴: %.5f",tea[i].life); 电话费: %.5f",tea[i].tel); 水电
费: %.5f",tea[i].utilities); 房租: %.5f",tea[i].rent); 所得税: %.5f",tea[i].due);
卫生费 : %.5f",tea[i].health); 公积
金 : %.5f",tea[i].fund); 应发工
资 : %.5f",tea[i].should); 合计扣
款 : %.5f",tea[i].total); 实发工资 : %.5f",tea[i].actual);
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 printf("\n\t printf("\n\t printf("\n\t
} 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); "); "); "); "); "); ");
printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t i=i; break;
姓名: %s",tea[i].name); 基本工
资 : %.5f",tea[i].salary); 津
贴 : %.5f",tea[i].allowance); 生
活补贴 : %.5f",tea[i].life);
电话费 : %.5f",tea[i].tel); 水电费 : %.5f",tea[i].utilities); 房
租 : %.5f",tea[i].rent); 所得税 : %.5f",tea[i].due); 卫生
费 : %.5f",tea[i].health); 公积金 : %.5f",tea[i].fund); 应发工
资 : %.5f",tea[i].should); 合计扣款 : %.5f",tea[i].total); 实发工
资 : %.5f",tea[i].actual);
printf("\n\t 按回车键回到主菜单 ");
getch(); return;
五.程序运行结果测试
六.结论与心得
在设计与编写程序的过程中,我捡起了很多自己以前没有注意到的细节,并对一些知 识特别是链表的运用有了更好的掌握,巩固了所学,提升了自己的能力。
老师和学长们总是建议我们不要眼高手低, 不要一味的看书看例程, 要自己去写程序, 之前我对此不以为意,经过这次课程设计,我改变了原先的看法。
真的是只有你自己去 动手编程,才会发现自己是否真正掌握了那些知识,才会对所学的知识有更好的理解与 运用能力,并且能加深记忆。
此外,动手编程的过程本身对自己就是一种锻炼,只能看 懂例程而缺少实际设计编写程序能力与经验的人是不会成为一名合格的程序员的。
通过这次课程设计设计我学会了很多,也更加熟悉 c 语言程序设计,从中得到很多乐 趣。
printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t printf("\n\t
printf("\n\t printf("\n\t printf("\n\t
printf("\n\t。