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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Даны два целых числа: D(день) и M(месяц), определяющие правильную дату невысокосного года. Вывести значения D и M для даты, следующей за указанной. http://www.cyberforum.ru/cpp-beginners/thread304113.html
Помогите пожулайста с этой задачей
C++ Работа со структурой Приветствую Всех. Вот какая проблема у меня возникла... Есть структура вида PC RAM 4096 HDD 750 SSD 120 FLASH 4 DVD-RAM 8 NOTEBOOK RAM 2048 HDD 500 SSD 80 FLASH 2 DVD-RAM 4 NETBOOK RAM 1024 HDD 250 SSD 40 FLASH 1 DVD-RAM 2 Я ее определяю так struct computer { http://www.cyberforum.ru/cpp-beginners/thread304111.html
двумерный массив C++
Может кто-то решал или может помочь с массивом: Сформировать двумерный массив. Удалить из него строку и столбец, на пересечении которых находится максимальный элемент.
C++ Асинхронное принятие команд с клавиатуры.
Как осуществить асинхронное принятие команд с клавиатуры. Ну например чтоб при нажатие клавиши срабатывала функция. Без ожидание нажатие клавиши как в getch();
C++ Калькулятор http://www.cyberforum.ru/cpp-beginners/thread304091.html
Всем привет ) Пожалуйста подскажите почему мы пишем " scanf ("%c", &oper); scanf ("%c", &oper); " 2 строки подряд ? #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv) { double a, b; char oper, isoper;
C++ Заданы логический вектор a={a1,a2,...,An,} и вещественный вектор x={X1,X2,...,Xn}. (С++) Заданы логический вектор a={a1,a2,...,An,} и вещественный вектор x={X1,X2,...,Xn}. Преобразовать вектор х по правилу: если ai имеет значение TRUE, то Xi увеличить на 10, в противном случае изменить знак Xj на ноль. Вывести на печать полученый вектор х. Добавлено через 58 секунд Я нашёл подобную на этом форуме ....но здесь на другом языке! Если не сложно, помогите пожалуйста.. ... подробнее

Показать сообщение отдельно
B.Stroustrup
 Аватар для B.Stroustrup
0 / 0 / 0
Регистрация: 22.05.2011
Сообщений: 7
24.05.2011, 22:05     Класс "Очередь"
деструктор нафиг все удаляет, когда вызываю поиск по дате, и вылетает ошибка=(
как сделать чтоб работало?=)

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 Кб, 39 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 00:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru