一小时教你学会C语言系统!C语言实战教程-学生信息管理系统源码

news2024/9/21 18:52:21

本次教程带大家做一个C语言学生信息管理系统,带教程视频

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

期末C语言课设不会做?

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

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

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

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

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

原文如下,可以去原文看下 有某站的视频讲解教程:
在这里插入图片描述

目标

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

功能需求分析

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

教程

显示菜单

  • 首先,将框架搭好,写好菜单函数,保证菜单内容正常显示
  • 菜单显示逻辑:用户输入功能编号,执行功能,用户输入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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础语法(多进程开发进程建数据共享进程锁进程池)

Python基础语法文章导航&#xff1a; Python基础&#xff08;01初识数据类型&变量&#xff09;Python基础&#xff08;02条件&循环语句&#xff09;Python基础&#xff08;03字符串格式化&运算符&进制&编码&#xff09;Python基础&#xff08;04 基础练习…

93.游戏的启动与多开-进程枚举多开检测

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;92.游戏的启动与多开-多开检测概述 枚举多开检测在事前检测用的很少&#xff0c;在事中…

Https配置免费SSL证书

本文目录 前言一、前提1.1 服务器1.2 域名 二、Certbot简介2.1 Apache服务器2.2 Nginx服务器 三、自动更新证书四、效果 前言 HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的…

【重学 MySQL】二、MySQL 介绍

【重学 MySQL】二、MySQL 介绍 MySQL 概述MySQL 的主要特点MySQL 的应用场景结论 MySQL 发展史初始创建与发布开源与快速成长重要版本发布收购与变革分支与竞争持续发展与现代应用 关于 MySQL8.0主要新特性和改进兼容性和迁移应用场景总结 为什么选择 MySQLOracle VS MySQL基本…

【Elasticsearch】Elasticsearch集群在分布式环境下的管理

文章目录 &#x1f4d1;前言一、集群规划与设计1.1 集群拓扑结构设计1.2 节点角色分配1.3 分片与副本配置 二、集群管理与运维2.1 集群监控2.2 故障处理2.3 性能优化 三、扩展与升级3.1 集群扩展3.2 集群升级3.3 灾备与容灾 &#x1f324;️总结 &#x1f4d1;前言 Elasticsear…

【重构获得模式 Refactoring to Patterns】

重构获得模式 Refactoring to Patterns 面向对象设计模式是“好的面向对象设计”&#xff0c;所谓“好的面向对象设计”指的是那些可以满足“应对变化&#xff0c;提高复用”的设计。 现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点&#xff0c;然后…

2024.9.3 作业

自己封装 栈和队列 #include <iostream>using namespace std;class mystack { private:int *data;int size;int top; public://无参构造mystack():size(10){data new int[size];top -1;size 10;}//有参构造mystack(int s){data new int[s];top -1;size s;}//赋值my…

智慧医院是什么?建设智慧医院的关键步骤

智慧医院是什么&#xff1f; 智慧医院是一种新型的医疗机构&#xff0c;它利用先进的信息技术、数据分析和智能化系统&#xff0c;优化医院的管理和服务流程&#xff0c;提高医疗质量和效率。在智慧医院中&#xff0c;所有的运营和管理环节都可以通过数据驱动的方式来实现优化…

【网络安全】服务基础第一阶段——第十节:Windows系统管理基础---- 组策略高级应用

目录 一、组策略的基本概念 1.1 组策略的基本概念 1.1.1 组策略对象 1.2 配置 1.2.1 计算机配置&#xff08;Computer Configuration&#xff09; 1.2.2 用户配置&#xff08;User Configuration&#xff09; 1.3 作用范围 1.4 继承和优先级 1.4.1 继承&#xff08;In…

【AI】Pytorch_模型构建

建议点赞收藏关注&#xff01;持续更新至pytorch大部分内容更完。 本文已达到10w字&#xff0c;故按模块拆开&#xff0c;详见目录导航。 整体框架如下 数据及预处理 模型及其构建 损失函数及优化器 本节目录 模型线性回归逻辑回归LeNetAlexNet 构建模块组织复杂网络初始化网络…

SpringBoot学习(3)(配置文件的基本使用)

1、初步大致学习方向&#xff08;基础&#xff09; 配置文件整合MyBatisBean管理&#xff08;主要学习如何管理第三方bean对象&#xff1f;&#xff1f;如导入一个jar包&#xff0c;这个jar包中的一些对象&#xff0c;如何注入到Ioc容器里&#xff09;自动配置原理&#xff08;…

史上最全的Mysql索引教程

一、什么是索引 1.1 索引简介 索引是数据库中用来提高数据检索效率的数据结构。它类似于书籍的目录&#xff0c;可以帮助用户快速找到所需的数据&#xff0c;而不必扫描整个数据集。在数据库系统中&#xff0c;索引可以显著提高查询性能。 所谓的存储引擎&#xff0c;说白了…

【mysql】SQL语言的概述

基本select语句的使用&#xff1a; SQL概述&#xff1a; 1946年&#xff0c;第一台电脑诞生了&#xff0c;有很多基础技术在里面&#xff0c;但是在几十年来&#xff0c;保留下来的技术SQL就是其中之一&#xff0c; 1974年的时候&#xff0c;IBM的研究员发布了一篇揭开数据库…

代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集

目录 0、背包问题基础01背包 46. 携带研究材料&#xff08;01背包&#xff09;1、题目描述2、思路3、code&#xff08;二维解法&#xff09;3-1、code&#xff08;一维解法&#xff09;4、复杂度分析 416. 分割等和子集1、题目描述2、思路3、code4、复杂度分析 0、背包问题基础…

如何有效地管理个人时间:策略与技巧

在快节奏的生活环境中&#xff0c;时间成为了最宝贵的资源之一。有效地管理时间不仅能提高工作效率&#xff0c;还能提升生活质量&#xff0c;使你有更多的时间投入到家庭、爱好和个人成长中去。本文将分享一些实用的时间管理技巧&#xff0c;帮助你更好地安排每日事务。 时间…

[HZNUCTF 2023 preliminary]easyAPK-快坚持不下去的第三天

第一做安卓题&#xff0c;前提jadx,java环境&#xff0c;模拟器&#xff0c;我配了好久&#xff0c; 这段代码实现了一个简单的登录界面&#xff0c;用户需要输入用户名和密码。用户名和密码会与预设的硬编码值进行比较&#xff0c;登录成功后会启动另一个 Activity。如果密码错…

TS 学习(一)

如果我们在 ts 中写 不用运行就能在文件中报错 ts 是一种静态类型的检查 能将运行时出现的错误前置 一般不用 命令行编译 ts 转换成 js 将中文转码 tsc index&#xff08;.ts&#xff09; 输入命令生成 配置文件 能在中间进行 配置转换成 js 的哪个规范 es5 还是 6 和其它转…

鸿蒙(API 12 Beta6版)图形【过度绘制调试使用指导】方舟2D图形服务

当应用页面布局的嵌套程度过深时&#xff0c;应用渲染阶段会存在一些组件的绘制指令被其他组件的绘制指令部分或完全覆盖遮挡的情况&#xff0c;造成冗余的cpu、gpu等计算资源的使用。这种一个屏幕上的像素点被重复绘制了多次的情况被称为过度绘制&#xff08;Overdraw&#xf…

Vite - 兼容旧版浏览器 plugin-legacy(2)

目录 1&#xff0c;问题2&#xff0c;解决3&#xff0c;String 其他新增 API 的版本 接上文 Vite - 兼容旧版浏览器 plugin-legacy&#xff08;1&#xff09; 1&#xff0c;问题 客户浏览器报错&#xff0c;不支持 replaceAll 方法。 该方法在 query-string 依赖内部使用了。…

通过生日计算年龄

// 获取当前月 function getDate(date) {let d new Date(date);// 将日期设置为下月一号d.setMonth(d.getMonth() 1);d.setDate(1);// 获取本月最后一天d.setDate(d.getDate() - 1);return d.getDate(); } // 获取年龄 传出生日期和当前日期&#xff0c;当前日期可以不用传 f…