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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2016, 22:27   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию Простенькая задачка - удалить из строки все не цифровые символы

Здравствуйте
Помогите пожалуйста с решением задачи
Вроде простая, но что-то пошло не так
Дана строка, нужно убрать с неё все НЕ цифры, оставить только цифры. Гарантировано, что там есть хотя бы одна цифра.
То есть
Дана строка
eh65jk9dn1
Вывести надо
6591
Я делал так
Код:
var
s:string;
i,k:integer;
begin
Readln(s);
for k:=1 to Length(s) do
for i:=1 to Length(s) do
begin
  if ((s[i]<>'1') or (s[i]<>'2') or (s[i]<>'3') or (s[i]<>'4') or (s[i]<>'5') or (s[i]<>'6') or (s[i]<>'7') or (s[i]<>'8') or (s[i]<>'9') or (s[i]<>'0'))
  then begin
  delete(s,i,1);
  break;
  end;
end;
Writeln(s);
Readln;
end.
Но в итоге получаю пустую строку..
dimon_snake вне форума Ответить с цитированием
Старый 14.09.2016, 23:01   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

неверная логика.
s[i] не равно 1 ИЛИ s[i] не равно 2
допустим,
у нас в s[i] цифра 1
тогда первое условие (s[i] не равно 1) - это ложь
второе условие (s[i] не равно 2) - это истина

ложь ИЛИ истина = ИСТИНА

рассмотрите другие случаи, поймёте, что подобное логическое ВСЕГДА даст истину, для любого знака (хоть буква, хоть цифра, хоть что)!

И это главная ошибка.

вторая ошибка.
зачем вам ДВА ЦИКЛА

Цитата:
Код:
for k:=1 to Length(s) do
for i:=1 to Length(s) do
цикл по K зачем? где Вы используете K ?

ответ - он НЕ НУЖЕН.

ну и третье. и последнее.
если задача стоит просто вывести цифры из строки, то это проще сделать так:
Код:
begin
  Readln(s);
  for i:=1 to Length(s) do
     if s[i] in ['0'..'9'] then Write(s[i]);
  WriteLn;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.09.2016, 23:11   #3
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Да, действительно, все намного проще
Большое спасибо.
dimon_snake вне форума Ответить с цитированием
Старый 14.09.2016, 23:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию



да, если задача стоит всё же удалять НЕ цифровые символы из строки,
то я бы написал так:
Код:
begin
  Readln(s);
  for i:=Length(s) downto 1 do
     if Not(s[i] in ['0'..'9']) then Delete(s[i],i,1);
  WriteLn(s);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.09.2016, 20:54   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Кстати, небольшая модификация от меня. Можно не использовать множества - вместо них воспользоваться строковым литералом, в котором записаны все символы от 0 до 9. Таким образом, строка из кода Сергея примет вид:
Код:
if pos( s[i], '1234567890')  = 0 then Delete(s[i],i,1);
Вадим Мошев вне форума Ответить с цитированием
Старый 15.09.2016, 23:37   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

кстати, я опечатку в Delete допустил.
разумеется, там должно быть Delete(s,i,1)

Цитата:
Можно не использовать множества - вместо них воспользоваться строковым литералом, в котором записаны все символы от 0 до 9.
ну тогда ещё один вариант

Код:
if (s[i]<'0') or (s[i]>'9') then Delete(s, i, 1);
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить все ненужные символы SweetOpium Microsoft Office Excel 8 03.03.2015 17:37
Удалить все символы между первой и второй двокрапкой. Wild_klas Помощь студентам 3 20.11.2010 21:57
Удалить в предложении все слова, имеющие символы цифр In4ekk Общие вопросы C/C++ 0 19.10.2010 14:10
Удалить из строки все символы типа #10 #9 и т.д. TwiX Общие вопросы Delphi 10 01.12.2009 19:21
удалить в строке все одинаковые символы Михаил70 Помощь студентам 5 09.09.2009 18:35