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

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

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

Не получается сделать сортировку, уже много чего перепробовал, помогите пожалуйста
#define _CRT_SECURE_NO_WARNINGS
#include <sys/stat.h>
#include <memory.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <locale.h>
struct uchs
{
    char klass[20];
    int year;
    char name[20];
    int str;
    char rasp[150];
 
};
int main()
{
    int i;
    int s;
    struct uchs arr[100]; //100 ГґГ*ìèëèé Г¬Г*êñèìóì
    int count_uch = 0; //Г±Г·ГҐГІГ·ГЁГЄ ГґГ*ìèëèé
    int d = 8;
    //int j, k;
    int a = 0;
    int fh = _open("file.dat", _O_RDWR | _O_BINARY); //ïðîâåðÿåì, Г±ГіГ№ГҐГ±ГІГўГіГҐГІ ëè ГґГ*éë

    if (fh == -1)
    {   //åñëè Г*ГҐ Г±ГіГ№ГҐГ±ГІГўГіГҐГІ, ñîçäГ*ГҐГ¬
 
        fh = _creat("file.dat", _S_IREAD | _S_IWRITE);
        if (fh == -1)
            return 1;
    }
    //ïîêГ* Г*ГҐ ГЄГ®Г*ГҐГ¶ ГґГ*éëГ* ñ÷èòûâГ*ГҐГ¬ ГЁГ*ГґГі Гў Г¬Г*Г±Г±ГЁГў ñòðóêòóð
    while (!_eof(fh))
    {
        _read(fh, &arr[count_uch], sizeof arr[count_uch]);
        count_uch++;  //óâåëè÷èâГ*ГҐГ¬ Г°Г*çìåðГ*îñòü Г¬Г*Г±Г±ГЁГўГ* Г*Г* 1 Г± ГЄГ*æäûì Г±Г·ГЁГІГ*Г*Г*ûì ýëåìåГ*òîì
    }
    do
    {
        setlocale(LC_ALL, "Rus");
        system("cls"); //î÷èñòêГ* ГЅГЄГ°Г*Г*Г*
        printf("1: ÄîáГ*ГўГЁГІГј Г§Г*ГЇГЁГ±Гј\n2: Âûâåñòè ГЁГ*ôîðìГ*öèþ Г® ГўГ±ГҐГµ ГіГ·ГҐГ*ГЁГЄГ*Гµ\n 3: îòñîðòèðîâГ*ГІГј:\n0: Г‡Г*êðûòü ïðîãðГ*ììó\nÂûáåðèòå ГЇГіГ*ГЄГІ: ");
        scanf("%d", &d);
        switch (d) //ìåГ*Гѕ
        {
        
        case 1: {
                    setlocale(LC_ALL, "Rus");
                    //äîáГ*âëåГ*ГЁГҐ Г*îâîé Г§Г*ГЇГЁГ±ГЁ
                    printf("Ââåäèòå èìÿ/ГґГ*ìèëèþ: ");
                    fflush(stdin);
                    gets(arr[count_uch].name);

                    printf("Ââåäèòå ГЄГ«Г*Г±Г± ГіГ·ГҐГ*ГЁГЄГ*: ");
                    fflush(stdin);
                    gets(arr[count_uch].klass);
                    printf("Ââåäèòå ñêîëüêî ëåò ГіГ·ГҐГ*ГЁГЄГі: ");
                    fflush(stdin);
                    scanf("%d", &arr[count_uch].year);
 
                    printf("Ââåäèòå ñêîëüêî äåГ*ГҐГЈ Г*Г* ГЄГ*ðòî÷êå Гі ГіГ·ГҐГ*ГЁГЄГ*: ");
                    fflush(stdin);
                    scanf("%d", &arr[count_uch].str);
                    printf("Ââåäèòå Г°Г*Г±Г±ГЇГЁГ±Г*Г*ГЁГҐ ГіГ·ГҐГ*ГЁГЄГ*: ");
                    fflush(stdin);
                    gets(arr[count_uch].rasp);
                    count_uch++;
                    break; }
                    
                    case 2: {setlocale(LC_ALL, "Rus");
                    for (i = 0; i<count_uch; i++)
                    {

                        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);
 
                    } _getch();
 
                    break; }

        case 3:
        {
                  printf("Ñïèñîê îòñîðòèðîâГ*Г*!");
                  
                  for (int i = 0; i < sizeof (arr[count_uch].year); i++)
                  {
                      for (int j = 0; j < sizeof (arr[count_uch].year); j++)
                      {
                          if (arr[i].year > arr[j].year)
                          {
                              uchs s_arr = arr[count_uch];
                              arr[i] = arr[j];
                              arr[j] = s_arr;
                          }
                      }
                  }
                  _getch();
                  break; }
                  }
 
        }
        while (d != 0); 
        return 0;
    }

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

textual
Листинг программы
case 7:
        {
                  printf("Список отсортирован!");
 
                  for (int i = 0; i < count_uch - 1; i++)
                  {
                      for (int j = 0; j < count_uch - 1 - i; j++)
                      {
                          if (arr[i] > arr[j])
                          {
                              uchs s_arr = arr[j];
                              arr[j] = arr[j + 1];
                              arr[j + 1] = s_arr;
                          }
                      }
                  }
                  _getch();
                  break; }

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

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

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

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


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

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

12   голосов , оценка 4 из 5
Похожие ответы