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

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

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

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

24.11.2012, 12:11. Просмотров 700. Ответов 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
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Person
{
Person* CurrPer;
char name[20], secname[20], fname[20];
int numgr;
double score;
Person* next;
Person* prev;
 
};
class Group
{
int i,j,n;
public:
Person* Input(Person* CurrPer);
void Output(Person* CurrPer);
Person SortName(Person* CurrPer);
Person* first, tmp;
 
 
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Rus");
Person* CurrPer=new Person; //выделили память под 1й элемент
Group Gruppa;
CurrPer=Gruppa.Input(CurrPer);
Gruppa.SortName(CurrPer);
Gruppa.Output(CurrPer);
return 0;
}
 
Person* Group::Input(Person* CurrPer)
{
 
 
Person* first=CurrPer; //отдельно сохранили адрес первого элемента, чтобы иметь возможность к нему обращаться
CurrPer->prev=0; //показываем, что это первый элемент, и перед ним больше нет элементов
int n=0;
ifstream in ("1.txt"); //открыли файл на считывание
in>>CurrPer->name>>CurrPer->secname>>CurrPer->fname>>CurrPer->numgr>>CurrPer->score; //считали информацию о первом студенте
while(!in.eof()) //пока не достигнут конец файла
{
CurrPer->next=new Person; //выделили память под i-й элемент типа person и сохранили его адрес в i-1 элементе
CurrPer->next->prev=CurrPer; //в i-й элемент в переменную prev записали адрес i-1 элемента
CurrPer=CurrPer->next; //перешли от i-1 элемента к i-му
 
in>>CurrPer->name>>CurrPer->secname>>CurrPer->fname>>CurrPer->numgr>>CurrPer->score; //считали информацию о i-м студенте
n++; //считаем количество элементов
}
CurrPer->next=0; //у последнего элемента сделали указатель на следующий - 0, чтобы было понятно, что это конец списка
in.close();
return CurrPer;
};
 
void Group::Output(Person* CurrPer)
{
ofstream output("2.txt");
if(!CurrPer)
cout<<"\nВ списке отсутствуют элементы";
else
while(CurrPer)
{
output<<CurrPer->name<<"\t"<<CurrPer->secname<<"\t"<<CurrPer->fname<<"\t"<<CurrPer->numgr<<"\t"<<CurrPer->score<<"\t"<<endl;
CurrPer=CurrPer->next;
}
};
 
Person Group::SortName(Person* CurrPer)
{
 
for(i=0;i<n;i++)
{
CurrPer=first;
for(j=0;j<n-i-1;j++)
{
if(strcmp(CurrPer->name,CurrPer->next->name)==1)
{
 
tmp=*CurrPer;
strcpy_s(CurrPer->name,CurrPer->next->name);
strcpy_s(CurrPer->secname,CurrPer->next->secname);
strcpy_s(CurrPer->fname,CurrPer->next->fname);
CurrPer->numgr=CurrPer->next->numgr;
CurrPer->score=CurrPer->next->score;
 
 
CurrPer=CurrPer->next;
 
strcpy_s(CurrPer->name,tmp.name);
strcpy_s(CurrPer->secname,tmp.secname);
strcpy_s(CurrPer->fname,tmp.name);
CurrPer->numgr=tmp.numgr;
CurrPer->score=tmp.score;
 
}
else CurrPer=CurrPer->next;
}
}
cout<<first;
return *first;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2012, 12:11     Задача про сортировку с использованием связного списка, нужно найти ошибку
Посмотрите здесь:
Найти ошибку в задаче на файловый ввод/вывод (задача про МКАД) C++
нужно найти ошибку..задача на строки. C++
C++ Реализация связного списка
Сортировка связного списка C++
C++ сортировка связного списка
C++ Реализация связного списка
C++ Задача про поклейку обоев: сколько нужно рулонов?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
24.11.2012, 12:33     Задача про сортировку с использованием связного списка, нужно найти ошибку #2
а тебя не учили, что при сортировке связанного списка НЕ НАДО копировать данные из элемента в элемент?
НАДО лишь менять местами указатели так, чтоб последовательность изменилась

было el1-->el2-->el3-->el4

..................|----------v
стало el1...el2<--el3 ...el4
...........|________^

Ты хоть понимаешь, что strcpy копирует строки посимвольно в цикле? Я б за такую сортировку списка на второй год оставлял бы в школе.
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
24.11.2012, 12:37  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #3
Учить некому))) что надо изменить в коде???
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
24.11.2012, 13:17     Задача про сортировку с использованием связного списка, нужно найти ошибку #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
 /*ÈçìåГ*ГЁГІГј? Ñëåäóåò âîîáùå îòêГ*Г§Г*ГІГјГ±Гї îò êîïèðîâГ*Г*ГЁГї ñòðîê, ГЁ Г°Г*áîòГ*ГІГј òîëüêî Г± ГіГЄГ*Г§Г*òåëÿìè Г*Г* ñòðóêòóðû.
ГіГЄГ*Г§Г*òåëè æå ïðîùå!
Åñëè ГЎГ» ГЅГІГ® áûë ñïèñîê ñòðóêòóð Г°Г*çìåðîì Гў ГЇГ*ðó ГЎГ*éò, áûë ГЎГ» ГҐГ№Вё ñìûñë.
 ГЌГ® ГІГіГІ Г±Г*ìî Г§Г*Г¤Г*Г*ГЁГҐ Г*Г*ìåêГ*ГҐГІ, Г·ГІГ® Г*Г*äî ГІГҐГЎГҐ ГіГ·ГЁГІГјГ±Гї ïåðåñòГ*âëÿòü ГіГЄГ*Г§Г*òåëè Гў Г±ГЇГЁГ±ГЄГҐ Г*Г* ýòîì ïðèìåðå.
*/
Person Group::SortName()
{
       bool sorted=false;
       Person* current;
       Person* tmp;
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->name,current->next->name)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
 
}
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
06.12.2012, 15:18  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #5
вот полная задача, помоги решить ааа!!! не компилируется она у меняяя... в универе не учат,сам разобраться не как не могу, вся надежда на тебя!!

Имеется файл, состоящий из данных о студентах (фамилия, имя, номер группы, средний балл).
Построить сортированный список студентов. Сортировка задается по одному из параметров.

2.1
Реализовать данные в виде массива структур. Применить быструю сортировку (по среднему
баллу).

2.2

Реализовать те же данные в виде списка (дополнительные баллы).

Добавлено через 23 минуты
Kuzia domovenok, помоги!!
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 19:37  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #6
Kuzia domovenok, почему в твоей функции сортировки меняются местами current->prev и current->next??
C++
1
2
3
4
5
6
7
if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
чет ваще не врубаюсь))
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
07.12.2012, 20:35     Задача про сортировку с использованием связного списка, нужно найти ошибку #7
меняются местами только бывшие current и current->next
в сообщении 2 нарисовано как
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 20:48  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #8
Kuzia domovenok,
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "stdafx.h"
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct Person
{
Person* CurrPer;
char name[20], secname[20], fname[20];
int numgr;
double score;
Person* next;
Person* prev;
 
};
class Group
{
 
public:
    int i,j,n;
Person* Input(Person* current);
void Output(Person* current);
Person* SortName(Person* current);
Person* SortSecName(Person* current);
Person* SortFName(Person* current);
Person* SortNumGroup(Person* current);
Person* SortScore(Person* current);
Person* first, tmp;
 
 
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Rus");
int Num;
Person* CurrPer=new Person; //выделили память под 1й элемент
Group Gruppa;
CurrPer=Gruppa.Input(CurrPer);
//cout<<CurrPer->name<<" "<<CurrPer->secname<<" "<<CurrPer->fname<<" "<<CurrPer->numgr<<" "<<CurrPer->score<<endl;
cout<<"1 - сортировка по имени"<<endl<<"2 - сортировка по фамилии"<<endl<<"3 - сортировка по отчеству"<<endl<<"4 - сортировка по номеру группы"<<endl<<"5 - сортировка по среднему баллу"<<endl;
cin>>Num;
if(Num==1) Gruppa.SortName(CurrPer);
 
if(Num==2) Gruppa.SortSecName(CurrPer);
 
if(Num==3) Gruppa.SortFName(CurrPer);
 
if(Num==4) Gruppa.SortNumGroup(CurrPer);
//
//if(Num==5) Gruppa.SortScore(CurrPer);
 
Gruppa.Output(CurrPer);
return 0;
}
 
Person* Group::Input(Person* current)
{
Person* first=current; //отдельно сохранили адрес первого элемента, чтобы иметь возможность к нему обращаться
current->prev=0; //показываем, что это первый элемент, и перед ним больше нет элементов
int n=0;
ifstream in ("1.txt"); //открыли файл на считывание
in>>current->name>>current->secname>>current->fname>>current->numgr>>current->score;//считали информацию о первом студенте
n=1;
while(!in.eof()) //пока не достигнут конец файла
{
current->next=new Person; //выделили память под i-й элемент типа person и сохранили его адрес в i-1 элементе
current->next->prev=current; //в i-й элемент в переменную prev записали адрес i-1 элемента
current=current->next; //перешли от i-1 элемента к i-му
in>>current->name>>current->secname>>current->fname>>current->numgr>>current->score;//считали информацию о i-м студенте
 
n++; //считаем количество элементов
}
current->next=0;//у последнего элемента сделали указатель на следующий - 0, чтобы было понятно, что это конец списка
current=first;
while(current) {
    cout<<"#"<<n<<"\t"<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
    current=current->next;
}
in.close();
return current;
};
 
void Group::Output(Person* current)
{
ofstream output("2.txt");
if(!current)
cout<<"\nВ списке отсутствуют элементы";
else
while(current)
{
output<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
 
current=current->next;
}
};
 
Person* Group::SortName(Person* current)
{
      
    bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->name,current->next->name)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
ofstream output("2.txt");
while(current)
{
    cout<<current->name<<"\t"<<current->secname<<"\t"<<current->fname<<"\t"<<current->numgr<<"\t"<<current->score<<"\t"<<endl;
    current=current->next;
}
return current;
}
Person* Group::SortSecName(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->secname,current->next->secname)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
Person* Group::SortFName(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(strcmp(current->fname,current->next->fname)>0){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
Person* Group::SortNumGroup(Person* current)
{
       bool sorted=false;
      /* Person* current;*/
       /*Person* tmp;*/
       while (!sorted){
             sorted=true;
             current=first;
             while(current->next){
                   if(current->numgr>=current->next->numgr){
                         sorted=false;
                         //deleting Current
                         if (current->prev) current->prev->next=current->next;
                                                    current->next->prev=current->prev;
                         //inserting Current after current->next;
                                                   current->prev=current->next;
                                                   current->next=current->prev->next;
                                                   current->next->prev=current;
                                                   current->prev->next=current;
                   }
                   else
                        current=current->next;
             }
     }
return current;
}
вот прога не робит
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 20:49  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #9
вот это вылезает
Миниатюры
Задача про сортировку с использованием связного списка, нужно найти ошибку  
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
07.12.2012, 22:51     Задача про сортировку с использованием связного списка, нужно найти ошибку #10
а файлик можно?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 23:00     Задача про сортировку с использованием связного списка, нужно найти ошибку
Еще ссылки по теме:
Быстрая сортировка связного списка C++
C++ Доступ к элементам связного списка
C++ Ошибка в реализации связного списка
Ошибка в Классе связного списка C++
Обращение к члену связного списка C++

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

Или воспользуйтесь поиском по форуму:
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 23:00  [ТС]     Задача про сортировку с использованием связного списка, нужно найти ошибку #11
ну там ничего особенного просто тупо набрал))
Вложения
Тип файла: txt 1.txt (67 байт, 8 просмотров)
Yandex
Объявления
07.12.2012, 23:00     Задача про сортировку с использованием связного списка, нужно найти ошибку
Ответ Создать тему
Опции темы

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