Ludmila
|
|
« : 20-11-2008 19:34 » |
|
Помогите пожалуйста построить конечный автомат для перевода дробных двоичныхчисел в десятичные
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 20-11-2008 20:16 » |
|
Ну вообше то я вижу простую арифметику. Убрать целую часть и пошел умножать на десять, пока не исчезнит дробная часть. Если сюда всовывать конечный автомат, то в приципе овчинка выделки не стоит.
|
|
« Последнее редактирование: 15-12-2008 17:58 от Алексей1153++ »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Вад
|
|
« Ответ #2 : 20-11-2008 20:50 » |
|
Finch, ну задача-то, как я понимаю, учебная Хотя, может, автор опровергнет. Ludmila, уточни, с чем конкретно проблема. Какие свои мысли есть? Не может быть, чтоб совсем не было
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #3 : 21-11-2008 10:27 » |
|
Так звучит моя курсовая работа по дискретной математике.Нужно расписать все состояния автомата что поступает на вход а что поступает на выход. что-то вроде такого (для перевода из двоичных в десятичный): Например: поступает двоичное число 001001 1) левые нули отбрасываются ; 2) w=1; 3) если 0, то w*2=2; 4) если 1, то w*2+1; Конечно это всё нужно рассписать в виде таблицы и для перевода дробных двоичных чисел. А вот это я как раз и не знаю, практики было очень мало
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #4 : 21-11-2008 10:53 » |
|
Ну чего мне теперь делать если я реально не могу понять как построить конечный автомат? Ну я не очень умная! Да я это признаю!Поэтому я к Вам и обратилась за помощью! Может я не понимаю даже элементарного! Я надеюсь на Вашу помощь, хотя б какую нибудь подсказочку!!!
|
|
|
Записан
|
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 21-11-2008 10:59 » |
|
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #7 : 21-11-2008 11:00 » |
|
Я не могу расписать состояния
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #8 : 21-11-2008 11:02 » |
|
Всё это я не раз просмотрела!Но понять как расписать я не могу
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #9 : 21-11-2008 18:06 » |
|
Для начала ты должна выяснить, какие сигналы автомат принимает (все возможные)!
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #10 : 21-11-2008 18:10 » |
|
Впринципе это двоичный код значит 0 и 1 а если дрбные то значит ещё надо учесть запятую
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #11 : 21-11-2008 18:13 » |
|
Теперь создай все необходимые переменные для реализации автомата (например - начало числа (отсечение нолей)). Если потом не будет хватать, то добавить можно в любую минуту...
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #12 : 21-11-2008 18:15 » |
|
поступает двоичное число 001001 1) левые нули отбрасываются ; 2) w=1; 3) если 0, то w*2=2; 4) если 1, то w*2+1;
Перед тем как продолжать, уточни, что такое w?
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #13 : 21-11-2008 18:16 » |
|
Ludmila, как выглядит двоичное представление вещественного числа? Понятия экспоненты и мантиссы знакомы?
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #14 : 21-11-2008 18:18 » |
|
w - какая-либо переменная, от которой будет зависеть запись на выходе
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #15 : 21-11-2008 18:35 » |
|
если я правильно понимаю, то для считывания стандартного двоичного представления есть состояния "считывается знак", "считывается мантисса", "считывается экспонента". Переход в каждое из этих состояний сопровождается инициализацией счётчика двоичных разрядов, которые осталось считать (ведь по-нормальному, их число фиксировано). Обнуление счётчика приводит к фиксации результата и смене состояния.
Если под двоичными дробными понимается что-то совсем своё - то состояния будут несколько иными.
|
|
« Последнее редактирование: 15-12-2008 18:01 от Алексей1153++ »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #16 : 21-11-2008 18:35 » |
|
Ludmila, приводимый пример преподаватель дал?
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #17 : 21-11-2008 18:36 » |
|
Да
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #18 : 21-11-2008 18:38 » |
|
Тогда повторю вопрос: Ludmila, как выглядит двоичное представление вещественного числа? Понятия экспоненты и мантиссы знакомы? Потому что от этого зависит, какие будут состояния. Лучше представление числа изобразить схематически.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #19 : 21-11-2008 18:41 » |
|
Какие примеры у тебя есть - покажи их...
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #20 : 21-11-2008 18:43 » |
|
как какие Вот только то, что приведено выше и не более того
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #21 : 21-11-2008 18:46 » |
|
(Я нашёл только 001001, если я не прав, скажите) Для 001001 тогда будет всего 3 сигнала - "0", "1" и "." (завершение введения), так это очень просто как для курсовой работы
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #22 : 21-11-2008 18:49 » |
|
а у меня тогда будет 4 сигнала "0" "1" "," "."?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #23 : 21-11-2008 18:52 » |
|
Понятия экспоненты и мантиссы знакомы?
Первый раз про мантиссы слышу... Зашёл на Википедию, прочитал, разобрался. А теперь извините, не понял: зачем для 011001010 мантиссы и экспоненты, если такое двоичное представление можно сразу переводить в число? (изменение: ну хотя бы число 100100111,100101?)
|
|
« Последнее редактирование: 21-11-2008 18:54 от Inkognito »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #24 : 21-11-2008 18:58 » |
|
У меня при создании автомата был такой алгоритм: 1) определение входных сигналов; 2) создание переменных; 3) создание графа переходов (+ досоздание переменных); 4) рисовал таблицу переходов; 5) и потом писал код программы.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #25 : 21-11-2008 19:00 » |
|
Inkognito, поскольку я до сих пор не понял, какую запись дробного двоичного подразумевает задание, запись вида "100100111,100101" мне кажется сомнительной - никогда не видел, чтобы так записывали, даже для учебного задания.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #26 : 21-11-2008 19:05 » |
|
Вад, мне самому эта запись не нравится.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #27 : 21-11-2008 19:14 » |
|
тоже никогда ещё не встречал применения дробного двоичного числа ))
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #28 : 21-11-2008 19:21 » |
|
Как вы считаете это правильно или бред? Граф
|
|
« Последнее редактирование: 15-12-2008 18:03 от Алексей1153++ »
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #29 : 21-11-2008 19:23 » |
|
где s1 s2 s3 s4 s5 состояния s0 начальное состояние
|
|
« Последнее редактирование: 15-12-2008 18:04 от Алексей1153++ »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #30 : 21-11-2008 19:32 » |
|
Для S0 не предусмотрены состояния "," и ".". Для состояния S3 будет забрано только одну цифру, а все остальные проигнорируются.
И вообще не понятно, что будет делать данный автомат - как будут изменятся переменные: куда считываешь число до запятой и когда прекращаешь это делать и т. д. ... Это всё нужно показывать, мы на СР вообще так делали.
Кстати, должен быть ещё один тип сигнала - "Other" - все остальные символы.
|
|
« Последнее редактирование: 15-12-2008 18:06 от Алексей1153++ »
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #31 : 21-11-2008 19:41 » |
|
да до всех символов дойти надо мне хотяб так пока
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #32 : 21-11-2008 19:46 » |
|
да до всех символов дойти надо мне хотяб так пока
Все символы как раз обрабатывать и не надо, а игнорировать, это просто надо предусмотреть для каждого состояния и не более.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #33 : 21-11-2008 19:59 » |
|
как вообще тогда перевести дробное двоичное число в десятичное? Обычным способом? Но чего получится?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #34 : 21-11-2008 20:05 » |
|
Возьмём для начала состояние S0 (начальное). Если сигнал "." - прекратить работу автомата (перейти, например, к состоянию 1); если "0" - отсекаем ноль; если "1" - то в соответствии - число перед запятой или после - переходим к состоянию 2 или 3; если "Other" (остальные символы) - нечего не делать; если "," - перейти, например, к состоянию 3... И так для каждого состояния описываешь все варианты. А при выходе обработать данные.
Кстати, как добавить рисунок в сообщение? А, всё, нашёл.
|
|
« Последнее редактирование: 21-11-2008 20:10 от Inkognito »
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #35 : 21-11-2008 20:09 » |
|
а как тогда на выходе обработать данные?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #36 : 21-11-2008 20:13 » |
|
Я сделал бы функцию превращения двоичного числа в десятичное - 1111 в 15.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #37 : 21-11-2008 20:22 » |
|
?а если число 10,1 то как по обычному 10,1=1*2^1+0*2^0+1*2^(-1) так?
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #38 : 21-11-2008 20:25 » |
|
как? какая функция?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #39 : 21-11-2008 20:26 » |
|
Хотя 10,1 вероятней всего неверный способ, но я сделал бы так: 10 = 2, 1 = 1, а тогда результат равен 2,1.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #40 : 21-11-2008 20:28 » |
|
это как так? на по всем правилам перевода 10,1=2,5?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #41 : 21-11-2008 20:35 » |
|
как? какая функция?
Такой пример: пользователь вводит свою строку, она же - строка сигналов. В цикле ты поочереди считываешь сигнал. Когда доходишь до сигнала "." - ты должна прервать цикл (остановить автомат). Но перед тем как закончить работу цикла, ты преобразовываешь двоичное число в десятичное с помощью функции, которую описываешь в коде программы отдельно. Я не понимаю вопроса...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 21-11-2008 20:35 » |
|
1*21+0*20+1*2-1 = 2 + 0 + 0.5 = 2.5 , всё верно девушка говорит
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #43 : 21-11-2008 20:38 » |
|
Хотя 10,1 вероятней всего неверный способ, но я сделал бы так: 10 = 2, 1 = 1, а тогда результат равен 2,1.
да да Алексей1153 правильно говорит как у тебя 2,1 получилась?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #44 : 21-11-2008 20:39 » |
|
1*21+0*20+1*2-1 = 2 + 0 + 0.5 = 2.5 , всё верно девушка говорит
Вообще-то да, согласен, не понял, извините...
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #45 : 21-11-2008 20:42 » |
|
ну так кто знает как на выходе обработать данные?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #46 : 21-11-2008 20:45 » |
|
Хотя с другой стороны вот сравнения: 1) моим способом: 10,1 - 2,1 10,10 - 2,2 10,11 - 2,3 2) вашим способом: 10,1 - 2,5 10,10 - 2,5 10,11 - 2,75.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #47 : 21-11-2008 20:46 » |
|
наверное, надо накапливать результат в переменной
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #48 : 21-11-2008 20:47 » |
|
Хотя с другой стороны вот сравнения: 1) моим способом: 10,1 - 2,1 10,10 - 2,2 10,11 - 2,3 2) вашим способом: 10,1 - 2,5 10,10 - 2,5 10,11 - 2,75.
2 - верно )
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #49 : 21-11-2008 20:48 » |
|
( я тоже за (2)
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #50 : 21-11-2008 20:54 » |
|
Я в Инете нашёл вот такое представление числа с запятой: aaaabbbb, и тогда получаем число через экспоненту и мантиссу в виде: aaaa*2^bbbb.
|
|
« Последнее редактирование: 21-11-2008 21:05 от Inkognito »
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #51 : 21-11-2008 20:55 » |
|
вот предыдущий мой пример: 1001 w=1;<-------| | | | w*2=2;<-----| | | w*2=4;<-------| | w*2+1=9.<------| Это ж вроде верно
|
|
« Последнее редактирование: 21-11-2008 21:00 от Ludmila »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #52 : 21-11-2008 20:59 » |
|
10012 = 910 это верно
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #53 : 21-11-2008 20:59 » |
|
Inkognito, это вообще то не метод, а правило
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #54 : 21-11-2008 21:01 » |
|
а вот дробную часть далше как превратить
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #55 : 21-11-2008 21:02 » |
|
первое число после запятой умножается на основание в -1 степени, второе - в -2 степени и так далее
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #56 : 21-11-2008 21:11 » |
|
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #57 : 21-11-2008 21:14 » |
|
|
|
« Последнее редактирование: 15-12-2008 18:10 от Алексей1153++ »
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #58 : 21-11-2008 21:19 » |
|
0 1 2 3 - это состояния значит?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #59 : 21-11-2008 21:21 » |
|
Да, состояния
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #60 : 21-11-2008 21:41 » |
|
Спасибочки!Надо ещё подробней разобраться) А обработку как вообще делать?
|
|
« Последнее редактирование: 15-12-2008 18:11 от Алексей1153++ »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #61 : 22-11-2008 11:59 » |
|
Перевести двоичные числа ch1 и ch2 в десятичные, ch1 переводить с повышением степеня (1*2 0 + 0*2 1 + 1*2 2...), а ch2 - с его понижением (0*2 -1 + 1*2 -2...). Потом сложить эти два результата и получим окончательный результат, который можно выводить на экран. Именно это я имел ввиду под словом "обработка". Но это в том случае, если делать за моим графом. Если у тебя другой граф, то обработку нужно делать соответственно до твоей постановки решения.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #62 : 22-11-2008 12:03 » |
|
То есть обработка данных- это сложить?
|
|
« Последнее редактирование: 22-11-2008 12:05 от Ludmila »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #63 : 22-11-2008 12:12 » |
|
Inkognito, Ludmila, не совсем так получается: строку то рассматриваем слева направо, поэтому
до точки:
результат = первый символ| An второй символ| *2 + An-1 третий символ| *2 + An-2 ...............| последний | *2 + A1
после точки:
результат = результат + первый символ| B1 /2 второй символ| +B2 /4 третий символ| +B3 /8 ...............| последний | +Bm /2-m
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #64 : 22-11-2008 12:17 » |
|
Inkognito, Ludmila, не совсем так получается: строку то рассматриваем слева направо, поэтому
ch1 и ch2 - строчки. ch2 - рассматриваем слева направо, а ch1 - справа налево, иначе да результат будет неправильным
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #65 : 22-11-2008 12:20 » |
|
То есть обработка данных- это сложить?
Если ты сложишь ch1 и ch2, то получишь число в двоичной системе; сложить надо уже в конце два десятичных числа... Давай по-порядку. Первое это Перевести двоичные числа ch1 и ch2 в десятичные
На каком языке программирования ты будеш делать код?? Для начала сделай функцию перевода двоичного числа в десятичное: принимает 1111 и возвращает 15.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #66 : 22-11-2008 12:20 » |
|
Буду делать скорее всего на СИ
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #67 : 22-11-2008 12:21 » |
|
тогда, насколько я понимаю, автомата не выйдет. Надо всё слева направо
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #68 : 22-11-2008 12:23 » |
|
Да и автомат можно и не программирывать! просто таблицы составить алгоритм ! А на каком можно сделать автомат Паскаль?
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #69 : 22-11-2008 12:26 » |
|
тогда, насколько я понимаю, автомата не выйдет. Надо всё слева направо
Автомат будет забирать сигналы слева направо. А работа с числом ch1 будет идти справа налево КОГДА автомат уже и так примет сигнал остановки и работать не должен. Граф - это только рисунок, чтобы было легче делать алгоритм...
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #70 : 22-11-2008 12:27 » |
|
Так на каком языке можно сделать автомат?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #71 : 22-11-2008 12:28 » |
|
Так на каком языке можно сделать автомат?
На любом - ограничений для этого нет. Какие языки ты знаешь?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Dr.Yevhenius
|
|
« Ответ #72 : 22-11-2008 12:29 » |
|
Так на каком языке можно сделать автомат?
На любом, даже на JavaScript. Главное знать этот язык, на котором будешь делать работу...(не заметил ответа )
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #73 : 22-11-2008 12:32 » |
|
JavaScript капельку знаю Assembler C Paskal HTML CSS Visual Basic тока начала
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #74 : 22-11-2008 12:34 » |
|
Правда это всё не в совершенстве (Assembler C Paskal)
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #75 : 22-11-2008 12:39 » |
|
В совершенстве знать и не надо. Хватит знаний основных типов данных, операторов сравнения, циклов и переключателей.
|
|
|
Записан
|
|
|
|
Ludmila
|
|
« Ответ #76 : 22-11-2008 12:40 » |
|
но на Си всё таки мне ближе
ГЛАВНОЕ ДЛЯ МЕНЯ РАСПИАТЬ ВСЕ СОСТОЯНИЯ ТАБЛИЦУ ПЕРЕХОДОВ И ТО ЧТО ПОЛУЧИТСЯ НА ВЫХОДЕ А самое самое важное понять весь этот принцип и защититься
Вот я ещё не совсем поняла Получается мой автомат будет задан такими параметрами M=(N(Конечное множество состояний автомата),n0(начальноу состояние)S(входной алфавит),B(выходной алфавит)) Так? И вот ещё как понять допускающее и недопускающее состояние? У меня такое будет?
|
|
« Последнее редактирование: 15-12-2008 18:12 от Алексей1153++ »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #77 : 22-11-2008 13:01 » |
|
Ну конечные автоматы еше называют switch технология. Строится примерно так int stat=1; while (stat) { switch(stat) { case 1: //Тут действия для 1 состояния break; case 2: //Тут действия для 2 состояния break; case 3: //Тут действия для 3 состояния break; case 4: //Тут действия для 4 состояния break; ............. } }
состояние 0 будет выходом из автомата.
|
|
« Последнее редактирование: 22-11-2008 13:03 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Ludmila
|
|
« Ответ #78 : 28-05-2009 19:23 » |
|
)Да прошло конечно очень много дней, с тех пор как я здесь появлялась!)Извеняюсь что так долго не заходила!Но могу сказать что эту курсовую я защитила на отлично!Я Вас всех благодарю, ведь только Вы поддержали меня в столь трудную тогда для меня минуту!
|
|
|
Записан
|
|
|
|
|