解题思路:
我说下我自己的思路吧
我思路和题目分段来完成
一下写的都是伪代码!
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 780.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复