void bt_clicked (GtkWidget *widget, gpointer data) //data is that button label { char ch = *((char *)data); char *str; str = (char *) data; //put the button label into str if (is_digit (ch) && strlen (str) == 1)// Entering a number { Digit (str, ch); } else {//clear if (strcmp (str, "C") == 0) { prevCmd='0'; lastChar = '0'; gtk_label_set_text(GTK_LABEL (label), "0"); return; } // else { // Negative(str); // } BinaryOperation (); prevCmd = ch; } lastChar = ch; }
/* * calculatePolishNotation * Calculates an parsed expression using one stack for the operations and * one stack for the operands. * * @param **OpStack - The stack of operations. */ double calculatePolishNotation(Stack **OpStack) { double result = 0; double first = 0; double second = 0; double (*BinaryOperation)(double a, double b); if (!isEmpty(*OpStack)) { switch ((*OpStack)->opType) { case operand: result = (*OpStack)->operand; pop(OpStack); return result; break; case constant: break; case unaryOperation: break; case binaryOperation: BinaryOperation = (*OpStack)->BinaryOperation; pop(OpStack); first = calculatePolishNotation(OpStack); second = calculatePolishNotation(OpStack); return result = BinaryOperation(first, second); break; } } return result; }
/* Calcola e restituisce il risultato di un'espressione in forma infissa */ double EvalInfix(const char *strExpression, char * strError) { Token tok; Token tok_temp; double left, right; double dblRet; strcpy(strError, ""); tok_temp.Type = EOL; tok_temp.str[0] = '@'; tok_temp.str[1] = '\0'; push_op(tok_temp, strError); if ( strError[0] != '\0' ) return 0.0; left = right = 0.0; while ( (PreviousTokenType = GetNextToken(strExpression, &tok, TRUE)) != EOL ) { if ( tok.Type == UNKNOWN ) { sprintf(strError, "Error: invalid token: %s\n", tok.str); return 0.0; } else if ( tok.Type == VALUE ) { push_val(tok.Value, strError); if ( strError[0] != '\0' ) return 0.0; } else if ( tok.Type == OPAREN || tok.Type == UMINUS || tok.Type == UPLUS ) { push_op(tok, strError); if ( strError[0] != '\0' ) return 0.0; } else if ( tok.Type == CPAREN ) { while ( top_op(strError).Type != OPAREN ) { if ( strError[0] != '\0' ) return 0.0; tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; if ( (tok_temp.Type == EOL) || (is_empty_op()) ) { sprintf(strError, "Error: unbalanced brackets.\n"); return 0.0; } right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; if ( tok_temp.Type != UMINUS ) { left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { push_val( -1 * right, strError ); if ( strError[0] != '\0' ) return 0.0; } } pop_op(strError); if ( strError[0] != '\0' ) return 0.0; } else { while ( PREC_TABLE[ top_op(strError).Type ].topOfStack >= PREC_TABLE[ tok.Type ].inputSymbol ) { if ( strError[0] != '\0' ) return 0.0; if ( top_op(strError).Type != UMINUS && top_op(strError).Type != UPLUS ) { if ( strError[0] != '\0' ) return 0.0; right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { if ( top_op(strError).Type == UMINUS ) { if ( strError[0] != '\0' ) return 0.0; right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; pop_op(strError); if ( strError[0] != '\0' ) return 0.0; push_val(-1 * right, strError); if ( strError[0] != '\0' ) return 0.0; } else { pop_op(strError); if ( strError[0] != '\0' ) return 0.0; } } } if ( tok.Type != EOL ) { push_op(tok, strError); if ( strError[0] != '\0' ) return 0.0; } } } while ( 1 ) { tok_temp = pop_op(strError); if ( strError[0] != '\0' ) return 0.0; if ( tok_temp.Type == EOL ) break; if ( tok_temp.Type != UPLUS ) { right = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; } if ( tok_temp.Type != UMINUS && tok_temp.Type != UPLUS ) { left = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; dblRet = BinaryOperation(left, right, tok_temp.str[0], strError); if ( strError[0] != '\0' ) return 0.0; push_val(dblRet, strError); if ( strError[0] != '\0' ) return 0.0; } else { push_val( -1 * right, strError ); if ( strError[0] != '\0' ) return 0.0; } } dblRet = pop_val(strError); if ( strError[0] != '\0' ) return 0.0; if ( is_empty_val() ) { return dblRet; } else { sprintf(strError, "Error: malformed expression.\n"); return 0.0; } }
{ T0 m0; T1 m1; pair() {} // default constructor pair(const T0& m0, const T1& m1) : m0(m0), m1(m1) { } }; template<typename T0, typename T1> requires(Regular(T0) && Regular(T1)) bool operator==(const pair<T0, T1>& x, const pair<T0, T1>& y) { return x.m0 == y.m0 && x.m1 == y.m1; } template<typename I, typename Op> requires(Integer(I) && BinaryOperation(Op)) Domain(Op) power_accumulate_positive(Domain(Op) r, Domain(Op) a, I n, Op op) { // Precondition: $\func{associative}(op) \wedge \func{positive}(n)$ while (true) { if (odd(n)) { r = op(r, a); if (one(n)) return r; } a = op(a, a); n = half_nonnegative(n); } }
bool can_simplify(const InterfaceType * lhs, const InterfaceType * rhs) const { return can_simplify_impl(lhs, BinaryOperation(), rhs); }
/** @brief Differentiates the unary operation acting on 'lhs' and 'rhs' with respect to the variable passed. */ InterfaceType * diff(const InterfaceType * lhs, const InterfaceType * rhs, const InterfaceType * diff_var) const { return diff_impl(lhs, BinaryOperation(), rhs, diff_var); }