|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
13.11.2016, 00:22 | #1 (permalink) |
Member
Регистрация: 13.10.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите доработать программу
Код:
{ Нужно реализовать шифровку и расшифровку с помощью кодировочной книги. } 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. |
13.11.2016, 00:22 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Отсылаю вам ссылки на темы, которые очень схожи с вашей Помогите, пожалуйста, доработать Помогите доработать программу Помогите доработать Доработать программу в ABC Помогите доработать программу на Паскале |
13.11.2016, 08:38 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
И ведь каждый раз прошу: сформулируйте исходное задание, опишите (подробно!) применяемый алгоритм шифрования и т.п. Нет - всё мимо. Чирик-чирик, вот программа - исправьте.
Ну как знаете. Ждите - может быть и найдётся энтузиаст, который по неотлаженной программе восстановит алгоритм, разберется "что имел в виду программист" и отладит код. Но я - не он. |
13.11.2016, 10:52 | #3 (permalink) |
Member
Регистрация: 13.10.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
{ Нужно реализовать шифровку и расшифровку с помощью кодировочной книги. }
Алгоритм , если что был указан. Но вот еще раз более подробно: реализация шифрования и расшифровки методом «Кодировочная книга». При этом будем считать, что кодом служит позиция слова в кодировочной книге (специально подготовленном файле), причем, если слово встречается несколько раз и в открытом тексте, и в кодировочной книге, в закрытом тексте для одного и того же слова будут использованы разные коды. |
13.11.2016, 14:45 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Уф, ну - получите.
1. Исправлено довольно много ошибок. Например, объявление в списке параметров функции строку константой - абсурд. Ну и еще по мелочи. Кстати, ну зачем тут функция? По всем статьям подходит процедура. 2. Английские надписи можете обратно заменить русскими: просто мне с кириллицей работать неудобно (у меня DOS-кодировка). 3. Путь к файлу-книге, естественно, исправьте по своему усмотрению. Код:
const MaxWord = 200; delimiter = [' ',',','.','(',')',':','?','!']; type TBook = array[1..MaxWord] of string; // type of word output array Procedure GetWords(line: string; var words: TBook; var count: byte); // Fragmentation of string to words according to delimiter var back,pos,m: integer; begin pos:=1; m:=0; 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; m:=m+1; words[m]:=copy(line,back,pos-back); end; end; count:=m; end; var book,txt: TBook; shifr,posit: array[1..MaxWord] of byte; i,j,k,n,q: byte; st: string; key: byte; f: text; b: boolean; begin assign(f,'D:\kkk.txt'); reset(f); while not eof(f) do begin readln(f,st); GetWords(st,book,n); end; close(f); writeln; writeln('Code book read successfully...'); for i:=1 to n do write(book[i]+' '); repeat writeln; writeln(' < MENU >'); writeln(' 1 - encode text'); writeln(' 2 - decode text'); writeln(' 3 - exit'); writeln; write('Enter the item number: '); readln(key); case key of 1: begin write('Enter the text: '); readln(st); writeln('Encoded text: '); GetWords(st,txt,k); for i:=1 to k do posit[i]:=0; b:=false; for i:=1 to k do begin b:=false; repeat j:=1; repeat if (txt[i]=book[j]) and (j>posit[i]) then begin b:=true; posit[i]:=j; shifr[i]:=j; for q:=i+1 to k do if txt[q]=txt[i] then posit[q]:=j; end else j:=j+1; until b or (j=n+1); if not(b) and (j=n+1) then for q:=1 to k do if txt[q]=txt[i] then posit[q]:=0; until b; end; for i:=1 to k do write(shifr[i],' '); writeln; end; 2: begin write('Enter the number of words in text: '); readln(k); write('Enter the code: '); for i:=1 to k do read(shifr[i]); writeln; write('Decoded text: '); for i:=1 to k do write(book[shifr[i]],' '); writeln; end; end; until key = 3; end. |
13.11.2016, 18:25 | #5 (permalink) |
Member
Регистрация: 13.10.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Спасибо большое, вы очень помогли. Книга работает, но она читает если только текст в книге записан в одну строку , не подскажите как сделать, чтобы программа читала из книги в которой больше чем 1 строка?
тут выдается ошибка Код:
if (txt[i]=book[j]) and (j>posit[i]) then |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
13.11.2016, 18:42 | #6 (permalink) | ||
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Цитата:
Если не секрет, покажите, пожалуйста, Вашу книгу и кодируемый текст. Просто в текстовом виде. |
||
13.11.2016, 19:18 | #8 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А, ну тогда понятно... В Вашем файле - 661 символ, а уж слов - даже и не знаю, может быть и больше 200. А Вы пытаетесь считывать строку...
Мне кажется, тут надо бы ограничиться строкой с количеством символов не более 255. Или кардинально переделать часть программы, где разделение книги на слова: считывать данные из файла посимвольно и "на лету" отделять буквы от разделителей и формировать массив слов. Совсем другая задача. |
13.11.2016, 19:29 | #9 (permalink) |
Member
Регистрация: 13.10.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Но так в моей изначальной программе все нормально шифровало и расшифровывалось из этой книги, кроме повторяющихся слов, вместо разных кодов выводило один и тот же столько раз, сколько я ввела слов
|
13.11.2016, 19:48 | #10 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Ох... ну тогда - не знаю. У меня - классический Free Pascal, в котором строка - это массив символов не длинее 255, и воспринять 660 символов по команде чтения строки он просто не умеет. И я вместе с ним. Извините.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
Опции темы | |
Опции просмотра | |
|
|