前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言课程实训:员工信息管理系统

C语言课程实训:员工信息管理系统

作者头像
十二惊惶
发布2024-02-28 19:43:08
1900
发布2024-02-28 19:43:08
举报
文章被收录于专栏:十二惊惶的网络安全研究记录

1.需求分析

一家公司不仅应该有管理者,还应该有数量更多的普通员工,一个员工信息管理系统,不仅要有管理员操作的模块还要有员工模块。

1.1员工登录

这一部分需要实现员工自主查询信息的功能,但要求不能使员工更改数据库中的信息

1.2管理员登录

这一部分要实现管理员对员工信息的管理,包括:新建员工信息、浏览员工信息、以员工号或姓名的方式查询员工信息、删除员工信息、根据各种方式筛选相应员工、修改员工信息以及退出该管理服务系统等等。每一步都将相应的数据存入二进制文件中。

2.系统设计

2.1实现员工登陆查询信息系统

2.2实现管理员登录管理系统

模块一:实现新建职工信息功能;

以追加的形式将数据存入二进制文件,并且将从文本文件中读取的num值自增,并将num重新存入文本文件中。

模块二:实现浏览员工信息功能;

一开始计划是只是浏览全部的员工信息,在后期的制作中,想到一个公司往往会有各种活动,需要对参与员工进行筛选,对其追加了根据年龄,工资性别的筛选功能。

模块三:实现查询员工信息功能;

对员工信息的查询功能包括两个方面,按员工号进行查询和按照姓名方式进行查询如果查询失败则输出没有该员工,返回操作页面。

模块四:实现删除员工信息功能;

从二进制文件中将数据全部读取出来,将输入的员工号与已有数据中的员工号进行比对,当数据相同时删除该员工信息,并将全部信息重新写入文件中。

模块五:实现修改员工信息功能;

该模块具体执行数据的修改,分成八个部分修改员工的各种信息。

模块六:实现退出服务系统功能;

用于结束程序的模块

模块七:实现读取已存入数据个数

由于使用了一个文本文件进行辅助工作,这个程序这是读取txt格式文本文件中存储的数字,将他存入全局变量num中。

模块八:管理员登录后的操作页面;

3.详细代码

3.1.1company.h
代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include <ctype.h>
#include<windows.h>
#include<conio.h>
static int NUM;
struct workers
{
        char jobNo[20];       //工号
        char name[15];        //姓名
        char sex[15];         //性别
        char year[15];        //年龄
        char position[15];    //职务
        char salary[15];      //工资
        char addr[15];        //住址
        char tel[15];         //电话
};
void f_1(struct workers *workers);
void f_2(struct workers *workers);
void f_3(struct workers *n);
void f_3_2(struct workers *workers);
void f_3_1(struct workers *workers);
int  f_4(struct workers *workers);
void f_5(struct workers *workers);
int f_6(char n);
void see (void);
void xtjz(void);
int sign(void);
int Hollow(void);
3.1.2company.c
代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include <ctype.h>
#include<windows.h>
#include"gongshi.h"
void smile()
//1、系统加载界面
{
    int i;
    printf("\n\n\n\n");
    printf("\t\t\t\t\t系统加载中\n");
    printf("\t\t\t");
    for(i = 0; i <20; i++)
    {
        printf("$ ");
        if(i ==19)
            printf("\n");
        Sleep(100);
        //使计算机进入短暂的休眠状态100毫秒
    }
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t\t\t\t系统加载完成!\n");
    printf("\t\t\t\t\t  欢迎使用!\n");
    Sleep(500);
    system("cls");//执行清屏操作
}
int sign(void)
{
    int n;
    struct workers *workers;
    workers = (struct workers*)malloc(sizeof(struct workers));
    printf("\t\t\t=============================================================\n");
    printf("\t\t\t||                  《职工信息管理系统》                   ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                 请按相应按键使用本系统!                ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.员工登录                       2.管理员模式         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
    scanf("%d",&n);
    char number[9];
    char pow[10];
    if(n==2)
    {
        printf("请输入管理员账号");
        scanf("%s",number);
        fflush(stdin);
        printf("请输入密码");
        {
            for(int i=0; i<9; i++)
            {
                pow[i] = getch();
                /*逐次赋值,但不回显*/
                if (pow[i] == '\x0d')
                    /*回车则终止循环*/
                {
                    pow[i]='\0';
                    break;
                }
                printf("*");       /*以星号代替字符个数*/
            }
            fflush(stdin);
            if((strcmp(number,"0001")==0) && (strcmp(pow,"123456")==0))
            {
                return n;
            }
            else
                printf("账号或密码错误!");
        }
    }
    else if(n==1)
    {
        f_3 (workers);
        return n;
    }
    else
    {
        int n;
        system("cls");
        printf("请输入正确的功能编号!\n");
        system("pause");
        system("cls");
        sign();
    }
}
void see (void)
//该函数是从辅助文件中读取员工个数;
{
    FILE *fp1;
    char ch[10];
    fp1=fopen("data.txt","r+");
    //data.txt为辅助的文本文件;
    if (fp1==NULL)
    {
        printf("人数预存文件打开失败");
        exit(EXIT_FAILURE);
    }
    fgets(ch,3,fp1);
    NUM=atoi(ch);
    fclose(fp1);
}
int Hollow(void)
//管理员页面,在程序中会反复调用;
{
    system("cls");
    printf("\n\n\n\t\t\t=============================================================\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                   《职工信息管理系统》                  ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                       管理员页面!                      ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.新建职工信息                 2.浏览职工信息         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   3.查询职工信息                 4.删除职工信息         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   5.变更职工信息                 6.退出程序             ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
}
int f_6(char n)
//退出程序;
{
    printf("感谢您使用本系统,祝您工作愉快\n");
    system("pause");
    system("cls");
    return 0;
}
void f_1(struct workers *workers)
//以尾加法插入新的数据,并写入text.dat二进制文件中;
{
    struct workers *p;
    //p是个指向结构体指针后面需要用到;
    p = (struct workers *)malloc(sizeof(struct workers));
    //对指针p分配大小;
    p=workers;
    printf("请输入员工号:");
    scanf("%s", p->jobNo);
    printf("请输入姓名:");
    scanf("%s", p->name);
    printf("请输入性别:");
    scanf("%s", p->sex);
    printf("请输入所担任职务:");
    scanf("%s", p->position);
    printf("请输入年龄:");
    scanf("%s",p->year);
    printf("请输入工资:");
    scanf("%s", p->salary);
    printf("请输入家庭住址:");
    scanf("%s", p->addr);
    printf("请输入员工联系方式:");
    scanf("%s", p->tel);
    FILE *fp=fopen("text.dat","ab+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
        //这段程序是结束函数块的,如果没有这段代码后面内容还会继续输出。
    }
    fwrite(workers,sizeof(struct workers),1,fp);
    //将数据存入函数中;
    fclose(fp);
    char ch[10];
    NUM++;
    sprintf(ch,"%d",&NUM);
    FILE *fp1;
    fp1=fopen("data.txt","w+");
    itoa(NUM,ch, 10);
    //一个没学过的函数,把整形数转化成字符型;
    fputs(ch,fp1);
    fclose(fp1);
    system("cls");
    /*
    使用外部变量NUM,在使用者使用程序时先行为,NUM赋值;
    */
    Hollow();
}
void f_2(struct workers *workers)
//浏览已经写入的数据;
{
    system("cls");
   printf("\n\n\n\t\t\t=============================================================\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.浏览全部信息                 2.按性别方式筛选       ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   3.按年龄方式筛选               4.按薪资筛选           ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
    int n;
    printf("请输入筛选的方式\n");
    scanf("%d",&n);
    if(n==1)
    {
        system("cls");
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");

        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        int i;
        for (i=0; i<NUM; i++)
        {
            p=&read[i];
            if(read[i].jobNo)
            {
                printf("——————————————————————————————\n");
                printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                printf("—————————————————————————————\n");
            }
        }
        system("pause");
        system("cls");
        Hollow();
    }
    else if(n==2)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工性别编号\n");
        printf("1.男性    \t\t     2.女性\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");
        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(strcmp(read[i].sex,"男")==0)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(strcmp(read[i].sex,"女")==0)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }
    }
    else if(n==3)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工薪资范围\n");
        printf("1.青年    \t\t     2.壮年\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");
        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];

                if(atoi(read[i].year)<30)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].year)>30)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }
    }
    else if(n==4)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工薪资范围\n");
        printf("1.低薪    \t\t     2.中薪\t\t\t  3.高薪\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");
        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].salary)<3000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].salary)>=3000&&atoi(read[i].salary)<8000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if(k==3)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].salary)>=8000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }
    }
}
void f_3_1(struct workers *n)
//以员工号方式查询某个员工的信息。
{
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的职工号:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].jobNo,found)==0)
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
    Hollow();
}
void f_3(struct workers *n)
//以员工号方式查询某个员工的信息。
{
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的职工号:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].jobNo,found)==0)
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
}
void f_3_2(struct workers *n)
{
    //以姓名方式查找员工;
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的姓名:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].name,found)==0)
            //用found数组进行比较如果found数组和name相同则执行;
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
        //当
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
    Hollow();
}
int f_4(struct workers *workers)
//删除数据;
{
    struct workers *p;
    int j;
    struct workers read[100];
    char find[10];
    FILE *fp=fopen("text.dat","rb");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),NUM,fp);
    printf("请输入要删除的职工号");
    scanf("%s",find);
    for(j=0; j<=NUM; j++)
    {
        if(strcmp(read[j].jobNo,find) == 0)
        {
            NUM--;
            //将num--这个操作,更改变量的大小,方便再次存入。
            break;
        }
    }
    if(NUM<j)
        //如果没有提前结束,j的最终大小回是num+1;判断num是否及时结束。
    {
        printf("该职工号不存在!");
        system("pause");
    }
    if(strcmp(read[j].jobNo,find) == 0)
    {
        for(j; j<NUM; j++)
        {
            strcpy(read[j].jobNo,read[j+1].jobNo);
            strcpy(read[j].name,read[j+1].name);
            strcpy(read[j].sex,read[j+1].sex);
            strcpy(read[j].position,read[j+1].position);
            strcpy(read[j].year,read[j+1].year);
            strcpy(read[j].salary,read[j+1].salary);
            strcpy(read[j].addr,read[j+1].addr);
            strcpy(read[j].tel,read[j+1].tel);
        }
    }
