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

Программы на ОПП С++. 911 - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
syber2013
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 11
26.02.2013, 19:04     Программы на ОПП С++. 911 #1
Нашел в одной из тем программу написанную на запрос по контрольной работе по ООП С++ форумчаниным lemegeton. Эта контрольная подходит и для моего варианта. Просьба откликнуться lemegeton. Я новичок в ООП С++ и конкретно просьба моя заключается в помощи описания написанной программы и добавления комментариев в программу. Пожалуйста помогите. Программа во вложениях.
Или если кто поможет буду очень признателен.
Вложения
Тип файла: 7z lab_sources.7z (2.0 Кб, 37 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 19:04     Программы на ОПП С++. 911
Посмотрите здесь:

C++ Подскажите. Не компилирует текст программы, запрашивает в коде мол не достающую скобку. Ниже приведен текст программы.
C++ Задание по ОПП
C++ Дан текст программы на С++...Записать в выходной файл текст программы без комментариев
Открытие файла другой программы из программы.Косяк. C++
обясните структуру программы , что выполнняет каждая строчка программы, зараннее благодарен! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
26.02.2013, 21:23     Программы на ОПП С++. 911 #2
Незнаю работает ли сейчас на форуме эта фича, но помнится добавляли такую возможность - если ник форумчанина написать вот так @ lemegeton; , то ему придет уведомление, что его упомянули и он глянет эту тему.

Выложи код в тегах, больше шансов будет, что кто-нибудь поможет.
syber2013
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 11
27.02.2013, 17:48  [ТС]     Программы на ОПП С++. 911 #3
Нашел в одной из тем программу написанную на запрос по контрольной работе по ООП С++ форумчаниным @ lemegeton. Эта контрольная подходит и для моего варианта. Просьба откликнуться @lemegeton. Я новичок в ООП С++ и конкретно просьба моя заключается в помощи описания написанной программы и добавления комментариев в программу. Пожалуйста помогите. Программа во вложениях.
Или если кто поможет буду очень признателен.

Вот задание на контрольные:

Лабораторная работа № 1

Тема: Классы. Открытые и закрытые уровни доступа. Конструкторы. Инициализация данных объекта. Определение методов. Создание объекта в памяти. Стандартные потоки ввода-вывода.

1. В среде программирования на С++ создайте консольный проект с именем LAB1 в каталоге LAB1.
2. В проекте создайте файлы main.h (заголовочный файл) и main.cpp (файл исходного кода).
3. В файле main.h определите с помощью ключевого слова class объект Person.

Данные объекта:
Номер человека (целый тип)
ФИО (символьный массив)
Пол (логический тип: 0-муж., 1-жен.)
Возраст (вещественный тип)

Пусть данные имеют закрытый уровень доступа (private).
4. Опишите конструктор объекта, аргументы которого будут инициализировать все данные объекта.
5. Опишите конструктор объекта по умолчанию (без аргументов), проинициализировав все данные.
6. Опишите в объекте функцию void Print() с открытым уровнем доступа (public), которая будет выводить данные на экран.
7. Откройте файл main.cpp. С помощью директивы #include включите в файл main.cpp заголовочные файлы <stdlib.h>, <string.h>, <iostream.h>, а также ваш заголовочный файл "Main.h".
8. Ниже определите конструктор объекта, инициализирующий все данные объекта значениями аргументов. В теле конструктора используйте функцию strcpy(стр1, стр2) для копирования строки имени человека (ФИО).
9. Затем определите функцию void Person::Print(). В теле функции для вывода данных используйте стандартный поток вывода cout << значение1 << значение2 << … << endl;
10. Ниже напишите главную функцию программы int main(). Внутри ее создайте объект Person, указав все значения данных объекта. Выведите данные объекта на экран, вызвав функцию Print.
11. Затем создайте динамический объект Person с помощью обычного конструктора и оператора new. Выведите данные объекта на экран. Удалите динамический объект из памяти с помощью оператора delete.
12. Напишите функцию ввода данных в объект с клавиатуры void Person::Input(). В теле функции для ввода данных используйте стандартный поток ввода cin >> значение1 >> значение2 >> … ;
13. Затем в теле функции main создайте объект Person с помощью конструктора по умолчанию и введите данные в объект с клавиатуры, вызвав функцию Input. Выведите данные объекта на экран.

4.2 Лабораторная работа № 2

Тема: Создание динамического массива объектов. Деструктор объекта. Два типа полиморфизма: принудительное приведение типа, перегрузка функций и перегрузка операторов (унарных и бинарных).

1. В среде программирования на С++ создайте консольный проект с именем LAB2 в каталоге LAB2.
2. Переименуйте файл main.h из предыдущей лабораторной в person.h. Создайте файл person.cpp и включите в проект эти два файла. Переместите конструктор и функции объекта Person из main.cpp в файл person.cpp. Таким образом, файл person.h содержит описание объекта Person, а файл person.cpp — реализацию объекта Person.
3. Включите в проект файл main.cpp и очистите тело функции main().
4. Определите объект Group, который будет содержать динамический массив объектов Person. Создайте два файла group.h и group.cpp и включите их в проект.
5. В файле group.h определите с помощью ключевого слова class объект Group.
Данные объекта:

размер массива (целый тип)
указатель на массив (тип Person* )

Пусть данные имеют закрытый уровень доступа (private).
6. Опишите конструктор объекта с одним аргументом — размер массива (целый тип) и деструктор объекта.
7. Откройте файл group.cpp. С помощью директивы #include включите необходимые заголовочные файлы.
8. Определите конструктор объекта Group. В теле конструктора проинициализируйте данные объекта, т.е. проинициализируйте размер массива значением аргумента конструктора и выделите динамическую память под массив с помощью строки кода:

указатель на массив = new Person[размер массива].

9. В деструкторе объекта освободите память, занимаемую массивом, с помощью строки кода:

delete [] указатель на массив.

Таким образом, мы создали объект Group, который содержит массив объектов Person.
10. Определите открытые (public) методы для объекта Group. Напишите функцию void Group::Print(), которая выводит в цикле for все записи массива на экран. В теле цикла примените ранее написанную функцию Print() для объекта Person.
11. Напишите функцию int Group::Size(), которая возвращает размер массива.
12. Напишите функции void PutPerson(int i, Person& man); и Person& GetPerson(int i);, первая функция заносит объект man типа Person в i-й элемент массива, вторая функция возвращает объект типа Person из i-го элемента массива.
13. Заполните массив данными и затем выведите их на экран. Для этого в теле функции int main() сначала определите массив имен, которые будут заноситься в поле ФИО объекта Person, например:

char names[5][25] = {"A", "B", "C", "D", "E"};.
Затем создайте объект с именем group типа Group размером пять записей, т.е. Group group(5);.
14. Ниже с помощью цикла for заполните массив данными. Для этого в теле цикла создайте объект Person, проинициализировав все его данные, и с помощью функции PutPerson занесите объект в массив.
15. Выведите массив на экран с помощью строки кода: group.Print();. Получилось? Если да, то вы научились создавать динамический массив объектов, определять функции работы с таким массивом и выводить его на экран.
16. В этой части лабораторной работы изучим первые два типа полиморфизма — это: а) принудительное приведение типа; б) перегрузка функций и операторов.
17. Напишите функцию приведения типа. Для этого с помощью ключевого слова operator напишите функцию объекта Person, которая преобразует тип Person в double. Пусть функция возвращает возраст человека, например:

Person::operator double() { return this->Age; }.

Что означает ключевое слово this?
18. Проверьте функцию преобразования типа. В функции int main() далее определите переменную double и присвойте ей объект Person, например:

double age = group.GetPerson(2);.

То есть совершается неявное преобразование из типа Person в тип double при обращении к объекту. Выведите значение переменной на экран.
19. Перегруженные функции имеют одинаковое название, но разный возвращаемый тип или/и разный список аргументов. Определите в объекте Group две функции с одинаковым именем, например: double Age(); и double Age(int limit);. Первая функция пусть возвращает средний возраст группы людей, а вторая функция пусть возвращает средний возраст людей в группе, возраст которых не больше некоторого граничного значения limit. Функции отличаются списком аргументов.
20. Проверьте работу перегруженных функций, отобразив на экране подсчитанные два значения среднего возраста.
21. Перегрузите оператор индексирования. Если раньше, чтобы обратиться к элементу массива, нам необходимо было вызывать функцию GetPerson, то, определив оператор индексирования, мы будем использовать только квадратные скобки. Сравните две строки кода:

Person man = group.GetPerson(2);
Person man = group[2];

В объекте Group с помощью ключевого слова operator определите оператор индексирования, например:

Person& Group::operator[](int i).

В теле оператора напишите код, возвращающий i-тый элемент массива, т.е. объект Person.
22. Выведите на экран с помощью оператора индексирования любой один элемент массива group, например третий.
23. Перегрузите бинарный оператор, например оператор сложения (+), для объекта Person. Пусть оператор сложения будет возвращать суммарный возраст двух человек. Опишите в объекте Person данный оператор как дружественную функцию с помощью ключевого слова friend, например:

friend double operator+(Person& p1, Person& p2);
Эта строка кода означает, что оператор сложения не принадлежит объекту, но ему доступны все закрытые данные и методы объекта.
В файле person.cpp определите оператор сложения, например:

double operator + (Person& p1, Person& p2)
{ return (p1.Age + p2.Age); }

Здесь мы напрямую обращаемся к закрытому полю Age объекта Person.
24. Проверьте работу оператора с помощью следующих строк кода:
double sum = group[1] + group[3];
cout << sum << endl;



5 ПРАВИЛА ОФОРМЛЕНИЯ ЛАБОРАТОРНЫХ РАБОТ

А) Лабораторная работа состоит в выполнении задания (глава 4), описании материала в формате MS WORD и подготовке файлов проекта (файлы *.ехе, *.cpp, *.h) Задание может быть выполнено в любой среде программирования С++ (VC++ или встроенного компилятора электронного учебника), но с обязательным ее указанием в файле отчета (дело в том, что существуют некоторые отличия программирования в средах, например Visual Studio и Borland).

Б) Лабораторная работа обязательно должна содержать:
– краткое изложение теоретического материала по каждому из рассматриваемых разделов;
– комментарии по тексту программы, описывающие основные особенности объектно-ориентированного программирования на С++;
– объектно-ориентированные дополнения (создание нового класса, применение явного наследования и др.) и изменения, приводящие к усложнению варианта лабораторных работ.

В) Окончательно сформированное задание содержит файл описания word и файлы проекта *.ехе, *.cpp, *.h.

1 контрольная работа
вот: 1 прога 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
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
#include <iostream>
#include "main.hpp"
 
Person::Person() : id(0), name(NULL), gender(false), age(0.0) {
}
 
Person::Person(int id, const char *name, bool gender, double age)
    : id(id), name(strcpy(new char[strlen(name) + 1], name)),
    gender(gender), age(age) {
}
 
Person::Person(const Person &other) : id(other.getId()),
  name(strcpy(new char[strlen(other.getName()) + 1], other.getName())),
  gender(other.getGender()), age(other.getAge()) {
}
 
Person::~Person() {
  delete [] name;
}
 
Person &Person::operator=(const Person &other) {
  if (this != &other) {
    setId(other.getId());
    setName(other.getName());
    setGender(other.getGender());
    setAge(other.getAge());
  }
  return *this;
}
 
int Person::getId() const {
  return id; 
}
 
void Person::setId(int id) {
  this->id = id;
}  
 
const char *Person::getName() const {
  return name;
}
 
void Person::setName(const char *name) {
  delete [] this->name;
  this->name = strcpy(new char[strlen(name) + 1], name);
}
 
bool Person::getGender() const {
  return gender;
}
 
void Person::setGender(bool gender) {
  this->gender = gender;
}
 
double Person::getAge() const {
  return age;
}
 
void Person::setAge(double age) {
  this->age = age;
}
 
std::ostream &operator<<(std::ostream &stream, const Person &person) {
  return stream << "Person{" <<
    "id=" << person.getId() <<
    ", name=" << person.getName() <<
    ", gender=" << (person.getGender() ? "female" : "male") <<
    ", age=" << person.getAge() <<
    "}";
};
 
void Person::Print() const {
  std::cout << *this << std::endl;
}
 
void Person::Input() {
  int id;
  char name[1024];
  bool gender;
  double age;
  std::cout << "id: ";
  std::cin >> id;
  std::cout << "name: ";
  std::cin >> name;
  std::cout << "gender [0 - male, 1 - female]: ";
  std::cin >> gender;
  std::cout << "age: ";
  std::cin >> age;
  setId(id);
  setName(name);
  setGender(gender);
  setAge(age);
}
 
 
int main(int argc, char *argv[]) {
  Person ivan(0, "Ivan", false, 19.5);
  ivan.Print();
  
  Person *maria = new Person(1, "Maria", true, 21.1);
  maria->Print();
  delete maria;
  
  Person person;
  person.Input();
  person.Print();
  
  return 0;
}
вот 2 прога main.hpp
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
#ifndef MAIN_H_INCLUDED_
#define MAIN_H_INCLUDED_
#include <iostream>
#include <cstring>
 
class Person {
 public: 
  Person();
  Person(int id, const char *name, bool gender, double age);
  Person(const Person &other);
  virtual ~Person();
  Person &operator=(const Person &other);
  int getId() const;
  void setId(int id);
  const char *getName() const;
  void setName(const char *name);
  bool getGender() const;
  void setGender(bool gender);
  double getAge() const;
  void setAge(double age);
  friend std::ostream &operator<<(std::ostream &stream, const Person &person);
  
  void Print() const;
  void Input();
  
 private:
  int id;
  char *name;
  bool gender;
  double age;
};
#endif
2 контрольная работа

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
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
#include "group.hpp"
 
Group::Group(int size) : size(size), persons(new Person[size]) {
}
 
Group::Group(const Group &other) : size(0), persons(NULL) {
  copyFrom(other);
}
 
Group &Group::operator=(const Group &other) {
  if (this != &other) {
    copyFrom(other);
  }
  return *this;
}
 
Group::~Group() {
  delete [] persons;
}
 
const Person &Group::getPerson(int index) const {
  return persons[index];
}
 
void Group::setPerson(int index, const Person &person) {
  persons[index] = person;
}
 
int Group::getSize() const {
  return size;
}
 
void Group::copyFrom(const Group &other) {
  delete [] persons;
  size = other.getSize();
  persons = new Person[size];
  for (int i = 0; i < size; ++i)
    persons[i] = other.getPerson(i);
    
}
 
std::ostream &operator<<(std::ostream &stream, const Group &group) {
  for (int i = 0; i < group.getSize(); ++i)
    stream << group.getPerson(i) << std::endl;
  return stream;
}
 
double Group::getAverageAge(int limit) {
  double sum = 0;
  int count = 0;
  for (int i = 0; i < getSize(); ++i) {
    if (limit == -1 || getPerson(i).getAge() < limit) {
      sum += getPerson(i).getAge();
      ++count;
    }
  }
  return sum / count;
}
 
double Group::getAverageAge() {
  return getAverageAge(-1);
}
 
int Group::GetSize() const {
  return getSize();
}
 
const Person &Group::GetPerson(int i) const {
  return getPerson(i);
}
 
void Group::PutPerson(int i, const Person &man) {
  setPerson(i, man);
}
 
Person &Group::operator[](int index) {
  return persons[index];
}
 
const Person &Group::operator[](int index) const {
  return persons[index];
}
 
void Group::Print() const {
  std::cout << *this << std::endl;
}

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
24
25
26
27
28
29
30
31
#include <iostream>
#include "person.hpp"
#include "group.hpp"
 
int main(int argc, char *argv[]) {
  char names[][15] = {"Ivan", "Maria", "Petr", "Anna", "Vladimir"};
  
  Group group(5);
  
  bool gender = true;
  for (int i = 0; i < group.getSize(); ++i) {
    Person person(i, names[i], gender = !gender, 18. + i / 2.);
    group.PutPerson(i, person);
  }
 
  group.Print();
  
  double age = group.GetPerson(2);
  std::cout << group.GetPerson(2).getName() << " is " <<
    age << " years old." << std::endl;
  
  std::cout << "Average age is " << group.getAverageAge() << std::endl;
  std::cout << "Average age of younger than 19 y.o. is " << group.getAverageAge(19) << std::endl;
  
  group[3].Print();
  
  double sumAge = group[1] + group[3];
  std::cout << sumAge << std::endl;
  
  return 0;
}
3 прога
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
#include <iostream>
#include "person.hpp"
 
Person::Person() : id(0), name(NULL), gender(false), age(0.0) {
}
 
Person::Person(int id, const char *name, bool gender, double age)
    : id(id), name(strcpy(new char[strlen(name) + 1], name)),
    gender(gender), age(age) {
}
 
Person::Person(const Person &other) : id(other.getId()),
  name(strcpy(new char[strlen(other.getName()) + 1], other.getName())),
  gender(other.getGender()), age(other.getAge()) {
}
 
Person::~Person() {
  delete [] name;
}
 
Person &Person::operator=(const Person &other) {
  if (this != &other) {
    setId(other.getId());
    setName(other.getName());
    setGender(other.getGender());
    setAge(other.getAge());
  }
  return *this;
}
 
int Person::getId() const {
  return id; 
}
 
void Person::setId(int id) {
  this->id = id;
}  
 
const char *Person::getName() const {
  return name;
}
 
void Person::setName(const char *name) {
  delete [] this->name;
  this->name = strcpy(new char[strlen(name) + 1], name);
}
 
bool Person::getGender() const {
  return gender;
}
 
void Person::setGender(bool gender) {
  this->gender = gender;
}
 
double Person::getAge() const {
  return age;
}
 
void Person::setAge(double age) {
  this->age = age;
}
 
std::ostream &operator<<(std::ostream &stream, const Person &person) {
  return stream << "Person{" <<
    "id=" << person.getId() <<
    ", name=" << person.getName() <<
    ", gender=" << (person.getGender() ? "female" : "male") <<
    ", age=" << person.getAge() <<
    "}";
};
 
void Person::Print() const {
  std::cout << *this << std::endl;
}
 
void Person::Input() {
  int id;
  char name[1024];
  bool gender;
  double age;
  std::cout << "id: ";
  std::cin >> id;
  std::cout << "name: ";
  std::cin >> name;
  std::cout << "gender [0 - male, 1 - female]: ";
  std::cin >> gender;
  std::cout << "age: ";
  std::cin >> age;
  setId(id);
  setName(name);
  setGender(gender);
  setAge(age);
}
 
Person::operator double() const {
  return getAge();
}
 
double operator+(const Person &a, const Person &b) {
  return a.getAge() + b.getAge();
}
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
27.02.2013, 19:37     Программы на ОПП С++. 911 #4
Цитата Сообщение от syber2013 Посмотреть сообщение
Нашел в одной из тем программу
Вы выложили три. Какие будем удалять?
syber2013
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 11
27.02.2013, 19:54  [ТС]     Программы на ОПП С++. 911 #5
Извините за неправильное написание, очень торопился, скоро сдача контрольных. Я просмотрел много видео. Но программы можно прочитать правильно , хотя бы зная какое-то представление об С++. Кое-какие моменты мне становятся понятнее - но сам смысл могли бы кто-нибудь подсказать основываясь на задание. Если бы откликнулся @lemegeton - было бы у кого спросить конкретнее.

Нашел в одной из тем программы написанные на запрос по контрольной работе по ООП С++ форумчаниным @ lemegeton. Эти контрольные подходят и для моего варианта. Просьба откликнуться @lemegeton. Я новичок в ООП С++ и конкретно просьба моя заключается в помощи описания написанных листингов программ и добавления комментариев в программы. Пожалуйста помогите.
Или если кто поможет буду очень признателен.
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
27.02.2013, 19:56     Программы на ОПП С++. 911 #6
syber2013, вы зачем одно и тоже пишете три поста подряд? Вы что, попугай? И вы на вопрос не ответили.
Цитата Сообщение от HighPredator Посмотреть сообщение
Какие будем удалять?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
27.02.2013, 19:58     Программы на ОПП С++. 911 #7
Цитата Сообщение от syber2013 Посмотреть сообщение
Я просмотрел много видео. Но программы можно прочитать правильно , хотя бы зная какое-то представление об С++.
Разобраться в С++ можно только по книгам. По видео можно научиться Ubuntu ставить

Если lemegeton не откликнется, то врядли тебе кто-то весь код расжевывать будет. У тебя больше шансов получить помощь, если будешь задавать конкретные вопросы, а не "объясните несколько сотен строк кода".
syber2013
0 / 0 / 0
Регистрация: 24.02.2013
Сообщений: 11
27.02.2013, 20:06  [ТС]     Программы на ОПП С++. 911 #8
Спасибо за помощь ребята. Модератор удаляй тему. Толку никакого.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 20:13     Программы на ОПП С++. 911
Еще ссылки по теме:

Ребята, . пожалуйста! Вот текстовые программы. Вообще в строках не соображаю, прошу о .! программы на С++ C++
C++ Для тех кто имеет опыт по ОПП
опп класс и массив (создать массив указателей по выборке животных, участвующих в забеге) C++

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

Или воспользуйтесь поиском по форуму:
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
27.02.2013, 20:13     Программы на ОПП С++. 911 #9
На всякий случай с правилами форума ознакомьтесь: http://www.cyberforum.ru/announcement.php?a=3
 Комментарий модератора 
Закрыто.
Yandex
Объявления
27.02.2013, 20:13     Программы на ОПП С++. 911
Закрытая тема Создать тему
Опции темы

Текущее время: 21:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru