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

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

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

Мне необходимо отсортировать записи - C++

18.01.2009, 16:17. Просмотров 837. Ответов 11
Метки нет (Все метки)

Помогите разобраться с ошибкой.
Мне необходимо отсортировать записи по полю "kenteken"
После использования стандартной функции QSORT ничего не сортируется
А при использовании указателей вообще получаются нулевые значения.

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 20
 
typedef struct {
  int lignr;
  int kenteken;
  char kleur[7];
  int passagiers;
} BOOT;
 
int vgl(const void*, const void*);
void toon_tab(BOOT[], int);
 
int main(void)
{
 
  BOOT haven[MAX] = {{12,101,"rood",12},
              {14,105,"blauw",8},
              {4,628,"blauw",24},
              {3,411,"rood",28},
              {11,311,"blauw",14},
              {8,205,"geel",18},
              {15,208,"blauw",22},
              {0, 0, "dummy", 0}};
  int* parade;
  int aantalboten, aantal=0, bl=0, rd=0, gr=0;
  BOOT* qb;
  qb=&haven;
 
while((strcmp(haven[aantal].kleur,"dummy"))!=0)  aantal++;
aantalboten=aantal;
printf("Het aantal boten is %d\n", aantalboten);
 
printf("\nInhoud haven\n");
printf("nr  ln   kentk   kleur   pass\n");
for(aantal=0; aantal<aantalboten; aantal++)
printf(" %d %3d %7d   %-7s %3d\n",
        aantal, haven[aantal].lignr, haven[aantal].kenteken, haven[aantal].kleur, haven[aantal].passagiers);
 
for(aantal=0; aantal<aantalboten; aantal++) {
    if((strcmp(haven[aantal].kleur,"blauw"))==0) bl++;
    if((strcmp(haven[aantal].kleur,"rood"))==0)  rd++;
    if((strcmp(haven[aantal].kleur,"groen"))==0) gr++;
    }
printf("\nVoor de kleur blauw : %d\n", bl);
printf("Voor de kleur rood  : %d\n", rd);
printf("Voor de kleur groen : %d\n\n", gr);
 
printf("\nInhoud haven GESORTEERD\n");
printf("nr  ln   kentk   kleur   pass\n");
 
qb=calloc(aantalboten, sizeof(BOOT));
qsort(qb, aantalboten, sizeof(BOOT), vgl);
toon_tab(qb, aantalboten);
 
printf("\n");
for(aantal=0; aantal<aantalboten; aantal++)
printf(" %d %3d %7d   %-7s %3d\n",
    aantal, haven[aantal].lignr, haven[aantal].kenteken, haven[aantal].kleur, haven[aantal].passagiers);
 
 
free(qb);
return 0;
}
 
int vgl(const void* p, const void* q) {
    BOOT a=*(BOOT*)p;
    BOOT b=*(BOOT*)q;
    return a.kenteken-b.kenteken;
}
 
void toon_tab(BOOT* tab, int n) {
int i;
for(i=0; i<n; i++) {
printf(" %d %3d %7d   %-7s %3d\n",
        i, tab[i].lignr, tab[i].kenteken, tab[i].kleur, tab[i].passagiers);
 }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2009, 16:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Мне необходимо отсортировать записи (C++):

Stack. Как мне его отсортировать? - C++
Не вижу почему падает программа. Вроде ничего особого и не писал. #include&lt;iostream&gt; #include&lt;windows.h&gt; #include&lt;stack&gt; using...

Мне необходимо создать электронную книгу, со встроенными тестами - C++
Мне необходимо создать электронную книгу, со встроенными тестами. Разделить ее по главам например прочитал первую главу прошел тест, если...

Необходимо отсортировать страны по алфавиту в программе - C++
Необходимо отсортировать страны по алфавиту в программе - C++ #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include...

Необходимо отсортировать слова в строке по алфавиту - C++
Написать программу в которой вводиться рядок слов, отсортировать слова по первой букве, нужно сделать через использование функций.

Необходимо отсортировать определённые столбцы матрицы по возрастанию - C++
Нужно каждый столбец с чётным номером отсортировать по возрастанию. Для примера дана матрица: 1 2 3 4 4 1 2 3 3 4 1 2 На...

Необходимо отсортировать определённые столбцы матрицы по возрастанию и по убыванию - C++
Нужно каждый столбец с чётным номером отсортировать по возрастанию и по убыванию. Для примера дана матрица: 3 2 3 3 4 6 2 7 2 4 1...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
18.01.2009, 16:25 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int vgl(const void* p, const void* q) {   
    BOOT a=*(BOOT*)p;   
    BOOT b=*(BOOT*)q;   
    return a.kenteken-b.kenteken;   
}  
 
// qsort использует при сортировке указатель на эту функцию?
// тогда она должна возращать true или false в зависимости от того верно ли //сравнение
 
bool vgl(const void* p, const void* q) {   
    BOOT a=*(BOOT*)p;   
    BOOT b=*(BOOT*)q;   
    return a.kenteken>b.kenteken;   
}
не уверен...не очень читабельный код какойто
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.01.2009, 18:13 #3
функция правильная

вместо
C++
1
2
qb=calloc(aantalboten, sizeof(BOOT));  
qsort(qb, aantalboten, sizeof(BOOT), vgl);
C++
1
2
qb = calloc(aantalboten, sizeof(BOOT));  
qsort((void *) haven, aantalboten, sizeof(BOOT), vgl);
Blacki
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
18.01.2009, 18:51  [ТС] #4
Огромное спасибо!!!

А можно еще вопросик? В этой же программе, если я выношу часть с подсчетом записей в отдельную функцию, ... тоже ошибка. Что я опять делаю не так?
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 20
 
typedef struct {
  int lignr;
  int kenteken;
  char kleur[7];
  int passagiers;
} BOOT;
 
int telboten(BOOT[]);
 
int main(void)
{
  BOOT haven[MAX] = {{12,101,"rood",12},
               {14,105,"blauw",8},
               {4,628,"blauw",24},
               {3,411,"rood",28},
               {11,311,"blauw",14},
               {8,205,"geel",18},
               {15,208,"blauw",22},
               {0, 0, "dummy", 0}};
  int* parade;
  int aantalboten, aantal;
 
aantalboten = telboten(haven);
printf("Het aantal boten is %d\n", aantalboten);
return 0;
}
 
int telboten(BOOT[] h) {
aantal=0;
while((strcmp(h[aantal].kleur,"dummy"))!=0) aantal++;
return aantal;
}
Фенрир
42 / 38 / 2
Регистрация: 05.01.2009
Сообщений: 394
18.01.2009, 18:58 #5
C++
1
2
3
4
5
6
7
8
9
int telboten(BOOT h[]) {   
aantal=0;   
while((strcmp(h[aantal].kleur,"dummy"))!=0) aantal++;   
return aantal;   
} 
 
или
 
int telboten(BOOT* h) ;
Blacki
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
18.01.2009, 19:03  [ТС] #6
Спасибо!!!
Blacki
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
20.01.2009, 12:03  [ТС] #7
И еще вопрос (последний в этой теме) Функция "toonparade" должна возвращаять такой же результат как и функция "maakparade", но у меня не получается. В чем ошибка?

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 20
 
typedef struct {
  int lignr;
  int kenteken;
  char kleur[7];
  int passagiers;
} BOOT;
 
int telboten(BOOT[]);
void toonhaven(BOOT[], int);
int bepaalaantal(BOOT[], char[], int);
int vgl(const void*, const void*);
 
 
int maakparade(BOOT[], char[], int*, int);
void toonparade(int, int*);
 
int main(void)
{
  BOOT haven[MAX] = {{12,101,"rood",12},
                            {14,105,"blauw",8},
                            {4,628,"blauw",24},
                            {3,411,"rood",28},
                            {11,311,"blauw",14},
                            {8,205,"geel",18},
                            {15,208,"blauw",22},
                            {0, 0, "dummy", 0}};
  int* parade;
  int aantalboten, aantal;
 
  aantalboten = telboten(haven);
  printf("Het aantal boten is %d\n", aantalboten);
  printf("\nInhoud haven\n");
  toonhaven(haven, aantalboten);
  printf("\n");
 
  aantal = maakparade(haven, "rood", &parade, aantalboten);
  printf("\nParade van rood : ");
  toonparade(aantal, parade);
  printf("\n");
 
  aantal = maakparade(haven, "groen", &parade, aantalboten);
  printf("\nParade van groen : ");
  toonparade(aantal, parade);
  printf("\n");
 
  aantal = maakparade(haven, "blauw", &parade, aantalboten);
  printf("\nParade van blauw : ");
  toonparade(aantal, parade);
 
  return 0;
}
 
//******************* functies ******************************
 
int telboten(BOOT* h) {
    int teller=0;
    //while((strcmp(h[teller].kleur,"dummy"))!=0) teller++;
    while(strcmp(h[teller].kleur,"dummy")) teller++;
    return teller;
}
 
void toonhaven(BOOT h[], int a) {
//void toon_tab(BOOT* h, int a) {
    int teller;
    printf("nr  ln   kentk   kleur   pass\n");
    for(teller=0; teller<a; teller++)
        printf(" %d %3d %7d   %-7s %3d\n", teller, h[teller].lignr, h[teller].kenteken, h[teller].kleur, h[teller].passagiers);
}
 
int bepaalaantal(BOOT* h, char* kl, int a) {
    int teller=0, res=0;
    while(teller<a){
        if((strcmp(h[teller].kleur, kl))==0) res++;
        teller++;
    }
    return res;
}
 
int maakparade(BOOT* h, char* kl, int* p, int a)
{
    int res, teller, i=0;
 
    printf("\nParade van %s : ", kl);
    res=bepaalaantal(h, kl, a);
    p=calloc(res, sizeof(int));
    if(!p) {
        printf("\nAllocatie mislukt!");
        return 1;
    }
    for(teller=0; teller<a; teller++){
        if((strcmp(h[teller].kleur, kl))==0) {
            p[i]=h[teller].kenteken;
            printf(" %5d ", p[i]);
            i++;
        }
    }
    i=0;
    return res;
}
 
 
void toonparade(int res, int p[])
{
int teller;
    for(teller=0; teller<res; teller++)
        printf(" %5d ", &p[teller]);
return 0;
}
Blacki
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
22.01.2009, 12:29  [ТС] #8
Это точно, извини. А как удалить мои сообщения или вынести их в новую тему?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.01.2009, 23:08 #9
у toonparade поменяй тип на такой же, если делаешь return 0 значит надо сделать int а не void
Blacki
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
23.01.2009, 10:26  [ТС] #10
return убрала, ничего не поменялось.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
23.01.2009, 10:35 #11
имелось в виду это
Код
void*toonparade(int*res,*int*p[])
заменить на
Код
[COLOR="Red"]int[/COLOR] toonparade(int*res,*int*p[])
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
23.01.2009, 13:51 #12
void - пустое множество, если функция возвращает void это значит она не возвращает ничего
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2009, 13:51
Привет! Вот еще темы с ответами:

Элементы массива с нечетных позиций необходимо отсортировать по возрастанию, с четных - по убыванию - C++
Значит есть одномерный массив из 10 чисел. Заполнен случайными значениями. Числа расположенные на нечетных позициях необходимо...

Отсортировать введение записи по возрастанию значений ключей - C++
Уважаемые форумчане, нужна ваша помощь в решении задачи: С клавиатуры ввести набор структур с полями &quot;Ключ&quot; и &quot;Данные&quot; (ключ-целое...

Отсортировать массив по возрастанию количества цифр, встречающихся в записи числа - C++
Дан массив целых положительных чисел b1,b2,...,bn.Отсортировать массив по возрастанию количества цифр,встречающихся в записи числа.

Отсортировать элементы массива по убыванию старшей цифры в записи его элементов - C++
1. Отсортировать элементы массива по убыванию старшей цифры в записи его элементов


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.01.2009, 13:51
Ответ Создать тему
Опции темы

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