Насколько я понял, для того чтобы опробовать программу alexxst, не нужно ничего устанавливать. В папке "EtalonCalc-Release" есть запускаемый файл "EtalonCalc.exe", который должен работать в системе Windows без дополнительных установок. Я его опробовал -- программа работает хорошо, даже есть возможность оценить время, затраченное на вычисления. Вот с самим исходником я ещё не разбирался. Исходник -- это файл "EtalonCalc-Program.cs". Дефисы в кавычках надо заменить на обратные косые черты.
Спасибо на добром слове. Я старался.
P.S. Боюсь что я рано похвалил -- мне кажется программа делает что-то не то (или я не понимаю, как надо с ней общаться). Не видите ли вы странности в первом из следующих примеров: [imagesein1258770964]
По-моему, проблема проявляется в ситуации, когда операция с более высоким приоритетом появляется без скобок перед операцией с более низким приоритетом.
да, там описка есть в методе:
private static int calcMultExpression(FormulaParser parser)
в 114 строке надо заменить
var val2 = calcExpression(parser);
на
var val2 = calcPrimitive(parser);
P.S. На коленке писалось за 20 минут, так что не ругайте сильно)))
Почему выбрал C#, а не JavaScript.. хмм. да потому что я JavaScript не знаю, и учить его не охота. Выбрал собственно то, что под рукой оказалось, в тот момент когда писал у меня был ноут, а на нём только C# Express стоял. Ещё стоял Chez Scheme и PHP но я решил, что настолько экзотичным быть не стоит)
P.P.S. У меня сегодня самолёт, как прилечу, Аврора, специально для тебя, на Delphi вариант его напишу, и устанавливать.NET не надо будет
Спасибо, Саш)) Но разобраться -почему у меня.NET не устанавливается -тоже надо бы -видимо у меня тут всё вообще криво встало. Баль же винду и линукс ставил
Удачного тебе полета и мы тебя ждем)))
Мне было бы очень интересно посмотреть на программу калькулятора, написанную на Scheme.
P.S. Если мы согласимся считать "top level" языка Scheme за консоль, то, конечно, программа префиксного калькулятора на Scheme будет пустой (так как "top level" сам по себе включает в себя все функции такого калькулятора). Поэтому мой вопрос относится в основном к инфиксному и постфиксному вариантам.
Какой интересный язык! Basil22, спасибо за наводку! Значит, постфиксный калькулятор на Forth выглядит по сути дела так же как префиксный на Lisp или Scheme -- как пустая программа.
Кстати не знаете ли Вы, есть ли какие-то глубокие причины, по которым Lisp не использует постфиксную запись? Тогда он, наверное, сильно напоминал бы Forth, избежав своего перегруза скобками. Конечно, одна из возможностей Lisp'а, недоступная при обычной постфиксной записи -- это операции с разным количеством операндов, как например ( + 3 4 5 ) = 12 и ( + 3 4 ) = 7. А есть ли ещё какие-нибудь и насколько они важны?
Пробелы используются как разделители ради 1) простоты разбиения введённой строки на токены и 2) унификации правил ввода. У моего калькулятора три варианта: префиксный, инфиксный и постфиксный. Для префиксного и постфиксного калькулятора нужны символы-разделители (иначе не различить границу между двумя числами, следующими друг за другом).
У меня другое решение: однопроходный индуктивный (а не рекурсивный) алгоритм, основанный на переводе инфиксной строки в постфиксную.
Спасибо! Если остальным будет интересна эта задача, подумаем над её решением.
1--1 - это IMHO некорректное выражение. Если необходимо вычесть минус единицу, то пишется 1-(-1). А то что С++ допускает конструкцию i+++++i, еще ни о чем не говорит
Прежде чем зачинать новый конкурс, я бы предложил таки закончить старый , то есть подвести его итоги.
Лично я просмотрел (и заценил) предложенные программы до такому критерию - насколько легко программа воспринимается в целом. Критерий взят умышленно, я сейчас на основной работе вожусь со старым кодом. И там нередко встречается проблема, когда понять что делает код еще можно, но вот разобраться ДЛЯ ЧЕГО он это делает - очень и очень трудно. В этом свете мне больше всего понравилась программа от sein, у которой отличные комментарии, причем они поясняют как суть и необходимость того, что собственно делается. Возможно их многовато (я например не люблю делать комментарии к 2..3 строчным функциям, считая что такая функция говорит сама за себя), но именно этот исходник зацепил меня.
Теперь вы высказывайтесь и обсуждайтесь
P.S. На конкурс тоже есть идея, но давайте доведем до конца старый.
ну у нас был не совсем конкурс, мы собирались просто высказаться и обсудить -кто, что и почему использовал -и как -где различия и все такое. Это была такая стартовая разминка.)
да, sein просто молодец!!! Что касается комментов и их количества -это я его попросила всё подробно, вы не забывайте, что это вы тут все монстры, а я блондинка -но вам как раз полезно моё присутствие.
Еще у sein мне нравится то, что он выбрал такой язык, что не требуется дополнительная установка девайсов и всего такого. Я хоть и не программист, но думаю, что в конечном итоге программа должна выдавать что-то типа ехе-шника или вот такой страницы, чтоб любая блондинка могла ей пользоваться, прочитав несколько строк инструкции.
Но я еще не смотрела труды barvinsky)) посмотрю, может, в выходные.
И Саша-alexxst не вернулся кажется еще.
Basil22, а Вы не хотите тоже принимать участие в конкурсах? А не только в обсуждениях?)))
Хорошо, а 2*-2? Или ты на бумажке всегда пишешь 2*(-2)? :-)
Насколько я знаю, скобки используются для задания порядка вычисления выражения, и только. В данном случае этого не требуется - унарные операторы и так имеют больший приоритет.
так и пишу да -всегда))) и в бумажках и в статьях)
ну есть некоторые правила, которые общеприняты, это как в любом языке, мы тут вот общаемся и не ставим всех знаков препинания и ломаем слова, но если пишем официальные письма или статьи -то без вопросов придерживаемся правил, которые общие для всех.
ну а не требуется и не надо))
Да, и в самом деле не работает. А я, грешным делом, понял это как (i++) + (++i), т.е. как завуалированный набор предписаний:
(i++) = запомнить, что в конце работы надо увеличить i на единицу;
(++i) = увеличить немедленно переменную i на единицу
(i) + (i) = прибавить переменную к самой себе, т.е. удвоить
(Иначе говоря, если обозначить через x первоначальное значение переменной i, получим для самого выражения значение 2*( x + 1 ), а для переменной: i = x + 2.)