Отсортировать структуры по возрастанию значения поля 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, сигнализирующего об успешном завершении программы