C语言之小型成绩管理系统


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。



C语言之小型成绩管理系统

目录

  1. 设计题目
  2. 设计目的
  3. 设计任务描述
  4. 设计要求
  5. 输入和输出要求
  6. 验收要求
  7. 进度安排
  8. 系统分析
  9. 总体设计
  10. 详细设计
    • 数据结构设计
    • 函数列表及功能简介
  11. 程序实现
  12. 测试数据和运行结果
  13. 总结与思考
  14. 参考文献
  15. 附录代码

设计题目

C语言之小型成绩管理系统

设计目的

  1. 加深对C语言基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
  2. 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
  3. 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。

设计任务描述

设计一个学生信息管理系统,能够实现以下功能:

  1. 添加学生信息:录入学生的姓名、学号和三门课程的成绩。
  2. 显示学生信息:显示所有已添加的学生信息。
  3. 按学号查找学生信息:根据学号搜索学生信息。
  4. 插入学生信息:在特定位置插入一个新的学生记录。
  5. 删除学生信息:根据学号删除一个学生记录。
  6. 按总分降序排序:按学生的总分降序排序学生记录。
  7. 退出系统:退出程序。

设计要求

  1. 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
  2. 应用模块化编程思想,各项功能分别用函数实现。
  3. 系统功能设计成菜单形式,用户通过菜单选择操作。
  4. 系统界面友好、直观、易操作。

输入和输出要求

  1. 系统界面友好、直观、易操作。
  2. 用户根据提示输入数据。
  3. 输入数据时提供清晰的提示信息。
  4. 处理完成后,清楚地显示运行结果。

验收要求

  1. 运行所设计的系统。
  2. 回答有关问题。
  3. 提交课程设计报告。
  4. 提交源程序。

进度安排

  1. 系统分析、设计准备阶段:6学时。
  2. 编程调试阶段:26学时。
  3. 总结和书写报告阶段:6学时。
  4. 考核阶段:2学时。

系统分析

学生信息管理系统旨在简化学生信息的管理流程,提高管理效率,同时为用户提供便捷的操作体验。系统需要实现以下功能:

  • 添加学生信息。
  • 显示学生信息。
  • 按学号查找学生信息。
  • 插入学生信息。
  • 删除学生信息。
  • 按总分降序排序。

总体设计

系统采用模块化设计,主要模块包括:

  1. 学生信息管理模块:添加、显示、查找、插入和删除学生信息。
  2. 排序模块:按总分降序排序学生记录。
  3. 用户界面模块:提供友好的用户界面。
  4. 数据持久化模块:将数据存储到文件系统(可选)。
    在这里插入图片描述

详细设计

数据结构设计

struct Student {
    char name[50];
    int id;
    int grades[3];
};

函数列表及功能简介

  1. addStudent()

    • 功能:添加一个新的学生记录到 students 数组中。
    • 过程:提示用户输入学生的姓名、学号和三门课程的成绩,然后将这些信息存储在一个新的 Student 结构体中,并将其添加到数组的下一个空位。
  2. displayStudents()

    • 功能:显示所有已添加的学生信息。
    • 过程:检查是否有学生记录,如果有,则遍历数组并打印每个学生的姓名、学号和成绩。
  3. searchStudentById()

    • 功能:根据学号搜索学生信息。
    • 过程:提示用户输入要搜索的学号,然后在数组中查找匹配的学生记录。如果找到,打印该学生的详细信息。
  4. insertStudent()

    • 功能:在特定位置插入一个新的学生记录。
    • 过程:首先提示用户输入要插入的学生的学号,然后找到合适的插入位置,接着提示用户输入新学生的详细信息,并将新学生记录插入到数组中。
  5. deleteStudent()

    • 功能:根据学号删除一个学生记录。
    • 过程:提示用户输入要删除的学号,找到对应的学生记录,然后从数组中删除该记录。
  6. sortByTotalGrades()

    • 功能:按学生的总分降序排序学生记录。
    • 过程:使用冒泡排序算法,根据每个学生的总分进行排序,然后打印排序后的学生信息。
  7. swap(struct Student *a, struct Student *b)

    • 功能:交换两个 Student 结构体指针所指向的记录。
    • 过程:使用一个临时变量来交换两个学生记录的内容。
  8. calculateTotalGrades(struct Student student)

    • 功能:计算一个学生的总分。
    • 过程:将一个学生的三门课程成绩相加并返回总分。

测试数据和运行结果

测试数据

  1. 添加学生信息

    请输入学生姓名: John Doe
    请输入学生学号: 1001
    请输入三门课程的成绩(用空格分隔): 85 90 78
    
  2. 显示学生信息

    所有学生信息如下:
    姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    
  3. 按学号查找学生信息

    请输入要查找的学生学号: 1001
    学生姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    
  4. 插入学生信息

    请输入要插入的学生学号: 1002
    请输入学生姓名: Jane Smith
    请输入三门课程的成绩(用空格分隔): 92 88 90
    
  5. 删除学生信息

    请输入要删除的学生学号: 1001
    要删除的学生信息:姓名: John Doe, 学号: 1001, 成绩: 85 90 78
    学生信息删除成功。
    
  6. 按总分降序排序

    按总分降序输出的学生信息:
    姓名: Jane Smith, 学号: 1002, 总分: 270
    

总结与思考

优点

  1. 功能完善:系统涵盖了添加、显示、查找、插入、删除和排序等核心功能。
  2. 界面友好:系统提供了简洁直观的用户界面,操作方便。
  3. 模块化设计:代码结构清晰,便于维护和扩展。

改进方向

  1. 数据持久化:当前系统未实现数据持久化,建议将学生信息存储到文件中,以便程序重启后仍能读取数据。
  2. 错误处理:增加对用户输入的验证,避免非法输入导致程序异常。
  3. 更多功能:可以增加更多功能,如修改学生信息、统计平均分等。

参考文献

【排序算法】八大排序(下)(c语言实现)(附源码)-阿里云开发者社区
超详细之C语言实现学生信息管理系统(含文件读写)_c语言学生信息管理系统-CSDN博客

附录代码


#include <stdio.h>

#include <stdlib.h>

#include <string.h>



struct Student {

    char name[50];

    int id;

    int grades[3];

};



struct Student students[100]; // 最多存储100个学生信息

int studentCount = 0;



void addStudent();

void displayStudents();

void searchStudentById();

void insertStudent();

void deleteStudent();

void sortByTotalGrades();

void swap(struct Student *a, struct Student *b);

int calculateTotalGrades(struct Student student);



int main() {

    int choice;



    do {

        printf("\n学生信息管理系统菜单\n");

        printf("1 添加学生信息\n");

        printf("2 显示学生信息\n");

        printf("3 按学号查找学生信息\n");

        printf("4 插入一个学生信息\n");

        printf("5 删除一个学生信息\n");

        printf("6 按总分降序输出\n");

        printf("7 退出\n");

        printf("请选择操作:");

        scanf("%d", &choice);



        switch (choice) {

            case 1:

                addStudent();

                break;

            case 2:

                displayStudents();

                break;

            case 3:

                searchStudentById();

                break;

            case 4:

                insertStudent();

                break;

            case 5:

                deleteStudent();

                break;

            case 6:

                sortByTotalGrades();

                break;

            case 7:

                printf("退出程序。\n");

                break;

            default:

                printf("无效选择,请重新输入。\n");

        }

    } while (choice != 7);



    return 0;

}



void addStudent() {

    struct Student newStudent;



    printf("请输入学生姓名: ");

    scanf("%s", newStudent.name);

    printf("请输入学生学号: ");

    scanf("%d", &newStudent.id);

    printf("请输入三门课程的成绩(用空格分隔): ");

    for (int i = 0; i < 3; i++) {

        scanf("%d", &newStudent.grades[i]);

    }



    students[studentCount] = newStudent;

    studentCount++;

    printf("学生信息添加成功。\n");

}



void displayStudents() {

    if (studentCount == 0) {

        printf("暂无学生信息。\n");

        return;

    }



    printf("所有学生信息如下:\n");

    for (int i = 0; i < studentCount; i++) {

        printf("姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);

    }

}



void searchStudentById() {

    int searchId;

    printf("请输入要查找的学生学号: ");

    scanf("%d", &searchId);



    for (int i = 0; i < studentCount; i++) {

        if (students[i].id == searchId) {

            printf("学生姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[i].name, students[i].id, students[i].grades[0], students[i].grades[1], students[i].grades[2]);

            return;

        }

    }



    printf("未找到该学生。\n");

}





void insertStudent() {

    struct Student newStudent;

    int insertId;



    printf("请输入要插入的学生学号: ");

    scanf("%d", &insertId);



   

    int insertIndex = 0;

    while (insertIndex < studentCount && students[insertIndex].id < insertId) {

        insertIndex++;

    }



    // 输入学生信息

    printf("请输入学生姓名: ");

    scanf("%s", newStudent.name);

    newStudent.id = insertId;

    printf("请输入三门课程的成绩(用空格分隔): ");

    for (int i = 0; i < 3; i++) {

        scanf("%d", &newStudent.grades[i]);

    }



    // 插入学生信息

    for (int i = studentCount; i > insertIndex; i--) {

        students[i] = students[i - 1];

    }

    students[insertIndex] = newStudent;

    studentCount++;

    printf("学生信息插入成功。\n");

}



void deleteStudent() {

    int deleteId;

    int deleteIndex = -1;



    printf("请输入要删除的学生学号: ");

    scanf("%d", &deleteId);



    // 寻找要删除的学生

    for (int i = 0; i < studentCount; i++) {

        if (students[i].id == deleteId) {

            deleteIndex = i;

            break;

        }

    }



    if (deleteIndex == -1) {

        printf("未找到该学生。\n");

    } else {

      

        printf("要删除的学生信息:姓名: %s, 学号: %d, 成绩: %d %d %d\n", students[deleteIndex].name, students[deleteIndex].id, students[deleteIndex].grades[0], students[deleteIndex].grades[1], students[deleteIndex].grades[2]);



        // 删除学生信息

        for (int i = deleteIndex; i < studentCount - 1; i++) {

            students[i] = students[i + 1];

        }

        studentCount--;

        printf("学生信息删除成功。\n");

    }

}



void sortByTotalGrades() {

    // 使用冒泡排序

    for (int i = 0; i < studentCount - 1; i++) {

        for (int j = 0; j < studentCount - i - 1; j++) {

            if (calculateTotalGrades(students[j]) < calculateTotalGrades(students[j + 1])) {

                swap(&students[j], &students[j + 1]);

            }

        }

    }



    // 显示按总分降序排序后的学生信息

    printf("按总分降序输出的学生信息:\n");

    for (int i = 0; i < studentCount; i++) {

        printf("姓名: %s, 学号: %d, 总分: %d\n", students[i].name, students[i].id, calculateTotalGrades(students[i]));

    }

}



void swap(struct Student *a, struct Student *b) {

    struct Student temp = *a;

    *a = *b;

    *b = temp;

}



int calculateTotalGrades(struct Student student) {

    return student.grades[0] + student.grades[1] + student.grades[2];

}

嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中DataX使用第一期

简介 DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS, databen…

Windows配置frp内网穿透实现远程连接

仅个人记录 本文仅介绍客户端的配置 1. 开始 frp分为服务端和客户端&#xff0c;为实现内网穿透需要同时配置服务端和客户端&#xff0c;并且版本保持一致&#xff0c;可以前往 frp github下载 本文使用 0.51.2 版本&#xff0c;从GitHub下载并解压&#xff0c;得到如下文件…

PHP同城配送小程序

&#x1f680; 同城极速达——您生活中的极速配送大师 &#x1f4f1; 一款专为现代都市快节奏生活量身打造的同城配送小程序&#xff0c;同城极速达&#xff0c;集高效、便捷、智能于一身&#xff0c;依托ThinkPHPGatewayWorkerUniapp的强大架构&#xff0c;巧妙融合用户端、骑…

ESP32云开发二( http + led + lcd)

文章目录 前言先上效果图platformio.iniwokwi.tomldiagram.json源代码编译编译成功上传云端完结撒花⭐⭐⭐⭐⭐ 前言 阅读此篇前建议先看 此片熟悉下wokwi https://blog.csdn.net/qq_20330595/article/details/144289986 先上效果图 Column 1Column 2 platformio.ini wokwi…

分布式搜索引擎02

1. DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1. DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c…

reactor框架使用时,数据流请求流程

1. 我们在Flux打开时&#xff0c;可以看到 public abstract class Flux<T> implements CorePublisher<T> { 2. public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber); } Publish…

E-Prime2实现List嵌套

用E-Prime实现一个简单的List嵌套&#xff0c;实验流程基于斯特鲁程序&#xff08;色词一致/不一致实验&#xff09;。 首先File-New&#xff0c;新建一个空白项目 此时生成流程如下 Experiment Object是实验中被用到的流程或者控件对象&#xff0c;SessionProc是总流程&#x…

web-view环境下,H5页面打开其他小程序

在Web-view环境下&#xff0c;H5页面无法直接打开其他小程序。正确的实现方式是先从H5页面跳转回当前小程序&#xff0c;再由当前小程序跳转到目标小程序。具体实现方法如下&#xff1a; H5页面跳转回小程序时&#xff0c;调用wx.miniProgram.navigateTo()方法。 小程序跳转到…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

Linux系统的第一个进程是什么?

Linux进程的生命周期从创建开始&#xff0c;直至终止&#xff0c;贯穿了一个进程的整个存在过程。我们可以通过系统调用fork()或vfork()来创建一个新的子进程&#xff0c;这标志着一个新进程的诞生。 实际上&#xff0c;Linux系统中的所有进程都是由其父进程创建的。 既然所有…

《冲动》V1.6官方学习版

《冲动》官方版 https://pan.xunlei.com/s/VODiYvUAE1lECHcq66BR1np_A1?pwdfxc6# 具有侦探小说、戏剧和恐怖元素的惊悚片。 主角结束了漫长的商务旅行回到家&#xff0c;他的妻子和年幼的儿子热切地等待着他。然而&#xff0c;当他到达时&#xff0c;他发现有些不对劲&#x…

【Java计算机毕业设计】基于SSM圣宠宠物领养网站【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

【微机原理与接口技术】定时控制接口

文章目录 8253的引脚和工作方式内部结构和引脚工作方式方式0&#xff1a;计数结束中断方式1&#xff1a;可编程单稳脉冲方式2&#xff1a;周期性负脉冲输出方式3&#xff1a;方波发生器方式4&#xff1a;软件触发的单次负脉冲输出方式5&#xff1a;硬件触发的单次负脉冲输出各种…

场馆预定平台高并发时间段预定实现V2

&#x1f3af; 本文档介绍了场馆预订系统接口V2的设计与实现&#xff0c;旨在解决V1版本中库存数据不一致及性能瓶颈的问题。通过引入令牌机制确保缓存和数据库库存的最终一致性&#xff0c;避免因服务器故障导致的库存错误占用问题。同时&#xff0c;采用消息队列异步处理库存…

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线&#xff1a;Node.js 项目的完整部署流程&#xff08;包含 Docker 和 CI/CD&#xff09; 目录 项目初始化&#xff1a;构建一个简单的 Node.js 应用设置 Docker 环境&#xff1a;容器化你的应用配置 CI/CD&#xff1a;自动化构建与部署上线前的最后检查&#xff1a;…

stm32 L051 adc配置及代码实例解析

一 cude的设置&#xff1a; 1. 接口的基本设置&#xff1a; 2. 参数的设置&#xff1a; 二 代码的逻辑&#xff1a; 1. 上面的直接生成代码&#xff0c;然后使用下面源码即可读到adc的数据&#xff1a; void adc_battery_start(void) {uint32_t ADC_value 0;HAL_ADC_Start(&…

【2024 博客之星评选】请继续保持Passion

我尝试复盘自己2024年走的路&#xff0c;希望能给诸君一些借鉴。 文章目录 回头望感想与收获成长与教训今年计划感恩一些体己话 回头望 回望我的2024年&#xff0c;年初拿高绩效&#xff0c;但感觉逐渐被公司一点点剥离出中心&#xff1b;年中一直在学习防患于未然&#xff1b…

【第二十周】U-Net:用于生物图像分割的卷积神经网络

文章目录 摘要Abstract文章信息研究动机U-Net网络结构U-Net网络搭建数据增强损失函数转置卷积创新性与不足创新性&#xff1a;不足&#xff1a; 总结 摘要 U-Net&#xff08;Convolutional Networks for Biomedical Image Segmentation&#xff09;是一种用于图像分割的深度学…

GD32F303 GCC 环境搭建

一、引言 在嵌入式开发领域&#xff0c;GD32F303 微控制器以其出色的性能和丰富的功能被广泛应用。为了充分发挥其潜力&#xff0c;搭建一个高效的开发环境并深入理解项目构建过程至关重要。本文将详细介绍如何基于 GCC 工具链搭建 GD32F303 的开发环境&#xff0c;重点聚焦于…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…