Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Как удалить нечётные символы


Автор: digitech 25.11.2007, 17:00
Как можно в строке удалить нечётные символы?
я пробовал вот так, но удаляется что попало
Код

s:='123456789'
n:=1;
for i:=1 to length(s) then 
begin
delete(s,n,n);
n:=n+2;
end;

Автор: Ofer 25.11.2007, 18:40
Получается, что ты удаляеш из строки S начиная с позиции n n символов.
Если ты хочеш удалить все нечетные цифры, то так:

Код

uses CRT;
var
  i, n, c : Integer;
  S : String;
begin
  ClrScr;
  S := '1234567890';
  WriteLn(S);
  for i := 1 to Length(S) do
  begin
  Val(S[i],n,c);
  if (n mod 2) <> 0 then
  Delete(S,i,1);
  end;
  Write(S);
  ReadLn;
end.


Если же надо сформировать новую строку из символов, имеющих четные позиции в исходной строке, то может подойти такое:

Код

uses CRT;
var
  i, n, c : Integer;
  S1, S2 : String;
begin
  ClrScr;
  S1 := '1234567890';
  S2 := '';
  WriteLn(S1);
  for i := 1 to Length(S1) do
  if (i mod 2) = 0 then
  S2 := ConCat(S2,S1[i]);
  Write(S2);
  ReadLn;
end.

Автор: digitech 25.11.2007, 18:54
А при вот при строке s:='sdf654df8b6t5yd4h3';  прога работать не будет, так как  она не сможет преобразовать латинские буквы в цифры.
Ведь в задании написано удалить символы , а не цифры. конечно и я неправильно задание написал. Нужно было: стоящие на нечётных местах.

Вот код, который удаляет символы стоящие на нечётных местах. Только я не пойму, почему при inc(n) {n:=n+1}
 всё выполняется правильно. Хотя при каждом цыкле должна удаляться каждая цифра. По сути дела, должно быть Inc(n,2); {n:=n+2}
но при этом почему-то удаляется всё что попало.
Почему так происходит?
Код

begin
clrscr;
Writeln('Введи строку не более 255 символов');
readln(s);
d:=length(s);
n:=1;
for i:=1 to d do
begin
inc(n);
delete(s,n,1);
end;
Writeln(s);
readln;
end.

Автор: Ofer 25.11.2007, 19:41
Там есть второй код, который делает то что ты хочеш

Код

uses CRT;
var
  i, n, c : Integer;
  S1, S2 : String;
begin
  ClrScr;
  S1 := '1234567890';
  S2 := '';
  WriteLn(S1);
  for i := 1 to Length(S1) do
  if (i mod 2) = 0 then
  S2 := ConCat(S2,S1[i]);
  Write(S2);
  ReadLn;
end.


Цитата(digitech @ 25.11.2007,  18:54)

Вот код, который удаляет символы стоящие на нечётных местах. Только я не пойму, почему при inc(n) {n:=n+1}
 всё выполняется правильно. Хотя при каждом цыкле должна удаляться каждая цифра. По сути дела, должно быть Inc(n,2); {n:=n+2}


Потому что ты удалил символ и остальная часть строки сдвинулась. Теперь символы, которые ранее были на четных позициях становеяться на нечетные. Ты увеличиваеш счетчик на единицу и снова удалеяш. Остаток строки снова сдвигается и тебе кажется, что удаление происходит через позицию.
Инными словами. 
Имеем строку 1234567890 и n = 1. ты удалил символ с позицией n, т.е. первый, получил 234567890. 
Увеличил n, теперь n = 2. Удаляеш символ на второй позиции, а єто уже, как видиш, тройка. В итоге получаеш 24567890. И т.д. аж до конца строки.
Теперь пнятно, что когда ты делаеш Inc(n,2) ты начинаеш прыгать через элементы строки?

Автор: digitech 25.11.2007, 20:51
понял. спасибо что объснили

Автор: volvo877 26.11.2007, 14:17
Цитата(Ofer @  25.11.2007,  18:41 Найти цитируемый пост)
Там есть второй код, который делает то что ты хочеш
Ну, и на кой извращаться? Обязательно вторую строку вводить? Одной уже никак?

Код

  for i := length(s1) downto 1 do
    if i mod 2 = 1 then delete(s1, i, 1);
  writeln(s1);
Всего-то навсего достаточно пробежаться по строке из конца в начало, и не надо никаких дополнительных строк...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)