IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Работа с текстом..., помогите с алгоритмом..
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


Здравствуйте, нужна ваша помощь....
Вот текст задания:

Составить алгоритм и программу обработки фразы (строки текста), находящемся в текстовом файле 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.
}


То есть я описал массив, записал аски коды символов в него, собственно возникла проблема с подсчетом количества символов(символы как русские так и англ.), зашифровал я методом Atbash, думаю расшифровать смогу при повторном запуске программы, метку в виде звёздочек поставил, а вот как ее потом определить пока не думалsmile.gif

Сообщение отредактировано: Роман -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
В служебной информации должны быть закодированы (зашифрованы) данные о каждой букве фразы.
В дальнейшем, при запуске этой программы входным файлом должен стать файл отчета со служебной информацией. В результате работы должен быть получен текст исходной фразы в файле с именем Output.txt
Это невозможно. Хочешь пример? Пожалуйста:

А-1
Г-1
Р-1
У-1

Внимание, вопрос: какое слово было в исходном файле, УГАР, или РАГУ? То есть, я не спрашиваю у тебя, как вообще ты собираешься определять по такой скудной информации, какая буква на какой позиции стояла. Допустим, у тебя есть даже словарь русского языка, и сможешь определить список слов, которые можно составить, имея определенные буквы в определенном количестве. И даже в этом случае невозможно решить задачу, ибо омонимы будут мешать...

А уж если несколько слов во входной фразе - то...

Вывод: надо хранить не только данные, сколько каких букв было, но и какие-то данные о расположении тех или иных букв, какую-то доп. информацию...

Уточняй задание.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


Вобщем уточнил: расположить надо не по алфавиту а по аски кодам что упрощает задачу. ( впринципе по алфавиту располагает, только знаки препинания ставит первыми)
Всем спасибо, подумал подумал и сделал сам, только в программе делается запрос: Расшифровать текст? если нажимаешь y -расшифровывает, если -n, то нет. Но преподаватель сказал что это не критично, так что лаба вроде бы готова!!! Даже не знаю нужно ли код выкладывать?)))
P.S только одна проблема: у больших букв код Аски другой, поэтому программа считает большие и маленькие буквы отдельноsad.gif думаю не критично, но хотелось бы избавиться от данной беды, или никак?

Сообщение отредактировано: Роман -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Роман @ 15.03.2011 12:15) *
Вобщем уточнил: расположить надо не по алфавиту а по аски кодам что упрощает задачу. ( впринципе по алфавиту располагает, только знаки препинания ставит первыми)
Непонятно. Проблема, о которой говорил volvo осталась, где и была. Поясни, плз, как ты из этого:
А 2
М 2
- делаешь МАМА? Почему не АМАМ или АММА?

Цитата
Всем спасибо, подумал подумал и сделал сам, только в программе делается запрос: Расшифровать текст? если нажимаешь y -расшифровывает, если -n, то нет. Но преподаватель сказал что это не критично, так что лаба вроде бы готова!!! Даже не знаю нужно ли код выкладывать?)))
Заинтриговал.. Не понимаю, как запрос помогает расшифровке. Да, я хотел бы увидеть код, если это возможно, пожалуйста. Просто для того, чтоб понять условие задачи.

Цитата
P.S только одна проблема: у больших букв код Аски другой, поэтому программа считает большие и маленькие буквы отдельноsad.gif думаю не критично, но хотелось бы избавиться от данной беды, или никак?
Если рассчитывать только на латинский алфавит, то это просто. Используй функцию UpCase(c:char):char из модуля System (который подключен всегда по умолчанию).
А если ты хочешь иметь дело с русскими буквами тоже, то несколько сложнее, и тому же зависит от кодовой страницы (1251, 866..) Если тебе это действительно нужно - скажи, объясним.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


все-таки хотелось бы чтобы программа расшифровывала данные после 2 го запуска. Как ни пытался сделать условие, что при прочтении файла log.txt (там появляются знаки ******), если есть эти символы(*) то начать расшифровывать... но чтото при запуске программа выдавала ошибкуsad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Ага, ясно.. Я невнимательно читал просто. Восстановление текста производится не по частотам символов, а по "служебной информации" в конце файла )).
Цитата(Роман @ 16.03.2011 14:51) *
все-таки хотелось бы чтобы программа расшифровывала данные после 2 го запуска. Как ни пытался сделать условие, что при прочтении файла log.txt (там появляются знаки ******), если есть эти символы(*) то начать расшифровывать... но чтото при запуске программа выдавала ошибкуsad.gif

Ты все же непонятно изъясняешься. Ты правда думаешь, что мы можем указать на ошибку, когда ты пишешь "но чтото при запуске программа выдавала ошибку". Ни кода, ни даже номера ошибки.. blink.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


короче отказался я от идеи считывать "здездочки", так как считаю это невозможным все-таки smile.gif
и последний вопрос: можно сделать так, чтобы допустим когда возникает ошибка, программа не закрывалась, а выдавала текстовое сообщение и только после нажатия клавиши закрывалась? Допустим отсутствует файл input.txt. Программа сразу не закрывается а выдает сообщение что файл отсутствует.
P.S чуть попозже выложу весь код...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Посмотри тут.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Роман @ 16.03.2011 16:09) *

короче отказался я от идеи считывать "здездочки", так как считаю это невозможным все-таки smile.gif
и последний вопрос: можно сделать так, чтобы допустим когда возникает ошибка, программа не закрывалась, а выдавала текстовое сообщение и только после нажатия клавиши закрывалась? Допустим отсутствует файл input.txt. Программа сразу не закрывается а выдает сообщение что файл отсутствует.
P.S чуть попозже выложу весь код...

Search the forum "+compiler* +direct*" (in russian), or just "{$I-}"


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Если не сложно выложите окончательный вариант кода
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11





Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  1  +


Вот идеально выполненное задание.)))


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.


P.S. это я Роман, просто пароль забыл)))
и простите что так долго, программу написал давным давно, но руки не доходили выложить...

Сообщение отредактировано: techno -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(techno @ 21.05.2011 6:52) *
Вот идеально выполненное задание.
Ха ). Ты зайди сюда через пару годиков, когда поднатореешь в программировании - улыбнешься своему абсолютизму.. )) До идеальности ему так же далеко, как Жигулям до Тоеты )). Меня особо улыбнуло
A[i]:=A[i]+1
, легко заменяемое на Inc(A[i]). Причем, есго нужно ставить только один раз (после перевода). Условие
and (i<=255)
тоже выглядит странно, если учесть, что номер символа просто не бывает больше 255 yes2.gif. Ну, я не буду проводить полный разбор.. smile.gif

Но в целом все же неплохо! А главное - молодец, что вернулся и запостил код smile.gif, +1.

Цитата
P.S. это я Роман, просто пароль забыл)))
Выслать на мыло? Пиши мне в личку.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






> 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?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


Цитата(-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) Диапазон аски кодов маленьких английских букв
Далее идет смещение акси кодов до аски кодов больших букв.
Делается это для того, чтобы большие и маленькие буквы считались вместе, а не по отдельности...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Роман @ 22.05.2011 9:14) *
1) Диапазон аски кодов маленьких русских букв.
2) Аски код маленькой буквы ё
3) Диапазон аски кодов маленьких английских букв
Далее идет смещение акси кодов до аски кодов больших букв.
Делается это для того, чтобы большие и маленькие буквы считались вместе, а не по отдельности...

Роман, ты не понял. Тарас прекрасно знает коды всех букв (может, наизусть). Он имел в виду, что так писать нельзя, иначе потом в коде сам не разберешься. Желательно все эти величины занести в константы и в коде использовать уже их. Типа так:
const
Rus866StartHigh= 224;
Rus866LetterYo= 184
...
Или как-то иначе, но смысл в том, что желательно не использовать голые числа. Правда, лично я особо на это в данном случае не стал бы нажимать, поскольку по крайней мере все это прокомментировано.

Не знаю, понял ты или нет, но назвав свой код идеальным, ты просто должен был ожидать поток подколок ). Так что, пожинай плоды ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гость






> Тарас прекрасно знает коды всех букв (может, наизусть)

Давно забыл, на самом деле.

> Rus866StartHigh= 224;

Почему никто не напишет просто 'а'..'я'? Зачем вообще эти цифры тут нужны?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Роман

Репутация: -  0  +


Цитата(Lapp @ 22.05.2011 10:11) *

Не знаю, понял ты или нет, но назвав свой код идеальным, ты просто должен был ожидать поток подколок ). Так что, пожинай плоды ))

Все я понял))) Конечно мне еще многому надо научится...

Сообщение отредактировано: Роман -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Гость @ 22.05.2011 11:38) *
Почему никто не напишет просто 'а'..'я'? Зачем вообще эти цифры тут нужны?

Пишут )). Сам я всегда так делал. Но если открыть потом этот код в western или еще в какой-нить кодировке, становится совсем ничего неясно )).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 23:03
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name