Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для B.Stroustrup
0 / 0 / 0
Регистрация: 22.05.2011
Сообщений: 7

Класс "Очередь"

24.05.2011, 22:05. Показов 3447. Ответов 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 Кб, 49 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.05.2011, 22:05
Ответы с готовыми решениями:

Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом
Создайте класс, в котором есть ostream&amp; operator&lt;&lt;. Класс должен содержать очередь с приоритетом. Создайте генератор — заполнитель очереди...

Класс-очередь
Вечер добрый! Собственно задание: Определить и реализовать класс. Определить и реализовать операции над данными этого класса. Написать и...

класс очередь
реализовать класс очередь, написать прототипы необходимых функций-членов к нему, 2 из них реализовать полностью.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.05.2011, 22:05
Помогаю со студенческими работами здесь

Очередь и класс
Всем привет! Нужна консультация в таком вопросе. Есть класс: class myclass { char* author; char* title; public: ...

Класс + Очередь
Доброе время суток! Есть следующая задача. Имеется класс Студенты, который хранит: номер, ФИО студента, один предмет и средний бал. ...

Класс очередь
Реализуйте класс «очередь» из строк. Реализуйте методы для вставки в очередь и удаления. Породите и обработайте ошибки динамического...

Класс Очередь с приоритетом
Oчередь с приоритетами Создайте класс PriorityQueue со следующим интерфейсом конструктор по умолчанию конструирующий пустую...

Параметризованый класс - очередь
Здравствуйте всем. Я тут пытаюсь сделать задание на программированию но у меня не получается. Прошу помощи. Создать параметризованный...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru