Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19

Шифрование двух текстов

09.03.2014, 22:03. Показов 2580. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять,как составить программу для шифрования текста. Суть в том,что изначально есть какой то текст,пользователь вводит второй текст. Далее берётся по первому символу из обоих текстов,переводится в двоичный код по кодировке Ascii, затем поэтапно складываются разряды у этих символов. В итоге выводится зашифрованный текст. Объясните,пожалуйста,как сделать такую программу.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2014, 22:03
Ответы с готовыми решениями:

Шифрование/дешифрование текстов по принципу шифра Плейфера
Помогите, пожалуйста, написать программу для шифрования/дешифрования текстов по принципу шифра Плейфера. Большая просьба написать программу...

Шифрование и дешифрование текстов одноалфавитным методом с задаваемым смещением (от 2 до 20)
Разработать программу шифрования и дешифрования текстов реализующие следующий метод: Одноалфавитный метод с задаваемым смещением (от 2 до...

Шифрование текстов с использованием афинного шифра на ассемблере
Есть код на с++. Нужно переделать так, чтобы были ассемблеровские вставки. Как можно переделать, чтобы ввод/вывод был реализован на с++, а...

15
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
11.03.2014, 04:35
Вероятно, Вы имеете ввиду шифрование с помощью операции xor. Вот, для ознакомления Как работает функция XOR и что она делает? последние посты почитайте. А так, если даны две строки, исходная s и ключ k, пусть одинаковой длины, для простоты, то шифрование и расшифровка текста выглядят так:
Pascal
1
for i := 1 to length(s) do s[i] := char(byte(s[i] xor byte(k[i])));
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
16.03.2014, 14:27  [ТС]
А какого типа должны быть переменные s и k, а то у меня стоит string,но выдаётся ошибка: Операнды имеют неприводимые типы? Получается текст s вводит пользователь,а текст k является внешним текстовым файлом.
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
16.03.2014, 16:28
Nekto86, не понял Вашего вопроса. xor может работать только с целыми или булевыми типами данных. Вы не выложили свой фрагмент кода, не могу сказать, в каком месте у Вас возникает невозможность приведения типов.
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
17.03.2014, 07:47  [ТС]
У меня,на данный момент,сделано очень мало,а именно:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Program Kursovaya;
uses crt;
var
cod:char;
str,k: string;
len, count, flag, i, n: byte;
f: file of char;
begin
writeln('Введите ваше сообщение'); readln(str);
n:=5;
len := length(str);
count := 0;
flag := 0;
    for i:=1 to len do begin
        if (str[i] <> ' ') and (flag = 0) then begin
            count := count + 1;
            flag := 1;
    if count = n then break;
     end;
  if str[i] = ' ' then flag := 0;
  end;
cod:=str[i];
Просто,я только начал изучать работу с текстами,и вот,опять застопорился

Добавлено через 1 час 0 минут
Ну и далее в коде идёт операция case of для выяснения,с каким внешним текстовым файлом мы шифруем текст.
Не могу понять,какого типа должна быть переменная k. Я считал,что это должен был быть файл и он у меня стоит,как k: file of string
0
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
18.03.2014, 11:00  [ТС]
Cyborg Drone, Получается,что у меня первый текст типа string,второй char,мне надо работать с каждой буквой каждого текста,до точки у первого текста,который вводит пользователь. Не могу понять,как это сделать.
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
18.03.2014, 14:52
Лучший ответ Сообщение было отмечено Nekto86 как решение

Решение

Nekto86, ничего такого не получается. Вы не вполне верно поняли Ваше задание.

Для простоты рассуждений можно сказать, что любая текстовая строка представляет сообой массив из данных типа char. Далее.

Первая строка, которую вводит пользователь, есть кодируемое сообщение. Вторая строка - ключ для кодирования/раскодирования сообщения. Пусть уже получены строка и строка-ключ. Код каждого символа строки необходимо сложить поразрядно по модулю 2 с кодом соответствующего символа строки-ключа. Если ключ по длине равен или больше длины строки, "складываются" символы с одинаковыми номерами (точнее, индексами) в строке и ключе. Если ключ короче строки, при превышении длины ключа ключ просто используется многократно.

Так как при применении к какому-либо числу операции xor дважды с какой-либо константой получается снова исходное число, программа-кодер является и программой-декодером.

Докуда шифруется сообщение: до точки в строке, строка целиком, текстовый файл целиком - лично мне по барабану. Сами напишете, что именно Вам нужно. Вот программа-пример, кодирует вводимую строку, выводит на печать зашифрованную строку, расшифровывает её и снова выводит на печать. Символы с кодом меньше пробела зашифрованной строки выводятся как "?", ну, или какой захотите более другой символ изберите, во избежание вывода на консоль всяких там звонков, табуляций, попытки запроса статуса и иже с ними. Разбирайтесь, не перпеттуум мобиле. Что неясно, спрашивайте.
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
Program Kursovaya;
//процедура-кодек, исходная и зашифрованная строка одна и та же
procedure codec(var s: string);
const keystr = 'Суперключ, не разгадать почти что.'; //ключ
var i, count: integer; //счётчики для строки и ключа
begin
  count := 0; //начальное значение, в данном случае 0 для удобства алгоритма
  for i := 1 to length(s) do //пробегаем по символам строки
    begin
      inc(count); //указадель ключа - на следующий его символ
      if count = length(keystr) + 1 then count := 1;
      //если длина строки больше длины ключа, ключ используем многократно
      s[i] := char(byte(s[i]) xor byte(keystr[count]));
      //xor кода символа строки с кодом символа ключа и запись полученного символа назад в строку
      //сначала соответствующие сиволы строки и ключа приводятся к типу byte,
      //затем к полученным байтам применяется поразрядно операция xor,
      //затем полученный байт снова приводится к типу char
      //и записывается на место исходного символа строки
    end;
end;
 
var str: string;
    i: integer;
 
begin
  writeln('Введите ваше сообщение'); //ввод строки
  readln(str);
  codec(str); //шифрование
  //вывод зашифрованной строки, для исключения конфликтов при выводе
  //вместо символов с кодом менее пробела выводится вопросительный знак
  writeln('Зашифрованное сообщение:'); //печать зашифрованного сообщения
  for i := 1 to length(str) do if str[i] < ' ' then write('?') else write(str[i]);
  writeln;
  codec(str); //декодирование
  writeln('Расшифрованное сообщение:'); //печать расшифрованного сообщения
  writeln(str);
  readln
end.
В программе умышленно не используется uses crt;. поскольку в большинстве случаев оно и на фиг не нужно.
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
18.03.2014, 17:28  [ТС]
Ну,я согласовал,что то,с каким текстом шифруется сообщение,определяется по 1 букве 5 слова,соответственно в папке с программой у меня 30 текстовых файлов,каждый называется соответсвующей ему буквой. Соответсвенно,если буква первая буква пятого слова Т,то открываться должен текстовый файл Т и шифрование сообщения должно происходить с ним.
Проверил вашу программу на ABC паскале, она выдала кучу вопросительных знаков и между ними,изредка,буквы.
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
18.03.2014, 17:54
Цитата Сообщение от Nekto86 Посмотреть сообщение
она выдала кучу вопросительных знаков и между ними,изредка,буквы.
Ну да, при xor что получится - неясно, любой символ от char(0) до char(255). Если расшифровывает правильно, то так и должно быть, ошибки нет. Ну а насчёт файлов-ключей... Понятно. Так, замечание относительно Вашего согласования: если шифруемое сообщение содержит менее 5 слов, надо с этим как-то дополнительно разбираться. Файлы-ключи для упрощения алгоритма лучше, чтобы были из одной строки.

И ещё: если шифруются файлы по файлам-ключам, то подумайте об варианте объявить эти файлы как file of byte, это упростит алгоритм кодека, и уж точно не нужно будет делать файлы-ключи ровно из одной строки.
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
18.03.2014, 18:00  [ТС]
Скорее всего неправильно составил,но у меня,на данный момент,получается вот так:
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
Program Kursovaya;
//ïðîöåäóðà-êîäåê, èñõîäíàÿ è çàøèôðîâàííàÿ ñòðîêà îäíà è òà æå
procedure codec(var s: string);
 
var i, count: integer; //ñ÷¸ò÷èêè äëÿ ñòðîêè è êëþ÷à
f:string;
begin
  count := 0; //íà÷àëüíîå çíà÷åíèå, â äàííîì ñëó÷àå 0 äëÿ óäîáñòâà àëãîðèòìà
  for i := 1 to length(s) do //ïðîáåãàåì ïî ñèìâîëàì ñòðîêè
    begin
      inc(count); //óêàçàäåëü êëþ÷à - íà ñëåäóþùèé åãî ñèìâîë
      if count = length(f) + 1 then count := 1;
      //åñëè äëèíà ñòðîêè áîëüøå äëèíû êëþ÷à, êëþ÷ èñïîëüçóåì ìíîãîêðàòíî
      s[i] := char(byte(s[i]) xor byte(f[count]));
      //xor êîäà ñèìâîëà ñòðîêè ñ êîäîì ñèìâîëà êëþ÷à è çàïèñü ïîëó÷åííîãî ñèìâîëà íàçàä â ñòðîêó
      //ñíà÷àëà ñîîòâåòñòâóþùèå ñèâîëû ñòðîêè è êëþ÷à ïðèâîäÿòñÿ ê òèïó byte,
      //çàòåì ê ïîëó÷åííûì áàéòàì ïðèìåíÿåòñÿ ïîðàçðÿäíî îïåðàöèÿ xor,
      //çàòåì ïîëó÷åííûé áàéò ñíîâà ïðèâîäèòñÿ ê òèïó char
      //è çàïèñûâàåòñÿ íà ìåñòî èñõîäíîãî ñèìâîëà ñòðîêè
    end;
end;
 
var str: string;
    i,n,len,count,flag: integer;
    cod:char; f:  file of string;
begin
  writeln('Ââåäèòå âàøå ñîîáùåíèå'); //ââîä ñòðîêè
  readln(str);
  n:=5;
len := length(str);
count := 0;
flag := 0;
    for i:=1 to len do begin
        if (str[i] <> ' ') and (flag = 0) then begin
            count := count + 1;
            flag := 1;
    if count = n then break;
     end;
  if str[i] = ' ' then flag := 0;
  end;
cod:=str[i];
case cod of
'à':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\1.txt');
'á':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\2.txt');
'â':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\3.txt');
'ã':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\4.txt');
'ä':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\5.txt');
'å':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\6.txt');
'¸':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\7.txt');
'æ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\8.txt');
'ç':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\9.txt');
'è':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\10.txt');
'é':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\11.txt');
'ê':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\12.txt');
'ë':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\13.txt');
'ì':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\14.txt');
'í':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\15.txt');
'î':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\16.txt');
'ï':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\17.txt');
'ð':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\18.txt');
'ñ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\19.txt');
'ò':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\20.txt');
'ó':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\21.txt');
'ô':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\22.txt');
'õ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\23.txt');
'ö':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\24.txt');
'÷':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\25.txt');
'ø':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\26.txt');
'ù':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\27.txt');
'ý':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\28.txt');
'þ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\29.txt');
'ÿ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Ïðîâåðêà\30.txt');
end;
  codec(str); //øèôðîâàíèå
  //âûâîä çàøèôðîâàííîé ñòðîêè, äëÿ èñêëþ÷åíèÿ êîíôëèêòîâ ïðè âûâîäå
  //âìåñòî ñèìâîëîâ ñ êîäîì ìåíåå ïðîáåëà âûâîäèòñÿ âîïðîñèòåëüíûé çíàê
  writeln('Çàøèôðîâàííîå ñîîáùåíèå:'); //ïå÷àòü çàøèôðîâàííîãî ñîîáùåíèÿ
  for i := 1 to length(str) do if str[i] < ' ' then write('?') else write(str[i]);
  writeln;
  codec(str); //äåêîäèðîâàíèå
  writeln('Ðàñøèôðîâàííîå ñîîáùåíèå:'); //ïå÷àòü ðàñøèôðîâàííîãî ñîîáùåíèÿ
  writeln(str);
  readln
end.
Я практически уверен,что косяк с переменной F
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
18.03.2014, 18:28
У Вас нет нигде чтения из файла-ключа. Программа алгоритмически неверная. Забыли написать
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
//...
procedure codec(var s, f: string); //здесь f - локальный параметр-строка, а не глобальная файловая переменная f
//...
var str, p: string;
//...
  reset(f);
  readln(f, p);
  codec(str, p); //шифрование
//... 
  codec(str, p); //декодирование
//...
close(f);
//...
Так что пока не программа, а сплошной косяк. И с case... Право, перемудрили. Названи файла можно и вычислить.

Добавлено через 2 минуты
Да, ещё один непротык. После зашифровки файла как узнаете, каким ключом его раскодировать?
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
19.03.2014, 13:14  [ТС]
Cyborg Drone, На данный момент у меня всё вот так:
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
Program Kursovaya;
uses crt;
procedure codec(var s: string);
var i: integer; //счётчики для строки и ключа
f:string;
begin
  for i := 1 to length(s) do //пробегаем по символам строки
    begin
      //если длина строки больше длины ключа, ключ используем многократно
      s[i] := char(byte(s[i]) xor byte(f[i]));
      //xor кода символа строки с кодом символа ключа и запись полученного символа назад в строку
      //сначала соответствующие сиволы строки и ключа приводятся к типу byte,
      //затем к полученным байтам применяется поразрядно операция xor,
      //затем полученный байт снова приводится к типу char
      //и записывается на место исходного символа строки
    end;
end;
 
var
cod:char;                                           //Буква,по которой определяется используемый внешний файл
str: string;                                    //Вводимое сообщение
len, count, flag, i, n: byte;                         //
f: file of string;                                 //Внешний файл
begin
writeln('Введите ваше сообщение'); readln(str);
n:=5;                                           //Порядковый номер слова,необходимое для понятия,какой внешний файл мы используем
len := length(str);
count := 0;                                      //Счётчик слов
flag := 0;                                      //Показывает,находимся ли мы внутри слова
    for i:=1 to len do begin                       //Определяем первую букву пятого слова
        if (str[i] <> ' ') and (flag = 0) then begin
            count := count + 1;
            flag := 1;
    if count = n then break;
     end;
  if str[i] = ' ' then flag := 0;
  end;
cod:=str[i];
case cod of                                                         //В зависимости от того,какая это буква,начинаем использовать соответствующий файл
'а':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\1.txt');
'б':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\2.txt');
'в':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\3.txt');
'г':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\4.txt');
'д':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\5.txt');
'е':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\6.txt');
'ё':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\7.txt');
'ж':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\8.txt');
'з':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\9.txt');
'и':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\10.txt');
'й':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\11.txt');
'к':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\12.txt');
'л':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\13.txt');
'м':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\14.txt');
'н':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\15.txt');
'о':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\16.txt');
'п':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\17.txt');
'р':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\18.txt');
'с':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\19.txt');
'т':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\20.txt');
'у':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\21.txt');
'ф':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\22.txt');
'х':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\23.txt');
'ц':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\24.txt');
'ч':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\25.txt');
'ш':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\26.txt');
'щ':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\27.txt');
'э':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\28.txt');
'ю':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\29.txt');
'я':assign(f,'C:\Users\nekto86\Desktop\Паскаль\Проверка\30.txt');
 end;
codec(str);            //Кодируем сообщение
writeln('Зашифрованное сообщение:');
for i := 1 to length(str) do if str[i] < ' ' then write('?') else write(str[i]);  //Выводим на  экран зашифрованное сообщение
  writeln;
  codec(str);    //Декодируем сообщение
   writeln('Расшифрованное сообщение:'); //печать расшифрованного сообщения
  writeln(str);
  readln
end
Добавлено через 3 часа 11 минут
Даже ещё лучше сделал,осталось понять,как правильно оформить процедуру и должно работать:
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
Program Kursovaya;
uses crt;
procedure codec(p:array[1..1000] of char; var s: string);
var i: integer; //ñ÷¸ò÷èêè äëÿ ñòðîêè è êëþ÷à
f:string;
c:array[1..1000]of char;
begin
  for i := 1 to length(s) do //ïðîáåãàåì ïî ñèìâîëàì ñòðîêè
    begin
      //åñëè äëèíà ñòðîêè áîëüøå äëèíû êëþ÷à, êëþ÷ èñïîëüçóåì ìíîãîêðàòíî
      s[i] := char(byte(s[i]) xor byte(p[i]));
      //xor êîäà ñèìâîëà ñòðîêè ñ êîäîì ñèìâîëà êëþ÷à è çàïèñü ïîëó÷åííîãî ñèìâîëà íàçàä â ñòðîêó
      //ñíà÷àëà ñîîòâåòñòâóþùèå ñèâîëû ñòðîêè è êëþ÷à ïðèâîäÿòñÿ ê òèïó byte,
      //çàòåì ê ïîëó÷åííûì áàéòàì ïðèìåíÿåòñÿ ïîðàçðÿäíî îïåðàöèÿ xor,
      //çàòåì ïîëó÷åííûé áàéò ñíîâà ïðèâîäèòñÿ ê òèïó char
      //è çàïèñûâàåòñÿ íà ìåñòî èñõîäíîãî ñèìâîëà ñòðîêè
    end;
end;
 
var
p:array[1..1000] of char;
c:char;
cod:char;                                           //Áóêâà,ïî êîòîðîé îïðåäåëÿåòñÿ èñïîëüçóåìûé âíåøíèé ôàéë
str: string;
 i:integer;                            //Ââîäèìîå ñîîáùåíèå
len, count, flag, n: byte;                         //
f: file of char;                                 //Âíåøíèé ôàéë
begin
writeln('Ââåäèòå âàøå ñîîáùåíèå'); readln(str);
n:=5;                                           //Ïîðÿäêîâûé íîìåð ñëîâà,íåîáõîäèìîå äëÿ ïîíÿòèÿ,êàêîé âíåøíèé ôàéë ìû èñïîëüçóåì
len := length(str);
count := 0;                                      //Ñ÷¸ò÷èê ñëîâ
flag := 0;                                      //Ïîêàçûâàåò,íàõîäèìñÿ ëè ìû âíóòðè ñëîâà
    for i:=1 to len do begin                       //Îïðåäåëÿåì ïåðâóþ áóêâó ïÿòîãî ñëîâà
        if (str[i] <> ' ') and (flag = 0) then begin
            count := count + 1;
            flag := 1;
    if count = n then break;
     end;
  if str[i] = ' ' then flag := 0;
  end;
cod:=str[i];
case cod of                                                         // çàâèñèìîñòè îò òîãî,êàêàÿ ýòî áóêâà,íà÷èíàåì èñïîëüçîâàòü ñîîòâåòñòâóþùèé ôàéë
'à':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\1.txt');
'á':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\2.txt');
'â':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\3.txt');
'ã':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\4.txt');
'ä':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\5.txt');
'å':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\6.txt');
'¸':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\7.txt');
'æ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\8.txt');
'ç':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\9.txt');
'è':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\10.txt');
'é':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\11.txt');
'ê':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\12.txt');
'ë':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\13.txt');
'ì':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\14.txt');
'í':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\15.txt');
'î':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\16.txt');
'ï':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\17.txt');
'ð':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\18.txt');
'ñ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\19.txt');
'ò':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\20.txt');
'ó':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\21.txt');
'ô':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\22.txt');
'õ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\23.txt');
'ö':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\24.txt');
'÷':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\25.txt');
'ø':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\26.txt');
'ù':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\27.txt');
'ý':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\28.txt');
'þ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\29.txt');
'ÿ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\30.txt');
 end;
 i:=1;
 reset(f);
 while i<=len do begin
 read (f,c); i:=i+1; p[i]:=c; end;
codec(str);
writeln;         //Êîäèðóåì ñîîáùåíèå
writeln('Çàøèôðîâàííîå ñîîáùåíèå:');
for i := 1 to length(str) do if str[i] < ' ' then write('?') else write(str[i]);  //Âûâîäèì íà  ýêðàí çàøèôðîâàííîå ñîîáùåíèå
  writeln;
  codec(str);    //Äåêîäèðóåì ñîîáùåíèå
   writeln('Ðàñøèôðîâàííîå ñîîáùåíèå:'); //ïå÷àòü ðàñøèôðîâàííîãî ñîîáùåíèÿ
  writeln(str);
  readln;
  close(f);
end.
Добавлено через 1 час 40 минут
И с оформлением процедуры я справился,и у меня остался один вопрос. Мне сказали,чтобы я сократил эти строки:
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
case cod of                                                         // çàâèñèìîñòè îò òîãî,êàêàÿ ýòî áóêâà,íà÷èíàåì èñïîëüçîâàòü ñîîòâåòñòâóþùèé ôàéë
'à':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\1.txt');
'á':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\2.txt');
'â':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\3.txt');
'ã':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\4.txt');
'ä':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\5.txt');
'å':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\6.txt');
'¸':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\7.txt');
'æ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\8.txt');
'ç':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\9.txt');
'è':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\10.txt');
'é':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\11.txt');
'ê':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\12.txt');
'ë':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\13.txt');
'ì':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\14.txt');
'í':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\15.txt');
'î':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\16.txt');
'ï':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\17.txt');
'ð':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\18.txt');
'ñ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\19.txt');
'ò':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\20.txt');
'ó':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\21.txt');
'ô':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\22.txt');
'õ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\23.txt');
'ö':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\24.txt');
'÷':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\25.txt');
'ø':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\26.txt');
'ù':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\27.txt');
'ý':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\28.txt');
'þ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\29.txt');
'ÿ':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\30.txt');
'a':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\1.txt');
'b':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\2.txt');
'c':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\3.txt');
'd':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\4.txt');
'e':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\5.txt');
'f':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\6.txt');
'g':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\7.txt');
'h':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\8.txt');
'i':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\9.txt');
'j':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\10.txt');
'k':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\11.txt');
'l':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\12.txt');
'm':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\13.txt');
'n':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\14.txt');
'o':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\15.txt');
'p':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\16.txt');
'q':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\17.txt');
'r':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\18.txt');
's':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\19.txt');
't':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\20.txt');
'u':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\21.txt');
'v':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\22.txt');
'w':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\23.txt');
'x':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\24.txt');
'y':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\25.txt');
'z':assign(f,'C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\26.txt');
 end;
Но я понятия не имею,как это сделать,хотя мне говорили что то,про:
Pascal
1
2
k:=ord(cod)-ord('а')
st:=C:\Users\nekto86\Desktop\Ïàñêàëü\Êóðñîâàÿ\
Но я ничего не понял
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
19.03.2014, 13:41
ord - это вычисление порядкового номера значения перечисляемого типа. На примере byte: ord(45) = 45. Для char ord('c')=byte('c') - порядковый номер символа в таблице кодировки. Номера начинаются с 0. Так что, если вычесть из кода символа код символа "а" - получится, на сколько отличается код символа от кода "а". Я уже Вам писал:
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
И с case... Право, перемудрили. Названи файла можно и вычислить.
Замените имя переменной str на какое-либо другое. Допустим, на st. Ладно было бы, если бы процедура str (это преобразование числа в строку) не понадобилась. Для Вашего случая, если требуются именно Ваши имена файлов, и без проверок, добавьте ff: string; и k: integer; в объявление переменных, а вместо case напишите:
Pascal
1
2
3
k:=ord(cod)-ord('а')+1; //вычисляем разницу + 1, для 'а' будет 1, для 'б' будет 2, для 'в' три и так далее
str(k, ff); //преобразуем это число в строку
assign(f,'C:\Users\nekto86\Desktop\Паскаль\Курсовая\'  + ff + '.txt'); //ну и...
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
19.03.2014, 16:29  [ТС]
Cyborg Drone, А как же быть с английскими буквами?
0
Модератор
10435 / 5723 / 3405
Регистрация: 17.08.2012
Сообщений: 17,422
19.03.2014, 20:34
Сначала определитесь с количеством ключей. Затем с помощью какой-либо функции отобразите всё множество печатных символов на множество ключей. Попутно решите, что делать, если в тексте нет пятого слова. Также подумайте, как определить, каким файлом ключа расшифровывать, если программа вдруг станет не учебной, а боевой. Ведь если у Вас есть зашифрованный текст, то первую букву пятого слова где ж взять?
1
0 / 0 / 1
Регистрация: 20.02.2014
Сообщений: 19
26.03.2014, 19:04  [ТС]
Cyborg Drone, меня попросили переделать,чтобы шифруемое сообщение не вводилось,а было в текстовом файле. Я переделал,однако у меня перестало правильно шифроваться,не могу понять,где ошибка.
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
94
95
96
97
98
Program Kursovaya;
procedure codec(p:array[1..1000] of char; z:integer;var l:array[1..1000] of char );
var i: integer;
f:string;
begin
  for i := 1 to z do
    begin
     l[i] := char(byte(l[i]) xor byte(p[i]));
    end;
end;
var
ff,fff: string; k: integer;
v:file of char;
p:array[1..1000] of char;
l:array[1..1000] of char;
c,cod:char;
lol: string;
 i,z:integer;
len, count, flag, n: byte;
f,st: file of char;
begin
Writeln('Íàæìèòå S, åñëè õîòèòå çàøèôðîâàòü ñîîáùåíèå');
Writeln('Íàæìèòå R, åñëè õîòèòå ðàñøèôðîâàòü ñîîáùåíèå');
Writeln('Íàæìèòå E,åñëè õîòèòå âûéòè èç ïðîãðàììû');
readln(lol);
If lol='s' then
begin
writeln('Ââåäèòå ïóòü ôàéëà'); readln(fff); assign(st,fff);  reset(st);
n:=5;
count := 0;
flag := 0;
i:=1;
While not eof(st) do begin
read (st,c); l[i]:=c; i:=i+1;
end;
z:=i;
For i:=1 to z do begin
        if (l[i] <> ' ') and (flag = 0) then begin
            count := count + 1;
            flag := 1;
    if count = n then break;
     end;
  if l[i] = ' ' then flag := 0;
  end;
cod:=l[i];
k:=ord(cod)-ord('a')+1;
str(k, ff);
assign(f,'C:\Users\nekto86\Desktop\'  + ff + '.txt');
 i:=1;
 reset(f);
 for i:=1 to z do
  begin
 read (f,c); i:=i+1; p[i]:=c;
  end;
codec(p,z,l);
writeln;
assign (v, 'C:\Users\nekto86\Desktop\Soobshenie.txt');
  rewrite(v);
  for i:=1 to z do
   begin if l[i] < ' ' then c:='?' else c:=l[i]; write (v, c);
   end;
  close(v);
  close(f);
  close(st);
  writeln;
  end;
  If lol='r' then
  begin
  i:=1;
  writeln('Ââåäèòå ïóòü çàêîäèðîâàííîãî ñîîáùåíèÿ'); readln(fff); assign(st,fff); reset(st);
  While not eof(st) do
        begin
read (st,c); l[i]:=c; i:=i+1;
         end;
z:=i;
  writeln('Ââåäèòå ïóòü ôàéëà øèôðîâàëüíîãî áëîêíîòà');
  readln(fff);
  assign(f,fff);
  reset(f);
  i:=1;
  For i:=1 to z do
            begin
 read (f,c);  p[i]:=c;
             end;
codec(p,z,l);
   assign (v, 'C:\Users\nekto86\Desktop\Itog.txt');
      rewrite(v);
  For i:=1 to z  do
             begin
             c:=l[i];
             write(v,c);
             end;
  close(f);
  close(st);
  close(v);
        end;
 If lol='e' then writeln('Óäà÷íîãî äíÿ');
end.
Добавлено через 39 минут
Исправил вот этот момент,но дешифровывается всё равно неправильно:
Было:[
Цитата Сообщение от Nekto86 Посмотреть сообщение
for i:=1 to z do
* begin
*read (f,c); i:=i+1; p[i]:=c;
* end;
Стало:
Pascal
1
2
3
4
for i:=1 to z do
* begin
*read (f,c); p[i]:=c;
* end;[
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2014, 19:04
Помогаю со студенческими работами здесь

сравнение двух текстов
Подскажите, пожалуйста, программу (или сайт), с помощью которой можно сравнить два (или более) текста на предмет схожести/различия.

Сравнение двух текстов С#
Здравствуйте, помогите пожалуйста, как сделать в C# вместо посимвольного сравнение строк, сравнить 2 текста в файле, на количество схожих...

Сравнение на схожесть двух текстов
Здравствуйте! Задача такова что нужно сравнить два текста на схожесть и вывести результат в %. Также дополнительно можно чтоб показывались...

Сравнение двух больших текстов
Есть два больших текста, отличающиеся друг от друга несколькими словами. Как выявить эти слова? Как сравнить эти тексты?

Сравнение на схожесть двух текстов
Ни у кого нет исходника в делфи программы для сравнения двух текстов, и вывода процента схожести текста.... Сравнение нужно не по символам,...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru