24 Ноя 2009 12:15 Basil22 писав(ла): Delphi не стоит, суть исходников от этого нисколько не измениться. А вот Scheme посмотреть было бы интересно.
Что до меня, я бы использовал язык Forth, и тогда программа состояла бы только из одного символа - "."
(распечатать результат со стека).
Какой интересный язык! Basil22, спасибо за наводку! Значит, постфиксный калькулятор на Forth выглядит по сути дела так же как префиксный на Lisp или Scheme -- как пустая программа.
Кстати не знаете ли Вы, есть ли какие-то глубокие причины, по которым Lisp не использует постфиксную запись? Тогда он, наверное, сильно напоминал бы Forth, избежав своего перегруза скобками. Конечно, одна из возможностей Lisp'а, недоступная при обычной постфиксной записи -- это операции с разным количеством операндов, как например ( + 3 4 5 ) = 12 и ( + 3 4 ) = 7. А есть ли ещё какие-нибудь и насколько они важны?
27 Ноя 2009 04:49 barvinsky писав(ла): Понятно. Инструкции обычно не читаю :-D А почему не съедаете пробелы? По сути ничего бы не изменилось.
Пробелы используются как разделители ради 1) простоты разбиения введённой строки на токены и 2) унификации правил ввода. У моего калькулятора три варианта: префиксный, инфиксный и постфиксный. Для префиксного и постфиксного калькулятора нужны символы-разделители (иначе не различить границу между двумя числами, следующими друг за другом).
27 Ноя 2009 04:49 barvinsky писав(ла): Свою версию не хочу - лень :-) Да и решение довольно очевидно - рекурсивно разбираем выражение по частям в порядке приоритета, т.е.
У меня другое решение: однопроходный индуктивный (а не рекурсивный) алгоритм, основанный на переводе инфиксной строки в постфиксную.
27 Ноя 2009 04:49 barvinsky писав(ла): Предложить могу - для начала несложное :-)
Спасибо! Если остальным будет интересна эта задача, подумаем над её решением.
26 Ноя 2009 13:18 barvinsky писав(ла): Во всех выложенных решениях сходу виден косяк типа 1--1 или 1*-1 (это корректные выражения, если что). :-)
1--1 - это IMHO некорректное выражение. Если необходимо вычесть минус единицу, то пишется 1-(-1). А то что С++ допускает конструкцию i+++++i, еще ни о чем не говорит
Прежде чем зачинать новый конкурс, я бы предложил таки закончить старый , то есть подвести его итоги.
Лично я просмотрел (и заценил) предложенные программы до такому критерию - насколько легко программа воспринимается в целом. Критерий взят умышленно, я сейчас на основной работе вожусь со старым кодом. И там нередко встречается проблема, когда понять что делает код еще можно, но вот разобраться ДЛЯ ЧЕГО он это делает - очень и очень трудно. В этом свете мне больше всего понравилась программа от sein, у которой отличные комментарии, причем они поясняют как суть и необходимость того, что собственно делается. Возможно их многовато (я например не люблю делать комментарии к 2..3 строчным функциям, считая что такая функция говорит сама за себя), но именно этот исходник зацепил меня.
Теперь вы высказывайтесь и обсуждайтесь
P.S. На конкурс тоже есть идея, но давайте доведем до конца старый. Василий
1 відвідувач подякували Basil22 за цей допис
3 Дек 2009 13:36 Basil22 писав(ла): Прежде чем зачинать новый конкурс, я бы предложил таки закончить старый , то есть подвести его итоги.
ну у нас был не совсем конкурс, мы собирались просто высказаться и обсудить -кто, что и почему использовал -и как -где различия и все такое. Это была такая стартовая разминка.)
3 Дек 2009 13:36 Basil22 писав(ла): В этом свете мне больше всего понравилась программа от sein, у которой отличные комментарии, причем они поясняют как суть и необходимость того, что собственно делается. Возможно их многовато (я например не люблю делать комментарии к 2..3 строчным функциям, считая что такая функция говорит сама за себя), но именно этот исходник зацепил меня.
да, sein просто молодец!!! Что касается комментов и их количества -это я его попросила всё подробно, вы не забывайте, что это вы тут все монстры, а я блондинка -но вам как раз полезно моё присутствие.
Еще у sein мне нравится то, что он выбрал такой язык, что не требуется дополнительная установка девайсов и всего такого. Я хоть и не программист, но думаю, что в конечном итоге программа должна выдавать что-то типа ехе-шника или вот такой страницы, чтоб любая блондинка могла ей пользоваться, прочитав несколько строк инструкции.
Но я еще не смотрела труды barvinsky)) посмотрю, может, в выходные.
И Саша-alexxst не вернулся кажется еще.
Basil22, а Вы не хотите тоже принимать участие в конкурсах? А не только в обсуждениях?)))
Хорошо, а 2*-2? Или ты на бумажке всегда пишешь 2*(-2)? :-)
Насколько я знаю, скобки используются для задания порядка вычисления выражения, и только. В данном случае этого не требуется - унарные операторы и так имеют больший приоритет.
4 Дек 2009 11:31 barvinsky писав(ла): Хорошо, а 2*-2? Или ты на бумажке всегда пишешь 2*(-2)? :-)
так и пишу да -всегда))) и в бумажках и в статьях)
4 Дек 2009 11:31 barvinsky писав(ла): Насколько я знаю, скобки используются для задания порядка вычисления выражения, и только. В данном случае этого не требуется - унарные операторы и так имеют больший приоритет.
ну есть некоторые правила, которые общеприняты, это как в любом языке, мы тут вот общаемся и не ставим всех знаков препинания и ломаем слова, но если пишем официальные письма или статьи -то без вопросов придерживаемся правил, которые общие для всех.
ну а не требуется и не надо))
7 Дек 2009 03:55 barvinsky писав(ла): В случае стандартных типов
...(выражение i+++++i)...
ошибка. Будет работать вот так i+++i. Или i+(++++i). А вот так не будет (i++++)+i.
Да, и в самом деле не работает. А я, грешным делом, понял это как (i++) + (++i), т.е. как завуалированный набор предписаний:
(i++) = запомнить, что в конце работы надо увеличить i на единицу;
(++i) = увеличить немедленно переменную i на единицу
(i) + (i) = прибавить переменную к самой себе, т.е. удвоить
(Иначе говоря, если обозначить через x первоначальное значение переменной i, получим для самого выражения значение 2*( x + 1 ), а для переменной: i = x + 2.)
7 Дек 2009 05:09 barvinsky писав(ла): Не совсем так. Немедленно увеличить i на единицу, но вернуть в результате копию i в предыдущем состоянии
Это объяснение, вкупе с написанным выше классом, совершенно проясняет ситуацию. Спасибо.
7 Дек 2009 05:09 barvinsky писав(ла): Немедленно увеличить i на единицу, вернуть ссылку на i. Тогда надо писать i++ + ++i :-) А сплошные плюсы он воспринимает как i++ ++ + i.
Удивительно -- не думал что пробелы тут на что-то повлияют, но действительно i++ ++ + i работает, a i+++++i -- нет.