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

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

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

Пузырьковая сортировка - C++

01.07.2013, 20:16. Просмотров 749. Ответов 8

Есть курсовик.
Есть пузырьковая сортировка
Есть одно НО.
Сортировка должна быть сделана через массив указателей, а не через массив структур.
Был бы очень благодарен за помощь.

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <stdio.h>
#include <conio.h>
 
#define max_elem 300 
 
typedef struct{ 
    char name[256]; 
    float distance; 
    int ra; 
}bd; 
    
bd databd[max_elem]; 
int num = 0; 
FILE *prfile; 
FILE *file; 
 
void add_elem() 
{
    if(num>=max_elem)
    {
        printf("baza perepolnena.\n");
        return;
    }
    printf("Nazvanie Rasstoyanie Kol-vo reysov:"); 
    scanf("%s %f %d\n", &databd[num].name, &databd[num].distance, &databd[num].ra);
    num++; 
}
 
void delete_elem() 
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else 
    {
        num--;
        int j = 0;
        for(j = i; j<num; j++) 
            databd[j] = databd[j+1];
        printf("zapis' udalena\n");
    }
}
 
void print_elem() 
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void print_all() 
{   
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void sort_bd() 
{ 
  int i, j;
  for (i = num - 1; i > 0; i--)
  {
    for (j = 0; j < i; j++)
    {
      if (databd[j].distance > databd[j + 1].distance)
      {
        bd tmp = databd[j];
        databd[j] = databd[j+1];
        databd[j+1] = tmp;
      }
    }
  }
  printf("baza otsortirovana\n");
}
                            
void save_bd() 
{
     file = fopen("databd.txt","w"); 
     if(file == NULL)
     {
         printf("nevozmojno zapisat' v fail");
         return;
     }
     fprintf(file, "%d\n", num); 
     int i = 0;
     for(i=0; i<num; i++) 
         fprintf(file, "%s %f %d\n", databd[i].name, databd[i].distance, databd[i].ra);
     fclose(file); 
     printf("baza zapisana\n");
}
 
void load_bd() 
{
     file = fopen("databd.txt","r"); 
     if(file == NULL)
     {
         printf("nevozmojno otkrit' fail");
         return;
     }
     fscanf(file, "%d\n", &num); 
     if(num >= max_elem) num = max_elem-1; 
     int i = 0;
     for(i=0; i<num; i++) 
         fscanf(file, "%s %f %d\n", &databd[i].name, &databd[i].distance, &databd[i].ra);       
     fclose(file);
     printf("baza schitana\n"); 
}
 
void run_menu()
{
    int key = 0;
    while(key != 8){ 
        printf("[1] dobavit' zapis'\n");
        printf("[2] udalit' zapis'\n");
        printf("[3] vivesti zapis'\n");
        printf("[4] vivesti vse zapisi\n");
        printf("[5] sortirovat' bazu\n");
        printf("[6] sohranit' bazu v fail\n");
        printf("[7] zagruzit' bazu iz faila\n");
        printf("[8] vihod\n");
        scanf("%d",&key); 
        switch(key){ 
            case 1:{
                 add_elem();
                 break;
            }
            case 2:{
                 delete_elem();
                 break;
            }
            case 3:{
                 print_elem();
                 break;
            }
            case 4:{
                 print_all();
                 
                 break;
            }
            case 5:{
                 sort_bd();
                 break;
            }
            case 6:{
                 save_bd();
                 break;
            }
            case 7:{
                 load_bd();
                 break;
            }
        }
    }     
}
 
int main() 
{
    prfile = fopen("prn", "w");
    run_menu(); 
    fclose(prfile);
    return 0;
}
Сортировка - sort_bd()

Добавлено через 1 час 10 минут
Могу скинуть почти аналогичный пример с правильно сделанной сортировкой, только когда по аналогии делаю в своем задании, почему-то при сортировке начинает крашиться

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <stdio.h> //библиотека для ввода и вывода
#include <conio.h> // getch(),консольный режим
 
#define max 300
 
struct people
{
    char name[10]; //Фамилия
    int god;      //Год рождения
    int ok;    //Оклад
};
struct people *b[max],baza[max];
int i,k;
FILE * file;
 
// Ввод записи
void vvod()
{
printf("Vvedite nomer zapici:");
scanf("%d", &i);
if (i>max)
    printf("Neverno\n"); else
    {
    printf(" Vvedite Familiyu, god rojdenia, oklad:");
    scanf("%s %d %d", &baza[i].name, &baza[i].god, &baza[i].ok);
 }
 getch();
 }
 
//Вывод необходимой записи
void vivod()
{
printf("Vvedite nomer zapici:\n ");
scanf("%d", &i);
if (i>max) printf("Neverno\n"); else
{
printf("Familia: %s, God Rojdenia: %d, Oklad: %d\n" , baza[i].name,baza[i].god, baza[i].ok );
}
getch();
}
 
//Сортировка
void sort()
{
int j;
struct people *tmp;
for (i = 0; i < max-1; i++)
{
    for (j = i+1; j < max; j++)
    {
    if ((b[j]->ok) < (b[j+1]->ok) )
    {
    tmp=b[j];
    b[j]=b[j+1];
    b[j+1]=tmp;
    } }
}
}
 
 //Запись в файл
void save()
{
file=fopen("file.txt","wt");
fprintf(file,"%d\n",max);
for (i = 0; i<max; i++)
{
fprintf(file, "%s %d %d\n", b[i]->name,b[i]->god,b[i]->ok);
}
fclose(file);
}
 
//Чтение из файла
void read()
{
file=fopen("file.txt","rt");
if (file==NULL) printf("oshibka pri 4tenia faila\n");
else{
fscanf(file,"%d\n",&i);
for (i = 0;!feof(file) && i<max; i++)
{
fscanf(file, "%s %d %d \n", &b[i]->name,&b[i]->god,&b[i]->ok);
}
fclose(file);
}
}
 
// Вывод записей на экран
void vivod_all()
{
for (i = 0; i <max; i++)
{
        printf("\n\nRabotnik nomer %d", i+1);
        printf("\nFamilia: %s", b[i]->name);
        printf("\nGod Rojdenia: %d", b[i]->god);
        printf("\nOklad: %d\n", b[i]->ok);
}
getch();
}
 
void main()
{
    int k;
    for(i=0;i<max;i++)
    b[i]=&baza[i];
 
    while(1)
    {
    //Выбор операции
        printf("1 -Vvod novux dannux\n");
        printf("2 -Vvod odnoi zapici\n");
        printf("3 -Sortirovka\n");
        printf("4 -Vvod dannux na ecran\n");
        printf("5 -Soxranenye v fail\n");
        printf("6 -4tenia iz faila\n");
        printf("7 -Vuxod\n");
        scanf("%d",&k);
        switch(k)
        {
         case '1':vvod(); break;
         case '2':vivod(); break;
         case '3':sort(); break;
         case '4':vivod_all(); break;
         case '5':save(); break;
         case '6':read(); break;
         case '7':exit(1);
         default:printf("Neverno\n");
         }
         }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 20:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пузырьковая сортировка (C++):

Пузырьковая сортировка - C++
Здравствуйте! Необходимо осуществить пузырьковую сортировку в столбцах двумерного массива. Но только сортировка должна быть среди...

Пузырьковая Сортировка - C++
Описать структуру с именем Train, содержащую следующие поля: Point (название пункта назначения), Number (номер поезда), Time (время...

Пузырьковая сортировка - C++
В чес дело не могу понять? Переменной массива с индексом X присваивается какое то левое значение. #include &lt;iostream&gt; #include...

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

Пузырьковая сортировка - C++
Здравствуйте .Объясните , пожалуйста , подробно , как работает пузырьковая сортировка . Получается сравниваются два соседних элемента и...

пузырьковая сортировка - C++
Задача не сложная, но у меня нет времени ее решать: дан одномерный массив, нужно сделать пузырьковую сортировку по нему

8
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 20:52 #2
Цитата Сообщение от unskilled Посмотреть сообщение
только когда по аналогии делаю в своем задании
Покажите, как по аналогии делаете.
0
unskilled
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 6
01.07.2013, 20:55  [ТС] #3
На самом деле делаю не совсем я.

Но вот

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#include <stdio.h>
#include <conio.h>
 
#define max_elem 300 
 
typedef struct{ 
    char name[256]; 
    float distance; 
    int ra; 
}bd; 
    
bd databd[max_elem]; 
int num = 0; 
FILE *prfile; 
FILE *file; 
 
void add_elem() //ГґГіГ*êöèÿ äîáГ*âëåГ*ГЁГї ýëåìåГ*ГІГ* Гў ГЎГ*çó
{
    if(num>=max_elem)
    {
        printf("baza perepolnena.\n");
        return;
    }
    printf("Nazvanie Rasstoyanie Kol-vo reysov:"); 
    scanf("%s %f %d\n", &databd[num].name, &databd[num].distance, &databd[num].ra);
    num++; 
}
 
void delete_elem() //ГґГіГ*êöèÿ ГіГ¤Г*ëåГ*ГЁГї ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else 
    {
        num--;
        int j = 0;
        for(j = i; j<num; j++) 
            databd[j] = databd[j+1];
        printf("zapis' udalena\n");
    }
}
 
void print_elem() //ГґГіГ*êöèÿ âûâîäГ* îäГ*îãî ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void print_all() //ГґГіГ*êöèÿ âûâîäГ* ГўГ±ГҐГµ ýëåìåГ*òîâ ГЁГ§ ГЎГ*çû
{   
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void sort_bd() //ГґГіГ*êöèÿ ïóçûðüêîâîé ñîðòèðîâêè
{ 
  bd *array[max_elem];
  bd *tmp;
  int i, j;
  for (i = 0; i < num-1; i++)
  {
    for (j = i+1; j < num; j++)
    {
      if ((array[j]->distance) > (array[j + 1]->distance))
      {
        tmp = array[j];
        array[j] = array[j+1];
        array[j+1] = tmp;
      }
    }
  }
  printf("baza otsortirovana\n");
}
                            
void save_bd() //ГґГіГ*êöèÿ ñîõðГ*Г*ГїГҐГІ ГЎГ*çó Гў ГґГ*éë
{
     file = fopen("databd.txt","w"); 
     if(file == NULL)
     {
         printf("nevozmojno zapisat' v fail");
         return;
     }
     fprintf(file, "%d\n", num); 
     int i = 0;
     for(i=0; i<num; i++) 
         fprintf(file, "%s %f %d\n", databd[i].name, databd[i].distance, databd[i].ra);
     fclose(file); 
     printf("baza zapisana\n");
}
 
void load_bd() //ГґГіГ*êöèÿ ñ÷èòûâГ*Г*ГЁГї ГЎГ*çû ГЁГ§ ГґГ*éëГ*
{
     file = fopen("databd.txt","r"); 
     if(file == NULL)
     {
         printf("nevozmojno otkrit' fail");
         return;
     }
     fscanf(file, "%d\n", &num); 
     if(num >= max_elem) num = max_elem-1; 
     int i = 0;
     for(i=0; i<num; i++) 
         fscanf(file, "%s %f %d\n", &databd[i].name, &databd[i].distance, &databd[i].ra);       
     fclose(file);
     printf("baza schitana\n"); 
}
 
void run_menu() //ГґГіГ*öèÿ âûâîäГ* ìåГ*Гѕ Г°Г*áîòû Г± ГЎГ*çîé
{
    int key = 0;
    while(key != 8){ 
        printf("\n[1] dobavit' zapis'\n");
        printf("[2] udalit' zapis'\n");
        printf("[3] vivesti zapis'\n");
        printf("[4] vivesti vse zapisi\n");
        printf("[5] sortirovat' bazu\n");
        printf("[6] sohranit' bazu v fail\n");
        printf("[7] zagruzit' bazu iz faila\n");
        printf("[8] vihod\n\n");
        scanf("%d",&key); 
        switch(key){ 
            case 1:{
                 add_elem();
                 break;
            }
            case 2:{
                 delete_elem();
                 break;
            }
            case 3:{
                 print_elem();
                 break;
            }
            case 4:{
                 print_all();
                 
                 break;
            }
            case 5:{
                 sort_bd();
                 break;
            }
            case 6:{
                 save_bd();
                 break;
            }
            case 7:{
                 load_bd();
                 break;
            }
        }
    }     
}
 
int main() 
{
    prfile = fopen("prn", "w");
    run_menu(); 
    fclose(prfile);
    return 0;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 21:02 #4
В коде, по аналогии с которым вы делаете, есть такая операция я (в main()):
C++
1
2
for(i=0;i<max;i++)
b[i]=&baza[i];
В массив указателей копируются адреса элементов массива. У вас это где?
0
unskilled
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 6
01.07.2013, 21:21  [ТС] #5
Поставил, теперь жалуется на array в main()

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <stdio.h>
#include <conio.h>
 
#define max_elem 300 
 
typedef struct{ 
    char name[256]; 
    float distance; 
    int ra; 
}bd; 
    
bd databd[max_elem]; 
int num = 0; 
FILE *prfile; 
FILE *file; 
 
void add_elem() //ГґГіГ*êöèÿ äîáГ*âëåГ*ГЁГї ýëåìåГ*ГІГ* Гў ГЎГ*çó
{
    if(num>=max_elem)
    {
        printf("baza perepolnena.\n");
        return;
    }
    printf("Nazvanie Rasstoyanie Kol-vo reysov:"); 
    scanf("%s %f %d\n", &databd[num].name, &databd[num].distance, &databd[num].ra);
    num++; 
}
 
void delete_elem() //ГґГіГ*êöèÿ ГіГ¤Г*ëåГ*ГЁГї ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else 
    {
        num--;
        int j = 0;
        for(j = i; j<num; j++) 
            databd[j] = databd[j+1];
        printf("zapis' udalena\n");
    }
}
 
void print_elem() //ГґГіГ*êöèÿ âûâîäГ* îäГ*îãî ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void print_all() //ГґГіГ*êöèÿ âûâîäГ* ГўГ±ГҐГµ ýëåìåГ*òîâ ГЁГ§ ГЎГ*çû
{   
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
        fprintf(prfile, "[%d] %s %f %d\n", i, databd[i].name, databd[i].distance, databd[i].ra);
    }
}
 
void sort_bd() //ГґГіГ*êöèÿ ïóçûðüêîâîé ñîðòèðîâêè
{ 
  bd *array[max_elem];
  bd *tmp;
  int i, j;
  for (i = 0; i < num-1; i++)
  {
    for (j = i+1; j < num; j++)
    {
      if ((array[j]->distance) > (array[j + 1]->distance))
      {
        tmp = array[j];
        array[j] = array[j+1];
        array[j+1] = tmp;
      }
    }
  }
  printf("baza otsortirovana\n");
}
                            
void save_bd() //ГґГіГ*êöèÿ ñîõðГ*Г*ГїГҐГІ ГЎГ*çó Гў ГґГ*éë
{
     file = fopen("databd.txt","w"); 
     if(file == NULL)
     {
         printf("nevozmojno zapisat' v fail");
         return;
     }
     fprintf(file, "%d\n", num); 
     int i = 0;
     for(i=0; i<num; i++) 
         fprintf(file, "%s %f %d\n", databd[i].name, databd[i].distance, databd[i].ra);
     fclose(file); 
     printf("baza zapisana\n");
}
 
void load_bd() //ГґГіГ*êöèÿ ñ÷èòûâГ*Г*ГЁГї ГЎГ*çû ГЁГ§ ГґГ*éëГ*
{
     file = fopen("databd.txt","r"); 
     if(file == NULL)
     {
         printf("nevozmojno otkrit' fail");
         return;
     }
     fscanf(file, "%d\n", &num); 
     if(num >= max_elem) num = max_elem-1; 
     int i = 0;
     for(i=0; i<num; i++) 
         fscanf(file, "%s %f %d\n", &databd[i].name, &databd[i].distance, &databd[i].ra);       
     fclose(file);
     printf("baza schitana\n"); 
}
 
void run_menu() //ГґГіГ*öèÿ âûâîäГ* ìåГ*Гѕ Г°Г*áîòû Г± ГЎГ*çîé
{
    int key = 0;
    while(key != 8){ 
        printf("\n[1] dobavit' zapis'\n");
        printf("[2] udalit' zapis'\n");
        printf("[3] vivesti zapis'\n");
        printf("[4] vivesti vse zapisi\n");
        printf("[5] sortirovat' bazu\n");
        printf("[6] sohranit' bazu v fail\n");
        printf("[7] zagruzit' bazu iz faila\n");
        printf("[8] vihod\n\n");
        scanf("%d",&key); 
        switch(key){ 
            case 1:{
                 add_elem();
                 break;
            }
            case 2:{
                 delete_elem();
                 break;
            }
            case 3:{
                 print_elem();
                 break;
            }
            case 4:{
                 print_all();
                 
                 break;
            }
            case 5:{
                 sort_bd();
                 break;
            }
            case 6:{
                 save_bd();
                 break;
            }
            case 7:{
                 load_bd();
                 break;
            }
        }
    }     
}
 
int main() 
{ int i;
    for(i=0;i<max_elem;i++)
    array[i]=&databd[i];
 
    prfile = fopen("prn", "w");
    run_menu(); 
    fclose(prfile);
    return 0;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.07.2013, 21:38 #6
Цитата Сообщение от unskilled Посмотреть сообщение
теперь жалуется на array в main()
И правильно делает. Где соблюдение аналогии? Глобально объявляйте.
0
unskilled
0 / 0 / 0
Регистрация: 11.05.2013
Сообщений: 6
02.07.2013, 03:30  [ТС] #7
Ох, объявил, попробовал что-то пофиксить посредством своих кривых рук.
В итоге при сортировке творит что-то неладное с последней записью http://puu.sh/3sVSc.png

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <stdio.h>
#include <conio.h>
 
#define max_elem 300 
 
typedef struct{ 
    char name[256]; 
    int distance; 
    int ra; 
}bd; 
bd *array[max_elem];
bd databd[max_elem]; 
int num = 0; 
FILE *prfile; 
FILE *file; 
 
void add_elem() //ГґГіГ*êöèÿ äîáГ*âëåГ*ГЁГї ýëåìåГ*ГІГ* Гў ГЎГ*çó
{
    if(num>=max_elem)
    {
        printf("baza perepolnena.\n");
        return;
    }
    printf("Nazvanie Rasstoyanie Kol-vo reysov:"); 
    scanf("%s %d %d\n", &databd[num].name, &databd[num].distance, &databd[num].ra);
    num++; 
    
}
 
void delete_elem() //ГґГіГ*êöèÿ ГіГ¤Г*ëåГ*ГЁГї ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else 
    {
        num--;
        int j = 0;
        for(j = i; j<num; j++) 
            databd[j] = databd[j+1];
        printf("zapis' udalena\n");
    }
}
 
void print_elem() //ГґГіГ*êöèÿ âûâîäГ* îäГ*îãî ýëåìåГ*ГІГ* ГЁГ§ ГЎГ*çû
{
    int i = max_elem;
    printf("vvedite nomer zapisi ot 0 do %d: ", num-1);
    scanf("%d", &i);
    if(i>=num || i<0)
        printf("takoy zapisi net\n");
    else
    {
        printf("[%d] %s %d %d\n", i, array[i]->name, array[i]->distance, array[i]->ra);
        fprintf(prfile, "[%d] %s %d %d\n", i, array[i]->name, array[i]->distance, array[i]->ra);
    }
}
 
void print_all() //ГґГіГ*êöèÿ âûâîäГ* ГўГ±ГҐГµ ýëåìåГ*òîâ ГЁГ§ ГЎГ*çû
{   
    int i = 0;
    for(i = 0; i<num; i++)
    {
        printf("[%d] %s %d %d\n", i, array[i]->name, array[i]->distance, array[i]->ra);
        fprintf(prfile, "[%d] %s %d %d\n", i, array[i]->name, array[i]->distance, array[i]->ra);
    }
}
 
void sort_bd() //ГґГіГ*êöèÿ ïóçûðüêîâîé ñîðòèðîâêè
{ 
  bd *tmp;
  int i, j;
  for (i = 0; i < num-1; i++)
  {
    for (j = i+1; j < num; j++)
    {
      if ((array[j]->distance) > (array[j + 1]->distance))
      {
        tmp = array[j];
        array[j] = array[j+1];
        array[j+1] = tmp;
      }
    }
  }
  printf("baza otsortirovana\n");
}
                            
void save_bd() //ГґГіГ*êöèÿ ñîõðГ*Г*ГїГҐГІ ГЎГ*çó Гў ГґГ*éë
{
     file = fopen("databd.txt","w"); 
     if(file == NULL)
     {
         printf("nevozmojno zapisat' v fail");
         return;
     }
     fprintf(file, "%d\n", num); 
     int i = 0;
     for(i=0; i<num; i++) 
         fprintf(file, "%s %d %d\n", array[i]->name, array[i]->distance, array[i]->ra);
     fclose(file); 
     printf("baza zapisana\n");
}
 
void load_bd() //ГґГіГ*êöèÿ ñ÷èòûâГ*Г*ГЁГї ГЎГ*çû ГЁГ§ ГґГ*éëГ*
{
     file = fopen("databd.txt","r"); 
     if(file == NULL)
     {
         printf("nevozmojno otkrit' fail");
         return;
     }
     fscanf(file, "%d\n", &num); 
     if(num >= max_elem) num = max_elem-1; 
     int i = 0;
     for(i=0; i<num; i++) 
         fscanf(file, "%s %d %d\n", &array[i]->name, &array[i]->distance, &array[i]->ra);       
     fclose(file);
     printf("baza schitana\n"); 
}
 
void run_menu() //ГґГіГ*öèÿ âûâîäГ* ìåГ*Гѕ Г°Г*áîòû Г± ГЎГ*çîé
{
    int key = 0;
    while(key != 8){ 
        printf("\n[1] dobavit' zapis'\n");
        printf("[2] udalit' zapis'\n");
        printf("[3] vivesti zapis'\n");
        printf("[4] vivesti vse zapisi\n");
        printf("[5] sortirovat' bazu\n");
        printf("[6] sohranit' bazu v fail\n");
        printf("[7] zagruzit' bazu iz faila\n");
        printf("[8] vihod\n\n");
        scanf("%d",&key); 
        switch(key){ 
            case 1:{
                 add_elem();
                 break;
            }
            case 2:{
                 delete_elem();
                 break;
            }
            case 3:{
                 print_elem();
                 break;
            }
            case 4:{
                 print_all();
                 
                 break;
            }
            case 5:{
                 sort_bd();
                 break;
            }
            case 6:{
                 save_bd();
                 break;
            }
            case 7:{
                 load_bd();
                 break;
            }
        }
    }     
}
 
int main() 
{   int i;
    for(i=0;i<max_elem;i++)
    array[i]=&databd[i];
    prfile = fopen("prn", "w");
    run_menu(); 
    fclose(prfile);
    return 0;
}
0
Thinker
Эксперт С++
4227 / 2201 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.07.2013, 09:04 #8
Цитата Сообщение от unskilled Посмотреть сообщение
Есть курсовик.
Есть пузырьковая сортировка
ну не в курсовом же проекте пузырьковая сортировка, да еще и в таком виде. будете такой сортировкой большие сортировать массивы и результат будете годами ждать. можете выкладки по подсчету времени здесь найти:
Отсортировать данный массив таким образом, чтобы все нули находились в начале, а единицы - в конце массива
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 17:30 #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void sort_bd() //функция пузырьковой сортировки
{ 
  bd *tmp;
  int i, j;
  for (i = 0; i < num-1; i++)
  {
    for (j = 0; j < num - 1; j++)
    {
      if ((array[j]->distance) > (array[j + 1]->distance))
      {
        tmp = array[j];
        array[j] = array[j+1];
        array[j+1] = tmp;
      }
    }
  }
  printf("baza otsortirovana\n");
}
Добавлено через 12 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
void add_elem() //функция добавления элемента в базу
{
    if(num>=max_elem)
    {
        printf("baza perepolnena.\n");
        return;
    }
    printf("Nazvanie Rasstoyanie Kol-vo reysov:"); 
    scanf("%s%d%d", databd[num].name, &databd[num].distance, &databd[num].ra); // зачем там был \n ?
    num++; 
    
}
Добавлено через 30 минут
И ищё загадка. У меня, почему-то, файл с именем prn, после создания, не виден в папке проекта. Проверка на открытие файла проходит, а файла нет. Из-за этого в коде сбой происходит (после вывода). При любом изменении имени всё становится нормально. Может у меня какой-то глюк, но лучше дать ему какое-нибудь другое имя.
0
02.07.2013, 17:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2013, 17:30
Привет! Вот еще темы с ответами:

Пузырьковая сортировка - C++
Здравствуйте хочу разобраться в сортировках....нашла пример в книге.....но почему то она не работает....если не сложно объясните...

Пузырьковая сортировка - C++
Написал программу сортировки методом пузырька: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; int...

Пузырьковая сортировка - C++
Помогите исправить не сортирует массив.Еще должен считать кол-во шагов прохода цикла. #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Пузырьковая сортировка - C++
Хочу спросить, это пузырьковая сортировка или нет? Как её правильно реализовать? Как оценить эффективность алгоритма сортировки по числу...


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

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

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