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

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

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

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

24.05.2011, 22:05. Просмотров 2016. Ответов 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));
}
0
Вложения
Тип файла: rar queue.rar (4.9 Кб, 40 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 22:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Класс "Очередь" (C++):

Иерархия классов "список"-"очередь", вызов метода через класс интерфейс - C++
Есть небольшая иерархия классов, контейнер (список) для хранения объектов каждого класса, контейнер (очередь) с указателями на объект...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Добавить функцию удаления в класс "Очередь" - C++
Подскажите как реализовать функцию удаления(popQueue)? //queue.h #include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; ...

класс Lqueue, структура типа "очередь" - C++
Создать класс Lqueue - структура типа &quot;очередь&quot;, что базируется на структуре связного списка. Тип значения, хранящиеся в очереди, выбрать...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2011, 22:05
Привет! Вот еще темы с ответами:

Описать класс "двухсторонняя очередь" - C++
Элементы в очереди - одномерные динамические массивы. Если честно, совершенно не понимаю, как это написать, поэтому остановилась на таком...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Простейший класс "Очередь" - C++
Добрый вечер уважаемые друзья... Вот дошел до классов . И первую задачу я не очень понял . Помогите разжевать . Одному очень сложно. Буду...

класс "очередь параметров" - C++
вот такое задание дали...но запоминаем что сразу делаем с динамической памятью. 1. Разработать класс &quot;очередь параметров&quot; в соответствии...


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

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

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