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 + -
显示快捷键?