Отсортировать структуру по одному из полей - C (СИ) (69570)

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

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

Не получается сделать сортировку, уже много чего перепробовал, помогите пожалуйста
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <sys/stat.h>
  3. #include <memory.h>
  4. #include <fcntl.h>
  5. #include <io.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <conio.h>
  9. #include <windows.h>
  10. #include <locale.h>
  11. struct uchs
  12. {
  13. char klass[20];
  14. int year;
  15. char name[20];
  16. int str;
  17. char rasp[150];
  18. };
  19. int main()
  20. {
  21. int i;
  22. int s;
  23. struct uchs arr[100]; //100 ГґГ*ìèëèé Г¬Г*êñèìóì
  24. int count_uch = 0; //Г±Г·ГҐГІГ·ГЁГЄ ГґГ*ìèëèé
  25. int d = 8;
  26. //int j, k;
  27. int a = 0;
  28. int fh = _open("file.dat", _O_RDWR | _O_BINARY); //ïðîâåðÿåì, Г±ГіГ№ГҐГ±ГІГўГіГҐГІ ëè ГґГ*éë
  29.  
  30. if (fh == -1)
  31. { //åñëè Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ, ñîçäГ*ГҐГ¬
  32. fh = _creat("file.dat", _S_IREAD | _S_IWRITE);
  33. if (fh == -1)
  34. return 1;
  35. }
  36. //ïîêГ* Г*ГҐ ГЄГ®Г*ГҐГ¶ ГґГ*éëГ* ñ÷èòûâГ*ГҐГ¬ ГЁГ*ГґГі Гў Г¬Г*Г±Г±ГЁГў ñòðóêòóð
  37. while (!_eof(fh))
  38. {
  39. _read(fh, &arr[count_uch], sizeof arr[count_uch]);
  40. count_uch++; //óâåëè÷èâГ*ГҐГ¬ Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ* Г*Г* 1 Г± ГЄГ*æäûì Г±Г·ГЁГІГ*Г*Г*ûì ýëåìåГ*òîì
  41. }
  42. do
  43. {
  44. setlocale(LC_ALL, "Rus");
  45. system("cls"); //î÷èñòêГ* ГЅГЄГ°Г*Г*Г*
  46. printf("1: ÄîáГ*ГўГЁГІГј Г§Г*ГЇГЁГ±Гј\n2: Âûâåñòè ГЁГ*ôîðìГ*öèþ Г® ГўГ±ГҐГµ ГіГ·ГҐГ*ГЁГЄГ*Гµ\n 3: îòñîðòèðîâГ*ГІГј:\n0: Г‡Г*êðûòü ïðîãðГ*ììó\nÂûáåðèòå ГЇГіГ*ГЄГІ: ");
  47. scanf("%d", &d);
  48. switch (d) //ìåГ*Гѕ
  49. {
  50. case 1: {
  51. setlocale(LC_ALL, "Rus");
  52. //äîáГ*âëåГ*ГЁГҐ Г*îâîé Г§Г*ГЇГЁГ±ГЁ
  53. printf("Ââåäèòå èìÿ/ГґГ*ìèëèþ: ");
  54. fflush(stdin);
  55. gets(arr[count_uch].name);
  56.  
  57. printf("Ââåäèòå ГЄГ«Г*Г±Г± ГіГ·ГҐГ*ГЁГЄГ*: ");
  58. fflush(stdin);
  59. gets(arr[count_uch].klass);
  60. printf("Ââåäèòå ñêîëüêî ëåò ГіГ·ГҐГ*ГЁГЄГі: ");
  61. fflush(stdin);
  62. scanf("%d", &arr[count_uch].year);
  63. printf("Ââåäèòå ñêîëüêî äåГ*ГҐГЈ Г*Г* ГЄГ*ðòî÷êå Гі ГіГ·ГҐГ*ГЁГЄГ*: ");
  64. fflush(stdin);
  65. scanf("%d", &arr[count_uch].str);
  66. printf("Ââåäèòå Г°Г*Г±Г±ГЇГЁГ±Г*Г*ГЁГҐ ГіГ·ГҐГ*ГЁГЄГ*: ");
  67. fflush(stdin);
  68. gets(arr[count_uch].rasp);
  69. count_uch++;
  70. break; }
  71. case 2: {setlocale(LC_ALL, "Rus");
  72. for (i = 0; i<count_uch; i++)
  73. {
  74.  
  75. printf("\%s \n%s \n%d \n%d\n%s\n", arr[i].name, arr[i].klass, arr[i].year, arr[i].str, arr[i].rasp);
  76. } _getch();
  77. break; }
  78.  
  79. case 3:
  80. {
  81. printf("Ñïèñîê îòñîðòèðîâГ*Г*!");
  82. for (int i = 0; i < sizeof (arr[count_uch].year); i++)
  83. {
  84. for (int j = 0; j < sizeof (arr[count_uch].year); j++)
  85. {
  86. if (arr[i].year > arr[j].year)
  87. {
  88. uchs s_arr = arr[count_uch];
  89. arr[i] = arr[j];
  90. arr[j] = s_arr;
  91. }
  92. }
  93. }
  94. _getch();
  95. break; }
  96. }
  97. }
  98. while (d != 0);
  99. return 0;
  100. }

Решение задачи: «Отсортировать структуру по одному из полей»

textual
Листинг программы
  1. case 7:
  2.         {
  3.                   printf("Список отсортирован!");
  4.  
  5.                   for (int i = 0; i < count_uch - 1; i++)
  6.                   {
  7.                       for (int j = 0; j < count_uch - 1 - i; j++)
  8.                       {
  9.                           if (arr[i] > arr[j])
  10.                           {
  11.                               uchs s_arr = arr[j];
  12.                               arr[j] = arr[j + 1];
  13.                               arr[j + 1] = s_arr;
  14.                           }
  15.                       }
  16.                   }
  17.                   _getch();
  18.                   break; }

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

Код выполняет сортировку массива структур uchs по одному из полей. Структура uchs содержит поля id и name.

  1. В случае 7, код выводит сообщение Список отсортирован!.
  2. Затем, в цикле, код проходит по всем элементам массива, начиная с 0 и до count_uch - 1.
  3. В каждой итерации внутреннего цикла, код сравнивает текущий элемент с каждым последующим элементом и, если текущий элемент больше следующего, меняет их местами.
  4. Код продолжает проходить по всем элементам массива до тех пор, пока не будет выполнено условие завершения цикла.
  5. После завершения цикла, код ожидает нажатия клавиши для продолжения работы программы.
  6. Если условие сортировки не выполнено, код продолжает выполнение до тех пор, пока не будет выполнено условие сортировки.
  7. После завершения цикла, код завершает работу программы.

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


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

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

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

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

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

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