Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Kалькулятор в консоли

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Kалькулятор в консоли
Имя
Сообщение << Старые топики   Новые топики >>
Kалькулятор в консоли - 2011-11-14 16:48:05.530000   
An0ним

Сообщений: 2
Оценки: 0
Присоединился: 2011-11-14 16:35:43.596666
На чем проще реализовать калькулятор в консоли, он должен принимать на вход выражение с операциями: *,/,+,-, x^y ( возведение X в степень Y ), sin(x), cos(x) и выдавать результат.
Post #: 1
RE: Kалькулятор в консоли - 2011-11-15 08:47:01.740000   
class0071

Сообщений: 300
Оценки: 0
Присоединился: 2011-01-27 17:15:23.750000
C++ - более логично и читабельно…
Post #: 2
RE: Kалькулятор в консоли - 2011-11-15 11:30:59.113333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
На любом языке, на котором тебе самому удобнее. Ключевое слово для гугла - польская запись
Post #: 3
RE: Kалькулятор в консоли - 2011-11-15 13:19:45.830000   
sparkibot

Сообщений: 62
Оценки: 0
Присоединился: 2011-01-25 16:48:02.306666
Легко…
я бы написал на C#…если надо давай напишу
Post #: 4
RE: Kалькулятор в консоли - 2011-11-15 15:19:54.640000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Напиши, всем будет интересно ;) и полезно для новичков.
Post #: 5
RE: Kалькулятор в консоли - 2011-11-15 15:47:51.023333   
GothX

Сообщений: 263
Оценки: 20
Присоединился: 2011-06-22 13:27:08.173333
На входе должна быть только одна операция, или возможно целое выражение?
Если одна операция, то сейчас быстро накидаю программку :D
Post #: 6
RE: Kалькулятор в консоли - 2011-11-15 16:18:42.980000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: GothX
На входе должна быть только одна операция, или возможно целое выражение?


quote:

ORIGINAL: An0ним
…должен принимать на вход выражение с операциями: *,/,+,-, x^y…

Post #: 7
RE: Kалькулятор в консоли - 2011-11-15 18:11:58.546666   
GothX

Сообщений: 263
Оценки: 20
Присоединился: 2011-06-22 13:27:08.173333
Да я прекрасно умею читать, просто, учитывая нынешнее состояние грамматики в умах масс, это предложение можно расценивать и как "Выражение с одной из операций…" и т.д., я просто уточнил. Потому как, если воспринимать это предложение ТСа по всем правилам русского языка, то получается, что в выражении обязательно должны присутствовать все из перечисленных операций, но не будем вдаваться в подробности, я просто объяснил, почему твой ответ не является ответом на мой вопрос.
К тому же, под калькулятором обычно подразумевают именно выполнение одной операции
Post #: 8
RE: Kалькулятор в консоли - 2011-11-15 20:21:05.810000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: An0ним
На чем проще реализовать калькулятор в консоли, он должен принимать на вход выражение с операциями: *,/,+,-, x^y ( возведение X в степень Y ), sin(x), cos(x) и выдавать результат.

bison
Вот пример из мануала к нему: /* Infix notation calculator. */ %{ #define YYSTYPE double #include &lt;math.h&gt; #include &lt;stdio.h&gt; int yylex (void); void yyerror (char const *); %} /* Bison declarations. */ %token NUM %left '-' '+' %left '*' '/' %left NEG /* negation--unary minus */ %right '^' /* exponentiation */ %% /* The grammar follows. */ input: /* empty */ | input line ; line: '\n' | exp '\n' { printf ("\t%.10g\n", $1); } ; exp: NUM { $$ = $1; } | exp '+' exp { $$ = $1 + $3; } | exp '-' exp { $$ = $1 - $3; } | exp '*' exp { $$ = $1 * $3; } | exp '/' exp { $$ = $1 / $3; } | '-' exp %prec NEG { $$ = -$2; } | exp '^' exp { $$ = pow ($1, $3); } | '(' exp ')' { $$ = $2; } ; %%
И к этому кодесу ещё функции yylex и yyerror: /* The lexical analyzer returns a double floating point number on the stack and the token NUM, or the numeric code of the character read if not a number. It skips all blanks and tabs, and returns 0 for end-of-input. */ #include &lt;ctype.h&gt; int yylex (void) { int c; /* Skip white space. */ while ((c = getchar ()) == ' ' || c == '\t') ; /* Process numbers. */ if (c == '.' || isdigit (c)) { ungetc (c, stdin); scanf ("%lf", &yylval); return NUM; } /* Return end-of-input. */ if (c == EOF) return 0; /* Return a single char. */ return c; } /* Called by yyparse on error. */ void yyerror (char const *s) { fprintf (stderr, "%s\n", s); } Если C не устраивает как язык программирования, то такого рода препроцессоры есть и к другим языкам. Как минимум, я точно знаю что есть к java и к lisp. Короче стоит просто поискать в гугле с запросом "parser generator".
Post #: 9
RE: Kалькулятор в консоли - 2011-11-16 11:40:35.763333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Это из пушки по воробьям уже.

http://ru.wikiversity.org/wiki/Обратная_польская_запись:_примеры_реализации
Post #: 10
RE: Kалькулятор в консоли - 2011-11-16 16:08:19.400000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: _SaZ_
Это из пушки по воробьям уже.
http://ru.wikiversity.org/wiki/Обратная_польская_запись:_примеры_реализации

Ну, во-первых, я привёл калькулятор с инфиксной записью, а не с постфиксной. А во-вторых: ну из пушки, ну по-воробьям, быть может… И что? Зато делается вполпинка. С обработкой ошибок синтаксиса не надо воевать. И кстати пример из вики (который на C написан), он ошибки не обрабатывает, вообще не обращает на них внимания, и в результате потенциально уязвим к атакам типа переполнение буфера на стеке. Причём в обе стороны переполнение: там индекс может вылезти как в область отрицательных значений, так и в область значений, которые больше чем sizeof(stack)/sizeof(stack[0]). В случае же использования bison'а, грамматика формализуется полностью, и ошибки вычисляются не тогда, когда индекс за пределы вышел, а на этапе парсинга. Соответственно, мало того, что программа не вылетит с SIGSEGV, так ещё и сообщение об ошибке может быть информативнее чем: "main: ошибка времени выполнения: индекс вышел за границы массива".
Но ведь, кроме того, при использовании bison'а и аналогов дальнейшее расширение функционала программы не намного сложнее. То есть, если, например, захочется научить калькулятор различать целые и вещественные, и по-возможности считать в целых, то самые сложные изменения пойдут лишь в функции yylex, которая парсит токены. Можно ещё рациональные числа добавить: имея среди токенов целые числа, даже и править yylex не придётся. Можно прикрутить переменные. Вариантов тьма, но творить сие на основе примера из wikiversity будет весьма затруднительно.

Да и просто прикинь, вот загляни в код который там приведён, и прикинь во что выльется парсинг токенов вида sin cos и тп. В switch(query[i]) уже уложиться не удастся. Можно, конечно написать:case 's': if (strncmp(query+i, "sin", 3)) err_exit("syntax error"); бла-бла-бла;Но таким образом мы привнесём ещё один баг типа выход индекса за границы массива. Парсинг вообще этим раздражает: надо постоянно отслеживать не только правильность синтаксиса, но ещё и EOF. Это, конечно же, можно побороть легко, создав конечный автомат, но… Но тут уже придётся не просто палить из пушки по воробьям, но ещё и собирать эту пушку отвёрткой.
Post #: 11
RE: Kалькулятор в консоли - 2011-11-16 19:47:05.863333   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ты, конечно, в техническом плане прав, но я не думаю, что первокурсник будет знать, что такое бизон / лекс / як и пр. и тем более не будет уметь ими пользоваться. Скорее всего, он просто пишет лабу по работе со строками, т.к. в противном случае была бы куда более полная (грамотная) постановка вопроса.
Post #: 12
RE: Kалькулятор в консоли - 2011-11-17 19:39:29.713333   
An0ним

Сообщений: 2
Оценки: 0
Присоединился: 2011-11-14 16:35:43.596666
quote:

ORIGINAL: _SaZ_
Ты, конечно, в техническом плане прав, но я не думаю, что первокурсник будет знать, что такое бизон / лекс / як и пр. и тем более не будет уметь ими пользоваться. Скорее всего, он просто пишет лабу по работе со строками, т.к. в противном случае была бы куда более полная (грамотная) постановка вопроса.


Для начала я не первокурсник,я уже окончил, и это не лаба, да у меня имеются проблемы с правописание…..
Вот хотел разобраться с колькулем…
Post #: 13
RE: Kалькулятор в консоли - 2011-11-17 20:36:24.330000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ну тогда давай более точную формулировку задачи (хотя, после ответа rgo, это уже не актуально). Под понятием "грамотность" я не имел в виду правописание, я имел в виду качество постановки вопросов. Пока совсем не понятно, где и зачем ты собрался это применять.
Post #: 14
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Kалькулятор в консоли







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.