Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

27.12.2012, 22:10. Просмотров 680. Ответов 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;
}
Проблема с функцией встроенной сортировки подскажите пожалуйста как исправить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2012, 22:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос функция qsort при сортировке массива структур (C++):

Функция qsort для сортировки массивов структур - C++
В общем есть структура struct User { int id; char nickname; int karma; };

Qsort для массива структур - C++
Да, знаю, что таких тем на форуме уже полно, как и кода, но смысл мне всё равно непонятен. Есть массив таких рёбер: struct edge{ int...

Отсортировать вектор структур по одной переменной через qsort - C++
Есть вектора структур такого типа , нужно отсортировать через qsort эту структуру по точке point2 struct Mystruct { double...

Использование массива индексов при сортировке - C++
Задали задачку отсортировать обычный одномерный массив. Так же, нужно использовать массив индексов, чтобы показать, как отсортирован...

Количество перестановок при сортировке массива - C++
Как вывести число количества перестановок после сортировки массива, допустим выбору?

Синтаксические ошибки при сортировке массива пузырьком - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; using namespace std; void main(int size,int nums) ...

7
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
27.12.2012, 22:44 #2
Цитата Сообщение от melanu Посмотреть сообщение
(*(int*)a).chastota - (*(int*)b).chastota;
а зачем ты приводишь указатель void* к указателю на int???
приводи к struct book*

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

Компилируется без ошибки но сортировки не происходит
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
27.12.2012, 22:56 #5
Цитата Сообщение от melanu Посмотреть сообщение
qsort (a, SIZE, sizeof(temp3), compare);
опять-таки, почему не sizeof(struct book) ?
Ой, впрочем ясно... отпал вопрос
0
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
27.12.2012, 23:26  [ТС] #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
0
Kuzia domovenok
1947 / 1800 / 137
Регистрация: 25.03.2012
Сообщений: 6,234
Записей в блоге: 1
27.12.2012, 23:37 #7
Цитата Сообщение от melanu Посмотреть сообщение
int compare (const void * a, const void * b)
{
return (*(struct book*)a).chastota > (*(struct book*)b).chastota;
}
а почему минус заменил на "больше"?
В изначальной версии был минус. Ты хоть понимаешь, что натворил?
0 будет возвращаться даже когда меньше, а по логике работы в этом случае должно возвращаться -1
1
melanu
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
28.12.2012, 00:27  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
а почему минус заменил на "больше"?
В изначальной версии был минус. Ты хоть понимаешь, что натворил?
0 будет возвращаться даже когда меньше, а по логике работы в этом случае должно возвращаться -1
при минусе всё обнуляется(

Добавлено через 32 минуты
фух наконецто крыса завелась в строке qsort (a, count, sizeof(struct book), compare); нужно было указывать не максимальное количество вводов структур, а количество введённых, т.е. count. всем спс за помощь
0
28.12.2012, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2012, 00:27
Привет! Вот еще темы с ответами:

ОБНУЛЯЕТСЯ ДРОБНАЯ ЧАСТЬ ПРИ СОРТИРОВКЕ МАССИВА!!! - C++
Массив B сформировать по правилу b = sqrt(fabsf(i * i - a)), где a=25.8. Найти сумму элементов с номерами с 5-го по 10-ый, упорядочить эти...

Ошибка при сортировке двумерного массива по возрастанию - C++
По убыванию сортировка работает полноценно,а по возрастанию первое число НЕ понимаю откуда появляется :wall:. Помогите решить данную...

Выход за пределы массива при его сортировке - C++
#include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;clocale&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR*...

Функция qsort - C++
Здравствуйте! Помогите пожалуйста отсортировать студентов с помощью функции qsort по &quot;age&quot; или другим критериям. Спасибо! #include...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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