manage.c
来自「此程序是用BC软件遍的一个简单C语言程序」· C语言 代码 · 共 477 行
C
477 行
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <dos.h>
#include <ctype.h>
#include <io.h>
typedef struct worker /*数据结构*/
{
char id[10];
char name[20];
int salary;
int sub_salary;
int add_salary;
int all;
struct worker *next;
} Worker,*Pworker;
int NUM; /*记录数*/
Worker HEAD; /*头节点*/
Worker TEMP;
Pworker TAIL; /*尾节点*/
void menu_main(void);
void main_proc(void);
void input(void);
void init(void);
void display(void);
void prog_exit(int n);
void file_save(void);
void file_load(void);
void search(void);
Pworker search2(char id[]);
void msg(char *str);
void del(Pworker p);
void sort(void);
long total(void);
void total_main(void);
/*主程序*/
void main()
{
init();
file_load();
main_proc();
getch();
}
/*初始化*/
void init(void)
{
HEAD.next=NULL;
TAIL=&HEAD;
NUM=0;
}
/*程序主要过程*/
void main_proc(void)
{
int key;
menu_main();
while(1)
{
if(bioskey(1)!=0)
{
key=bioskey(0);
if(key==2864) /*按键0*/
{
init();
msg("initialize");
menu_main();
}
if(key==561) /*按键1*/
{
input();
menu_main();
} /*按键2*/
if(key==818)
{
display();
getch();
menu_main();
}
if(key==1332) /*按键4*/
{
file_load();
msg("file load");
menu_main();
}
if(key==1846) /*按键6*/
{
sort();
menu_main();
}
if(key==1589) /*按键5*/
{
file_save();
msg("file save");
menu_main();
}
if(key==2103||key==1075) /*按键3或7*/
{
search();
menu_main();
}
if(key==2360) /*按键8*/
{
total_main();
menu_main();
}
if(key==2617||key==283) /*按键9或ESC*/
{
prog_exit(0);
}
}
}
}
/*主界面显示*/
void menu_main(void)
{
window(1,1,80,25);
textcolor(WHITE);
textbackground(YELLOW);
clrscr();
gotoxy(20,1);
cprintf("salary adminstration system");
gotoxy(3,3);
cprintf("0. initialize");
gotoxy(3,4);
cprintf("1. input");
gotoxy(3,5);
cprintf("2. display");
gotoxy(3,6);
cprintf("3. delete");
gotoxy(3,7);
cprintf("4. load");
gotoxy(3,8);
cprintf("5. save");
gotoxy(3,9);
cprintf("6. sort");
gotoxy(3,10);
cprintf("7. serch");
gotoxy(3,11);
cprintf("8. total");
gotoxy(3,12);
cprintf("9, exit");
textcolor(BLACK);
gotoxy(3,15);
cprintf("enter you choice:");
}
/*输入函数,未做边界检查和输入合法性检查,输入时注意*/
/*直接插入到链表尾*/
void input(void)
{
int i;
Pworker temp;
temp=(struct worker *)malloc(sizeof(struct worker));
window(1,1,80,25);
textcolor(WHITE);
textbackground(YELLOW);
clrscr();
gotoxy(1,1);
cprintf("**********************input***************************");
gotoxy(3,3);
cprintf("worker ID:");
scanf("%s",temp->id);
gotoxy(3,5);
cprintf("Name:");
scanf("%s",temp->name);
gotoxy(3,7);
cprintf("Salary:");
scanf("%d",&(temp->salary));
gotoxy(3,9);
cprintf("sub salary:");
scanf("%d",&(temp->sub_salary));
gotoxy(3,11);
cprintf("add salary:");
scanf("%d",&(temp->add_salary));
temp->all=(temp->salary)-(temp->sub_salary)+(temp->add_salary);
temp->next=NULL;
TAIL->next=temp;
TAIL=temp;
NUM++;
}
/*显示函数*/
void display(void)
{
Pworker p;
window(1,1,80,25);
textcolor(WHITE);
textbackground(YELLOW);
clrscr();
p=HEAD.next;
gotoxy(3,3);
printf("worker ID\t\t");
printf("name\t");
printf("salary\t");
printf("sub salary\t");
printf("add salary\t");
printf("total");
printf("\n");
while(p!=NULL)
{
printf("%10s",p->id);
printf("%20s",p->name);
printf(" %6d\t",p->salary);
printf("%6d\t\t",p->sub_salary);
printf("%6d\t\t",p->add_salary);
printf("%6d",p->all);
printf("\n");
p=p->next;
}
}
/*程序退出*/
void prog_exit(int n)
{
exit(n);
}
/*文件读取,文件固定为"record.txt"*/
void file_load(void)
{
FILE *fp;
Pworker p;
HEAD.next=NULL;
TAIL=&HEAD;
NUM=0;
if((fp=fopen("record.txt","rb"))==NULL)
{
printf("无法打开文件\n");
prog_exit(1);
}
while(1)
{
p=(struct worker *)malloc(sizeof(struct worker));
fread(p,sizeof(struct worker),1,fp);
if(feof(fp))break;
p->next=NULL;
TAIL->next=p;
TAIL=p;
NUM++;
}
fclose(fp);
}
/*文件写入,文件名固定为"record.txt"*/
void file_save(void)
{
FILE *fp;
Pworker p;
if((fp=fopen("record.txt","wb"))==NULL)
{
printf("无法保存文件\n");
prog_exit(1);
}
p=HEAD.next;
while(p!=NULL)
{
fwrite(p,sizeof(struct worker),1,fp);
p=p->next;
}
fclose(fp);
}
/*文件搜索,并提示是否删除*/
void search(void)
{
Pworker p,p2;
char sid[10];
int key;
window(1,1,80,25);
textcolor(WHITE);
textbackground(YELLOW);
clrscr();
gotoxy(1,1);
cprintf("**********************search***************************");
gotoxy(3,3);
cprintf("worker ID:");
scanf("%s",sid);
p2=search2(sid);
p=p2->next;
gotoxy(3,10);
if(p!=NULL)
{
printf("worker ID\t\t");
printf("name\t");
printf("salary\t");
printf("sub salary\t");
printf("add salary\t");
printf("total");
printf("\n");
printf("%10s",p->id);
printf("%20s",p->name);
printf(" %6d\t",p->salary);
printf("%6d\t\t",p->sub_salary);
printf("%6d\t\t",p->add_salary);
printf("%6d",p->all);
printf("\n");
gotoxy(3,15);
printf("press del to delete");
while(1)
{
if(bioskey(1)!=0)
{
key=bioskey(0);
if(key==21248)
{
del(p2);
}
else return;
}
}
}
else
{
msg("no recoder found");
}
}
/*数据搜索,并返回前驱节点*/
Pworker search2(char id[])
{
Pworker p,pre;
pre=&HEAD;
p=pre->next;
while(p!=NULL)
{
if(!strcmp(p->id,id))
{
return pre;
}
pre=p;
p=p->next;
}
return pre;
}
/*数据删除*/
void del(Pworker p)
{
if(p->next==NULL)
{
msg("no recoder");
}
else
{
if(p->next==TAIL)
{
TAIL=p;
}
p->next=p->next->next;
msg("recoder delete");
}
}
/*提示框,按任意键继续*/
void msg(char *str)
{
window(22,11,52,14);
textbackground(WHITE);
clrscr();
window(20,10,50,13);
textcolor(WHITE);
textbackground(BLACK);
clrscr();
gotoxy(3,2);
cprintf("%s",str);
getch();
}
/*排序,使用算法:插入排序*/
void sort(void)
{
Pworker p,p2,ph,pre;
p=HEAD.next;
if(p!=NULL)
{
p2=p->next;
p->next=NULL;
while(p2!=NULL)
{
ph=p2->next;
p2->next=NULL;
pre=&HEAD;
p=pre->next;
while(p!=NULL)
{
if(p2->all<=p->all)
{
p2->next=p;
pre->next=p2;
break;
}
else
{
pre=p;
p=p->next;
}
}
if(p==NULL)
{
pre->next=p2;
}
p2=ph;
}
p=HEAD.next;
TAIL=&HEAD;
while(p!=NULL)
{
TAIL=p;
p=p->next;
}
msg("sorted");
}
else
{
msg("no recoder");
}
}
/*返回所有记录工资总和*/
long total(void)
{
Pworker p;
long t;
t=0;
p=HEAD.next;
while(p!=NULL)
{
t+=p->all;
p=p->next;
}
return t;
}
/*工资总和计算函数*/
void total_main(void)
{
window(22,11,52,14);
textbackground(WHITE);
clrscr();
window(20,10,50,13);
textcolor(WHITE);
textbackground(BLACK);
clrscr();
gotoxy(3,2);
cprintf("total salary:");
cprintf("%d",total());
getch();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?