Отсортировать структуры по возрастанию значения поля 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;
 
}

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

  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
Похожие ответы