Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

строку наоборот   Найти похожие ветки 

 
новичок_из_сыктывкара ©   (2004-05-12 15:25) [0]

Здравствуйте мастера, помогите пожайлуста...задача следующая...
Есть строка, состоящая из слов, каждое слово отделено одним или нескольким пробелом.
Необходимо записать эту строку наоборот (т.е. первое слово станет последним, а последнее первым),
и при этом надо что бы между словами только один пробел. (Задача на PASCAL)


 
Sergey Masloff   (2004-05-12 15:33) [1]

Задача примитивна и решается "в лоб"
Если наплевать на алгоритмы то
1) Сворачиваешь все последовательные пробелы в 1 причем заменяешь символ пробела на запятую
2) Создаешь TStringList и записываешь в него как CommaText свою строку
3) Идешь в цикле с конца списка и конкатенируешь его элементы не забывая вставлять пробел
4) Все

Проблемы?


 
Fay ©   (2004-05-12 15:44) [2]

Напиши решение на родном языке (на котором говоришь и думаешь).
Перепиши на Паскале.


 
новичок_из_сыктывкара ©   (2004-05-12 15:57) [3]

Sergey Masloff спасибо конечно...но не подсказад бы ты как это организовать в Turbo Pascal
я думаю что можно строку предсавить в виде массива, а потом перебирать все до пробела, затем пробелы считать, если больше одного то убирать...конец отсчеты EOF(end of fail)? и потом как то это перевернуть вот только как???


 
Fay ©   (2004-05-12 16:06) [4]

Напиши решение на родном языке (на котором говоришь и думаешь).
Перепиши на Паскале.


 
WebErr ©   (2004-05-12 16:08) [5]

Просто добавлять в строку StrOld новую подстроку StrNew[i] так:
StrOld := StrNew[i] + " " + StrOld;
Разумеется сначала надо разбить входящую строку StrIn на подстроки StrNew[i] без пробелов - это в общих чертах.

> Напиши решение на родном языке

Думаете стоит?! :))))


 
Fay ©   (2004-05-12 16:13) [6]

Именно так я и думаю.


 
Sergey Masloff   (2004-05-12 17:03) [7]

новичок_из_сыктывкара ©   (12.05.04 15:57) [3]
>спасибо конечно...
Ладно если на "трубе" то строка 255 символов?
Ну например объявляешь еще одну переменную - tmp
Идешь циклом от конца строки (начальной) посимвольно.
1) s1-старая строка tmp - буфер s2 - новая
  tmp и s2 - пустые
2) цикл от Length(s1) до 1
3) читаем s1[i]
4) если s1[i] = " " (пробел) то 5 иначе 6
5) если length(tmp)=0 или tmp[0] = 0 (это одно и то же)
  то к 2) иначе {s2 = s2 + " " + tmp; tmp = ""; и переход к 2)}
6) tmp := s1[i] + tmp;
В конце цикла получаешь то что нужно в s2


 
nejest   (2004-05-12 17:08) [8]

Смотри строку с зада на перед. Каждый раз, когда находишь слово, запоминаешь место последней буквы. После окончания слова копируешь его в итоговый массив.


 
Алхимик ©   (2004-05-13 12:54) [9]

Кхм.
У меня один студент есть, единственный в группе, кто ещё зачёт не получил.
Ни как не может совладать с задачей, которая точь в точь как в SUBJ.
И терзают меня что то смутные сомнения, что он его так и не получит...


 
WebErr ©   (2004-05-13 16:14) [10]


> Алхимик ©   (13.05.04 12:54) [9]

Это - Я! :))))


 
BillyJeans ©   (2004-05-13 16:21) [11]

Удалим лишние пробелы:
while pos("  ", ИсходнаяСтрока)>0 do Delete(ИсходнаяСтрока, pos("  ", ИсходнаяСтрока), 1);
затем переворачиваем:
НоваяСтрока = "";
while pos(" ", ИсходнаяСтрока)>0 do begin
 НоваяСтрока = Copy(ИсходнаяСтрока, 1, pos(" ", ИсходнаяСтрока)) + НоваяСтрока;
 Delete(ИсходнаяСтрока, 1, pos(" ", ИсходнаяСтрока));
end;


... не проверял, поэтому сильно не бейте ;)


 
BillyJeans ©   (2004-05-13 16:21) [12]

Удалим лишние пробелы:
while pos("  ", ИсходнаяСтрока)>0 do Delete(ИсходнаяСтрока, pos("  ", ИсходнаяСтрока), 1);
затем переворачиваем:
НоваяСтрока = "";
while pos(" ", ИсходнаяСтрока)>0 do begin
 НоваяСтрока = Copy(ИсходнаяСтрока, 1, pos(" ", ИсходнаяСтрока)) + НоваяСтрока;
 Delete(ИсходнаяСтрока, 1, pos(" ", ИсходнаяСтрока));
end;


... не проверял, поэтому сильно не бейте ;)


 
han_malign ©   (2004-05-13 17:31) [13]

>Удалим лишние пробелы
- ага, а гланды будем удалять через задний проход. Причем тут прбелы, если задача на парсинг слов с указанным разделителем, у уж
while(...)do Dst:=Dst+" "+ParseWord(Src); или Dst:=ParseWord(Src)+" "+Dst; - разница небольшая, главное сам ParseWord сделать(что есть тривиальная задача)


 
WebErr ©   (2004-05-13 18:36) [14]

В общем используй регулярные выражения (Regular Expressions или RegExp) и язык Perl и все вопросы посылай к Вэб-мастеру данного сайта, полностью собранного (сайта, а не Вэб-мастера) в Апаче на Perl"e - великом-могучем (круче всяких PHP).


 
BillyJeans ©   (2004-05-14 09:31) [15]

на BRE можно даже в строку уложиться будет ;)


 
alexG_85   (2004-05-14 17:47) [16]

Создаешь класс: что-то типа Words
в нем: свойсвто типа string, int (текущее положение), и для удобства int - кол-во букв в строке;
и методы например Read(), ToStart(), ToEnd(), EOF()-конец строки, BOF() - начало строки и т.п.
Методо Read() выдает слово начиная с текущей позиции и соответственно текущя позиция перемещается на следующее слово,
ToStart() перемещает на превую поизцию,  ToEnd() на последнюю.
Все, а результат получить надо так:
C#:
string _result="";
while(!(Words.EOF)){
 _result +=Words.Read()+" ";
}
Щас полную реализацию приведу...
Кстати на чем пишеш? Если используешь библиотек NET Framework, то у класса string там есть такой метод split(разделитель), который массив слов, в исходной строке отделяющихся разделителем


 
alexG_85   (2004-05-14 17:48) [17]

Создаешь класс: что-то типа Words
в нем: свойсвто типа string, int (текущее положение), и для удобства int - кол-во букв в строке;
и методы например Read(), ToStart(), ToEnd(), EOF()-конец строки, BOF() - начало строки и т.п.
Методо Read() выдает слово начиная с текущей позиции и соответственно текущя позиция перемещается на следующее слово,
ToStart() перемещает на превую поизцию,  ToEnd() на последнюю.
Все, а результат получить надо так:
C#:
string _result="";
while(!(Words.EOF)){
 _result +=Words.Read()+" ";
}
Щас полную реализацию приведу...
Кстати на чем пишеш? Если используешь библиотек NET Framework, то у класса string там есть такой метод split(разделитель), который массив слов, в исходной строке отделяющихся разделителем


 
han_malign ©   (2004-05-14 18:25) [18]

блин, ваш поток сознания уже достал - даю рабочий код:
program ParseW;
{$APPTYPE CONSOLE}
function ParseWord(var aOffs: integer; const aStr: string; var aWord: string): boolean;
var len, wordStart: integer;
begin
  len:=Length(aStr); if(aOffs<=1)then aOffs:=1;
  while((aOffs<=len)and (aStr[aOffs]=" "))do inc(aOffs);
  wordStart:=aOffs;
  while((aOffs<=len)and (aStr[aOffs]<>" "))do inc(aOffs);
  Result:=aOffs>wordStart;
  if(Result)then aWord:=copy(aStr,wordStart,aOffs-wordStart);
end;
var src, wrd, dst: string;
   offs: integer;
begin
  Write("Enter space separated strin:");Readln(src);
  dst:="";offs:=1;
  while ParseWord(offs,src,wrd) do dst:=wrd+" "+dst;
  Writeln("Result:",dst);            
end.


>Алхимик ©   (13.05.04 12:54) [9]
- запоминай стиль, все равно этот лентяй не переделает :))



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
6-1081768676
Геннадий
2004-04-12 15:17
2004.05.30
Как создать вложение при отправке электронного письма? idSMTP


1-1084879735
aser
2004-05-18 15:28
2004.05.30
Время выполнения программы


1-1084436594
Inner
2004-05-13 12:23
2004.05.30
Срочно TTreeView подскажите!


14-1084137501
Рулон Обоев
2004-05-10 01:18
2004.05.30
фотоальбом


1-1084320585
Dweller
2004-05-12 04:09
2004.05.30
Как подключить Matlab DLL к Delphi