From 807bdeba16ea9ed816ecf7d3900f601c37ffa204 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 28 Feb 2023 21:37:46 +0100 Subject: [PATCH] add commands deg, grad and rad --- calc.c | 2 ++ element.h | 2 +- parser.c | 38 +++++++++++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/calc.c b/calc.c index 0fdea1f..cbfdcfa 100644 --- a/calc.c +++ b/calc.c @@ -463,6 +463,8 @@ int main (int argc, char *argv[]) // test: echo -e 'base (-2)\nbase (16, 0)' | calc.exe | grep -c error | xargs test 2 = // test: echo -e 'base (10, 16)\n255' | calc.exe | grep -q '=> ff' // test: echo -e 'base' | calc.exe | grep -q 'base (I/O): 10/10' +// test: echo -e 'deg\nacos (-1)\ngrad\nacos (-1)\nrad\nacos (-1)' | calc.exe | awk 'BEGIN { split("180 200 3.14159", v) } /=>/ { for (i in v) if ($2 == v[i]) n++ } END { exit n != 3 }' +// test: echo -e 'format\nbase\ndeg\ngrad\nrad\nquit' | calc.exe -v 3 | grep -q bye // Gauss sequence // test: echo -e '{sto (1, 0), sto (10, 0), while (inc (10) <= 100, {sto (1, rcl (1) + rcl (10)), print (rcl (1))})};' | calc.exe | grep -q '=> 5050' diff --git a/element.h b/element.h index 0fd40f8..37c8213 100644 --- a/element.h +++ b/element.h @@ -23,7 +23,7 @@ typedef enum { Prog, Arg, Call, List, Edit, Del, Get, Length, Pop, Push, Put, Set, Show, Max, Mean, Median, Min, Order, Prod, Sum, Variance, - Precision, Base + Precision, Base, Deg, Grad, Rad } func_t; /* keyword type */ diff --git a/parser.c b/parser.c index 0f4e641..24afb11 100644 --- a/parser.c +++ b/parser.c @@ -18,6 +18,8 @@ double answer = 0; +double anglefactor = 1; + /* compare codes */ int codecmp (char *ref, char *str) @@ -62,7 +64,7 @@ keyword_t operators[NB_OPERATORS] = { { "|", Or, 2, 1, -2} }; -#define NB_FUNCTIONS 52 +#define NB_FUNCTIONS 55 keyword_t functions[NB_FUNCTIONS] = { { "sqrt", Sqr, 1, 4, 5}, { "pow", Pow, 2, 3, 5}, @@ -115,7 +117,10 @@ keyword_t functions[NB_FUNCTIONS] = { { "sum", Sum, 0, 3, 5}, { "var", Variance, 2, 3, 5}, { "format", Precision, 1, 6, 9}, - { "base", Base, 2, 4, 9} + { "base", Base, 2, 4, 9}, + { "deg", Deg, 0, 3, 9}, + { "grad", Grad, 0, 4, 9}, + { "rad", Rad, 0, 3, 9} }; #define NB_CONSTANTS 3 @@ -523,6 +528,9 @@ void print_element (element_t *root, int level) case Variance: func = "Variance"; break; case Precision: func = "Precision"; break; case Base: func = "Base"; break; + case Deg: func = "Degree"; break; + case Grad: func = "Gradian"; break; + case Rad: func = "Radian"; break; } printf ("Function: %s\n", func); @@ -618,7 +626,7 @@ void help (void) printf ("stack func.:"); printf (" max mean med min ord prod sum var\n"); printf ("control management:"); - printf (" base format help quit\n"); + printf (" base deg format grad help quit rad\n"); printf ("constants:"); printf (" ans e pi\n"); } @@ -767,6 +775,9 @@ double evaluate_element (element_t *root, char mask) case Order: case Prod: case Sum: + case Deg: + case Grad: + case Rad: break; case While: if (root->ops[0] == NULL) { @@ -827,12 +838,12 @@ double evaluate_element (element_t *root, char mask) case Mod: return fmod (op0, op1); case Pow: return pow (op0, op1); 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 Cos: return cos (op0 / anglefactor); + case Sin: return sin (op0 / anglefactor); + case Tan: return tan (op0 / anglefactor); + case Acos: return acos (op0) * anglefactor; + case Asin: return asin (op0) * anglefactor; + case Atan: return atan (op0) * anglefactor; case Ln: return log (op0); case Log: return log10 (op0); case Exp: return exp (op0); @@ -933,6 +944,15 @@ double evaluate_element (element_t *root, char mask) case Base: base ((int)op0, (int)op1); break; + case Deg: + anglefactor = 180 / M_PI; + break; + case Grad: + anglefactor = 200 / M_PI; + break; + case Rad: + anglefactor = 1; + break; } return 0; -- 2.30.2