Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15

Class stack в объектно ориентированном программировании

09.04.2020, 15:57. Показов 1457. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот вроде понял и что такое стек, и что такое классы и как их реализовать в отдельности. Но как их объеденить в одну программу представления не имею. Пожалуйста, хотя бы подтолкните в нужном направлении, уже много подобных тем просмотрел, но мало что из них понял.
Миниатюры
Class stack в объектно ориентированном программировании  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.04.2020, 15:57
Ответы с готовыми решениями:

Полиморфизм в объектно-ориентированном программировании.Перегрузка функций
Помогите,пожалуйста,написать программу.В DevC++.

Классы в объектно-ориентированном программировании. С++
Здравствуйте! Подскажите, пожалуйста. Необходимо реализовать задачу на языке С++: Создать класс окружность, член класса - R....

Простой калькулятор в объектно-ориентированном стиле
Здравствуйте. А можно написать совсем простой калькулятор типа: Введите 2 числа Выберите операцию Результат с классом?...

29
1 / 0 / 1
Регистрация: 20.01.2017
Сообщений: 25
26.04.2020, 23:58
А что не получается?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 17:36  [ТС]
Вот что у меня получилось, но не понимаю почему деструктор не правильно работает
Stack.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
#pragma once
#include <iostream>
using namespace std;
class Stack
{
    struct Node
    {
        Node() : next(NULL), value(0)
        {};
        Node(unsigned int val) : value(val)
        {};
        Node(unsigned int val, Node* node_next) : value(val), next(node_next)
        {};
        Node* next;
        unsigned int value;
    };
private:
    
    Node* top_Element;
    Node* this_Element;
    unsigned int amount_of_elements;
public:
    Stack();
    Stack(const Stack& obj);
    
 
    void set_top_Element(unsigned int data_top_Element);
    void set_this_Element(unsigned int data_this_Element);
    unsigned int get_top_Element() const;
    unsigned int get_this_Element() const;
    unsigned int get_amount_of_elements() const;
 
    void push(unsigned int val);
    void pop();
    bool IsEmpty() const;
 
 
    Stack operator + (unsigned int val) ;
    Stack operator - () ;
    Stack operator -- () ;
    Stack operator ++ () ;
    int operator [] (unsigned int index) ;
    friend ostream& operator << (ostream& cout, Stack steck);
    Stack operator = (const Stack& steck);
 
    ~Stack();
};
Stack.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
#include "Stack.h"
/*----------Constructor and Destructor-----------------*/
Stack::Stack() : top_Element(NULL), this_Element(NULL), amount_of_elements(0)
{}
 
 
Stack::Stack(const Stack& obj) : top_Element(obj.top_Element), this_Element(obj.this_Element), amount_of_elements(obj.amount_of_elements)
{}
 
 
Stack::~Stack()
{
    while (!IsEmpty())
    {
        pop();
    }
}
/*----------Getters and Setters-----------------*/
void Stack::set_top_Element(unsigned int data_top_Element)
{
    top_Element->value = data_top_Element;
}
void Stack::set_this_Element(unsigned int data_this_Element)
{
    this_Element->value = data_this_Element;
}
 
unsigned int Stack::get_top_Element() const
{
    return top_Element->value;
}
unsigned int Stack::get_this_Element() const
{
    return this_Element->value;
}
unsigned int Stack::get_amount_of_elements() const
{
    return amount_of_elements;
}
 
void Stack::push(unsigned int val)
{
    if (top_Element != NULL)
    {
        Node* temp = new Node(val, this_Element);
        this_Element = temp;
        top_Element = this_Element;
    }
    else {
        top_Element = new Node(val);
        this_Element = top_Element;
    }
    amount_of_elements++;
}
 
void Stack::pop()
{
    if (top_Element == NULL)
    {
        cout << "Stack is empty!";
    }
    else
    {
        Node* temp = this_Element;
        this_Element = this_Element->next;
        delete temp;
        top_Element = this_Element;
        amount_of_elements--;
    }
}
 
bool Stack::IsEmpty() const
{
    return amount_of_elements == 0;
}
 
/*----------Operations-----------------*/
Stack Stack::operator+(unsigned int val)
{
    push(val);
    return *this;
}
 
Stack Stack::operator-() 
{
    pop();
    return *this;
}
 
Stack Stack::operator--()
{
 
    this_Element = top_Element;
    return *this;
}
 
Stack Stack::operator++()
{
    if (this_Element != NULL)
    {
        this_Element = this_Element->next;
    }
    else {
        cout << "End of Stack!";
    }
    return *this;
}
 
int Stack::operator[](unsigned int index)
{
    
    if (index > amount_of_elements)
    {
        cout << "Index out of range!";
    }
    else {
        this_Element = top_Element;
        for (Node* temp = top_Element; index > 0; index--, temp = temp->next, this_Element = temp)
        {
        }
        return this_Element->value;
    }
}
 
Stack Stack::operator=(const Stack& steck)
{
    if (this != &steck)
    {
        top_Element = steck.top_Element;
        this_Element = steck.this_Element;
        amount_of_elements = steck.amount_of_elements;
    }
    return *this;
}
 
/*----------Print function-----------------*/
ostream& operator<<(ostream& cout, Stack steck)
{
    if (steck.top_Element != NULL)
    {
        for (int i = 0; i < steck.get_amount_of_elements(); i++)
        {
            cout << "| " << steck[i] << " |";
        }
    }
    else {
        cout << "Stack is empty!";
    }
    return cout;
}
0
1 / 0 / 1
Регистрация: 20.01.2017
Сообщений: 25
27.04.2020, 17:40
Чем отличаются this_Element и top_Element?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 17:42  [ТС]
ничем, это просто по заданию
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:02
Цитата Сообщение от Towara Посмотреть сообщение
Вот что у меня получилось, но не понимаю почему деструктор не правильно работает
У тебя конструктор копирования неправильно написан. Надеюсь, ты его нигде не используешь?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 22:41  [ТС]
Использую:
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
void main()
{
    Stack steck1;
    Stack steck2;
    unsigned int size = 0, del = 0, index = 0;
    cout << "Enter the size of stack: ";
    cin >> size;
 
    for (int i = 0; i < size; i++) {
        steck1.operator+(rand());
    }
    cout << "\nStack:\n";
    cout << steck1;
    steck2 = steck1;
    
    
    do
    {
        cout << "\n\nInput amount of values you want to delete: ";
        cin >> del;
    } while ((del < 0) || (del >= steck2.get_amount_of_elements()));
 
    for (int i = 0; i < del; i++) {
        steck2.operator-();
    }
    
    cout << steck2;
 
    steck2.operator--();
    cout << "\n\nThe value of pointer (moving to the beginning): " << steck2.get_this_Element() << endl;
 
    if (steck2.get_amount_of_elements() > 1)
    {
        steck2.operator++();
        cout << "\nThe value of pointer (moving to the next one): " << steck2.get_this_Element() << endl;
 
    }
    else {
        cout << "\nStack has only one element";
    }
    
    do
    {
        cout << "\nInput index: ";
        cin >> index;
    } while ((index < 0) || (index >= steck2.get_amount_of_elements()));
    steck2.operator[](index);
    cout << "\nThe value of [" << index << "] element of stack: " << steck2.get_this_Element() << endl;
}
Добавлено через 1 минуту
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:44
Цитата Сообщение от Towara Посмотреть сообщение
Использую:
Поэтому и деструктор не работает - два раза одни и те же данные
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 22:45  [ТС]
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 22:51
Цитата Сообщение от Towara Посмотреть сообщение
Не могли бы вы помочь с написанием деструктора и конструктора копирования?
Что-то типа
C++
1
2
3
4
5
6
7
8
Stack::Stack(const Stack& obj) 
: top_Element(nullptr)
, this_Element(nullptr)
, amount_of_elements(0)
{
    for (auto *p = obj.top_Element; p; p = p->next)
        push(p->val);
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
 
Stack &Stack::operator=(const Stack &src)
{
    if (this != &src)
        Stack(src).swap(*this)
    return *this;
}
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
27.04.2020, 23:02  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что-то типа
C++
1
2
3
4
5
6
7
8
Stack::Stack(const Stack& obj) 
: top_Element(nullptr)
, this_Element(nullptr)
, amount_of_elements(0)
{
    for (auto *p = obj.top_Element; p; p = p->next)
        push(p->val);
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
 
Stack &Stack::operator=(const Stack &src)
{
    if (this != &src)
        Stack(src).swap(*this)
    return *this;
}
Это все один конструктор копирования?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
27.04.2020, 23:04
Цитата Сообщение от Towara Посмотреть сообщение
Это все один конструктор копирования?
В смысле? Это конструктор и оператор копирования. И метод swap
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 12:43  [ТС]
C++
1
2
3
4
5
6
void Stack::swap(Stack &src)
{
    std::swap(top_Element, src.top_Element);
    std::swap(this_Element, src.this_Element);
    std::swap(amount_of_elements, src.amount_of_elements);
}
Пишет что не удается иницилизировать ссылку типа "Stack &" ( квалифицируется как неконстантная) со значением типа Stack::Node*
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 13:07
Цитата Сообщение от Towara Посмотреть сообщение
Пишет что не удается иницилизировать ссылку типа "Stack &" ( квалифицируется как неконстантная) со значением типа Stack::Node*
Покажи как сделал, весь код
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 14:44  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи как сделал, весь код
Stack.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
#pragma once
#include <iostream>
using namespace std;
class Stack
{
    struct Node
    {
        Node* next;
        unsigned int value;
        Node(unsigned int val, Node* node_next) : value(val), next(node_next)
        {};
    };
private:
    
    Node* top_Element;
    Node* this_Element;
    unsigned int amount_of_elements;
public:
    Stack();
    Stack(const Stack& obj);
    ~Stack();
 
    void set_top_Element(unsigned int data_top_Element);
    void set_this_Element(unsigned int data_this_Element);
    unsigned int get_top_Element() const;
    unsigned int get_this_Element() const;
    unsigned int get_amount_of_elements() const;
 
    void push(unsigned int val);
    void pop();
    bool IsEmpty() const;
    void swap(Stack& obj);
 
    Stack operator + (unsigned int val) ;
    Stack operator - () ;
    Stack operator -- () ;
    Stack operator ++ () ;
    int operator [] (unsigned int index) ;
    friend ostream& operator << (ostream& cout, Stack obj);
    Stack& operator = (const Stack& obj);
};
Stack.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
#include "Stack.h"
/*----------Constructor and Destructor-----------------*/
Stack::Stack() : top_Element(nullptr), this_Element(nullptr), amount_of_elements(0)
{}
 
 
Stack::Stack(const Stack& obj) : top_Element(obj.top_Element), this_Element(obj.this_Element), amount_of_elements(obj.amount_of_elements)
{
    for (Node* temp = obj.top_Element; temp; temp = temp->next)
    {
        push(temp->value);
    }
}
 
 
Stack::~Stack()
{
}
/*----------Getters and Setters-----------------*/
void Stack::set_top_Element(unsigned int data_top_Element)
{
    top_Element->value = data_top_Element;
}
void Stack::set_this_Element(unsigned int data_this_Element)
{
    this_Element->value = data_this_Element;
}
 
unsigned int Stack::get_top_Element() const
{
    return top_Element->value;
}
unsigned int Stack::get_this_Element() const
{
    return this_Element->value;
}
unsigned int Stack::get_amount_of_elements() const
{
    return amount_of_elements;
}
 
void Stack::push(unsigned int val)
{
    if (top_Element != NULL)
    {
        Node* temp = new Node(val, this_Element);
        this_Element = temp;
        top_Element = this_Element;
    }
    else {
        top_Element = new Node(val, nullptr);
        this_Element = top_Element;
    }
    amount_of_elements++;
}
 
void Stack::pop()
{
    if (top_Element == NULL)
    {
        cout << "Stack is empty!";
    }
    else
    {
        Node* temp = this_Element;
        this_Element = this_Element->next;
        delete temp;
        top_Element = this_Element;
        amount_of_elements--;
    }
}
 
bool Stack::IsEmpty() const
{
    return amount_of_elements == 0;
}
 
void Stack::swap(Stack& obj)
{
    swap(top_Element, obj.top_element);
    swap(this_Element, obj.this_Element);
    swap(amount_of_elements, obj.amount_of_elements);
}
 
/*----------Operations-----------------*/
Stack Stack::operator+(unsigned int val)
{
    push(val);
    return *this;
}
 
Stack Stack::operator-() 
{
    pop();
    return *this;
}
 
Stack Stack::operator--()
{
 
    this_Element = top_Element;
    return *this;
}
 
Stack Stack::operator++()
{
    if (this_Element != NULL)
    {
        this_Element = this_Element->next;
    }
    else {
        cout << "End of Stack!";
    }
    return *this;
}
 
int Stack::operator[](unsigned int index)
{
    
    if (index - 1 > amount_of_elements)
    {
        cout << "Index out of range!";
    }
    else {
        Node* temp;
        for (temp = top_Element; index > 0; index--, temp = temp->next)
        {
        }
        return temp->value;
    }
}
 
Stack& Stack::operator=(const Stack& obj)
{
    if (this != &obj)
    {
        Stack(obj).swap(*this);
        /*top_Element = steck.top_Element;
        this_Element = steck.this_Element;
        amount_of_elements = steck.amount_of_elements;*/
    }
    return *this;
}
 
/*----------Print function-----------------*/
ostream& operator<<(ostream& cout, Stack obj)
{
    if (obj.top_Element != NULL)
    {
        for (int i = 0; i < obj.get_amount_of_elements(); i++)
        {
            cout << "| " << obj[i] << " |";
        }
    }
    else {
        cout << "Stack is empty!";
    }
    return cout;
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "Stack.h"
 
void main()
{
    Stack steck1;
    Stack steck2;
    unsigned int size = 0, del = 0, index = 0;
    cout << "Enter the size of stack: ";
    cin >> size;
 
    for (int i = 0; i < size; i++) {
        steck1.operator+(rand());
    }
    cout << "\nStack:\n";
    cout << steck1;
    steck2 = steck1;
    
    
    do
    {
        cout << "\n\nInput amount of values you want to delete: ";
        cin >> del;
    } while ((del < 0) || (del >= steck2.get_amount_of_elements()));
 
    for (int i = 0; i < del; i++) {
        steck2.operator-();
    }
    
    cout << steck2;
 
    steck2.operator--();
    cout << "\n\nThe value of pointer (moving to the beginning): " << steck2.get_this_Element() << endl;
 
    if (steck2.get_amount_of_elements() > 1)
    {
        steck2.operator++();
        cout << "\nThe value of pointer (moving to the next one): " << steck2.get_this_Element() << endl;
 
    }
    else {
        cout << "\nStack has only one element";
    }
    
    do
    {
        cout << "\nInput index: ";
        cin >> index;
    } while ((index < 0) || (index >= steck2.get_amount_of_elements()));
    steck2.operator[](index);
    cout << "\nThe value of [" << index << "] element of stack: " << steck2.get_this_Element() << endl;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 14:49
Цитата Сообщение от Towara Посмотреть сообщение
void Stack::swap(Stack& obj)
{
    swap(top_Element, obj.top_element);
    swap(this_Element, obj.this_Element);
    swap(amount_of_elements, obj.amount_of_elements);
}
Добавь std::
C++
1
2
3
    std::swap(top_Element, obj.top_Element);
    std::swap(this_Element, obj.this_Element);
    std::swap(amount_of_elements, obj.amount_of_elements);
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 15:08  [ТС]
Не помогло
Миниатюры
Class stack в объектно ориентированном программировании  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 15:09
Цитата Сообщение от Towara Посмотреть сообщение
Не помогло
top_Element
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 15
28.04.2020, 15:39  [ТС]
Да не в этом же проблема
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.04.2020, 15:41
Цитата Сообщение от Towara Посмотреть сообщение
Да не в этом же проблема
В этом. Не видишь что-ли, что у тебя там top_еlement с маленькой буквы, красным подчёркнуто
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2020, 15:41
Помогаю со студенческими работами здесь

Реализация задачи в объектно-ориентированном стиле
Здравствуйте. Столкнулась с проблемой. Дали задание на курсовик по ООП в qt. &quot;Требования к выполнению курсовых заданий ...

В объектно ориентированном создать Информатический словарь
Помогите пожалуйста, всю голову себе сломал... нужно в объектно ориентированном создать Информатический словарь. Объясняю проблему: ...

Обработка символьных данных в объектно-ориентированном программировании
Подскажите пожалуйста как программу приведеную ниже заставить правильно работать. В консоле все прекрассно работает а пытаюсь связать с...

Составить программу на встроенном объектно - ориентированном языке Visual Basic for Applications (VBA)

Подскажите где можно использовать class Stack
Изучил class Stack а где его применять не знаю.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru