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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2009, 17:40   #1
ponchikpk
Пользователь
 
Аватар для ponchikpk
 
Регистрация: 09.03.2009
Сообщений: 63
По умолчанию Работа со строками

Задача вроде такая простая, но почему то не работает Помогите пожайлуйста, кто может!

Дана символьная строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *
Например: ga*4f*d и должно получится ggaa44ffdd...
Только чтобы строковая переменная была одна!

Код:
uses crt;
var s:string;
i:integer;
BEGIN
clrscr;
readln(s);
for i:=1 to length(s) do
  if s[i]='*' then delete(s,i,1);
for i:=length(s) to 2 do
  begin
  s[i+i-1]:=s[i];
  s[i+i]:=s[i];
  end;
writeln(s);
readln;
END.
ponchikpk вне форума Ответить с цитированием
Старый 17.03.2009, 18:08   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Код:
uses crt;
var s:string;
i:integer;
BEGIN
clrscr;
readln(s);
for i:=1 to length(s) do
  if s[i]='*' then delete(s,i,1);
i:=1;
while i<=length(s) do begin
 Insert(s[i],s,i+1);
 i:=i+2;
end;
writeln(s);
readkey;
END.
Uguu~

Последний раз редактировалось __STDC__; 17.03.2009 в 18:20.
__STDC__ вне форума Ответить с цитированием
Старый 17.03.2009, 18:19   #3
ponchikpk
Пользователь
 
Аватар для ponchikpk
 
Регистрация: 09.03.2009
Сообщений: 63
По умолчанию

__STDC__ спасибо тебе огромное только у мя вопрос а поч моя версия не работает?
ponchikpk вне форума Ответить с цитированием
Старый 17.03.2009, 18:22   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Ну у тебя во-первых эл-ты массива исходного теряются при замене.. тут Insert надо.. а во-вторых непонятен сам принцип... зачем например в
s[i+i-1]:=s[i]; вот такой индекс i+i-1? 2i-1 получается.. странно... Так что я не вникал особо, просто переписал =)
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 17.03.2009, 18:32   #5
ponchikpk
Пользователь
 
Аватар для ponchikpk
 
Регистрация: 09.03.2009
Сообщений: 63
По умолчанию

я те не буду свой принцип объяснять, как раз там ничего не теряется просто у мя он строку не увеличивал по размеру...
ponchikpk вне форума Ответить с цитированием
Старый 17.03.2009, 18:46   #6
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Код:
for i:=length(s) to 2 do
  begin
 s[i+i-1]:=s[i];
  s[i+i]:=s[i];
  end;
то, что красным, писать надо downto, потому что счетчик убывает я так понял, потому что последнее значение '2' в операторном цикле for;
то, что синем работает непонятно - два раза заменяете одним и тем же символом, теряя остальные символы строки, причем разрываете строку, оставляя место между length(s) и s[i+i-1] не заполненным, поэтому программа не работает;
да и таким способом строку вы увеличиваете, в любом случае сторока быдет увеличиваться, если только просто не выводить на экран
capta1n вне форума Ответить с цитированием
Старый 17.03.2009, 18:51   #7
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

он увеличивает длину строки вдвое начиная заполнять с конца... вроде бы..
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 17.03.2009, 18:54   #8
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

начиная с конца он оставляет неизвестными ячейки для символов, которые находятся между концом и началом, ну я уж так на более понятном языке
capta1n вне форума Ответить с цитированием
Старый 17.03.2009, 19:01   #9
OCTAGRAM
Oldschool geek
Форумчанин
 
Аватар для OCTAGRAM
 
Регистрация: 09.03.2009
Сообщений: 611
По умолчанию

Лучше использовать этот тест: ga*4f**d

здесь две * подряд
If you want to get to the top, you have to start at the bottom

http://pascal.net.ru/
OCTAGRAM вне форума Ответить с цитированием
Старый 17.03.2009, 19:03   #10
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

Какая разница? С удалением звезд нет проблем...
если исправить to на downto, как было справедливо замечено выше, то работать она все равно не будет... можно это проверить, воспользовавшись отладчиком. Получим такое
Код:
(gdb) break 11
Breakpoint 1 at 0x804816c: file test.pas, line 11.
(gdb) run
Starting program: /home/user/FPC/test
qwerty

Breakpoint 1, main () at test.pas:11
11       s[i+1]:=s[i];
(gdb) print i
$1 = 6
(gdb) print s
$2 = 'qwerty'
(gdb) next
10       s[i+i-1]:=s[i];
(gdb) next

Breakpoint 1, main () at test.pas:11
11       s[i+1]:=s[i];
(gdb) print i
$3 = 5
(gdb) print s
$4 = 'qwerty'
(gdb)
Т.е. видим, что при таком коде s вообще не меняется с каждой итерацией... вот если бы Insert... =)
Uguu~

Последний раз редактировалось __STDC__; 17.03.2009 в 19:08.
__STDC__ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками eR- Помощь студентам 2 23.02.2009 15:11
Работа со строками pant Помощь студентам 2 30.12.2008 17:12
Работа с строками Technolog Microsoft Office Excel 2 17.12.2008 09:58
С, работа со строками Надюха Помощь студентам 2 29.05.2008 13:07
Работа со строками . Cveto4eg Помощь студентам 11 26.05.2008 13:36