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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2012, 22:25   #1
Александра Раш
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 12
По умолчанию строки

Дана символьная строка. Слово – последовательность символов
между пробелами, не содержащая пробелы внутри себя. Составьте программу для
решения следующей задачи:

Отредактировать заданное предложение, удаляя из него слова с нечетными
номерами и переворачивая слова с четными (например, how do you do --> od od).
Александра Раш вне форума Ответить с цитированием
Старый 20.04.2012, 22:27   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну а в чем проблема? - разделить строку на слова или поудалять из нее лишние?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.04.2012, 23:00   #3
kuy
Форумчанин
 
Аватар для kuy
 
Регистрация: 05.09.2011
Сообщений: 109
По умолчанию

Не знаю разберёшься ли в моём коде, но прога работает:
Код:
var text,temp,text2:string;
    i:integer;
begin
text:='how do you do and what you drink now';
i:=1;  text2:='';
while i<length(text) do
begin
  temp:='';
  while text[i]=' ' do inc(i);
  while (text[i]<>' ') and (i<>length(text)+1) do
   begin
    temp:=text[i]+temp;
    inc(i);
   end;
  if (length(temp) mod 2 = 0) then text2:=text2+temp+' ';
end;
text:=copy(text2,1,length(text2)-1);
write(text);
readln;
end.
Может можно и проще как-то, не создавая временных строчек.
kuy вне форума Ответить с цитированием
Старый 20.04.2012, 23:19   #4
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Долго думал вот над этим:
Код:
text:=copy(text2,1,length(text2)-1);
Да Вы, батенька, педант
А вообще верно, я бы даже заморачиваться из-за одного пробела в конце не стал.

Ссылку дал на всякий случай, а то вдруг подумаешь, что оскорбить пытался
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 21.04.2012, 06:49   #5
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Я извиняюсь за вторжение в разговор.. Надеюсь, код Куя действительно работает (не проверял), но я все же сделал бы иначе . Задача легко распадается на составные части, поэтому и воплощать ее надо в том же духе, мне кажется. Короче, вот код - судите сами.. ))
Код:
function EvenOnly(w: string): string;
begin
  if Odd(Length(w)) then EvenOnly:= '' else EvenOnly:= w+' '
end;

function Revert(w: string): string;
begin
  if Length(w)>0 then Revert:= Revert(Copy(w,2,Length(w)-1))+w[1] else Revert:= ''
end;

function GetWord(var s: string): string;
begin
  while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1);
  GetWord:= Copy(s,1,Pos(' ',s)-1);
  Delete(s,1,Pos(' ',s))
end;

function Process(s: string): string;
var
  w: string;
begin
  w:= GetWord(s);
  if w<>'' then Process:= Revert(EvenOnly(w))+Process(s) else Process:= ''
end;

begin
  writeln(Process('zero one two three four five six seven eight nine ten elleven twelve '));
  readln
end.
Была у меня идея полностью отказаться от локальных переменных, но оказалось, что Pascal работает несколько не так, как я думал (а именно - обрабатывает сумму строк с конца), так что пришлось срочно залатать эту дыру. Если кому-то интересно, могу все же довести дело до конца и убрать злосчастную w .
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 22.04.2012 в 05:12.
TinMan вне форума Ответить с цитированием
Старый 22.04.2012, 05:25   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Эта маленькая бяка не давала мне покоя.. )) Сегодня была свободная минутка - и я сделал это!!
Ни одной переменой ВООБЩЕ - только параметры функций (причем, не липовые!))
Любуйтеся, ежели кому есть дело.. ))
Код:
function EvenOnly(w: string): string;
begin
  if Odd(Length(w)) then EvenOnly:= '' else EvenOnly:= w+' '
end;

function Revert(w: string): string;
begin
  if Length(w)>0 then Revert:= Revert(Copy(w,2,Length(w)-1))+w[1] else Revert:= ''
end;

function GetWord(var s: string): string;
begin
  while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1);
  GetWord:= Copy(s,1,Pos(' ',s)-1);
  Delete(s,1,Pos(' ',s))
end;

function Process(s: string): string;
begin
  if s<>'' then Process:= Process(s)+EvenOnly(GetWord(s)) else Process:= ''
end;

begin
  writeln(Process(Revert(' '+'zero one two three four five six seven eight nine ten elleven twelve')));
  readln
end.
Забавный момент - помогло то, что условие задачи поставлено именно так, а не иначе. Может показаться, что при этом теряется общность кода, но на самом деле это не совсем так. Просто кубики из набора (который я сделал) очень хорошо подошли именно для этой задачи .

P.S.
Еще один момент.. Можно ли полагаться на то, что обработка в сумме строк идет справа налево? Если заменить сумму на Concat, то получается то же самое, кстати.
Ктонть скажет ченть по этому поводу?.. Карпинский, а?
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 22.04.2012, 10:19   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А как Вы считаете, хороший ли это стиль, когда результат может зависеть от того, как та или иная функция реализована в компиляторе?

Да, проверил на своем компиляторе (TMT Pascal 4.01), 3 строки : первая "'how do you do and what you drink now'", вторая "'zero one two three four five six seven eight nine ten elleven twelve '", третья "' '+'zero one two three four five six seven eight nine ten elleven twelve'".

1 вариант (от kuy):
"od od tahw"
"orez ruof evif enin evlewt"
"orez ruof evif enin evlewt"

2 вариант (от TinMan):
"
RunError #202 at 00402AB0"
" orez ruof evif enin evlewt"
"
RunError #202 at 00401940
"

3 вариант (от TinMan):
"
RunError #202 at 004029F0
"
"
RunError #202 at 004029F0
"
"
RunError #202 at 004029F0
"

Последний раз редактировалось s-andriano; 22.04.2012 в 10:43.
s-andriano вне форума Ответить с цитированием
Старый 22.04.2012, 11:20   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
А как Вы считаете, хороший ли это стиль, когда результат может зависеть от того, как та или иная функция реализована в компиляторе?
Не, Мы (тут посоветовались, и) считаем, что это плохо...

Хороший стиль - это наплодить как можно больше дубовых (с разных точек зрения) решений, завалить ими форум и сделать жизнь предельно нудной и скучной )). Сан-Андриано, я не претендовал на 100%-ную надежность предложенного кода. Я пытался показать коллегам, что бывает что-то другое тоже (кроме циклов)) и вызвать их на разговор. И, похоже,. преуспел.. Дыр в моем решении до фига, критики оно не выдержит никакой. Но, надеюсь, кому-то расширит кругозор.. ))

TNT, говоришь? Давненько я с ним не сталкивался.. Спасибо за инфу, поисследую (когда поставлю).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 22.04.2012, 16:25   #9
Александра Раш
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 12
По умолчанию

ребята шикарно! спасибо всем , вы молодцы)))
Александра Раш вне форума Ответить с цитированием
Старый 23.04.2012, 20:57   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Я пытался показать коллегам, что бывает что-то другое тоже (кроме циклов)) и вызвать их на разговор. И, похоже,. преуспел..
Ну и прекрасно!
Выходит, все остались довольны друг другом и собой.
Цитата:
Дыр в моем решении до фига, критики оно не выдержит никакой. Но, надеюсь, кому-то расширит кругозор.. ))
Кругозор?
Вообще говоря, вполне ВОЗМОЖНО писать программы, которые будут работать при любом компиляторе. Ну, точнее, алгоритмы.
С другой стороны, традиционно принято уделять внимание оптимизации алгоритмов и программ.
Нужно только IMHO уметь отделять оптимизацию от "оптимизации".
В данном случае, если бы стояла задача ТОЛЬКО выбросить часть слов, то это можно было бы сделать на месте, не прибегая к дополнительной памяти. Но вот когда требуется что-то частично перевернуть, без дополнительной памяти не обойтись в принципе. И в этом случае ИЛЛЮЗИЯ неиспользования дополнительной памяти может быть достигнута лишь некоторым насилием над компилятором и использованием его недокументированных возможностей, что автоматически приводит к непереносимости кода.
По сути в предложенном решении используется не просто дополнительная память, но дополнительный МАССИВ, имеющий размер обрабатываемого массива (строка массив символов), т.е. решение имеет требование по памяти O(N).
А ту же самую задачу можно решить, используя лишь несколько простых переменных, т.е. требование по памяти O(1). И при этом быть переносимым.
Т.е. оптимизация IMHO состоит не в том, чтобы "спрятать" использование массива, а в том, чтобы без него реально обойтись.

PS. Да уж, "вызов на разговор" удался.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Определять максимальную длину той части строки s, которая не содержит символы из строки s1. Александе еть я Общие вопросы C/C++ 5 13.04.2010 20:54
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10