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