Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ помогите написать 1 програмку

Автор: director 18.05.2007 0:47

Буду очень благодарен, если вы хоть как-то поможете с написанием этой программы:
Зашифруйте фразу, заменив букву а на у, букву и на ю и букву е на букву я. После запроса расшифруйте фразу.
(принцип: в окне пользователя пользователь сам вводит любую фразу, далее заменяются соответствующие буквы и фраза выдается в зашифрованном виде. Далее программа спрашивает: "расшифровать фразу?", если вы отвечаете "да" то происходит обратная замена букв и вывод первоначальной фразы.) mega_chok.gif
заранее всем благодарен!

Автор: мисс_граффити 18.05.2007 0:56

Проходишь по строке, анализируя каждый символ... если это а, и или е, заменяешь
как расшифровывать - непонятно.

Автор: Артемий 18.05.2007 0:56

var
s: string;
i: integer;
begin
readln(s);
for i:=1 to length(s) do begin
case s[i] of
'à': s[i]:='ó';
'è': s[i]:='þ';
'å': s[i]:='ÿ';
end;
end;
writeln(s);
readln
end.

а на основе расшифровку попробуй сделать сам...

Автор: nikita182 18.05.2007 5:24




uses crt;

var
i : integer;
s,s1 : string;
c : char;

begin
clrscr;
writeln ('вводи');
readln (s);
s1 := s;
for i := 1 to length(s) do begin
if ord(s[i]) = 160 then
s[i] := chr(227);
if ord(s[i]) = 168 then
s[i] := chr(238);
if ord(s[i]) = 165 then
s[i] := chr(239);
end;
writeln(s);
writeln;
writeln('расшифровать? y/n');
readln©;
if c = 'y' then
writeln(s1);
readkey;
end.





вот и вся расшифровка)

Автор: samec 18.05.2007 9:54

Цитата(nikita182 @ 18.05.2007 5:24) *

вот и вся расшифровка)

умно smile.gif но помоему непроканает.. нужно как то запоминать какие символы в введенной строке были зашифрованы, а при расшифровке именно их и расшифровывать, а не другие.

Автор: Гость 18.05.2007 15:09

запоминать ничего не надо, символы те же, только наоборот...

Автор: nikita182 18.05.2007 15:11

непроканает - переделаем)

Автор: volvo 18.05.2007 15:13

Цитата
символы те же, только наоборот...
Да?

"Это я, привет!" - зашифруй и дешифруй... Я хочу видеть, что ты получишь в результате...

Автор: nikita182 18.05.2007 16:04

согласен косяк, это я с просонья)
исправляюсь:




uses crt;

var
i,j,x : integer;
s,s1,s2 : string;
c : char;

begin
clrscr;
writeln ('вводи');
readln (s);
s1 := '';
for i := 1 to length(s) do begin
if ord(s[i]) = 160 then begin
s[i] := chr(227);
str (i, s2);
s1 := s1 + s2;
end;
if ord(s[i]) = 168 then begin
s[i] := chr(238);
str (i, s2);
s1 := s1 + s2;
end;
if ord(s[i]) = 165 then begin
s[i] := chr(239);
str (i, s2);
s1 := s1 + s2;
end;
end;
writeln(s);
writeln;
writeln('расшифровать? y/n');
readln©;
if c = 'y' then
for i := 1 to length(s1) do begin
val (s1[i], j, x);
if ord(s[j]) = 227 then
s[j] := chr(160);
if ord(s[j]) = 238 then
s[j] := chr(168);
if ord(s[j]) = 239 then
s[j] := chr(165);
end;

writeln(s);


readkey;
end.






Автор: Айра 18.05.2007 16:12

Цитата
согласен косяк, это я с просонья)
исправляюсь:

А у меня она не шифрует вообще.. Может коды символов разные?

Раз уж сделала, то выложу и свой вариант:
uses wincrt;
var
ch: array[1..50] of integer; {здесь храним номера измененных символов}
s,c: string;
i,j: integer;
begin
j:=1;
writeln ('введите строку');
readln(s);
for i:=1 to length(s) do
begin
case s[i] of
'и': begin
s[i]:='ю';
ch[j]:=i;
inc(j);
end;
'е': begin
s[i]:='я';
ch[j]:=i;
inc(j);
end;
'а': begin
s[i]:='y';
ch[j]:=i;
inc(j);
end;
end;
end;
writeln('Зашифровано: ',s,'');
writeln;
writeln('расшифровать? y/n');
readln©;
if c='y' then
begin
for i:=1 to j do
begin
case s[ch[i]] of {расшифровываем только символы с сохраненными номерами}
'у': s[ch[i]]:='а';
'я': s[ch[i]]:='е';
'ю': s[ch[i]]:='и';
end;
end;
writeln('Расшифровано: ',s,'');
end;
readln
end.

Автор: nikita182 18.05.2007 16:15

ascii код точно такой, может с кодировкой чего..
я долго мучился чтоб паскаль русский понимал)

Автор: Айра 18.05.2007 16:25

Цитата
ascii код точно такой, может с кодировкой чего..

Сейчас проверила (одна программка умеет находить коды), у меня:
а = 224
е = 229
и = 232
у = 243
ю = 254
я = 255
Воть так.
Цитата
я долго мучился чтоб паскаль русский понимал)

А у меня с этим проблем не было, правда есть некоторые другие)))

Автор: nikita182 18.05.2007 16:33

бляха-муха...
тогда программа, которая возвращает код символа:



uses crt;

var
simvol : char;
flag : boolean;
i : integer;

procedure vozvrat;

begin
repeat
clrscr;
writeln('vvodi...esc - vixod!');
simvol:=readkey;
clrscr;
writeln('vvel:',simvol,' kod:',ord(simvol));
readkey;
until ord(simvol) = 27;

readkey;
end;

begin
vozvrat;
end.





сам подставит))




Автор: volvo 18.05.2007 16:36

Оля,

    for j:=1 to 6 do begin
- это зачем? Ты для этого разве запоминала J, чтобы потом вводить вручную, сколько символов заменять? Лучше - так:
    for i:=1 to j do begin
case s[ch[i]] of ...

Автор: director 18.05.2007 16:40

УРА!!!!!!!!!!!!!!!!!!!!!!!!!!! good.gif
Все работает! Спасибо всем вам большое за помощь!!!!
в особенности Айре! give_rose.gif
Даже не предполагал, что столько людей откликнется мне на помощь!
Еще раз спасибо всем!

Автор: Айра 18.05.2007 16:47

Цитата
бляха-муха...

не хорошо.. спокойно smile.gif
Цитата
тогда программа, которая возвращает код символа:

У меня все равно мои цифры получаются. Просто у нас сама кодировка может быть разная, забей на это))
Цитата
это зачем? Ты для этого разве запоминала J, чтобы потом вводить вручную, сколько символов заменять?

Ой.. честно, не догадалась, что можно сделать лучше(( Сейчас исправлю, и буду учиться дальше smile.gif

Автор: director 18.05.2007 19:27

А у меня несколько вопросов по поводу программы.
Мне не совсем понятно что значат следующие фразы в программе:
ch
length
case
inc
unsure.gif

Автор: Айра 18.05.2007 20:13

Цитата
Мне не совсем понятно что значат следующие фразы в программе:

ch - в своей программе я так обозвала)) массив, содержащий номера изменяемых символов.
length - строковая функция, которая вычисляет длину (количество символов) в строке. Т.е. length(s) вычислит, сколько символов в строке s.
case - это оператор выбора. Он позволяет выбрать из нескольких вариантов и для каждого можно прописать соответствующее действие. Например, в этом фрагменте:
case s[ch[i]] of  {сначала вычисляется значение s[ch[i]], а потом смотрится}
'у': s[ch[i]]:='а'; {если s[ch[i]] равно символу 'у', то выполняется одно действие}
'я': s[ch[i]]:='е'; {если s[ch[i]] равно 'я', то - другое, и т.д.}
'ю': s[ch[i]]:='и';
end;


inc - процедура, увеличивающая значение числа в скобках inc(j), по умолчанию на 1, а если написать так: inc(j,5), то, соответственно, на пять.
Если еще что непонятно, спрашивай, объясним smile.gif

Автор: nikita182 19.05.2007 16:18

Цитата(Айра @ 18.05.2007 13:25) *

А у меня с этим проблем не было, правда есть некоторые другие)))


wincrt)) это не проблема..