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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2013, 16:07   #1
a999a1
 
Регистрация: 24.10.2013
Сообщений: 8
По умолчанию Обработка строк - удаление предыдущего символа строки при появлении #

Дан текст, заканчивающийся точкой. Среди символов текста особую роль играет символ #, появление которого в тексте означает удаление предыдущего символа. Соответственно, k символов # подряд отменяют k предыдущих символов текста, если таковые имеются на текущей строке.
Требуется написать программу, преобразующую текст с учетом указанного значения символа #.
1)Если в какой-то момент перед некоторым символом # на этой строке не осталось символов, то его следует игнорировать.
2) В выходной файл символы # выводить не следует ни в каком случае.
3) Если в результате преобразований все символы в строке входного файла были удалены, то в выходном файле в этом месте следует вывести пустую строку.

Пример ввода:
Hello ww#orld! #
Пример вывода:
Hello world!

помогите плиз!
a999a1 вне форума Ответить с цитированием
Старый 21.11.2013, 09:58   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так устроит?
Код:
var f1, f2 : text;
  s : string;
  i : integer;
  flagEnd : boolean;
begin
  Assign(f1,'input.txt');
  Assign(f2,'rezzult.txt');
  Reset(f1);
  Rewrite(f2);
  flagEnd := false;
  while not eof(f1) and not flagEnd do begin
    Readln(f1,s);
    i := 1;
    while i<=length(s) do begin
      if s[i]='.' then begin
        s := copy(s, 1, i);
        flagEnd := true;
        Break
      end
      else
       if (s[i]='#') then begin
         if i=1
           then Delete(s, 1, 1)
           else Delete(s, i-1, 2)
       end
       else Inc(i);
    end;
    WriteLn(f2, s);
  end;
  Close(f1);
  Close(f2);
end.
это с прерыванием, если в тексте обнаружена точка.
Если выкинуть проверку (и код прерывания программы) в случае точки в тексте, то программа ещё больше упростится!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.12.2013, 19:02   #3
a999a1
 
Регистрация: 24.10.2013
Сообщений: 8
По умолчанию

да спасибо большое. а можешь небольшое пояснение к коду написать
a999a1 вне форума Ответить с цитированием
Старый 02.12.2013, 22:47   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

могу. спрашивай, что непонятно в коде.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.12.2013, 16:04   #5
a999a1
 
Регистрация: 24.10.2013
Сообщений: 8
По умолчанию

ммм мне просто на экзамен нада эта задача и почти к каждой строке нужно пояснение
вдруг я не все правильно напишу. напиши плиз
a999a1 вне форума Ответить с цитированием
Старый 04.12.2013, 10:16   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Так вы напишите, в какой именно строчке непонятки. Не всю же программу комментировать?
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 04.12.2013, 10:54   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
вдруг я не все правильно напишу.
пишите. выкладывайте результат сюда.
Если что-то не так или непонятно - поправим.
А уж описывать
Код:
var f1, f2 : text; {объявляем две файловые переменные для обработки 
                  текстовых файлов, f1 - для входного файла, f2 - для выходного}
увольте.

Т.е. можно, конечно, но механический нудный труд должен чем-то компенсироваться! Деньгами, например!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.12.2013, 18:31   #8
a999a1
 
Регистрация: 24.10.2013
Сообщений: 8
По умолчанию

можешь написать к этой части программы
Код:
flagEnd := false;
  while not eof(f1) and not flagEnd do begin
    Readln(f1,s);
    i := 1;
    while i<=length(s) do begin
      if s[i]='.' then begin
        s := copy(s, 1, i);
        flagEnd := true;
        Break
      end
      else
       if (s[i]='#') then begin
         if i=1
           then Delete(s, 1, 1)
           else Delete(s, i-1, 2)
       end
       else Inc(i);

Последний раз редактировалось Serge_Bliznykov; 05.12.2013 в 20:30.
a999a1 вне форума Ответить с цитированием
Старый 05.12.2013, 20:38   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё, что касается flagEnd - это для прерывания цикла при нахождении точки.
сначала признак (он же флажок, он же булевая переменная, он же семафор), перед основным циклом ставим его в ЛОЖЬ (точку ещё не встретили)
потом
Код:
пока не (конец файла) и не признак_окончания делать
  прочитать строку в s
  взять индекс = 1 ( первй символ строки)

  пока индекс меньше или равен длины строки начать
    если "точка"  то
          сохраним строку до текущего символа (читай до точки)
          признак_окончания установить в ИСТИНА
          прервать цикл по индексу
    иначе (не точка)
       если символ="#' тогда
           если обрабатываемый символ первый в строке
                      тогда удалим только его
           иначе
                удалить два символа: текущий и предыдущий
       иначе (значит, символ и не точка и не #)
          нарастить индекс на единицу (т.е. перейти на следующий символ)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi удаление символа из строки! sokolik-117845 Помощь студентам 1 09.04.2012 14:32
Удаление строки до определенного символа glebast Помощь студентам 25 02.03.2012 01:30
Удаление символа из строки Alex1991 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 23.11.2010 20:58
Удаление символа из строки forsaken66 Общие вопросы C/C++ 4 06.11.2009 11:33
удаление символа окончания строки Xozer SQL, базы данных 1 07.02.2008 12:19