跳至主要內容

C语言实战教程-XX管理系统

学长敲代码原创大约 8 分钟教程C/C++

C语言实战教程-XX管理系统

期末C语言课设不会做?

想学习一下怎么用C语言做出一个完整的系统?完整的步骤是怎么样的?

本教程就教你怎么从0搭建一个系统并且完美运行起来,建议跟着B站视频教程讲解进行,本文是配套文档

这次的教程以C语言员工信息管理系统为例子,在视频教程里,也会教你如果将他改造成其他的题目,
管理系统的制作过程都是大同小异,如:

  • 学生信息管理系统
  • 成绩管理系统
  • ...

(员工信息可以替换为学生信息、成绩、课程、教师等其他符合你题目的...)

如需直接获取完整源码,可在本视频评论区查看获取方式

目标

  • 熟悉for循环、if-else、函数、结构体、数组、的使用
  • 学会用C语言制作出一个简单的管理系统
  • 学会将通过txt文件保存数据,并且通过程序可以读取
  • 在系统中用到排序算法
  • 熟悉使用开发工具devc++

功能需求分析

  • 用户根据菜单输入1、2、3、4、5、6选择功能
  • 增删改查(根据姓名、性别、工资查询筛选)员工信息
  • 将员工信息保存到txt文件
  • 读取txt文件的员工信息
  • 根据姓名、工资等进行排序

订做课设

或者如果你想订做其他课设、期末课设、毕业设计,也可以通过以下方式找我们,说出你的需求,
可以快速高质量订做C、C++、数据结构 C++面向对象的课设

207732272
1436834022
149478984

教程

显示菜单

  • 首先,将框架搭好,写好菜单函数,保证菜单内容正常显示
  • 菜单显示逻辑:用户输入功能编号,执行功能,用户输入0退出菜单

以下为创建好菜单后,系统框架初步搭建完成。

#include <stdio.h>
void menu ();
int main() {
	while(1) {
		
		int choice;
		menu ();
		scanf("%d",&choice);
        switch(choice) {
            case 1 :
                printf("添加员工\n");
                break;
            case 2 :
                printf("删除员工\n");
                break;
            case 3 :
                printf("修改员工\n");
                break;
            case 4 :
                printf("查看员工\n");
                break;
            case 5 :
                printf("排序员工\n");
                break;
            case 6 :
                printf("保存成功\n");
                break;
            case 0:
                printf("\n\n\n\t\t\t感谢使用\n\n\n");
                exit(0);
            default :
                getchar();
                printf("\n\n\n\t提示:没有这个选项!请重新输入!\n\n\n\n");
                system("pause");
                break;
        }
	
	} 
	
} 

void menu () {
    //菜单
    printf("*------------------主菜单---------------------*\n");
    printf("*-------------1 :添加员工\n");
    printf("*-------------2 :删除员工\n");
    printf("*-------------3 :修改员工\n");
    printf("*-------------4 :查找员工\n");
    printf("*-------------5 :排序员工\n");
    printf("*-------------6 :保存\n");
    printf("*-------------0:退出\n");
    printf("*---------------------------------------------*\n");
    printf("请输入选择:");
}

创建结构体

  • 拟定员工信息数据,包括姓名、性别、电话、工资、年龄,

这里可以自行修改数据,不一定要和我一样,如学生的学号、姓名、班级...

//定义 员工 结构体
struct Employee {
    char name[15] ; // 姓名
    char gender[8] ; // 性别
    char tele[16] ; // 电话
    double gongzi ; // 工资
    int age ; // 年龄
};
//存储员工数据
struct Employee employeeList [100];
//记录员工个数
int employeeCount = 0;

添加员工

添加功能代码如下,当前系统已经可以添加员工信息了

//判断员工姓名是否存在
int getOneEmployeeByName (char *s) {
    int res = -1,i;
    for( i = 0; i < employeeCount ; i++) {
        if(strcmp(s, employeeList [i]. name )==0) { //如果用户名相等 
            res = i;
            break;
        }
    }
    return res;
}
//员工 添加记录
void addEmployee () {
    char selectYNFlag = 'y';
    while(selectYNFlag == 'y' || selectYNFlag == 'Y' ) {
        printf("\n");
        printf("请输入姓名 :");
        scanf("%s",employeeList [ employeeCount ] . name);
        //保证 
        int getOneEmployeename = getOneEmployeeByName (employeeList [ employeeCount ] . name);
        if( getOneEmployeename >=0) { //检索不为空
            printf("姓名已存在!\n");
            break;
        }
        printf("请输入性别 :");
        scanf("%s",employeeList [ employeeCount ] . gender);
        printf("请输入电话 :");
        scanf("%s",employeeList [ employeeCount ] . tele);
        printf("请输入工资 :");
        scanf("%lf",&employeeList [ employeeCount ] . gongzi);
        printf("请输入年龄 :");
        scanf("%d",&employeeList [ employeeCount ] . age);
        //employeeCount 是全局变量
        employeeCount ++;
        printf("\n是否继续录入?(y/n)");
        getchar();
        scanf("%c",&selectYNFlag);
    }
    
    printf("\n*****************************\n");
    printf("录入完成\n");
    printf("*****************************\n");
}

员工查询

为了让刚刚添加的员工信息可以查询出来,我们先做员工查询功能。

//员工查询
void findEmployee () {
	int select = 0;
    //用户所需输入的条件 
    char conCharArr[40];
    double conNum1,conNum2;

	printf("0:全部\n");
    printf("1:按 姓名 查询\n");
    printf("2:按 性别 查询\n");
    printf("3:按 工资 查询\n");
    printf("请输入选择:");
    scanf("%d",&select);
    if(select==1 ||select==2 ) {
        printf("请输入筛选条件:");
        scanf("%s",conCharArr);
    } else if(select==3 ) {
        printf("请输入筛选范围m,n,用空格隔开(m ≤年龄 ≤n):");
        scanf("%lf",&conNum1);
        scanf("%lf",&conNum2);
    }
    
    printf("\n%-5s%-15s%-10s%-16s%-12s%-10s\n\n","序号" ,"姓名","性别","电话","工资","年龄" );
    //用于统计信息所用
    int count = 0,i;
    double gongziSum=0;
    int ageSum=0;
    for (i = 0; i <  employeeCount ; i++) {
        if(select == 0
                || select == 1 && strstr(employeeList [i]. name,conCharArr) //根据姓名,模糊查询
                || select == 2 && strstr(employeeList [i]. gender,conCharArr) //根据性别,模糊查询
                || select == 3 && employeeList [i]. gongzi>= conNum1&&employeeList [i]. gongzi<=conNum2 //根据工资 范围查询
          ) {
            printf("%-5d%-15s%-10s%-16s%-12lf%-10d \n\n",i
                   ,employeeList [i] . name
                   ,employeeList [i] . gender
                   ,employeeList [i] . tele
                   ,employeeList [i] . gongzi
                   ,employeeList [i] . age
                  );
            //用于统计信息所用
            gongziSum += employeeList [i].gongzi;
            ageSum += employeeList [i].age;
            count++;
        }
    }
    printf("共%d条结果\n",count);
    printf("-----------------------------------------------------------------------------------------------------\n");
    printf("【工资】平均:%.2lf\n" ,count!=0?gongziSum * 1.0 / count :0);
    printf("【年龄】平均:%.2lf\n" ,count!=0?ageSum * 1.0 / count :0);
    printf("\n");
}

保存到txt、读取txt

我们希望刚刚输入的数据,不仅可以查出来,还可以保存到txt文件,下次运行的时候系统还可以自动读取,读写文件的代码如下,
我们还需要在系统启动后,就调用readEmployee (),在用户输入6时,调用writeEmployee ()。读写功能到此完毕!

//员工 读入文件
void readEmployee () {
    FILE *fp = NULL;
    if (NULL == (fp = fopen("Employee.txt", "r"))) { //读打开
        return;
    }
    int i=0;
    //从文件读取数据
    while (fscanf(fp, "%s%s%s%lf%d"
                  ,employeeList[i].name  ,employeeList[i].gender  ,employeeList[i].tele  ,&employeeList[i].gongzi  ,&employeeList[i].age
                 ) != EOF) { //读取
        i++;
    }
    //记录总数
    employeeCount = i;
    if(fp)
    fclose(fp);
}
//员工 写入文件
void writeEmployee () {
    FILE *fp = NULL;
    int i;
    fp = fopen("Employee.txt", "w+");
    for( i = 0; i< employeeCount ; i++) {
        fprintf(fp,"%s %s %s %lf %d\n"
                ,employeeList[i].name  ,employeeList[i].gender  ,employeeList[i].tele  ,employeeList[i].gongzi  ,employeeList[i].age );
    }
    if(fp)
    fclose(fp);
}

修改员工

进入修改功能,可以先显示已有员工列表,然后选中需要修改的记录,进行修改

要显示已有员工列表,可以用上面写过的findEmployee()函数,但是它有筛选功能怎么办,
我们可以对findEmployee函数进行改造:findEmployee(int all),加一个参数all:是否显示全部

  • 如果all不为0,则不显示查询条件,直接打印全部
  • 如果all=0,则显示查询条件。
//改造后的findEmployee查询员工信息: 
void findEmployee (int all) {
	int select = 0;
	//用户所需输入的条件
	char conCharArr[40];
	double conNum1,conNum2;
    //添加判断,如果输入的all是0,则进行查询功能,如果是1,则select=0直接显示全部信息
	if(all==0){
		printf("0:全部\n");
		printf("1:按 姓名 查询\n");
		printf("2:按 性别 查询\n");
		printf("3:按 工资 查询\n");
		printf("请输入选择:");
		scanf("%d",&select);
		if(select==1 ||select==2 ) {
			printf("请输入筛选条件:");
			scanf("%s",conCharArr);
		} else if(select==3 ) {
			printf("请输入筛选范围m,n,用空格隔开(m ≤年龄 ≤n):");
			scanf("%lf",&conNum1);
			scanf("%lf",&conNum2);
		}
	}
	printf("\n%-5s%-15s%-10s%-16s%-12s%-10s\n\n","序号" ,"姓名","性别","电话","工资","年龄" );
    //...下面不变
//员工 修改
void modEmployee () {
    printf("请输入您要修改的员工 序号(输入-1退出):");
    int indexOfMod = -1;
    scanf("%d",&indexOfMod);
    if(indexOfMod >= 0 && indexOfMod < employeeCount ) {
        //开始修改
        printf("请输入姓名 :");
        char name[15];
        scanf("%s",name);

        if(strcmp(employeeList [indexOfMod] . name,name) != 0 && getOneEmployeeByName (name)>=0) { //检索不为空
            printf("姓名 已存在!\n");
            return;
        }
        strcpy(employeeList [ indexOfMod ] .name,name);
        printf("请输入性别 :");
        scanf("%s",employeeList [ indexOfMod ] . gender);

        printf("请输入电话 :");
        scanf("%s",employeeList [ indexOfMod ] . tele);

        printf("请输入工资 :");
        scanf("%lf",&employeeList [ indexOfMod ] . gongzi);

        printf("请输入年龄 :");
        scanf("%d",&employeeList [ indexOfMod ] . age);

        printf("修改成功!\n");
    } else {
        printf("输入错误!\n");
    }

}

删除员工

//员工 删除
void delEmployee () {
    printf("请输入您要删除的 员工 序号(输入-1退出):");
    int index;
    scanf("%d",&index);

    int res = delEmployeeByIndex (index);
    if(res) {
        printf("删除成功!\n\n");
    } else {
        printf("删除失败!\n\n");
    }

}
//员工 根据下标删除 0表示删除失败,1表示删除成功 
int delEmployeeByIndex (int index) {
    if(index >= employeeCount || index < 0) {
        return 0;
    }
    //开始删除!
    int i;
    for(i = index; i < employeeCount - 1 ; i++) {
        //元素全部往前移一位。
        employeeList [i] = employeeList [i+1];
    }
    //最后令栈的长度减一
    employeeCount = employeeCount - 1;
    return 1;
}

排序员工

//排序员工 
void sortEmployee () {
    int i,j,select;
    printf("1:按 姓名 排序\n");
    printf("2:按 性别 排序\n");
    printf("3:按 电话 排序\n");
    printf("4:按 工资 排序\n");
    printf("5:按 年龄 排序\n");
    printf("请输入选择:");
    scanf("%d",&select);
    for( i = employeeCount -1; i>0; i--) {
        for( j = 0; j < i; j++) {
            if(    0
                    || select == 1 && strcmp(employeeList [j]. name , employeeList [j+1]. name)>0
                    || select == 2 && strcmp(employeeList [j]. gender , employeeList [j+1]. gender)>0
                    || select == 3 && strcmp(employeeList [j]. tele , employeeList [j+1]. tele)>0
                    || select == 4 && employeeList [j]. gongzi - employeeList [j+1]. gongzi > 0
                    || select == 5 && employeeList [j]. age - employeeList [j+1]. age > 0
              ) {
                
                struct Employee employee = employeeList [j];
				employeeList [j] = employeeList  [j+1];
				employeeList [j+1] = employee ;
            }
        }
    }
    findEmployee (1);
}