Помощь - Поиск - Пользователи - Календарь
Полная версия: Улучшить программу
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Cherry225
Программа работает, но нужно немного ее улучшить . Нужно что бы у одинаковых слов были разные коды. (Напр. если в книге 3 союза " и" , а мы вводим 5 , то программа должна при шифровке вывести 1 2 3 1 2)
Помогите пожалуйста


Сама программа:

 

{ Нужно реализовать шифровку и расшифровку с помощью кодировочной книги. }

const
MaxWord: integer = 200;

type
TBook = array[1..MaxWord] of string; // тип для выходного массива слов

function GetWords(const line: string; var words: TBook; var count: integer): integer; // разбиение строки на слова по разделителю
const
delimiter = [' ',',','.','(',')',':','?','!'];
var
back,pos,n: integer;
begin
pos:=1;
while pos <= length(line) do
begin
while (pos <= length(line)) and (line[pos] in delimiter) do pos:=pos+1;
if pos <= length(line) then
begin
back:=pos;
while (pos <= length(line)) and not(line[pos] in delimiter) do pos:=pos+1;
n:=n+1;
words[n]:=copy(line,back,pos-back);
end;
end;
GetWords:=n;
end;

var
book,txt: TBook;
shifr: array[1..MaxWord] of integer;
i,j,k,n: integer;
str: string;
key: byte;
f: text;

begin
assign(f,'kkk.txt');
reset(f);
n:=0;
while not eof(f) do
begin
readln(f,str);
n:=GetWords(str,book,n);
end;
close(f);
writeln('Кодировочная книга успешно прочитана...');
repeat
writeln;
writeln(' < МЕНЮ > ');
writeln(' 1 - зашифровать текст');
writeln(' 2 - дешифровать текст');
writeln(' 3 - выход');
writeln;
write('Введите номер пункта : ');
readln(key);
case key of
1: begin
write('Введите текст : ');
readln(str);
write('Зашифрованный текст : ');
k:=0;
k:=GetWords(str,txt,k);
for i:=1 to k do
begin
j:=1;
while j <= n do
begin
if txt[i] = book[j] then
begin
write(j,' ');
j:=n;
end;
j:=j+1;
end;
end;
writeln;
end;
2: begin
write('Введите количество слов в тексте : ');
readln(k);
write('Введите шифр : ');
for i:=1 to k do read(shifr[i]);
writeln;
write('Дешифрованный текст : ');
for i:=1 to k do write(book[shifr[i]],' ');
writeln;
end;
3: writeln('Нажмите любую клавишу для выхода...');
end;
until key = 3;
readln;
end.



Федосеев Павел
У алгоритма же есть какое-то описание. Приведите его и ещё приведите эталонный пример.
Cherry225
Цитата(Федосеев Павел @ 13.11.2016 5:45) *

У алгоритма же есть какое-то описание. Приведите его и ещё приведите эталонный пример.

реализация шифрования и расшифровки методом «Кодировочная книга». При этом будем считать, что кодом служит позиция слова в кодировочной книге (специально подготовленном файле), причем, если слово встречается несколько раз и в открытом тексте, и в кодировочной книге, в закрытом тексте для одного и того же слова будут использованы разные коды.
Например в моей программе выводит :
вводимый текст-> я я я я помню
зашифрованный текст -> 2 2 2 2 14

Но в книге две 2 местоимения "я", поэтому зашифровываться должно по разному. Подскажите пожалуйста, как это сделать
Федосеев Павел
Я просил привести эталонный пример.

Но, вроде бы, понятно.

Заведите массив (а лучше список на динамических структурах) использованных слов и количества уже закодированных слов (это будет массив или список типа record). Лучше сделать список сразу упорядоченным.

Обнулите его. Потом, по мере кодирования инкрементируйте соответствующий элемент массива. Это и будет количеством пропускаемых слов в "книге".

-----------
Приложите файл с книгой.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.