学生成绩统计系统
实验内容
问题描述:
输入n个学生的考试成绩,每个学生信息由姓名与分数组成;试设计一种算法:
(1)按分数高低次序,打印出每个学生的名次,分数相同的为同一名次;
(2)按名次输出每个学生的姓名与分数。
基本要求:
(1)学生的考试成绩必须通过键盘输入数据而建立。
(2)测试数据由同学们根据实际情况指定。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 学生结构体,包含姓名和成绩
typedef struct {char name[50];int score;
} Student;// 打印学生成绩和名次
void printStudentRanks(Student arr[], int length) {int rank = 1; // 初始名次for (int i = 0; i < length; i++) {// 对于成绩相同的学生,分配相同的名次if (i > 0 && arr[i].score != arr[i-1].score) {rank = i + 1; // 如果成绩不同,更新名次//i 是从 0 开始的,而名次是从 1 开始的,所以需要加 1}printf("Rank %d: %s - %d\n", rank, arr[i].name, arr[i].score);}
}// 合并函数:将两个有序的子数组合并成一个有序数组
void merge(Student arr[], Student tempArr[], int left, int mid, int right) {int l_pos = left; // 左半区起始位置int r_pos = mid + 1; // 右半区起始位置int pos = left; // 临时数组的起始位置// 合并两个子数组while (l_pos <= mid && r_pos <= right) {if (arr[l_pos].score > arr[r_pos].score) { // 左半区第一个剩余元素更小tempArr[pos++] = arr[l_pos++];} else { // 右半区第一个剩余元素更小tempArr[pos++] = arr[r_pos++];}}// 将左半区剩余的元素添加到临时数组while (l_pos <= mid) {tempArr[pos++] = arr[l_pos++];}// 将右半区剩余的元素添加到临时数组while (r_pos <= right) {tempArr[pos++] = arr[r_pos++];}// 将排序后的临时数组复制回原数组for (int i = left; i <= right; i++) {arr[i] = tempArr[i];}
}// 递归分治排序函数
void msort(Student arr[], Student tempArr[], int left, int right) {if (left < right) {int mid = (left + right) / 2;msort(arr, tempArr, left, mid); // 递归排序左半部分msort(arr, tempArr, mid + 1, right); // 递归排序右半部分merge(arr, tempArr, left, mid, right); // 合并排序结果}
}// 归并排序的入口函数
void mergeSort(Student arr[], int length) {Student* tempArr = (Student*)malloc(length * sizeof(Student));if (tempArr) {msort(arr, tempArr, 0, length - 1);free(tempArr); // 释放临时数组} else {printf("Memory allocation failed.\n");}
}int main() {int n;// 输入学生数量printf("Enter the number of students: ");scanf("%d", &n);// 动态分配学生数组Student* students = (Student*)malloc(n * sizeof(Student));if (students == NULL) {printf("Memory allocation failed.\n");return -1;}// 输入学生姓名和成绩for (int i = 0; i < n; i++) {printf("Enter the name and score of student %d: ", i + 1);scanf("%s %d", students[i].name, &students[i].score);}// 排序学生数组mergeSort(students, n);// 输出排序结果和学生名次printf("\nSorted students by score:\n");printStudentRanks(students, n);// 释放动态分配的内存free(students);return 0;
}
1.学生名次的分配:
rank 应该从 1 开始,而不是从 0 开始。
2.输入格式:
程序中使用 scanf 函数读取学生姓名和成绩时,scanf("%s %d", students[i].name, &students[i].score) 假设输入的姓名不含空格。如果学生的姓名中包含空格,则需要修改输入处理方式(例如使用 fgets 来读取包含空格的姓名)。
使用 fgets 来读取学生姓名(scanf 读取到第一个空格时会停止),例如:
fgets(students[i].name, sizeof(students[i].name), stdin);
3.内存分配失败:
动态分配内存时,应检查返回的指针是否为NULL,确保内存分配成功。
4.数组越界:
在使用数组时,特别是循环和数组索引操作时,要注意避免数组越界。
在 merge 函数中,注意确保 l_pos 和 r_pos 不会超出左右子数组的边界,否则会发生数组越界访问。
归并过程中,保证 tempArr 的长度与原数组相等,避免因数组越界而引发未定义的行为。
5.名次处理:
在打印名次时,要正确处理成绩相同的情况,确保相同成绩的学生获得相同的名次。
6.临时数组大小:
确保临时数组的大小与待排序数组的大小相同,以避免复制数据时越界。
相关文章:
学生成绩统计系统
实验内容 问题描述: 输入n个学生的考试成绩,每个学生信息由姓名与分数组成;试设计一种算法: (1)按分数高低次序,打印出每个学生的名次,分数相同的为同一名次; (2)按名次输出每个学生的姓名与分数。 基本要求: (1)学生的考试成绩必须通过…...
【Spring项目】图书管理系统
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:项目实现准备 1:需求 (1)登录 2:准备…...
Vivado ILA数据导出MATLAB分析
目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时,数据在VIVADO窗口获取的信息有限,可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号,单击右键后,会有export ILA DATA选项,将其保存成CS…...
【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)
博主说明:本文项目编号 T 075 ,文末自助获取源码 \color{red}{T075,文末自助获取源码} T075,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
【机器学习】——windows下安装anaconda并在vscode上进行配置
一、安装anaconda 1.进入清华的镜像网站,下载自己电脑对应的anaconda版本。网站:https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…...
【H2O2|全栈】Node.js与MySQL连接
目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接,并将该过程进行函数封装。 与基础部分的语法相比,ES6的语法进行了一些更加严谨的约束和优化&#…...
汽配行业数字化解决方案(一)
汽配行业数字化解决方案,是通过整合云计算、大数据、人工智能、物联网等先进技术,构建一个全面、高效、智能的数字化生态系统,以实现汽配供应链的全程可视化与智能化管理。该解决方案涵盖了从供应商管理、库存优化、订单处理、物流跟踪到客户…...
前端路径“@/“的使用和配置
环境:vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件,则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…...
动态规划子序列问题系列一>最长递增子序列
题目: 解析: 代码: public int lengthOfLIS(int[] nums) {int n nums.length;int[] dp new int[n];int ret 1;//最坏情况为1//初始化for(int i 0; i < n; i) dp[i] 1;for(int i 1; i < n; i){for(int j 0; j < i-1; j)if(…...
链表头文件大更新!!!
引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能,让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件,定义了一个模板类 LinkedListÿ…...
力扣3381.长度可被K整除的子数组的最大元素和
力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…...
http.ServeMux多路复用器的设置
package mainimport ("fmt""net/http" )func first(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-first") }func second(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-second") }func ma…...
优化器与优化方法:在现代科学与工程中的应用
目录 编辑 优化器:机器学习中的参数调整 1. 梯度下降系列 2. 动量法(Momentum) 3. Adagrad 4. RMSprop 5. Adam 优化方法:寻找系统最优解 线性规划 非线性规划 凸优化 非凸优化 结论 在当今的科学和工程领域&#…...
笔记本外接显示屏没声音
1、笔记本正常有声音,但是外接显示屏后没有声音了怎么回事呢?原来外接显示屏后笔记本的声音输出会自动选择显示屏的音频输出,但是显示屏可能没有声音输出所以导致笔记本没有声音。 2、解决办法:打开笔记本设置,选择声…...
vue框架
Vue.js是一种用于构建用户界面的JavaScript框架。它是一个轻量级框架,被设计为逐渐采用的渐进式框架,可以与现有项目集成,也可以作为一个完整的单页应用程序框架使用。 Vue.js具有以下特点: 简单易学:Vue.js的API简单…...
Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model
目录 (一)初识指令和内容渲染指令v-html 1.v-html 案例: 官网的API文档 (二)条件渲染指令v-show和v-if 1. v-show 2. v-if (三)条件渲染指令v-else和v-else-if 案例 (四…...
ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书
文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本:8.15.0 2. 启个 mysql docker-compose.yml 中 mysql: mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…...
QT通过在线安装器安装【详细】
在线安装器地址: 官方在线安装器:Index of /official_releases/online_installers (qt.io) 通过命令行启动安装页面 直接双击qt安装程序,在线安装会非常慢,甚至安装失败,所以通过命令行页面启动安装页面。点击wind…...
34.1 uber开源的m3db简介
本节重点介绍 : m3db自己的定位m3db自己的架构m3db自己的组件 两句话简介 M3最初是在优步开发的,目的是提供对优步业务运营,微服务和基础架构的可视性由于M3具有轻松进行水平扩展的能力,因此它为所有监视用例提供了一个集中式存储解决方案…...
MATLAB 最小二乘点云拟合球 (89)
MATLAB 最小二乘点云拟合球 (89) 一、算法介绍二、算法实现1.代码2.结果这是缘,亦是最美的相见 一、算法介绍 球面拟合算法是一种通过数学方法将一组三维点(通常在三维空间中分布)拟合到一个理想的球形表面上。这个过程通常涉及使用最小二乘法来最小化实际数据点与拟合的…...
线程与进程的区别与联系:操作系统入门详解(含 Python 示例)
、先搞懂:进程与线程到底是什么?(通俗类比官方定义) 1.1 生活化类比:快速建立认知 如果把计算机的操作系统比作一个大型工厂: 进程:就是工厂里的一个个独立车间。每个车间有自己专属的生产资…...
Cadence启动文件背后的设计哲学:为什么.cdsinit总覆盖不了.cdsenv的设置?
Cadence启动文件背后的设计哲学:为什么.cdsinit总覆盖不了.cdsenv的设置? 当你在Cadence Virtuoso中反复调整波形显示参数,却发现每次重启后设置都被重置时,背后隐藏的是一套精妙的EDA工具配置体系。这个看似简单的"设置失效…...
小白也能玩转DeepSeek-R1:Ollama一键部署推理模型实战
小白也能玩转DeepSeek-R1:Ollama一键部署推理模型实战 还在为复杂的AI模型部署而烦恼吗?DeepSeek-R1-Distill-Llama-8B作为一款强大的文本生成模型,现在通过Ollama平台可以轻松实现一键部署。本文将带你从零开始,只需3个简单步骤…...
CST中利用SPICE语言自定义复杂lumped element电路的实战指南
1. 突破CST自带元件的限制:为什么需要SPICE语言 刚开始用CST做电路仿真时,我也觉得自带的RLC元件够用了——直到遇到一个带滤波功能的耦合器项目。当时需要模拟一个包含寄生参数的复杂匹配网络,自带的并联RLC元件死活调不出理想的频响曲线。这…...
Obsidian插件终极汉化指南:obsidian-i18n让英文插件秒变中文界面
Obsidian插件终极汉化指南:obsidian-i18n让英文插件秒变中文界面 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 你是否因为Obsidian插件的英文界面而头疼?面对"Backlink"、"Graph …...
三相永磁同步电机FOC控制实战:从霍尔传感器配置到SVPWM调参避坑指南
三相永磁同步电机FOC控制实战:从霍尔传感器配置到SVPWM调参避坑指南 当你在深夜的实验室里盯着示波器上跳动的波形,试图让一台三相永磁同步电机平稳启动时,是否经历过这样的场景:明明按照手册配置了所有参数,电机却像喝…...
探索Ryujinx:Nintendo Switch模拟器全解析
探索Ryujinx:Nintendo Switch模拟器全解析 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 在游戏技术不断发展的今天,模拟器技术为玩家提供了跨平台体验游戏的可…...
多模态融合避坑手册:为什么你的跨模态模型总掉进‘语义鸿沟’?
多模态融合避坑手册:为什么你的跨模态模型总掉进‘语义鸿沟’? 当你兴奋地将精心设计的跨模态模型投入训练,却发现验证集指标像过山车一样剧烈波动时,问题往往出在那些容易被忽视的工程细节里。上周有位工程师向我展示了他的视频…...
破局 AIGC 检测重围:PaperXie 如何让论文从 “机器量产“ 回归 “学术原创“——3000 字深度解构双效降重新范式
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 引言:当学术写作撞上 AIGC 检测,毕业与投稿的双重困局凌晨两点的图书馆,屏幕上刺眼…...
CVAT:让计算机视觉标注效率提升80%的开源数据引擎
CVAT:让计算机视觉标注效率提升80%的开源数据引擎 【免费下载链接】cvat Annotate better with CVAT, the industry-leading data engine for machine learning. Used and trusted by teams at any scale, for data of any scale. 项目地址: https://gitcode.com/…...
