Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
#1

функция qsort при сортировке массива структур - C++

27.12.2012, 22:10. Просмотров 650. Ответов 7
Метки нет (Все метки)

Заголовочный файл:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define SIZE 7
void vvod();
void vyvod();
int compare (const void * a, const void * b);
struct book{
    char firma[22];
    char nazvanie_mikroprocesora[20];
    int chastota;
    float moshnostb;
}temp3;
Ввод:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "my.h"
void vvod(void){
    extern count;
    extern struct book a[SIZE];
    char choice;
    if (count!=0){
        while(1){
            printf("Sozdatb novyy ili dopisatb v staryy? (N - new, O - old): ");
            choice=toupper(getchar());
            if (choice=='N'){
                count=0;
            }
            if (choice!='N' && choice !='O'){
                while (getchar()!='\n')
                    continue;
                continue;
            }
            while(getchar()!='\n')
                continue;
            break;
        }
    }
    for (count=0; count<SIZE; count++){
        printf("Vvedite firmy %d ", count+1);
        scanf("%s",a[count].firma);
        while (getchar()!='\n')
            continue;
        printf("Vvedite nazvanie ");
        scanf("%s", a[count].nazvanie_mikroprocesora);
        while (getchar()!='\n')
            continue;
        printf("Vvedite chastoty ");
        scanf("%d", &a[count].chastota);
        while (getchar()!='\n')
            continue;
        printf("Vvedite moshnostb ");
        scanf("%f", &a[count].moshnostb);
        while (getchar()!='\n')
            continue;
        printf("Zakonchitb vvod?: y/n\t");
        if (toupper(getchar())=='Y'){
            count++;
            break;
        }
        else{
            while (getchar()!='\n')
                continue;
            continue;
        }
    }
    return;
}
Вывод:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include "my.h"
void vyvod(void){
    extern int count;
    extern struct book a[SIZE];
    int i;
    printf("|Nomer| |        Firma       | |   Nazvanie proca   | | Chastota | | Moshnostb |\n");
    for (i=0; i<count; i++){
        printf("=============================================================================== \n");
        printf("%7d %22s %22s %12d %13.1f\n",i+1,a[i].firma,a[i].nazvanie_mikroprocesora,a[i].chastota,a[i].moshnostb);
    }
    return;
}
Меню:
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
27
28
29
30
#include "my.h"
struct book a[SIZE];
int count;
int main(void){
    int punkt;
    count=0;
    while(1){
        printf("Viberite punkt meny\n");
        printf("1 - Vvod   2 - Vyvod 3 - qsort\n");
        scanf("%d",&punkt);
        while (getchar()!='\n')
            continue;
        switch(punkt){
            case 1:
                vvod();
                break;
            case 2:
                vyvod();
                break;
 
            case 3:
                sort_qsort();
                break;
            default:
                printf("Nety takogo punkta\n");
                break;
        }
    }
    return 0;
}
qsort:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "my.h"
void sort_qsort(void){
    extern struct book a[7];
    extern int count;
    struct book temp3;
    qsort (a, 7, sizeof(temp3), compare);
    printf("\n\nKomanda vipolnena yspeshno\n\n");
    return;
}
int compare (const void * a, const void * b)
{
   return (*(int*)a).chastota - (*(int*)b).chastota;
}
Проблема с функцией встроенной сортировки подскажите пожалуйста как исправить
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2012, 22:10     функция qsort при сортировке массива структур
Посмотрите здесь:
C++ Функция qsort для сортировки массивов структур
Qsort для массива структур C++
C++ Отсортировать вектор структур по одной переменной через qsort
C++ Количество перестановок при сортировке массива
C++ Использование массива индексов при сортировке
Ошибка при сортировке двумерного массива по возрастанию C++
C++ Синтаксические ошибки при сортировке массива пузырьком
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.12.2012, 22:44     функция qsort при сортировке массива структур #2
Цитата Сообщение от melanu Посмотреть сообщение
(*(int*)a).chastota - (*(int*)b).chastota;
а зачем ты приводишь указатель void* к указателю на int???
приводи к struct book*

Добавлено через 1 минуту
Цитата Сообщение от melanu Посмотреть сообщение
extern int count;
* * extern struct book a[SIZE];
что-то я не уверен, что это сработает. Почему эти объявления внутри функции, а не снаружи?
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
27.12.2012, 22:53     функция qsort при сортировке массива структур #3
В menu.cpp функция sort_qsort() неизвестна, так как определена в другом файле. Нужно добавить ее в заголовочный файл
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
27.12.2012, 22:53  [ТС]     функция qsort при сортировке массива структур #4
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а зачем ты приводишь указатель void* к указателю на int???
приводи к struct book*

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

что-то я не уверен, что это сработает. Почему эти объявления внутри функции, а не снаружи?
#include "my.h"
void sort_qsort(void){
extern struct book a[SIZE];
extern int count;
extern struct book temp3;
qsort (a, SIZE, sizeof(temp3), compare);
printf("\n\nKomanda vipolnena yspeshno\n\n");
return;
}
int compare (const void * a, const void * b)
{
return (*(struct book*)a).chastota > (*(struct book*)b).chastota;
}

Компилируется без ошибки но сортировки не происходит
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.12.2012, 22:56     функция qsort при сортировке массива структур #5
Цитата Сообщение от melanu Посмотреть сообщение
qsort (a, SIZE, sizeof(temp3), compare);
опять-таки, почему не sizeof(struct book) ?
Ой, впрочем ясно... отпал вопрос
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
27.12.2012, 23:26  [ТС]     функция qsort при сортировке массива структур #6
Цитата Сообщение от ViktorKozlov Посмотреть сообщение
В menu.cpp функция sort_qsort() неизвестна, так как определена в другом файле. Нужно добавить ее в заголовочный файл
спасибо мой косячёк, я его исправила уже после публикации.

Добавлено через 4 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
опять-таки, почему не sizeof(struct book) ?
Ой, впрочем ясно... отпал вопрос
Даже если так всёравно не хочет сортироваться(
#include "my.h"
extern struct book a[SIZE];
extern int count;
void sort_qsort(void){
qsort (a, SIZE, sizeof(struct book), compare);
printf("\n\nKomanda vipolnena yspeshno\n\n");
return;
}
int compare (const void * a, const void * b)
{
return (*(struct book*)a).chastota > (*(struct book*)b).chastota;
}

Добавлено через 25 минут
help me
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.12.2012, 23:37     функция qsort при сортировке массива структур #7
Цитата Сообщение от melanu Посмотреть сообщение
int compare (const void * a, const void * b)
{
return (*(struct book*)a).chastota > (*(struct book*)b).chastota;
}
а почему минус заменил на "больше"?
В изначальной версии был минус. Ты хоть понимаешь, что натворил?
0 будет возвращаться даже когда меньше, а по логике работы в этом случае должно возвращаться -1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2012, 00:27     функция qsort при сортировке массива структур
Еще ссылки по теме:
C++ Выход за пределы массива при его сортировке
C++ ОБНУЛЯЕТСЯ ДРОБНАЯ ЧАСТЬ ПРИ СОРТИРОВКЕ МАССИВА!!!
C++ Подсчитать Количество перестановок при сортировке массива по возрастанию
Функция qsort C++
Функция Qsort C++

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

Или воспользуйтесь поиском по форуму:
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
28.12.2012, 00:27  [ТС]     функция qsort при сортировке массива структур #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а почему минус заменил на "больше"?
В изначальной версии был минус. Ты хоть понимаешь, что натворил?
0 будет возвращаться даже когда меньше, а по логике работы в этом случае должно возвращаться -1
при минусе всё обнуляется(

Добавлено через 32 минуты
фух наконецто крыса завелась в строке qsort (a, count, sizeof(struct book), compare); нужно было указывать не максимальное количество вводов структур, а количество введённых, т.е. count. всем спс за помощь
Yandex
Объявления
28.12.2012, 00:27     функция qsort при сортировке массива структур
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru