Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

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

 
новичок_из_сыктывкара ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.032 c
11-1074703352
Vladimir Kladov
2004-01-21 19:42
2004.05.30
Версия 1.90


9-1074633038
Alex Storm
2004-01-21 00:10
2004.05.30
Создание ландшафта на GLScene


11-1073581090
Rasperepodviipodvert
2004-01-08 19:58
2004.05.30
Kol


1-1084622659
Soldier
2004-05-15 16:04
2004.05.30
Tmemo


3-1083604739
@Igor
2004-05-03 21:18
2004.05.30
Как создать БД на сервере(MySQL)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский