Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 62
1

Перевести в Pascal

07.03.2019, 21:49. Показов 991. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пожалуйста перевидите в паскалью
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
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
#define OWNERS 30
#define BRANDS 5
#define MAX_BRAND_LENGTH 18
 
struct owner {
    char name[15];
    int year;
    char brand[MAX_BRAND_LENGTH];
    int number;
    char address[25];
};
 
char brands[BRANDS][MAX_BRAND_LENGTH] = {
    "audi",
    "mercedes",
    "honda",
    "ferrari",
    "mitsubishi"
};
 
char get_random_symbol()
{
    int random_symbol = 65 + rand() % 59;
    if( random_symbol > 90 && random_symbol < 97 ) random_symbol = 32;
    return (char)random_symbol;
}
 
struct owner owners[OWNERS];
 
void set_random_owner(int x)
{
    for( int i = 0; i < 14; ++i ) {
        owners[x].name[i] = get_random_symbol();
        owners[x].address[i] = get_random_symbol();
    }
    owners[x].name[14] = '\0';
    owners[x].address[14] = '\0';
    owners[x].year = 1960 + rand() % 55;
    owners[x].number = 1 + rand() % 999;
    strcpy( owners[x].brand, brands[ rand() % BRANDS ] );
}
 
void chomp(char* str)
{
    do {
        if( *str == '\n' ) *str = '\0';
    } while( *str++ );
}
 
int main(int argc, char* argv[])
{
    srand(time(NULL));
 
    int i;
    for( i = 0; i < OWNERS; ++i ) {
        set_random_owner(i);
    }
 
    char buf[MAX_BRAND_LENGTH + 2];
    int counter;
 
    while( true ) {
        counter = 0;
        puts("Enter vehicle brand");
        fgets(buf, MAX_BRAND_LENGTH + 2, stdin);
        if( buf[0] == '\n' ) break;
        chomp(buf);
        strlwr(buf);
        for( i = 0; i < OWNERS; ++i ) {
            if( 0 == strcmp(owners[i].brand, buf ) ) counter++;
        }
        printf("Owners of brand %s: %d\n", buf, counter);
    }
    
    int oldest = 0;
    for( i = 1; i < OWNERS; ++i ) {
        if( owners[i].year < owners[oldest].year ) {
            oldest = i;
        }
    }
 
    puts("Oldest owner info:");
    printf("Name = %s\n", owners[oldest].name);
    printf("Year = %d\n", owners[oldest].year);
    printf("Brand = %s\n", owners[oldest].brand);
    printf("Number = %d\n", owners[oldest].number);
    printf("Address = %s\n", owners[oldest].address);
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.03.2019, 21:49
Ответы с готовыми решениями:

Необходимо перевести программу с Pascal ABC на free pascal
var a, factorial:longint; const c:array of char= ('0','1'); var res:string; d:0..1; k,...

Перевести в Free Pascal с Delphi
unit Unit1; interface uses Windows, SysUtils, Forms, StdCtrls, Classes, Controls, Dialogs;...

Нужно перевести программу с Ada в Pascal
жело переоценить роль шоколадных плиток для проведения традиционных олимпиад по программированию....

Как перевести программу с PascalABC.NET в Free Pascal
program post; uses crt; const nmax=100; var i,j,k,n,m,s,p,n1: integer; a: array of integer;...

13
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
08.03.2019, 08:23 2
Pascal
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
program OldestAuto;
const
 namberowners = 30; //  Максимальное количество записей.
 namberbrands = 5;  //  Максимальное количество брендов.
 max_brand_length = 18; // Максимальная длина имени бренда.
type
  owner = record    //  Запись.
    nameown: string[15];  // Имя владельца автомобиля.
    year: integer;      //   Год выпуска автомобиля.
    brand: string[max_brand_length];  //  Бренд автомобиля.
    number: integer;      //   Номер автомобиля.
    address: string[25];      //  Адрес владельца.
  end;
 
 
var
  brands: array[1..namberbrands] of string[max_brand_length] = ('audi','mersedes','honda','ferrari','mitsubishi');
  // Переменная массива имен брендов.
  owners: array[1..namberowners] of owner; // Переменная для записей.
  i,counter: integer; // Промежуточные переменные для организации циклов.
  oldest : integer; //  Переменная хранящая значение старейшего автомобиля.
  buf: string[max_brand_length + 2]; // Переменная-буфер для хранения бренда автомобиля.
 
 
  function get_random_symbol : char;
  // Функция, которая случайным образом генерирует символы.
  var
    random_symbol: integer;
  begin
    random_symbol:=65+random(59);
    if (random_symbol > 90) and (random_symbol < 97) then
      random_symbol := 32;
    get_random_symbol:= chr(random_symbol);
   end;
 
procedure set_random_owner(x: integer);
// Процедура, которая создает записи из набора случайных символов и цифр.
begin
  for i:= 1 to 14 do
    begin
        owners[x].nameown[i] := get_random_symbol;
        owners[x].address[i] := get_random_symbol;
    end;
    owners[x].nameown[15] := #10;
    owners[x].address[15] := #10;
    owners[x].year := 1960 + random(55);
    owners[x].number := 1 + random(999);
    owners[x].brand := brands[ 1 + random(namberbrands)];
 
end;
procedure chomp (str: string);
//Процедура, которая добавляет в конец строки символ конца строки.
begin
  if str <> #13 then str:= #10;
end;
 
 
 
 
begin
 for i:= 1 to namberowners do  // Перебираем записи и заполняем их случайными символами.
        set_random_owner(i);
 
 while ( true ) do
 begin
  counter := 0;
  Writeln('Enter vehicle brand');
  Readln(buf);       // Заносим имя в буфер.
    if buf[1] = #13  then break;
  chomp(buf);
  for  i:= 1 to namberowners do  // Сравниваем введное имя с уже имеющимися.
   if owners[i].brand = buf  then inc(counter);
 
  writeln('Owners of brand: ', buf,' ', counter);
 end;
 
 
 
 
 oldest:=1;
 for i:=1 to namberowners do   // Ищем старейший автомобиль.
  if owners[i].year < owners[oldest].year then
    oldest:= i;
 
 writeln('Oldest owner info:');  // Выводим результаты на экран.
 writeln('Name = ',owners[oldest].nameown);
 writeln('Year = ',owners[oldest].year);
 writeln('Brand = ',owners[oldest].brand);
 writeln('Number = ',owners[oldest].number);
 writeln('Address = ',owners[oldest].address);
 
readln;
end.
Программу я перевел как мог, она компилируется, но не работает.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
08.03.2019, 09:14 3
ValentinNemo,
не стоило слишком буквально подходить к вопросу, и все получилось бы отлично.
0
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
08.03.2019, 10:33 4
Я не могу понять, нужна ли эта конструкция для работы программы или нет.
Pascal
1
2
3
4
5
procedure chomp (str: string);
//Процедура, которая добавляет в конец строки символ конца строки.
begin
  if str <> #13 then str:= #10;
end;
Также я не могу понять логику работы этой конструкции.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
while ( true ) do
 begin
  counter := 0;
  Writeln('Enter vehicle brand');
  Readln(buf);       // Заносим имя в буфер.
    if buf[1] = #13  then break;
  chomp(buf);
  for  i:= 1 to namberowners do  // Сравниваем введенное имя с уже имеющимися.
   if owners[i].brand = buf  then inc(counter);
 
  writeln('Owners of brand: ', buf,' ', counter);
 end;
Почему цикл while намертво залочен true?
Зачем нужна строка:
Pascal
1
 if buf[1] = #13  then break;
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
08.03.2019, 10:42 5
ValentinNemo,
Это особенности библиотеки времени исполнения языка Си -- Enter, он же #13, остается во введенной строке.

Цикл обеспечивает ввод данных для поиска пока не будет введена пустая строка. Аналог:
Pascal
1
2
3
4
5
6
7
8
repeat
  Write('Brand: '); ReadLn(s);
  if s='' then Break;
  counter:=0;
  for i:=Low(owners) to High(owners) do
    if owners[i].brand=s then Inc(counter);
  WriteLn('Owners of brand ',s,': ',counter);
until False;
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
08.03.2019, 13:39 6
Pascal
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
program OldestAuto;
const
 namberowners = 30; //  Максимальное количество записей.
 namberbrands = 5;  //  Максимальное количество брендов.
 max_brand_length = 18; // Максимальная длина имени бренда.
type
  owner = record    //  Запись.
    nameown: string[15];  // Имя владельца автомобиля.
    year: integer;      //   Год выпуска автомобиля.
    brand: string[max_brand_length];  //  Бренд автомобиля.
    number: integer;      //   Номер автомобиля.
    address: string[25];      //  Адрес владельца.
  end;
 
 
var
  brands: array[1..namberbrands] of string[max_brand_length] = ('audi','mersedes','honda','ferrari','mitsubishi');
  // Переменная массива имен брендов.
  owners: array[1..namberowners] of owner; // Переменная для записей.
  i,counter: integer; // Промежуточные переменные для организации циклов.
  oldest : integer; //  Переменная хранящая значение старейшего автомобиля.
  buf: string[max_brand_length + 2]; // Переменная-буфер для хранения бренда автомобиля.
 
 
  function get_random_symbol : char;
  // Функция, которая случайным образом генерирует символы.
  var
    random_symbol: integer;
  begin
    random_symbol:= 65 + random(58);
    if (random_symbol > 90) and (random_symbol < 97) then
      random_symbol := 32;
    get_random_symbol:= chr(random_symbol);
   end;
 
procedure set_random_owner(x: integer);
// Процедура, которая создает записи из набора случайных символов и цифр.
var
 i: integer;
 s1,s2: string[50];
begin
  s1:='';
  for i:= 1 to 15 do
    s1:=s1 + get_random_symbol;
  owners[x].nameown := s1;
 
  s2:='';
  for i:= 1 to 25 do
    s2:=s2 + get_random_symbol;
  owners[x].address:= s2;
 
    owners[x].year := 1960 + random(55);
    owners[x].number := 1 + random(999);
    owners[x].brand := brands[ 1 + random(namberbrands)];
 
end;
 
 
begin
 for i:= 1 to namberowners do  // Перебираем записи и заполняем их случайными символами.
        set_random_owner(i);
 
 repeat
  Write('Brand: ');
  ReadLn(buf);
  if buf='' then Break;
  counter:=0;
  for i:=Low(owners) to High(owners) do
    if owners[i].brand = buf then Inc(counter);
  WriteLn('Owners of brand ',buf,': ',counter);
until False;
 
 
 
 oldest:=1;
 for i:=1 to namberowners do   // Ищем старейший автомобиль.
  if owners[i].year < owners[oldest].year then
    oldest:= i;
 
 writeln('Oldest owner info:');  // Выводим результаты на экран.
 writeln('Name = ',owners[oldest].nameown);
 writeln('Year = ',owners[oldest].year);
 writeln('Brand = ',owners[oldest].brand);
 writeln('Number = ',owners[oldest].number);
 writeln('Address = ',owners[oldest].address);
 
readln;
end.
Программа работает, но работает ли так, как это было задумано изначально, не знаю.
Спасибо bormant, за подсказку с кодом.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
08.03.2019, 14:22 7
ValentinNemo,
Потерялось регистронезависимое сравнение по бренду.
Константы в Random не везде верны: rand() % n эквивалентно Random(n).

Я б переписал чуть иначе, прежде всего избавившись от "магических" констант по тексту, тем более, что у нас есть Low и High, SizeOf.

Pascal
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
type
  TOwner = record
    name,
    address,
    brand: String[15];
    year: Integer;
    number: Integer;
  end;
 
const
  Brands: array [0..4] of String[11] = (
    'AUDI', 'MERCEDES', 'HONDA', 'FERRARI', 'MITSUBISHI');
 
procedure RandStr(var s: String; n: Integer);
var c: Char;
begin
  SetLength(s,n);
  for n:=1 to n do begin
    c:=Chr(65+Random(59));
    if c in [#91..#96] then c:=' ';
    s[n]:=c;
  end;
end;
 
procedure RandOwner(var owner: TOwner);
begin with owner do begin
  RandStr(name,High(name));
  RandStr(address,High(address));
  brand:=Brands[Random(High(Brands)+1)];
  year:=1960+Random(55);
  number:=1+Random(999);
end; end;
 
procedure UpCaseStr(var s: String);
var i: Integer;
begin
  for i:=1 to Length(s) do s[i]:=UpCase(s[i]);
end;
 
const W=20;
var
  owners: array [0..29] of TOwner;
  i, cnt, old: Integer;
  s: String;
begin
  Randomize;
  for i:=Low(Owners) to High(Owners) do RandOwner(Owners[i]);
 
  repeat
    Write('Brand: '); ReadLn(s);
    if s='' then Break;
    UpCaseStr(s); cnt:=0;
    for i:=Low(Owners) to High(Owners) do
      Inc(cnt,Ord(Owners[i].brand=s));
    WriteLn('Owners of brand ',s,': ',cnt);
  until False;
 
  old:=Low(Owners);
  for i:=Low(Owners)+1 to High(Owners) do
    if Owners[old].year>Owners[i].year then old:=i;
  with Owners[i] do begin
    WriteLn('Oldest owner info:');
    WriteLn('Name: ':W,name);
    WriteLn('Address: ':W,address);
    WriteLn('Brand: ':W,brand);
    WriteLn('Year: ':W,year);
    WriteLn('Number: ':W,number);
  end;
  Write('Press Enter...'); ReadLn;
end.
Если появились вопросы, почему были сделаны те или иные замены, задавайте, обсудим.
0
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 62
08.03.2019, 14:47  [ТС] 8
не работает,если можете сделайте под свою.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
08.03.2019, 15:12 9
Цитата Сообщение от docsent0568 Посмотреть сообщение
не работает
Какие ваши доказательства?

Код
> fpc a
Free Pascal Compiler version 3.0.4 [2019/02/03] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling A.PAS
Linking A.exe
73 lines compiled, 0.1 sec, 34112 bytes code, 1428 bytes data

> a
Brand: mercedes
Owners of brand MERCEDES: 7
Brand: honda
Owners of brand HONDA: 6
Brand:
Oldest owner info:
              Name: BdzxrCvwftjIRNo
           Address: nxAJPqPGHB g{Cu
             Brand: MERCEDES
              Year: 2003
            Number: 219
Press Enter...
0
0 / 0 / 0
Регистрация: 02.03.2019
Сообщений: 62
08.03.2019, 15:17  [ТС] 10
а на паскале ABC будет работать?

вот
Миниатюры
Перевести в Pascal  
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
08.03.2019, 15:33 11
Этот раздел называется Free Pascal, в Free Pascal все отлично работает.
Dixi.

Добавлено через 7 минут
Pascal
25
26
27
28
procedure RandOwner(var owner: TOwner);
begin with owner do begin
  RandStr(name,SizeOf(name)-1);
  RandStr(address,SizeOf(address)-1);
или
Pascal
1
2
3
4
5
6
7
8
9
const StrLen=15;
type
  TOwner = record
    name,
    address,
    brand: String[StrLen];
    year: Integer;
    number: Integer;
  end;
Pascal
25
26
27
28
procedure RandOwner(var owner: TOwner);
begin with owner do begin
  RandStr(name,StrLen);
  RandStr(address,StrLen);
0
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
10.03.2019, 13:46 12
У меня тоже не компилируется. Ругается на не соответствие типов String.
project1.lpr(29,15) Error: Call by var for arg no. 1 has to match exactly: Got "TOwner.ShortString" expected "AnsiString"

Pascal
1
RandStr(name,High(name));
Убрал из записи ограничения на String и код откомпилировался.
Pascal
1
2
3
4
5
6
7
8
type
  TOwner = record
    name,
    address,
    brand: String;
    year: Integer;
    number: Integer;
  end;

Так же не выводятся в ответе случайные имена. Я предполагаю, что кодовая конструкция на моем компьютере
Pascal
1
2
3
4
for n:=1 to n do begin
    c:=Chr(65+Random(59));
    if c in [#91..#96] then c:=' ';
    s[n]:=c;
не работает.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7797 / 4620 / 2831
Регистрация: 22.11.2013
Сообщений: 13,125
Записей в блоге: 1
10.03.2019, 14:32 13
Цитата Сообщение от ValentinNemo Посмотреть сообщение
Убрал из записи ограничения на String
Зря, дело в $H+, поэтому менять надо было:
Pascal
14
procedure RandStr(var s: ShortString; n: Integer);
Добавлено через 6 минут
При $H- String=ShortString, при $H+ String=AnsiString, String[n] -- это всегда ShortString.
При передаче var-параметром ShortString с AnsiString несовместимы, сообщения компилятора именно об этом.
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
11.03.2019, 03:11 14
bormant, спасибо за науку. Лайки.
0
11.03.2019, 03:11
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2019, 03:11
Помогаю со студенческими работами здесь

Перевести из С в Pascal
Здрасьте. Переведите пожалуйста код С (или С++, хз вообще) в аналогичный код Pascal #include...

Перевести из C++ в Pascal
Если у кого-нибудь есть желание, можете перевести... #include &lt;iostream&gt; #include &lt;cmath&gt;...

Перевести из C++ в Pascal
Здравствуйте, пользователи CyberForum. Прошу перевести из кода C++ в код Pascal. Заранее спасибо. ...

Перевести с С на Pascal
Добрый вечер! Есть код Шифрование: # define KeeLoq_NLF 0x3A5C742E # define...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Преобразование полей (элементов управления содержимым) в обычный текст
РоΜа 23.01.2025
Возникла необходимость преобразовать поля в текст (те, что на вкладке разработчик добавляются) . Помучившись родил следующее: Sub ПоляВТекст() Преобразует все поля в текст (даты, текст,. . .
Как проверить существование директории в скрипте Bash
bt_guru 23.01.2025
При разработке скриптов Bash одной из ключевых задач является корректная работа с файловой системой, где особое место занимает проверка существования директорий. Эта операция становится критически. . .
Как работают срезы (slice) в Python
bytestream 23.01.2025
Python предоставляет разработчикам мощный и гибкий инструмент для работы с последовательностями данных - срезы (slices). Эта функциональность позволяет извлекать, модифицировать и управлять. . .
Как удалить подмодуль (submodule) в Git
bytestream 23.01.2025
При работе с крупными проектами в системе контроля версий Git разработчики часто сталкиваются с необходимостью управления зависимостями и внешними компонентами. Подмодули (submodules) представляют. . .
В чем разница между @staticmethod и @classmethod в Python. Декораторы методов
bytestream 23.01.2025
В Python декораторы методов представляют собой мощный инструмент, позволяющий модифицировать поведение функций и методов без изменения их исходного кода. Эта возможность является одной из. . .
Как преобразовать InputStream в String в Java
bytestream 23.01.2025
В мире Java-разработки работа с потоками данных является одной из ключевых операций при создании современных приложений. InputStream, как фундаментальный класс для обработки входных потоков данных,. . .
Как обновить форк (ответвление) репозитория в Git
bytestream 23.01.2025
Одним из наиболее мощных инструментов Git для организации совместной работы является механизм форкинга репозиториев, который позволяет создавать независимые копии проектов для дальнейшей разработки. . . .
Как работает async/await в C#. Асинхронное программировани­е в .NET
bytestream 23.01.2025
Введение в асинхронное программирование Асинхронное программирование представляет собой важнейшую концепцию современной разработки программного обеспечения, особенно в контексте создания. . .
КуМир: полное руководство
bytestream 23.01.2025
Введение в КуМир: история создания и назначение КуМир (Комплект Учебных МИров) представляет собой образовательную среду программирования, которая была создана для обучения основам алгоритмизации и. . .
Что такое OLAP. Где и как использовать многомерный анализ данных
bytestream 23.01.2025
Введение в OLAP-технологии В современном мире бизнес-аналитика и обработка больших массивов данных играют ключевую роль в принятии стратегических решений. Организации накапливают огромные объемы. . .
MongoDB: что это, для чего нужна и как использовать
bytestream 23.01.2025
Введение в MongoDB: современная документоориентированная СУБД В современном мире разработки программного обеспечения выбор правильной системы управления базами данных является критически важным. . .
Как использовать закрытый ключ шифрования в Git. Шифрование в Git
bytestream 23.01.2025
Установка и настройка закрытых ключей в Git предоставляет дополнительный уровень безопасности для работы с репозиториями. Для начала необходимо создать пару ключей, обычно это осуществляется с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru