第一篇:C语言 课程设计 教师工资管理系统(职工工资管理系统)
课程设计 教师工资管理系统
运行平台:VC6.0(其他平台未经测试,不一定保证有效)
制作者:弓箭 中南大学 信息科学与工程学院
源代码如下:
#include
struct teacher { int num;char name[20];char sex[20];char workplace[50];char address[50];long phone;double de_salary;double de_jintie;double de_shenghuobutie;double yingfa_salary;double cost_phone;double cost_water_elec;double cost_rent;double cost_tax;double cost_weisheng;double cost_gongjijin;double cost_all;double shifa_salary;struct teacher *next;};
/***********************************读取函数************************************/ struct teacher *load(){ struct teacher *p1,*p2,*head;FILE *fp;int i=1;if((fp=fopen(“save”,“rb”))==NULL){
printf(“
文件不存在!按下任意键返回主菜单...”);getch();
return(NULL);} else {
head=NULL;
p1=(struct teacher *)malloc(LEN);
while(fread(p1,LEN-4,1,fp)==1)
{
if(i==1)
{
head=p1;
p2=p1;
i=2;
}
else
{
p2->next=p1;
p2=p2->next;
}
p1=(struct teacher *)malloc(LEN);
}
p2->next=NULL;
free(p1);
fclose(fp);
return(head);} }
/**********************************欢迎菜单函数*************************************/ void welcome(){ printf(“nnn
>>>>>欢迎使用教师工资管理系统Beta1.2<<<< *******************************************************n”);printf(“ * C语言课程设计 教师工资管理系统 *n”); printf(“ * 班级: 电气信息类1001班 学号:0909100119 *n”);printf(“ * 姓名:弓箭 *n”);printf(“ *******************************************************n”);printf(“nn 按下任意键进入系统...”);getch();system(“cls”);} /**********************************制作人员名单*************************************/ void list(){ system(“cls”);printf(“nnn >>>>>版权所有 侵权必究<<<< 学校(College): 中南大学 Central South University *n”);printf(“* 软件名称(Software): 教师工资管理系统 Teacher's Salary Managing System *n”); printf(“* 版本号(Edition): Beta1.2 *n”);printf(“* 制作人(Producer): 弓箭 James *n”);printf(“* 所在班级(Class): 电气信息类1001班 Electric Information 1001 *n”);printf(“* 所在学院(Institute):信息科学与工程学院 Information Engineering Institute*n”);printf(“*******************************************************************************n”);printf(“ >>>>>ILLEGAL COPY BANNED<<<< 按下任意键返回主菜单...”);getch();} /***********************************菜单函数*****************************************/ int menu(){ int i;printf(“nnn >>>>>欢迎使用教师工资管理系统Beta1.2<<<< *******************************************************n”);printf(“ * 1.输入教师信息 *n”);printf(“ * 2.插入教师信息 *n”);printf(“ * 3.修改教师信息 *n”);printf(“ * 4.删除教师信息 *n”);printf(“ * 5.浏览教师信息 *n”);printf(“ * 6.显示制作人员名单 *n”);printf(“ * 7.退出系统 *n”);printf(“ *******************************************************n”);printf(“ 请输入你想要的操作:”);scanf(“%d”,&i);getchar();return i;} /***********************************插入函数*****************************************/ void input(){ struct teacher *head,*p1,*p2,*p3,*px;int i,t;FILE *fp;char k,n='n',num[30],name[20];p1=p2=p3=px=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { n='n'; printf(“ 请输入要插入的教师信息:n”); printf(“ ------------------------------n”); printf(“ 请输入教工号:”);gets(num);px->num=atoi(num); printf(“ 请输入姓名:”);gets(px->name); printf(“ 请输入性别:”);gets(px->sex); printf(“ 请输入单位名称:”);gets(px->workplace); printf(“ 请输入家庭住址:”);gets(px->address); printf(“ 请输入联系电话:”);gets(num);px->phone=atoi(num); printf(“ 请输入基本工资:”);gets(num);px->de_salary=atof(num); printf(“ 请输入津贴:”);gets(num);px->de_jintie=atof(num); printf(“ 请输入生活补贴:”);gets(num);px->de_shenghuobutie=atof(num); printf(“ 请输入电话费:”);gets(num);px->cost_phone=atof(num); printf(“ 请输入水电费:”);gets(num);px->cost_water_elec=atof(num); printf(“ 请输入房租:”);gets(num);px->cost_rent=atof(num); printf(“ 请输入个人所得税:”);gets(num);px->cost_tax=atof(num); printf(“ 请输入卫生费:”);gets(num);px->cost_weisheng=atof(num); printf(“ 请输入公积金:”);gets(num);px->cost_gongjijin=atof(num); px->yingfa_salary=px->de_salary+px->de_jintie+px->de_shenghuobutie; px->cost_all=px->cost_phone+px->cost_water_elec+px->cost_rent+px->cost_tax+px->cost_weisheng+px->cost_gongjijin; px->shifa_salary=px->yingfa_salary-px->cost_all; printf(“ 数据输入完毕,按下任意键继续...”);getch(); system(“cls”); printf(“nnn >>>>>>>>>>> 插入教师信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.输入教师号 *n”); printf(“ * 2.输入姓名 *n”); printf(“ * 3.返回上级菜单 *n”); printf(“ *******************************************************n”); printf(“ 请选择插入方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入要插入在哪条数据后面:”); scanf(“%d”,&t);getchar(); p1=head; while(p1->num!=t) { if(p1->next!=NULL) { p1=p1->next; } else { printf(“ 查找不到相关数据!n”); break; } } if(p1->num==t) { printf(“-----------------------------要插入的信息如下:-n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,px->num,px->name,px->sex,px->workplace,px->address,px->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,px->cost_phone,px->cost_water_elec,px->cost_rent,px->cost_tax,px->cost_weisheng,px->cost_gongjijin,px->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,px->de_salary,px->de_jintie,px->de_shenghuobutie,px->yingfa_salary,px->shifa_salary); printf(“-----------------n”); printf(“ 确定插入吗?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(p1->num==t) { if(p1==head)/*如果插入点为头指针*/ { p3=p1->next; p1->next=px; px->next=p3; p2=head; } else if(p1->next==NULL)/*如果插入点为末尾指针*/ { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p1->next=px; px->next=NULL; } else{/*如果插入点为中间指针*/ p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p3=p1->next; px->next=p3; p1->next=px; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意键返回主菜单...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 插入成功!按下任意键继续...”);getch();} } else {printf(“ 插入已被取消!按下任意键继续...”);getch();} break;case 2:printf(“ 请输入要插入的教师姓名:”);gets(name);p1=head; while(strcmp((p1->name),name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(strcmp((p1->name),name)==0) { printf(“-----------------------------要插入的信息如下:-n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 确定插入吗?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(strcmp((p1->name),name)==0) { if(p1==head)/*如果插入点为头指针*/ { p1->next=px; p2=head; } else if(p1->next==NULL)/*如果插入点为末尾指针*/ { p3=p1;p1=head;p2=head; while(p1->next!=p3) } {p1=p1->next;} p1=p1->next; p1->next=px; px->next=NULL; } else{/*如果插入点为中间指针*/ p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1=p1->next; p1->next=px; p3=p3->next; px->next=p3; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意键返回主菜单...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 插入成功!按下任意键继续...”);getch(); } } else {printf(“ 插入已被取消!按下任意键继续...”);getch();} break;case 3:break;default :break;} if(i!=3){ printf(“n 继续插入其他教师的信息吗?(y或n)”);scanf(“%c”,&n);getchar();} }while((n=='y'||n=='Y')&&i!=3); printf(“ 数据插入成功!按下任意键返回主菜单...”);getch(); getchar();} /***********************************输入函数*****************************************/ void insert(){ FILE *fp;char m,num[30]; struct teacher *p1;p1=(struct teacher *)malloc(LEN);if((fp=fopen(“save”,“ab”))==NULL){ printf(“ 文件不存在!按下任意键返回主菜单...”);getch();} else { printf(“ 请输入教师信息:n”); do { printf(“ ------------------------------n”); printf(“ 请输入教工号:”);gets(num);p1->num=atoi(num); printf(“ 请输入姓名:”);gets(p1->name); printf(“ 请输入性别:”);gets(p1->sex); printf(“ 请输入单位名称:”);gets(p1->workplace); printf(“ 请输入家庭住址:”);gets(p1->address); printf(“ 请输入联系电话:”);gets(num);p1->phone=atoi(num); printf(“ 请输入基本工资:”);gets(num);p1->de_salary=atof(num); printf(“ 请输入津贴:”);gets(num);p1->de_jintie=atof(num); printf(“ 请输入生活补贴:”);gets(num);p1->de_shenghuobutie=atof(num); printf(“ 请输入电话费:”);gets(num);p1->cost_phone=atof(num); printf(“ 请输入水电费:”);gets(num);p1->cost_water_elec=atof(num); printf(“ 请输入房租:”);gets(num);p1->cost_rent=atof(num); printf(“ 请输入个人所得税:”);gets(num);p1->cost_tax=atof(num); printf(“ 请输入卫生费:”);gets(num);p1->cost_weisheng=atof(num); printf(“ 请输入公积金:”);gets(num);p1->cost_gongjijin=atof(num); p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; fwrite(p1,LEN-4,1,fp); printf(“ 输入下一个?(y或n)”); m=getchar(); if(m!='y'&&m!='Y') {printf(“ 数据保存成功!按下任意键返回主菜单...”);getch();} getchar(); }while(m=='y'||m=='Y');} fclose(fp);} /***********************************修改函数*****************************************/ void modify(){ struct teacher *head,*p1,*p2;int i;FILE *fp;char m='n',n='n',num2[30];p1=head=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { int num=0; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 修改教师信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.输入教师号 *n”); printf(“ * 2.输入姓名 *n”); printf(“ * 3.返回上级菜单 *n”); printf(“ *******************************************************n”); printf(“ 请选择修改方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入要修改的教师号:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(p1->num==num) { system(“cls”); printf(“nnn >>>>>欢迎使用教师工资管理系统Beta1.2<<<< printf(“---原信息如下:--n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ *******************************************************n”); printf(“ * 1.教师号 2.姓名 *n”); printf(“ * 3.性别 4.单位名称 *n”); printf(“ * 5.家庭住址 6.联系电话 *n”); printf(“ * 7.基本工资 8.津贴 *n”); printf(“ * 9.生活补贴 10.电话费 *n”); printf(“ * 11.水电费 12.房租 *n”); printf(“ * 13.所得税 14.卫生费 *n”); printf(“ * 15.公积金 *n”); printf(“ *******************************************************n”); do { printf(“ 请选择要修改的数据:”); scanf(“%d”,&i);getchar(); while(i>15||i<1) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入新教师号:”);gets(num2);p1->num=atoi(num2);break; case 2:printf(“ 请输入新姓名:”);gets(p1->name);break; case 3:printf(“ 请输入新性别:”);gets(p1->sex);break; case 4:printf(“ 请输入新单位名称:”);gets(p1->workplace);break; case 5:printf(“ 请输入新家庭住址:”);gets(p1->address);break; case 6:printf(“ 请输入新联系电话:”);gets(num2);p1->phone=atoi(num2);break; case 7:printf(“ 请输入新基本工资:”);gets(num2);p1->de_salary=atof(num2);break; case 8:printf(“ 请输入新津贴:”);gets(num2);p1->de_jintie=atof(num2);break; case 9:printf(“ 请输入新生活补贴:”);gets(num2);p1->de_shenghuobutie=atof(num2);break; case 10:printf(“ 请输入新电话费:”);gets(num2);p1->cost_phone=atof(num2);break; case 11:printf(“ 请输入新水电费:”);gets(num2);p1->cost_water_elec=atof(num2);break; case 12:printf(“ 请输入新房租:”);gets(num2);p1->cost_rent=atof(num2);break; case 13:printf(“ 请输入新所得税:”);gets(num2);p1->cost_tax=atof(num2);break; case 14:printf(“ 请输入新卫生费:”);gets(num2);p1->cost_weisheng=atof(num2);break; case 15:printf(“ 请输入新公积金:”);gets(num2);p1->cost_gongjijin=atof(num2);break; default:break; } p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; printf(“ 继续修改其他数据吗?(y或n):”); scanf(“%c”,&m);getchar(); }while(m=='y'||m=='Y'); p2=head; if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意键返回主菜单...”);getch(); } else { fwrite(head,LEN-4,1,fp); do { p2=p2->next; fwrite(p2,LEN-4,1,fp); }while(p2->next!=NULL); printf(“------------------------------修改后数据如下:--n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } fclose(fp); } break; case 2:printf(“ 请输入要修改的教师姓名:”); gets(name); while(strcmp(p1->name,name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(strcmp(p1->name,name)==0) { system(“cls”); printf(“nnn >>>>>欢迎使用教师工资管理系统Beta1.2<<<< printf(“---原信息如下:--n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ *******************************************************n”); printf(“ * 1.教师号 2.姓名 *n”); printf(“ * 3.性别 4.单位名称 *n”); printf(“ * 5.家庭住址 6.联系电话 *n”); printf(“ * 7.基本工资 8.津贴 *n”); printf(“ * 9.生活补贴 10.电话费 *n”); printf(“ * 11.水电费 12.房租 *n”); printf(“ * 13.所得税 14.卫生费 *n”); printf(“ * 15.公积金 *n”); printf(“ *******************************************************n”); do { printf(“ 请选择要修改的数据:”); scanf(“%d”,&i);getchar(); while(i>15||i<1) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入新教师号:”);gets(num2);p1->num=atoi(num2);break; case 2:printf(“ 请输入新姓名:”);gets(p1->name);break; case 3:printf(“ 请输入新性别:”);gets(p1->sex);break; case 4:printf(“ 请输入新单位名称:”);gets(p1->workplace);break; case 5:printf(“ 请输入新家庭住址:”);gets(p1->address);break; case 6:printf(“ 请输入新联系电话:”);gets(num2);p1->phone=atoi(num2);break; case 7:printf(“ 请输入新基本工资:”);gets(num2);p1->de_salary=atof(num2);break; case 8:printf(“ 请输入新津贴:”);gets(num2);p1->de_jintie=atof(num2);break; case 9:printf(“ 请输入新生活补贴:”);gets(num2);p1->de_shenghuobutie=atof(num2);break; case 10:printf(“ 请输入新电话费:”);gets(num2);p1->cost_phone=atof(num2);break; case 11:printf(“ 请输入新水电费:”);gets(num2);p1->cost_water_elec=atof(num2);break; case 12:printf(“ 请输入新房租:”);gets(num2);p1->cost_rent=atof(num2);break; case 13:printf(“ 请输入新所得税:”);gets(num2);p1->cost_tax=atof(num2);break; case 14:printf(“ 请输入新卫生费:”);gets(num2);p1->cost_weisheng=atof(num2);break; case 15:printf(“ 请输入新公积金:”);gets(num2);p1->cost_gongjijin=atof(num2);break; default:break; } p1->yingfa_salary=p1->de_salary+p1->de_jintie+p1->de_shenghuobutie; p1->cost_all=p1->cost_phone+p1->cost_water_elec+p1->cost_rent+p1->cost_tax+p1->cost_weisheng+p1->cost_gongjijin; p1->shifa_salary=p1->yingfa_salary-p1->cost_all; printf(“ 继续修改其他数据吗?(y或n):”); scanf(“%c”,&m);getchar(); }while(m=='y'||m=='Y'); p2=head; if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意键返回主菜单...”);getch(); } else { fwrite(head,LEN-4,1,fp); do { p2=p2->next; fwrite(p2,LEN-4,1,fp); }while(p2->next!=NULL); printf(“------------------------------修改后数据如下:--n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } fclose(fp); } break; case 3:break; default :break; } if(i!=3) { printf(“n 继续修改其他教师的信息吗?(y或n)”); scanf(“%c”,&n); } }while((n=='y'||n=='Y')&&i!=3);} } /***********************************删除函数*****************************************/ void deletes(){ struct teacher *head,*p1,*p2,*p3;int i;char k;FILE *fp;char n='n';p1=p2=p3=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ do { int num; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 删除教师信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.输入教师号 *n”); printf(“ * 2.输入姓名 *n”); printf(“ * 3.返回上级菜单 *n”); printf(“ *******************************************************n”); printf(“ 请选择删除方式:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入要删除的信息的教师号:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(p1->num==num) { printf(“-----------------------------要删除的信息如下:-n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lfn”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 确定删除吗?(y或n):”);scanf(“%c”,&k);getchar();} if(k=='y'||k=='Y'){ if(p1->num==num){ if(p1==head){ p1=p1->next; p2=p1;} else if(p1->next==NULL) { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1->next=NULL; } else{ p2=head;p3=p1;p1=head; while(p1->next!=p3) {p1=p1->next;} p3=p3->next; p1->next=p3; } if((fp=fopen(“save”,“wb”))==NULL){ printf(“ 文件不存在!按下任意键返回主菜单...”);getch();} else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL);if(p2!=head) fwrite(p2,LEN-4,1,fp);}fclose(fp);printf(“ 删除成功!按下任意键继续...”);getch();} } else {printf(“ 删除已被取消!按下任意键继续...”);getch();} break; case 2:printf(“ 请输入要修改的教师姓名:”); gets(name); while(strcmp((p1->name),name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(strcmp((p1->name),name)==0) { printf(“-----------------------------要删除的信息如下:-n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); printf(“ 确定删除吗?(y或n):”); scanf(“%c”,&k);getchar(); } if(k=='y'||k=='Y') { if(strcmp((p1->name),name)==0) { if(p1==head) { p1=p1->next; p2=p1; } } else if(p1->next==NULL) { p3=p1;p1=head;p2=head; while(p1->next!=p3) {p1=p1->next;} p1->next=NULL; } else{ p2=head;p3=p1;p1=head; while(p1->next!=p3) {p1=p1->next;} p3=p3->next; p1->next=p3; } if((fp=fopen(“save”,“wb”))==NULL) { printf(“ 文件不存在!按下任意键返回主菜单...”);getch(); } else { do { fwrite(p2,LEN-4,1,fp); if(p2->next!=NULL) p2=p2->next; }while(p2->next!=NULL); if(p2!=head) fwrite(p2,LEN-4,1,fp); }fclose(fp); printf(“ 删除成功!按下任意键继续...”);getch(); } } else {printf(“ 删除已被取消!按下任意键继续...”);getch();} break;case 3:break;default :break;} if(i!=3){ printf(“n 继续删除其他教师的信息吗?(y或n)”);scanf(“%c”,&n);} }while((n=='y'||n=='Y')&&i!=3);} /***********************************浏览函数*****************************************/ void scan(){ struct teacher *head,*p1;int i;char m='n';p1=head=(struct teacher *)malloc(LEN);if((head=load())!=NULL){ system(“cls”); printf(“nnn >>>>>>>>>>> 浏览教师信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.全部浏览 *n”); printf(“ * 2.单个浏览 *n”); printf(“ * 3.返回上级菜单 *n”); printf(“ *******************************************************n”); printf(“ 请输入你想要的操作:”); scanf(“%d”,&i);getchar(); while(i<1||i>3) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:p1=head; printf(“----------------------------所有保存的信息如下:n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); do { printf(“ %-4d %-13s %s %-19s %-19s%-14ld”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); do { printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf ”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); do { printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lf n”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); if(p1->next!=NULL) {p1=p1->next;} else break; }while(1); p1=head; printf(“n-----------------n”); printf(“ 按下任意键返回主菜单...”); getch(); break; case 2: do { int num=0; char name[20]; p1=head; system(“cls”); printf(“nnn >>>>>>>>>>> 浏览教师信息 <<<<<<<<<< printf(“ *******************************************************n”); printf(“ * 1.输入教师号 *n”); printf(“ * 2.输入姓名 *n”); printf(“ *******************************************************n”); printf(“ 请输入你想要的操作:”); scanf(“%d”,&i);getchar(); while(i<1||i>2) { printf(“ 输入有误!请重新输入:”); scanf(“%d”,&i);getchar(); } switch(i) { case 1:printf(“ 请输入要查询的教师号:”); scanf(“%d”,&num);getchar(); while(p1->num!=num) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(p1->num==num) { printf(“所查信息如下:---n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } break; case 2:printf(“ 请输入要查询的教师姓名:”); gets(name); while(strcmp(p1->name,name)!=0) { if(p1->next!=NULL) p1=p1->next; else { printf(“ 查找不到相关数据!n”); break; } } if(strcmp(p1->name,name)==0) { printf(“所查信息如下:---n”); printf(“教工号 姓名 性别 单位名称 家庭住址 联系电话n”); printf(“ %-4d %-13s %s %-19s %-19s%-14ldn”,p1->num,p1->name,p1->sex,p1->workplace,p1->address,p1->phone); printf(“电话费 水电费 房租 个人所得税 卫生费 公积金 合计扣款n”); printf(“ %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf %-10.1lf n”,p1->cost_phone,p1->cost_water_elec,p1->cost_rent,p1->cost_tax,p1->cost_weisheng,p1->cost_gongjijin,p1->cost_all); printf(“基本工资 津贴 生活补贴 应发工资 实发工资n”); printf(“ %-13.1lf %-13.1lf %-13.1lf %-13.1lf %-13.1lfn”,p1->de_salary,p1->de_jintie,p1->de_shenghuobutie,p1->yingfa_salary,p1->shifa_salary); printf(“-----------------n”); } break; default :break; } printf(“ 继续浏览吗?(y或n)”); scanf(“%c”,&m); }while(m=='y'||m=='Y'); case 3:break; } } } /***********************************主函数*****************************************/ void main(){ int a=1;welcome();while(1){ system(“cls”); a=menu();switch(a){ case 1:insert();break; } case 2:input();break;case 3:modify();break;case 4:deletes();break;case 5:scan();break;case 6:list();break;case 7:printf(“ 欢迎下次使用!”);getch();exit(0);break;default :printf(“ 输入有误,请重新输入!”);getch();break;} } getch(); Form1: Dim errorCount As Integer Private Sub Command1_Click()If Text1.Text = “system” And Text2.Text = “1234” Then Load Form2 Form2.Show Me.Hide MsgBox “登陆成功,欢迎您进入职工工资管理系统”, vbInformation, “登陆成功” Else errorCount = errorCount + 1 If errorCount < 3 Then MsgBox “用户名或密码错误(第” & errorCount & “次)!”, vbOKOnly + vbExclamation, “登陆失败” Text1.SetFocus End If If errorCount >= 3 Then Text1.Enabled = False Text2.Enabled = False Command1.Enabled = False MsgBox “三次输入用户名或密码错误,程序将自动退出!”, vbOKOnly + vbExclamation, “登陆失败” End End If End If End Sub Private Sub Command2_Click()Unload Me End Sub Private Sub Form_Load()errorCount = 0 End Sub Private Sub Form_Unload(Cancel As Integer)If MsgBox(“是否要退出程序?”, vbYesNo, “退出提示”)= vbNo Then Cancel = 1 End If End Sub For i = 1 To jlNum ygList(i).shifagongzi =(CSng(ygList(i).jibengz)+ ygList(i).gerensui CSng(ygList(i).jingtie) ygList(y).shifagongzi = ygList(zuishao).shifagongzi ygList(zuishao).shifagongzi = linShi.shifagongzi End If Next loadData End Sub Private Sub Command5_Click()Dim linShi As YuanGong linShi.ygnamg = InputBox(“请输入要添加的姓名”, “添加员工-姓名录入”)If Len(Trim(linShi.ygnamg))> 0 Then linShi.jibengz = InputBox(“请输入添加员工的基本工资”, “添加员工-基本工资录入”) If Len(Trim(linShi.jibengz))> 0 Then linShi.jingtie = InputBox(“请输入添加员工的津贴”, “添加员工-津贴录入”) If Len(Trim(linShi.jingtie))> 0 Then linShi.gerensui = InputBox(“请输入添加员工的个人所得税”, “添加员工-个税录入”) If Len(Trim(linShi.gerensui))> 0 Then linShi.suidianfei = InputBox(“请输入添加员工的水电费”, “添加员工-水电费录入”) If Len(Trim(linShi.suidianfei))> 0 Then Open filedir For Append As #1 Write #1, linShi.ygnamg;linShi.jibengz;linShi.jingtie;linShi.gerensui;linShi.suidianfei Close #1 MsgBox “添加员工成功!”, vbOKOnly + vbInformation, “成功” jlNum = 0 If Len(Trim(filedir))> 0 Then Open filedir For Input As #1 Do While Not EOF(1) Line Input #1, a If Len(Trim(a))> 0 Then jlNum = jlNum + 1 End If Loop Close #1 ReDim Preserve ygList(jlNum)As YuanGong jlNum = 0 Open filedir For Input As #1 Do While Not EOF(1) jlNum = jlNum + 1 Input #1, ygList(jlNum).ygnamg Input #1, ygList(jlNum).jibengz Input #1, ygList(jlNum).jingtie Next Close #1 MsgBox “删除员工成功!”, vbOKOnly + vbInformation, “成功” jlNum = 0 If Len(Trim(filedir))> 0 Then Open filedir For Input As #1 Do While Not EOF(1) Line Input #1, a If Len(Trim(a))> 0 Then jlNum = jlNum + 1 End If Loop Close #1 ReDim ygList(jlNum)As YuanGong jlNum = 0 Open filedir For Input As #1 Do While Not EOF(1) jlNum = jlNum + 1 Input #1, ygList(jlNum).ygnamg Input #1, ygList(jlNum).jibengz Input #1, ygList(jlNum).jingtie Input #1, ygList(jlNum).gerensui Input #1, ygList(jlNum).suidianfei Loop Close #1 loadData Command2.Enabled = True Command3.Enabled = False Command4.Enabled = False Command5.Enabled = True Command6.Enabled = True End If Text1.Text = “姓名” & vbTab & “工资” & vbTab & “津贴” & vbTab & “所得税” & vbTab & “水电费” & vbCrLf For i = 1 To jlNum Text1.Text = Text1.Text & ygList(i).ygnamg & vbTab & ygList(i).jibengz & vbTab & ygList(i).jingtie & vbTab & ygList(i).gerensui & vbTab & ygList(i).suidianfei & vbCrLf Next Else MsgBox “删除员工失败!”, vbOKOnly + vbExclamation, “失败” End If End Sub Private Sub Command7_Click() 数据库课程设计报告 工资管理系统 组员:廖翔, 刘小芳, 强江波, 张晶晶,冯兆强,夏冲 组长 :刘小芳 需求分析员 :张晶晶 程序员 :廖翔 , 刘小芳 , 强将波 测试员 :冯兆强 界面设计员 :夏冲 目录 一 绪论 ··········································3 二 课程设计说明····································3 三 需求分析·········································4 四 物理结结构设计···································5 五 数据字典·········································5 六 数据库设计·······································10 七 功能实现截图·····································11 八,小结············································21 附录 1.(组员及学号 廖翔(,刘小芳(41009040127,冯兆强(, 张晶晶(41009040130,夏冲(,强将波(2.开发环境说明 使用 C#进行客户端应用程序的开发,数据库管理系统采用 SQL SERVER 一、绪论 随着计算机技术的飞速发展和经济体制改革的不断深入, 传统企业管理方法、手段以及 工作效率已不能适应新的发展需要, 无法很好地完成员工工资管理工作。提高公司企业管理 水平的主要途径是更新管理者的思想,增强对管理活动的科学认识。基于 C#与 SQL server 数据库技术建立一个通用工资管理系统,该系统为提供了查询、增加记录、删除等 功能, 功能比较的齐全, 并对工资进行了统计如津贴管理、报表统计等。基本上能满足管理 员和公司的要求。 此次数据库课程设计的主要设计如下: 原理分析、程序设计过程、程序实现和程序调试以及数据库的设计。需求分析、概要结构设计、逻辑结构设计、物理结构设计和数据库的实施和维护。二.课程设计说明 1.设计题目:工资管理系统 2.设计任务与要求: 2.1实验任务 1.掌握数据库设计和实现的基本过程 2.掌握数据库模式设计、分析和实现的方法 3.了解数据库应用系统软件开发的一般过程。2.2 实验基本要求(1学习相关的预备知识 (2按照数据库设计与实现过程完成数据库的设计,应用程序的开发,上机调试、运 行 (3写出课程设计报 3.目的 本说明书目的在于明确说明系统需求,界定系统实现功能的范围, 指导系统设计以 及编码。本文档作为人力资源管理系统的需求说明文档,用于与用户确定最终的目标, 并成为协议文本的一部分,同时也是本系统设计人员的基础文档。 4.背景 工资管理系统 工资管理部门希望建立一个数据库来管理员工的工资。要计算员工的工资, 就需要考虑 不在休假日期以内的假期、工作期间的病假时间、奖金和扣除的部分。必须指明给每个员工 发薪水的方式, 随着时间的推移, 方式可能会有些改变。大多数的员工是通过银行卡来结算 工资的, 但是也有一部分人使用现金或支票。如果是通过银行卡, 就需要知道账号和卡的类 型。付款方式只可能是一种方式。有几种原因可以扣除工资:例如,个人所得税、国家税、医疗保险、退休保险或者预付款。 5.主要包括三大功能模块: 1.登录界面选择 [员工登录 ]即可进入 [员工登陆界面 ], 选择 [管理员登陆 ]即可进入 [管理员 登录界面 ]。 2.管理员功能模块。3.员工功能模块.6.操作说明 6.1 无论是管理员还是员工,操作都以员工编号来进行。 6.2 管理员可以对员工基本信息增、删、查、改, 员工只能对本人基本信息和工资信息查询。三.需求分析 1.功能需求分析: 该通用工资管理系统具备下列功能:登录界面选择 [员工登录 ]即可进入 [员工登陆界面 ], 选 择 [管理员登陆 ]即可进入 [管理员登录界面 ].管理员通过输入用户名和密码进下该系统后, 可以进行一些基本查询(员工个人信息查 询 , 员工工资信息查询 , 修改(修改员工基本信息 , 修改工资信息 , 删除(员工个人资料删除 , 员工工资信息删除 , 录入(员工资料录入 , 员工工资资料录入;;通过输入密码,可以进行 查询员工的数据(工资,奖金津贴,加班情况。 员工通过输入用户名和密码即可进入系统 , 可以进行查询(查询个人基本信息和工资信 息.2.数据流需求分析: 数据库 数据库需求分析——数据流图 四.物理结构设计 1.系统模块划分 五.数据字典 2.1表字典 2.2表字段字典 六.数据库设计 1.建表 : EmpInfoTable(Id[主键 ],Name,Position,Status;SalaryInfoTable(Id主键 ],Name,Prize,Pasepay,RetirementInsurance,Income,Stute,Medical, Dayleave,Deduced,Paytpe,CardNumber,Cardtype,GrossSalary,NetSalary,Date;(1 员工基本信息表 :(2员工工资表 : 七.功能实现截图 1.登录界面 2.管理员部分 :(1管理员登陆界面 (2管理员功能选择界面 (3.录入员工基本信息界面(4录入员工工资信息 (5.修改功能选择界面 A.修改员工基本信息 B.修改工资信息 (6.管理员查询界面 A.查询功能选择界面 B.查询员工基本信息 C.查询工资信息 (7.管理员查询界面 A.功能选择界面 B.管理员修改员工个人信息 C.管理员修改员工工资界面界面 (8.管理员删除界面 A.功能选择界面 B.删除员工个人信息及工资信息界面 C.删除员工工资信息界面 3.员工功能界面(1.员工登录界面 (2.员工功能选择界面 (3.员工查询本人基本信息(4.员工查询本人工资信息 4.测试分析 4.1 更改员工资料不可以更改身份。4.2 修改员工工资信息一旦失败 就会把原有信息删除。4.3 管理员固定,且只有一个。八.小结 该工资管理系统总体说来功能比较齐全,管理 员和员工的一些基本的功能 都已经具备; 数据库的设计方面,建有员工表、工资表。数据库中存在一些问题,如数据冗余,不够完善。但在做课程设计的过程中也遇到很多问题,一开始时其中最大的问题是数 据库的连接部分,该部分直接影响到数据库与应用程序接口实现,而且必须注意 数据库数据库的名称与连接数据库的取名以致.后来经过大家的合作努力解决了 这个问题.在编写程序时,确实也遇到了很多困难,后来经过调试后终于把自已想 到实现的功能一步步实现了,通过这次课程设计使我收获了好多,熟悉了 C#的 运用,还复习了数据库相关语句的编写。此次课程设计让我感受颇多:做一个数据库其实是一件很有趣的事情。想到 自己可以创建一个小型的数据库系统,有点学习后的满足感。数据库的建立并非 难事,难点在于数据库的连接和编程语言的选择。C#的功能很强大,这也是我以 后需要学习的课程,于是我毅然选择了它。再就是建立数据库系统的步骤,我的 经验就是要先总体规划,再局部整理。先做好总的界面,再通过该界面的布置一 步一步实现其功能!同时我体会到: 熟练的编程能力,对知识运用的强烈渴望及其创新和团队的合作 精神设做好一个大型数据库的基础。因此通过此次课程设计我明显感觉到自身的 不足,并希望以后能更加用心地运用所学知识和学习新的知识。 #include “stdio.h” /*I/O函数*/ # include “bios.h” /*ROM基本输入输出函数*/ #include “dos.h” /*dos接口函数*/ #include “conio.h” /*屏幕操作函数*/ #include “stdlib.h” /*其它说明*/ #include “string.h” /*字符串函数*/ #include “mem.h” /*内存操作函数*/ #include “ctype.h” /*字符操作函数*/ #include “alloc.h” /*动态地址分配函数*/ /****变量定义*******/ typedef struct z1 /*定义数据结构*/ { char no[11]; /*编号*/ char name[15];/*姓名*/ float jbgz; /*基本工资*/ float koukuan;/*扣款*/ float yfgz;/*应发工资*/ float shuijin;/*税金*/ float sfgz; /*实发工资*/ struct z1 *prior;/*前驱指针*/ struct z1 *next;/*后继指针*/ }SALARY; /*结构体类型名*/ struct z1 *First; /*双链表头指针*/ struct z1 *Last; /*双链表尾指针*/ /******函数原型*********/ void init(); /*初始化*/ void create();/*创建链表*/ void calc(); /*计算应发工资*/ void delete();/*删除*/ void search();/*查找*/ void save();/*保存文件*/ void load();/*读取文件*/ void computer();/*计算所需各种票面张数*/ void insert();/*插入*/ void append();/*追加*/ void copy();/*复制文件*/ void sort();/*排序*/ void index();/*索引*/ void total();/*分类合计*/ void list();/*显示所有数据*/ void print(SALARY *p);/*输出单条记录*/ void display();/*随意逐条显示*/ float fax(float x);/*计算税金*/ int menu_select();/*主菜单*/ /*******主函数开始**********/ main(){ int i; clrscr(); for(;;) { switch(menu_select()) /*调用菜单函数返回一个整数值*/ { case 0:init();break; /*初始化*/ case 1:create();break;/*输入数据创建双链表*/ case 2:list();break;/*显示所有数据*/ case 3:display();break;/*单条显示*/ case 4:calc();break;/*计算实发工资*/ case 5:search();break;/*查找职工信息数据*/ case 6:delete();break;/*删除记录*/ case 7:insert();break;/*插入记录*/ case 8:append();break;/*追加记录*/ case 9:save();break;/*保存文件*/ case 10:load();break;/*读取文件*/ case 11:copy();break;/*复制文件*/ case 12:sort();break;/*按实发工资升序排序*/ case 13:computer();break;/*计算所需票面数*/ case 14:index();break;/*按职工号索引*/ case 15:total();break;/*按部门求合计*/ case 16:exit(0); /*退出*/ } } } /*菜单函数,函数返回值为整型,代表所选的菜单项*/ menu_select(){ char *f[]= { /*定义菜单字符串数组*/ “**************MENU*************”, /*菜单的标题行*/ “ 0.init list”, /*初始化双链表*/ “ 1.Enter list”, /*输入数据,创建双链表*/ “ 2.List all n”, /*显示所有记录*/ “ 3.Display record by step”, /*显示单条记录*/ “ 4.Calc the salary”, /*计算实发工资*/ “ 5.Search record on name”, /*查找记录*/ “ 6.Delete a record”, /*删除记录*/ “ 7.Insert record to list”, /*插入记录*/ “ 8.Append record to file”, /*追加记录*/ “ 9.Save data to the file”, /*保存文件*/ “ 10.Load data from the file”,/*读取文件*/ “ 11.Copy the file to new file”, /*复制文件*/ “ 12.Sort on sfgz”, /*排序*/ “ 13.Computer ticket number”, /*计算所需票面数*/ “ 14.Index on number”, /*索引*/ “ 15.Total on number”, /*分类合计*/ “ 16.Quit” };/*退出*/ char s[80]; int i; int key=0;/*记录所压键值*/ int c=0; gotoxy(1,25);/*移动光标*/ printf(“press any key enter menu......n”);/*压任意键进入主菜单*/ getch(); clrscr();/*清屏*/ textcolor(YELLOW);/*设置文本颜色为黄色*/ textbackground(BLUE);/*设置背景颜色为兰色*/ gotoxy(10,2); putch(0xda);/*输出左上角边框┏*/ for(i=1;i<44;i++) putch(0xc4);/*输出上边框水平线*/ putch(0xbf);/*输出右上角边框 ┓*/ for(i=3;i<22;i++)/*输出左右两边的垂直线*/ { gotoxy(10,i);putch(0xb3); gotoxy(54,i);putch(0xb3); } gotoxy(10,22);putch(0xc0);/*输出左上角边框┗*/ for(i=1;i<44;i++) putch(0xc4);/*输出下边框水平线*/ putch(0xd9);/*输出右下角边框┛*/ window(11,3,53,21);/* 制作显示菜单的窗口,大小根据菜单条数设计*/ clrscr(); /*清屏*/ for(i=0;i<18;i++) { gotoxy(10,i+1); cprintf(“%s”,f[i]);/*输出菜单项数组*/ } i=1; gotoxy(10,2);/*设置默认选项在第一项*/ textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/ cprintf(“%s”,f[1]);/*输出菜单项,表示选中*/ gotoxy(10,2);/*移动光标到菜单的第一项*/ while(key!=13) /*所压键不是回车键时*/ { while(bioskey(1)==0);/*查询是否压下了一个键*/ key=bioskey(0); /*返回下一个在键盘压下的键*/ key=key&0xff?key&0xff:key>>8;/*对所压的键进行判断*/ gotoxy(10,i+1); textbackground(BLUE);/*设置背景颜色为蓝色*/ cprintf(“%s”,f[i]);/*输出菜单项*/ if(key==72)i=i==1?17:i-1;/*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/ if(key==80)i=i==17?1:i+1;/*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/ gotoxy(10,i+1);/*光标移动i的下一项*/ textbackground(LIGHTGREEN);/*将背景颜色设为浅绿*/ cprintf(“%s”,f[i]);/*输出菜单项*/ c=i-1;/*给代表菜单选项的整数赋值*/ } textbackground(BLACK);/*设置背景颜色为黑色*/ window(1,1,80,25);/*恢复原窗口大小*/ return c;/*返回代表菜单选项的整数值*/ } /*初始化函数*/ void init(){ First=NULL; Last=NULL;} /*输入数据,创建双链表*/ void create(){ int x;/*记录行坐标*/ int i;/*记录输入记录数*/ int flag=0;/*做结束标记*/ float temp; /*定义临时变量*/ SALARY *info,*p;/*定义临时变量*/ if(First!=NULL) init();/*如果头指针为空,调用初始化函数*/ p=First;/*从头指针开始*/ for(;;) { if(flag==1) break;/*如果flag=1,结束输入*/ i=0; x=0; /*确定移动的行坐标*/ clrscr();/*清屏*/ gotoxy(1,3); printf(“*************gongziguanli*************”);/*输出标题*/ gotoxy(1,4); printf(“ --Enter @ end--”);/*提示输入@结束*/ gotoxy(1,5); printf(“|-----|”);/*输出表格的起始线*/ gotoxy(1,6); printf(“| no | name | jbgz |”);/*输出字段标题,注意空格数*/ for(;;) { gotoxy(1,7+x); printf(“|----------|----------------|--------|”);/*输出表格的水平线*/ info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/ if(!info) { printf(“nout of memory”);/*如没有得到空间,输出内存溢出信息*/ exit(0);/*退出程序*/ } info->next=NULL;/*新结点的后继为空*/ info->prior=NULL;/*新结点的前驱为空*/ gotoxy(1,8+x);printf(“|”);/*输出数据间的分割线*/ gotoxy(12,8+x);printf(“|”); gotoxy(29,8+x);printf(“|”); gotoxy(38,8+x);printf(“|”); gotoxy(2,8+x);/*光标到输入编号位置*/ inputs(info->no,10);/*输入编号,并验证长度不超过10*/ if(info->no[0]=='@') { flag=1; break; } /*编号首字符为@结束输入*/ gotoxy(13,8+x);/*光标到输入姓名位置*/ inputs(info->name,14);/*输入姓名,并验证长度不超过14*/ gotoxy(30,8+x);/*光标到输入基本工资位置*/ scanf(“%f”,&temp);/*输入基本工资到临时变量*/ info->jbgz=temp;/*基本工资赋值*/ info->koukuan=0;/*初始扣款为0,待计算工资时输入*/ info->sfgz=0;/*初始实发工资为0,待计算工资时计算*/ info->shuijin=0;/*初始税金为0,待计算工资时计算*/ info->yfgz=0;/*初始应发工资为0,待计算工资时计算*/ if(p==NULL)/*如果p为空,说明输入的是第一个结点*/ { First=Last=info;/*头指针和尾指针*/ First->prior=NULL;/*头指针的前驱是空*/ Last->next=NULL;/*尾指针的后继是空*/ } else /*插入的结点不是第一结点,则插入在头结点之前*/ { info->next=p;/*新结点的后继指向原来的头结点*/ info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/ p->prior=info;/*原来结点的前驱指向新结点*/ } p=info;/*新结点变为p结点,暂时的头结点*/ First=info;/*新结点变为头结点*/ x+=2; /*因为水平线,将光标下移两行*/ gotoxy(1,8+x); i++; /*输入记录数加1*/ if(i%9==0) break;/*输入9个记录,换一页输入*/ } gotoxy(1,8+x); } printf(“|----------|----------------|--------|”);/*输出结尾水平线*/ } /*字符串输入和验证函数*/ inputs(char *s, int count){ char p[255]; do{ scanf(“%s”,p);/*输入字符串*/ if(strlen(p)>count)printf(“n too long!n”);/*进行长度校验,超过count值重输入*/ }while(strlen(p)>count); strcpy(s,p);/*将输入的字符串拷贝到字符串s中*/ } /*显示链表*/ void list(){ int i=0,n;/*记录输出行数*/ SALARY *p;/*定义移动指针*/ clrscr();/*清屏*/ p=First;/*从头指针开始*/ while(i%10==0&&p!=NULL)/*外循环控制换页*/ { i=0; /*记录一页的输出行数*/ clrscr(); /*清屏*/ printf(“nnn”);/*换行三次*/ printf(“*************************************SALARY***********************************n”); /*输出大标题*/ printf(“|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |n”);/*输出字段标题*/ printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*输出水平线*/ while(p!=NULL)/*当p不为空时*/ { printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”,p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz); p=p->next;/*指针后移*/ i++; /*输出行数加1 */ if(i%10==0) break;/*如果满10行,跳出内循环*/ } printf(“****************************************end***********************************n”);/*输出本页的结束行*/ printf(“Press any key congtinue...n”); getch();/*输出一页暂停一下,压任意键继续*/ } /*返回到外循环,准备下一页的输出*/ } /*单条显示记录*/ void display(){ int ch; /*菜单选项字符*/ SALARY *p;/*定义临时指针*/ clrscr();/*清屏*/ p=First;/*从头指针开始*/ if(p==NULL)/*指针为空,即链表为空,返回主函数*/ { printf(“record is empty!n”); return; } else { print(p); /*调用输出函数显示头结点信息*/ for(;;)/*循环开始*/ { printf(“nn0.Quit 1.Prior 2.Next 3.First 4.Last nn”);/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/ printf(“nplease select 0~4:”);/*提示输入菜单选项0~4*/ scanf(“%d”,&ch);/*输入菜单选项0~4*/ if(ch==0)break;/*如果选项为0,退出*/ switch(ch) /*开关语句根据选项字符判断*/ { case 1:p=p->prior;if(p==NULL)p=First;break;/*指向前驱,没有前驱指向第一个*/ case 2:p=p->next;if(p==NULL)p=Last;break;/*指向后继,没有后继指向最后一个*/ case 3:p=First;break;/*指向第一个结点*/ case 4:p=Last;break;/*指向最后一个结点*/ } print(p);/*调用输出函数显示指针所指结点信息*/ } } } /*输出指针所指结点信息*/ void print(SALARY *p){ if(p) /*如果指针不为空,则显示信息*/ { clrscr();/*清屏*/ printf(“nnn”);/*换行*/ printf(“************************************SALARY************************************n”);/*输出标题信息*/ printf(“|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |n”);/*输出字段标题*/ printf(“|----------|---------------|---------|---------|---------|---------|---------|n”);/*输出分割线*/ printf(“|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|n”, p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/ printf(“***************************************end***************************** *******n”);/*输出结束标记*/ } } /*计算实发工资*/ void calc(){ int x;/*行坐标*/ int i=0;/*记录数*/ float temp;/*临时变量扣款*/ SALARY *p;/*移动指针*/ clrscr(); /*清屏*/ p=First;/*从头指针开始*/ while(p!=NULL)/*当p不为空时,也就是有记录时,外循环控制换页*/ { x=0; clrscr(); gotoxy(1,3); printf(“***************************gongziguanli************************************”); /*输出标题*/ gotoxy(1,5); printf(“|------------|”); gotoxy(1,6);/*下面输出字段标题*/ printf(“| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |”); while(p!=NULL)/*当p不为空时,也就是有记录时,内循环控制处理9条*/ { gotoxy(1,7+x); printf(“|----------|----------------|--------|----------|--------|--------|--------|”); gotoxy(1,8+x);printf(“|”); gotoxy(12,8+x);printf(“|”); gotoxy(29,8+x);printf(“|”); gotoxy(38,8+x);printf(“|”); gotoxy(49,8+x);printf(“|”); gotoxy(58,8+x);printf(“|”); gotoxy(67,8+x);printf(“|”); gotoxy(76,8+x);printf(“|”); gotoxy(2,8+x); printf(“%-10s”,p->no);/*输出编号*/ gotoxy(13,8+x); printf(“%-15s”,p->name);/*输出姓名*/ gotoxy(30,8+x); printf(“%.2f”,p->jbgz);/*输出基本工资*/ gotoxy(39,8+x); scanf(“%f”,&temp);/*输入扣款*/ p->koukuan=temp;/*扣款字段赋值*/ p->yfgz=p->jbgz-p->koukuan;/*计算应发工资=基本工资-扣款*/ gotoxy(50,8+x); printf(“%.2f”,p->yfgz);/*输出应发工资*/ gotoxy(59,8+x); p->shuijin=(p->yfgz-1000)*fax(p->yfgz);/*否则按税率计算税金*/ printf(“%.2f”,p->shuijin);/*输出税金*/ gotoxy(68,8+x); p->sfgz=p->yfgz-p->shuijin;/*计算实发工资*/ printf(“%-8.2f”,p->sfgz);/*输出实发工资*/ x+=2; /*行坐标下移两行*/ i++; /*记录数加1*/ if(i%9==0)break;/*记录数超过9条,跳出内循环*/ p=p->next; /*指针后移,处理下一条*/ } gotoxy(1,7+x); printf(“|----------|----------------|--------|----------|--------|--------|--------|n”);/*输出结束行*/ printf(“Press any key congtinue...n”); getch(); } } /*根据应发工资,计算税率*/ float fax(float x){ float f1; if(x<1000) return 0; /*小于1000,返回0*/ switch((int)(x/1000)) { case 1:f1=0.05;break;/*1000~1999,返回0.05*/ case 2:f1=0.1;break;/*2000~2999,返回0.1*/ case 3:f1=0.15;break;/*3000~3999,返回0.15*/ case 4:f1=0.2;break;/*4000~4999,返回0.2*/ default:f1=0.3;break;/*5000以上,返回0.3*/ } return f1;} /*计算票面张数*/ void computer(){ SALARY *p; int i=0,a[7]={0},t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/ float t; /*过渡变量,保存当前剩余工资*/ p=First;/*移动指针从头指针开始*/ while(p!=NULL)/*当p不为空时*/ { t100=(int)p->sfgz/100;/*计算100元张数*/ a[0]=a[0]+t100; /*累加保存*/ t=p->sfgz-t100*100;/*剩余工资*/ t50=(int)(t/50);/*计算50元张数*/ a[1]=a[1]+t50;/*累加保存*/ t=t-t50*50;/*剩余工资*/ t20=(int)(t/20); /*计算20元张数*/ a[2]=a[2]+t20;/*累加保存*/ t=t-t20*20;/*剩余工资*/ t10=(int)(t/10);/*计算10元张数*/ a[3]=a[3]+t10;/*累加保存*/ t=t-t10*10;/*剩余工资*/ t5=(int)(t/5);/*计算5元张数*/ a[4]=a[4]+t5;/*累加保存*/ t=t-t5*5;/*剩余工资*/ t2=(int)(t/2);/*计算2元张数*/ a[5]=a[5]+t2;/*累加保存*/ t=t-t2*2;/*剩余工资*/ t1=(int)(t);/*计算1元张数*/ a[6]=a[6]+t1;/*累加保存*/ p=p->next;/*指针后移,处理下一条记录*/ } clrscr();/*清屏*/ printf(“nnn***********ticket number***************n”);/*输出标题*/ printf(“--100-----50------20-----10-----5------2------1------n”); /*输出张数标题*/ for(i=0;i<7;i++) printf(“%5d ”,a[i]);/*输出所需的张数*/ printf(“n”);/*换行*/ } /*按编号查找记录*/ SALARY *find(char *no){ SALARY *p;/*定义移动指针*/ p=First;/*从头指针开始*/ while(p)/*当p不为空时*/ { if(!strcmp(no,p->no)) return p;/*比较相等,查找成功,返回指针*/ p=p->next;/*不相等指针后移*/ } printf(“not foundn”);/*没有找到*/ return NULL;/*返回为空指针*/ } /*删除结点*/ void delete(){ SALARY *p;/*定义临时变量,p指向要删除的结点p*/ char s[11];/*要删除结点的编号*/ clrscr();/*清屏*/ printf(“please deleted non”);/*提示输入信息*/ scanf(“%s”,s); /*输入要删除的职工编号*/ if((p=find(s))!=NULL)/*调用查找函数,如果找到做下面的处理*/ { if(First==p) /*如果是第一个结点*/ { First=p->next;/*将头指针指向其后继结点*/ if(First) /*如头指针不为空*/ First->prior=NULL;/*将头结点的前驱设为空*/ else Last=NULL; /*否则头为空,尾也为空*/ } else /*删除的不是第一个结点*/ { p->prior->next=p->next;/*p的前驱的后继指向p原来的后继*/ if(p!=Last) /*如果p不是最后个结点*/ p->next->prior=p->prior;/*p后继的前驱指向p原来的前驱*/ else Last=p->prior;/*如p是最后一个结点,修改尾指针为p的前驱*/ } free(p);/*删除结点后,不要忘记释放空间*/ printf(“n have deleted %s SALARYn”,s); printf(“Don't forget saven”); } } /*按姓名查找结点*/ void search(){ SALARY *p;/*移动指针*/ char s[15];/*保存姓名*/ clrscr();/*清屏*/ printf(“please enter name for searchn”);/*提示输入*/ scanf(“%s”,s);/*输入要查找人的姓名*/ p=First;/*移动指针从头指针开始*/ while(strcmp(p->name,s)&&p!=NULL)/*做比较判断*/ p=p->next; /*没找到,指针后移继续查找*/ if(p==NULL)/*指针为空,说明没有找到*/ printf(“nlist no %s SALARYn”,s);/*显示没找到信息*/ else { printf(“nn”);/*换行*/ print(p);/*查找成功,调用输出函数输出指针p所指记录*/ } } /*插入结点*/ void insert(){ SALARY *p,*info;/* info为新结点,p为新结点的后继*/ char s[11];/*保存查找的姓名*/ float temp;/*临时变量*/ clrscr();/*清屏*/ printf(“please enter location before the non”);/*提示输入在哪个结点之前插入*/ scanf(“%s”,s);/*输入指定结点的编号*/ printf(“nplease new recordn”);/*提示输入记录*/ clrscr();/*清屏*/ gotoxy(1,3);/*定位光标,按表格形式输入新结点信息*/ printf(“**************gongziguanli************”); gotoxy(1,5); printf(“|-----|”); gotoxy(1,6); printf(“| no | name | jbgz | ”); gotoxy(1,7); printf(“|----------|----------------|--------|”); info=(SALARY *)malloc(sizeof(SALARY));/*申请空间*/ if(!info) { printf(“nout of memory”);/*如没有得到空间,内存溢出*/ exit(0);/*退出程序*/ } info->next=NULL;/*新结点的后继为空*/ info->prior=NULL;/*新结点的前驱为空*/ gotoxy(1,8);printf(“|”); gotoxy(12,8);printf(“|”); gotoxy(29,8);printf(“|”); gotoxy(38,8);printf(“|”); gotoxy(2,8); inputs(info->no,10);/*输入新结点的编号,并校验*/ gotoxy(13,8); inputs(info->name,14);/*输入新结点的姓名,并校验*/ gotoxy(30,8); scanf(“%f”,&temp); /*输入基本工资*/ info->jbgz=temp;/*给基本工资字段赋值*/ info->koukuan=0;/*扣款初始为0*/ info->yfgz=0;/*应发工资初始为0*/ info->shuijin=0;/*税金初始为0*/ info->sfgz=0;/*实发工资初始为0*/ printf(“|----------|----------------|--------|”); p=First;/*移动指针从头指针开始*/ while(strcmp(p->no,s)&&p!=NULL)/*查找结点确定插入位置*/ p=p->next;/*指针后移,继续查找*/ if(p==NULL)/*如p为空*/ if(p==First)/*如p为头指针,说明链表为空*/ { First=info;/*新结点为头指针*/ First->prior=NULL;/*头结点的前驱为空*/ Last=First;/*唯一结点,尾指针等于头指针*/ } else /*新结点插在尾部*/ { Last->next=info; info->prior=Last; Last=info;/*尾指针指向新结点*/ } else if(p==First)/*p不为空,但p为头指针,新结点插在第一个结点位置*/ { info->prior=NULL;/*新结点的前驱为空*/ info->next=p;/*新结点的后继为p*/ p->prior=info;/*p的前驱是新结点*/ First=info;/*修改头指针指向新结点*/ } else /*新结点插入在中间某一个位置p之前*/ { info->next=p;/*新结点的后继是p*/ info->prior= p->prior;/*新结点的前驱是p的前驱*/ p->prior->next=info;/*p的前驱的后继是新结点*/ p->prior=info;/*p的前驱是新结点*/ } printf(“nnn----have inserted %s SALARY----n”,info->name); printf(“n---Don't forget save---n”);/*提醒调用保存文件存盘*/ } /*保存文件*/ void save(){ FILE *fp;/*定义指向文件的指针*/ SALARY *p;/*定义移动指针*/ char outfile[10];/*保存输出文件名*/ clrscr();/*清屏*/ printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示输入文件名格式信息*/ scanf(“%s”,outfile); if((fp=fopen(outfile,“wb”))==NULL)/*为输出打开一个二进制文件*/ { printf(“can not open filen”); return;/*返回*/ } printf(“nSaving file......n”); p=First;/*移动指针从头指针开始*/ while(p!=NULL)/*如p不为空*/ { fwrite(p,sizeof(SALARY),1,fp);/*写入一条记录*/ p=p->next;/*指针后移,处理下一条记录*/ } fclose(fp);/*关闭文件*/ printf(“-----save success!-----n”);/*显示保存成功*/ } /*读文件*/ void load(){ SALARY *p,*q=NULL;/*定义记录指针变量*/ FILE *fp;/* 定义指向文件的指针*/ char infile[10];/*保存文件名*/ clrscr();/*清屏*/ printf(“Enter infile name,for example c:f1 e.txt:n”);/*输入文件名格式*/ scanf(“%s”,infile);/*输入文件名*/ if((fp=fopen(infile,“rb”))==NULL)/*打开一个二进制文件,为读方式*/ { printf(“can not open filen”);/*如不能打开,则结束程序*/ return;/*返回*/ } while(First)/*当表不为空时,清空链表*/ { p=First;/*从头指针开始*/ First=First->next;/*删除头结点*/ free(p);/*释放空间*/ } printf(“n-----Loading file!-----n”);/*显示正在读文件*/ First=(SALARY *)malloc(sizeof(SALARY));/*为头指针申请空间*/ if(!First)/*如果没有得到空间 显示内存溢出*/ { printf(“out of memory!n”); return;/*返回*/ } p=First;/*将头指针赋值给p*/ while(!feof(fp))/*当文件不空时*/ { if(1!=fread(p,sizeof(SALARY),1,fp))break;/*将记录读到p所指的结点*/ p->next=(SALARY *)malloc(sizeof(SALARY));/*为p的后继申请空间*/ if(!p->next)/*如果没有得到空间显示内存溢出*/ { printf(“out of memory!n”); return;/*返回*/ } p->prior=q;/*得到空间,则链接指针关系p的前驱为q*/ q=p;/*保存p做为新的p结点的前驱*/ p=p->next;/*p指针后移*/ } q->next=NULL;/*q的后继为空*/ Last=q;/*尾指针为q*/ First->prior=NULL;/*头指针的前驱为空*/ fclose(fp);/*关闭文件*/ printf(“---You have success read data from file!!---n”);/*显示成功读入记录*/ } /*追加记录*/ void append(){ FILE *fp; /*定义指向文件的指针*/ SALARY *info;/*指向追加信息的指针*/ char infile[10];/*保存文件名*/ float temp;/*临时变量*/ clrscr();/*清屏*/ gotoxy(1,3); printf(“**************gongziguanli************”); gotoxy(1,5); printf(“|-----|”); gotoxy(1,6); printf(“| no | name | jbgz | ”); gotoxy(1,7); printf(“|----------|----------------|--------|”); info=(SALARY *)malloc(sizeof(SALARY));/*申请追加信息的空间*/ if(!info) { printf(“nout of memory”);/*没有空间,内存溢出*/ exit(0);/*结束程序*/ } info->next=NULL;/*新信息的后继为空*/ info->prior=NULL;/*新信息的前驱为空*/ gotoxy(1,8);printf(“|”); gotoxy(12,8);printf(“|”); gotoxy(29,8);printf(“|”); gotoxy(38,8);printf(“|”); gotoxy(2,8); inputs(info->no,10);/*输入编号并校验*/ gotoxy(13,8); inputs(info->name,14);/*输入姓名并校验*/ gotoxy(30,8); scanf(“%f”,&temp);/*输入基本工资*/ info->jbgz=temp; info->koukuan=0;/*扣款为0*/ info->yfgz=0;/*应发工资为0*/ info->shuijin=0;/*税金为0*/ info->sfgz=0;/*实发工资为0*/ printf(“|----------|----------------|--------|”); printf(“nnnEnter infile name,for example c:f1 e.txt:n”);/*提示输入文件名*/ scanf(“%s”,infile); if((fp=fopen(infile,“ab”))==NULL)/*打开文件*/ { printf(“can not open filen”); return;/*返回*/ } printf(“n-----Appending record!-----n”); if(1!=fwrite(info,sizeof(SALARY),1,fp))/*向文件中追加记录*/ { printf(“-----file write error!-----n”);/*写函数返回值不为1,说明写入错误*/ return;/*返回*/ } printf(“-----append sucess!----n”);/*显示追加成功*/ fclose(fp);/*关闭文件*/ } /*文件复制*/ void copy(){ char outfile[10],infile[10];/*保存源文件名和目标文件名*/ FILE *sfp,*tfp;/*定义指向源文件和目标文件的指针*/ SALARY *p=NULL;/*定义临时指针,暂存读出的记录*/ clrscr(); printf(“Enter infile name,for example c:f1 e.txt:n”); scanf(“%s”,infile);/*输入源文件名*/ if((sfp=fopen(infile,“rb”))==NULL)/*二进制读方式打开源文件*/ { printf(“can not open input filen”);/*显示不能打开文件信息*/ return;/*返回*/ } printf(“Enter outfile name,for example c:f1 e.txt:n”);/*提示输入目标文件名*/ scanf(“%s”,outfile);/*输入目标文件名*/ if((tfp=fopen(outfile,“wb”))==NULL)/*二进制写方式打开目标文件*/ { printf(“can not open output file n”); return; } while(!feof(sfp))/*读文件直到文件尾*/ { if(1!=fread(p,sizeof(SALARY),1,sfp)) break;/*块读*/ fwrite(p,sizeof(SALARY),1,tfp);/*块写*/ } fclose(sfp);/*关闭源文件*/ fclose(tfp);/*关闭目标文件*/ printf(“you have success copy file!!n”);/*显示成功拷贝*/ } /*排序*/ void sort(){ SALARY *p0,*p00,*p1,*p11,*p2;/*定义临时指针*/ int i=1;/*统计当前排第几个结点*/ clrscr();/*清屏*/ printf(“nn start sort....n”);/*开始排序*/ p1=p11=p2=First; while(p1!=NULL)/*当p1不为空时*/ { p0=p1; /*待比较结点从p1开始*/ p2=p1; /*p2从当前待排序位置开始*/ while(p2->next!=NULL)/*p2的后继不为空时*/ { if(p0->sfgz>p2->next->sfgz)/*找当前最小结点*/ { p00=p2; /*找到当前最小结点记录其前驱指针*/ p0=p2->next;/*记录当前最小值结点的指针p0*/ } p2=p2->next;/*指针后移*/ } Last=p0;/*当前最小结点为尾结点*/ if(p1!=p0)/*判断最小结点是否是当前排序位置,不是则作指针修改*/ { p00->next=p0->next;/*将p00的后继指向p0的后继*/ p0->next->prior=p00;/*p0的后继的前驱为p00*/ p0->next=p1;/*p0的后继指向下个排序位置p1*/ p1->prior=p0;/*p1的前驱为p0*/ if(i==1) { First=p0; /*作头指针*/ First->prior=NULL;/*头指针的前驱为空*/ } else /*不是第一个结点*/ { p11->next=p0; /*p11的后继指向p0*/ p0->prior=p11;/*p0的前驱指向p11*/ } p11=p1=p0;/*因p0是排好序的最后一个结点,p1是下一个将要排序的位置,所以将p0赋值给p1和p11*/ } i++;/*排好序的结点数加1*/ p1=p1->next;/*p1后移指向下一个待排序位置*/ } printf(“sort sucess!!n”);/*输出排序成功*/ } /*索引*/ void index(){ SALARY *p,*q,*t,*h1;/*定义临时指针*/ clrscr();/*清屏*/ printf(“nn start index.....nn”);/*显示开始索引*/ h1=First->next;/*将原表的头指针所指的下一个结点作头指针*/ First->next=NULL;/*第一个结点为新表的头结点*/ Last=First;/*尾指针等于头指针*/ while(h1!=NULL)/*当原表不为空时,进行排序*/ { t=h1;/*取原表的头结点*/ h1=h1->next;/*原表头结点指针后移*/ p=First;/*设定移动指针p,从头指针开始*/ q=First;/*设定移动指针q做为p的前驱,初值为头指针*/ while(strcmp(t->no,p->no)>0&&p!=NULL)/*作编号比较*/ { q=p;/*待排序点值大,应往后插,所以新表指针后移*/ p=p->next; } if(p==q)/*p==q,说明待排序点值小,应排在首位*/ { t->next=p;/*待排序点的后继为p*/ p->prior=t;/*p的前驱结点指向待排序结点*/ First=t;/*新头结点为待排序点*/ First->prior=NULL;/*头指针的前驱为空*/ } else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/ { t->next=p;/*t的后继是p*/ t->prior=q;/*t的前驱是q*/ q->next=t;/*q的后继是t*/ if(p==NULL)/*判p是否为空*/ Last=t; /*将t赋值为尾指针*/ else p->prior=t;/*否则将t赋值给p的前驱*/ } } printf(“index sucess!!n”);/*索引排序成功*/ } /*分类合计*/ void total(){ struct t1 /*定义结构体保存合计数据*/ { char u[7];/*部门*/ float s; /*合计实发工资*/ }unit[20]; /*定义一个单位部门数不超过20个*/ SALARY *p,*q;/*定义临时指针变量*/ char sno[7],qno[7],*ptr;/*保存部门号*/ float s1;/*保存合计值*/ int i,j;/*控制变量*/ p=First;/*从指针开始*/ i=0;/*统计部门数*/ clrscr();/*清屏*/ while(p!=NULL)/*当p不为空时做下面的处理*/ { memcpy(sno,p->no,6);/*从编号中取出部门号*/ sno[6]=' ';/*做字符串结束标记*/ q=p->next;/*将指针指向待比较的记录*/ s1=p->sfgz;/*当前部门的实发工资初值作为该部门合计值的初值*/ while(q!=NULL)/*内循环开始*/ { memcpy(qno,q->no,6);/*读部门号*/ qno[6]=' ';/*做字符串结束标记*/ if(strcmp(qno,sno)==0)/*比较部门号*/ { s1+=q->sfgz;/*累加实发工资*/ q=q->next;/*指针指向下一条记录*/ } else break;/*不是一个部门的结束本次内循环*/ } strcpy(unit[i].u,sno);/*将部门号写入部门结构体数组中*/ unit[i].s=s1; /*将实发工资写入部门结构体数组中*/ i++; /*部门数累加*/ if(q==NULL)/*如果q为空,跳出循环*/ break; else p=q; /*否则,将q赋值给p*/ } printf(“nn**************Total table**************n”);/*输出合计标题*/ printf(“n--no-------unit------------total---------n”);/*输出序号、部门、合计字段标题*/ for(j=0;j printf(“ %d %s %10.2fn”,j,unit[j].u,unit[j].s);/*输出合计值*/ printf(“---------n”);} 目 录 目录...............................................................................................................第一章 绪 论.................................................................................................1.1 开发背景说明....................................................................................1.2课程设计目的.....................................................................................1.3课程题目及内容.................................................................................1.4课程设计要求.....................................................................................1.5预期目标.............................................................................................1.6 系统环境............................................................................................第二章 可行性分析.........................................................................................2.1 可行性研究前提................................................................................2.2 经济上可行性....................................................................................2.3 技术可行性........................................................................................2.4目标方案可行性.................................................................................2.5操作可行性.........................................................................................第三章 需求分析.............................................................................................3.1引言.....................................................................................................3.2任务陈述.............................................................................................3.3市场需求分析.....................................................................................3.4系统功能需求分析.............................................................................3.5系统性能需求分析.............................................................................3.6 系统业务数据流...................................................错误!未定义书签。3.7用例分析...........................................................................................3.8用例列表...........................................................................................3.9绘制系统模型图...............................................................................第四章 系统概要设计...................................................................................4.1模块分析和概要设计.......................................................................4.2 系统数据库逻辑结构设计..............................................................4.3概念模型转换为关系数据模型.......................................................4.4 数据库设计......................................................................................第五章 详细设计...........................................................................................5.1登录管理...........................................................................................-***39424243443 入帐目时的错误,可以根据职工的考勤、职务、部门、各种税费等等,自动求出工资。为了便于企业领导掌握本企业的工资信息在系统中应加入各种查询功能,包括个人信息、职工工资、本企业内某一个月或某一部门的工资情况查询。系统应能输出各类统计报表。 本系统需要完成的功能主要有:系统数据初始化;职工基本信息数据的输入、修改、删除;企业工资的基本设定;职工工资的浏览;职工个人工资表的查询;职工工资的计算;工资报表打印。 数据流: 职工基本状况:包括职工编号、职工姓名、性别、年龄、职位等。工资级别和工资金额:包括工资等级、工资额。 企业部门及工作岗位信息:包括部门名称、工作岗位名称、工作岗位工资等。工资信息:包括职工编号、职工姓名、职工基本工资、职工岗位工资、职工工龄工资、公司津贴、职工实发工资等。工龄和工资金额:包括工龄及对应工资额。 1.4课程设计要求 坚持“规格严格,功夫到家”的优良传统,加强基本功训练,做到理论与实际相结合,继承与创新相结合,充分发挥学生的主观能动性与教师因材施教、严格要求相结合,抓智力因素教育与非智力因素教育相结合,教书育人。所设计的工资管理系统应包含输入输出、修改、删除、查询等基本功能。根据题目的基本需求,画出流程图、用例图、类图等,编写程序,并写出详细的设计说明书。课程设计过程中,要严格遵守课程设计的时间安排,听从指导教师的指导。正确地完成上述内容,规范完整地撰写出课程设计报告。 1.5预期目标 计划设计:对于企、事业单位的工资发放来说,不需要太大型的数据库系统,只需要一个操作方便,功能实用,能满足财务部门对工资及时的发放。本工资管理系统预期目标就是实现如下的一些功能:查询浏览记录功能,增加记录功能、修改记录功能、删除记录功能、刷新记录功能、最后实现统计计算功能。 1.6 系统环境 1.6.1硬件:个人PC 1.6.2软件: Windows XP、Microsoft Visual C++6.0、Rational Rose。 第二章 可行性分析 2.1 可行性研究前提 要求:满足对工资管理的基本要求及功能,并对职工信息收集、处理、保存。目标:实现无纸化办公,节省成本,提高工作效率。 条件、假定、限制:当企业工资管理的信息量和复杂程度达到某一限度时,即管理人员的劳动强度超过其承受能力时,就必须采用新的管理手段,如用计算机技术对信息的收集、加工、传递和存贮等,这样,一个工资管理系统就可以对企业职工工资进行高效、合理、恰当地管理。 2.2 经济上可行性 开发成本要低廉。 效益:大幅度地提高工资管理信息系统的工作质量和效率,让企业掌握整个工资管理系统的全面情况,为管理人员提供了准确的工资管理信息,促进工资管理工作的规范化及各项管理制度与指标体系的建立和健全;提供各种加工处理了的工资管理信息,以满足工资管理的特殊要求,适应新形势对职工队伍提出的新要求。 效益/投资比:暂时无法估算。投资回收期内: (1)企业有能力承担系统开发费用。 (2)新系统将为企业带来经济效益。管理系统是一个信息化、智能化和先进。理理念的集合体。而管理是一个动态过程,在其运行过程中要采取多项措施。其最主要的表现就是减少了企业管理费用和人力开支。 2.3 技术可行性 (1)软件需求:操作系统WINDOWS 2000 Advance Server以上。 硬件需求:赛扬1.7G CPU、512M内存 80G硬盘的计算机。(2)本系统采用VC++实现,依靠其强大的面向对象系统,与数据库管理系统相结合。 (3)要求掌握计算机技术,熟悉系统的功能和使用方法使系统能够顺利运行。 2.4目标方案可行性 计算机设备处理繁杂的工资增减问题,大幅度减少人力、物力,极大地提高企业的管理水平和管理效率。 管理水平和管理效率的提高能直接产生经济效益。 格,如完成任务表、考勤表、考核表、职工当月的扣款情况(包括水电费、病事假扣款等)等计算职工变动工资、个人所得税和应发放工资等,编制工资单。按类进行汇总,编制工资汇总表。将实发工资转入代发银行,由银行代发工资,并进行账务处理。工资结算过程主要设计如下会计账户:现金、银行存款、应付工资、其他应付款、其他应收款等。 3.3市场需求分析 工资管理系统是一个企业单位不可或缺的部分,他能为用户提供充足的信息和快捷的查询手段。一个工资管理系统可以高效能、大容量的收集、处理、存储工资管理信息,大幅度的工资管理信息系统的工作质量和效率。 能够为企业管理人员及时掌握整个工资管理系统的全面情况,提供系统的准确的工资管理信息,可以促进工资管理工作的规范化及各项管理制度与指标体系的建立和健全。为企业提供各种加工管理了工资管理信息,以满足工资管理的特殊要求,适应新形势对职工队伍建设提出的新要求,帮助管理人员选择方案,实现优化决策。虽然当前,不少单位的工资管理部门对于计算机应用还仅限于简单的单机应用,随着时间的推移、任务的复杂、用户的需求,其应用还会扩大。 3.4系统功能需求分析 工资管理系统涉及到员工基本信息的录入、修改和删除,工资标准的设定、查询和结算等。 典型的工资管理系统主要有以下基本功能: a)系统数据初始化 b)员工基本信息的录入、修改、删除等功能 c)工资标准的设定功能,集体包括职务工资、职称工资、其他工资标准和福利的设定。 d)工资信息的浏览 e)员工工资信息表的创建及查询 f)工资调整管理 g)工资计算 h)工资报表打印 3.5系统性能需求分析 3.5.1 需求分析总体目标 需求分析的目的在于与开发人员与用户之间达成系统开发的共识,使开发人员所考虑的系统在功能(系统能做什么)、简单操作,良好界面,个人信息保密性,系统安全与稳定,良好帐户管理,友好信息返回模式(如报表及打印功能)。 时,防止数据被不法分析任意的修改和破坏,对所有的敏感数据均进行基于SSL协议 的加密操作,只有对信息解密的人员才能最终读取数据信息。这样,能 最大程度的防止数据在传输过程的安全保密性。 3.6 系统业务数据流 3.6.1 数据流分析 数据流程图是一种能全面描述信息系统逻辑模型的主要工具,也是系统分析人员与用户进行交流的有效手段。本系统的数据流程图把握住对系统总体目标与总体功能的要求,基于上述的业务流程图,从科学性,合理性和可行性入手,采用自顶向下,逐层分解的方法建立本管理信息系统的逻辑模型,综合地反映出信息在本系统中的流动,处理和存储,具有抽象性和概括性.通过进行用户调查收集用户需求后,就要对用户需求进行分析,并表达用户的需求。采用结构化分析方法,主要采用数据流图对用户需求进行分析,用数字字典和加工说明对数据流图进行补充和说明。数据流图用于描述系统中数据流动的过程,反映的是加工处理的对象。 3.6.2 流程图,模块图如下: 流程图 模块图 112 3.9.2活动图: 分析用例中的逻辑流程,描述用例的事件流,进而画出各用例对应的活动图 用户登录活动图: 管理员工信息活动图: 3.9.3 类图: 类图是面向对象的软件开发中的一个核心概念。Rose中的类图用于描述软件系统中涉及到的类的相关信息,以及类与类之间的相互关系。 〔1〕类的识别 类的识别通常由分析员在分析问题域的基础上来完成。常用的方法有: a.名词识别法。 b.系统识别法。 c.从用例中识别类。 d.利用分解与抽象技术。〔2〕系统类图 3.9.4状态图: 状态图(State Diagram)用来描述一个特定对象的所有可能状态及其引起状态转移的事件。 3.9.5 时序图: 时序图用来描述对象之间动态的交互关系,着重体现对象间消息传送消息的时间顺序。下面分别给出各个用例的时序图: 用户登录时序图: 职工时序图: 71819 设计一般分为三个步骤: 〔1〕概念模型转换为关系数据模型。〔2〕关系模型的优化。〔3〕设计用户子模式书号。 4.3概念模型转换为关系数据模型 一般转换原则如下: 〔1〕一个实体转换为一个表(Table),则实体的属性转换为表的列(Column),实体的码转换为表的主键(Primary Key)。 〔2〕实体间的联系根据联系的类型,转换如下: ① 1:n 的联系: 1:n 的联系是比较普遍的联系,其转换比较直观。转换规律是在n 端的实体对应的表中增加属性,该属性是1 端实体对应表的主码。如:岗位和员工的关系是1:n 的联系。 ② m:n 的联系: 通过引进一个新表来表达两个实体间多对多的联系,新表的主码由联系两端实体的主码组合而成,同时增加相关的联系属性。如:部门与员工的联系是n:m 联系。 4.4 数据库设计 数据库的物理结构设计是指为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法),它完全取决于给定的计算机系统。物理结构可分两步进行。第一步是分析所得到的各种数据模型,依据在实际执行时可能产生的数据容量以及各种数据模型之间的相互依赖程度等,确定数据库的物理结构;第二步则要根据某种方法对所设计的物理结构进行评价,评价重点是时间和空间的效率。数据库实施是指建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。 根据人员规模,我们只建立起一个数据库,在此数据库基础上建立起如下表: ·职工表 ·用户表 ·工资表 下面说明各表的字段名称和数据类型: 工资表: 职工表: 用户表: 第五章 详细设计 详细设计阶段主要是将系统中的每个模块完成的功能进行具体描述。 5.1登录管理 根据系统总体结构可以得出登录管理模块实现用户登录、密码修改和退出系统三个功能。其中,退出系统实现流程很容易,只需要一行代码即可;用户登录的实现流程是用户在登录窗口输入用户名称和密码,如果没有用户名和密码可以进行注册后再登录,选择了用户角色后,单击【登录】按钮进行提交,系统开始验证用户提交的登录信息是否正确。如果正确,则打开工资管理系统,并根据用户角色赋于相应的操作权限;否则给出错误信息。 5.1.1界面设计 登录界面如下: 5.1.2 代码 部分核心代码设计: void CZHUCE::OnButton1(){ UpdateData(TRUE);if(m_username.IsEmpty()||m_password.IsEmpty()||m_password2.IsEmpty()){AfxMessageBox(“请将资料填写完整!”);m_password2.Empty(); m_password.Empty(); UpdateData(FALSE); return;} OnInitADOConn();if(m_password2==m_password){ CString str; str.Format(“insert into 用户表(用户名,密码)('%s','%s')”,m_username,m_password); _variant_t var; int fieldrow; try{//捕捉表的主键存在重复值的异常 m_pConnection->Execute((_bstr_t)str,&var,adCmdText); fieldrow=(int)V_I2(&var); } catch(...) { AfxMessageBox(“用户名已存在,注册失败”); m_username.Empty(); m_password.Empty(); m_password2.Empty(); UpdateData(FALSE); return;} AfxMessageBox(“注册成功,请返回登录!”); m_pConnection->Close(); Clogin clg; clg.DoModal();} else{AfxMessageBox(“两次密码输入不一样,注册失败!”); m_username.Empty(); m_password.Empty();m_password2.Empty(); }} UpdateData(FALSE);return;void CZHUCE::OnInitADOConn()try {//创建连接对象实例 } catch(_com_error e){ AfxMessageBox(e.Description());m_pConnection.CreateInstance(“ADODB.Connection”);//设置连接字符串 Cstring strConnect=“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salary.mdb;Persist Security Info=False;”;//使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,“",”“,adModeUnknown); } try{if(m_pConnection==NULL){OnInitADOConn();} m_pRecordset.CreateInstance(__uuidof(Recordset));m_pRecordset->Open(sqlstr,m_pConnection.GetInterfacePtr(),adOpenDyna } catch(_com_error e){ e.Description();} return m_pRecordset; mic,adLockOptimistic,adCmdText); 5.1.3修改密码模块: 成功登录主界面: 5.2用户管理 用户管理模块用于实现用户的添加、删除、更新功能。5.2.1新增用户模块: 627UpdateData(TRUE);if(m_Bianhao.IsEmpty()||m_Name.IsEmpty()){AfxMessageBox(”not null“);return;} OnInitADOConn();CString str;str.Format(”update 职工表 set 性别='%s',年龄=%d,电话='%s',住址='%s',位='%s',备 注 ='%s' where 职 工 编 号='%s'“,m_Sex,m_Age,m_Telphone,m_Address,m_Zhiwei,m_Beizhu,m_Bianhao);m_pConnection->Execute((_bstr_t)str,NULL,adCmdText);m_pConnection->Close();m_zhglist.DeleteAllItems();AddToGrid();ClearAll();UpdateData(FALSE); {// TODO: Add your control notification handler code here } void CGXZHG::OnButton4(){ UpdateData(TRUE);if(m_tiaojian.IsEmpty()){AfxMessageBox(”请选择删除的职工!“);return;} OnInitADOConn();CString bstrSQL;bstrSQL.Format(”delete from 职工表 where 职工编号CMAKESURE cmake;if(cmake.DoModal()!=IDOK){ } m_pConnection->Execute((_bstr_t)bstrSQL,NULL,adCmdText);m_pConnection->Close();m_zhglist.DeleteAllItems();AddToGrid();ClearAll();AfxMessageBox(“删除成功!”);UpdateData(FALSE);return;='%s'“,m_tiaojian);UpdateData(TRUE);m_type.GetWindowText(m_Type);if(m_Type.IsEmpty()){AfxMessageBox(”请选择查询的方式!“);return;} if(m_tiaojian.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql; 部分核心代码如下: void CTXGZ::OnButton2() {// TODO: Add your control notification handler code here 息!”); if(m_Bianhao.IsEmpty()||m_Jibengz==NULL||m_Yuefen.IsEmpty()){AfxMessageBox(“编号不允许空值,请重新填写!”);ClearALL();return;} OnInitADOConn();float CString cstr1;cstr1.Format(“%.2f”,f1);m_yfsh.SetWindowText(cstr1);float f2=m_Fangzu+m_Chuxu+m_Huifei;CString cstr2;cstr2.Format(“%.2f”,f2);m_yksh.SetWindowText(cstr2);float f4;f4=calculator(f1-f2);float f3=f1-f2-f4;CString cstr3;cstr3.Format(“%.2f”,f3);m_shfsh.SetWindowText(cstr3);CString cstr4;cstr4.Format(“%.2f”,f4);m_grsdsh.SetWindowText(cstr4);CString str;str.Format(“insert into 工 资 表 values UpdateData(TRUE);m_yuefen.SetCurSel(0);// AfxMessageBox(”该编号的职工不存在,请先到职工管理添加职工信f1=m_Jibengz+m_Jintie+m_Gangtie+m_Butie+m_Fangtie+m_Jiaotongbt;('%s','%s',%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f)“,m_ } void CTXGZ::ClearALL(){ } void CTXGZ::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult){// TODO: Add your control notification handler code here m_pConnection->Close();m_gzlist.DeleteAllItems();AddToGrid();m_yuefen.SetCurSel(0);ClearALL();m_Jibengz=NULL;m_Jintie=NULL; m_Shfsh.Empty();m_Yfsh.Empty();m_Yksh.Empty();m_Yuefen.Empty();m_Chaxun.Empty();m_Jiaotongbt=NULL;m_Huifei=NULL;m_Grsdsh.Empty();m_Fangzu=NULL;m_Fangtie=NULL;m_Chuxu=NULL;m_Bianhao=”“;m_Gangtie=NULL;UpdateData(FALSE);int position=m_gzlist.GetSelectionMark();m_Bianhao=m_gzlist.GetItemText(position,0);m_Chaxun=m_gzlist.GetItemText(position,0);m_Yuefen=m_gzlist.GetItemText(position,1);m_Jibengz=atof(m_gzlist.GetItemText(position,2));m_Jintie=atof(m_gzlist.GetItemText(position,3));m_Gangtie=atof(m_gzlist.GetItemText(position,4)); 3return;} void CTXGZ::OnButton5(){ } float CTXGZ::calculator(float a){float b=a-2000; } if(b<0){b=0;} if(0=500&&b<2000){return b=b*10/100-25;} if(b>=2000&&b<5000){return b=b*15/100-125;} if(b>=5000&&b<20000){return b=b*20/100-375;} if(b>=20000&&b<40000){return b=b*25/100-1375;} if(b>=40000&&b<60000){return b=b*30/100-3375;} if(b>=60000&&b<80000){return b=b*35/100-6375;} if(b>=80000&&b<100000){return b=b*40/100-10375;} if(b>=100000){ return b=b*45/100-15375;} UpdateData(TRUE);if(m_Chaxun.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql;sql.Format(”select * from 工资表 where 职工编号='%s'“,m_Chaxun);m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);m_pConnection->Close();m_gzlist.DeleteAllItems();ClearALL();m_Chaxun=m_Chaxun;m_yuefen.SetCurSel(0);UpdateData(FALSE);5.5查询管理 该模块实现功能是职工查询工资的详细信息,查询个人详细信息的功能。 5.5.1职工信息查询: 5.5.2工资信息查询: 部分核心代码如下: void CGXGZ::OnButton1(){ UpdateData(TRUE); if(m_Chaxun.IsEmpty()){AfxMessageBox(”请输入查询的职工编号!“);return;} OnInitADOConn();CString sql;sql.Format(”select * from 工资表 where 职工编号='%s'“,m_Chaxun);m_pConnection->Execute((_bstr_t)sql,NULL,adCmdText);m_pConnection->Close();m_gzlist.DeleteAllItems();UpdateGrid();m_Chaxun.Empty(); 6UpdateData(FALSE);{//创建连接对象实例 } catch(_com_error e){ AfxMessageBox(e.Description());m_pConnection.CreateInstance(”ADODB.Connection“);//设置连接字符串 CString strConnect=”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=salary.mdb;Persist Security Info=False;“;//使用Open方法连接数据库 m_pConnection->Open((_bstr_t)strConnect,”“,”“,adModeUnknown); } OnInitADOConn();//设置查询字符串 CString bstrSQL;bstrSQL.Format(”select * from 工资表 where 职工编号='%s' order by 职//创建记录集指针对象实例 m_pRecordset.CreateInstance(__uuidof(Recordset));//打开记录集 m_pRecordset->Open((_bstr_t)bstrSQL,m_pConnection.GetInterfacePtr(),ad adLockOptimistic,adCmdText);工编号 desc “,m_Chaxun);OpenDynamic, while(!m_pRecordset->adoEOF){ m_gzlist.InsertItem(0,”“);m_gzlist.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect(”职工编号 m_gzlist.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect(“月份”));m_gzlist.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect(“基本工资”));m_gzlist.SetItemText(0,3,(char*)(_bstr_t)m_pRecordset->GetCollect(“津贴”));m_gzlist.SetItemText(0,4,(char*)(_bstr_t)m_pRecordset->GetCollect(“岗贴”));m_gzlist.SetItemText(0,5,(char*)(_bstr_t)m_pRecordset->GetCollect(“补贴”));m_gzlist.SetItemText(0,6,(char*)(_bstr_t)m_pRecordset->GetCollect(“房贴”));m_gzlist.SetItemText(0,7,(char*)(_bstr_t)m_pRecordset->GetCollect(“交通补贴”));m_gzlist.SetItemText(0,8,(char*)(_bstr_t)m_pRecordset->GetCollect(“应发数”));m_gzlist.SetItemText(0,9,(char*)(_bstr_t)m_pRecordset->GetCollect(“房租”));m_gzlist.SetItemText(0,10,(char*)(_bstr_t)m_pRecordset->GetCollect(“储蓄”));m_gzlist.SetItemText(0,11,(char*)(_bstr_t)m_pRecordset->GetCollect(“会费”));m_gzlist.SetItemText(0,12,(char*)(_bstr_t)m_pRecordset->GetCollect(“个人所得税”));m_gzlist.SetItemText(0,13,(char*)(_bstr_t)m_pRecordset->GetCollect(“应扣数”));m_gzlist.SetItemText(0,14,(char*)(_bstr_t)m_pRecordset->GetCollect(“实发数”)); } void CGXGZ::ExitConnect(){if(m_pRecordset!=NULL) } m_pRecordset->Close();m_pConnection->Close();//将记录集指针移动到下一条记录 } //AfxMessageBox(“123”);//断开数据库连接 ExitConnect();m_pRecordset->MoveNext(); 第六章 系统测试 6.1 测试方法 (1)测试人员: 测试队伍由两位成员组成。软件的设计者在测试整个过程中负责整体测试方案的制定和测试进度的掌握以及白盒测试的测试者。第二位成员由未参加软件制作者担任,主要责任是进行软件的黑盒测试以及软件环境,硬件要求和极限测试工作。 (2)机器测试: 通过在计算机上直接运行被测程序,来发现程序中的错误。机器测试包括黑盒测试盒白盒测试。黑盒测试也称功能测试,将软件看作黑盒子,在完全不考虑程序的内部结构和特性的情况下,研究软件的外部特性。根据软件的需求规格说明书测试用例,从程序的输入和输出特性上测试是否满足设定的功能。白盒测试也称结构测试,将软件看作一个透明的白盒子,按照程序的内部结构和处理逻辑来选定测试用例,对软件的逻辑路径及过程进行测试,检查与测试是否相符。 6.2测试内容 1)软件的正常运行、关闭及退出时保存记录的提示。 2)用户登录界面友好,可操作性及安全性能较好,能对不同管理级别者进行限制,以保证数据库的安全。 3)数据库的可维护性好,数据的录入、删除及更改均能顺利完成,并能实现动态更新。 4)数据查询便捷,能对各种不同的查询条件搜索,以找到最合适的答案。5)数据溢出、越界均能进行非法提示,以警告用户正确使用。对用户的正常操作方式也提出警告。 6)数据类型填写错误时,系统能够报错。 7)软件对操作系统的兼容性良好,可移植性完好。 6.3测试结果 本系统有提示消息! 录入相同编号的数据: 该系统有报错功能! 查询职工工资信息: 查询职工信息成功! 1424344- 牟永敏 清华大学出版社第二篇:vb课程设计 职工工资管理系统代码
第三篇:数据库课程设计工资管理系统.
第四篇:工资管理(C语言课程设计)
第五篇:工资管理系统--软件工程课程设计2