Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2013, 15:17   #1
jihot
Начинающий кодер
Пользователь
 
Аватар для jihot
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию Задача про кодирование текста (не получается реализовать из-за буквы ё в ascii)

Друзья, Прошу помощи!

Вроде простая задача :
Цитата:
Один из самых простых способов закодировать текст заключается в следующем.
Выбирается целое число – сдвиг кодирования. Закодированная буква получается из исходной
буквы путем циклического сдвига в алфавите на заданное число позиций.
Если сдвиг кодирования отрицательный, то циклический сдвиг осуществляется влево, если положительный,
то вправо, если сдвиг равен нулю, то кодирования не происходит.
Например, если сдвиг кодирования равен -1, то строка АБРАКАДАБРА будет закодирована как ЯАПЯЙЯГЯАПЯ.
Напишите программу, которая кодирует текст указанным способом.

Входные данные
В первой строке входных данных записано целое число из диапазона –64 000..64 000 – сдвиг кодирования.
В последующих строках записан непустой текст, предназначенный для кодирования.

Выходные данные
Закодированный текст. В закодированном тексте должны быть изменены только буквы латиницы и кириллицы, а пробелы, знаки пунктуации и прочие символы должны остаться
без изменений. Символы Ё, Й, Ъ, Ь считаются буквами кириллицы. Регистры соответствующих символов закодированного и исходного текста должны совпадать.

Пример:
1
To be or not to be?
АБРАКАДАБРА

Результат:
Up cf pq opu up cf?
БВСБЛБЕБВСБ
Первое что сразу пришло в мысль, посимвольно считывать и сдвигать код символа через ord(), ну дальше вы поймете наверно код..он работает, но самая главная проблема с буквой Ё, т.к она не входит в промежуток А..Я (имеет другой код символа).

В итоге программа не обрабатывала Ё, но отдельно для неё сделал кейс, теперь Ё обрабатывается верно , НО :
если у меня будет буква Е, при сдвиге на +1 выведет букву Ж, т.к ну не знает он буквы Ё

Если понятна проблема, помогите, пожалуйста!
В теории если не ошибусь, при сдвиге на 100 все буквы тоже будут считаться не верно т.к буква ё не учитывается .

Код:
program Lab8;

{$APPTYPE CONSOLE}

procedure check(c: char; code: integer; var new_c: char);
begin
  case C of
    'A'..'Z': 
      begin
        code := code mod 26;
        if ord(c) + code < 65 then new_c := chr(ord(c) + code + 26) else
        if ord(c) + code > 90 then new_c := chr(ord(c) + code - 26) else new_c := chr(ord(c) + code); end;
    
    'a'..'z': 
      begin
        code := code mod 26;
        if ord(c) + code < 97 then new_c := chr(ord(c) + code + 26) else
        if ord(c) + code > 122 then new_c := chr(ord(c) + code - 26) else new_c := chr(ord(c) + code); end;
    
    'А'..'Я':
      begin
        code := code mod 32;
        if ord(c) + code < 192 then new_c := chr(ord(c) + code + 32) else
        if ord(c) + code > 223 then new_c := chr(ord(c) + code - 32) else new_c := chr(ord(c) + code); end;
    'а'..'я':
      begin
        code := code mod 32;
        if ord(c) + code < 224 then new_c := chr(ord(c) + code + 32) else
        if ord(c) + code > 255 then new_c := chr(ord(c) + code - 32) else new_c := chr(ord(c) + code); 
      end;
    'Ё':
      begin
       code := code mod 32;
       if code > 0 then begin if ord('Е')+code<192 then new_c:=chr(ord('Е')+code+31) else if ord('Е')+code>223 then new_c:=chr(ord('Е')+code-33) else new_c:=chr(ord('Е')+code); end else
       if code < 0 then begin if ord('Ж')+code<192 then new_c:=chr(ord('Ж')+code+31) else if ord('Ж')+code>223 then new_c:=chr(ord('Ж')+code-33) else new_c:=chr(ord('Ж')+code); end else
       if code = 0 then new_c:=chr(ord(c));
      end; 
    'ё':
      begin
       code := code mod 32;
       if code > 0 then begin if ord('е')+code<224 then new_c:=chr(ord('е')+code+31) else if ord('е')+code>255 then new_c:=chr(ord('е')+code-33) else new_c:=chr(ord('е')+code); end else
       if code < 0 then begin if ord('ж')+code<224 then new_c:=chr(ord('ж')+code+31) else if ord('ж')+code>255 then new_c:=chr(ord('ж')+code-33) else new_c:=chr(ord('ж')+code); end else
       if code = 0 then new_c:=chr(ord(c));
      end;      
  else new_c := c;
  end;
end;

procedure input(var f_in: text; code: integer; c: char);
var
  new_c: char;
begin
  readln(f_in, code);
  while not eof(f_in) do
  begin
    read(f_in, c);
    check(c, code, new_c);
    write(new_c);
  end;
end;

var
  f_in: text;
  code: integer;
  c: char;

begin
  Assign(f_in, 'input.txt');
  reset(f_in);
  input(f_in, code, c);
  Close(f_in);
end.
with love ^.^

Последний раз редактировалось jihot; 28.12.2013 в 15:20.
jihot вне форума Ответить с цитированием
Старый 28.12.2013, 15:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы по другому сделал:
Код:
const
  Rus1 = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
  Rus2 = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
....

begin

   if Pos(c, Rus1)>0 then begin
      new_kod := (Pos(c, Rus1) + Code)  mod Length(Rus1);
      new_c := Rus1[new_kod];
  end 
  else
     if Pos(c, Rus2)>0 then begin
      new_kod := (Pos(c, Rus2) + Code)  mod Length(Rus2);
      new_c := Rus2[new_kod];
    end
    else 
      if c in ['A'..'Z'] then ....
      else
        if c in ['a'..'z'] then ....
        else {не кодируемый символ}
          new_c := c;
идея понятна?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.12.2013, 16:11   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

И такой вариант можно
Код:
const Liter: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'+
                      'abcdefghijklmnopqrstuvwxyz'+
                      'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'+
                      'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';

function Koder(Text: String; Step: Smallint): String;
var i,j,k: Integer;
begin
  SetLength(Result,Length(Text));
  for i:=1 to Length(Text) do begin
    j:=Pos(Text[i],Liter);
    if j=0 then Result[i]:=Text[i]
    else begin
      k:=Sign(Step)*(Abs(Step) mod Length(Liter));
      Inc(j,k);
      if j<1 then Inc(j,Length(Liter))
      else if j>Length(Liter) then Dec(j,Length(Liter));
      Result[i]:=Liter[j];
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: String;
begin
  s:=Liter;
  Memo1.Lines.Add(s);
  s:=Koder(s,300);
  Memo1.Lines.Add(s);
  s:=Koder(s,-300);
  Memo1.Lines.Add(s);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.12.2013, 16:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
И такой вариант можно
нет. такой вариант не подойдёт.
В исходном примере видно, что алфавиты в задаче рассматриваются отдельно.

Цитата:
Например, если сдвиг кодирования равен -1, то строка АБРАКАДАБРА будет закодирована как ЯАПЯЙЯГЯАПЯ
ваш код:
Цитата:
АБРАДАБРА
zАПzГzАПz
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.12.2013, 16:46   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну тогда отдельные константы для латиницы и кириллицы и параметр Step сделать Integer, не обратил внимания на 64000. И функцию чуть изменить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.12.2013, 16:50   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Ну тогда отдельные константы для латиницы и кириллицы и параметр Step сделать Integer, не обратил внимания на 64000. И функцию чуть изменить
да, согласен. так можно.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.12.2013, 16:54   #7
jihot
Начинающий кодер
Пользователь
 
Аватар для jihot
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Serge_Bliznykov, Аватар, Спасибо Вам большое!
Код Аватара показался немного сложным, с первого взгляда) хотя если так как писал чуть ниже то наверное верно

Serge не первый раз уже выручает, благодарю. Просто подставил в свой код и всё работает, разве что при отрицательном значении ругалось на Выход за пределы массива, если не ошибусь то получалось Rus1[0] (для code = -1 ), но вроде поправил верно :
Код:
if new_kod<=0 then inc(new_kod, Length(rus1));
with love ^.^
jihot вне форума Ответить с цитированием
Старый 28.12.2013, 22:20   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Пожалуйста.

Цитата:
Сообщение от jihot Посмотреть сообщение
разве что при отрицательном значении ругалось на Выход за пределы массива, если не ошибусь то получалось Rus1[0] (для code = -1 ), но вроде поправил верно :
Код:
if new_kod<=0 then inc(new_kod, Length(rus1));
Вы всё правильно сделали.
Извините, это мой косяк был, я в коде забыл учесть, что сдвиг может быть не только с плюсом, но и с минусом!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.12.2013, 00:47   #9
Marshal_A
Пользователь
 
Регистрация: 28.12.2013
Сообщений: 12
По умолчанию

попробуй вместо ё чаровский код подставить
http://www.work-zilla.com?ref=177050
Marshal_A вне форума Ответить с цитированием
Старый 29.12.2013, 09:41   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Marshal_A Посмотреть сообщение
попробуй вместо ё чаровский код подставить
Во-первых, задача уже решена TC.

во-вторых, ваш совет мимо кассы, он не поможет. Изначально, TC именно так и пытался решить эту проблему. Нужно, чтобы при смещении буква заменялась на буквы алфавита. Например, при смещении = 1, буква ё заменялась на букву ж. В случае использования коды буквы ё это будет добится сложно. Кроме того, ваш совет не решает проблему, что другие буквы должны смещаться на букву ё, например, когда смещение = 2, буква Д должна становиться буквой Ё и т.д.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ASCII из русской буквы Exeil Общие вопросы C/C++ 7 06.02.2017 11:09
Jquery не получается реализовать icesens JavaScript, Ajax 3 15.11.2012 12:41
Не получается реализовать выпадающие списки vitalina-str Microsoft Office Access 2 23.03.2012 04:56
Кодирование текста Crunkordie Общие вопросы Delphi 24 12.05.2011 13:38
Не получается реализовать глобальный класс RIO Visual C++ 0 08.05.2011 18:12