Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 4
1

Сортировка структуры

11.10.2014, 10:20. Показов 739. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Второй день бьюсь с сортировкой структур, покажу код, входные и выходные данные:

C++
1
2
3
4
5
6
struct TZap{
                char Name[30];
                char Stamp[30];
                        char Date[30];
                        bool Repair;
     } Zap;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int cmp2(const void* p1, const void* p2)
{
   return strcmp(((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp);
}
void __fastcall TFormMain::Button6Click(TObject *Sender)
{
        TZap st, *mas_Z;
        Fz = fopen(File_Zap.c_str(),"rb");
        int D_f = fileno(Fz);               // Находим дескриптор файла
        int len = filelength(D_f);          // Находим размер файла
        int i, j, kol;
        kol = len/size;                 //Количество записей в файле
        mas_Z = new TZap[kol];
        // Считываем записи из файла в динамический массив
        for (i=0; i < kol; i++)
            fread((mas_Z+i), size, 1, Fz);
        fclose(Fz);
        Memo1->Lines->Add("Сортированные сведения");
        qsort(mas_Z, kol, sizeof(mas_Z), cmp2);
        for(int j=0; j<kol; j++)
        {
                       String s = (const char*) mas_Z[j].Name;
                        if( s==ComboBox2->Text.c_str())
                Out(mas_Z[j],Memo1);
        }
}
данные:

--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Сортированные сведения
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
Телевизор New3 28.09.2014 Не починили
сортирую в примере по полю телевизор
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2014, 10:20
Ответы с готовыми решениями:

Структуры. Сортировка массива структуры
Здравствуйте! В чем моя ошибка?? Нужно отсортировать массив структуры по возрастанию среднего...

Сортировка и структуры
Задача : &quot;Имеется список 10 политических деятелей. Каждый из 100 опрошенных называет трех...

Сортировка структуры
Привет всем. Возникла проблема с лабой никак не могу понять, что от не так. Задание звучит так....

Сортировка Структуры
Помогите пожалуйста, не получается исправить ошибку. Суть: задается кафедра, по этой кафедре...

11
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.10.2014, 10:34 2
Цитата Сообщение от wertyBSD Посмотреть сообщение
C++
1
2
3
4
int cmp2(const void* p1, const void* p2) 
{
  return strcmp(((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp); 
}
что такое strcmp?
0
30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
11.10.2014, 10:36 3
Мать моя. Ну и код.

Зачем приводить к void*?

По теме:
strcmp возвращает -1 в случае, если первый не идентичный символ меньше символа в той же позиции в другой строке (строка "меньше").
Но, при приведении -1 к булевому типу (который используется в сортировках) -1= true (т.к. false == 0, а true == !false), соответственно сортировка делается неверно.
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 4
11.10.2014, 10:46  [ТС] 4
стырил код с другого сайта, так как в С++ не силён

Добавлено через 5 минут
C++
1
2
3
4
5
int cmp2(const void* p1, const void* p2) 
{
if( strcmp(((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp) == 0) return true;
  return false; 
}
а так?

правда тоже не работает
0
30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
11.10.2014, 11:02 5
Только что проверил:
сортировка работает.
Видимо, ошибка в выводе
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.10.2014, 12:42 6
Цитата Сообщение от Vlad0922 Посмотреть сообщение
Видимо, ошибка в выводе
видимо, ты тоже не силён в чтении кода. На ошибку уже указали. При чём тут вывод?
Цитата Сообщение от wertyBSD Посмотреть сообщение
стырил код с другого сайта, так как в С++ не силён
не стоит тырить незнакомый код. Программирование, как и любую другую вещь надо изучать последовательно, с толком с расстановкой. Тогда и копировать незнакомый код не придётся.
0
30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
11.10.2014, 13:34 7
видимо, ты тоже не силён в чтении кода. На ошибку уже указали. При чём тут вывод?
Еще раз повторю: в сортировке ошибки нет, проверил уже.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.10.2014, 13:46 8
Vlad0922, а при чём тут ты? У автора (wertyBSD) ошибка!
Или вы братья-близнецы с ним?
0
30 / 24 / 5
Регистрация: 20.11.2013
Сообщений: 65
11.10.2014, 13:48 9
http://coliru.stacked-crooked.... da6f0a4cb6

Добавлено через 53 секунды
Vlad0922, а при чём тут ты? У автора (wertyBSD) ошибка!
Вы, похоже, явно не понимаете. Ошибка у автора в выводе результатов сортировки, видимо. в виджет.
Сама сортировка выполняется правильно.
0
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 4
11.10.2014, 15:00  [ТС] 10
проверил код, действительно, консольный работает:
проверял тут: http://www.compileonline.com/c... online.php

вывод у меня такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Out(TZap z, TMemo *Memo1)
{
String s;
s = (const char*)Zap.Name;
        s = s + " " + (const char*)Zap.Stamp;
        s = s + " " + (const char*)Zap.Date;
        if(Zap.Repair==true)
        {
             s = s + " Починили";
             }
        else
                s = s + " Не починили";
     Memo1->Lines->Add(s);
}
Добавлено через 27 секунд
блин, точно ошибка в выводе

Добавлено через 1 минуту
спасибо, работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Out(TZap z, TMemo *Memo1)
{
String s;
s = (const char*)z.Name;
        s = s + " " + (const char*)z.Stamp;
        s = s + " " + (const char*)z.Date;
        if(z.Repair==true)
        {
             s = s + " Починили";
             }
        else
                s = s + " Не починили";
     Memo1->Lines->Add(s);
}
Добавлено через 13 минут
всё равно кстати криво сортирует, но выводит правильно

--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Сортированные сведения
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
Телевизор 28.09.2014 Починили
Телевизор 444 02.09.2014 Починили
Телевизор New1 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Добавлено через 29 минут
В дэбаге посмотрел, заместо марки изделия появляется слово "леник"
У меня уже взрыв мозга
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
11.10.2014, 15:45 11
Цитата Сообщение от wertyBSD Посмотреть сообщение
if(Zap.Repair==true)
Булевские значения сравнивать некошерно.
Пишем
C++
1
if(Zap.Repair)
Если надо проверить на истину
и
C++
1
if(!Zap.Repair)
Если на ложь

Добавлено через 3 минуты
C++
1
2
3
4
int cmp2(const void* p1, const void* p2) 
{
      return strcmp( ((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp ) > 0;
}
Для сортировки по возрастанию и, <0 - для сортировки по убыванию
1
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 4
11.10.2014, 16:33  [ТС] 12
вариант с:

C++
1
2
3
4
int cmp2(const void* p1, const void* p2) 
{
      return strcmp( ((TZap*)p1)->Stamp, ((TZap*)p2)->Stamp ) > 0;
}
приводит к зацикливанию qsort

Добавлено через 28 минут
немного поправил, зацикливания нет. но он мешает как то названия, например телевизора соник вообще нет в списке:

--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Сортированные сведения
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
Телевизор 28.09.2014 Починили
Телевизор 444 02.09.2014 Починили
Телевизор New1 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Если убрать проверку на "Телевизор", массив выглядит так:
--------- Все сведения ---------
Телевизор соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
Сортированные сведения
соник 28.09.2014 Починили
Ноутбук ДелЪ 28.09.2014 Починили
Телевизор 122 28.09.2014 Починили
Телевизор 28.09.2014 Не починили
28.09.2014 Не починили
Телевизор 28.09.2014 Починили
28.09.2014 Не починили
Телевизор 444 02.09.2014 Починили
Радиоприёмник Verty 28.09.2014 Починили
Видеомагнитафон Hitacha 30.09.2014 Не починили
Телевизор New1 28.09.2014 Починили
Радиоприёмник New2 28.09.2014 Починили
Телевизор New3 28.09.2014 Не починили
Телевизор 1111 28.09.2014 Починили
0
11.10.2014, 16:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2014, 16:33
Помогаю со студенческими работами здесь

сортировка структуры.
Возникла проблема при сортировке. возможно в коде есть и моя ошибка. ну суть в том, что он не...

Сортировка структуры
Отсортировать структуру по желанию пользователя. 1. Вывести на экран книги в алфавитном порядке с...

Сортировка структуры
Есть структура struct v{ string one; string two; int three; }; Подскажите как...

Сортировка структуры
Не могу придумать алгоритм сортировки структуры, пока все что получилось это найти наибольшее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru