Отсортировать структуры по возрастанию значения поля nomer - C (СИ)

Узнай цену своей работы

Формулировка задачи:

программирую в Pelles C for Windows 3.00.4 в общем мне надо ввести кол-во записей, отсортировать их по возрастанию значения поля nomer и выдать. вроде-бы я это сделал, но программа не только не сортирует(!), но так-же при некоторых комбинациях кол-ва структур и значений их полей даже не выводит структуры. вот код:
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main(int argc, char *argv[])
  4. {
  5. typedef struct{
  6. char text[50];
  7. int nomer;
  8. char vremya[20];
  9. } MESAGES;
  10. printf ("kol-vo mesagov=");
  11. int kol;
  12. scanf ("%d",&kol);
  13. MESAGES mesag[kol];
  14. int i;
  15.  
  16. //заполнение структуры
  17. for ( i=0;i<kol;i++)
  18. {
  19. printf ("\n");
  20. printf ("soobschenie nomer %d\n",i+1);
  21. printf ("nomer ust-va= ");
  22. scanf("%d",&mesag[i].nomer);
  23. printf ("text mesaga: ");
  24. scanf("%s",&mesag[i].text);
  25. printf ("vremya mesaga= ");
  26. scanf("%s",&mesag[i].vremya);
  27. }
  28.  
  29. int j;
  30. char Vartext[50];
  31. int Varnomer;
  32. char Varvremya[50];
  33.  
  34. //сортировка (помойму метод Шейла, не уверен)
  35. for (i=0;i<kol-1;i++)
  36. { for (j=kol;j>i+1;j--)
  37. if (mesag[i].nomer>mesag[j].nomer)
  38. {
  39. for (int l=0;l<50;l++){Vartext[l]=mesag[j].text[l];}
  40. Varnomer=mesag[j].nomer;
  41. for (int l=0;l<50;l++) Varvremya[l]=mesag[j].vremya[l];
  42. for (int l=0;l<50;l++){mesag[j].text[l]=mesag[i].text[l];}
  43. mesag[j].nomer=mesag[i].nomer;
  44. for (int l=0;l<50;l++){mesag[j].vremya[l]=mesag[i].vremya[l];}
  45. for (int l=0;l<50;l++){mesag[i].text[l]=Vartext[l];}
  46. mesag[i].nomer=Varnomer;
  47. for (int l=0;l<50;l++){mesag[i].vremya[l]=Varvremya[l];}
  48. }
  49. }
  50. //вывод на экран
  51. for ( i=0;i<kol;i++)
  52. {
  53. printf ("\n");
  54. printf ("soobschenie nomer %d\n",i+1);
  55. printf ("nomer ust-va= %d\n",mesag[i].nomer);
  56. printf ("text mesaga: %s\n",mesag[i].text);
  57. printf ("vremya mesaga= %s\n",mesag[i].vremya);
  58. }
  59. return 0;
  60. }
вопросы: можно ли как-то присваивать чаровские массивы без этих диких циклов? что у меня вызывает описанную ранее ошибку и как от этого избавиться?

Решение задачи: «Отсортировать структуры по возрастанию значения поля nomer»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8.  struct MESAGES
  9. {
  10.     char text[50];
  11.     int nomer;
  12.     char vremya[20];
  13.     bool operator<(const MESAGES& Buffer)
  14.     {
  15.         return nomer < Buffer.nomer;
  16.     }
  17. };
  18.  
  19. int main()
  20. {
  21.     printf ("kol-vo mesagov=");
  22.     int kol;
  23.     scanf ("%d",&kol);
  24.  
  25.     MESAGES* mesag = (MESAGES*)realloc(NULL, sizeof(MESAGES) * kol);
  26.  
  27.     int i;
  28.    
  29.     //заполнение структуры
  30.     for ( i=0;i<kol;i++)
  31.     {
  32.         printf ("\n");
  33.         printf ("soobschenie nomer %d\n",i+1);
  34.  
  35.         printf ("nomer ust-va= ");
  36.         scanf("%d",&mesag[i].nomer);
  37.         printf ("text mesaga: ");
  38.         scanf("%s",&mesag[i].text);
  39.         printf ("vremya mesaga= ");
  40.         scanf("%s",&mesag[i].vremya);
  41.     }
  42.  
  43.  
  44.     int j;
  45.     char Vartext[50];
  46.     int Varnomer;
  47.     char Varvremya[50];
  48.    
  49.     //сортировка (помойму метод Шейла, не уверен)
  50.     /*for (i=0;i<kol-1;i++)
  51.         {  for (j=kol;j>i+1;j--)
  52.         if (mesag[i].nomer>mesag[j].nomer)
  53.         {
  54.             for (int l=0;l<50;l++){Vartext[l]=mesag[j].text[l];}
  55.             Varnomer=mesag[j].nomer;
  56.             for (int l=0;l<50;l++) Varvremya[l]=mesag[j].vremya[l];
  57.             for (int l=0;l<50;l++){mesag[j].text[l]=mesag[i].text[l];}
  58.             mesag[j].nomer=mesag[i].nomer;
  59.             for (int l=0;l<50;l++){mesag[j].vremya[l]=mesag[i].vremya[l];}
  60.             for (int l=0;l<50;l++){mesag[i].text[l]=Vartext[l];}
  61.             mesag[i].nomer=Varnomer;
  62.             for (int l=0;l<50;l++){mesag[i].vremya[l]=Varvremya[l];}
  63.         }
  64.     }*/
  65.  
  66.     sort(mesag, mesag + kol);
  67.  
  68.     //вывод на экран
  69.     for ( i=0;i<kol;i++)
  70.     {
  71.         printf ("\n");
  72.         printf ("soobschenie nomer %d\n",i+1);
  73.         printf ("nomer ust-va= %d\n",mesag[i].nomer);
  74.         printf ("text mesaga: %s\n",mesag[i].text);
  75.         printf ("vremya mesaga= %s\n",mesag[i].vremya);
  76.  
  77.     }
  78.     free(mesag);
  79.     system("Pause");
  80.     return 0;
  81.  
  82. }

Объяснение кода листинга программы

  1. Подключение необходимых библиотек для работы с памятью и алгоритмами
  2. Объявление структуры MESAGES с полями text, nomer, vremya
  3. Реализация оператора < для структуры MESAGES, позволяющего сравнивать объекты по значению поля nomer
  4. Ввод количества сообщений от пользователя с помощью функции scanf
  5. Выделение памяти под массив указателей на структуры MESAGES с помощью realloc
  6. Заполнение структуры MESAGES с помощью цикла for и функций scanf для ввода значений полей nomer, text, vremya
  7. Сортировка массива структур MESAGES методом Шейла (вставками) с использованием цикла for и вложенного цикла j для перестановки элементов
  8. Вывод отсортированного массива структур MESAGES на экран с помощью цикла for и функций printf для вывода значений полей nomer, text, vremya
  9. Освобождение памяти, выделенной под массив указателей на структуры MESAGES, с помощью функции free
  10. Ожидание нажатия клавиши с помощью функции system(Pause)
  11. Возврат значения 0, сигнализирующего об успешном завершении программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы