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

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

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

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

24.11.2012, 12:11. Просмотров 708. Ответов 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++
Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с первого километра МКАД и едет со скоростью V...

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

Реализация связного списка - C++
надо решить задачу: Сведения о владельце автомобиля: фамилия, марка автомобиля (строки), номер автомобиля (целое число). По сведениям в...

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

сортировка связного списка - C++
Привет всем! пришлите пожалуйста код реализации сортировки односвязного списка (желательно с комментарием)! а то у меня совсем ничего...

Создание связного списка - C++
нужно создать связной список, что собственно уже сделал. что нужно: -функции: -root (выводит список) -push (+1 елемент в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.12.2012, 22:51 #10
а файлик можно?
tiesto94
0 / 0 / 0
Регистрация: 17.04.2012
Сообщений: 10
07.12.2012, 23:00  [ТС] #11
ну там ничего особенного просто тупо набрал))
Вложения
Тип файла: txt 1.txt (67 байт, 8 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2012, 23:00
Привет! Вот еще темы с ответами:

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

Задача про поклейку обоев: сколько нужно рулонов? - C++
школьный кабинет нужно поклеить обоями.ширина 6 м длинна 8 высота 2,8 (окна пол двери составляют 20%). ширина рулона h длинна L.сколько...

Обращение к члену связного списка - C++
Прошу помощи в решении Стоит задача обращения к члену связного списка(того списка что выводится на экран файлового менеджера),затем с...

Быстрая сортировка связного списка - C++
Здравствуйте. не пойму как должна заканчиваться функция.что передавать в рекурсию и до каких пор. Team *InsertBeforeHead(Team *&amp;head,...


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

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

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