//将read[j]进行移位,达到删除的目的;
    fclose(fp);
//关闭文件
    char ch[10];
    //定义一个
    fp=fopen("text.dat","wb+");
    if (fp==NULL)
    {
        printf("删除失败!");
        exit(EXIT_FAILURE);
    }
    fwrite(read,sizeof(struct workers),NUM,fp);
    fclose(fp);
    FILE *fp1;
    fp1=fopen("data.txt","w+");
    //使用一个txt格式的文件作为辅助,进行数据量的计数。
    itoa(NUM,ch, 10);
    //一个没学过的函数,把整形数转化成字符型;
    fputs(ch,fp1);
    fclose(fp1);
    system("cls");
    system("pause");
    system("cls");
    Hollow();
}
void f_5(struct workers *workers)
//在文件中读取数据,对数据进行修改,最后在存入文件中。
{
    struct workers *p;
    int j;
    struct workers read[NUM];
    char find[10];
    FILE *fp=fopen("text.dat","rb");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),NUM,fp);
    printf("请输入要修改的职工号");
    scanf("%s",find);
    system("cls");
    for(j=0; j<NUM; j++)
    {
        if(strcmp(read[j].jobNo,find) == 0)
        {
            printf("\n\n\n\t\t\t=============================================================\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   1.修改员工号                   2.修改姓名             ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   3.修改性别                     4.修改担任职务         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   5.修改年龄                     6.修改员工工资         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   7.修改员工家庭住址             8.修改员工联系方式     ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t=============================================================\n");
            p = (struct workers *)malloc(sizeof(struct workers));
            p=workers;
            int n;
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                printf("请输入员工号:");
                scanf("%s", read[j].jobNo);
                break;
            case 2:
                printf("请输入姓名:");
                scanf("%s",read[j].name);
                break;
            case 3:
                printf("请输入性别:");
                scanf("%s", read[j].sex);
                break;
            case 4:
                printf("请输入所担任职务:");
                scanf("%s", read[j].position);
                break;
            case 5:
                printf("请输入年龄:");
                scanf("%s",read[j].year);
                break;
            case 6:
                printf("请输入工资:");
                scanf("%s",read[j].salary);
                break;
            case 7:
                printf("请输入家庭住址:");
                scanf("%s",read[j].addr);
                break;
            case 8:
                printf("请输入员工联系方式:");
                scanf("%s",read[j].tel);
                break;
            }
        }
    }
//以全部重新输入的形式去替换原本数据,达到修改的目的;
    fclose(fp);
    fp=fopen("text.dat","wb+");
    fwrite(read,sizeof(struct workers),NUM,fp);
    if (fp==NULL)
    {
        printf("文件修改失败");
        exit(EXIT_FAILURE);
    }
    printf("修改成功!");
    fclose(fp);
    system("pause");
    system("cls");
    Hollow();
//最后返回操作界面;
}

#### 3.1.3main.c

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include"gongshi.h"
int main()
{
    smile() ;
    struct workers *workers;
    workers = (struct workers*)malloc(sizeof(struct workers));
    int flag_1;
    int n;
    flag_1=sign();
    see();
    if(flag_1==2)
    {
        system("cls");
        Hollow();
        while (1)
        {
            scanf("%d",&n);
            if(n==1)
                f_1(workers);
            else if(n==2)
                f_2(workers);
            else if(n==3)
            {
                int n;
                system("cls");
                printf("请输入查询方式             1.   员工号查询         2.姓名查询\n");
                scanf("%d",&n);
                if (n==1)f_3_1(workers);
                else if (n==2)f_3_2(workers);
            }

            else if(n==4)
                f_4(workers);
            else if(n==5)
                f_5(workers);
            else if(n==6)
            {
                f_6(n);
                break;
            }
            else
            {
                int n;
                system("cls");
                printf("请输入正确的功能编号!\n");
                system("pause");
                system("cls");
                Hollow();
            }
        }
    }
}
3.2分函数讲解
3.2.1登录过场动画
代码语言:javascript
复制
void smile()
//1、系统加载界面
{
    int i;
    printf("\n\n\n\n");
    printf("\t\t\t\t\t系统加载中\n");
    printf("\t\t\t");
    for(i = 0; i <20; i++)
    {
        printf("$ ");
        if(i ==19)
            printf("\n");
        Sleep(100);
        //使计算机进入短暂的休眠状态100毫秒
    }
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t\t\t\t系统加载完成!\n");
    printf("\t\t\t\t\t  欢迎使用!\n");
    Sleep(500);
    system("cls");//执行清屏操作
}

一个负责整活的过场动画,对于整个系统来说可有可无,但是可以丰富整个程序,避免这个程序过于简陋。 1 for循环和sleep()函数搭配使用,每隔0.1秒输出一个$,做到登录动画; 2 system(“cls”)函数清屏,输出系统加载完成,欢迎使用。

3.2.2辅助文件读取函数()
代码语言:javascript
复制
void see (void)
//该函数是从辅助文件中读取员工个数;
{
    FILE *fp1;
    char ch[10];
    fp1=fopen("data.txt","r+");
    //data.txt为辅助的文本文件;
    if (fp1==NULL)
    {
        printf("人数预存文件打开失败");
        exit(EXIT_FAILURE);
    }
    fgets(ch,3,fp1);
    NUM=atoi(ch);
    fclose(fp1);
}

1 我使用了名为data.txt的文本文件进行辅助,在运行这个文件时需要有一个函数读取文件中的数据。 2 使用fets()函数以字符串的形式将数据从文本文件中读取出来,此时从文本文件中读取出来的是字符串,这里我们就用到一个atoi()函数将字符串转化为整形数。

其实这个地方用格式化读取fscanf(fp,“%d”,&NUM);完全可以做到,作者使用的方式完全多此一举,但考虑到实训要有和其他组不同的特色,故采取了这种下策,并不建议模仿。

3.2.3登录页面
代码语言:javascript
复制
int sign(void)
{
    int n;
    struct workers *workers;

    workers = (struct workers*)malloc(sizeof(struct workers));

    printf("\t\t\t=============================================================\n");
    printf("\t\t\t||                  《职工信息管理系统》                   ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                 请按相应按键使用本系统!                ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.员工登录                       2.管理员模式         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
    scanf("%d",&n);
    char number[9];
    char pow[10];
    if(n==2)
    {
        printf("请输入管理员账号");
        scanf("%s",number);
        fflush(stdin);
        printf("请输入密码");
        {
            for(int i=0; i<9; i++)
            {
                pow[i] = getch();
                /*逐次赋值,但不回显*/
                if (pow[i] == '\x0d')
                    /*回车则终止循环*/
                {
                    pow[i]='\0';
                    break;
                }
                printf("*");       /*以星号代替字符个数*/
            }
            fflush(stdin);
            if((strcmp(number,"0001")==0) && (strcmp(pow,"123456")==0))
            {
                return n;
            }
            else
                printf("账号或密码错误!");
        }
    }
    else if(n==1)
    {
        f_3 (workers);
        return n;
    }
    else
    {
        int n;
        system("cls");
        printf("请输入正确的功能编号!\n");
        system("pause");
        system("cls");
        sign();
    }
}

此处是登录页面 1 回显实际上存在问题,如果在输入过程中输入错误,想要把已经输入的数据删除的话,是无法完成的,因为使用的是getchar()delete实际上也是一种字符,这里是一个隐患。由于影响并不严重,不会影响到我的演示,就没有对这个问题进行修复。 2 管理员账号设置后无法更改,这点有点反人类,做出更改实际不难,但是这次实训三人小组实际上就我一个人负责,我真的不想再给自己找活干了。

3.2.4操作页面
代码语言:javascript
复制
int Hollow(void)
//管理员页面,在程序中会反复调用;
{
    system("cls");
    printf("\n\n\n\t\t\t=============================================================\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                   《职工信息管理系统》                  ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                       管理员页面!                      ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.新建职工信息                 2.浏览职工信息         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   3.查询职工信息                 4.删除职工信息         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   5.变更职工信息                 6.退出程序             ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
}

单纯的一个操作页面 ###### 3.2.5新建职工信息

代码语言:javascript
复制
void f_1(struct workers *workers)
//以尾加法插入新的数据,并写入text.dat二进制文件中;
{
    struct workers *p;
    //p是个指向结构体指针后面需要用到;
    p = (struct workers *)malloc(sizeof(struct workers));
    //对指针p分配大小;
    p=workers;
    printf("请输入员工号:");
    scanf("%s", p->jobNo);
    printf("请输入姓名:");
    scanf("%s", p->name);
    printf("请输入性别:");
    scanf("%s", p->sex);
    printf("请输入所担任职务:");
    scanf("%s", p->position);
    printf("请输入年龄:");
    scanf("%s",p->year);
    printf("请输入工资:");
    scanf("%s", p->salary);
    printf("请输入家庭住址:");
    scanf("%s", p->addr);
    printf("请输入员工联系方式:");
    scanf("%s", p->tel);
    FILE *fp=fopen("text.dat","ab+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
        //这段程序是结束函数块的,如果没有这段代码后面内容还会继续输出。
    }
    fwrite(workers,sizeof(struct workers),1,fp);
    //将数据存入函数中;
    fclose(fp);
    char ch[10];
    NUM++;
    sprintf(ch,"%d",&NUM);
    FILE *fp1;
    fp1=fopen("data.txt","w+");
    itoa(NUM,ch, 10);
    //一个没学过的函数,把整形数转化成字符型;
    fputs(ch,fp1);
    fclose(fp1);
    system("cls");
    /*
    使用外部变量NUM,在使用者使用程序时先行为,NUM赋值;
    */
    Hollow();
}

实现增添的一个程序块,主要功能**以追加的形式将数据存入二进制文件,并且将从文本文件中读取的NUM值自增,并将NUM重新存入文本文件中。** 解释说明: 1 由于每个程序块没有返回值的需要,函数就使用了没有返回值的void类型 2 **FILE** * **fp=fopen("text.dat","ab+");**以追加方式打开text.dat这个二进制文件 ,再使用**fwrite(workers,sizeof(struct workers),1,fp);**语句将一个大小为sizeof(struct workers)的结构体变量workers写入二进制文件中。 3 我在这里使用了itoa()这个函数,函数原型为 > char *itoa( int value, char *string,int radix) ***value***:欲转换的数据。 ***string***:目标字符串的地址。 ***radix***: 转换后的进制数,可以是10进制、16进制等。 同刚刚使用的atoi函数itoa函数也可以用格式化写函数fprintf()解决,终究还是多此一举了。

3.2.6浏览(筛选)职工信息:
代码语言:javascript
复制
void f_2(struct workers *workers)
//浏览已经写入的数据;
{
    system("cls");
    printf("\n\n\n\t\t\t=============================================================\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   1.浏览全部信息                 2.按性别方式筛选       ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||   3.按年龄方式筛选               4.按薪资筛选           ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t||                                                         ||\n");
    printf("\t\t\t=============================================================\n");
    int n;
    printf("请输入筛选的方式\n");
    scanf("%d",&n);
    if(n==1)
    {
        system("cls");
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");

        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        int i;
        for (i=0; i<NUM; i++)
        {
            p=&read[i];
            if(read[i].jobNo)
            {
                printf("——————————————————————————————\n");
                printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                printf("—————————————————————————————\n");
            }
        }
        system("pause");
        system("cls");
        Hollow();
    }
    else if(n==2)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工性别编号\n");
        printf("1.男性    \t\t     2.女性\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");

        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(strcmp(read[i].sex,"男")==0)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(strcmp(read[i].sex,"女")==0)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }

    }
    else if(n==3)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工薪资范围\n");
        printf("1.青年    \t\t     2.壮年\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");

        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];

                if(atoi(read[i].year)<30)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();

        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].year)>30)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }
    }
    else if(n==4)
    {
        int k;
        system("cls");
        printf("请输入要筛选的员工薪资范围\n");
        printf("1.低薪    \t\t     2.中薪\t\t\t  3.高薪\n");
        scanf("%d",&k);
        struct workers read[100],*p;
        FILE *fp=fopen("text.dat","rb+");
        if (fp==NULL)
        {
            printf("文件打开失败");
            exit(EXIT_FAILURE);
        }
        fread(read,sizeof(struct workers),100,fp);
        if (k==1)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].salary)<3000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if (k==2)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];
                if(atoi(read[i].salary)>=3000&&atoi(read[i].salary)<8000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else if(k==3)
        {
            int i;
            for (i=0; i<NUM; i++)
            {
                p=&read[i];

                if(atoi(read[i].salary)>=8000)
                {
                    printf("——————————————————————————————\n");
                    printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
                    printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
                    printf("—————————————————————————————\n");
                }
            }
            system("pause");
            system("cls");
            Hollow();
        }
        else
        {
            printf("你好像想查询什么奇奇怪怪的东西!\n");
            system("pause");
            system("cls");
            Hollow();
        }
    }
}

这一模块一开始计划是只是浏览全部的员工信息,在后期的实训过程中,想到一个公司经常会有各种活动,需要对参与员工进行筛选,对其追加了根据年龄,工资与性别的筛选功能。 解释说明: 1 浏览只需要将全部数据从二进制文件中读取到结构体,通过for循环将所有的数据输出到屏幕中。 2 关于筛选其实可以做的更好,比如说以年龄方式筛选的时候可以让使用者自己输入筛选的年龄范围,而不是我自己预先设定好的青年,壮年。同样按工资进行查询时同样也可以让使用者设置自己的筛选范围,这样可能对使用者更加友好。 3 第三点我曾经试图做出复合的筛选程序,只是感觉会过于复杂就没有做,大体的思路和现在一样,但是同时选择多种筛选方式,并对二进制文件中的数据进行复合筛选,找到需要的数据。

3.2.7查找职工信息:
代码语言:javascript
复制
void f_3_1(struct workers *n)
//以员工号方式查询某个员工的信息。
{
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");a
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的职工号:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].jobNo,found)==0)
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
    Hollow();
}
void f_3(struct workers *n)
//以员工号方式查询某个员工的信息。
{
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的职工号:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].jobNo,found)==0)
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
}
void f_3_2(struct workers *n)
{
    //以姓名方式查找员工;
    system("cls");
    struct workers read[100],*p;
    FILE *fp=fopen("text.dat","rb+");

    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),100,fp);
    char found[100];
    fclose(fp);
    printf("\n请输入你要查询的职工的姓名:");
    scanf("%s", found);
    int i;
    for (i=0; i<100; i++)
    {
        p=&read[i];
        if(strcmp(read[i].name,found)==0)
            //用found数组进行比较如果found数组和name相同则执行;
        {
            printf("——————————————————————————————\n");
            printf("|职工号|姓名  |性别|年龄|职务      |工资  |住址    |电话       |\n");
            printf("|%-6s|%-6s|%-4s|%-4s|%-10s|%-6s|%-8s|%-11s|\n ",p->jobNo, p->name, p->sex, p->year,p->position, p->salary, p->addr, p->tel);
            printf("—————————————————————————————\n");
            break;
        }
    }
    if (i==100)
        //当
    {
        printf("没有该员工!");
    }
    system("pause");
    system("cls");
    Hollow();
}

该模块对员工信息的查询功能包括两个方面,按员工号对员工信息进行查询和按照姓名方式进行查询,如果查询失败则输出没有该员工,返回操作页面。反之查询成功,输出查询到的数据。 1 这一块代码主要利用strcmp()函数比较输入的员工号或者员工姓名与从二进制文件中读取到结构体块中的数据对比,如果strcmp返回值为0则查询成功。 2 这部分代码也有改进的地方由于各种原因没有实现。

3.2.8删除员工信息
代码语言:javascript
复制
int f_4(struct workers *workers)
//删除数据;
{
    struct workers *p;
    int j;
    struct workers read[100];
    char find[10];
    FILE *fp=fopen("text.dat","rb");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),NUM,fp);
    printf("请输入要删除的职工号");
    scanf("%s",find);
    for(j=0; j<=NUM; j++)
    {
        if(strcmp(read[j].jobNo,find) == 0)
        {
            NUM--;
            //将num--这个操作,更改变量的大小,方便再次存入。
            break;
        }
    }
    if(NUM<j)
        //如果没有提前结束,j的最终大小回是num+1;判断num是否及时结束。
    {
        printf("该职工号不存在!");
        system("pause");
    }
    if(strcmp(read[j].jobNo,find) == 0)
    {
        for(j; j<NUM; j++)
        {
            strcpy(read[j].jobNo,read[j+1].jobNo);
            strcpy(read[j].name,read[j+1].name);
            strcpy(read[j].sex,read[j+1].sex);
            strcpy(read[j].position,read[j+1].position);
            strcpy(read[j].year,read[j+1].year);
            strcpy(read[j].salary,read[j+1].salary);
            strcpy(read[j].addr,read[j+1].addr);
            strcpy(read[j].tel,read[j+1].tel);
        }
    }
//将read[j]进行移位,达到删除的目的;
    fclose(fp);
//关闭文件
    char ch[10];
    //定义一个
    fp=fopen("text.dat","wb+");
    if (fp==NULL)
    {
        printf("删除失败!");
        exit(EXIT_FAILURE);
    }
    fwrite(read,sizeof(struct workers),NUM,fp);
    fclose(fp);
    FILE *fp1;
    fp1=fopen("data.txt","w+");
    //使用一个txt格式的文件作为辅助,进行数据量的计数。
    itoa(NUM,ch, 10);
    //一个没学过的函数,把整形数转化成字符型;
    fputs(ch,fp1);
    fclose(fp1);
    system("cls");
    system("pause");
    system("cls");
    Hollow();
}

从二进制文件中将数据全部读取出来,将输入的员工号与已有数据中的员工号进行比对,当数据相同时删除该员工信息,并将全部信息重新写入文件中。 1 这一块程序是我做出来感觉遗憾最大的一块,在C语言实训最后的答辩中,我看到很多同学在删除这一块下足了功夫,我看到有的同学在删除前增加了是否删除的验证程序,也有的同学在这一块追加了密码输入,以验证执行删除功能的是否是管理员本人。 2 如果有时间,可以尝试增加一个撤销删除的功能,这个功能之前想过,可以令设一个结构体变量暂时存储删除的数据,如果执行撤销删除程序是,则把暂存结构体中的数据写入二进制文件中。 #####3.2.9修改员工信息

代码语言:javascript
复制
void f_5(struct workers *workers)
//在文件中读取数据,对数据进行修改,最后在存入文件中。
{
    struct workers *p;
    int j;
    struct workers read[NUM];
    char find[10];
    FILE *fp=fopen("text.dat","rb");
    if (fp==NULL)
    {
        printf("文件打开失败");
        exit(EXIT_FAILURE);
    }
    fread(read,sizeof(struct workers),NUM,fp);
    printf("请输入要修改的职工号");
    scanf("%s",find);
    system("cls");
    for(j=0; j<NUM; j++)
    {
        if(strcmp(read[j].jobNo,find) == 0)
        {
            printf("\n\n\n\t\t\t=============================================================\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   1.修改员工号                   2.修改姓名             ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   3.修改性别                     4.修改担任职务         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   5.修改年龄                     6.修改员工工资         ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t||   7.修改员工家庭住址             8.修改员工联系方式     ||\n");
            printf("\t\t\t||                                                         ||\n");
            printf("\t\t\t=============================================================\n");
            p = (struct workers *)malloc(sizeof(struct workers));
            p=workers;
            int n;
            scanf("%d",&n);
            switch (n)
            {
            case 1:
                printf("请输入员工号:");
                scanf("%s", read[j].jobNo);
                break;
            case 2:
                printf("请输入姓名:");
                scanf("%s",read[j].name);
                break;
            case 3:
                printf("请输入性别:");
                scanf("%s", read[j].sex);
                break;
            case 4:
                printf("请输入所担任职务:");
                scanf("%s", read[j].position);
                break;
            case 5:
                printf("请输入年龄:");
                scanf("%s",read[j].year);
                break;
            case 6:
                printf("请输入工资:");
                scanf("%s",read[j].salary);
                break;
            case 7:
                printf("请输入家庭住址:");
                scanf("%s",read[j].addr);
                break;
            case 8:
                printf("请输入员工联系方式:");
                scanf("%s",read[j].tel);
                break;
            }
        }
    }
//以全部重新输入的形式去替换原本数据,达到修改的目的;
    fclose(fp);
    fp=fopen("text.dat","wb+");
    fwrite(read,sizeof(struct workers),NUM,fp);
    if (fp==NULL)
    {
        printf("文件修改失败");
        exit(EXIT_FAILURE);
    }
    printf("修改成功!");
    fclose(fp);
    system("pause");
    system("cls");
    Hollow();
//最后返回操作界面;
}

该模块具体执行数据的修改,分成八个部分修改员工的各种信息。

3.2.10退出程序
代码语言:javascript
复制
int f_6(char n)
//退出程序;
{
    printf("感谢您使用本系统,祝您工作愉快\n");
    system("pause");
    system("cls");
    return 0;
}

4.漏洞分析与修复

在整个C语言实训中,我不断的制造大大小小的bug,同时也在不断的修复这些bug,以下是我在这个C语言实训中遇到的一些问题。 1.起初我对删除文件信息的设计存在无法修复的缺陷,起初的设想是用空格字符串去换结构体数组中的每一项字符串,但做出来,再次浏览时发现位置被空格字符串占据,尝试修改这个被空格占据的结构体,发现无法继续对该位置进行操作,最终决定放弃该思路。 2.在浏览全部数据时难以判断存入数据多少;在老师的指导下采用了一个txt文件作为辅助,这一点极其关键,我的这串代码如果缺少了作为辅助的文本文件data.txt实际上是无法运行的,但同时我的程序中也没有代码块,包含对该辅助文件的创建,只有对改文件进行更新,意味着使用改系统,必须手动创建一个文本文件data.txt 3.文本文件的读写,将文本文件的信息读入程序时发现存在问题,在文本文件中是以字符型的一个个数字,而在程序中使用我需要的是一个整形数,最后百度找到了一个函数atoi就这个将字符型数转化成整形 4.同上一个问题在写入时也有这个问题,然后就找到了一个函数将int类型转化成char数组。 5.在添加员工的过程中,一开始使用了wb+却没注意到,发现数据一直存不进去。之后看到打开方式,改成ab+就没问题了。 6.在员工登录,执行完查询程序后,意外弹出了管理员的页面,检查程序发现是起初按管理员模式写的操作页面被镶嵌到每一个功能块的最后,而员工直接调用管理员的查询函数照成了该故障,故重写了一个更改过的查询函数,用在员工页面。 7.在使用工程解决的时候因为对文件引用不太了解出现了一堆问题,修复了半天。 8.其实在查询的时候那个格式真的很难弄,一开始的思路存在问题,起初是根据第一个存入的数据大小更改页面的大小,但是发现只要输入的数据发生改变,就会导致格式不在规范,最后则是由%nd的形式规范

5.总结反思

由于我们的C语言的实训,由于开课比较早,专业课没有结束,做项目需要的结构体的知识和文件调用的知识并没有学,最初做起来也是非常困难,利用互联网去查询如何实现文件调用,去看网络上其他人做到程序,通过种种方式去学习这些内容,对我们组每一位组员的自我学习能力都是一个巨大的提高。 另一个体会是规划的重要性,我们一开始程序设计分析的时候对规划做得并不好,很多程序功能都是后面有了构思后补充的,如果会进行下一次的实训,系统的构思一定要做好。 生活中我们习以为常的小问题,我们看似毫无新意的小程序,由我们自己实施起来却困难重重,大家都喜欢开程序员的玩笑,说,你怎么还不秃顶。看似调侃却透露出编程的不易,而属于我们的一切才刚刚开始,实训当然是挺难的,没有接触的函数,细小的失误,复杂的逻辑,但所幸我们成功地站在了这里。我们从中吸取了许多教训,我们对以后的学习和生活有了更多的了解。

这是最好的时代,这是最坏的时代,我们仍然年轻,我们仍然伫立。——–致所有在座的各位。

6收获

实训真的带给我们很多提高,使用的很多函数都是课上没有讲过的,而这里调了一些展示出来

system(“pause”);暂停函数,避免程序运行跳转太快而无法看清数据。 system(“cls”);清屏函数,清楚屏幕上的信息,方便程序展示。 atoi()函数将char类型数转化为int类型的数。 itoa()函数将int类型的变量转化为字符串。 Sleep()函数来自Windows.h中的函数,让程序延迟一段时间,登录系统的动画就是应用了该函数 fflush(stdin)函数,清空缓冲器,方便后续的文件读写

在其他的方面,如小组合作,自我学习能力,从网络上获取知识的能力都得到显著的提高。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.需求分析
    • 1.1员工登录
      • 1.2管理员登录
      • 2.系统设计
        • 2.1实现员工登陆查询信息系统
          • 2.2实现管理员登录管理系统
            • 模块五:实现修改员工信息功能;
            • 模块六:实现退出服务系统功能;
            • 模块七:实现读取已存入数据个数
            • 模块八:管理员登录后的操作页面;
            • 3.1.1company.h
            • 3.1.2company.c
            • 3.2分函数讲解
        • 3.详细代码
        • 4.漏洞分析与修复
        • 5.总结反思
        • 6收获
        相关产品与服务
        云开发 CloudBase
        云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档