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

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

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

Author24 — интернет-сервис помощи студентам
Помогите разобраться с ошибкой.
Мне необходимо отсортировать записи по полю "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);
 }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.01.2009, 16:17
Ответы с готовыми решениями:

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

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

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

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

11
43 / 39 / 12
Регистрация: 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;   
}
не уверен...не очень читабельный код какойто
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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);
1
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;
}
0
43 / 39 / 12
Регистрация: 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) ;
1
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
18.01.2009, 19:03  [ТС] 6
Спасибо!!!
0
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;
}
0
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
22.01.2009, 12:29  [ТС] 8
Это точно, извини. А как удалить мои сообщения или вынести их в новую тему?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.01.2009, 23:08 9
у toonparade поменяй тип на такой же, если делаешь return 0 значит надо сделать int а не void
0
0 / 0 / 0
Регистрация: 18.01.2009
Сообщений: 6
23.01.2009, 10:26  [ТС] 10
return убрала, ничего не поменялось.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
23.01.2009, 10:35 11
имелось в виду это
Код
void*toonparade(int*res,*int*p[])
заменить на
Код
[COLOR="Red"]int[/COLOR] toonparade(int*res,*int*p[])
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
23.01.2009, 13:51 12
void - пустое множество, если функция возвращает void это значит она не возвращает ничего
0
23.01.2009, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2009, 13:51
Помогаю со студенческими работами здесь

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

Необходимо отсортировать определённые столбцы матрицы по возрастанию и по убыванию
Нужно каждый столбец с чётным номером отсортировать по возрастанию и по убыванию. Для примера дана...

Необходимо отсортировать элементы одномерного динамического массива по возрастанию
Ребзя, задание следующее: Разработать программу, которая вводит текст на английском языке и выводит...

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


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

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