Kалькулятор в консоли
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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) и выдавать результат.
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 08:47:01.740000
|
|
|
class0071
Сообщений: 300
Оценки: 0
Присоединился: 2011-01-27 17:15:23.750000
|
C++ - более логично и читабельно…
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 11:30:59.113333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
На любом языке, на котором тебе самому удобнее. Ключевое слово для гугла - польская запись
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 13:19:45.830000
|
|
|
sparkibot
Сообщений: 62
Оценки: 0
Присоединился: 2011-01-25 16:48:02.306666
|
Легко… я бы написал на C#…если надо давай напишу
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 15:19:54.640000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Напиши, всем будет интересно ;) и полезно для новичков.
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 15:47:51.023333
|
|
|
GothX
Сообщений: 263
Оценки: 20
Присоединился: 2011-06-22 13:27:08.173333
|
На входе должна быть только одна операция, или возможно целое выражение? Если одна операция, то сейчас быстро накидаю программку :D
|
|
|
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…
|
|
|
RE: Kалькулятор в консоли - 2011-11-15 18:11:58.546666
|
|
|
GothX
Сообщений: 263
Оценки: 20
Присоединился: 2011-06-22 13:27:08.173333
|
Да я прекрасно умею читать, просто, учитывая нынешнее состояние грамматики в умах масс, это предложение можно расценивать и как "Выражение с одной из операций…" и т.д., я просто уточнил. Потому как, если воспринимать это предложение ТСа по всем правилам русского языка, то получается, что в выражении обязательно должны присутствовать все из перечисленных операций, но не будем вдаваться в подробности, я просто объяснил, почему твой ответ не является ответом на мой вопрос. К тому же, под калькулятором обычно подразумевают именно выполнение одной операции
|
|
|
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 <math.h>
#include <stdio.h>
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 <ctype.h>
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".
|
|
|
RE: Kалькулятор в консоли - 2011-11-16 11:40:35.763333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Это из пушки по воробьям уже. http://ru.wikiversity.org/wiki/Обратная_польская_запись:_примеры_реализации
|
|
|
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. Это, конечно же, можно побороть легко, создав конечный автомат, но… Но тут уже придётся не просто палить из пушки по воробьям, но ещё и собирать эту пушку отвёрткой.
|
|
|
RE: Kалькулятор в консоли - 2011-11-16 19:47:05.863333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ты, конечно, в техническом плане прав, но я не думаю, что первокурсник будет знать, что такое бизон / лекс / як и пр. и тем более не будет уметь ими пользоваться. Скорее всего, он просто пишет лабу по работе со строками, т.к. в противном случае была бы куда более полная (грамотная) постановка вопроса.
|
|
|
RE: Kалькулятор в консоли - 2011-11-17 19:39:29.713333
|
|
|
An0ним
Сообщений: 2
Оценки: 0
Присоединился: 2011-11-14 16:35:43.596666
|
quote:
ORIGINAL: _SaZ_ Ты, конечно, в техническом плане прав, но я не думаю, что первокурсник будет знать, что такое бизон / лекс / як и пр. и тем более не будет уметь ими пользоваться. Скорее всего, он просто пишет лабу по работе со строками, т.к. в противном случае была бы куда более полная (грамотная) постановка вопроса. Для начала я не первокурсник,я уже окончил, и это не лаба, да у меня имеются проблемы с правописание….. Вот хотел разобраться с колькулем…
|
|
|
RE: Kалькулятор в консоли - 2011-11-17 20:36:24.330000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Ну тогда давай более точную формулировку задачи (хотя, после ответа rgo, это уже не актуально). Под понятием "грамотность" я не имел в виду правописание, я имел в виду качество постановки вопросов. Пока совсем не понятно, где и зачем ты собрался это применять.
|
|
|
|
|