Сортировка конструкций элементарными методами

0

Это программа, которая суммирует метки каждого ученика и сортирует общее число, но не меняет порядок других параметров, таких как имя ученика и их метки. Как сортировать структуру в целом, сохраняя общие оценки в качестве основы для сортировки? Я не хочу использовать какие-либо встроенные функции и делать это с помощью элементарных методов.

#include<stdio.h>
#include<conio.h>
struct stnd
{
   int sub[20];
   char name[20];
   int total;
}
stnd[20];
main()
{
    int i, j, n=4, m=4,k;
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
            scanf("%d",&stnd[i].sub[j]);
    for(i=0; i<n; i++)
        scanf(" %s",stnd[i].name);
    for(i=0; i<n; i++)
    {
        stnd[i].total=0;
        for(j=0; j<m; j++)
            stnd[i].total=stnd[i].total+stnd[i].sub[j];
    }

    for(i=0; i<n; i++)
    {
        for(j=i+1; j<n; j++)
        {
            if(stnd[i].total<stnd[j].total)
            {
                k=stnd[i].total;
                stnd[i].total=stnd[j].total;
                stnd[j].total=k;
            }
        }
    }

    printf("Rank\t Chin\t Math\t Eng\t Comp\t total\t name\n");
    for(i=0; i<n; i++)
    {
        printf("%d\t",i+1);
        for(j=0; j<m; j++)
        printf("%d\t",stnd[i].sub[j]);
        printf("%d\t",stnd[i].total);
        printf("%s\t\n",stnd[i].name);

    }
    getch();
}
Теги:

1 ответ

2
Лучший ответ

В функции, где вы меняете, просто замените структуру вместо общего:

// Where you declare k, declare it as a struct stnd
struct stnd k;

// Where you swap, just swap the structures, not the totals
k = stnd[i];
stnd[i]  stnd[j];
stnd[j] = k;

Когда вы устанавливаете struct stnd, он выполняет struct stnd копию объекта, который вы копируете, что именно то, что вам нужно для сортировки.

  • 1
    Я хочу отметить, что это не всегда то, что вы хотите. Это делает мелкую копию. Это будет работать в этом случае, но понимание того, почему это работает и как, и когда это не сработает, чрезвычайно важно.
  • 0
    @NikBougalis На самом деле, я чувствую необходимость уточнить ваши разъяснения. Если вы делаете что-то вроде копирования строки данных, да, вам нужно быть осторожным при выполнении мелкой копии. Я не могу вспомнить ни одного экземпляра при сортировке, когда вам не нужна мелкая копия. Поскольку вы меняете местами, цель состоит в том, чтобы «перемещать» данные, а не копировать их, и поверхностное копирование идеально подходит для операции «перемещения».

Ещё вопросы

Сообщество Overcoder
Наверх
Меню