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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Кодирование длин серий . Текстовый файл.
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.

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


Пионер
**

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

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


Спасибо) поняла
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






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


Пионер
**

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

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


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


Пионер
**

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

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


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

Добавлено через 14 мин.
volvo, а что у меня неправильно?/
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


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


Профи
****

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

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


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


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


Пионер
**

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

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


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


Гость






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

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


Пионер
**

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

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


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


Пионер
**

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

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


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


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

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

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


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


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


Пионер
**

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

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


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


mea culpa
*****

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

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


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

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


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

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


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


Гость






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

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

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


Профи
****

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

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


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

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

 



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