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

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

Войти
Регистрация
Восстановить пароль
 
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
#1

Список котов. - C++

21.11.2011, 03:29. Просмотров 617. Ответов 11
Метки нет (Все метки)

Привет, друзья.


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
class Cat:
{
public:
    Cat() { itsAge = 1;}
    ~Cat() {}
    void SetAge(int age) { itsAge = age; }
    int GetAge() const { return itsAge; }
 
private:
    int itsAge;
};
 
struct //создать список котов
 
void main()
{
    int birth;
 
    while(true) 
    {
        cin >> birth;
        if(birth == 1)
        {
            // в список котов добавляется новый Кот.
            cout << "added a new cat" << endl;
        }
        if(birth == -1)
        {
           // из списка удаляется кот
           cout << "deleted a one cat" << endl;
        }
    
        cout << "Number of kittens:" << ?? << endl;
    }
 
    cin.get()
}
Вопрос содержится в коде.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2011, 03:29     Список котов.
Посмотрите здесь:

Написать класс котов - C++
Помогите пожалуйста написать программу... буду очень признательна :) Написать класс котов. Атрибутами кота есть действительный вес (в...

Написать программу про класы котов - C++
Ребята, помогите пожалуйста написать программку про класс котов. Буду очень признательна ели поможете! задача:написать класс котов....

Односвязный список в список - C++
Всем привет. Гугл мне ответа не дал. Не понимаю, как один список вставить в другой и как передвигаться по нему? В одном списке хранится...

Получить список котов, занимающих конкретную квартиру и имеющих возраст в определенном диапазоне - C (СИ)
имеется список котов, структура о каждом из которых содержит: кличку, возраст, характеристику, номер квартиры. Получить список...

вирус 12-котов.ру как удалить ? Удаление вирусов - Удаление вирусов
Народ вчера обнаружил что при использовании браузера хром , сам по себе перекидывает на различные рекламные сайты , и поисковик 12котов.ру...

Как отучить котов требовать корма ночью?
Мявкают в ухо...

При запуске винды автоматически открывется поисковик 12 котов - Удаление вирусов
После неудачного скачивания торрент-файла,самопризвольно открываются рекламные вкладки. Также при запуске автоматически открывается хром с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.11.2011, 03:43     Список котов. #2
Цитата Сообщение от res Посмотреть сообщение
Вопрос содержится в коде.
что-то не вижу вопроса
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
21.11.2011, 05:03  [ТС]     Список котов. #3
Создать список, в который будут добавляться и удаляться "коты".
Можно вектором или лист. Надеюсь вопрос теперь понятен.
magistr011
6 / 6 / 0
Регистрация: 22.10.2011
Сообщений: 164
21.11.2011, 05:13     Список котов. #4
res, код у тебя неправельный, ничего общего с классами (кроме слов: class, public, private)
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
21.11.2011, 05:38  [ТС]     Список котов. #5
magistr011, А у тебя слово "неправильный" не правильное.
Суть не в этом же.

Ладно, сейчас снова попытаюсь сделать с динамическими массивами.
iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
21.11.2011, 06:08     Список котов. #6
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
/* 
 * File:   DoubleList.h
 * Author: iWord
 *
 * Created on 10 Октябрь 2011 г., 20:20
 */
 
#ifndef DOUBLELIST_H
#define DOUBLELIST_H
#include <stdio.h>
 
class DoubleLinkedList {
  typedef int ElementType;
  class ListNode {
   public:
    ListNode(int i = 0) : item(i), prev(NULL), next(NULL) {}
    ListNode* prev;
    ListNode* next;
    ElementType item;
  };
 
  ListNode* curnode;
  ListNode firstnode;
  ListNode lastnode;
 
  ListNode* GetLast() {
    ListNode* lastNode = &firstnode;
 
    while (lastNode->next != &lastnode) {
      lastNode = lastNode->next;
    }
 
    return lastNode;
  }
  
  ListNode* GetFirst() {
    ListNode* firstNode = &lastnode;
 
    while (firstNode->prev != &firstnode) {
      firstNode = firstNode->prev;
    }
 
    return firstNode;
  }
 
 public:
  DoubleLinkedList() : curnode(NULL) {
      printf("\nКонструктор начал работу");
    firstnode.next = &lastnode;
    lastnode.prev = &firstnode;    
    printf("\nКонструктор закончил работу");
  }
  
  ~DoubleLinkedList(){
       printf("\033[44m \033[37m \033[1m Деструктор начал работу \033[m \033[m \033[m \n");
       curnode->prev-> next= curnode -> next;
       curnode -> next->prev=curnode -> prev;
       printf(" \033[31m \033[1m Память освобождена \033[m \033[m \n");
       printf("\033[44m \033[37m \033[1m Деструктор завершил работу \033[m \033[m \033[m \n");
  }
 
  void Add(int num) {
    ListNode* newnode = new ListNode(num);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset();
  }
 
  bool HasNext() {
    return curnode && curnode != &lastnode;
  }
 
  int Next() {
    int value = curnode->item;
    curnode = curnode->next;
    return value;
  }
 
  bool HasPrev() {
    return curnode && curnode != &firstnode;
  }
 
  int Prev() {
    int value = curnode->item;
    curnode = curnode->prev;
    return value;
  }
  
  void Reset(bool tobegin = true) {
    if (tobegin) 
      curnode = firstnode.next;
    else
      curnode = lastnode.prev;
}
  void Entry(int count,int method){
      int item, item_1;
      char buffer[500];
      time_t time_var;
      time_var = time(NULL);
      srand(time(NULL));
      
      for (int i = 1; i <= count; i++) {
          if (method == 0){
              printf(" \033[36m \033[1m Введите элемент очереди \033[m \033[m \n");
              fgets(buffer, 120, stdin);
              item = atoi(buffer);
          }else if(method != 0){
              item = rand() % 100 ;
              item_1 = item;
              for (int i = 1; i <= item_1; i++) {
                item = item * (-1);
            }
          }
    ListNode* newnode = new ListNode(item);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset(); 
        }
  }
  
  int isEmpty(){
      if (curnode -> prev == NULL){
          return 1;
      }else{
          return 0;
      }
  }
  
int Value(int coord){
    Reset(true);
    for (int i = 1; i < coord; i++) {
        Next();
        }
    return curnode -> item;
}
};
#endif  /* DOUBLELIST_H */
Вот тебе реализация списка. думаю под себя заточить и сам сможешь.
iWord
10 / 10 / 1
Регистрация: 21.12.2010
Сообщений: 109
21.11.2011, 06:08     Список котов. #7
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
/* 
 * File:   DoubleList.h
 * Author: iWord
 *
 * Created on 10 Октябрь 2011 г., 20:20
 */
 
#ifndef DOUBLELIST_H
#define DOUBLELIST_H
#include <stdio.h>
 
class DoubleLinkedList {
  typedef int ElementType;
  class ListNode {
   public:
    ListNode(int i = 0) : item(i), prev(NULL), next(NULL) {}
    ListNode* prev;
    ListNode* next;
    ElementType item;
  };
 
  ListNode* curnode;
  ListNode firstnode;
  ListNode lastnode;
 
  ListNode* GetLast() {
    ListNode* lastNode = &firstnode;
 
    while (lastNode->next != &lastnode) {
      lastNode = lastNode->next;
    }
 
    return lastNode;
  }
  
  ListNode* GetFirst() {
    ListNode* firstNode = &lastnode;
 
    while (firstNode->prev != &firstnode) {
      firstNode = firstNode->prev;
    }
 
    return firstNode;
  }
 
 public:
  DoubleLinkedList() : curnode(NULL) {
      printf("\nКонструктор начал работу");
    firstnode.next = &lastnode;
    lastnode.prev = &firstnode;    
    printf("\nКонструктор закончил работу");
  }
  
  ~DoubleLinkedList(){
       printf("\033[44m \033[37m \033[1m Деструктор начал работу \033[m \033[m \033[m \n");
       curnode->prev-> next= curnode -> next;
       curnode -> next->prev=curnode -> prev;
       printf(" \033[31m \033[1m Память освобождена \033[m \033[m \n");
       printf("\033[44m \033[37m \033[1m Деструктор завершил работу \033[m \033[m \033[m \n");
  }
 
  void Add(int num) {
    ListNode* newnode = new ListNode(num);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset();
  }
 
  bool HasNext() {
    return curnode && curnode != &lastnode;
  }
 
  int Next() {
    int value = curnode->item;
    curnode = curnode->next;
    return value;
  }
 
  bool HasPrev() {
    return curnode && curnode != &firstnode;
  }
 
  int Prev() {
    int value = curnode->item;
    curnode = curnode->prev;
    return value;
  }
  
  void Reset(bool tobegin = true) {
    if (tobegin) 
      curnode = firstnode.next;
    else
      curnode = lastnode.prev;
}
  void Entry(int count,int method){
      int item, item_1;
      char buffer[500];
      time_t time_var;
      time_var = time(NULL);
      srand(time(NULL));
      
      for (int i = 1; i <= count; i++) {
          if (method == 0){
              printf(" \033[36m \033[1m Введите элемент очереди \033[m \033[m \n");
              fgets(buffer, 120, stdin);
              item = atoi(buffer);
          }else if(method != 0){
              item = rand() % 100 ;
              item_1 = item;
              for (int i = 1; i <= item_1; i++) {
                item = item * (-1);
            }
          }
    ListNode* newnode = new ListNode(item);
 
    ListNode* lastNode = GetLast();
 
    lastNode->next = newnode;
    newnode->prev = lastNode;
    newnode->next = &lastnode;
    lastnode.prev = newnode;
 
    if (!curnode) Reset(); 
        }
  }
  
  int isEmpty(){
      if (curnode -> prev == NULL){
          return 1;
      }else{
          return 0;
      }
  }
  
int Value(int coord){
    Reset(true);
    for (int i = 1; i < coord; i++) {
        Next();
        }
    return curnode -> item;
}
};
#endif  /* DOUBLELIST_H */
Вот тебе реализация списка. думаю под себя заточить и сам сможешь.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
21.11.2011, 09:54     Список котов. #8
Связные списки такие списки.
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
#include <iostream>
 
// простенькие классы для двусвязного списка.
// не содержат методов с количеством строк, большим пяти
 
// базовый класс для элемента двусвязного списка
// не содержит данных, содержит некоторую логику построения списка
struct NodeBase {
  NodeBase *prev;
  NodeBase *next;
  // по-умолчанию, при создании нода указывает на саму себя
  NodeBase() : prev(this), next(this) {}
  // альтернативно можно задать предыдущий и следующий элемент списка
  NodeBase(NodeBase *prev_, NodeBase *next_) : prev(prev_), next(next_) {
    // и он сам себя добавит между элементами prev и next
    prev->next = next->prev = this;
  }
  // при удалении исключим элемент из связного списка
  virtual ~NodeBase() {
    prev->next = next;
    next->prev = prev;
  }
};
 
// класс элемент связного списка
// содержит данные
template <class ValueType>
struct Node : public NodeBase {
  ValueType data;
  Node(NodeBase *prev, NodeBase *next, const ValueType &data_)
    : NodeBase(prev, next), data(data_) {};
};
 
template <class ValueType>
class DoubleLinkedList {
 public:
  // чтобы не писать каждый раз Node<ValueType>
  typedef Node<ValueType> NodeType;
  DoubleLinkedList() : base() {}
  // при удалении объекта класса связный список очищается
  ~DoubleLinkedList() {
    clear();
  }
  // добавление в конец связного списка
  void pushBack(const ValueType &value) {
    // создание ноды, которая сама себя вставит в список
    // предыдущий элемент = предыдущему элементу базового элемента
    // следующий элемент = базовому элементу
    new NodeType(base.prev, &base, value);
  }
  // добавление в начало связного списка
  void pushFront(const ValueType &value) {
    // аналогично добавлению в конец
    new Node<ValueType>(&base, base.next, value);
  }
  // получение последнего элемента списка
  const ValueType &back() const {
    return static_cast<NodeType*>(base.prev)->data;
  }
  // получение первого элемента списка
  const ValueType &front() const {
    return static_cast<NodeType*>(base.next)->data;
  }
  // удаление последнего элемента с возвращением его значения
  ValueType popBack() {
    // получение значения последнего элемента
    ValueType result = back();
    // удаление последнего элемента
    delete base.prev;
    // возвращение результата
    return result;
  }
  ValueType popFront() {
    // получение значения первого элемента
    ValueType result = front();
    // удаление последнего элемента
    delete base.next;
    // возвращение результата
    return result;
  }
  // проверка на пустоту связного списка
  bool isEmpty() {
    return base.next == &base;
  }
  // удаление всех элементов связного списка
  void clear() {
    // пока связный список не пустой
    while (!isEmpty())
      // удаляется первый элемент списка
      delete base.next;
  }
  // получение элемента на позиции n.
  const ValueType &at(size_t n) const {
    // получение первого элемента
    NodeBase *i = base.next;
    // проход по n элементов
    while (n-- > 0)
      // переход на следующий элемент
      i = i->next;
    return static_cast<NodeType*>(i)->data;
  }
  // подсчет количества элементов связного списка
  size_t size() {
    size_t result = 0;
    // проход по всем элементам списка
    for (NodeBase *i = base.next; i != &base; i = i->next)
      ++result;
    return result;
  }
 private:
  NodeBase base;
};
 
// класс кота
class Cat {
 public:
  Cat() : age(1) {}
  explicit Cat(int age_) : age(age_) {}
  int getAge() const { return age; }
  void setAge(int value) { age = value; }
  // оператор вывода кота
  friend std::ostream &operator<<(std::ostream &stream, const Cat &cat) {
    return stream << "Cat, age: " << cat.getAge();
  }
 private:
  int age;
};
 
int main(int argc, char *argv[]) {
  DoubleLinkedList<Cat> list;
  // добавление в конец списка
  list.pushBack(Cat(1));
  list.pushBack(Cat(2));
  list.pushBack(Cat(3));
  // размер списка
  std::cout << "List size: " << list.size() << std::endl;
  // получение элемента списка по его порядковому номеру
  std::cout << "At 1: " << list.at(1) << std::endl;
  // вывод всех элементов списка с удалением
  while (!list.isEmpty())
    std::cout << list.popFront() << "; ";
  std::cout << std::endl;
}
Bers
Заблокирован
21.11.2011, 11:21     Список котов. #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
зачем все так сильно усложнять?
И кстати СПИСОК котов не имеет ничего общего с контейнером list

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
#include <iostream>
#include <vector>
 
class Cat
{
public:
    Cat() { itsAge = 1;}
    ~Cat() {}
    void SetAge(int age) { itsAge = age; }
    int GetAge() const { return itsAge; }
 
private:
    int itsAge;
};
 
class ListCat   //список котов
{
public:
    ListCat(){}
    void Add() { myListCat.push_back( Cat()  ); }
    void Delete() { myListCat.pop_back(); }
    unsigned int HowManyCat() cinst { return myListCat.size(); }
protected:
    std::vector<Cat> myListCat;
};
 
 
int main()
{
    using namespace std;
    int birth;
    ListCat myCats; //список моих котов
 
    while(true) 
    {
        cin >> birth;
        if(birth == 1)
        {
            // в список котов добавляется новый Кот.
            myCats.Add(); //добавили кота
            cout << "added a new cat" << endl;
        }
        if(birth == -1)
        {
            // из списка удаляется кот
            myCats.Delete(); //удалили кота
            cout << "deleted a one cat" << endl;
        }
        cout << "Number of kittens:" << myCats.HowManyCat() << endl;
    }
 
    cin.get();  return 0;
}
Добавлено через 2 минуты
Услышали слово "список" и тут же начали велосипедить.
res
56 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
22.11.2011, 06:01  [ТС]     Список котов. #10
Bers, молодчик

Добавлено через 10 часов 28 минут
Не стану создавать новую тему, отпишу вопрос прямо тут.
Если я хочу удалить "кота" по указателю, то чем отличается первый вариант от второго (и безопасно)?

Вариант 1. Векторы:
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
class VectorCat 
{
public:
    void Add(Cat* pCat)
    {
        myVectorCat.push_back(pCat);
    }
    bool Remove(Cat* pCat)
    {
        for(std::vector<Cat*>::iterator it = myVectorCat.begin(); it < myVectorCat.end(); ++it)
        {
            if(pCat == (*it))
            {
                myVectorCat.erase(it);
                return true;
            }
        }
        return false;
    }
 
    unsigned int GetCatsCount() const { return myVectorCat.size(); }
protected:
    std::vector<Cat*> myVectorCat;
};
Вариант 2. Списки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ListCat  
{
public:
    void Add(Cat* pCat)
    {
        myListCat.push_back(pCat);
    }
    bool Remove(Cat* pCat)
    {
        if(myListCat.size() >0)
        {
            myListCat.remove(pCat);
            return true;
        }
 
        return false;
    }
 
    unsigned int GetCatsCount() const { return myListCat.size(); }
 
protected:
    std::list<Cat*> myListCat;
};
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
22.11.2011, 08:24     Список котов. #11
Цитата Сообщение от Bers Посмотреть сообщение
зачем все так сильно усложнять?
О, это мы уже проходили.
C++
1
2
3
4
#include <anystllib>
...
...
...
Комментарий ТЦ: "а можно проще?"
или: "это мы не проходили" (тили-тили)

Или думаешь, тут все дружно забыли про STL?

Цитата Сообщение от Bers Посмотреть сообщение
Услышали слово "список" и тут же начали велосипедить.
Ну, для начала, я пишу так, как мне интересно, а как не интересно -- обычно не пишу. Я же не на работе.
В этом разделе всем всегда нужны именно виласипеды. Преподаватели требуют от студиозусов именно их и очень часто запрещают использование STL.
Цитата Сообщение от Bers Посмотреть сообщение
И кстати СПИСОК котов не имеет ничего общего с контейнером list
Предпочтение компоновки -- известная best practice, но "ничего общего" -- явный перебор. Даже лексически -- "СПИСОК не имеет ничего бщего с контейнером, реализующим список" как-то неправильно.

Добавлено через 10 минут
Цитата Сообщение от res Посмотреть сообщение
Если я хочу удалить "кота" по указателю, то чем отличается первый вариант от второго (и безопасно)?
Уважаемый, зачем вам хранить указатели на котов? Почему не хранить сами объекты вместо ссылок на них?
Обычно list быстрее работает с добавлением/удалением элементов, vector быстрее при работе со случайным доступом.

Алгоритм, работающий и с листами и с векторами:
C++
1
2
3
4
5
6
#include <algorithm>
...
std::list<cat> i = std::find(myListCat.begin(), myListCat.end(), cat)
if (i != myListCat.end())
  myListCat.erase(i);
...
Добавлено через 1 минуту
Цитата Сообщение от res Посмотреть сообщение
(и безопасно)?
Скорее всего небезопасно. Чаще всего вообще не безопасно работать с указателями. Храните объекты, а не указатели на них.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2011, 08:32     Список котов.
Еще ссылки по теме:

Программа вводит с клавиатуры данные про котов и выводит их на экран - Java
Помогите пожалуйста исправить программу, чтобы компилировалась и работала Задача: Программа вводит с клавиатуры данные про котов и...

Список с заглавным звеном, из текстового файла получить список из записей и по нему уже сделать задание - Delphi
Структура записи: -ФИО(40 знаков) -Адрес: -Улица(20 знаков) -Номер дома -Квартира -Номер телефона(10 знаков) -Баланс ...

Список из 20 названий горных вершин. Переписать в другой список только те, название которых оканчивается на «тау» - Pascal
Здравствуйте. Помогите пожалуйста исправить программу. Задан список из 20 названий горных вершин. (array of string). Переписать в другой...

7. Написать программу, содержащую функцию, которая определяет, входит ли список М1 в список М2. Предполагается, что списки существуют - Pascal
7. Написать программу, содержащую функцию, которая определяет, входит ли список М1 в список М2. Предполагается, что списки существуют.


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

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
22.11.2011, 08:32     Список котов. #12
lemegeton, хорош мозги полоскать. Задача была написана на русском языке.
Yandex
Объявления
22.11.2011, 08:32     Список котов.
Ответ Создать тему
Опции темы

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