Здравствуйте, нужна ваша помощь....
Вот текст задания:
Составить алгоритм и программу обработки фразы (строки текста), находящемся в текстовом файле Inputtxt.txt.
В результате работы программы в файле отчета необходимо в алфавитном порядке расположить буквы из которых состоит текст с их количеством.
Пример:
Содержание исходного файла Inputtxt.txt слово "МАМА"
В результате работы программы получен файл следующего вида:
Буква Количество
А 2
М 2
(служебная информация, не более 2 байт для каждого символа фразы)
В служебной информации должны быть закодированы (зашифрованы) данные о каждой букве фразы.
В дальнейшем, при запуске этой программы входным файлом должен стать файл отчета со служебной информацией. В результате работы должен быть получен текст исходной фразы в файле с именем Output.txt
Вот собственно начал писать программу:
Program labb;
uses crt;
var k,j,m,g,d,l:integer; I,O: text; s:char;
A: array [1..255] of integer;
begin
m:=0;
assign (I,'Input.txt');
reset(I);
while not Eof(I) do
begin
m:=m+1;
read(I, s);
A[m]:=ord(s);
writeln(A[m]);
end;
Close(I);
assign(O,'Output.txt');
l:=0;
for k:=1 to 255 do
begin
if (A[k]<>0) then
begin
append(O);
write(O,chr(A[k]),' - ',l);
writeln(O);
end;
end;
Close(O);
g:=0;
assign(O,'Output.txt');
append(O);
writeln(O,'***********************************');
for j:=1 to m do
begin
append(O);
g:=g+1;
A[g]:=256-A[g];
write(O,chr(A[g]));
end;
Close(O);
readkey;
end.
}
Вобщем уточнил: расположить надо не по алфавиту а по аски кодам что упрощает задачу. ( впринципе по алфавиту располагает, только знаки препинания ставит первыми)
Всем спасибо, подумал подумал и сделал сам, только в программе делается запрос: Расшифровать текст? если нажимаешь y -расшифровывает, если -n, то нет. Но преподаватель сказал что это не критично, так что лаба вроде бы готова!!! Даже не знаю нужно ли код выкладывать?)))
P.S только одна проблема: у больших букв код Аски другой, поэтому программа считает большие и маленькие буквы отдельно думаю не критично, но хотелось бы избавиться от данной беды, или никак?
все-таки хотелось бы чтобы программа расшифровывала данные после 2 го запуска. Как ни пытался сделать условие, что при прочтении файла log.txt (там появляются знаки ******), если есть эти символы(*) то начать расшифровывать... но чтото при запуске программа выдавала ошибку
Ага, ясно.. Я невнимательно читал просто. Восстановление текста производится не по частотам символов, а по "служебной информации" в конце файла )).
короче отказался я от идеи считывать "здездочки", так как считаю это невозможным все-таки
и последний вопрос: можно сделать так, чтобы допустим когда возникает ошибка, программа не закрывалась, а выдавала текстовое сообщение и только после нажатия клавиши закрывалась? Допустим отсутствует файл input.txt. Программа сразу не закрывается а выдает сообщение что файл отсутствует.
P.S чуть попозже выложу весь код...
Посмотри http://tpdn.ru/guide/pf/reset/
Если не сложно выложите окончательный вариант кода
Вот идеально выполненное задание.)))
Program lab1;
uses crt;
var
i,l:integer; {переменная i в используется в циклах, l – для хранения ASCII кода символа}
M,O,B: text; {текстовые переменные}
s:char; {символьная переменная, для чтения файла}
A: array [0..255] of byte; {массив используется в качестве счетчика}
begin
{$I-} {Директива компилятора, отключение проверки ошибок ввода-вывода}
assign(M,'Input.txt'); {Назначение файловым переменным имен внешних файлов}
assign(O,'log.txt');
assign(B,'Output.txt');
reset(M); {Открытие файла Input.txt для чтения}
if (IOResult<>0) then begin {Если файл Input.txt не существует}
writeln('Файл input.txt не существует!');
rewrite(M); {Создание пустого файла Input.txt}
writeln('Создан пустой файл input.txt, внесите в него текст для обработки');
writeln('Нажмите любую клавишу для выхода');
readkey; {Ожидание нажатия клавиши}
exit; {Выход из программы}
end;
reset(O); {Открытие файла log.txt для чтения}
{$I+} {Директива компилятора, включение проверки ошибок ввода-вывода}
if (IOResult=0) then begin {Если файл log.txt существует, то}
rewrite(B); {Создание файла output.txt}
Writeln('Создан файл, содержащий исходный текст Output.txt');
while not Eof(O) do begin {пока файл log.txt не кончиться….}
read(O,s); {Посимвольное чтение файла log.txt}
l:=ord(s); {перевод из символа в ASCII код}
if l=38 then begin
{Если встречается символ с кодом равным 38(&) – ключ, то все символы до него стираются}
rewrite(B);
continue; {прерывание цикла, сам ключ не будет записываться в файл Output.txt}
end;
l:=l+5; {Дешифровка}
write(B,chr(l)); {Запись исходного (дешифрованного) текста в файл Output.txt}
end;
close(O); {Закрытие файла log.txt}
close(B); {Закрытие файла output.txt}
end
else begin {Если файл log.txt не существует…}
writeln('Чтобы расшифровать текст запустите программу заново');
end;
while not Eof(M) do begin {Пока файл input.txt не закончится…}
read(M, s); {Посимвольное чтение файла input.txt}
i:=ord(s); {перевод из символа в ASCII код}
A[i]:=A[i]+1; {Подсчет количества символов}
if (i>=224) and (i<=255) then begin
i:=i-32; {Смещение ASCII кодов маленьких русских букв}
A[i]:=A[i]+1; {суммирование количества маленьких букв к большим}
end;
if (i=184) then begin
i:=i-16; {Смещение ASCII кода буквы ”ё”}
A[i]:=A[i]+1; {суммирование количества маленьких букв ”ё” к большим ”Ё”}
end;
if (i>=97) and (i<=122) then begin
i:=i-32; {Смещение ASCII кодов маленьких английских букв}
A[i]:=A[i]+1; {суммирование количества маленьких букв к большим}
end;
end;
Close(M); {Закрытие файла input.txt}
Rewrite(O); {Открытие log.txt на запись}
write(O,chr(209),chr(232),chr(236),chr(226),chr(238),chr(235)); {Текст: Символ}
writeln(O,' ',chr(202),chr(238),chr(235),'-',chr(226),chr(238)); {Текст: Кол-во}
for i:=192 to 223 do begin {Запись в файл log.txt количества русских букв}
if A[i]<>0 then
writeln(O,' ',chr(i),' - ',A[i]);
end;
if A[168]<>0 then begin {Запись в файл количества букв ”Ё”}
writeln(O,' ',chr(168),' - ',A[168]);
end;
for i:=65 to 90 do begin {Запись в файл количества английских букв}
if A[i]<>0 then
writeln(O,' ',chr(i),' - ',A[i]);
end;
writeln(O,'------------------------------------'); {Разделитель}
write(O,chr(38)); {Запись в файл log.txt ключа, чтобы отделить фразу от служебной информации}
reset(M); {Открытие файла input.txt на чтение}
while not Eof(M) do begin {Пока файл input.txt не кончится…}
read(M,s); {Посимвольное чтение файла input.txt}
l:=ord(s); {перевод из символа в ASCII код}
l:=l-5; {Смещение ASCII кодов на 5 влево (шифрование)}
write(O,chr(l)); {запись зашифрованного текста в файл log.txt}
end;
Close(M); {Закрытие файла input.txt}
Close(O); {Закрытие файла log.txt}
Writeln('Создан файл со служебной информацией log.txt');
Writeln('Нажмите любую клавишу чтобы выйти');
readkey; {Ожидание нажатия клавиши}
end.
A[i]:=A[i]+1, легко заменяемое на Inc(A[i]). Причем, есго нужно ставить только один раз (после перевода). Условие
and (i<=255)тоже выглядит странно, если учесть, что номер символа просто не бывает больше 255 . Ну, я не буду проводить полный разбор..
> if (i>=224) and (i<=255) then begin
> if (i=184) then begin
> if (i>=97) and (i<=122) then begin
Что такое 224,255,184,97,122?
constИли как-то иначе, но смысл в том, что желательно не использовать голые числа. Правда, лично я особо на это в данном случае не стал бы нажимать, поскольку по крайней мере все это прокомментировано.
Rus866StartHigh= 224;
Rus866LetterYo= 184
...
> Тарас прекрасно знает коды всех букв (может, наизусть)
Давно забыл, на самом деле.
> Rus866StartHigh= 224;
Почему никто не напишет просто 'а'..'я'? Зачем вообще эти цифры тут нужны?