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

Динамический массив - C++

Восстановить пароль Регистрация
 
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
02.01.2014, 15:20     Динамический массив #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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
int i,j;
int M,N;
int n,m;//Размерность задачи
float *a;  //адрес массива запасов поставщиков
float *b;  //адрес массива потребностей потребителей
float **C; //адрес массива(двумерного) стоимости перевозки
float **X;//адрес массива(двумерного) плана доставки
 
 
 
int main()
{
    SetConsoleCP(1251);
SetConsoleOutputCP(1251);
    N=n;
    M=m;
    cout<<"Введите колличество поставщиков:  ";// Вводим колличество поствщиков
    cin>>N;
        cout<<"\n";
    cout<<"Введите колличество потребителей: ";// Вводим колличество потребителей
    cin>>M;
    cout<<"\n";
    a = new float[20];//+3
    // Вводим запасы поставщиков 
 
 
    for(i=0;i<N;i++)
    {
        cout<<"Введите запасы "<<i+1<< " поставщика: ";
        cin>>a[i];
    }
        cout<<"\n";
 
    // Вводим запасы потребителей
    b=new float[20];//+3
 
    for(j=0;j<M;j++)
    {
        cout<<"Введите потребность "<<j+1<< " потребителя: ";
        cin>>b[j];
    }
        cout<<"\n";
float** C=new float*[20];//+3
    for (i=0;i<20 ;i++)//+3
    C[i]=new float[20];//+3
 
    // Вводим массив стоимости.
    
         for(i=0;i<N;i++)
         
          for(j=0;j<M;j++)
          {
              cout<<"Введите стоимость перевозки от "<<i+1<<" поставщика к "<<j+1<<"  потребителю:  ";
              cin>>C[i][j];
          }
    
 
float Sa=0;
float Sb=0;
for(int i=0;i<N;i++)//находим суммарные запасы
{
    Sa=Sa+a[i];
}
 
for( j=0;j<M;j++)//находим суммарную потребность
{
    Sb=Sb+b[j];
}
if(Sa==Sb)cout<<"Транспортная задача - закрытая.";
     else
     {
       cout<<"Транспортная задача - открытая. \n";
 
        if(Sa>Sb)
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного потребителя ";
 
             M++; 
             for( i=0;i<=N;i++)
                C[M][i]=0;//стоимость перевозки фиктивному потребителю равна нулю
             b[M+1]=Sa-Sb;//спрос фиктивного потребителя
           }
        else
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного поставщика ";
             N++; 
           
             for(int j=0;j<=M;j++)
                   C[i][N]=0;//стоимость перевозки от фиктивного поставщика равна нулю
                   a[N+1]=Sb-Sa;//запас фиктивного поставщика
          }
       }
 
//***************************************************//
 
    //Двумерный массив для Доставки:
     float** X=new float*[20];//выделяем память под массив адресов начала строк
        for(int i=0;i<20;i++)
           X[i]=new float[20];//выделяем память для каждой строки
       /*
        В последней строке(столбце) массива Х будем записывать
        сумму заполненных клеток в соответствующем столбце(строке)
       */
        for(int i=0;i<N;i++)
        {    
            for(int j=0;j<M;j++)
         {
             X[i][j]=-1;//вначале все клетки не заполнены
             if(i==N)X[i][j]=0;//сумма заполненных клеток в j-м столбце
             if(j==M)X[i][j]=0;//сумма заполненных клеток в i-й строке
         }
        }
//***************************************************//
 
//-----------------Метод минимального элемента:
        int im;
        int jm;
        int kk=0;
        float Sij=0;
        do
        {
           int Cmin=-1;
           for(int i=0;i<N;i++)
             for(int j=0;j<M;j++)
               if(X[N][j]!=b[j])//если не исчерпана Потребность Bj
                 if(X[i][M]!=a[i])//если не исчерпан Запас Аі
                    if(X[i][j]<0)//если клетка ещё не заполнена
                      {
                        if(Cmin==-1)//если это первая подходящая ячейка
                           {
                            Cmin=C[i][j];
                            im=i;
                            jm=j;
                           }
                        else //если это не первая подходящая ячейка
                          if(C[i][j]<Cmin)//если в ячейке меньше,чем уже найдено
                            {
                              Cmin=C[i][j];
                              im=i;
                              jm=j;
                             }
                        }
                
               X[im][jm]=min(a[im]-X[im][M],b[jm]-X[N][jm]);//выбираем поставку
               X[N][jm]=X[N][jm]+X[im][jm];//добавляем поставку jm-му потребителю
               X[im][M]=X[im][M]+X[im][jm];//добавляем поставку im-му поставщику
               Sij=Sij+X[im][jm]; //Подсчёт суммы добавленых поставок
               
              
        } while(Sij<max(Sa,Sb));//условие продолжения
 
        int L=0;
        for(int i=0;i<N;i++)
          for(int j=0;j<M;j++)
            if(X[i][j]>=0)L++;//подсчёт заполненных ячеек
        int d=M+N-1-L;//если d>0,то задача - вырожденная,придётся добавлять d нулевых поставок
        int d1=d;//запоминаем значение d
            cout<<"\n";
        cout<<" Начальный опорный план: \n";
            cout<<"\n";
         for(int i=0;i<N;i++)
         {
          for(int j=0;j<M;j++)
          { 
              if (X[i][j]==-1)
                  X[i][j]=0;
 
              cout<<X[i][j]<<" \t ";
          }
 
 
 
 
            cout<<"\n";
        }
         int Sum=0;
 for(int i=0;i<N;i++)
         {
          for(int j=0;j<M;j++)
          {   
              Sum+=X[i][j]*C[i][j];
          }
 }
    cout<<"\n";
    cout<<"Сумма перевозок равно:   "<<Sum;
    cout<<"\n";
 
        // return 0;
system("pause");
}
Подскажите в чем проблема.
Векторы думал использовать, но хочется оформить через массивы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2014, 15:20     Динамический массив
Посмотрите здесь:

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла C++
динамический массив (Целое число разложить на массив простых множителей) C++
Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив C++
C++ Переделать динамический массив на статический массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
02.01.2014, 16:23     Динамический массив #2
Скорее всего проблема с выделением памяти.Вы объявили размеры M,N,а память выделяете под фиксированный размер [20]
C++
1
2
  a = new float[20];//+3
    // Вводим запасы поставщиков
и
C++
1
2
3
float** C=new float*[20];//+3
    for (i=0;i<20 ;i++)//+3
    C[i]=new float[20];//+3
попробуйте
C++
1
2
3
float** C=new float*[N];//+3
    for (i=0;i<20 ;i++)//+3
    C[i]=new float[M];//+3
и
C++
1
2
  a = new float[N];//+3
    // Вводим запасы поставщиков
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
02.01.2014, 17:50  [ТС]     Динамический массив #3
С 20 это уже мои "экспиременты".
Я выделил памяти под размер, который будет на 100% больше чем то , который введен. А М и Н сделал как простые ограничения, и уже после к М или Н прибавлял 1 и просто смещал границу.
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,787
02.01.2014, 19:24     Динамический массив #4
Цитата Сообщение от Lotus34 Посмотреть сообщение
Имеется код, решающий транспортную задачу.
решение методом минимального элемента ? Он же не оптимальный.

Добавлено через 36 минут
А, ну по поводу проблемы, то вы запутались в индексациях.
C++
1
2
3
M++; 
 for( i=0;i<=N;i++)
 C[M][i]=0;//стоимость перевозки фиктивному потребителю равна нулю
откуда вы берете <=?
далее, M-столбцы, а вы меняете по строкам.
Дальше, вы изменили М++, а обращаетесь потом к M (а надо M-1)

C++
1
2
3
N++; 
for(int j=0;j<=M;j++)
 C[i][N]=0;
