Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 20:33   #1
Loreen
Пользователь
 
Регистрация: 29.05.2012
Сообщений: 13
Вопрос Архивация

Код:
function encode(s:string):string;//функция архивации
var i,j:integer;
    k:string;
begin
  i:=1;
  while i <= length(s) do
  begin
    j:=i;
    while (s[i] = s[j+1]) do
    inc(j);
    if (j-i = 0) or (j-i = 1) or (j-i =2) then
    begin
      k := k + s[i];
      if (s[i]='0') then k:=k+'0';
      inc(i)
    end
    else
    begin
      k:= k + inttostr(j-i+1) + s[i];
      inc(i,j-i+1)
    end;
  end;
  result:= k;
end;
//--------------------------------------
function decode(s:string):string;//функция разархивации
var i,j,c:integer;
    k:string;
    m: string;
begin
  i:=1;
  while i <= length(s) do
  begin
    j:=i;
    while s[j] in ['0'..'9'] do
    inc(j);
    if j-i > 0 then
    begin
      m:= copy(s,i,j-i);
      for c:=1 to strtoint(m) do k:= k+ s[j];
      delete(s,i,j-i+1);
    end
    else
    begin
      k:= k+ s[i];
      inc(i);
    end;
  end;
  result:= k;
end;
begin
  SetconsoleCP(1251);
  SetConsoleOutputCP(1251);
  Writeln('Введите текст для архивации');
  read(m);
  writeln(encode(m));
  writeln(decode(m));
  Readln;
end.
программа вылетает при выводе результата. и если здесь возможно,помогите пожалуйста дописать часть кода так ,чтобы выдавался размер до архивации и после
Loreen вне форума Ответить с цитированием
Старый 27.10.2012, 22:01   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
программа вылетает при выводе результата.
Ну а протрассировать?
Цитата:
while i <= length(s) do
begin
j:=i;
while (s[i] = s[j+1]) do
Когда i будет указывать на последний символ, на что покажет j+1?
Тогда уж while i < length(s) do
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.10.2012, 22:27   #3
Loreen
Пользователь
 
Регистрация: 29.05.2012
Сообщений: 13
По умолчанию

Исправила, как Вы сказали.. Всё равно вылетает..
Loreen вне форума Ответить с цитированием
Старый 27.10.2012, 22:32   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Думается мне:

Код:
while i <= length(s)-1
Потому что в конце цикла переменная i=length(s), тогда j=i+1=length(s)+1 - опять та же ошибка

А в первом случае в конце цикла i=length(s)+1, j=i+1=length(s)+2
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 27.10.2012, 22:42   #5
Loreen
Пользователь
 
Регистрация: 29.05.2012
Сообщений: 13
По умолчанию

Вылетает всё равно..
Loreen вне форума Ответить с цитированием
Старый 27.10.2012, 22:52   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Проверил - ничего не вылетает.

UPD А, ну да. Вместо read(m); напишите readln(m);. Она не вылетает, просто отрабатывает и закрывается консоль, так как первый ввод не ждет нажатия Enter, то это нажатие автоматически получает ReadLn в конце и считает, что так надо

UPD #2 Ну вот, все же научитесь пользоваться отладчиком. У Вас переменная k в функциях никак не проинициализирована, и ее начальное значение может быть практически любым. Допишите в каждой функции k:=''; сразу после i:=1;

UPD #3 У Вас во второй функции локальная переменная m объявлена - возникает явное пересечение имен с глобальной m, которую Вы вводите, кодируете-декодируете в основном тексте программы. При этом нигде почти не используется, но кровь портит изрядно - убирайте ее и меняйте название на другую.

UPD #4 Присмотритесь внимательно: цикл идет по c, а обращение идет к s[j]:

Код:
for c:=1 to strtoint(m) do k:= k+ s[j];
Кроме того, c:=1 to strtoint(m) - это точно так надо? Если я введу строку 123456, то получу не только ее, но и кучу разных левых символов из памяти. Проверьте алгоритм, правильно ли Вы его реализуете?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 27.10.2012 в 23:10.
Sciv вне форума Ответить с цитированием
Старый 27.10.2012, 23:26   #7
Loreen
Пользователь
 
Регистрация: 29.05.2012
Сообщений: 13
По умолчанию

UPD #2 Ну вот, все же научитесь пользоваться отладчиком. У Вас переменная k в функциях никак не проинициализирована, и ее начальное значение может быть практически любым. Допишите в каждой функции k:=''; сразу после i:=1;

не понимаю, что нужно дописать
Loreen вне форума Ответить с цитированием
Старый 27.10.2012, 23:41   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
не понимаю, что нужно дописать
В начале функции дописать:

Код:
k:='';
она, конечно, инициализируется вероятнее всего пустой, но лучше этот процесс под контроль взять и сразу исключить возможные ошибки.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архивация бд Garward Общие вопросы Delphi 4 04.06.2011 13:57
Архивация БД rpaa1 Помощь студентам 1 06.04.2011 21:04
Архивация Mihanches Общие вопросы Delphi 3 17.10.2010 11:34
Архивация БД dron-s БД в Delphi 0 10.03.2008 12:08