Pascal.Множественный тип данных

MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Что тут сложного?
[syntax='Delphi']
const
GL=['A','E','I','O','U','Y'];
var
Txt:string;
I:integer;

procedure Input;
begin
writeln('Введите текст');
ReadLn(Txt);
end;

procedure Main;
begin
I:=1;
while I<=Length(Txt) do
if (UpCase(Txt) in GL) then
Delete(Txt,I,1)
else
Inc(I);
end;

procedure Output;
begin
Writeln(Txt);
Readln;
end;

begin
Input;
Main;
Output;
end.

[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Можно, в принципе, и с циклом работать, только его приходится модернизировать:

Код: Выделить всё

for i:=1 to length(s) do
  while s[i] in mnoz do 
  begin
     delete(s,i,1);
     if i>length(s) then break;
  end;
  if i>length(s) then break;
Не знаю, может, без второго брейка можно обойтись, проверять лень.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Да можно было вообще просто проверять каждый символ в обычном цикле, а подходящие записыавть в другую строку.
Ни что так не ограничивает фантазию программиста, как компилятор...
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Хыиуду писал(а):

Код: Выделить всё

for i:=1 to length(s) do
Если не ошибаюсь, то в цикле for верхняя граница вычисляется один раз, перед началом цикла. А так как length(s) все время уменьшается, то условие верхней границы вскоре перестает быть верным.

Так что, или использовать цикл while (где условие считается при каждом витке цикла), или (что я постоянно "рекламирую" :) ) перебирать символы строки не от начала к концу, а от конца к началу. В этом случае постоянное удаление символов отрицательного эффекта не имеет:

Код: Выделить всё

for i:=length(s) downto 1 do
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

BBB писал(а):Если не ошибаюсь, то в цикле for верхняя граница вычисляется один раз, перед началом цикла. А так как length(s) все время уменьшается, то условие верхней границы вскоре перестает быть верным.

Именно поэтому я и ставлю проверку на выход за границу строки
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Хыиуду,
так навороченно как-то получилось все. Цикл for, внутри него (!) еще и цикл while, внутри которого еще и проверка на if.

Я же предложил:

Код: Выделить всё

for i:=length(s) downto 1 do begin
  if (s[i] in mnoz) then begin
     delete(s,i,1);
  end;
end;
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

BBB, не спорю, изящней. Видимо, закостеневаю уже. Привык большинство проблем решать циклом с to вместо downto, иногда в ущерб эффективности.
А вообще лучше всего для подобных целей использовать регулярные выражения
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить