项目记录:C语言学生成绩排名程序

  一个很简单的小项目,大一的学生作业。我简单介绍一下相关功能和代码之类的吧~

  本来题目不强制要求菜单的,我有点强迫症加了菜单。

【1】题目:

  一个班40名学生,期末有10门课程成绩,要求计算并输出如下数据:

(1)按每行6人输出每个学生总成绩

(2)按每行5门输出每一科的平均成绩

(3)提供菜单选择按某一科成绩、总成绩进行升序、降序排名输出 (每行6人).

【2】功能代码分析:(需求分析分解)

(1)功能一: 计算并打印学生的总分。

【1】目标:对每个学生的各科成绩进行累加,得出总分,并打印出每个学生的姓名和对应的总分。

【2】详细要求:

1.系统应支持添加学生成绩信息,包括学生的姓名和各科成绩。

2.系统应能够自动计算每个学生的总分。

3.系统应支持打印出所有学生的姓名和对应的总分。

(2)功能二: 打印各科的平均成绩。

【1】目标: 计算每门科目所有学生的总成绩,然后除以学生人数,得出每门科目的平均分,并打印出来。

【2】详细要求:

1.系统应支持统计每门科目的总成绩。

2.系统应能够计算每门科目的平均成绩(总成绩/学生人数)。

3.系统应支持打印出每门科目的名称和对应的平均成绩。

(3)功能三: 按科目成绩排序。

【1】目标: 允许用户选择一个科目,然后根据该科目的成绩对学生进行升序或降序排序,并打印排序后的学生姓名和成绩。

【2】详细要求:

1.系统应支持用户选择想要排序的科目。

2.系统应支持用户选择排序方式(升序或降序)。

3.系统应能够根据所选科目和排序方式对学生进行排序。

4.系统应支持打印出排序后的学生姓名和对应的科目成绩。

(4)功能四: 按总分排序。

【1】目标: 根据学生的总分对学生进行升序或降序排序,并打印排序后的学生姓名和成绩。

【2】详细要求:

1.系统应支持用户选择排序方式(升序或降序)。

2.系统应能够根据学生的总分对学生进行排序。

3.系统应支持打印出排序后的学生姓名、总分以及各科成绩(可选)。

(5)其他考虑

1.用户界面:系统应提供用户友好的界面,便于用户进行操作和查看结果。(我这里做了一个三级的菜单)

2.错误处理:系统应能够妥善处理可能出现的错误,如数据输入错误、文件读取错误等,并给出相应的错误提示。

  菜单模块包括以下:

【1】主菜单: 提供按科目成绩排序、按总分排序和退出程序的选项。

【2】科目排序菜单: 提供显示所有科目、选择科目并排序的选项。

【3】总分排序菜单: 提供按总分升序排序和降序排序的选项。

【3】功能代码实现

1.结构体、相关参数介绍:

[1]Student结构体: 用于存储学生的姓名、各科成绩、总分。

  这里姓名使用字符串数组存储,各科成绩使用整型数组存储,总分用整型变量存储。

//学生的结构体定义

typedef struct {

    char name[20];

    int scores[SUBJECT_COUNT];

    int totalScore;

} Student;

[2]subjects数组: 存储科目名称的字符串数组,方便在打印和排序时使用科目名称而非索引,使用const关键字定义的。

//添加一个数组来存储科目名称

const char* subjects[SUBJECT_COUNT] = {

    "语文", "数学", "英语", "物理", "化学",

    "生物", "历史", "地理", "政治", "体育"

};

(1)总分成绩输出:输入学生数据,调用calculateTotalScores函数计算总分,调用printTotalScores函数打印总分。

【1】核心代码:

void calculateTotalScores(Student students[], int count) {

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

        int sum = 0;

        for (int j = 0; j < SUBJECT_COUNT; ++j) {

            sum += students[i].scores[j];

        }

        students[i].totalScore = sum;

    }

}

void printTotalScores(Student students[], int count) {

    printf("学生姓名    总分\n");

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

        printf("%-10s %4d\n", students[i].name, students[i].totalScore);

    }

}

【2】运行界面截图: 显示每个学生的姓名和总分。

(2)单科平均成绩输出:输入学生数据,调用printAverageScores函数计算并打印平均分。

【1】核心代码:

void printAverageScores(Student students[], int count) {

    float averages[SUBJECT_COUNT] = {0};

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

        for (int j = 0; j < SUBJECT_COUNT; ++j) {

            averages[j] += students[i].scores[j];

        }

    }

    printf("各科平均分:\n");

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

        printf("科目%d: %.2f\n", i + 1, averages[i] / count);

    }

}

【2】运行界面截图: 显示每门科目的平均分。

(3)单科升序/降序成绩输出:输入学生数据,显示科目供用户选择,用户输入科目编号和排序方向,调用sortStudentsBySubject函数进行排序,调用printSortedStudents函数打印排序后的学生信息。

【1】核心代码:

void sortStudentsBySubject(Student students[], int count, int subjectIndex, bool ascending) {

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

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

if (ascending ? students[j].scores[subjectIndex] > students[j + 1].scores[subjectIndex] :

            students[j].scores[subjectIndex] < students[j + 1].scores[subjectIndex]) {

                Student temp = students[j];

                students[j] = students[j + 1];

                students[j + 1] = temp;

            }

        }

    }

}

void printSortedStudents(Student students[], int count, int subjectIndex, bool ascending) {

    printf("\n按%s成绩%s序排名:\n", subjectIndex >= 0 ? subjects[subjectIndex] : "总分", ascending ? "升序" : "降序");

    printf("学生姓名    成绩\n");

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

        // 确保只打印已初始化的学生数据

        if (students[i].totalScore != 0) {

            int scoreToPrint = subjectIndex >= 0 ? students[i].scores[subjectIndex] : students[i].totalScore;

            printf("%-10s %4d\n", students[i].name, scoreToPrint);

        }

    }

}

【2】运行界面截图: 显示按选定科目排序后的学生信息。

(4)总分升序/降序成绩输出:输入学生数据,用户选择排序方向,调用sortStudentsByTotal函数进行排序,调用printSortedStudents函数打印排序后的学生信息。

【1】核心代码:

void sortStudentsByTotal(Student students[], int count, bool ascending) {

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

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

            if (ascending ? students[j].totalScore < students[j + 1].totalScore :

                           students[j].totalScore > students[j + 1].totalScore) {

                Student temp = students[j];

                students[j] = students[j + 1];

                students[j + 1] = temp;

            }

        }

    }

}

void printSortedStudents(Student students[], int count, int subjectIndex, bool ascending) {

    printf("\n按%s成绩%s序排名:\n", subjectIndex >= 0 ? subjects[subjectIndex] : "总分", ascending ? "升序" : "降序");

    printf("学生姓名    成绩\n");

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

        // 确保只打印已初始化的学生数据

        if (students[i].totalScore != 0) {

            int scoreToPrint = subjectIndex >= 0 ? students[i].scores[subjectIndex] : students[i].totalScore;

            printf("%-10s %4d\n", students[i].name, scoreToPrint);

        }

    }

}

【2】运行界面截图: 显示按总分排序后的学生信息。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xilinx Vitis 2020工程源目录修改

目录 1 背景2 分析3 解决4 使用4.1 修改路径4.2 编译工程4.2.1 清理工程4.2.2 编译工程 1 背景 Xilinx Vitis可以做standalone程序开发,不过其工程中使用的路径为绝对路径。工程更换位置后编译将会显示错误。例如&#xff1a;源目录为D:/work,复制到同事电脑上放到C:/work(同事…

注册中心组成结构和基本原理解析

假如你正在设计和开发一个分布式服务系统&#xff0c;系统中存在一批能够独立运行的服务&#xff0c;而在部署上也采用了集群模式以防止出现单点故障。显然&#xff0c;对于一个完整的业务系统而言&#xff0c;这些服务之间需要相互调用并形成复杂的访问链路&#xff0c;一种可…

HTML(29)——立体呈现

作用&#xff1a;设置元素的子元素是位于3D空间中还是平面中 属性名&#xff1a;transform-style 属性值&#xff1a; flat&#xff1a;子级处于平面中preserve-3d:子级处于3D空间 步骤&#xff1a; 父级元素添加 transform-style:preserve-3d 子级定位调整子盒子的位置&a…

14-54 剑和诗人28 - 用于实时嵌入查找的向量检索

介绍 LLM 成功的关键因素是向量嵌入的使用。通过将文本转换为数字向量表示&#xff0c;我们可以将语义含义映射到数学向量空间。这使得模型能够根据向量之间的相似性在语言中概括模式。 随着我们的模型和数据集变得越来越大&#xff0c;高效地存储、组织和检索这些嵌入变得至关…

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下&#xff1a; 科学计算模式效果如下&#xff1a; 更具体的功能演示视频见如下链接…

【易捷海购-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

ffmpeg滤镜-drawtext-命令行

使用 FFmpeg 在视频上添加文字可以通过 drawtext 滤镜来实现。这个滤镜允许你指定字体、大小、颜色、位置等。 基本用法 以下命令将 "Hello, World!" 添加到视频的顶部左侧&#xff1a; ffmpeg -i input.mp4 -vf "drawtexttextHello, World\!:fontcolorwhite…

JAVA Tesseract OCR引擎

Tess4j是一个基于Tesseract OCR引擎的Java库, Tesseract库最初由惠普实验室于1985年开发&#xff0c;后来被Google收购并于2006年开源。识别效果不好&#xff0c;速度还慢&#xff0c;但是好早好早了。 一、POM依赖 <!--OCR识别https://digi.bib.uni-mannheim.de/tesserac…

14-26 剑和侠客 – 预训练模型三部曲3 – 机器人时代来临

概述 在第 1 部分和第 2 部分中&#xff0c;我们讨论了适用于文本和图像任务的预训练模型&#xff0c;并探索了当今常用的模型。我们分析了这些模型的架构以及如何将它们用于特定任务。实现 AGI 所需的两个主要支柱是语言理解和机器的视觉能力。有许多任务与这两种能力有关。 …

Syncthing一款开源去中心化和点对点文件同步工具

Syncthing&#xff1a;一款开源的文件同步工具&#xff0c;去中心化和点对点加密传输&#xff0c;支持多平台&#xff0c;允许用户在多个设备之间安全、灵活地同步和共享文件&#xff0c;无需依赖第三方云服务&#xff0c;特别适合高安全性和自主控制的文件同步场景。 &#x…

4. kvm存储虚拟化

kvm存储虚拟化 一、命令行工具管理虚拟磁盘1、查看虚拟磁盘2、添加磁盘3、删除磁盘 二、qcow2格式的磁盘文件1、创建磁盘文件2、差量镜像/快速创建虚机2.1 创建差量镜像2.2 准备配置文件2.3 创建虚拟机2.4 批量部署虚拟机 三、存储池 storage pool1、类型2、在线迁移2.1 规划后…

【基于R语言群体遗传学】-14-种群起源的相对似然

我们可以将预测的基因型比例视为在种群中看到一组特定等位基因的概率。如果种群在等位基因频率上存在差异&#xff0c;我们可以使用基因型来推断个体起源于每个种群的相对可能性。大家可以先看一下之前的博客&#xff1a;群体遗传学_tRNA做科研的博客-CSDN博客 种群起源的相对似…

pytest-yaml-sanmu(六):YAML数据驱动测试

如果说 pytest 中哪些标记使用得最多&#xff0c;那无疑是 parametrize 了&#xff0c; 它为用例实现了参数化测试的能力&#xff0c;进而实现了数据驱动测试的能力。 1. 使用标记 parametrize 的使用需要提高两个内容&#xff1a; 参数名 参数值 pytest 在执行用例时&…

javascript DOM BOM 笔记

Web API API的概念 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细…

el-scrollbar实现自动滚动到底部(AI聊天)

目录 项目背景 实现步骤 实现代码 完整示例代码 项目背景 chatGPT聊天消息展示滚动面板&#xff0c;每次用户输入提问内容或者ai进行流式回答时需要不断的滚动到底部确保展示最新的消息。 实现步骤 采用element ui 的el-scrollbar作为聊天消息展示组件。 通过操作dom来实…

高智能土壤养分检测仪:农业生产的科技新助力

在科技日新月异的今天&#xff0c;农业领域也迎来了革命性的变革。其中&#xff0c;高智能土壤养分检测仪作为现代农业的科技新助力&#xff0c;正逐渐改变着传统的农业生产方式&#xff0c;为农民带来了前所未有的便利与效益。 高智能土壤养分检测仪&#xff0c;是一款集高科技…

共筑智能未来 | 思腾合力闪耀2024世界人工智能大会(WAIC 2024)

在刚刚结束的2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;上&#xff0c;思腾合力作为行业领先的人工智能基础架构解决方案提供商&#xff0c;凭借卓越的产品和解决方案&#xff0c;成为展会上的亮点之一。此次盛会不仅展示了全球人工智…

Android 性能优化之启动优化

文章目录 Android 性能优化之启动优化启动状态冷启动温启动热启动 耗时检测检测手段TraceView使用方式缺点 Systrace环境配置使用方式TraceView和Systrace比较 AOP统计耗时环境配置使用 优化白屏优化异步加载优化环境配置使用 延迟加载优化AppStartup 源码下载 Android 性能优化…

网站高性能架构设计——高性能缓存架构

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、缓存基础 1.缓存简介 缓存提升性能的幅度&#xff0c;不只取决于存储介质的速度&#xff0c;还取决于缓存命中率。为了提高命中 率&#xff0c…

HarmonyOS Next应用开发之系统概述

一、鸿蒙系统概述 鸿蒙系统可以分为华为鸿蒙系统&#xff08;HUAWEI HarmonyOS&#xff09;和开源鸿蒙系统&#xff08;OpenHarmony&#xff09;&#xff0c;华为鸿蒙系统是基于OpenHarmony基础之上开发的商业版操作系统。他们二者的关系可以用下图来表示&#xff1a; 1.1、…