Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить нечётные символы 
:(
    Опции темы
digitech
Дата 25.11.2007, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



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

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


Это сообщение отредактировал(а) digitech - 25.11.2007, 18:41
PM MAIL   Вверх
Ofer
Дата 25.11.2007, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: нет
Всего: 5



Получается, что ты удаляеш из строки 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.

PM MAIL ICQ   Вверх
digitech
Дата 25.11.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



А при вот при строке 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.


Это сообщение отредактировал(а) digitech - 25.11.2007, 18:55
PM MAIL   Вверх
Ofer
Дата 25.11.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 293
Регистрация: 15.10.2006
Где: КривбаСС

Репутация: нет
Всего: 5



Там есть второй код, который делает то что ты хочеш

Код

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) ты начинаеш прыгать через элементы строки?
PM MAIL ICQ   Вверх
digitech
Дата 25.11.2007, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



понял. спасибо что объснили
PM MAIL   Вверх
volvo877
Дата 26.11.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(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);
Всего-то навсего достаточно пробежаться по строке из конца в начало, и не надо никаких дополнительных строк...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0845 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.