c语言题目:成绩管理系统

news2025/2/24 18:53:29

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

一、题目
1、成绩管理系统
二、设计目的
1、熟练掌握面向过程(结构化)程序设计基本知识;
2、综合运用所学知识解决实际问题;
3、受到面向过程(结构化)程序设计的基本训练;
4、体会面向过程(结构化)开发程序的过程。
三、功能要求成绩管理系统:
1、有菜单
2、能实现学生数据录入(用链表实现,希望有详细注解)
3、能实现数据排序(用选择排序法)
4、有数据输出功能
5、有读取存档文件与把数据存储为文件的功能
6、一个学生的数据(称为“一条记录”)包含姓名、学号、语文、数学、英语、总分、名次等信息。
7、以结构方式存储每条记录。
8、多条记录以链表方式存储到内存。
希望给出代码,然后代码每一行都详细注解,尤其是对于链表部分,解释一定要详细,因为本人的链表学的很差,关于链表部分看不懂,希望能给出详解。

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  由于篇幅限制,我将提供一个简化版的成绩管理系统代码示例,并在关键部分添加注释。请注意,这是一个基础的示例,可能需要根据具体需求进一步扩展和完善。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define MAX_NAME_LEN 20 // 定义学生姓名的最大长度
 
// 定义学生信息的结构体
typedef struct Student {
    char name[MAX_NAME_LEN]; // 学生姓名
    int id;                  // 学号
    int chinese;             // 语文成绩
    int math;                // 数学成绩
    int english;            // 英语成绩
    int total;               // 总分
    int rank;                // 名次
    struct Student *next;    // 指向下一个学生信息的指针
} Student;
 
// 函数声明
Student *createStudent();              // 创建学生信息节点
void insertStudent(Student **head);     // 插入学生信息节点
void sortStudents(Student *head);       // 学生信息排序
void printStudents(Student *head);      // 打印学生信息
void saveToFile(Student *head);        // 保存学生信息到文件
Student *loadFromFile();               // 从文件加载学生信息
 
// 主函数
int main() {
    Student *head = NULL; // 初始化链表头指针
 
    int choice;
    do {
        // 打印菜单
        printf("\n学生成绩管理系统:\n");
        printf("1. 录入学生信息\n");
        printf("2. 显示学生信息\n");
        printf("3. 排序\n");
        printf("4. 保存到文件\n");
        printf("5. 从文件加载\n");
        printf("0. 退出\n");
        printf("请输入您的选择: ");
        scanf("%d", &choice);
 
        switch (choice) {
            case 1:
                insertStudent(&head); // 传递链表头指针的地址
                break;
            case 2:
                printStudents(head);
                break;
            case 3:
                sortStudents(head);
                printf("排序完成!\n");
                break;
            case 4:
                saveToFile(head);
                break;
            case 5:
                head = loadFromFile(); // 更新链表头指针
                break;
            case 0:
                printf("退出程序...\n");
                break;
            default:
                printf("无效的选择,请重试。\n");
        }
    } while (choice != 0);
 
    return 0;
}
 
// 创建学生信息节点
Student *createStudent() {
    Student *newStudent = (Student *)malloc(sizeof(Student)); // 动态分配内存
    if (newStudent == NULL) {
        printf("内存分配失败!\n");
        exit(1);
    }
 
    printf("请输入学生姓名: ");
    scanf("%s", newStudent->name);
    printf("请输入学号: ");
    scanf("%d", &newStudent->id);
    printf("请输入语文成绩: ");
    scanf("%d", &newStudent->chinese);
    printf("请输入数学成绩: ");
    scanf("%d", &newStudent->math);
    printf("请输入英语成绩: ");
    scanf("%d", &newStudent->english);
 
    // 计算总分
    newStudent->total = newStudent->chinese + newStudent->math + newStudent->english;
 
    // 初始化排名和指针
    newStudent->rank = 0; // 初始化排名为0
    newStudent->next = NULL; // 新节点的 next 指针初始化为 NULL
 
    return newStudent;
}
 
// 插入学生信息节点
// 注意:这里传递的是链表头指针的地址 **head
void insertStudent(Student **head) {
    Student *newStudent = createStudent();
 
    // 如果链表为空,则新节点成为头节点
    if (*head == NULL) {
        *head = newStudent;
    } else {
        Student *current = *head;
 
        // 找到链表的最后一个节点
        while (current->next != NULL) {
            current = current->next;
        }
 
        // 将新节点插入到链表末尾
        current->next = newStudent;
    }
    printf("学生信息添加成功!\n");
}
 
// 选择排序法排序学生信息
void sortStudents(Student *head) {
    Student *i, *j;
    Student temp;
 
    for (i = head; i != NULL; i = i->next) {
        for (j = i->next; j != NULL; j = j->next) {
            if (i->total < j->total) {
                // 交换数据,而不是指针
                temp = *i;
                *i = *j;
                *j = temp;
            }
        }
    }
 
    // 更新排名
    int rank = 1;
    for (i = head; i != NULL; i = i->next) {
        i->rank = rank++;
    }
}
 
// 打印学生信息
void printStudents(Student *head) {
    if (head == NULL) {
        printf("暂无学生信息!\n");
        return;
    }
 
    printf("姓名\t学号\t语文\t数学\t英语\t总分\t名次\n");
    Student *current = head;
    while (current != NULL) {
        printf("%s\t%d\t%d\t%d\t%d\t%d\t%d\n",
               current->name, current->id, current->chinese,
               current->math, current->english, current->total, current->rank);
        current = current->next;
    }
}
 
// 保存学生信息到文件
void saveToFile(Student *head) {
    FILE *fp;
    char filename[50];
 
    printf("请输入文件名: ");
    scanf("%s", filename);
 
    fp = fopen(filename, "wb"); // 以二进制写模式打开文件
    if (fp == NULL) {
        printf("无法打开文件!\n");
        return;
    }
 
    Student *current = head;
    while (current != NULL) {
        fwrite(current, sizeof(Student), 1, fp); // 写入学生信息到文件
        current = current->next;
    }
 
    fclose(fp);
    printf("学生信息已保存到文件 %s.\n", filename);
}
 
// 从文件加载学生信息
Student *loadFromFile() {
    FILE *fp;
    char filename[50];
    Student *head = NULL, *tail = NULL, *newStudent;
 
    printf("请输入文件名: ");
    scanf("%s", filename);
 
    fp = fopen(filename, "rb"); // 以二进制读模式打开文件
    if (fp == NULL) {
        printf("无法打开文件!\n");
        return NULL;
    }
 
    while (!feof(fp)) { // 循环读取直到文件结束
        newStudent = (Student *)malloc(sizeof(Student));
        if (newStudent == NULL) {
            printf("内存分配失败!\n");
            exit(1);
        }
 
        if (fread(newStudent, sizeof(Student), 1, fp) == 1) {
            newStudent->next = NULL; // 初始化新节点的 next 指针
 
            if (head == NULL) {
                head = newStudent; // 如果链表为空,新节点成为头节点
                tail = newStudent; // 尾节点也指向新节点
            } else {
                tail->next = newStudent; // 将新节点添加到尾节点之后
                tail = newStudent;        // 更新尾节点
            }
        }
    }
 
    fclose(fp);
    printf("学生信息已从文件 %s 加载.\n", filename);
    return head;
}

注解说明:

  这段代码实现了一个简单的成绩管理系统,它包括了学生信息的创建、插入、排序、打印、保存到文件和从文件加载的功能。下面是对代码中关键部分的注释和解释:

  1. 宏定义 MAX_NAME_LEN:定义了学生姓名的最大长度。

  2. 结构体定义 Student:用于存储学生信息,包括姓名、学号、各科成绩、总分、名次和指向下一个学生的指针。

  3. 函数声明:声明了后面会用到的函数,包括创建学生节点、插入学生信息、排序、打印、保存到文件和从文件加载。

  4. 主函数 main:程序的入口点,提供了一个简单的文本菜单,允许用户选择不同的操作。

  5. 创建学生信息节点 createStudent:动态分配内存来创建一个新的学生节点,并提示用户输入学生信息。

  6. 插入学生信息节点 insertStudent:将新创建的学生节点添加到链表的末尾。注意这里传递的是链表头指针的地址 *head,以便在函数内部修改头指针。

  7. 选择排序法排序学生信息 sortStudents:使用选择排序算法对学生信息按照总分进行排序,并更新每个学生的名次。

  8. 打印学生信息 printStudents:遍历链表,打印每个学生的详细信息。

  9. 保存学生信息到文件 saveToFile:将链表中的所有学生信息写入到一个文件中。使用 fwrite 函数以二进制格式写入。

  10. 从文件加载学生信息 loadFromFile:从文件中读取学生信息,并重新构建链表。

关键点解释:

  • 链表操作:链表是由一系列节点组成的,每个节点包含数据部分和指向下一个节点的指针。在这段代码中,Student 结构体的 next 成员就是用来指向下一个学生节点的。

  • 动态内存分配:使用 malloc 函数为新的节点分配内存。如果分配失败,malloc 返回 NULL

  • 文件操作:使用 fopen 打开文件,fwritefread 进行文件的写入和读取,最后使用 fclose 关闭文件。

  • 二进制读写:使用 "wb" 模式打开文件进行写入,使用 "rb" 模式打开文件进行读取。二进制模式允许我们直接读写内存中的数据结构。

  • 链表的插入:在 insertStudent 函数中,如果链表为空(即 *head == NULL),新节点成为头节点。如果不为空,遍历链表直到找到最后一个节点,然后将新节点连接到链表的末尾。

  • 排序和排名:在 sortStudents 函数中,通过交换节点的数据(而不是指针)来进行排序。排序完成后,更新每个节点的 rank 成员以反映其名次。

  这段代码是一个完整的示例,可以作为学习链表操作和文件读写的基础。希望这些注释和解释能帮助你更好地理解代码的工作原理。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


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

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

相关文章

Windows系统下载安装ngnix

一 nginx下载安装 nginx是HTTP服务器和反向代理服务器&#xff0c;功能非常丰富&#xff0c;在nginx官网首页&#xff0c;点击download 在download页面下&#xff0c;可以选择Stable version稳定版本&#xff0c;点击下载 将下载完成的zip解压即可&#xff0c;然乎在nginx所在…

【MySQL】事务四大特性以及实现原理

事务四大特性 原子性&#xff08;Atomicity&#xff09; 事务中的所有操作要么全部完成&#xff0c;要么全部不执行。如果事务中的任何一步失败&#xff0c;整个事务都会被回滚&#xff0c;以保持数据的完整性。 一致性&#xff08;Consistency&#xff09; 事务应确保数据库…

集智书童 | 英伟达和斯坦福基于 Transformer 的异常检测最新研究!

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;英伟达和斯坦福基于 Transformer 的异常检测最新研究&#xff01; 在作者推动各种视觉任务性能边界的同时&#xff0c;模型的大小也在相应增长。为了跟上…

SPIN-Diffusion:自我博弈微调提升文本到图像扩散模型性能

扩散模型作为生成AI的关键实体&#xff0c;已经在多个领域展现出了卓越的能力。然而&#xff0c;现有的扩散模型&#xff0c;如Stable Diffusion和SDXL&#xff0c;通常在预训练阶段后需要进行微调以更好地符合人类偏好。最近&#xff0c;研究者们开始尝试使用强化学习&#xf…

昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型

摘要&#xff1a; 记录昇思MindSpore AI框架使用DDPM模型给图像数据正向逐步添加噪声&#xff0c;反向逐步去除噪声的工作原理和实际使用方法、步骤。 一、概念 1. 扩散模型Diffusion Models DDPM(denoising diffusion probabilistic model) &#xff08;无&#xff09;条件…

06-6.4.4 拓扑排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

计算机网络浅谈—什么是 OSI 模型?

开放系统通信&#xff08;OSI&#xff09;模型是一个代表网络通信工作方式的概念模型。 思维导图 什么是 OSI 模型&#xff1f; 开放系统互连 (OSI) 模型是由国际标准化组织创建的概念模型&#xff0c;支持各种通信系统使用标准协议进行通信。简单而言&#xff0c;OSI 为保证…

C++左值右值

在C中&#xff0c;左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是表达式分类的关键概念&#xff0c;它们主要影响表达式的赋值、函数调用以及操作符的使用方式。这些概念在C11及以后的版本中变得更加重要&#xff0c;因为引入了移动语义和右值引用…

蓄势高飞逐“新”空,卓翼飞思助力打造低空经济产业领域人才智库

2024年&#xff0c;“低空经济”首次写入政府工作报告&#xff0c;掀开新兴产业的崭新一页&#xff0c;而后迅速在全国各地呈现如火如荼的发展态势。这片蕴藏着巨大潜力和产业的蓝海&#xff0c;正蓄势聚能、乘势而起&#xff0c;站在发展的新风口上&#xff0c;面对新前景和新…

MongoDB集群搭建-最简单

目录 前言 一、分片概念 二、搭建集群的步骤 总结 前言 MongoDB分片&#xff08;Sharding&#xff09;是一种水平扩展数据库的方法&#xff0c;它允许将数据分散存储在多个服务器上&#xff0c;从而提高数据库的存储容量和处理能力。分片是MongoDB为了应对大数据量和高吞吐量需…

ONLYOFFICE最新8.1版本——桌面编辑器简单测评

前言 大家好&#xff0c;我是小雨&#xff0c;看到最近ONLYOFFICE更新了最新的版本&#xff0c;更新了一下当前版本来具体的测评一下&#xff0c;先来看看官网提供的各类更新信息&#xff0c;下面是我找到的三个主页&#xff0c;包括功能演示链接&#xff0c;官网连接以及专门…

Ros2中goal_handle状态SUCCEED及ACCEPTED及CANCLED在rclpy中的死循环(彻底解决版本)

承接上文&#xff0c;遇到了在动作通信开发中&#xff0c;使用rclpy编写代码进行feedback等操作&#xff0c;但所有逻辑均编写完后&#xff0c;却无法将goal_handle提交为succeed状态&#xff0c;之前的解决方案是更改自己重写的execute()函数名为my_execute()并且在提交SUCCEE…

开始尝试从0写一个项目--后端(二)

实现学生管理 新增学生 接口设计 请求路径&#xff1a;/admin/student 请求方法&#xff1a;POST 请求参数&#xff1a;请求头&#xff1a;Headers&#xff1a;"Content-Type": "application/json" 请求体&#xff1a;Body&#xff1a; id 学生id …

N5 使用Gensim库训练Word2Vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 这周学习训练一个Word2Vec模型&#xff0c;并进行一些基本的词向量操作。 Word2Vec 模型 Word2Vec 是一种基于神经网络的词向量表示方法&#x…

零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频

文章目录 一.概要二.PWM输入框架图三.CubeMX配置一个PWM输入例程1.硬件准备2.创建工程3.调试 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM)&#xff0c;是英文“Pulse Width Modulation”的缩写&#xff0c;简称脉宽调制&#xff0c;是利用单…

数学建模算法目标规划

在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支—数学规划&#xff0c;而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。特别是在计算机能处理成千上万个…

在电子表格中对多列数据去重

一、数据展示 二、代码 Sub 选中区域数据去重()Dim arr()Dim c, d, id Selection.Counti 0For Each c In SelectionIf c.Value <> "" ThenReDim Preserve arr(0 To i)arr(i) c.Valuei i 1End IfNextarr 一维去重(arr)i 0For Each c In Range("O2&…

35.哀家要长脑子了!--二分

模板 int check() {...} // 检查这个数是否符合相应的要求// 把区间[l, r] 划分成[l, mid] 和 [mid1, r] 时使用 // 找到数组中第一个大于等于某一值得元素或满足特定条件的第一个位置 int bsearch_1(int l, int r){int mid l r >> 1;while(l < r) {if(check(mi…

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 文章目录 Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载 5、源码地址6、参考 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 …

智慧景区解决方案PPT(89页)

智慧景区解决方案摘要 解决方案概述智慧景区解决方案旨在利用现代信息技术解决景区管理机构面临的保护与发展矛盾&#xff0c;推动服务职能转变&#xff0c;促进旅游产业跨越式发展&#xff0c;实现旅游经营增长和管理成本优化。 宏观政策背景国家旅游局发布的《“十三五”全国…