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

Покритикуйте код - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ правильно записать выражения арифметические http://www.cyberforum.ru/cpp-beginners/thread359628.html
суть задания по фортрану и си записать выражения и посчитать их..я записала но результаты выходят разные.. помогите пожалуйста записать правильно задание моя запись на фортран Код:
C++ исправить функцию нахождения гласных букв в массиве Помогите,пожалуйста, исправить функцию, которая суммирует вероятности нахождения букв в строке(строка массив типа char,слова разделены пробелами). Если хотя бы в одном слове нет гласных букв,то... http://www.cyberforum.ru/cpp-beginners/thread359623.html
C++ Найти все простые числа на отрезке [a,b].
Изучаем C++ месяц. Сейчас сидим на циклах. Условие задачи, собственно, и есть название темы. К сожалению, справиться с ней у меня не получается. Нашел только в гугле программу которая выводит простые...
ln - ряд Тейлора C++
double ln(double x, double eps) { double T,S; int K; T=x; K=1; S=T; do{ K=K+1; T=-T*x/K; S=S+T;
C++ printf и scanf против cin и cout http://www.cyberforum.ru/cpp-beginners/thread359575.html
Друзья мои,стал учить плюсы и столкнулся с кучей противоречий. То что в С нет cin/cout я знаю. Но вот в С++ возможно использование printf/scanf. Объясните мне разницу этих операторов. Из того,что я...
C++ Помогите с макросом нужно написать макрос(если это возможно) сейчас у меня код выглядит так: std::cin<<a<<b<<c; а после обработки должно выглядить так if(read)std::cout<<a<<b<<c; write(a);write(b);write(с); ... подробнее

Показать сообщение отдельно
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
06.10.2011, 02:25  [ТС]
Пока переделывал класс под новые нужды определил что сортировка моя шалит временами, не завалялась ли у кого нормально работающая сортировка односвязного списка?
Операции сравнения элементов перегружены уже, нужна лишь сортировка ...

Добавлено через 36 минут
Хотя это я использовал немного не ту перегрузку (< вместо <=) при сравнении в сортировке, так вроде работает всё же. Критикуйте вновь, хотя изменений не много)

Students.h
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
#ifndef STUDENTS_H
#define STUDENTS_H
 
#include <string>
using std::string;
 
#include <iostream>
using std::cout;
using std::cerr;
using std::ostream;
using std::istream;
 
#include <iomanip>
using std::setw;
using std::left;
using std::right;
 
#include <stdexcept>
using std::out_of_range;
 
 
class CStudent
{
    friend ostream &operator<<(ostream& os,const CStudent& stud);
    friend istream &operator>>(istream& is,CStudent& stud);
public:
    string fname;
    string sname;
    string tname;
    string group;
    int year;
    float average;
    CStudent(string ="",string ="",string ="",string ="",int =0,float =0);
    CStudent& operator=(const CStudent &_v);
 
    //сравнивание на основании фамилии (sname)
    bool operator==(const CStudent &right) const;
    bool operator!=(const CStudent &right) const;
    bool operator>(const CStudent &right) const;
    bool operator>=(const CStudent &right) const;
    bool operator<(const CStudent &right) const;
    bool operator<=(const CStudent &right) const;
 
private:
    void swap(CStudent &_v);
};
 
 
class Students
{
    struct ListItem
    {
        CStudent student;
        ListItem *Next;
        ListItem(const CStudent& first,ListItem *next=0){student=first;Next=next;};
    };
 
    ListItem *Head;
    ListItem *Tail;
 
public:
 
    class iterator
    {
       ListItem* current;
       public:
 
        iterator() {current=0;}
        iterator(ListItem* right){*this=right;}
        iterator& operator=(ListItem* right);
 
        iterator& operator++();
        iterator operator++(int);
        bool operator==(const iterator& right) const;
        bool operator!=(const iterator& right) const;
        CStudent& operator*(){return current->student;}
        operator bool(){return current!=0;}
    };
 
    Students(): Head(0), Tail(0){}
    Students(const CStudent& stud);
    ~Students(){this->deleteAll();}
 
 
    void addToTail(const CStudent&);
    void addToHead(const CStudent&);
 
 
    bool deleteFromHead();
    bool deleteFromTail();
    void deleteAll();
 
    void sort();
    iterator findElement(CStudent &what); //поиск по всему списку
    iterator findElement(CStudent &what, Students::iterator begin, Students::iterator end);//поиск с границами
    bool findAndDestroy(const CStudent& stud);
 
 
    iterator begin(){return Head;}
    iterator end(){return iterator(0);}
};
 
 
#endif
Students.cpp
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#include "Students.h"
 
//////////////////////CStudent/////////////////
 
CStudent::CStudent(string f,string s,string t,string gr,int y,float aver)
{
    fname=f;
    sname=s;
    tname=t;
    group=gr;
    average=(aver>=0 && aver<=100 ? aver : -1);
    year=(y>=1950 && y<=2012 ? y : -1);
}
 
void CStudent::swap(CStudent &_v)
{
    std::swap(fname,_v.fname);
    std::swap(sname,_v.sname);
    std::swap(tname,_v.tname);
    std::swap (group,_v.group);
    std::swap(year,_v.year);
    std::swap(average,_v.average);
}
 
CStudent& CStudent::operator=(const CStudent &_v)
{
    if(this != &_v)
     CStudent(_v).swap(*this);
    return *this;
}
 
bool CStudent::operator==(const CStudent &right) const
{
    return (sname==right.sname);
 
}
 
bool CStudent::operator!=(const CStudent &right) const
{
    return (sname.compare(right.sname)==0);
 
}
 
bool CStudent::operator>(const CStudent &right) const
{
    return (sname.compare(right.sname)>0);
}
 
bool CStudent::operator>=(const CStudent &right) const
{
    return (sname.compare(right.sname)>=0);
}
 
bool CStudent::operator<(const CStudent &right) const
{
    return (sname.compare(right.sname)<0);
}
 
bool CStudent::operator<=(const CStudent &right) const
{
    return (sname.compare(right.sname)<=0);
}
 
ostream& operator<<(ostream& os,const CStudent& stud)
{
    os<<setw(8)<<left<<stud.fname
     <<setw(10)<<left<<stud.sname
     <<setw(12)<<left<<stud.tname
     <<setw(7)<<stud.group
     <<setw(5)<<stud.year
     <<setw(7)<<stud.average<<"\n";
 
     return os;
}
 
istream &operator>>(istream& is,CStudent& stud)
{
    is>>stud.fname>>stud.sname>>stud.tname
     >>stud.group>>stud.year>>stud.average;
    return is;
}
 
 
 
 
 
 
/////////////////////////Students///////////////////////////
 
Students::Students(const CStudent& stud)
{
    Head=Tail=new ListItem{stud, 0};
}
 
void Students::addToTail(const CStudent& right)
{
    if (Tail)
    {
        Tail->Next=new ListItem(right,0);
        Tail=Tail->Next;
    }
    else
     Head=Tail=new ListItem(right,0);
}
 
 
void Students::addToHead(const CStudent& right)
{
    if (Head)
    {
        ListItem* temp=Head;
        Head=new ListItem(right,temp);
        Head->Next=temp;
    }
    else
        Head=Tail=new ListItem(right,0);
}
 
bool Students::deleteFromHead()
{
    if(!Head) //удалять нечего
     return false;
 
    else if(!(Head->Next))//только один элемент
    {
        delete Head;
        Head=Tail=NULL;
        return true;
    }
 
    ListItem *temp=Head;
    Head=Head->Next;
    delete temp;
    return true;
}
 
bool Students::deleteFromTail()
{
    if(!Tail)//удалять нечего
     return false;
 
    else if(Tail==Head)//только один элемент
    {
        delete Tail;
        Head=Tail=NULL;
        return true;
    }
    ListItem *temp=Head;
    while(temp->Next!=Tail)//найти новый хвост
     temp=temp->Next;
 
    ListItem *toDelete=Tail;
    Tail=temp;
    temp->Next=0;
    delete toDelete;
    return true;
}
 
 
void Students::deleteAll() // освободить память
{
    ListItem* temp;
    while(Head)
    {
        temp=Head;
        Head=Head->Next;
        delete temp;
    }
    Tail=Head; //Head=NULL
}
 
void Students:: sort()
{
    ListItem* new_begin=NULL;
    ListItem* new_end=NULL;
    ListItem* sprev=NULL;
 
    for(ListItem *scur=this->Head;scur!=NULL;scur=this->Head)
    {
        ListItem *smin=NULL;
        ListItem *sminprev=scur;
        CStudent min_elem=scur->student;
        for(ListItem *gp=scur->Next;gp!=NULL;gp=gp->Next)
        {
            if((gp->student)<=min_elem)
            {
                min_elem=gp->student;
                smin=gp;
                sprev=sminprev;
            }
            sminprev=gp;
        }
        if(smin==NULL)
        {
            smin=scur;
        }
        else if(smin==scur->Next)
        {
            scur->Next=scur->Next->Next;
        }
        else
        {
            sprev->Next=smin->Next;
        }
        if(new_begin!=NULL)
        {
            new_end->Next=smin;
            new_end=smin;
        }
        else
        {
            new_begin=smin;
            new_end=smin;
        }
        if(smin==this->Head)
         this->Head=smin->Next;
    }
    this->Head=new_begin;
    this->Tail=new_end;
 
}
 
bool Students::findAndDestroy(const CStudent& stud)
{
    if(!Head)
     return false;
 
    ListItem *temp=Head;
    if(temp->student==stud) //если это первый элемент
    {
        this->deleteFromHead();
        return true;
    }
    ListItem* beforeTemp=temp;
    temp=temp->Next;
 
    while(temp)
    {
        if((temp->student==stud))
        {
             beforeTemp->Next=temp->Next;
             delete temp;
             return true;
        }
 
        beforeTemp=temp;
        temp=temp->Next;
    }
 
    return false;//такого элемента нет в списке
}
 
Students::iterator Students::findElement(CStudent &what, Students::iterator begin, Students::iterator end)
{
    for(;begin!=end;++begin)
    {
        if ((*begin)==what)
         return begin;
    }
    //если ничего не найдено - вернуть итератор указывающий за конец списка (на NULL)
    return 0;
}
 
Students::iterator Students::findElement(CStudent &what)
{
    return (this->findElement(what,this->begin(),this->end()));
}
 
 
 
 
 
 
 
 
 
//////////////////////ITERATOR/////////////////
Students::iterator& Students::iterator::operator++()
{
    if(*this)
     current=current->Next;
     return *this;
}
 
Students::iterator Students::iterator::operator++(int) //конструктор копирования или del
{
    if(!(*this))
     return NULL;
     iterator temp(*this);
    current=current->Next;
     return temp;
}
 
bool Students::iterator::operator==(const iterator& right) const
{
    return (current==right.current);
}
 
bool Students::iterator::operator!=(const iterator& right) const
{
    return !(*this==right);
}
 
Students::iterator& Students::iterator::operator=(ListItem* right)
{
    current=right;
    return *this;
}
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
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::string;
#include <windows.h>
#include <string>
#include "Students.h"
#include "algorithm"
using std::for_each;
 
 
void print(CStudent& stud)
{
    cout<<setw(8)<<left<<stud.fname
     <<setw(10)<<left<<stud.sname
     <<setw(12)<<left<<stud.tname
     <<setw(7)<<stud.group
     <<setw(5)<<stud.year
     <<setw(7)<<stud.average<<"\n";
 
};
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    CStudent i("Иван","Иванов","Иванович","КС-09",1990,100);
    CStudent p("Петр","Петров","Петрович","КС-09",1991,99);
    CStudent s("Василий","Васильев","Васильевич","КС-09",1990,100);
    CStudent y("Ярослав","Ярый","Ярославович","КС-09",1990,100);
    Students test;
 
    test.addToTail(p);
    test.addToHead(i);
    test.addToHead(s);
    test.addToHead(y);
//    test.findAndDestroy(i);
//    Students::iterator it=test.findElement(p);
//    cout<<*it;
    test.sort();
    Students::iterator it=test.begin();
 
    while(it)
     cout<<(*it++);
}
Собственно функция поиска и удаления указанного элемента это по просьбе препода добавлена. Ещё единственное что я не знаю сделал ли я правильно это то что конструктор у итератора принимает ListItem*, препод что-то говорил что-то в стиле " а вдруг пользователь подсунет ноль, а его можно привести ведь к любому типу вот что тогда?" хотя я не понял в чём там опасность (ну вызовется конструктор и присвоит указателю current адрес ноля после чего ничего страшного итератор давать делать с ним не будет), тем не менее правильно ли я сделал?
Исключения убраны по просьбе преподавателя.
P.S А как делать спойлеры здесь на форуме, ато такая стена кода получилась

Добавлено через 2 минуты
Баллы также хранятся в float по просьбе преподавателя.

Добавлено через 15 минут
Учитывая что править я код не могу замечу что мне пришлось всё же добавить исключение на случай если идёт попытка разименования итератора ссылающегося на нуль так как здесь уже кроме исключения больше ничего и не сделаешь.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru