Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236

При большом значении переменной цикла программа зависает

17.09.2020, 10:27. Показов 4110. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Python
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
from graph import *
 
windowSize(1919, 1079)
canvasSize(1919, 1079)
 
#рисует поточечно
#viewCoords(1919, 0, 1079, 0)
 
penColor("red")
penSize(1) 
a=[[0,1000],[950,0],[1900,1000],[950,1000]]
#a=[[0,1079],[959,0],[1919,1079],[959,1079]]
point(a[0][0], a[0][1])
point(a[1][0], a[1][1])
point(a[2][0], a[2][1])
 
import random
random.seed()
i=0
while i<100000:
   rnd=(random.randint(1,3))
   if rnd==1:
      a[3][0]=(a[0][0]+a[3][0])/2
      a[3][1]=(a[0][1]+a[3][1])/2
   elif rnd==2:
      a[3][0]=(a[1][0]+a[3][0])/2
      a[3][1]=(a[1][1]+a[3][1])/2
   elif rnd==3:
      a[3][0]=(a[2][0]+a[3][0])/2
      a[3][1]=(a[2][1]+a[3][1])/2
   point(a[3][0], a[3][1])
   i+=1
run()
Когда в 20 строке while i<100000: вместо 100 000 устанавливаю 1 000 000, программа как правило зависает, но иногда и выполняется успешно.

Если треугольник заменить на шестиугольник, то уже при 200 000 зависает.
Время работы программы должно быть пропорциональным количеству итераций, и что 1 млн будет выполняться больше 100к в 10 раз, понимаю. Но при 100к время вывода измеряется в секундах, то для 1 млн ждал больше часа и ничего не получил.

Мощности ПК достаточно (i3 8100, ОЗУ 16Gb)

Как верхний левый угол окна совместить с соответствующим углом монитора?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.09.2020, 10:27
Ответы с готовыми решениями:

При каком наименьшем введённом значении переменной s программа выведет число 64
Здравствуйте, киберфомурчане. Задача на ЕГЭ номер 6: Определите, при каком наименьшем введённом значении переменной s программа...

Макрос выдает ошибку при большом значении
Друзья, доброго времени суток! Написал макрос на сцепление ячеек. Макрос отодвигает таблицу вправо и в свободных ячейках сцепляет...

Определите, при каком наименьшем введённом значении переменной s программа выведет число 60
Определите, при каком наименьшем введённом значении переменной s программа выведет число 60. Для Вашего удобства программа представлена на...

30
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
23.09.2020, 12:36
Непонятно, что хотите сделать.
Сначала я заметил, что индексы хорошие, можно использовать numpy. Потом я заметил, что у вас получается всего три фиксированых значения. Зачем гонять их миллион раз?
Непонятно, что такое point, вероятно, затык в нём.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
05.10.2020, 13:49  [ТС]
Программа рисует фрактал (см. вложенный файл).
Задано три вершины треугольника [0,1000],[950,0],[1900,1000] и еще одна 4-тая точка [950,1000].
Следующая точка будет построена посредине между 4-той точкой и случайно выбранной одной из вершин треугольника.
Новою построенную точку назовем 4-той и продолжаем читать текст с предыдущего предложения.

point - функция из библиотеки Graph:
point(x, y)
point(x, y, color)
нарисовать точку цвета c с координатами (x,y); если цвет не задан, используется текущий цвет линии, установленный ранее с помощью команды penColor; функция возвращает ссылку на объект-точку.
Миниатюры
При большом значении переменной цикла программа зависает  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.10.2020, 14:36
Рекурсия? Без функции?
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
05.10.2020, 15:54  [ТС]
Нет там рекурсии, только цикл.
Есть три фиксированных точки (А,Б,С - вершины) и одна бегающая точка (Д).

На первой итерации выбирается случайным образом одна из вершин (например выбралась вершина С). Ищем средину отрезка ДС и строим точку в средине отрезка. Точке Д присваиваем координаты средины отрезка. На этом первая итерация окончена.

На второй итерации выбирается случайным образом одна из вершин (например выбралась вершина А). Ищем средину отрезка ДА и строим точку в средине отрезка. Точке Д присваиваем координаты средины отрезка. На этом вторая итерация окончена.

И так 100 000 раз.
Результат работы программы в прикрепленном файле выше.
Но если увеличивать число итераций до 1 000 000, программа в основном виснет, но иногда и выполняется.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.10.2020, 16:02
SergeyKorotun, а, понятно, всё ок.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
06.10.2020, 15:05  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
а, понятно, всё ок.
Если бы не
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Но если увеличивать число итераций до 1 000 000, программа в основном виснет, но иногда и выполняется.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
06.10.2020, 15:12
SergeyKorotun, ну что, смотреть надо. По идее, миллион для такого кода, без point - это немного. Посмотреть, что в point.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
08.10.2020, 10:29  [ТС]
Python
1
2
3
4
5
6
7
def point(x, y, col = -1):
  old_col = penColor()
  if col != -1: penColor(col)
  moveTo(x, y)
  pt = lineTo(x+1,y)
  penColor(old_col)
  return pt
Библиотека в прикрепленном в файле
Вложения
Тип файла: zip pygraph.zip (1.35 Мб, 3 просмотров)
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.10.2020, 12:11
SergeyKorotun, рисование? Ну, рисование вообще операция не быстрая. Зависит от обстоятельств. Anti-aliasing там, свистелки-...

Добавлено через 1 час 11 минут
Кроме того, рисование с такой точностью - миллион шагов рекурсии - не имеет смысла. Даже 100 тыс. не имеет. Просто 100 - за глаза хватит.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
08.10.2020, 13:32  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
миллион шагов рекурсии
нет там рекурсии
Цитата Сообщение от dondublon Посмотреть сообщение
не имеет смысла
имеет, на мониторе 8к, например.
Если бы пикселей на мониторе было столько, сколько точек на части плоскости, совпадающей с экраном, то все точки имели бы разные координаты и имел бы смысл не только миллион итераций, и и бесконечное число итераций.
Цитата Сообщение от dondublon Посмотреть сообщение
Просто 100 - за глаза хватит
Вы уверены? Смотрите прикрепленный файл. Может вы сначала видите белый лист, но присмотритесь повнимательнее, там есть сто точек (на самом деле даже не точек, а отрезков длиной в два пикселя). Вы и после этого уверены, что 100 точек достаточно?
Миниатюры
При большом значении переменной цикла программа зависает  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.10.2020, 14:33
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
нет там рекурсии
Формально можно сказать что нет, т. к. нет функции, по смыслу же тут именно рекурсия.

Цитата Сообщение от SergeyKorotun Посмотреть сообщение
имеет, на мониторе 8к, например.
А какая разница при сравнении с обычным ныне 1920*1080? Допустим, для такого монитора приемлемым качеством является n шагов. На каждый шаг рисунок делается в 2 раза точнее. Тогда для 4к вам надо на 1 шаг больше, n+1, для 8 k - на 2 шага, n+2. Нет тут миллионов, даже тысяч нет.

Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Вы уверены? Смотрите прикрепленный файл. Может вы сначала видите белый лист, но присмотритесь повнимательнее, там есть сто точек (на самом деле даже не точек, а отрезков длиной в два пикселя). Вы и после этого уверены, что 100 точек достаточно?
Я уверен И я говорил не о ста точках, а о ста шагах рекурсии.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
08.10.2020, 14:50  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Формально можно сказать что нет, т. к. нет функции, по смыслу же тут именно рекурсия.
покажите ту часть кода, где вы видите рекурсии в каком либо проявлении.
В цикле при первой итерации вызывается функция point(), которая выполняется от А до Я и возвращает значение.
На второй итерации вызывается функция point(), которая выполняется от А до Я и возвращает значение и нигде не использует данные из функции, вызванной при первой итерации. И т.д. Неужели это рекурсивный вызов?
Цитата Сообщение от dondublon Посмотреть сообщение
Я уверен И я говорил не о ста точках, а о ста шагах рекурсии.
Если б даже была рекурсия, то и в этом случае 100 рекурсий нарисуют 100 точек. Нет здесь удвоения количества точек на каждом шаге цикла, а всего лишь добавление 1 пикселя.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.10.2020, 15:30
SergeyKorotun, ещё раз: формально можно сказать, что рекурсии нет, поскольку нет функции. По смыслу - программа рисует именно рекурсивный рисунок, это же очевидно по вашей иллюстрации.

Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Если б даже была рекурсия, то и в этом случае 100 рекурсий нарисуют 100 точек. Нет здесь удвоения количества точек на каждом шаге цикла, а всего лишь добавление 1 пикселя.
А тут уж как запрограммируете Если у вас добавление 1 пикселя - да, но это же просто медленное мучение.
Я бы сделал так. На каждой итерации программа рисует три точки + три внутренних треугольника. Сколько точек тут несущественно, а вот тройной вызов рекурсии - да.
Допустим, нулевом рисовалась бы одна точка, просто для простоты понимания. На первом шаге - 3, на втором - 9 и т. д.
3**13 уже = полтора миллиона. Для справки: 1920*1080 будет чуть больше двух миллионов.

