【挑战开发100个项目 | 1. C语言学生管理系统】

news2024/11/25 13:28:43

本项目是一个简易的学生信息管理系统,用户可以通过命令行界面完成学生信息的增加、删除、修改、查询、排序和列表展示等功能。数据以txt文件形式存储,实现了数据持久化。项目采用模块化设计,具有较好的可读性和扩展性。

一,开发环境需求

  • 操作系统 :windows, linux

  • 开发环境工具 :qt ,vscode, visual studio

  • 技术要求

    • 语言: C
    • 数据结构: 链表
    • 文件操作: 文件读写操作

二,功能说明

在这里插入图片描述

三,功能实现

  1. 录入学生信息
void addStudent(StudentList *list) {
    Student newStudent;
    printf("请输入学生信息:\n");
    printf("学号: ");
    scanf("%d", &(newStudent.id));
    while(getchar() != '\n');
    printf("姓名: ");
    fgets(newStudent.name, sizeof(newStudent.name), stdin);
    newStudent.name[strlen(newStudent.name)-1] = '\0'; // remove the newline
    printf("年龄: ");
    scanf("%d", &(newStudent.age));
    while(getchar() != '\n');
    printf("性别: ");
    fgets(newStudent.gender, sizeof(newStudent.gender), stdin);
    newStudent.gender[strlen(newStudent.gender)-1] = '\0';
    printf("专业: ");
    fgets(newStudent.major, sizeof(newStudent.major), stdin);
    newStudent.major[strlen(newStudent.major)-1] = '\0';
    printf("班级: ");
    fgets(newStudent.class_name, sizeof(newStudent.class_name), stdin);
    newStudent.class_name[strlen(newStudent.class_name)-1] = '\0';
    printf("成绩: ");
    scanf("%f", &(newStudent.score));

    // add the new student to the list
    StudentNode *newNode = (StudentNode*)malloc(sizeof(StudentNode));
    newNode->data = newStudent;
    newNode->next = list->head;
    list->head = newNode;
    list->count++;

    printf("学生信息已添加成功!\n");
}

此函数用于添加学生信息。

  1. 删除学生信息
void deleteStudent(StudentList *list) {
    int id;
    printf("请输入要删除的学生的学号: ");
    scanf("%d", &id);

    StudentNode *current = list->head;
    StudentNode *previous = NULL;
    while (current != NULL) {
        if (current->data.id == id) {
            if (previous == NULL) {
                list->head = current->next;
            } else {
                previous->next = current->next;
            }
            free(current);
            list->count--;
            printf("学生信息已删除。\n");
            return;
        }
        previous = current;
        current = current->next;
    }
    printf("未找到该学生的信息。\n");
}

此函数用于删除指定学生信息。

3.s 修改学生信息

void modifyStudent(StudentList *list) {
    int id;
    printf("请输入要修改的学生的学号: ");
    scanf("%d", &id);

    StudentNode *current = list->head;
    while (current != NULL) {
        if (current->data.id == id) {
            printf("请输入新的学生信息:\n");
            printf("姓名: ");
            while(getchar() != '\n'); // clear buffer
            fgets(current->data.name, sizeof(current->data.name), stdin);
            current->data.name[strlen(current->data.name)-1] = '\0'; // remove newline
            printf("年龄: ");
            scanf("%d", &(current->data.age));
            printf("性别: ");
            while(getchar() != '\n');
            fgets(current->data.gender, sizeof(current->data.gender), stdin);
            current->data.gender[strlen(current->data.gender)-1] = '\0';
            printf("专业: ");
            while(getchar() != '\n');
            fgets(current->data.major, sizeof(current->data.major), stdin);
            current->data.major[strlen(current->data.major)-1] = '\0';
            printf("班级: ");
            while(getchar() != '\n');
            fgets(current->data.class_name, sizeof(current->data.class_name), stdin);
            current->data.class_name[strlen(current->data.class_name)-1] = '\0';
            printf("成绩: ");
            scanf("%f", &(current->data.score));
            printf("学生信息已修改。\n");
            return;
        }
        current = current->next;
    }
    printf("未找到该学生的信息。\n");
}

此函数用于修改指定学生信息。

  1. 查询学生信息
void queryStudent(const StudentList *list) {
    int id;
    printf("请输入要查询的学生的学号: ");
    scanf("%d", &id);

    StudentNode *current = list->head;
    while (current != NULL) {
        if (current->data.id == id) {
            printf("学号: %d\n", current->data.id);
            printf("姓名: %s\n", current->data.name);
            printf("年龄: %d\n", current->data.age);
            printf("性别: %s\n", current->data.gender);
            printf("专业: %s\n", current->data.major);
            printf("班级: %s\n", current->data.class_name);
            printf("成绩: %.2f\n", current->data.score);
            return;
        }
        current = current->next;
    }
    printf("未找到该学生的信息。\n");
}

此函数用于查询指定学生信息。

  1. 对学生信息排序
// 排序学生信息(这里以学号为例,升序排列)
void sortStudents(StudentList *list) {
    // 使用冒泡排序算法
    if (list->count < 2) return;

    StudentNode *i, *j;
    for (i = list->head; i->next != NULL; i = i->next) {
        for (j = list->head; j->next != NULL; j = j->next) {
            if (j->data.id > j->next->data.id) {
                // 交换数据
                Student temp = j->data;
                j->data = j->next->data;
                j->next->data = temp;
            }
        }
    }
    printf("学生信息已排序。\n");
}

此函数用于对学生信息进行排序。

  1. 列出所有学生信息
void displayAllStudents(const StudentList *list) {
    if (!list->head) {
        printf("没有学生信息可供显示。\n");
        return;
    }

    printf("学号   姓名       年龄 性别 专业                  班级       成绩\n");
    printf("-----------------------------------------------------------------\n");

    StudentNode *current = list->head;
    while (current != NULL) {
        printf("%-6d %-10s %-4d %-4s %-20s %-10s %.2f\n",
               current->data.id, current->data.name, current->data.age,
               current->data.gender, current->data.major, current->data.class_name,
               current->data.score);
        current = current->next;
    }

    printf("-----------------------------------------------------------------\n");
}

此函数用于显示所有学生的信息。

四,效果图

后续截图添加

五,源码

代码已开源,可访问gitee下载。

六,总结

本项目是一个简单的学生信息管理系统,通过命令行界面与用户交互。主要实现了学生信息的增、删、查、改等功能。项目中主要使用C语言进行开发,并使用链表作为主要数据结构。经过严格的测试和修正,现在可以正常运行并满足基本的需求。

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

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

相关文章

服装租赁小程序商城的作用是什么

如毕业礼服、演出服、场景拍照服、拍戏拍段子等很多人并不会直接全价购买&#xff0c;由于穿着次数少&#xff0c;所以服装租赁在市场中的需求也不少。 但传统线下服装租赁商家也很难拓展到客户&#xff0c;而需求者也无法快速触达到商家&#xff0c;线上经营没有自己的平台&a…

自学WEB后端03-Node.js 语法

学习后端路线&#xff1a; JavaScript 基础语法 Node,js 内置 API 模块 (fs、 path、 http等) 第三方 API 模块 (express、mysql等) 今天主要回顾下Node.js 语法 Node.js 是基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它提供了一种能够在服务器端运行 JavaScr…

如何使用php提取文章中的关键词?PHP使用Analysis中英文分词提取关键词

1、下载Analysis&#xff0c;创建test.php测试 2、引入Analysis实现中文分词 <?php include "./Analysis/Analysis.php";$annew \WordAnalysis\Analysis(); $content"机器学习是一门重要的技术&#xff0c;可以用于数据分析和模式识别。"; //10分词数…

Python3操作MySQL8.XX创建表|CRUD基本操作

Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 一&#xff1a; Python3操作Mysql数据库建表 import pymysqlPython3操作Mysql创建表&#xff1a; # 打开数据库连接 db pymysql.connect(host"localhost", user"您…

R语言绘制环状柱状堆积图+分组+显著性

无叠加、显著性的代码&#xff1a; #设置工作环境 rm(listls()) setwd("D:/Desktop/0000/code-main/条形图")#加载R包 library(ggplot2) # Create Elegant Data Visualisations Using the Grammar of Graphics library(tidyverse) # Easily Install and Load the Ti…

联邦学习应用研究现状及发展趋势

本文章主要参考第32届国际人工智能联合会议&#xff08;IJCAI&#xff09;上由清华大学人工智能研究院知识工程研究中心&#xff08;KEG&#xff09;、北京智谱华章科技有限公司、开放群岛开源社区联合编写的《2023联邦学习全球研究与应用趋势报告》&#xff0c;对重点内容进行…

机器学习算法基础--K-means应用实战--图像分割

目录 1.项目内容介绍 2.项目关键代码 3.项目效果展示 1.项目内容介绍 本项目是将一张图片进行k-means分类&#xff0c;根据色彩k进行分类&#xff0c;最后比较和原图的效果。 题目还是比较简单的&#xff0c;我们只要通过k-means聚类&#xff0c;一类就是一种色彩得出聚类之…

一创聚宽的实盘就要关闭了,有没有好用的实盘平台推荐

挺多的&#xff0c;比较普遍的是QMT和Ptrade&#xff0c;python语言&#xff0c;易上手&#xff0c;通用性好&#xff0c;要说适用性可以考虑Ptrade&#xff0c;问一下你的客户经理有没有&#xff0c;用Ptrade的券商也多&#xff0c;如果之前用一创聚宽你可以无缝切换&#xff…

网络安全内网渗透之DNS隧道实验--dnscat2直连模式

目录 一、DNS隧道攻击原理 二、DNS隧道工具 &#xff08;一&#xff09;安装dnscat2服务端 &#xff08;二&#xff09;启动服务器端 &#xff08;三&#xff09;在目标机器上安装客户端 &#xff08;四&#xff09;反弹shell 一、DNS隧道攻击原理 在进行DNS查询时&#x…

python中使用matplotlib绘图

一、背景 当我们在写python程序时&#xff0c;不可避免的需要将数据可视化&#xff0c;也就是绘制出数据的曲线图&#xff0c;以便我们更直观的观察数据间的变化&#xff0c;以及方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是&#xff1a; 翻译过来也就…

SQLAlchemy关联表删除策略设置

目录 SQLAlchemy关联表 常用的级联选项 外键 SQLAlchemy关联表 SQLAlchemy 是一个 Python 的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它允许你在 Python 中使用类来表示数据库中的表&#xff0c;从而更方便地进行数据库操作。在 SQLAlchemy 中&#xff0c;可…

ElementUI - 主页面--动态树右侧内容管理

一.左侧动态树 1.定义组件 ①样式&数据处理 <template><el-menu class"el-menu-vertical-demo" background-color"#334157"text-color"#fff" active-text-color"#ffd04b" :collapse"collapsed" router :def…

手撸RPC【gw-rpc】

文章目录 基于 Netty 的简易版 RPC需求分析简易RPC框架的整体实现协议模块 &#x1f4d6;自定义协议 &#x1f195;序列化方式 &#x1f522; 服务工厂 &#x1f3ed;服务调用方 ❓前置知识——动态代理&#x1f573;️Proxy类InvocationHandler 接口 RPC服务代理类内嵌Netty客…

轻松学会 Git(三):掌握 Git 的远程操作

文章目录 前言一、分布式版本控制系统的理解1.1 什么是分布式版本控制系统&#xff1f;1.2 工作原理1.3 分布式版本控制系统的优势 二、初识 Git 远程仓库2.1 远程仓库的概念2.2 Git 远程操作2.3 远程仓库托管服务 三、新建远程仓库四、克隆远程仓库到本地4.1 使用 HTTPS 方式克…

记录一下 malloc 是如何分配内存的

系统深入学习笔记-malloc 以 32 位系统为例&#xff0c;&#xff0c;通过这张图你可以看到&#xff0c;用户空间内存从低到高分别是 6 种不同的内存段&#xff1a; 代码段&#xff0c;包括二进制可执行代码&#xff1b;数据段&#xff0c;包括已初始化的静态常量和全局变量B…

MySQL ——多条件查询(like)

一、基本语法 MySQL LIKE多条件查询语句的基本语法如下&#xff1a; SELECT * FROM table WHERE column1 LIKE %value1% AND column2 LIKE %value2%; 二、说明 在上面的多条件查询语句中&#xff0c;%是通配符&#xff0c;表示任意字符。如果您在LIKE语句中使用%字符&#x…

刚学习编写代码时的愚蠢瞬间:初学者的代码经验分享

刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享 刚学习编写代码时的愚蠢瞬间&#xff1a;初学者的代码经验分享摘要引言糟糕的变量命名&#x1f937;‍♂️ 问题&#x1f605; 解决方案 异常处理的忽略&#x1f648; 问题&#x1f60e; 解决方案 魔法数值的滥用&…

沈阳市浑南区、沈阳国际软件园领导一行莅临中睿天下总部考察指导

近日&#xff0c;沈阳市浑南区委常委、常务副区长傅涵&#xff0c;沈阳国际软件园总经理张永鹏一行会见了中睿天下高级合伙人兼市场负责人周学龙。沈阳高新区管委会经发局局长王博&#xff0c;沈阳高新区管委会投资促进局姜振杰&#xff0c;沈阳国际软件园驻京办主任王军超&…

基础数据标准落标白皮书

1.定义 数据是由特定的环境产生的&#xff0c;这些环境因素包括生产者、时间、系统等&#xff0c;这就造成了同一个语义的数据&#xff0c;会有多种不同的定义方法&#xff0c;这给后期进行数据汇集和整合带来障碍&#xff0c;因此&#xff0c;数据处理的前奏就是数据标准化&a…

公司文件加密防泄密软件有哪些?企业防泄密软件都有哪些功能?

在当今的信息化时代&#xff0c;数据已经成为了企业的重要资产。其中&#xff0c;公司内部的文件、文档、数据库等数据安全至关重要。然而&#xff0c;随着网络攻击手段的不断升级&#xff0c;企业数据泄露事件屡见不鲜&#xff0c;给企业带来了巨大的经济损失和声誉损害。因此…