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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2013, 13:26   #1
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию Удалить буквы из строки

Пытаюсь написать программу, которая удалит все не-цифры из строки
Код:
var i:integer;
st:string;
begin
read(st);
for i:=1 to pos('.',st) do
if not (st[i] in ['0'..'9']) then
delete(st,i,1);
writeln(st);
end.
Почему данный код не работает? Пишет про выход за границы массива

Последний раз редактировалось danil123; 29.01.2013 в 13:34.
danil123 вне форума Ответить с цитированием
Старый 29.01.2013, 13:39   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Потому что при удалении лучше делать обратный цикл:

Код:
for i:=pos('.',st) downto 1 do

А еще напишите:

Код:
readln(st);
и в конце

Код:
writeln(st);
readln;
а то результата не увидите. Были тут такие вопросы уже - типа не работает, а на самом деле отработало и закрылось

и кстати, что Вы будете делать, если в строке не будет точки?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.01.2013 в 13:45.
Sciv вне форума Ответить с цитированием
Старый 29.01.2013, 13:41   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: Integer;
begin
  s := 'fk7e69749695e6ue498u549865u';

  for i := Length(s) downto 1 do
  begin
    if not (s[i] in ['0'..'9']) then Delete(s, i, 1);
  end;
end;
Накой
Код:
pos('.', st)
?
Shouldercannon вне форума Ответить с цитированием
Старый 29.01.2013, 13:48   #4
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

в задании точка обязательно присутствует.
Поменял на обратный цикл, заработало.
danil123 вне форума Ответить с цитированием
Старый 29.01.2013, 14:00   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
в задании точка обязательно присутствует.
ну так добавьте проверку на присутствие точки. Примерно так:

Код:
var p: integer;
...
repeat
  readln(st);
  p:=pos('.',st);
until p>0;

for i:=p downto 1 do
...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 29.01.2013, 14:20   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Потому, что
Код:
for i:=1 to pos('.',st) do
if not (st[i] in ['0'..'9']) then
delete(st,i,1);

Уменьшает длину строки, а фор - принимает изначальную.
В Дельфине не знаю, но если в С++, лучше использовать while{};
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 29.01.2013, 14:38   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Smitt&Wesson, вы правы. но этот момент уже в теме решён ( с помощью обратного цикла).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2013, 14:45   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Я бы решил это через StringReplace.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 29.01.2013, 14:52   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от artemavd
Я бы решил это через StringReplace.
Как это?!
я думаю, что через StringReplace данную задачу решить не получится...



p.s. artemavd, я предполагаю, что Вы условия задачи не очень внимательно прочитали...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2013, 15:00   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
данную задачу решить не получится
если задаться такой целью, то в цикле по всем символам, за исключением цифр и точки. Прикольная прога будет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лаба7: Удалить все буквы "а" из строки (Паскаль) Владан Паскаль, Turbo Pascal, PascalABC.NET 35 05.11.2012 23:26
Строки. Преобразовать строку: оставить слова, содержащие буквы и цифры, остальные удалить Ленка ленка Паскаль, Turbo Pascal, PascalABC.NET 1 23.04.2012 11:51
Строки(pascal) - удалить все гласные русские буквы wormiks40 Помощь студентам 3 20.04.2012 09:39
От числа удалить буквы valerij Microsoft Office Excel 12 01.02.2012 13:01