Добавлено через 5 минут
И ещё я бы не рисовал точки, а рисовал бы треугольники. Один чёрный треугольник, вершиной вверх. Потом на нём - белые, рекурсивно. 13 шагов - выше крыши.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
08.10.2020, 15:33  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Я бы сделал так. На каждой итерации программа рисует три точки + три внутренних треугольника.
Как она может рисовать в одной итерации три точки, если для расчета следующей точки нужно знать координаты предыдущей.
Цитата Сообщение от dondublon Посмотреть сообщение
+ три внутренних треугольника
Где вы в коде увидели построение треугольников?
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.10.2020, 15:59
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Как она может рисовать в одной итерации три точки, если для расчета следующей точки нужно знать координаты предыдущей.
Не вижу проблемы. Вот зачем вам для строго детерминированного рисунка понадобились случайные величины - и правда, вопрос.
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Где вы в коде увидели построение треугольников?
На рисунке. Есть такое выражение, "за деревьями видеть лес".
Решил нарисовать такое вот. 9 шагов, если что. Рисуется в момент.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
08.10.2020, 20:36  [ТС]
Вы построили треугольник Серпинского итеративным методом.
Запуская поочередно программу, вы будете получать одну и ту же картинку. Это неинтересно. Вы получили тот рисунок, что ожидали от программы. Вы можете показать код программисту, и он, не выполняя программу, скажет что собой будет представлять рисунок.

Мне больше нравится данный треугольник, построенный методом хаоса. Уверен, что никто из тех, кто не знал за этот треугольник, не сможет предугадать по коду, что в итоге получится. Логичным будет ответ, что получится более-менее равномерно заполненный точками треугольник.
При большом количестве итераций вам будет казаться, что вы получаете идентичные изображения, как вам кажется, что все мухи одинаковые. На самом деле, все рисунки будут разные, вы же видите, что все люди вроде бы одинаковые (две руки, две ноги, голова, ...), но в то же время вы видите, что все они чем то отличаются.
Фракталы, построенные методом хаоса, объясняют причину разнообразия мира (люди отличаются друг от друга, деревья все разные, ...). Задан закон построения (в яйцелетке, в семечке, ...), но случайные величины вносят свой вклад в разнообразие.
Фракталы, постоенные методом хаоса - это порядок в хаосе.

В связи вашим с высоким рейтингом я не могу вам не отвечать. Если можете, помогите понять причину, почему при цикле с количеством итераций ~250 000 и более программа виснет. Еще раз: никаких ни явных, не скрытых рекурсивных вызовов в коде нет, никаких переполнений стека быть не может. Мне совсем не интересен фрактал, полученный вашим кодом в предыдущем сообщении (т.е. люди-клоны неинтересны). Только поточечный.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
09.10.2020, 08:55
SergeyKorotun, я понял.
Рекурсивный по смыслу вызов в коде есть, просто он получается чуть сложнее. Случайно тут происходит только выбор вершины. На больших масштабах с тем же успехом можно их перебирать по порядку.
Насчёт хаоса - громко сказано, но почему бы и не доказать, что построеное таким образом можество точек будет не равномерно заполненным треугольником, а вот таким фрактальным.

Во-первых, рекомендую перейти на numpy. В данной программе радикального прироста это не даст, но код будет чуть более читаемый. + Перейти на явную рекурсию, тоже для читаемости. Наличие случайности не отменяет самой рекурсии. Если рисовать по одной точке за шаг - то вылетит со stack overflow, но если по три - будет всё ок.

Во-вторых и в главных. Наверняка наибольшие потери времени у вас на отрисовке. И наверняка многие точки у вас рисуются по 2 и более раз. Отсюда вывод. Делаете буфер - двумерный массив, булевый, желательно numpy - и во время долгого цикла заполняете его. После цикла пробегаете по массиву и только тогда рисуете точки.
0
29 / 22 / 8
Регистрация: 10.05.2013
Сообщений: 236
09.10.2020, 10:15  [ТС]
Цитата Сообщение от dondublon Посмотреть сообщение
Рекурсивный по смыслу вызов в коде есть, просто он получается чуть сложнее.
Нет рекурсии. На очередной итерации значение координат вершин треугольника хранятся в переменных, также как и координаты последней нарисованной точки. Функция point() также полностью отработала и стек освободила.
Цитата Сообщение от dondublon Посмотреть сообщение
Случайно тут происходит только выбор вершины. На больших масштабах с тем же успехом можно их перебирать по порядку.
Нельзя. Получится треугольник, построенный итеративным методом (т.е. треугольник клон). Порядок будет, но без хаоса.
Цитата Сообщение от dondublon Посмотреть сообщение
Насчёт хаоса - громко сказано, но почему бы и не доказать, что построенное таким образом множество точек будет не равномерно заполненным треугольником, а вот таким фрактальным.
Это давно уже доказано. Но если дать этот алгоритм человеку с развитым логическим мышлением, он никогда не угадает, что собой будет представлять построенное изображение.
Цитата Сообщение от dondublon Посмотреть сообщение
Перейти на явную рекурсию, тоже для читаемости.
Не представляю зачем здесь рекурсия и даже как реализовать код через рекурсию. Еще раз алгоритм:
1. Задаются координаты вершин исходного треугольника. 1-це ставим в соответствие первую вершину треугольника, 2 - вторую, 3 - третью.
2. Задаем некоторую произвольную начальная точка с координатами (x4,y4)
3. Генерируем случайное число из множества {1, 2, 3}.
4. Выбираем одну из вершин треугольника, соответствующую полученному случайному числу в пункте 2.
5. Строится точка с новыми координатами: x=(xv+x4)/2 y=(yv+y4)/2, где: xv и yv - координаты выбранной вершины
6. x4=x, y4=y
5. Возврат к началу цикла, т.е. к пункту 3.
Цитата Сообщение от dondublon Посмотреть сообщение
Во-первых, рекомендую перейти на numpy
Если снять комментарий со строки кода:
#viewCoords(1919, 0, 1079, 0)
изображение будет выводится поточечно, а не как сейчас: все точки одновременно. Наблюдать можно часами.
Цитата Сообщение от dondublon Посмотреть сообщение
Если рисовать по одной точке за шаг - то вылетит со stack overflow
stack на 1 шаге итераций и на любом итом шаге одинаково заполнен.
Цитата Сообщение от dondublon Посмотреть сообщение
но если по три - будет всё ок
Где же взять их координаты? Чтобы рассчитать следующую, нужно знать координаты предыдущей.
Цитата Сообщение от dondublon Посмотреть сообщение
И наверняка многие точки у вас рисуются по 2 и более раз
Если даже выполнять цикл с бесконечным числом итераций, все рассчитанные (на "идеальном"(без ограничений разрядности) компьютере ) координаты точек будут разные. Если бы монитор был "идеальный", то точки не накладывались бы.
Цитата Сообщение от dondublon Посмотреть сообщение
Отсюда вывод. Делаете буфер - двумерный массив, булевый, желательно numpy - и во время долгого цикла заполняете его. После цикла пробегаете по массиву и только тогда рисуете точки.
Не подходит. Хочется наблюдать за поточечным построением.

На паскале когда то писал, работает с любым числом итераций. Но хочется перейти на пайтон.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
09.10.2020, 10:27
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Где же взять их координаты? Чтобы рассчитать следующую, нужно знать координаты предыдущей.
Вы берёте одну точку (x4, y4)? Строите одну, соответствующую ей? А можете взять несколько. Это также ответ на вопрос
Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Где же взять их координаты? Чтобы рассчитать следующую, нужно знать координаты предыдущей.
Рекурсия - поскольку алгоритм повторяется для каждой тройки вершин.

Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Если даже выполнять цикл с бесконечным числом итераций, все рассчитанные (на "идеальном"(без ограничений разрядности) компьютере ) координаты точек будут разные. Если бы монитор был "идеальный", то точки не накладывались бы.
Ну так округляйте до целого, вроде должно быть понятно, по вашей квалификации.

Цитата Сообщение от SergeyKorotun Посмотреть сообщение
Не подходит. Хочется наблюдать за поточечным построением.
Тогда вы обречены Можно, конечно, чуток помозговать над прорисовкой - убрать манипуляцию с цветами, рисовать точку вместо линии - но радикально там ничего не ускорите.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2020, 10:27
Помогаю со студенческими работами здесь

При каком наибольшем натуральном значении переменной x программа выведет сначала 28, а потом 17?
Ниже записана программа. Получив на вход число x, эта программа печатает числа a и b. При каком наибольшем натуральном значении переменной...

Определите, при каком наименьшем выведенном значении переменной S программа выведет число 32
Определите, при каком наименьшем выведенном значении переменной S программа выведет число 32. С помощью программы. var k,s:integer;...

При каком наименьшем и наибольшем введённом значении переменной s программа выведет число 542
Определите, при каком наименьшем и наибольшем введённом значении переменной s программа выведет число 542. Для Вашего удобства программа...

Определите, при каком наименьшем введённом значении переменной s программа выведет число 1024
Определите, при каком наименьшем введённом значении переменной s программа выведет число 1024. for i in range(1000): s = i ...

Зависает программа при использовании цикла while
При открытии второй формы добавил цикл который будет принимать данные от сокет сервера, но когда открывается вторая форма - программа...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru