Здравствуйте, нужна ваша помощь.... Вот текст задания:
Составить алгоритм и программу обработки фразы (строки текста), находящемся в текстовом файле 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);
whilenot Eof(I) dobegin
m:=m+1;
read(I, s);
A[m]:=ord(s);
writeln(A[m]);
end;
Close(I);
assign(O,'Output.txt');
l:=0;
for k:=1to255dobeginif (A[k]<>0) thenbegin
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:=1to m dobegin
append(O);
g:=g+1;
A[g]:=256-A[g];
write(O,chr(A[g]));
end;
Close(O);
readkey;
end.
}
То есть я описал массив, записал аски коды символов в него, собственно возникла проблема с подсчетом количества символов(символы как русские так и англ.), зашифровал я методом Atbash, думаю расшифровать смогу при повторном запуске программы, метку в виде звёздочек поставил, а вот как ее потом определить пока не думал
volvo
13.03.2011 18:46
Цитата
В служебной информации должны быть закодированы (зашифрованы) данные о каждой букве фразы. В дальнейшем, при запуске этой программы входным файлом должен стать файл отчета со служебной информацией. В результате работы должен быть получен текст исходной фразы в файле с именем Output.txt
Это невозможно. Хочешь пример? Пожалуйста:
А-1 Г-1 Р-1 У-1
Внимание, вопрос: какое слово было в исходном файле, УГАР, или РАГУ? То есть, я не спрашиваю у тебя, как вообще ты собираешься определять по такой скудной информации, какая буква на какой позиции стояла. Допустим, у тебя есть даже словарь русского языка, и сможешь определить список слов, которые можно составить, имея определенные буквы в определенном количестве. И даже в этом случае невозможно решить задачу, ибо омонимы будут мешать...
А уж если несколько слов во входной фразе - то...
Вывод: надо хранить не только данные, сколько каких букв было, но и какие-то данные о расположении тех или иных букв, какую-то доп. информацию...
Уточняй задание.
Роман
15.03.2011 16:15
Вобщем уточнил: расположить надо не по алфавиту а по аски кодам что упрощает задачу. ( впринципе по алфавиту располагает, только знаки препинания ставит первыми) Всем спасибо, подумал подумал и сделал сам, только в программе делается запрос: Расшифровать текст? если нажимаешь y -расшифровывает, если -n, то нет. Но преподаватель сказал что это не критично, так что лаба вроде бы готова!!! Даже не знаю нужно ли код выкладывать?))) P.S только одна проблема: у больших букв код Аски другой, поэтому программа считает большие и маленькие буквы отдельно думаю не критично, но хотелось бы избавиться от данной беды, или никак?
Lapp
16.03.2011 9:09
Цитата(Роман @ 15.03.2011 12:15)
Вобщем уточнил: расположить надо не по алфавиту а по аски кодам что упрощает задачу. ( впринципе по алфавиту располагает, только знаки препинания ставит первыми)
Непонятно. Проблема, о которой говорил volvo осталась, где и была. Поясни, плз, как ты из этого: А 2 М 2 - делаешь МАМА? Почему не АМАМ или АММА?
Цитата
Всем спасибо, подумал подумал и сделал сам, только в программе делается запрос: Расшифровать текст? если нажимаешь y -расшифровывает, если -n, то нет. Но преподаватель сказал что это не критично, так что лаба вроде бы готова!!! Даже не знаю нужно ли код выкладывать?)))
Заинтриговал.. Не понимаю, как запрос помогает расшифровке. Да, я хотел бы увидеть код, если это возможно, пожалуйста. Просто для того, чтоб понять условие задачи.
Цитата
P.S только одна проблема: у больших букв код Аски другой, поэтому программа считает большие и маленькие буквы отдельно думаю не критично, но хотелось бы избавиться от данной беды, или никак?
Если рассчитывать только на латинский алфавит, то это просто. Используй функцию UpCase(c:char):char из модуля System (который подключен всегда по умолчанию). А если ты хочешь иметь дело с русскими буквами тоже, то несколько сложнее, и тому же зависит от кодовой страницы (1251, 866..) Если тебе это действительно нужно - скажи, объясним.
Роман
16.03.2011 18:51
все-таки хотелось бы чтобы программа расшифровывала данные после 2 го запуска. Как ни пытался сделать условие, что при прочтении файла log.txt (там появляются знаки ******), если есть эти символы(*) то начать расшифровывать... но чтото при запуске программа выдавала ошибку
Lapp
16.03.2011 19:07
Ага, ясно.. Я невнимательно читал просто. Восстановление текста производится не по частотам символов, а по "служебной информации" в конце файла )).
Цитата(Роман @ 16.03.2011 14:51)
все-таки хотелось бы чтобы программа расшифровывала данные после 2 го запуска. Как ни пытался сделать условие, что при прочтении файла log.txt (там появляются знаки ******), если есть эти символы(*) то начать расшифровывать... но чтото при запуске программа выдавала ошибку
Ты все же непонятно изъясняешься. Ты правда думаешь, что мы можем указать на ошибку, когда ты пишешь "но чтото при запуске программа выдавала ошибку". Ни кода, ни даже номера ошибки..
Роман
16.03.2011 20:09
короче отказался я от идеи считывать "здездочки", так как считаю это невозможным все-таки и последний вопрос: можно сделать так, чтобы допустим когда возникает ошибка, программа не закрывалась, а выдавала текстовое сообщение и только после нажатия клавиши закрывалась? Допустим отсутствует файл input.txt. Программа сразу не закрывается а выдает сообщение что файл отсутствует. P.S чуть попозже выложу весь код...
короче отказался я от идеи считывать "здездочки", так как считаю это невозможным все-таки и последний вопрос: можно сделать так, чтобы допустим когда возникает ошибка, программа не закрывалась, а выдавала текстовое сообщение и только после нажатия клавиши закрывалась? Допустим отсутствует файл input.txt. Программа сразу не закрывается а выдает сообщение что файл отсутствует. P.S чуть попозже выложу весь код...
Search the forum "+compiler* +direct*" (in russian), or just "{$I-}"
-Дмитрий-
5.05.2011 20:35
Если не сложно выложите окончательный вариант кода
techno
21.05.2011 9:52
Вот идеально выполненное задание.)))
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) thenbegin{Если файл Input.txt не существует}
writeln('Файл input.txt не существует!');
rewrite(M); {Создание пустого файла Input.txt}
writeln('Создан пустой файл input.txt, внесите в него текст для обработки');
writeln('Нажмите любую клавишу для выхода');
readkey; {Ожидание нажатия клавиши}
exit; {Выход из программы}end;
reset(O); {Открытие файла log.txt для чтения}{$I+}{Директива компилятора, включение проверки ошибок ввода-вывода}if (IOResult=0) thenbegin{Если файл log.txt существует, то}
rewrite(B); {Создание файла output.txt}
Writeln('Создан файл, содержащий исходный текст Output.txt');
whilenot Eof(O) dobegin{пока файл log.txt не кончиться….}
read(O,s); {Посимвольное чтение файла log.txt}
l:=ord(s); {перевод из символа в ASCII код}if l=38thenbegin{Если встречается символ с кодом равным 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}endelsebegin{Если файл log.txt не существует…}
writeln('Чтобы расшифровать текст запустите программу заново');
end;
whilenot Eof(M) dobegin{Пока файл input.txt не закончится…}
read(M, s); {Посимвольное чтение файла input.txt}
i:=ord(s); {перевод из символа в ASCII код}
A[i]:=A[i]+1; {Подсчет количества символов}if (i>=224) and (i<=255) thenbegin
i:=i-32; {Смещение ASCII кодов маленьких русских букв}
A[i]:=A[i]+1; {суммирование количества маленьких букв к большим}end;
if (i=184) thenbegin
i:=i-16; {Смещение ASCII кода буквы ”ё”}
A[i]:=A[i]+1; {суммирование количества маленьких букв ”ё” к большим ”Ё”}end;
if (i>=97) and (i<=122) thenbegin
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:=192to223dobegin{Запись в файл log.txt количества русских букв}if A[i]<>0then
writeln(O,' ',chr(i),' - ',A[i]);
end;
if A[168]<>0thenbegin{Запись в файл количества букв ”Ё”}
writeln(O,' ',chr(168),' - ',A[168]);
end;
for i:=65to90dobegin{Запись в файл количества английских букв}if A[i]<>0then
writeln(O,' ',chr(i),' - ',A[i]);
end;
writeln(O,'------------------------------------'); {Разделитель}
write(O,chr(38)); {Запись в файл log.txt ключа, чтобы отделить фразу от служебной информации}
reset(M); {Открытие файла input.txt на чтение}whilenot Eof(M) dobegin{Пока файл 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.
P.S. это я Роман, просто пароль забыл))) и простите что так долго, программу написал давным давно, но руки не доходили выложить...
Lapp
21.05.2011 10:25
Цитата(techno @ 21.05.2011 6:52)
Вот идеально выполненное задание.
Ха ). Ты зайди сюда через пару годиков, когда поднатореешь в программировании - улыбнешься своему абсолютизму.. )) До идеальности ему так же далеко, как Жигулям до Тоеты )). Меня особо улыбнуло
A[i]:=A[i]+1
, легко заменяемое на Inc(A[i]). Причем, есго нужно ставить только один раз (после перевода). Условие
and (i<=255)
тоже выглядит странно, если учесть, что номер символа просто не бывает больше 255 . Ну, я не буду проводить полный разбор..
Но в целом все же неплохо! А главное - молодец, что вернулся и запостил код , +1.
Цитата
P.S. это я Роман, просто пароль забыл)))
Выслать на мыло? Пиши мне в личку.
-TarasBer-
21.05.2011 15:49
> 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?
Роман
22.05.2011 12:14
Цитата(-TarasBer- @ 21.05.2011 11:49)
> 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?
1) Диапазон аски кодов маленьких русских букв. 2) Аски код маленькой буквы ё 3) Диапазон аски кодов маленьких английских букв Далее идет смещение акси кодов до аски кодов больших букв. Делается это для того, чтобы большие и маленькие буквы считались вместе, а не по отдельности...
Lapp
22.05.2011 14:11
Цитата(Роман @ 22.05.2011 9:14)
1) Диапазон аски кодов маленьких русских букв. 2) Аски код маленькой буквы ё 3) Диапазон аски кодов маленьких английских букв Далее идет смещение акси кодов до аски кодов больших букв. Делается это для того, чтобы большие и маленькие буквы считались вместе, а не по отдельности...
Роман, ты не понял. Тарас прекрасно знает коды всех букв (может, наизусть). Он имел в виду, что так писать нельзя, иначе потом в коде сам не разберешься. Желательно все эти величины занести в константы и в коде использовать уже их. Типа так:
Или как-то иначе, но смысл в том, что желательно не использовать голые числа. Правда, лично я особо на это в данном случае не стал бы нажимать, поскольку по крайней мере все это прокомментировано.
Не знаю, понял ты или нет, но назвав свой код идеальным, ты просто должен был ожидать поток подколок ). Так что, пожинай плоды ))
Гость
22.05.2011 14:38
> Тарас прекрасно знает коды всех букв (может, наизусть)
Давно забыл, на самом деле.
> Rus866StartHigh= 224;
Почему никто не напишет просто 'а'..'я'? Зачем вообще эти цифры тут нужны?
Роман
22.05.2011 15:30
Цитата(Lapp @ 22.05.2011 10:11)
Не знаю, понял ты или нет, но назвав свой код идеальным, ты просто должен был ожидать поток подколок ). Так что, пожинай плоды ))
Все я понял))) Конечно мне еще многому надо научится...
Lapp
23.05.2011 14:21
Цитата(Гость @ 22.05.2011 11:38)
Почему никто не напишет просто 'а'..'я'? Зачем вообще эти цифры тут нужны?
Пишут )). Сам я всегда так делал. Но если открыть потом этот код в western или еще в какой-нить кодировке, становится совсем ничего неясно )).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.