Отсортировать структуры по возрастанию значения поля nomer - C (СИ)
Формулировка задачи:
программирую в Pelles C for Windows 3.00.4
в общем мне надо ввести кол-во записей, отсортировать их по возрастанию значения поля nomer и выдать. вроде-бы я это сделал, но программа не только не сортирует(!), но так-же при некоторых комбинациях кол-ва структур и значений их полей даже не выводит структуры. вот код:
вопросы: можно ли как-то присваивать чаровские массивы без этих диких циклов?
что у меня вызывает описанную ранее ошибку и как от этого избавиться?
Листинг программы
- #include <stdio.h>
- #include <string.h>
- int main(int argc, char *argv[])
- {
- typedef struct{
- char text[50];
- int nomer;
- char vremya[20];
- } MESAGES;
- printf ("kol-vo mesagov=");
- int kol;
- scanf ("%d",&kol);
- MESAGES mesag[kol];
- int i;
- //заполнение структуры
- for ( i=0;i<kol;i++)
- {
- printf ("\n");
- printf ("soobschenie nomer %d\n",i+1);
- printf ("nomer ust-va= ");
- scanf("%d",&mesag[i].nomer);
- printf ("text mesaga: ");
- scanf("%s",&mesag[i].text);
- printf ("vremya mesaga= ");
- scanf("%s",&mesag[i].vremya);
- }
- int j;
- char Vartext[50];
- int Varnomer;
- char Varvremya[50];
- //сортировка (помойму метод Шейла, не уверен)
- for (i=0;i<kol-1;i++)
- { for (j=kol;j>i+1;j--)
- if (mesag[i].nomer>mesag[j].nomer)
- {
- for (int l=0;l<50;l++){Vartext[l]=mesag[j].text[l];}
- Varnomer=mesag[j].nomer;
- for (int l=0;l<50;l++) Varvremya[l]=mesag[j].vremya[l];
- for (int l=0;l<50;l++){mesag[j].text[l]=mesag[i].text[l];}
- mesag[j].nomer=mesag[i].nomer;
- for (int l=0;l<50;l++){mesag[j].vremya[l]=mesag[i].vremya[l];}
- for (int l=0;l<50;l++){mesag[i].text[l]=Vartext[l];}
- mesag[i].nomer=Varnomer;
- for (int l=0;l<50;l++){mesag[i].vremya[l]=Varvremya[l];}
- }
- }
- //вывод на экран
- for ( i=0;i<kol;i++)
- {
- printf ("\n");
- printf ("soobschenie nomer %d\n",i+1);
- printf ("nomer ust-va= %d\n",mesag[i].nomer);
- printf ("text mesaga: %s\n",mesag[i].text);
- printf ("vremya mesaga= %s\n",mesag[i].vremya);
- }
- return 0;
- }
Решение задачи: «Отсортировать структуры по возрастанию значения поля nomer»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- #include <algorithm>
- using namespace std;
- struct MESAGES
- {
- char text[50];
- int nomer;
- char vremya[20];
- bool operator<(const MESAGES& Buffer)
- {
- return nomer < Buffer.nomer;
- }
- };
- int main()
- {
- printf ("kol-vo mesagov=");
- int kol;
- scanf ("%d",&kol);
- MESAGES* mesag = (MESAGES*)realloc(NULL, sizeof(MESAGES) * kol);
- int i;
- //заполнение структуры
- for ( i=0;i<kol;i++)
- {
- printf ("\n");
- printf ("soobschenie nomer %d\n",i+1);
- printf ("nomer ust-va= ");
- scanf("%d",&mesag[i].nomer);
- printf ("text mesaga: ");
- scanf("%s",&mesag[i].text);
- printf ("vremya mesaga= ");
- scanf("%s",&mesag[i].vremya);
- }
- int j;
- char Vartext[50];
- int Varnomer;
- char Varvremya[50];
- //сортировка (помойму метод Шейла, не уверен)
- /*for (i=0;i<kol-1;i++)
- { for (j=kol;j>i+1;j--)
- if (mesag[i].nomer>mesag[j].nomer)
- {
- for (int l=0;l<50;l++){Vartext[l]=mesag[j].text[l];}
- Varnomer=mesag[j].nomer;
- for (int l=0;l<50;l++) Varvremya[l]=mesag[j].vremya[l];
- for (int l=0;l<50;l++){mesag[j].text[l]=mesag[i].text[l];}
- mesag[j].nomer=mesag[i].nomer;
- for (int l=0;l<50;l++){mesag[j].vremya[l]=mesag[i].vremya[l];}
- for (int l=0;l<50;l++){mesag[i].text[l]=Vartext[l];}
- mesag[i].nomer=Varnomer;
- for (int l=0;l<50;l++){mesag[i].vremya[l]=Varvremya[l];}
- }
- }*/
- sort(mesag, mesag + kol);
- //вывод на экран
- for ( i=0;i<kol;i++)
- {
- printf ("\n");
- printf ("soobschenie nomer %d\n",i+1);
- printf ("nomer ust-va= %d\n",mesag[i].nomer);
- printf ("text mesaga: %s\n",mesag[i].text);
- printf ("vremya mesaga= %s\n",mesag[i].vremya);
- }
- free(mesag);
- system("Pause");
- return 0;
- }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с памятью и алгоритмами
- Объявление структуры MESAGES с полями text, nomer, vremya
- Реализация оператора < для структуры MESAGES, позволяющего сравнивать объекты по значению поля nomer
- Ввод количества сообщений от пользователя с помощью функции scanf
- Выделение памяти под массив указателей на структуры MESAGES с помощью realloc
- Заполнение структуры MESAGES с помощью цикла for и функций scanf для ввода значений полей nomer, text, vremya
- Сортировка массива структур MESAGES методом Шейла (вставками) с использованием цикла for и вложенного цикла j для перестановки элементов
- Вывод отсортированного массива структур MESAGES на экран с помощью цикла for и функций printf для вывода значений полей nomer, text, vremya
- Освобождение памяти, выделенной под массив указателей на структуры MESAGES, с помощью функции free
- Ожидание нажатия клавиши с помощью функции system(
Pause
) - Возврат значения 0, сигнализирующего об успешном завершении программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д