From 9e52bbc53676f3ba66a5ddd7c1389f997f890505 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Thu, 26 Jan 2023 17:18:59 +0100 Subject: [PATCH] add tan, acos, asin, abs, ceil and floor functions --- calc.c | 4 ++-- parser.c | 32 +++++++++++++++++++++++++++++--- parser.h | 3 ++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/calc.c b/calc.c index 439ab24..336e8fa 100644 --- a/calc.c +++ b/calc.c @@ -243,8 +243,8 @@ int main (int argc, char *argv[]) // test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe -n | grep -q 2 // test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe | grep -q 64 // test: echo -e '1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1\n1 + 1' | calc.exe | grep -q 2 -// test: echo -e '-cos (1)\n1 + 1\n1 - 1\n1 * 1\n1 / 1\n3%2\n2^2\nsqrt (2)\ncos (0)\nsin (0)\natan (0)\nlog (1)\nexp (1)\nans\ne\npi\nsto (1)\nrcl (2)\ndisp\nhelp\nquit' | calc.exe -v 3 | grep -q bye -// test: echo -e '1 +\n1 -\n1 * 1\n1 /\n3%\n2^\nsqrt ()\ncos ()\nsin ()\natan ()\nlog ()\nexp ()\n1 + (\n1+2(\n1+2cos\n1+2pi' | calc.exe | grep -c error | xargs test 15 = +// test: echo -e '-cos (1)\n1 + 1\n1 - 1\n1 * 1\n1 / 1\n3%2\n2^2\nsqrt (2)\ncos (0)\nsin (0)\ntan (0)\nacos (0)\nasin (0)\natan (0)\nlog (1)\nexp (1)\nabs (-1)\nceil (1.2)\nfloor (-1.2)\nans\ne\npi\nsto (1)\nrcl (2)\ndisp\nhelp\nquit' | calc.exe -v 3 | grep -q bye +// test: echo -e '1 +\n1 -\n1 * 1\n1 /\n3%\n2^\nsqrt ()\ncos ()\nsin ()\ntan ()\nacos ()\nasin ()\natan ()\nlog ()\nexp ()\nabs ()\nceil ()\nfloor ()\n1 + (\n1+2(\n1+2cos\n1+2pi' | calc.exe | grep -c error | xargs test 21 = // test: echo -e '1 + 1\nans' | calc.exe -p 3 | grep -c 2 | xargs test 2 = // test: echo -e 'sin (pi / 2)' | calc.exe -p 4 | grep -q 1 // test: echo -e 'e ^ 2' | calc.exe | grep -q '7\.38906' diff --git a/parser.c b/parser.c index 9796048..11d5860 100644 --- a/parser.c +++ b/parser.c @@ -115,15 +115,21 @@ keyword_t operators[NB_OPERATORS] = { { "|", Or, 2, 1, -2} }; -#define NB_FUNCTIONS 17 +#define NB_FUNCTIONS 23 keyword_t functions[NB_FUNCTIONS] = { { "sqrt", Sqr, 1, 4, 5}, { "pow", Pow, 2, 3, 5}, { "cos", Cos, 1, 3, 5}, { "sin", Sin, 1, 3, 5}, + { "tan", Tan, 1, 3, 5}, + { "acos", Acos, 1, 4, 5}, + { "asin", Asin, 1, 4, 5}, { "atan", Atan, 1, 4, 5}, - { "exp", Exp, 1, 3, 5}, { "log", Log, 1, 3, 5}, + { "exp", Exp, 1, 3, 5}, + { "abs", Abs, 1, 3, 5}, + { "floor", Floor, 1, 5, 5}, + { "ceil", Ceil, 1, 4, 5}, { "sto", Store, 2, 3, 5}, { "rcl", Recall, 1, 3, 5}, { "inc", Inc, 1, 3, 5}, @@ -463,9 +469,15 @@ void print_element (element_t *root, int level) case Sqr: func = "Square Root"; break; case Cos: func = "Cosine"; break; case Sin: func = "Sine"; break; + case Tan: func = "Tangent"; break; + case Acos: func = "Arc Cosine"; break; + case Asin: func = "Arc Sine"; break; case Atan: func = "Arc Tangent"; break; case Log: func = "Logarithm"; break; case Exp: func = "Exponantial"; break; + case Abs: func = "Absolute value"; break; + case Ceil: func = "Ceil value"; break; + case Floor: func = "Floor value"; break; case Store: func = "Store"; break; case Recall: func = "Recall"; break; case Inc: func = "Increase"; break; @@ -614,8 +626,10 @@ void help (void) fprintf (stdout, " == != >= <= > <\n"); fprintf (stdout, "logical operators:"); fprintf (stdout, " & | !\n"); + fprintf (stdout, "mathematic functions:"); + fprintf (stdout, " pow sqrt cos sin tan acos asin atan log exp\n"); fprintf (stdout, "supported functions:"); - fprintf (stdout, " pow sqrt cos sin atan log exp\n"); + fprintf (stdout, " abs ceil floor\n"); fprintf (stdout, "storage functions:"); fprintf (stdout, " sto rcl inc dec\n"); fprintf (stdout, "conditional functions:"); @@ -691,9 +705,15 @@ double evaluate_element (element_t *root, char mask) case Sqr: case Cos: case Sin: + case Tan: + case Acos: + case Asin: case Atan: case Log: case Exp: + case Abs: + case Ceil: + case Floor: case Recall: case Inc: case Dec: @@ -734,9 +754,15 @@ double evaluate_element (element_t *root, char mask) case Sqr: return sqrt (op0); case Cos: return cos (op0); case Sin: return sin (op0); + case Tan: return tan (op0); + case Acos: return acos (op0); + case Asin: return asin (op0); case Atan: return atan (op0); case Log: return log (op0); case Exp: return exp (op0); + case Abs: return fabs (op0); + case Ceil: return ceil (op0); + case Floor: return floor (op0); case Store: return store ((int)op0, (op1) ? op1 : answer); case Recall: return recall ((int)op0); case Inc: return increase ((int)op0); diff --git a/parser.h b/parser.h index 734d818..156a526 100644 --- a/parser.h +++ b/parser.h @@ -12,8 +12,9 @@ typedef enum { Add, Sub, Mul, Div, Mod, Pow, Sqr, - Cos, Sin, Atan, + Cos, Sin, Tan, Acos, Asin, Atan, Log, Exp, + Abs, Ceil, Floor, Store, Recall, Inc, Dec, Disp, Quit, Help, Ans, E, Pi, -- 2.30.2