学生单门课程成绩排序将10个学生的单门课成绩进行从高到低排序并给出排名。、#include stdio.hint main(){float scores[10];int id[10];int i,j;float t_s;int t_id;printf(请输入10个学生的成绩(用空格隔开)\n);for (i 0; i 10; i){printf(第%d个学生成绩, i 1);scanf(%f, scores[i]);id[i] i 1;}for (i 0; i 9; i){for (j 0; j 9 - i; j){if (scores[j] scores[j 1]){t_s scores[j];scores[j] scores[j 1];scores[j 1] t_s;t_id id[j];id[j] id[j 1];id[j 1] t_id;}}}printf(\n成绩排名如下\n);printf(排名\t学生序号\t成绩\n);int grade 1;for (i 0; i 10; i){if (i 0 scores[i] ! scores[i - 1]){grade i 1;}printf(%d\t第%d个学生\t%.1f\n, grade, id[i], scores[i]);}return 0;}这段代码实现了一个非常实用的学生成绩排名系统。它有两个显著的特点数据关联它不仅记录成绩还记录了学生的序号学号。智能排名它能处理分数相同的情况例如两个第1名下一个就是第3名而不是第2名。1. 准备与输入阶段建立档案双数组设计这里用了两个数组。scores存分数id存学生是第几个输入的。id[i] i 1;这是一个很巧妙的初始化。当你输入第1个分数时程序自动在id[0]里记下“1号学生”。这样即使后面排序乱了我们依然知道这个分数原本属于谁。2. 核心排序阶段同步交换这是代码的精髓所在。它使用了冒泡排序但做了一个重要的改进两个数组同时交换。为什么要同步交换想象一下如果只交换分数不交换序号。排序后第一名是98分但对应的序号还是“第5个学生”这就乱套了。逻辑当scores[j]和scores[j1]交换位置时id[j]和id[j1]必须跟着一起交换。这就像两个人换座位不仅要换试卷分数人序号也要一起换过去。3. 排名计算逻辑处理并列这段逻辑它解决了“并列排名”的问题。场景模拟i0 (第1名)i0不成立跳过判断grade默认为 1。输出第1名。i1 (第2名)假设分数和第1名一样scores[1] scores[0]。scores[i] ! scores[i-1]为假不更新 grade。输出还是第1名。i2 (第3名)假设分数比第1名低。scores[2] ! scores[1]为真更新grade 2 1 3。输出第3名。 效果如果有两个第1名下一个名次会自动变成第3名符合标准的比赛排名规则。4. 输出展示\t这是制表符Tab用来对齐表格让输出看起来整齐美观。 总结与运行示例假设输入成绩90 100 100 85...排序前成绩90, 100, 100, 85...序号1, 2, 3, 4...排序后内存中成绩100, 100, 90, 85...序号2, 3, 1, 4...(注意100分对应的学生变成了2号和3号)最终输出排名1第2个学生 (100分)排名1第3个学生 (100分) ——并列第一排名3第1个学生 (90分) ——自动跳至第三排名4第4个学生 (85分)