Тут у вас цикл по J, а меняете по I.
Остальные ошибки те же, что в том случае.
В итоге:
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
if(Sa==Sb)cout<<"Транспортная задача - закрытая.";
     else
     {
       cout<<"Транспортная задача - открытая. \n";
 
        if(Sa>Sb)
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного потребителя ";
 
             M++; 
             for( i=0;i<N;i++)
                C[i][M-1]=0;//стоимость перевозки фиктивному потребителю равна нулю
             b[M+1]=Sa-Sb;//спрос фиктивного потребителя
           }
        else
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного поставщика ";
             N++; 
           
             for(int j=0;j<M;j++)
                   C[N-1][j]=0;//стоимость перевозки от фиктивного поставщика равна нулю
                   a[N+1]=Sb-Sa;//запас фиктивного поставщика
          }
       }
        cout<<endl;
         for(i=0;i<N;i++){
          for(j=0;j<M;j++)
          {
              cout<<C[i][j]<<" ";
          }
          cout<<endl;
         }
И от глобальных переменных в такой реализации лучше избавиться.
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
02.01.2014, 20:01  [ТС]     Динамический массив #5
Данный метод использую так как, задание было с нахождение опорного плана именно методом минимального элемента.
А поп поводу ошибок, спасибо, буду думать, исправлять.

Дальше, планирую через потенциалы привести к оптимальному, но это уже другая история)
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,787
02.01.2014, 22:19     Динамический массив #6
Цитата Сообщение от Lotus34 Посмотреть сообщение
Дальше, планирую через потенциалы привести к оптимальному, но это уже другая история)
Я когда то программировал этот метод, с зацикливанием пришлось повозиться
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
03.01.2014, 12:09  [ТС]     Динамический массив #7
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Я когда то программировал этот метод, с зацикливанием пришлось повозиться
Я готов к таким трудностям, буду стараться, для себя все же, а не для какого либо препода)
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
04.01.2014, 12:58  [ТС]     Динамический массив #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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <stdio.h>
#include <windows.h>
using namespace std;
int i,j;
int M,N;
int n,m;//Размерность задачи
float *a;  //адрес массива запасов поставщиков
float *b;  //адрес массива потребностей потребителей
float **C; //адрес массива(двумерного) стоимости перевозки
float **X;//адрес массива(двумерного) плана доставки
 
//void zapolnenie()
//{
//}
 
 
 
int main()
{
    SetConsoleCP(1251);
SetConsoleOutputCP(1251);
    N=n;
    M=m;
    cout<<"Введите колличество поставщиков:  ";// Вводим колличество поствщиков
    cin>>N;
        cout<<"\n";
    cout<<"Введите колличество потребителей: ";// Вводим колличество потребителей
    cin>>M;
    cout<<"\n";
    a = new float[N+3];//+3
    // Вводим запасы поставщиков 
 
 
    for(i=0;i<N;i++)
    {
        cout<<"Введите запасы "<<i+1<< " поставщика: ";
        cin>>a[i];
    }
        cout<<"\n";
 
    // Вводим запасы потребителей
    b=new float[M+3];//+3
 
    for(j=0;j<M;j++)
    {
        cout<<"Введите потребность "<<j+1<< " потребителя: ";
        cin>>b[j];
    }
        cout<<"\n";
float** C=new float*[N+3];
for (i=0;i<N+3; i++)
C[i]=new float[M+3];//+3
 
    // Вводим массив стоимости.
    
         for(i=0;i<N;i++)
         
          for(j=0;j<M;j++)
          {
              cout<<"Введите стоимость перевозки от "<<i+1<<" поставщика к "<<j+1<<"  потребителю:  ";
              cin>>C[i][j];
          }
 //Двумерный массив для Доставки:
        X=new float*[N+1+2];//выделяем память под массив адресов начала строк
        for(int i=0;i<N+1+2;i++)
           X[i]=new float[M+1+2];//выделяем память для каждой строки
       /*
        В последней строке(столбце) массива Х будем записывать
        сумму заполненных клеток в соответствующем столбце(строке)
       */
        for(int i=0;i<N+1;i++)
          for(int j=0;j<M+1;j++)
            {
               X[i][j]=-1;//вначале все клетки не заполнены
               if(i==N)X[i][j]=0;//сумма заполненных клеток в j-м столбце
               if(j==M)X[i][j]=0;//сумма заполненных клеток в i-й строке
            }
 
//  zapolnenie();
float Sa=0;
float Sb=0;
for(int i=0;i<N;i++)//находим суммарные запасы
{
    Sa=Sa+a[i];
}
 
for( j=0;j<M;j++)//находим суммарную потребность
{
    Sb=Sb+b[j];
}
 
 
if(Sa==Sb)cout<<"Транспортная задача - закрытая.";
     else
     {
       cout<<"Транспортная задача - открытая. \n";
 
        if(Sa>Sb)
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного потребителя ";
 
             M++; 
             for( i=0;i<N;i++)
                C[i][M-1]=0;//стоимость перевозки фиктивному потребителю равна нулю
             b[M+1]=Sa-Sb;//спрос фиктивного потребителя
           }
        else
         {
           cout<<"Преобразуем задачу в закрытую путём добавления фиктивного поставщика ";
             N++; 
           
             for(int j=0;j<M;j++)
                   C[N-1][j]=0;//стоимость перевозки от фиктивного поставщика равна нулю
                   a[N+1]=Sb-Sa;//запас фиктивного поставщика
          }
       }
        cout<<endl;
         for(i=0;i<N;i++){
          for(j=0;j<M;j++)
          {
              cout<<C[i][j]<<" ";
          }
          cout<<endl;
         }
//-----------------Метод минимального элемента:
        int im;
        int jm;
        int kk=0;
        float Sij=0;
        do
        {
           int Cmin=-1;
           for(int i=0;i<N;i++)
             for(int j=0;j<M;j++)
               if(X[N][j]!=b[j])//если не исчерпана Потребность Bj
                 if(X[i][M]!=a[i])//если не исчерпан Запас Аі
                    if(X[i][j]<0)//если клетка ещё не заполнена
                      {
                        if(Cmin==-1)//если это первая подходящая ячейка
                           {
                            Cmin=C[i][j];
                            im=i;
                            jm=j;
                           }
                        else //если это не первая подходящая ячейка
                          if(C[i][j]<Cmin)//если в ячейке меньше,чем уже найдено
                            {
                              Cmin=C[i][j];
                              im=i;
                              jm=j;
                             }
                        }
                
               X[im][jm]=min(a[im]-X[im][M],b[jm]-X[N][jm]);//выбираем поставку
               X[N][jm]=X[N][jm]+X[im][jm];//добавляем поставку jm-му потребителю
               X[im][M]=X[im][M]+X[im][jm];//добавляем поставку im-му поставщику
               Sij=Sij+X[im][jm]; //Подсчёт суммы добавленых поставок
               
              
        } while(Sij<max(Sa,Sb));//условие продолжения
 
        int L=0;
        for(int i=0;i<N;i++)
          for(int j=0;j<M;j++)
            if(X[i][j]>=0)L++;//подсчёт заполненных ячеек
        int d=M+N-1-L;//если d>0,то задача - вырожденная,придётся добавлять d нулевых поставок
        int d1=d;//запоминаем значение d
            cout<<"\n";
        cout<<" Начальный опорный план: \n";
            cout<<"\n";
         for(int i=0;i<N;i++)
         {
          for(int j=0;j<M;j++)
          { 
              if (X[i][j]==-1)
                  X[i][j]=0;
 
              cout<<X[i][j]<<" \t ";
          }
 
 
 
 
            cout<<"\n";
        }
         int Sum=0;
 for(int i=0;i<N;i++)
         {
          for(int j=0;j<M;j++)
          {   
              Sum+=X[i][j]*C[i][j];
          }
 }
    cout<<"\n";
 cout<<"Сумма перевозок равно:   "<<Sum;
cout<<"\n";
 
//       return 0;
system("pause");
}
Добавлено через 7 минут
Насколько я понимаю, проблема с массивом X и я видимо снова накосячил с индексацией.
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,787
04.01.2014, 14:50     Динамический массив #9
Цитата Сообщение от Lotus34 Посмотреть сообщение
Насколько я понимаю, проблема с массивом X и я видимо снова накосячил с индексацией.
Не думаю, что тут ошибка в индексации.
Вы для поставок создаете отдельный массив X?
Мне не нравиться ваш выход из цикла. И не совсем ясна вот эта строчка:
C++
1
X[im][jm]=min(a[im]-X[im][M],b[jm]-X[N][jm]);
Вы должны не просто присвоить меньшее из значений, а "обнулить" его.
C++
1
2
3
X[N][jm]=X[N][jm]+X[im][jm];//добавляем поставку jm-му потребителю
X[im][M]=X[im][M]+X[im][jm];//добавляем поставку im-му поставщику
 Sij=Sij+X[im][jm]; //Подсчёт суммы добавленых поставок
Что вы хотите тут сделать?
Lotus34
5 / 6 / 1
Регистрация: 26.10.2012
Сообщений: 124
04.01.2014, 15:21  [ТС]     Динамический массив #10
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Что вы хотите тут сделать?
Ну, если честно, то данный фрагмент не моих рук дело. Данное задание было "парным", но второй член команды решился взять реализацию на с++ на себя, т.к я не очень в си и хотел реализовать через маткад.
Но его идея прогорела и мне достался на треть рабочий код, который только считал закрытые задачи 2 на 2.
Все начало кода , все моменты с внесением данных я поправил и код начал считать закрытые задачи любого размера.
Потом, с вашей помощью, код начал подводить задачи с открытого типа к закрытому, но дальше не считает.
Мне , если честно, самому жуть как не нравиться , но когда я начал пытаться сделать с нуля, то запутался вконец и перестало работать абсолютно все, ну я и решил помучатся с более или менее рабочим куском кода от моего товарища.
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,787
04.01.2014, 16:02     Динамический массив #11
Цитата Сообщение от Lotus34 Посмотреть сообщение
Мне , если честно, самому жуть как не нравиться , но когда я начал пытаться сделать с нуля, то запутался вконец и перестало работать абсолютно все, ну я и решил помучатся с более или менее рабочим куском кода от моего товарища.
Советую написать заново, алгоритм метода довольно простой.
Но можно попробывать переделать этот. Так что пробуем переделать?

Цитата Сообщение от Lotus34 Посмотреть сообщение
Но его идея прогорела и мне достался на треть рабочий код, который только считал закрытые задачи 2 на 2.
Все начало кода , все моменты с внесением данных я поправил и код начал считать закрытые задачи любого размера.
странно, если он был рабочий, то привидением к закрытой задачи его "не испортишь".

Добавлено через 13 минут
Вот так правильнее будет заполнять опорный план:
C++
1
2
3
4
5
6
7
8
9
10
11
12
 if(a[im]>=b[jm]){
 
                   a[im]-=b[jm];
                   X[im][jm]=b[jm];
                   b[jm]=0;
               }
               else if(a[im]<b[jm]){
 
                   b[jm]-=a[im];
                   X[im][jm]=a[im];
                   a[im]=0;
               }
(если я правильно понял назначение X)

теперь останется только повозиться с условиями выбора максимума и выхода из цикла.

И какая разница первая ячейка или нет?

Добавлено через 8 минут
Условия, наверное, можно как-то так совместить:
C++
1
2
3
4
5
6
         if(X[N][j]!=0 && X[i][M]!=0 && X[i][j]==-1 && C[i][j]<Cmin)
                            {
                              Cmin=C[i][j];
                              im=i;
                              jm=j;
                             }
Добавлено через 9 минут
нет, условия будут немного не такие. Вы же храните поставки в разных массивах:
C++
1
if(b[j]!=0 && a[i]!=0 && X[i][j]==-1 && C[i][j]<Cmin)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2014, 19:03     Динамический массив
Еще ссылки по теме:

Двумерный массив (поменять статический массив на динамический) C++
Заполнить динамический массив из файла и записать массив обратно в файл C++
C++ Массив и память. Как создать динамический массив?

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

Или воспользуйтесь поиском по форуму:
Taatshi
Администратор
 Аватар для Taatshi
11206 / 4791 / 247
Регистрация: 05.04.2011
Сообщений: 13,321
Записей в блоге: 2
04.01.2014, 19:03     Динамический массив #12
Lotus34, не нужно цитировать все предыдущие сообщения собеседника, тем более полностью. Пользуйтесь кнопкой "Ответить" внизу темы.
Yandex
Объявления
04.01.2014, 19:03     Динамический массив
Ответ Создать тему
Опции темы

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