Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal ABC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
1

Замена букв аналогами

23.03.2017, 21:50. Просмотров 1057. Ответов 18
Метки нет (Все метки)

Есть текст в файле, если если бит этого текста равен единице, то в тексте-контейнере меняем русскую букву на английский аналог. Если бит равен нулю, то очередную букву-аналог в тексте-контейнере оставляем без изменений.
текст с замененными буквами записывается во второй файл.
Как трактовать "если бит этого текста=1"?
если можно, код)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2017, 21:50
Ответы с готовыми решениями:

Дан текст. Замена латинских букв на "!", замена гласных русских букв на "-", подсчёт цифр в тексте
Условие. Написать программу на языке Паскаль (можно и в среде Delphi 7.0),...

Замена в строке букв на символы
Добрый день. PascalScript. Есть строка напр. 'Саша'. Нужно в ней произвести...

Замена букв
Подскажите, пожалуйста!) Как в слове "Велосипедист" все буквы "Е" заменить на...

Замена букв в слове...
Нужно заменить в заданном слове все буквы " о " пробелами. Помогите плиз с...

Замена букв на английские
Привет всем! Помогите плз с решением одной задачи. Нужно как то сделать так,...

18
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 16:49 2
Никак не трактовать. Выражение бессмысленно.

Полагаю, следует читать не "бит этого текста", а "старший бит кода данного символа этого текста". Вероятно, имеется ввиду однобайтовая кодировка символов, скорее всего, кодовая таблица CP866 (она же русская альтернативная кодировка OEM DOS) или CP1251 (она же русская кодировка Windows). В этих и подобных им кодовых таблицах первая половина таблицы соответствует (в той или иной степни) кодировке ASCII, а вторая половина содержит национальные символы и псевдографику. Коды символов в первой и второй половине кодовой таблицы отличаются, в первую очередь, старшим битом.

Замечу, что не все русские буквы имеют англйский (может быть, всё же латинский?) аналог. Таких мало: АаВЕеКМНОоРрСсТХх. С некоторой натяжкой к ним можно причислить кмнУуЬ. Или имеется ввиду транслитерация русских букв латинскими?

Итак, если я в чём-то прав, то какая именно кодировка имеется ввиду? Что нужно сделать: заменить русские буквы, похожие по начертанию на латинские, их латинскими аналогами (а остальные русские буквы оставить без изменений), или транслитерировать русские буквы латинскими? Если последнее, то какой из стандартов транслитераци использовать? Если Ваш вариант не соответствует ни одному указанному стандарту транслитерации русского текста латинскими буквами, приведите Вашу таблицу соответствия для второй части кодовой таблицы.

если можно, пояснения)
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
24.03.2017, 19:41  [ТС] 3
Именно заменить аналогами английского алфавита, если бит =0, то не менять. вот оригинальное задание:
если бит секретного сообщения равен единице, то в тексте-контейнере меняем русскую букву на английский аналог. Если бит равен нулю, то очередную букву-аналог в тексте-контейнере оставляем без изменений. Буквы-аналоги - это буквы русского языка, имеющие аналогичное начертание в англ. языке.
После шифрования, шифровку надо обратно раскодировать.

Добавлено через 16 минут
но у меня все тело программы уже сделано, надо только переписать исходный файл в другой файл, но уже с замененными буквами
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 19:44 4
Дмитрий97_09, какую такую шифровку? Которая будет выглядеть так же, как исходный текст? В чём сакральный смысл такого шифрования? И дешифровать латинские буквы, схожие с русскими, которые были в изначальном тексте? Менять на русские, что несколько нелогично? да, и ещё не ответили:
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
какая именно кодировка имеется ввиду?
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
24.03.2017, 19:50  [ТС] 5
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//---------------------процедура для полученя бит-------------------------------
procedure GetBite(tmp,k: integer);                                                                  // GetBite - выбранное имя   (передоваемые параметры : тип передоваемых данных)
var i:integer;
begin
    i:=0;                                                                                                           //задаем начальное значение i для цикла while
        while i<k do begin                                                                                    //цикл while забающий массив строк Q[i] нулями (от i до k, где k передаваемый  параметр)
            i:=i+1;                                                                                                 //нужно что бы на выходе всегда было k значений  | k  либо 8, либо 16
            Q[i]:='0';                                                                                            //забиваем Q[i] нулями
        end;
        while tmp>=2 do begin                                                                                 //цикл перевода байта в бит | забивает Q[i] с конца (от k до i)
            str(tmp mod 2,Q[i]);                                                                              //получили остаток от деления и поместили в Q[i]
            tmp:=tmp div 2;                                                                                   //получили результат деления
            i:=i-1;                                                                                                 //перешли к предыдущему Q[i]
        end;                                                                                                          //повторяется пока не получим результат деления < 2
        str(tmp,Q[i]);                                                                                          //записали последний результат деления в Q[i]
  for i:=1 to k do  begin
      if (Q[i] = '0') then ResAll[count]:= 0                                                          // переписываем массив строк Q[i] в виде массива чисел ResAll[count]
      else ResAll[count]:= 1;
      count:=count+1;                                                           // count счетчик
      end;
end;
вот в нашел такую процедуру получения бит, можете дописать, чтоб программа из 1 файла переписывала во 2 файл с замененными буквами-аналогами.
вот это, я думаю, можно записать как константу ( тут буквы которым есть аналоги в англ. алфавите) "ХхТРрОоМКНЕеСсВАа"

А вот тут сами аналоги этих букв из англ. алфавита "XxTPpOoMKHEeCcBAa"(тоже как константу)

Добавлено через 1 минуту
В задании не сказано какая кодировка... Просто как я понял, то у англ. и русских букв разные представления в системе (тот же ascii код)

Добавлено через 1 минуту
Шифровка у меня в основном теле программы) мне тупо надо заменить в исходном файле буквы)
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 20:06 6
В ASCII по определению нет русских символов. Только американские, если быть точным. Да и незачем, вообще говоря, анализировать старший бит, и без него всё ясно. И что-то Вы в дебри лезете... Всё просто.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const rus = 'АаВЕеКМНОоРрСсТХх';
      lat = 'AaBEeKMHOoPpCcTXx';
var f, g: file of char;
    ch: char;
    p: integer;
begin
  assign(f, 'f.txt');
  reset(f);
  assign(g, 'g.txt');
  rewrite(g);
  while not eof(f) do
    begin
      read(f, ch);
      if byte(ch) and 128 > 0 //---- смотрим старший бит
        then begin //---- если = 1, то 
          p := pos(ch, rus); //смотрим, есть ли буква в русском списке
          if p > 0 then ch := lat[p]; //если есть, заменяем её буквой из латинского списка
        end; //----
      write(g, ch)
    end;
  close(f);
  close(g)
end.
То, что я пометил "//----" - это (предполагаемое) требование Вашего задания. Эти строки можно убрать, программа от этого нисколько не пострадает.
1
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
24.03.2017, 21:07  [ТС] 7
Спасибо большое) это как раз то,что нужно)

Добавлено через 34 минуты
К сожалению она не меняет буквы, что очень странно. Проверял в программе showascii.

Добавлено через 10 минут
https://www.calc.ru/kalkulyator-kodov.html
на этом сайте показывает, что старший бит у букв всегда =0

Добавлено через 1 минуту
а вот младший меняется, может его и надо использовать?

Добавлено через 11 минут
и чтоб потом раскодировать, думаю надо ввести строку с этими крайними битами, т.к первый бит у русского и английского разные, но Ваш синтаксис для меня слишком сложен, не смогу) SOS Cyborg Drone
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 22:19 8
Дмитрий97_09, если Вы используете юникод (как я понял, в кодовых страницах совсем не разбираетесь, ведь так?) то такое возможно. Используйте упрощённый вариант:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const rus = 'АаВЕеКМНОоРрСсТХх';
      lat = 'AaBEeKMHOoPpCcTXx';
var f, g: file of char;
    ch: char;
    p: integer;
begin
  assign(f, 'f.txt');
  reset(f);
  assign(g, 'g.txt');
  rewrite(g);
  while not eof(f) do
    begin
      read(f, ch);
      p := pos(ch, rus);
      if p > 0 then ch := lat[p];
      write(g, ch)
    end;
  close(f);
  close(g)
end.
Вам нужно разобраться, в первую очередь, с которой кодировкой Вы работаете. Вот пример для кодировки CP866, показывающий коды букв строки до и после преобразования:
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
procedure writeln_bin(c: char);
var i, b, m: byte;
begin
  write(c, ' ');
  m := 128;
  b := byte(c);
  for i := 7 downto 0 do
    begin
      if m and b > 0 then write('1') else write('0');
      m := m shr 1
    end;
  writeln
end;
 
const rus = 'АаВЕеКМНОоРрСсТХх';
      lat = 'AaBEeKMHOoPpCcTXx';
var s: string;
    i: integer;
begin
  s := 'АВЕ МАРИЯ';
  writeln(sizeof(char));
  writeln;
  for i := 1 to length(s) do writeln_bin(s[i]);
  writeln;
  for i := 1 to length(s) do if pos(s[i], rus) > 0 then s[i] := lat[pos(s[i], rus)];
  for i := 1 to length(s) do writeln_bin(s[i]);
  readln
end.
Протокол работы программы:
Код
1

А 10000000
В 10000010
Е 10000101
  00100000
М 10001100
А 10000000
Р 10010000
И 10001000
Я 10011111

A 01000001
B 01000010
E 01000101
  00100000
M 01001101
A 01000001
P 01010000
И 10001000
Я 10011111
Первая строка (как видите, там 1) - это размер символа в байтах. У изначальной строки старший бит у русских букв равен 1, у преобразованной - нулю. Что не так? Попробуйте запустить это на Вашем паскале, и, если у Вас будет в первой строке 2, а в остальных строках - чушь собачья, значит, у Вас используется unicode, и о старшем бите символа Вам точно нужно забыть.
1
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
24.03.2017, 22:22  [ТС] 9
первая строка 2... Как это вообще можно исправить?
Все,заработала, использовал Ваш упрощенный вариант)
Огромнейшее спасибо)
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 23:37 10
Насчёт младшего бита... Он никак не ассоциируется с тем, к которому языку относится символ. Различие по первому биту ничем Вам не поможет.

Добавлено через 2 минуты
Цитата Сообщение от Дмитрий97_09 Посмотреть сообщение
первая строка 2
Значит, юникод. Никак не исправить, забудьте о старшем, равно как и о каком-то другом бите, для юникода это не актуально. Подождите секунду, сейчас напишу Вам тест для юникода и поясню результат.

Добавлено через 1 час 9 минут
Так... У меня нет паскаля, работающего с UTF-16. Если вручную, то так:
Код
2

А 00000100 00010000
В 00000100 00010010
Е 00000100 00010101
  00000000 00100000
М 00000100 00011100
А 00000100 00010000
Р 00000100 00100000
И 00000100 00011000
Я 00000100 00101111

A 00000000 01000001
B 00000000 01000010
E 00000000 01000101
  00000000 00100000
M 00000000 01001101
A 00000000 01000001
P 00000000 01010000
И 00000100 00011000
Я 00000100 00101111
Видно, что русские и латинские буквы отличаются первым байтом, а не первым битом. Но, что хуже, юникод UTF-16 в чистом виде не применяется, сейчас вообще более распространены 8-битные кодировки UTF-8 и UTF-8 с BOM, длина символа в которых варьируется от 1 до 6 байт. Что-либо разбирать побитово в тексте UTF-8 - очень неблагодарное занятие.

Для выполнения задания Вам нужно перейти на 8-битную ANSI кодировку, наверное, оптимальной будет CP1251, хотя, куда ни кинь, везде клин. В текстовых файлах Windows до XP включительно используется CP1251, но в консоли она отображается неверно, так как там используется кодировка CP866, которая, в свою очередь, неверно отображается в блокноте. На более старших виндах используется UTF-8.

И есть одна глобальная беда: в подавляющем большинстве диалектов паскаля работа с юникодом сделана из рук вон как плохо.

Не знаю, что Вам ещё посоветовать. Простых выходов что-то не вижу.
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
24.03.2017, 23:48  [ТС] 11
Нашел альтернативный блокнот, поддерживающий разные кодировки, если с ним работать, тоже не получится?

