Модераторы: Alx, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pascal] Дешифровка сообщений,операции со строками, заочная олимпиада по информатике 
:(
    Опции темы
KasMP
Дата 17.10.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Уже (или еще только?) третий день делаю эту олимпиаду.
Упор делается на оригинальность, нестандартность, неординарность алгоритма и т.п..

Цитата
7. Пусть нужно передать информацию по каналу связи, но ее требуется зашифровать. Исходный алфавит состоит из "0" (нуля), "1" (единицы) и " " (пробела). Информация шифруется:
"0" - 0110
"1" - 000
" " - 010
Написать программу для дешифровки таких сообщений.

Оценка: 15 баллов.

Первый раз буду делать что-то со строками... smile

Добавлено @ 20:31 
n - начальное зашифрованное сообщение;
r - требуемый результат, расшифрованное сообщение;
p - строка для временного хранения и анализа части строки n;
j - номер символа строки n, с которого начнется копирование символов в строку p; позже - длина строки r;
i - вспомогательная переменная для организации циклов и т.п..

Если присмотреться, то можно увидеть, что "0110", "000" и "010" можно отличить, проанализировав вторую и третью цифру (считая слева) (получится "11", "00", и "10" соответственно)
Поэтому в строку p достаточно скопировать только вторую и третью цифры. Поэтому начальное значение j - 2 и поэтому я копирую 2 цифры.
После копирования j сразу же увеличивается на 3, чтобы затем перешагнуть через 3 элемента и начать копирование снова. Но "1" шифруется не 3, а 4 цифрами, поэтому, если зашифрованным символом оказывается "1", нужно увеличить j еще на единицу.
Расшифрованный символ записывается в строку r под переменным номером i.
Если j превышает длину исходного сообщения n, то получается, что расшифровано все сообщения, поэтому выполнение цикла следует прекратить.
Затем j присваивается значение длины строки r, и выводится строка r.

Надеюсь, я понятно объяснила. smile 
Код
var    n, r, p[2]: string;
    i, j: integer;


begin
readln (n);

i:=1;
j:=2;

while j<length(n) do begin
    p:=copy(n, j, 2);
    j:=j+3;
    if ((p[1]='1') and (p[2]='1')) then begin
        r[i]:='0';
        j:=j+1;
        end;
    if ((p[1]='0') and (p[2]='0')) then r[i]:='1';
    if ((p[1]='1') and (p[2]='0')) then r[i]:=' ';
    i:=i+1;
    end;

j:=i-1;
for i:=1 to j do write (r[i]);


readln;
end.


Добавлено @ 20:34 
Еще можно переводить значение первых трех цифр в число и затем анализировать число.
("0110" - 11 - "0";
"000" - 0 - "1";
"010" - 10 - " ").

А как бы сделали вы? smile  smile  smile 
PM MAIL   Вверх
volvo877
Дата 17.10.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: нет
Всего: 116



KasMP, во-первых, у тебя есть опасный код:
Цитата
r[i] := '1';
Оно, конечно, скомпилируется, только... Не должно работать. Место под этот элемент строки не выделено... Да, кстати, зачем сравнивать элементы строки посимвольно, если можно сравнить всю строку?  smile Заменяй на такую конструкцию:
Код
...
   if p ='00' then r := r + '1';
...
и т.д.
PM MAIL   Вверх
Romikgy
Дата 17.10.2006, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 2
Всего: 146



Код

function decod(sx: string): string;
var i: integer;
  sout: string;
begin
sout:='';
 i:=1;
 while (i<length(sx)) do
 begin
 if (sx[i]='0') then
  begin
  i:=i+1;
  if (sx[i]='0') then 
  begin
  if (sx[i+1]='0') then sout:=sout+'1';
  i:=i+2;
  end
  else 
   begin
    i:=i+1;
    if (sx[i]='0') then begin  sout:=sout+' '; i:=i+1; end
    else begin if (sx[i+1]='0') then sout:=sout+'0'; i:=i+2; end;
   end;
  end;
 end;
end;

мой вариант , но я не проверял, 
и еще одно , мне непонятно что должен делать код при ошибочной комбинации?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
KasMP
Дата 18.10.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 586
Регистрация: 8.8.2006

Репутация: 2
Всего: 30



Цитата(volvo877 @  17.10.2006,  21:02 Найти цитируемый пост)
Место под этот элемент строки не выделено...

Т.е. как?
Видимо, я что-то не так понимаю: имхо если в разделе "var" сказано, что "r"- строка, то переменная "r" в любой момент должна быть готова принять 255 символов.
Как правильно? smile  smile 
Цитата(volvo877 @  17.10.2006,  21:02 Найти цитируемый пост)
Да, кстати, зачем сравнивать элементы строки посимвольно, если можно сравнить всю строку?  smile 

Затем, что я первый раз юзаю строки и не знала, что так можно. smile 
Цитата(Romikgy @  17.10.2006,  21:04 Найти цитируемый пост)
и еще одно , мне непонятно что должен делать код при ошибочной комбинации? 

Если в условии не сказано, то, получается, что это на наше усмотрение. smile 
Имхо можно сделать так:
Код
if ((p<>'11') and (p<>'00') and (p<>'10')) then begin
        writeln ('Неверная шифровка');
        goto 1;
        end;


Добавлено @ 19:27 
А как можно обойтись без прямого перехода? smile 
Код
var    n, r, p: string;
    i, j: integer;
label    1;


begin
1:
readln (n);

i:=1;
j:=2;

while j<length(n) do begin
    p:=copy(n, j, 2);
    j:=j+3;
    if p='11' then begin
        r[i]:='0';
        j:=j+1;
        end;
    if p='00' then r[i]:='1';
    if p='10' then r[i]:=' ';
    if ((p<>'11') and (p<>'00') and (p<>'10')) then begin
        writeln ('Nevernay shifrovka');
        goto 1;
        end;
    i:=i+1;
    end;

j:=i-1;
for i:=1 to j do write (r[i]);


readln;
end.

PM MAIL   Вверх
Akina
Дата 18.10.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 2
Всего: 454



Не знаю, есть ли такое в Паскале, но на Бэйсике это выглядело бы так:

Код

strTemp = Replace(strEncrypted, "010", " ")
strTemp = Replace(strTemp, "0110", "2")
strTemp = Replace(strTemp, "000", "1")
strDecrypted = Replace(strTemp, "2", "0")



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Romikgy
Дата 18.10.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 2
Всего: 146



в дельфи так можно в паскале имхо нет


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Интересные и занимательные задачи по программированию | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.