艾草837 2022-06-05 10:10 采纳率: 50%
浏览 83
已结题

基于C语言的小型工资管理系统,好像不能丝滑的运行,求修改

小型工资管理系统
好像不能丝滑的运行,求修改


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>

//建立关于工资的结构体
struct pay
{
    double basic_pay; //基本工资
    double add_pay; //绩效工资
    double all_pay; //应付工资
};

//建立关于工作人员的结构体
struct staff
{
    int id; //工号
    char name[20]; //姓名
    char gender[10]; //性别
    char dep[20]; //所在部门
    char rank[20]; //级别
    int add_time; //加班时长
    double reward_pay; //奖金
    struct pay rests; //成员rests属于struct pay类型
}data[999] = {
    {2101,"张三","男","技术部","一",10,1000},
    {2102,"李四","男","运维部","二",11,2000},
    {2103,"陆五","男","网安部","三",12,1500},
    {2104,"王六","女","技术部","二",23,1200},
    {2105,"卜七","男","网安部","一",13,1300},
    {2106,"徐九","男","运维部","三",14,1600},
    {2107,"刘九","男","技术部","二",15,1900},
    {2108,"杨零","男","技术部","二",16,2000},
    {2109,"孙一","女","技术部","一",17,1100},
    {2110,"孙亿","女","网安部","一",18,1400},
};//自建一个数据库
//定义一个全局的数据库长度
int lenth = 10;

//建立关于管理员的结构体
typedef struct The_users
{
    char id[20]; //账号
    char pwd[20]; //密码
    long phone; //电话号码为长整型
}users;

int processdata(); //定义数据处理函数 process date
void MENU1(); //主菜单
void MENU2();//二级菜单
void Exit(); //退出
void MENU1_choose();//菜单1选择
void MENU2_choose();//菜单2选择
void Register();//注册
void Create_File();//创建储存用户账号密码的文件
int create();   //增
int del();    //删
int edit();    //改
int process(); //处理
int req();     //查
int line();     //排
int showall(); //查询全部


//主菜单(登陆或者注册)
void MENU1()
{
    printf("\n\n\n\n\t\t\t\t\t================================\n");
    printf("\t\t\t\t\t        工 资 管 理 系 统       \n");
    printf("\t\t\t\t\t          1.管理员登陆          \n");
    printf("\t\t\t\t\t          2.管理员注册          \n");
    printf("\t\t\t\t\t          0.退 出               \n");
    printf("\t\t\t\t\t================================\n");

}

//二级菜单
void MENU2()
{
    printf("\n\n\n\n\t\t\t\t\t================================\n");
    printf("\t\t\t\t\t        工 资 管 理 系 统       \n");
    printf("\t\t\t\t\t          1.数据处理            \n");
    printf("\t\t\t\t\t          2.数据输出            \n");
    printf("\t\t\t\t\t          0.退 出               \n");
    printf("\t\t\t\t\t================================\n");

}

//退出
void Exit()
{
    int i=0;
    system("cls");
    char a[20]="LOVE you,byebye^_^";
    system("color 03");
    printf("\n\n\n\t\t\t");
    while(a[i])
    {
        printf("%c",a[i]);
        Sleep(100);
        i++;
    }
}

//创建储存用户账号密码的文件
void Create_File()
{
    FILE *fp;
    if((fp = fopen("users.txt","rb"))==NULL)
    {
        if((fp = fopen("users.txt","wb+"))==NULL)
        {
            printf("注册失败!\n");
            exit(0);
        }
    }
}

//注册
void Register()
{
    users a,b; //定义结构体a,b
    FILE *fp;
    char temp[20];
    int count = 0;
    printf("欢迎注册!\n");
    Sleep(1000);//暂停1000毫秒
    fp = fopen("users.txt","r");

    fread(&b, sizeof(struct The_users), 1, fp);//读入一个结构体字符块到b
     printf("请输入账号:\n");
    scanf("%s",&a.id);

    while (1)
    {
        if (strcmp(a.id, b.id)) //如果两串不相等
        {
            if (!feof(fp))    //如果未到文件尾   feof()判断文件是否结束
            {
                fread(&b, sizeof(struct The_users), 1, fp);
            }
            else
                break;
        }
        else
        {
            printf("此用户名已存在!请重新注册!\n");
            Sleep(1000);//暂停1000毫秒
            fclose(fp);//关闭文件
            return;
        }
    }

    printf("请输入电话号码:\n");
    scanf("%ld",&a.phone);
    printf("请输入密码\n");
    scanf(" %s",&a.pwd);
    printf("请确认密码\n");
    scanf(" %s",&temp);
    do{
        if(!strcmp(a.pwd,temp))
        {
            fp = fopen("users.txt","a");//写入文件
            fwrite(&a, sizeof(struct The_users), 1, fp);//读入一个结构体字符块到a
            printf("账号注册成功,请登录!\n");
            system("pause");//暂停
            system("cls");//清屏
            MENU1();//重新进入一级菜单
            return;
        }
        else{
                printf("两次密码不匹配!请重新输入!\n");
                scanf("%s",&a.pwd);
                printf("请确认密码\n");
                scanf("%s",&temp);
            }
    }while(1);

}

//登陆
void login()
{
    users a,b;//定义结构体The_users别名
    FILE *fp;
    printf("欢迎来到登录界面!\n");
         Sleep(1000);//暂停1000毫秒
    fp = fopen("users.txt","r");

    fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 写入b
    printf("请输入账号\n");
    scanf("%s",&a.id);

    while (1)
    {
        if (strcmp(a.id, b.id)==0)         //如果有此用户名
        {
            break;
        }
        else
        {
            if (!feof(fp))  //如果文件没有读完
            {
                fread(&b, sizeof(struct The_users), 1, fp);
            }
            else
            {
                printf("此用户名不存在,请重新输入!\n");
                Sleep(500);
                fclose(fp);
                return;
            }
        }
    }
    printf("请输入密码\n");
    scanf("%s",&a.pwd);
    do{
        if (strcmp(a.pwd, b.pwd)==0) //对比密码   如果密码匹配
        {
            fclose(fp);
            printf("登录成功,欢迎使用!");
            system("pause");//暂停
            system("cls");//清屏
            MENU2_choose();//进入二级菜单
            return;
        }
        else
        {
            printf("密码不正确!请重新输入密码\n");
            scanf("%s",&a.pwd);
        }
    }while(strcmp(a.pwd, b.pwd)==0);

}

//修改菜单及修改选择
int processdata()
{

    int order;

    while(1)
    {
        printf("****************************\n");
        printf("数据处理菜单:\n");
        printf("1.输入员工信息\n");
        printf("2.删除员工信息\n");
        printf("3.修改员工信息\n");
        printf("4.处理员工信息\n");
        printf("5.显示所有员工信息\n");
        printf("6.退出\n");
        printf("****************************\n");
        printf("---请输入菜单项:---\n");

        scanf("%d",&order);

        if(order==6)
        {
            Sleep(1000);//暂停1000毫秒
            Exit();//退出
            return 0;
        }

        switch(order){

            case 1:     create();break;
            case 2:     del();break;
            case 3:     edit();break;
            case 4:     process();break;
            case 5:     showall(); break;
            default:    printf("\n404 NOT FOUND!"); getchar(); getchar(); system("cls");

            }
    }
return 0;

}


//增添信息
int create()
{
    int i;
    i = lenth;

    printf("\n");

    printf("新增员工工号:");
    scanf("%d", &data[i].id);
    printf("\n");

    printf("新增员工姓名:");
    scanf("%s", &data[i].name);
    printf("\n");

    printf("新增员工性别:");
    scanf("%s", &data[i].gender);
    printf("\n");

    printf("新增员工所属部门:");
    scanf("%s", &data[i].dep);
    printf("\n");

    printf("新增员工级别:");
    scanf("%s", &data[i].rank);
    printf("\n");

    printf("新增员工加班时间:");
    scanf("%d", &data[i].add_time);
    printf("\n");

    printf("新增员工奖金:");
    scanf("%lf", &data[i].reward_pay);
    printf("\n");

    process();//计算处理信息

    printf("创建成功!\n");
    lenth++;
    getchar();
    getchar();//读取接下来的两个字符,起暂停的作用
    system("cls");//清屏
    processdata();
    return 0;

}

//删除信息
int del()
{

    int i = lenth;
    int num;

    printf("\n按0返回");
    printf("\n请输入删除员工工号:");
    scanf("%d", &num);

    for(int j=0; j<=i+1; j++)
    {
        if(num==0)
            processdata();
            break;
        if(num==data[j].id)
        {
            for( ;j<=i-j; j++){

                data[j] = data[j+1];
            }

            lenth--;
            printf("\n删除成功!\n");
            break;
        }

        if(j==i+1)
        {
            printf("\n查无此人!\n");
            break;
        }

    }

    getchar();
    getchar();
    system("cls");
    return 0;

}


//修改信息
int edit()
{

    int i = lenth;
    int num;

    printf("\n请输入需要修改的员工工号:");
    scanf("%d", &num);
    printf("\n");

    for(int j=0; j<=i+1; j++)
    {
        if(num==data[j].id)
        {

            printf("修改姓名:");
            scanf("%s", &data[j].name);
            printf("\n");

            printf("修改性别:");
            scanf("%s", &data[j].gender);
            printf("\n");

            printf("修改所属部门:");
            scanf("%s", &data[j].dep);
            printf("\n");

            printf("修改级别:");
            scanf("%s", &data[j].rank);
            printf("\n");

            printf("修改加班时长:");
            scanf("%d", &data[j].add_time);
            printf("\n");

            printf("修改奖金:");
            scanf("%d", &data[j].reward_pay);
            printf("\n");

            process();//计算处理信息

            printf("修改成功!\n");
            system("pause");//暂停
            system("cls");//清屏
            showall();//转到 查询全部
            break;

        }

        if(j==i+1){

            printf("\n查无此人!\n");
            break;
        }


    }

    system("pause");//暂停
    system("cls");
    return 0;

}

//计算处理信息
int process()
{
    int i = 0;
    while(data[i].rank!="\0")
    {
        /*按照级别分配基本工资*/
        if(data[i].rank == "一" )
            data[i].rests.basic_pay = 8000;
        if(data[i].rank == "二" )
            data[i].rests.basic_pay = 9000;
        if(data[i].rank == "三" )
            data[i].rests.basic_pay = 10000;

        /*按照加班时间计算绩效工资*/
        data[i].rests.add_pay =  data[i].add_time * 50;
        i++;
    }

    data[i].rests.all_pay = data[i].rests.basic_pay + data[i].rests.add_pay + data[i].reward_pay;

}

//cmp函数的返回值,<0(不进行置换),>0(进行置换),0(不进行置换)。
int cmp(const void *a, const void *b) //const是C/C++中的类型修饰符。节省空间,避免不必要的内存分配。const修饰的变量在程序运行过程中只有一份拷贝。
{
    return *(int*)a - *(int*)b; //由小到大排序
    //return *(int *)b - *(int *)a; 由大到小排序
}

//员工信息排序输出
int line()
{

    int i;
    int id_data[100];
    i = lenth;
    char* str[11] = {"工号", "姓名", "性别", "部门", "级别" , "加班时长" , "基本工资" , "绩效工资", "奖金", "应发工资"};

        for(int j = 0; j<i; j++)
        {
            id_data[j] = data[j].id;
        }


    qsort(id_data, i, sizeof(id_data[0]) , cmp);//qsort就是C语言中的快排函数

    printf("\n排序成功!\n\n") ;


//数据表的字段输出

    for(int n=0; n<8; n++){

        printf("%-12s" , str[n]);

    }


    printf("\n\n");


//数据排序输出

    for(int n1 = 0; n1<i; n1++)
    {
        for(int n2 = 0; n2<i; n2++ )
        {
            if(id_data[n1] == data[n2].id)
            {
                printf(" %-10d",    data[n2].id);

                printf(" %-10s",    data[n2].name);

                printf("   %-10s",  data[n2].gender);

                printf("%-10s",     data[n2].dep);

                printf("  %-10s",   data[n2].rank);

                printf("  %-10d",   data[n2].add_time);

                printf("    %-10d", data[n2].rests.basic_pay);

                printf("  %-10d",   data[n2].rests.add_pay);

                printf("  %-10d",   data[n2].reward_pay);

                printf("  %-10d",   data[n2].rests.all_pay );

                printf("\n\n");

            }


        }


    }

     getchar();
     getchar();
    system("cls");
    return 0;


}


//查询员工信息
int req()
{

    int i = lenth;
    int num;
    char* str[11] = {"工号", "姓名", "性别", "部门", "级别" , "加班时长" , "基本工资" , "绩效工资", "奖金", "应发工资"};

    printf("\n请输入需要查询员工工号:");
    scanf("%d", &num);
    printf("\n\n");

    for(int n=0; n<11; n++)
    {
        printf("%-12s" , str[n]);
    }

    printf("\n\n");

    for(int j=0; j<=i+1; j++)
    {
        if(num==data[j].id)
        {
            printf(" %-10d",    data[j].id);

            printf(" %-10s",    data[j].name);

            printf("   %-10s",  data[j].gender);

            printf("%-10s",     data[j].dep);

            printf("  %-10s",   data[j].rank);

            printf("  %-10d",   data[j].add_time);

            printf("    %-10d", data[j].rests.basic_pay);

            printf("  %-10d",   data[j].rests.add_pay);

            printf("  %-10d",   data[j].reward_pay);

            printf("  %-10d",   data[j].rests.all_pay );

            printf("\n\n");

            printf("\n查询成功!\n\n");
            break;

        }

        if(j==i+1){

            printf(" 无\n");
            printf("\n查无此人!\n");

            break;
        }

}


    getchar();
    getchar();
    system("cls");
    return 0;

}


//查询全部数据
int showall()
{
    int i;
    char* str[11] = {"工号", "姓名", "性别", "部门", "级别" , "加班时长" , "基本工资" , "绩效工资", "奖金", "应发工资"};
    i = lenth - 1;

    process();
    printf("\n");
    printf("查询成功!\n\n");


    for(int n=0; n<8; n++)
    {
        printf("%-12s" , str[n]);
    }

    printf("\n\n");

    for(int j=0; j<=i; j++)
    {
        printf(" %-10d",    data[j].id);//"%-10d"  -:左对齐   10:数字宽度为10

        printf(" %-10s",    data[j].name);

        printf("   %-10s",  data[j].gender);

        printf("%-10s",     data[j].dep);

        printf("  %-10s",   data[j].rank);

        printf("  %-10d",   data[j].add_time);

        printf("    %-10d", data[j].rests.basic_pay);

        printf("  %-10d",   data[j].rests.add_pay);

        printf("  %-10d",   data[j].reward_pay);

        printf("  %-10d",   data[j].rests.all_pay );

        printf("\n\n");

    }

     getchar();
     getchar();
    system("cls");
    return 0;

}


//二级菜单选择
void MENU2_choose()
{
    int order;
    MENU2();
    while(1)
    {
        scanf("%d",&order);
        if(order==0)
        {
            Exit();
            return;
        }
        if(order==1)
            processdata();
        if(order==2)
            line();

    }
}

void MENU1_choose()
{
    int order;
    MENU1();
    while(1)
    {
        scanf("%d",&order);
        if(order==1)
            login();
        if(order==0)
        {
            Exit();
            return;
        }

        if(order==2)
            Register();
    }
}

int main()
{
    MENU1_choose();
}

  • 写回答

3条回答 默认 最新

  • 艾草837 2022-06-05 10:40
    关注

    img

    评论

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 赞助了问题酬金10元 6月5日
  • 创建了问题 6月5日

悬赏问题

  • ¥15 师哥师姐们,如何帮我下载一下python?
  • ¥15 Office版本升级,Oracle连接报错
  • ¥20 利用python搜索PDF文件中是否存在1
  • ¥15 ImportPathMismatchError
  • ¥15 滤波器这个效果是对的么
  • ¥15 c++静态函数的静态函数参数问题
  • ¥15 51单片机数码管显示有问题
  • ¥30 delphi 10 seattle 调https
  • ¥200 有哪位师傅可以教我做出telegraf平台的骰子插件?重酬。
  • ¥85 3559A sensor时间同步