橙啊橙


私信TA

用户名:Jesty

访问量:959

签 名:

等  级
排  名 12328
经  验 978
参赛次数 3
文章发表 5
年  龄 0
在职情况 学生
学  校 饶职
专  业 大前端

  自我简介:

垃圾前端狗

TA的其他文章

bak bin 二进制
浏览:61

解题思路:
            我说下我自己的思路吧 

            我思路和题目分段来完成 

            一下写的都是伪代码!

            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 人评分

  评论区

  • «
  • »