Профиль должен быть заполнен на русском языке кириллицей. Заполнение профиля заведомо ложными или некорректными данными - причина возможного отказа в регистрации на форуме.

интересная задача по программированию

PLC, прочие контроллеры, промышленные компьютеры, операторские панели

Автор темы
evgeny_alp
здесь недавно
здесь недавно
Сообщения: 6
Зарегистрирован: 29 ноя 2012, 14:33
Ф.И.О.: Алпатов Евгений Юрьевич

интересная задача по программированию

Сообщение evgeny_alp » 27 фев 2013, 16:11

Доброго Всем времени суток.Наткнулся на интересную задачу:

Необходимо написать функцию (Step 7), которая будет преобразовывать целое число на входе, в битовый сигнал на выходе (размерность слово).
Суть в том, что бы уложиться в минимум строк кода функции. Идеально в 3 строки.

Вход Выход
0 0000 0000 0000 0000
1 1000 0000 0000 0001
2 0100 0000 0000 0010
3 0010 0000 0000 0100
4 0001 0000 0000 1000
5 0000 1000 0001 0000
6 0000 0100 0010 0000
7 0000 0010 0100 0000
8 0000 0001 1000 0000
9 0000 0000 1100 0000
10 0000 0000 0110 0000
11 0000 0000 0011 0000
12 0000 0000 0001 1000
13 0000 0000 0000 1100
14 0000 0000 0000 0110
15 0000 0000 0000 0011

Уже сутки ломаю голову, всё никак(((... Закономерность видна с 1 по 8 и с 9 по 15, но вот чтобы с 1 по 15...
Заранее спасибо)))


Alex1980
здесь недавно
здесь недавно
Сообщения: 58
Зарегистрирован: 23 фев 2013, 15:48
Ф.И.О.: Alexey Shepolov

Re: интересная задача по программированию

Сообщение Alex1980 » 27 фев 2013, 17:31

в 3 строки не получится. во первых на выходе не битовый сигнал получается а слово (2 байта) только в двоичном виде.
закономерность я нашел такую:
1 приходит целое число, которое является по сути смещением в выходном слове для установки бита(пришла 1 - значит в выходном числе должен установится 1 бит).
2 это смещение по которому должна устанавливаться 1 отсчитывается слева направо (если на входе 14 то единица установлена в 14-м бите слева)
3 затем следует еще одно условие : если смещение меньше или равно половине (то есть 8) , то бит также устанавливается и справо налево(если на входе 2 то на выходе единица установлена и справа со смещением 2). как только смещения перекрывают друг друга , то есть на входе число больше 8 то в выходном числе надо устанавливать соседний бит (то есть в числе 9 сначала устанавливается девятый бит слево направо а затем устанавливается соседний бит, т.к. 9>8)


Alex1980
здесь недавно
здесь недавно
Сообщения: 58
Зарегистрирован: 23 фев 2013, 15:48
Ф.И.О.: Alexey Shepolov

Re: интересная задача по программированию

Сообщение Alex1980 » 27 фев 2013, 17:38

задачу лучше решить на STL


Василий Иванович
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 21 авг 2009, 13:25
Ф.И.О.: Василий Иванович
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Re: интересная задача по программированию

Сообщение Василий Иванович » 27 фев 2013, 23:53

А мне на SCL больше нравится. Как-то так будет:

Y := SHL(IN := BOOL_TO_WORD(X>0), N := 16 - X) OR SHL(IN := BOOL_TO_WORD(X>0), N := 7 - ABS(8-X));

Надо, конечно, протестить, но вроде граблей быть не должно. Увы, в Ваш идеал не уложился - всего одна строка. :D


Владимир Кузнецов
не первый раз у нас
не первый раз у нас
Сообщения: 321
Зарегистрирован: 31 авг 2011, 21:14
Ф.И.О.: Кузнецов Владимир Сергеевич

Re: интересная задача по программированию

Сообщение Владимир Кузнецов » 02 мар 2013, 14:08

массив значений, выборка по индексу.
и никаких закономерностей искать не нужно =)


Alex1980
здесь недавно
здесь недавно
Сообщения: 58
Зарегистрирован: 23 фев 2013, 15:48
Ф.И.О.: Alexey Shepolov

Re: интересная задача по программированию

Сообщение Alex1980 » 03 мар 2013, 00:18

Владимир Кузнецов писал(а):массив значений, выборка по индексу.
и никаких закономерностей искать не нужно =)


здорово сказал. вроде бы умные словосочетания но ни о чем) как начальство обычно говорит: "сделай то, то и то...там же все просто" , а как это сделать если деньги он не хочет выделять на проект? слова должны закрепляться чем то. я тоже могу сказать: косвенная адресация, смещение в адресном регистре и никаких проблем. думаю что это решение задачи точно облегчит :D

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 519
Зарегистрирован: 21 сен 2012, 21:45
Ф.И.О.: Воробьев Александр
Поблагодарили: 12 раз
Контактная информация:

Re: интересная задача по программированию

Сообщение aranea » 03 мар 2013, 09:07

Alex1980, непонятные для вас слова "массив" и "индекс" наглядно представлены на картинке ниже
[spoiler=картинка]Изображение
картинку сделал Yegor, решение задачи http://www.owen.ru/forum/showpost.php?p ... stcount=12[/spoiler]
алгоритм http://iadt.siemens.ru/forum/viewtopic. ... 541#122541
Изображение


Василий Иванович
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 21 авг 2009, 13:25
Ф.И.О.: Василий Иванович
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Re: интересная задача по программированию

Сообщение Василий Иванович » 03 мар 2013, 11:42

Не давайте ссылок на алгоритмы с ошибкой. Михайло нумерует биты, начиная со старшего. Детская болезнь левизны, чтоль... :)


Владимир Кузнецов
не первый раз у нас
не первый раз у нас
Сообщения: 321
Зарегистрирован: 31 авг 2011, 21:14
Ф.И.О.: Кузнецов Владимир Сергеевич

Re: интересная задача по программированию

Сообщение Владимир Кузнецов » 03 мар 2013, 12:41

Любой конечный автомат можно реализовать через ячейки в памяти (ПЗУ).
Каждому входному значению будет соответствовать своё значение в ячейке.
В конкретном случае нужно создать массив (DB) из 16ти двух байтовых ячеек, содержимое которого фактически описано в первом сообщении.
Делая выборку из массива по индексу являющемуся входным значением получаем искомое.
Непонятно только что за битовый сигнал требуется по условию.
На форуме овена дали аналогичный ответ, если кому не понятно могут посмотреть там.


Василий Иванович
авторитет
авторитет
Сообщения: 872
Зарегистрирован: 21 авг 2009, 13:25
Ф.И.О.: Василий Иванович
Благодарил (а): 1 раз
Поблагодарили: 3 раза

Re: интересная задача по программированию

Сообщение Василий Иванович » 03 мар 2013, 13:23

Слишком много шума из задачки уровня школьной олимпиады.
:ext_sleep:


Владимир Кузнецов
не первый раз у нас
не первый раз у нас
Сообщения: 321
Зарегистрирован: 31 авг 2011, 21:14
Ф.И.О.: Кузнецов Владимир Сергеевич

Re: интересная задача по программированию

Сообщение Владимир Кузнецов » 03 мар 2013, 13:35

Василий Иванович писал(а):Слишком много шума из задачки уровня школьной олимпиады.
:ext_sleep:

Всем хочется показать себя умными :)


Alex1980
здесь недавно
здесь недавно
Сообщения: 58
Зарегистрирован: 23 фев 2013, 15:48
Ф.И.О.: Alexey Shepolov

Re: интересная задача по программированию

Сообщение Alex1980 » 03 мар 2013, 15:16

Владимир Кузнецов писал(а):
Василий Иванович писал(а):Слишком много шума из задачки уровня школьной олимпиады.
:ext_sleep:

Всем хочется показать себя умными :)


у вас человек evgeny_alp просто спросил. а вы как раз начали поднимать шум) типа школьные задачки, типа умные словосочетания :D если не хотите помогать то промолчите. зачем нести бред который ему точно не полезен. этот форум наверно и создали чтоб опытный помог новичку. с весной всех :ges_up:


Владимир Кузнецов
не первый раз у нас
не первый раз у нас
Сообщения: 321
Зарегистрирован: 31 авг 2011, 21:14
Ф.И.О.: Кузнецов Владимир Сергеевич

Re: интересная задача по программированию

Сообщение Владимир Кузнецов » 03 мар 2013, 20:37

Alex1980 писал(а):зачем нести бред который ему точно не полезен.

Вообще то я по теме ответил и дал верный ответ, который потом пришлось подробнее объяснять для непонятливых.
А вот автор куда то пропал, что не делает ему чести и показывает реальную актуальность задачи.


Михаил
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 10 июл 2012, 13:34
Ф.И.О.: М М В

Re: интересная задача по программированию

Сообщение Михаил » 04 мар 2013, 11:56

Ничего писать не надо. Надо просто правильно обращаться к памяти.
MW 500 WORD - > m 500.0 (0 bit)
....
m 500.2 (2 bit)
....
m 501.2 (11 bit)
....
m 501.7 (15 bit)


Вернуться в «Средний уровень автоматизации»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя