C语言实战教程-XX管理系统
原创大约 8 分钟
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);
}