解题思路:
我说下我自己的思路吧
我思路和题目分段来完成
一下写的都是伪代码!
1.用了2维数组 scoreArr[1000][5] -> 5表示每行里面个有5个数据 (这里理论上来说应该是3个的但是看后面的要求要你给出学号和总分)
于是有了 例:scoreArr[0][5] = {语文分数,数学分数,英语分数,学号,总分}
2.同时用了rank rankIndex 1维数组保存总分 和 每个总分对应的行号(下标)
3.定义sorts方法处理中间的逻辑关系
简单来说是将rank中的成绩大->小排序 这里同时也会改变rankIndex对应的顺序(这里当rank改变时rankIndex也同时进行了修改)
=====> rank[i] => 指的是分数 rankIndex[i] => 指的是这个分数是第在第几行的 还是不懂那举个例子
5个数
90 67 80 => 总分237 学号1 下标0
87 68 91 => 总分246 学号2 下标1
90 100 74 => 总分264 学号3 下标2
88 99 77 => 总分264 学号4 下标3
88 98 78 => 总分264 学号5 下标4
sorts处理后 rank=[264,264,264,246,237] rankIndex=[2,3,4,1,0]
这里应该是看的懂的 然后事情到这里本来应是结束了 但是还有个简单的要求我琢磨了半天没弄明白 最后发现是自己看错题目了 zzzz
如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面
就是这个简单的一小问 结果搞了我好久....
下一个处理的事情就是学分一样的情况怎么解决
用2个for来对比rank(保存成绩的数组)看看有没有相同的分数情况
if rank[i] == rank[j]
if rank[i] < rank[j]
交换rankIndex (rankIndex表示总分对应的下标 最后其实只要得出这个rankIndex中的值在scoreArr中当下标用输出结果就是 等会看代码就知道了)
else if 语文成绩此时也是相同 那么判断学号位置关系
ranki学号>rankj学号
交换rankIndex
这里没问题后 最后就只要输出rankIndex
学号:scoreArr[rankIndex[0-5]][3]
总分:scoreArr[rankIndex[0-5]][4]
注意事项:
参考代码:
#include <stdio.h> #include <string.h> #include <ctype.h> #include <math.h> #include <stdlib.h> // int findCurrentNumber(int a[], int findNumber, int len) // { // for (int i = 0; i < len; i++) // { // if (a[i] == findNumber) //找到这个数1 // return 1; // } // return -1; // } // void reverseArr(char a[], char b[]) // { // int length = strlen(a); // int i = 0; // for (; length >= 0; length--) // { // b[i++] = a[length - 1]; // } // printf("%s", b); // } // void sorts(int a[], int count) // { // for (int i = 0; i < count; i++) // { // for (int j = i + 1; j < count; j++) // { // if (a[i] > a[j]) // { // int temp = a[i]; // a[i] = a[j]; // a[j] = temp; // } // } // } // } // void scf(int a[][5], int n) // { // for (int i = 0; i < n; i++) // { // scanf("%d", &a[i]); // } // } // void printArr(int a[], int n) // { // for (int i = 0; i < n; i++) // { // if (a[i] == 0) // continue; // printf("%d ", a[i]); // } // } // void handle(int arr[], int newArr[], int len) // { // int count = 0; // for (int i = 0; i < len; i++) // { // if (findCurrentNumber(newArr, arr[i], len) != 1) // { // newArr[count++] = arr[i]; // } // } // printf("%d\n", count); // sorts(newArr, count); // } int totalScore(int arr[]) { // 给数组求和并返回 没啥好说 int total = 0; for (int i = 0; i < 3; i++) total += arr[i]; return total; } void scf(int a[][5], int n, int rank[], int rankIndex[]) { // 输入函数也没啥好说 for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &a[i][j]); } // 保存下标 rankIndex[i] = i; // 赋值学号 计算总分 a[i][3] = i + 1; a[i][4] = totalScore(a[i]); // 同时将每个学生的总成绩保存到数组里 rank[i] = totalScore(a[i]); } } // 我自己测试用的函数可以忽略 void printArr(int a[][5], int n) { for (int i = 0; i < n; i++) { printf("%d号 ", a[i][3]); for (int j = 0; j < 3; j++) { printf("%d ", a[i][j]); } printf("%d", a[i][4]); printf("\n"); } } // 对比值 且交换 void compAndchange(int arr[], int arr2[], int rankIndex[], int old1, int old2) { for (int i = 0; i < 3; i++) { for (int j = 0; j <= 0; j++) { if (arr[i] < arr2[j]) { int temp = rankIndex[old1]; rankIndex[old1] = rankIndex[old2]; rankIndex[old2] = temp; i = 4; break; // return; } } } } // 我自己测试用的函数可以忽略 void printArr2(int a[], int n) { for (int i = 0; i < n; i++) { printf("%d ", a[i]); } } void sorts(int a[], int rankIndex[], int count, int current[][5]) { for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { if (a[i] < a[j]) { int temp = a[i]; a[i] = a[j]; a[j] = temp; // 下标交换 int tempIndex = rankIndex[i]; rankIndex[i] = rankIndex[j]; rankIndex[j] = tempIndex; } } } // printf("-----------\n"); // printArr2(rankIndex, count); // printf("\n-----------\n"); // 对比相同的存在 for (int i = 0; i < count; i++) { for (int j = i + 1; j < count; j++) { if (a[i] == a[j]) { //语文成绩比较 if (current[rankIndex[i]][0] < current[rankIndex[j]][0]) { compAndchange(current[rankIndex[i]], current[rankIndex[j]], rankIndex, i, j); } // 语文成绩相同 else if (current[rankIndex[i]][0] == current[rankIndex[j]][0]) { // printf("=====\n"); if (current[rankIndex[i]][3] > current[rankIndex[j]][3]) compAndchange(current[rankIndex[i]], current[rankIndex[j]], rankIndex, i, j); } } } } } void sortRanking(int current[][5], int index[], int showCount, int len) { // 根据rank输出结果 for (int i = 0; i < showCount; i++) { if (i + 1 > len) printf("0 0\n"); else // 学号 + 总分 printf("%d %d\n", current[index[i]][3], current[index[i]][4]); } } int main() { int scoreArr[1000][5] = {0}; //4为学号 5为总分 int group; //输入的几组数据 // 动态分配 int *rank = NULL, *rankIndex = NULL; scanf("%d", &group); rank = (int *)malloc(group * sizeof(int)); rankIndex = (int *)malloc(group * sizeof(int)); // input scf(scoreArr, group, rank, rankIndex); sorts(rank, rankIndex, group, scoreArr); // rank sortRanking(scoreArr, rankIndex, 5, group); // test------ // printArr2(rank, group); // printf("\n"); // printArr2(rankIndex, group); // printf("\n"); // printArr(scoreArr, group); return 0; } //PS:其实compAndchange里面的2个for好像有点多余了 可以直接写交换代码的 // 5 // 90 67 80 // 87 68 91 // 88 99 77 // 90 100 74 // 88 98 78 // 5 // 90 67 80 // 87 68 91 // 90 100 74 // 88 99 77 // 88 98 78
0.0分
2 人评分
C语言考试练习题_排列 (C++代码)浏览:1112 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:538 |
点我有惊喜!你懂得!浏览:1274 |
C语言程序设计教程(第三版)课后习题6.7 (C语言代码)浏览:548 |
蛇行矩阵 (C语言代码)浏览:792 |
简单的a+b (C语言代码)浏览:641 |
C语言程序设计教程(第三版)课后习题9.3 (C语言代码)浏览:750 |
Hello, world! (C语言代码)浏览:766 |
有关字符,字符串的输入输出函数说明浏览:498 |
C语言训练-自守数问题 (C语言代码)浏览:798 |