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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
B.Stroustrup
0 / 0 / 0
Регистрация: 22.05.2011
Сообщений: 7
#1

Класс "Очередь" - C++

24.05.2011, 22:05. Просмотров 1903. Ответов 0
Метки нет (Все метки)

деструктор нафиг все удаляет, когда вызываю поиск по дате, и вылетает ошибка=(
как сделать чтоб работало?=)

Queue.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
#ifndef QUEUE_H
#define QUEUE_H
 
#include <iostream>
using namespace std;
 
#include "Lodger.h"
/* 
Реализовать очередь Queue нуждающихся в улучшении жилищных условий. Очередь содержит фамилию сотрудника, 
ведущего очередь, и дату создания. Элементом очереди является структура Lodger с полями: фамилия, 
количество членов семьи, дата постановки в очередь, занимаемая жилая площадь, необходимые жилищные условия 
(количество комнат и требуемая площадь). Реализовать операцию поиска элемента по фамилии, по дате (после заданной), 
по требуемой площади (не меньше заданной); реализовать методы постановки в очередь и удаления из очереди. 
Аргументом операции индексирования должна быть фамилия очередника. 
Реализовать операцию генерации конкретного объекта Group (группа), содержащего список очередников, из объекта типа Queue. 
Должна быть обеспечена возможность выбирать группу по любому из полей класса Queue.
*/
class Queue
{
    string family;
    Date create;
    
    Lodger *head;//указатель на первый эл-т очереди
    Lodger *tail;//указатель на хвост очереди
    
    int count;//количество эл-тов в очереди
public:
    Queue();//конструктор
    ~Queue();//деструктор
 
    Lodger find(const string&)const;//поиск по фамилии
    
    Queue find(const Date&)const;//поиск по дате (после заданной)
    Queue find(const double&)const;//поиск по требуемой площади (не меньше заданной)
    
    Queue operator+(const Lodger&);//добавление в очередь
    Queue operator-(const int&);//удаление из очереди
    
    Lodger &operator[](const string&);
    Queue &operator=(const Queue&);
 
    int getCount()
    {return count;}
 
    //friend istream& operator>>(istream&,Queue&);//ввод
    friend ostream& operator<<(ostream&,const Queue&);//вывод
 
};
 
#endif
Queue.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
#include "Queue.h"
 
Queue::Queue()
{
    head=NULL;
    tail=NULL;
    family="";
    create=Date();
    count=0;
}
Queue::~Queue()
{
    while(head)
    {
        Lodger * p=head->next;
        delete head;
        head=p;
    }
}
ostream& operator<<(ostream& os,const Queue&t)
{
    os<<"Всего элементов в очереди: "<<t.count<<endl;
    os<<"=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//\n";
    Lodger *p=t.head;
    for(int i=0; i<t.count; i++)
    {
        os<<"Очередник №"<<i+1<<"\n\n";
        os<<"Фамилия: "<<p->family<<endl;
        os<<"Количество членов семьи: "<<p->number<<endl;
        os<<"Дата постановки в очередь: "<<p->insert<<endl;
        os<<"Занимаемая площадь: "<<p->sq<<endl;
        os<<"Требуемая площадь: "<<p->newSq<<endl;
        os<<"Требуемое кол-во комнат: "<<p->numRooms<<endl;
        os<<"=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//=//\n";
        p=p->next;
    }
    return os;
}
Queue Queue::operator+(const Lodger& t)
{
    count++;//прибавление счетчика эл-тов
    Queue *temp=new Queue(*this);
    if(!temp->head)
    {
        temp->tail=temp->head=new Lodger(t);//первый эл-т и голова, и хвост
        temp->family=temp->head->family;//фамилия первого очередника
        temp->create=temp->head->insert;//дата создания очереди
        return *temp;
    }
    temp->tail->next=new Lodger(t);
    temp->tail=temp->tail->next;
    return *temp;
}
Queue &Queue::operator=(const Queue& t)
{
    if(this != &t)
    {   
        Lodger *temp=t.head;
        this->tail=this->head= new Lodger(*temp);
        temp=temp->next;
        while (temp)
        {
            this->tail->next=new Lodger(*temp);
            this->tail=this->tail->next;
            temp=temp->next;
        }
        delete temp;
        count=t.count;
        family=t.family;
        create=t.create;
    }
    return *this;
}
Queue Queue::operator-(const int& num)
{
    if(!head)//если очередь пуста
        throw "Очередь пуста!";
    if(num>count)
        throw "Столько элементов в очереди нет!";
    
    for(int i=0; i<num; i++,count--)
    {
        Lodger * p=head->next;;
        delete head;
        head=p;
    }
    return *this;
}
Lodger Queue::find(const string& fio)const
{
    Lodger *p=head;
    for(int i=0; i<count && p->family!=fio; i++)
        p=p->next;      
    
    if(!p)
        throw "Такой фамилии очередника нет!";
        
    return *p;
}
//поиск по дате (после заданной)
Queue Queue::find(const Date& date)const
{
    if(tail->insert<date)
        throw "Заданная дата слишком большая!";
 
    Queue temp;
    Lodger *p=head;
    while(p->insert<date)
    {
        temp=temp+(*p);
        p=p->next;
    }
    return temp;
}
//поиск по требуемой площади (не меньше заданной)
Queue Queue::find(const double& square)const
{
    if(square<=0)
        throw "Ошибка!";
    
    Queue temp;
    Lodger *p=head;
    for(int i=0; i<count; i++, p=p->next)
        if(p->sq>=square)
            temp=temp+(*p);
    return temp;
}
/*
Lodger &Queue::operator[](const string& fio)
{}
*/
main.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
//лаба 24 - вар. 12
#include <iostream>
using namespace std;
 
#include "Queue.h"
 
int main()
{
    setlocale(0,"");
    try
    {
        Queue t;
        Lodger e1("e1",1,Date(1,1,1),2,3,4),e2("e2",2,Date(2,2,2),3,4,5),
            e3("e3",3,Date(3,3,3),3,4,5);
        t=t+e1;
        t=t+e2;
        t=t+e3;
    
        cout<<t<<endl;
        cout<<"Поиск фамили е3: \n";
        cout<<t.find("e3")<<endl;
        cout<<"Поиск по дате 2/2/2: \n";
        cout<<t.find(Date(2,2,2))<<endl;
    }
    catch(char *s)
    {
        cout<<s<<endl;
    }
    system("pause");
    return 0;
}
вспомогательные классы
их вроде тестил и нареканий никаких не было=) посмотрите только класс Queue
Lodger.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
#ifndef Lodger_H
#define Lodger_H
 
#include<iostream>
#include<string>
using namespace std;
 
#include "Date.h"
 
struct Lodger
{
    string family;//фамилия
    int number;//количество членов семьи
    Date insert;//дата постановки в очередь
    double sq;//занимаема площадь
    //необходимые жил.условия
    double newSq;//требуемая площадь
    int numRooms;//количесво комнат
 
    Lodger *next;//указаель на следующий
 
    Lodger();//конструктор без аргументов
    Lodger(string,int,Date,double,double,int);//конструктор с аргументами
    Lodger(const Lodger&);//конструктор инициализации
 
    friend istream& operator>>(istream&,Lodger&);//ввод
    friend ostream& operator<<(ostream&,const Lodger&);//вывод
};
#endif
lodger.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
#include "Lodger.h"
 
Lodger::Lodger()
{
    family="";//фамилия
    number=0;//количество членов семьи
    insert=Date();//дата постановки в очередь
    sq=0;//занимаема площадь
    //необходимые жил.условия
    newSq=0;//требуемая площадь
    numRooms=0;//количесво комнат
    next=0;
}
Lodger::Lodger(string fio,int num,Date ins,double S,double nS,int numR)
{
    family=fio;//фамилия
    if(num<=0)
        throw "Количество членов семьи должно быть положительным числом!";
    number=num;//количество членов семьи
    insert=ins;//дата постановки в очередь
    if(S<=0)
        throw "Занимаемая площадь должна быть положительным числом!";
    sq=S;//занимаема площадь
    //необходимые жил.условия
    if(nS<S)
        throw "Требуемая площадь не должна быть меньше занимаемой!";
    if(nS<=0)
        throw "Требуемая площадь должна быть положительным числом!";
    newSq=nS;//требуемая площадь
    if(numR<=0)
        throw "Количество комнат должно быть положительным числом!";
    numRooms=numR;//количесво комнат
 
    next=0;
}
Lodger::Lodger(const Lodger& t)
{
    family=t.family;//фамилия
    number=t.number;//количество членов семьи
    insert=t.insert;//дата постановки в очередь
    sq=t.sq;//занимаема площадь
    //необходимые жил.условия
    newSq=t.newSq;//требуемая площадь
    numRooms=t.numRooms;//количесво комнат
    next=t.next;
}
istream& operator>>(istream& is,Lodger& t)
{
    string fio;
    int num;
    Date ins;
    double S;
    double nS;
    int numR;
 
    cout<<"Введите фамилию: ";
    is>>fio;
    cout<<"Введите количество членов семьи: ";
    is>>num;
    cout<<"\nЗадайте дату постановки в очередь!\n";
    is>>ins;
    cout<<"\nВведите занимаемую площадь (m^2): ";
    is>>S;
    cout<<"Введите требуемую площадь (m^2): ";
    is>>nS;
    cout<<"Введите требуемое количество комнат: ";
    is>>numR;
    t=Lodger(fio,num,ins,S,nS,numR);
    return is;
}
ostream& operator<<(ostream& os,const Lodger& t)
{
    os<<"Фамилия: "<<t.family<<endl;
    os<<"Кол-во членов семьи: "<<t.number<<endl;
    os<<"Дата постановки в очередь: "<<t.insert<<endl;
    os<<"Занимаемая площадь: "<<t.sq<<" m^2"<<endl;
    os<<"Требуемая площадь: "<<t.newSq<<" m^2"<<endl;
    os<<"Требуемое кол-во комнат: "<<t.numRooms<<endl;
    return os;
}
date.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
#ifndef DATE_H
#define DATE_H
 
#include <iostream>
#include <string>
using namespace std;
 
class Date
{
    int year, month, day;
 
public:
    Date(int=1, int=1, int=1900);//контруктор по умолчанию
    Date operator+(int);//прибавление дней к дате
    Date operator++();//прибавление 1 дня, 1 месяца и 1 года к дате
    Date operator++(int);//прибавление 1 дня, 1 месяца и 1 года к дате
    string toString()const;//получение даты строкой
    
    //сравнение дат
    bool operator>(const Date&)const;
    bool operator>=(const Date&)const;
    bool operator<(const Date&)const;
    bool operator<=(const Date&)const;
    bool operator==(const Date&)const;
    bool operator!=(const Date&)const;
 
    friend istream &operator>>(istream&,Date&);
    friend ostream &operator<<(ostream&,const Date&);
    
    int getDay()
    {return day;}
    int getMonth()
    {return month;}
    int getYear()
    {return year;}
};
#endif
date.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
#include "Date.h"
 
static const int daysPerMonth[13]=
    {0,31,28,31,30,31,30,31,31,30,31,30,31};//без учета високосного года
 
Date::Date(int dy, int mn, int yr)
{
    year=yr;
    month=mn;
    day=dy;
    if(year<=0||month<=0||day<=0)
        throw "Числа должны быть положительные";
    while(month>12)
    {
        month-=12;
        year++;
    }
    while(day<0 || day>daysPerMonth[month])
    {
        day-=daysPerMonth[month];
        month--;
        if(month<1)
        {
            year++;
            month=12;
        }
    }
}
Date Date::operator+(int n)
{
    year+=n;
    month+=n;
    day+=n;
    while(month>12)
    {
        month-=12;
        year++;
    }
    while(day<0 || day>daysPerMonth[month])
    {
        day-=daysPerMonth[month];
        month--;
        if(month<1)
        {
            year++;
            month=12;
        }
    }
    return Date(day,month,year);
}
Date Date::operator++(int)
{
    return ++(*this);
}
Date Date::operator++()
{
    year++;
    month++;
    day++;
    while(month>12)
    {
        month-=12;
        year++;
    }
    while(day<0 || day>daysPerMonth[month])
    {
        day-=daysPerMonth[month];
        month--;
        if(month<1)
        {
            year++;
            month=12;
        }
    }
    return Date(day,month,year);
}
string Date::toString()const
{
    string str;
    str.push_back(day+'0');
    str.push_back('/');
    str.push_back(month+'0');
    str.push_back('/');
    str.push_back(year+'0');
    return str;
}
istream &operator>>(istream& is,Date& T)
{
    int a,b,c;
    cout<<"Введите день, месяц, год (через пробел):";
    is>>a>>b>>c;
    T=Date(a,b,c);
    return is;
}
ostream &operator<<(ostream& os,const Date& T)
{   
    os<<T.day<<"/"<<T.month<<"/"<<T.year;
    return os;
}
bool Date::operator==(const Date& t)const
{
    return ((year==t.year) && (month==t.month) && 
        (day==t.day));
}
bool Date::operator!=(const Date& t)const
{
    return ((year!=t.year) || (month!=t.month) ||
        (day!=t.day));
}
 
bool Date::operator>(const Date& t)const
{
    if(year>t.year) return true;
    else if(year==t.year && month>t.month) return true;
    else if(year==t.year && month==t.month && day>t.day) return true;
    else return false;
}
 
bool Date::operator<(const Date& t)const
{
    return (!(*this>t)&&(*this!=t));
}
bool Date::operator>=(const Date& t)const
{
    return ((*this>t)||(*this==t));
}
bool Date::operator<=(const Date& t)const
{
    return ((*this<t)||(*this==t));
}
Вложения
Тип файла: rar queue.rar (4.9 Кб, 40 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 22:05     Класс "Очередь"
Посмотрите здесь:

C++ класс "очередь параметров"
класс Lqueue, структура типа "очередь" C++
C++ Описать класс "двухсторонняя очередь"
C++ Иерархия классов "список"-"очередь", вызов метода через класс интерфейс
Шаблоны. Класс "Очередь" C++
Создать класс "Шар", заданный радиусом, и определить производный класс "Окружность" C++
C++ Создать базовый класс "Массив" и класс-наследник "Матрица"
C++ Создать класс "Кот" с полями "Возраст" и "Вес"
C++ Простейший класс "Очередь"
Реализовать класс "Очередь" C++
C++ Базовый класс "Источник напряжения", производные классы "Цепь" и "Аккумулятор"
C++ Создать иерархию классов: родительский класс "Транспорт", класс-потомок "Техосмотр транспорта"

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

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

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