Добавлено через 4 минуты
нет, работать не захотел...
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
24.03.2017, 23:53 12
Если досовскую кодировку (CP866) нужно посмотреть в блокноте, это ещё можно. Достаточно выставить в блокноте (Меню Формат -> Шрифт...) какой-нибудь OEM-шрифт, например, Terminal.
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
25.03.2017, 00:12  [ТС] 13
А что если требовалось просто перевести букву в двоичный код и сколько 1 в коде было бы, столько раз бы и надо было бы менять... Как-то странно задача поставленна
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
25.03.2017, 00:42 14
Уточняйте, может быть, что-нибудь и придумаем.
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
25.03.2017, 10:00  [ТС] 15
Мы переводим текст в двоичный код, получается длинный набор 1 и 0 которые мы запишем в строку.
И дальше сама замена, т.е каждую букву прогонять по этой строке 1 и 0, типа если 0, то идем дальше по этой строке, если 1, то меняем,дальше идем по строке, снова 1-снова меняем и т.д пока не кончится строка двоичного кода.
Затем переходим к следующей букве и повторяем все то же самое.
А строку эту нужно оставить, она послужит ключом для обратной расшифровки. Как-то так.
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
25.03.2017, 10:07 16
Вы точно различаете понятия "бит" и "байт"? Я Вас перестаю понимать.
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
25.03.2017, 11:14  [ТС] 17
Задача 6. условие то же, что и в задаче 3. Только если бит секретного сообщения равен единице, то в тексте-контейнере меняем русскую букву на английский аналог. Если бит равен нулю, то очередную букву-аналог в тексте-контейнере оставляем без изменений. Буквы-аналоги - это буквы русского языка, имеющие аналогичное начертание в англ. языке.
После шифрования, шифровку надо обратно раскодировать.

Вот задание. Сам ничего не придумывал.

Добавлено через 33 секунды
Задача 3. Маршрутное шифрование.
Этот способ шифрования изобрел выдающийся французский математик и криптограф Франсуа Виет (1540-1603). Пусть m и n – некоторые натуральные числа, каждое больше 1. Открытый текст последовательно разбивается на части (блоки) с длиной, равной произведению mn (если в последнем блоке не хватает букв, можно дописать до нужной длины произвольный их набор). Блок вписывается построчно в таблицу размерности m×n (т.е. m строк и n столбцов). Криптограмма получается выписыванием букв из таблицы в соответствии с некоторым маршрутом. Этот маршрут вместе с числами m и n составляет ключ шифра. Чаще всего буквы выписывают по столбцам, которые упорядочиваются в соответствии с паролем: под таблицей подписывается слово, состоящее из n неповторяющихся букв, и столбцы таблицы нумеруются по алфавитному порядку букв пароля. Например, для шифрования открытого текста, выражающего один из главных принципов криптологии: нельзя недооценивать противника, добавим к его 29 буквам еще одну, скажем а, возьмем m=5, n=6, впишем текст в таблицу 5×6 и выберем в качестве пароля слово п а р о л ь:
н е л ь з я
н е д о о ц
е н и в а т
ь п р о т и
в н и к а а
п а р о л ь
Выписывая теперь буквы по столбцам в соответствии с алфавитным порядком букв в пароле, получаем следующую криптограмму: ЕЕНПНЗОАТАЬОВОКННЕЬВЛДИРИЯЦТИА (пробелы пропускаются).
Составить программу, которая по заданным m, n и паролю выполнит шифрование/дешифрование методом Виета.
Вот третья задача.

Добавлено через 1 минуту
Третья задача у меня сделана. А в 6 надо просто сделать замену исходного файла чтоб выполнить условие
0
Cyborg Drone
Модератор
5472 / 3290 / 2480
Регистрация: 17.08.2012
Сообщений: 10,578
25.03.2017, 21:49 18
Эту тему: Программка на тему криптографии смотрели?
0
Дмитрий97_09
0 / 0 / 0
Регистрация: 03.12.2015
Сообщений: 23
26.03.2017, 01:13  [ТС] 19
Её создал мой приятель, это 3 задача, я описал,что мне надо, только изменить исходный файл, все. Сидел думал, у меня не получалось, решил написать сюда. Задача стоит иная
0
26.03.2017, 01:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2017, 01:13

Замена группы букв в строке.
Дана строка символов.Заменить в ней каждую группу букв &quot;child&quot; группой букв...

Замена букв в словах предложения.
Плиз, нужно составить прогу, кот заменяла бы первую букву на последнюю любого...

Замена заглавных (прописных) букв на маленькие
Помогите сообщение так, чтобы все заглавные буквы стали соответствующими...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru