Текущий архив: 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.49 MB
Время: 0.038 c