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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Кодирование длин серий . Текстовый файл.
lopata
сообщение 11.04.2010 18:02
Сообщение #1


Пионер
**

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

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


Помогите пожалуйста разобраться как делать.

Кодирование длин серий (Run-length encoding, RLE) - простая техника сжатия,при которой каждая последовательность знаков, которые состоят более чем из 2 одинаквых знаков, кодируется по первому знаку и длине последовательности.
Реализуйте простой вариант этого способа в форме программы фильта, которая кодирует и снова декодирует текстовые файлы,в которых содержатся только строчные и прописные буквы , знаки препинания и пробелы (но не цифры).Ваша программа должна предлогать следующие возможности вызова из камандной строки (метасимболы[...] и ...|... стоят для опций или альтернатив):
RLE [ -c | -d ] [inFile] [outFile]

Значение параметров:
-c входной файл нужно кодировать (значение по умолчанию),
-d входной файл нужно декодировать,
inFile имя входного файла, иначе стандартный ввод (input)
outFile имя выходного файла, иначе стандартный вывод (output).

Пример:
Изображение


Файлы я пока не трогала...Попыталась просто кодировать. В переменную ch сохраняю символ, если он равен следующему - увеличиваю счетчик, если нет - скидываю в строку str2 и текущий символ сохраняю снова в ch и так далее. Не работает..:

var x, str1, str2, ch,countstr : string;
i, k, count : integer;
begin
countstr:= '';
ch := '';
str2 := '';
count := 0;
Readln(str1);
for i := 1 to Length(str1) do begin
if i=1 then begin
ch:=str1[1];
count:= 1;
end
else begin
if ch= str1[i] then
inc(count)
else begin
if count > 2 then begin
Str(count,countstr);
str2:= countstr+ch
end
else begin
for k := 1 to count do
str2 := str2+ch;
ch := str1[i];
count := 1;
end;
end;
end;
end;
end.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.04.2010 18:20
Сообщение #2


Гость






А если вот так попробовать:
var
str1, str2, ch, countstr: string;
i, k, count: integer;
begin
str2 := '';
{ Readln(str1); }
str1 := 'AbbCCCddddEnd';


str1 := str1 + '_'; { <--- Последний символ не должен совпадать с добавляемым !!! }
ch := str1[1]; count := 1;
for i := 2 to Length(str1) do begin
if ch = str1[i] then inc(count)
else begin
if count > 2 then begin
Str(count,countstr);
str2 := str2 + countstr + ch { <--- Здесь надо увеличивать str2 !!! }
end
else begin
for k := 1 to count do
str2 := str2 + ch;
end;

ch := str1[i]; count := 1; { <--- Это делается в любом случае, а не только по Else !!! }
end;
end;
writeln(str2);
end.

?
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 18:31
Сообщение #3


Пионер
**

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

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


Спасибо) поняла
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 19:55
Сообщение #4


Пионер
**

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

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


Не получается с декодированием. Не могу понять почему больше d намного больше.



var str1 , str2, ch, substr,numberstr: string;
number,i,j,k : integer;
begin
numberstr := '';
str2:= '';
str := 'abb3c4dend';
substr := '1234567890';
for i := 1 to Length(str1) do begin
ch := str1[i];
if Pos(ch,substr)=0 then
str2 := str2 + ch
else begin
numberstr := numberstr+ch;
for j := i+1 to length(str1) do begin
ch:= str1[j];
if pos(ch,substr)>0 then
numberstr := numberstr + ch
else begin;
val(numberstr,number);
for k := 1 to number do
str2 := str2+ch;
break;
end; i:= j+1;
end;
end;
end;



Добавлено через 17 мин.
все) сама нашла. Нужно было numberstr обнулить. Там сохранялись предыдущие числа.

end; i:= j+1;
end;
numberstr := '';
end;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.04.2010 20:16
Сообщение #5


Гость






Цитата
end; i:= j+1;
Эту строку исправляй немедленно! smile.gif Иначе она принесет тебе немало проблем в дальнейшем. Переменная цикла для тебя - табу. Ты имеешь к ней доступ для чтения, но для записи - ни в коем случае. Компилятор сам решает, когда и как изменять эту переменную. Тебе этого делать нельзя.
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 20:21
Сообщение #6


Пионер
**

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

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


Ок)
Насчет последнего исправления тоже неверно. Я так обрадавалась, что количесиво d уменьшилось, что даже не заметила что их 5 вместо 4(
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 11.04.2010 20:56
Сообщение #7


Профи
****

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

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


uses crt;
var
str1, str2, ch, countstr: string;
i, k, count: integer;
errcode : integer;
begin
str2 := '';
ch:='';
{ Readln(str1); }
str1 := 'Abb10C4dEn2d';
i:=1;
while i <= length(str1) do begin
if str1[i] in ['0'..'9'] then begin
while (str1[i] in ['0'..'9']) do begin
ch:=ch + str1[i];
inc(i);
end;
val(ch, count, errcode);
if count > 2 then
for k:=1 to count-1 do
str2 := str2 + str1[i];
end
else begin
str2 := str2 + str1[i];
ch:='';
inc(i);
end;
end;

writeln(str2);
readkey
end.
Попробуй так, вроде пашет
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 21:18
Сообщение #8


Пионер
**

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

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


Спасибо, Client.
Просто обидно, что у меня никогда ничего не работает(

Добавлено через 14 мин.
volvo, а что у меня неправильно?/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 11.04.2010 21:53
Сообщение #9


Профи
****

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

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


Узнаешь код
var str1 , str2, ch, substr,numberstr: string;
number,i,j,k : integer;
errcode: integer;
begin
numberstr := '';
str2:= '';
str1:= 'abb10c4den2d';
substr := '1234567890';
i:=1;
while i <= Length(str1) do begin //замена на while
ch := str1[i];
if Pos(ch,substr)=0 then begin
str2 := str2 + ch;
numberstr:=''; //обнуление
end
else begin
numberstr := numberstr+ch;
for j := i+1 to length(str1) do begin
ch:= str1[j];
if pos(ch,substr)>0 then begin
numberstr := numberstr + ch;
inc(i); //подсчет цифр
end
else begin
val(numberstr,number, errcode);
if number > 2 then //проверка на 2
for k := 1 to number-1 do
str2 := str2+ch;
break;
inc(i);
end;
end;
end;
inc(i); //на основной while для перехода к след символу
end;
writeln(str2);
end.
?
Воть, вроде ничего не забыл.

Сообщение отредактировано: Client - 11.04.2010 21:53
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 22:09
Сообщение #10


Пионер
**

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

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


Хм..но работает неверно.
Вадает результат abbccccccccccddend
пропустило последий символ.
А если задать abb3c4cEnd, то вообще не получается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Client
сообщение 11.04.2010 22:15
Сообщение #11


Профи
****

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

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


вариант что в коде - 10 "с" и 4 "d"
Цитата
А если задать abb3c4cEnd, то вообще не получается.
То 7 "с" и получается


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 22:21
Сообщение #12


Пионер
**

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

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


Сорри. Имела в виду abb3c4dEnd.
Походу я что-то недопонимаю...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.04.2010 22:46
Сообщение #13


Гость






Цитата
Сорри. Имела в виду abb3c4dEnd.
В чем проблема?
Прикрепленное изображение

Что ты ожидала получить?
 К началу страницы 
+ Ответить 
lopata
сообщение 11.04.2010 22:54
Сообщение #14


Пионер
**

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

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


Снова извините. Переклинило.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 12.04.2010 18:06
Сообщение #15


Пионер
**

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

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


Не мог бы кто-нибудь объяснить про командную строку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 13.04.2010 9:07
Сообщение #16


Злостный любитель
*****

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

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


ParamCount - число параметров командной строки.
ParamStr(N) - N-ый параметр, строковый тип. ParamStr(0) - само имя программы, с полным путём к ней.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
lopata
сообщение 13.04.2010 20:27
Сообщение #17


Пионер
**

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

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


Честно говоря вообще не понимаю как это должно работать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Unconnected
сообщение 13.04.2010 22:06
Сообщение #18


mea culpa
*****

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

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


Ну тебе надо получить 3 параметра, делаешь что-то типа (пишу тут):

var c,infile,outfile:string;
begin
c:=paramstr[1];
infile:=paramstr[2];
outfile:=paramstr[3];
if uppercase©='-D' then unpcking else packing;
end.


Естественно, надо оформить коды сжатия и разжатия в процедуры packing и unpacking или даже обойтись без процедур.

Сообщение отредактировано: Unconnected - 13.04.2010 22:45


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


Гость






Цитата(Unconnected @ 13.04.2010 22:06) *

Естественно, надо оформить коды сжатия и разжатия в процедуры packed и unpacked или даже обойтись без процедур.

Эммм...А что это значит?
 К началу страницы 
+ Ответить 
Client
сообщение 13.04.2010 22:34
Сообщение #20


Профи
****

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

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


это значит что надо выполнить выбранное действие
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



- Текстовая версия 19.07.2025 18:08
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"