Сортировка массива структур

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
request
Сообщения: 5
Зарегистрирован: 16 дек 2009, 02:06

Почему-то сортировка не работает. Вообще совсем. Даже не знаю в чем дело, в сортировке или в структуре. Помогите, пожалуйста, исправить.

Код: Выделить всё

typedef struct
{
        char name [20];
        int group;
        int mark[5];
} STUDENT;

Код: Выделить всё

void sort(STUDENT a[])
{
    int i,j;
    STUDENT p;
        for (i=0; i<10; i++)
        {for (j=1; j<i; j++)
        {
                if (strcmpi(a[i].name, a[j].name)>0)
                {
                        p = a[i];
                        a[i] = a[j];
                        a[j] = p;
                }
        }
        }
}
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

Во первых что в твоем понимании "не работает. Вобще совсем" :) :
- не компилится, выдает кучу ошибок;
- программа запускается, осуществляет ввод, вывод массива, но при этом алгоритм сортировки не работает должным образом.
Нужное обвести фломастером. :)

Во вторых укажи название алгоритма сортировки.

Из того что ты прислал могу дать следующий совет:
Проверь корректность содержимого полей структур, особенно тех полей, которые проверяются функцией strcmpi.
То есть, все ли поля name инициализированы? Строки заканчиваются нуль литерой(\0)? Не находится ли в них мусор?
request
Сообщения: 5
Зарегистрирован: 16 дек 2009, 02:06

если бы были какие-то другие симптомы, так бы и написал)) все нормально компилится, ни одной ошибки, просто не работает. как будто ее вообще нет. остальное все как часы, заполнение и вывод. строка в нужном поле берется с помощью fgets (то есть должны нулем заканчиваться, если я правильно понимаю?), потом идет проверка чтобы там были только буквы и пробелы.
сортировку кстати пробовал разную, по-моему до нее просто дело не доходит. хотя у меня стаж обучения три недели, я ничего не гарантирую и в полной растерянности.
1nclude
Сообщения: 22
Зарегистрирован: 14 дек 2009, 10:15

Во первых замечание по твоей структуре - в int mark должна храниться оценка насколько я понимаю, если так то зачем массив из 5?

Во вторых по сортировке,вместо:

Код: Выделить всё

if (strcmpi(a[i].name, a[j].name)>0)
попробуй делать вот так ;) :

Код: Выделить всё

if( strlen(a[i].name) > strlen(a[j].name) )
И я бы на твоём месте заменил пузырёк на быструю сортировку.
IceFlame
Сообщения: 62
Зарегистрирован: 29 ноя 2009, 03:54

Код: Выделить всё

for (j=1; j<i; j++)
заменить на

Код: Выделить всё

for (j=0; j<i; j++)
L.A.V.
Сообщения: 20
Зарегистрирован: 16 авг 2009, 23:37
Откуда: Солнечный Крым
Контактная информация:

1nclude массив оценок нужен скорее всего для хранения нескольких оценок по предметам, либо несколько итоговых оценок по предмету.
При этом strlen не решит задачи, так как имена студентов, скорее всего должны сортироваться по алфавиту а не по длине имени :) .

Проблема в том, что в самом алгоритме сортировки (если это пузырек) ошибка.
Вобщем, request, тыц сюда, и смори что не правильно.

Если найдешь ошибку твой код заработает, даю гарантию :)
При этом изменяя условия в if, ты сможешь сортировать студентов по группам, и по оценкам.
Дерзай, что не понятно будет, спрашивай.
1nclude
Сообщения: 22
Зарегистрирован: 14 дек 2009, 10:15

L.A.V., ну всё равно хранить оценки по предметам в массиве константной длинны не айс. А если предметов станет больше или меньше?
Циферку поменяем? :D Вообщем мало информации о выбранной топикстартером стратегии использования записей о студентах, что бы делать какие либо выводы.
Насчёт сортировки, да, скорее всего я ошибся, раз уж топикстартер применяет strcmpi, то наверное не просто так. Хотя от топикстартера что то нет вестей.
Ответить