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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2013, 17:00   #1
Shadowalker
Новичок
Джуниор
 
Регистрация: 15.03.2013
Сообщений: 1
Вопрос Задача на циклическую перестановку символов

Доброго всем времени суток!

Требуется помощь в написании простенькой программы на циклическую замену символов в слове. Например, из слова "Hello" получить "olleH". Пробывал все-все (и переменные char, string... length, downto... в общем кучу всего...), но в конце концов окончательно запутался.

P. S. Пытался выкрутиться своими силами, но, видимо, слишком долго не работал в TurboPascal.

Заранее спасибо за помощь.
Shadowalker вне форума Ответить с цитированием
Старый 15.03.2013, 17:37   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Shadowalker Посмотреть сообщение
Пытался выкрутиться своими силами, но, ...
На самом деле все гораздо хуже.
Циклическая замена не может подобным образом преобразовать слово.
Так что проблема в условии - оно внутренне противоречиво.
s-andriano вне форума Ответить с цитированием
Старый 15.03.2013, 17:50   #3
forged
Пользователь
 
Регистрация: 25.02.2013
Сообщений: 57
По умолчанию

Токая программа?
--------------------------------------------
var
i:integer;
s:string;
BEGIN
readln(s);
for i:=length(s) downto 1 do
write(s[i]);
END.
--------------------------------------------
forged вне форума Ответить с цитированием
Старый 15.03.2013, 19:01   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

forged, Ваша программа вообще не производит никаких замен. Получение некоторого результата в строке и формирование некоторого (пусть даже того же самого) результата на экране - это разные задачи.
s-andriano вне форума Ответить с цитированием
Старый 15.03.2013, 19:52   #5
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
for i:=1 to length(s) div 2 do begin
  temp:=s[i];
  s[i]:=s[length(s)-i+1];
  s[length(s)-i+1]:=temp;
end;
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 15.03.2013, 20:28   #6
forged
Пользователь
 
Регистрация: 25.02.2013
Сообщений: 57
По умолчанию

Почему? Просят же было так: вводим слово 'hello' вывод 'olleh' или 'File' 'eliF'
forged вне форума Ответить с цитированием
Старый 15.03.2013, 20:34   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от forged Посмотреть сообщение
Почему? Просят же было так: вводим слово 'hello' вывод 'olleh' или 'File' 'eliF'
Еще раз: по условию "получить", а не "вывести на экран".
Т.е. в результат должен быть в переменной для возможности дальнейшего использования. В вашем случае этого не происходит.
s-andriano вне форума Ответить с цитированием
Старый 15.03.2013, 23:02   #8
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Я снова дико извинюсь, но можно я тут тихонечко пофлужу?

Вот пример forged'a имеет сложность O(N)
Код:
ReadLn (s1);

s2 := '';
for i := Length(s) downto 1 do
       s2 := s2+s1[i];
        
s1 := s2
Пример Sciv'a имеет сложность O(N div 2)
Но ведь в примере#2 в цикле выполняется 3 оператора, а в первом только 1..

Вообщем вопрос : как в таком случае высщитать сложность?
Poma][a вне форума Ответить с цитированием
Старый 15.03.2013, 23:16   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Сложность алгоритма определяется с точностью до константы, поэтому никакой сложности O(N div 2) быть не может, это та же сложность O(N).
Другими словами, оба примера имеют одинаковую асимптотическую сложность.

Вы ведь не знаете, во сколько ассемблерных инструкций превратится один оператор на ЯВУ?
А три оператора?
А при включенном оптимизаторе?

Вопрос кстати, очень интересный потому, что при правильной оптимизации эти три операции на ЯВУ должны превратиться в одну-две инструкции (в зависимости от системы команд - одноадресная или двухадресная).
s-andriano вне форума Ответить с цитированием
Старый 16.03.2013, 07:25   #10
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Сложность алгоритма определяется с точностью до константы
А до какой константы? До N?

А если будет такой алгоритм :
Код:
for i := 1 to n div 2 do
    r := r + i;
То сложность будет тоже O(N)?
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать перестановку слов в веденном предложении не повторяя одинаковые перестановки luybeznov Помощь студентам 3 22.05.2012 00:28
Даны 2-е матрицы размерностью 40,40. Выполнить перестановку первой и последней строки. V1rus.25 Паскаль, Turbo Pascal, PascalABC.NET 9 22.04.2012 11:06
нужна перевести циклическую сумму с бэйсика на с++ TiNTi Помощь студентам 2 01.05.2011 23:04
Как разорвать циклическую структуру? Лисп s2dentishe Помощь студентам 4 20.02.2011 15:16