示例#1
0
/* Reverse Polish calculator */
int main() {
  int op_type, i = 0, var = 0;
  double op2;
  char operand[kMaxOp];
  double variable[kVarNum];
  // variable v to store the value printed recently.
  double v;
  Stack stack;

  StackInit(&stack, kStackInitSize);

  for (i = 0; i < kVarNum; i++) {
    variable[i] = 0.0;
  }

  while ((op_type = GetOpt(operand)) != EOF) {
    switch (op_type) {
      double op;
      case NUMBER:
        op = atof(operand);
        Push(&stack, &op);
        break;
      case FUNCTION:
        MathFunc(&stack, operand);
        break;
      case '=':
        Pop(&stack, &op);
        if (var >= 'A' && var <= 'Z') {
          variable[var - 'A'] = op; 
        } else {
          printf("Error: not valid variable name\n");
          exit(1);
        }
        break;
      case '+':
        Pop(&stack, &op);
        Pop(&stack, &op2);
        op = op + op2;
        Push(&stack, &op);
        break;
      case '-':
        Pop(&stack, &op);
        Pop(&stack, &op2);
        op = op2 -  op;
        Push(&stack, &op);
        break;
      case '*':
        Pop(&stack, &op);
        Pop(&stack, &op2);
        op = op2 * op;
        Push(&stack, &op);
        break;
      case '/':
        Pop(&stack, &op);
        Pop(&stack, &op2);
        if (op != 0.0) {
          op = op2 / op;
          Push(&stack, &op);
        } else {
          printf("Error: zero divisor\n");
          exit(1);
        }
        break;
      case '%':
        Pop(&stack, &op);
        Pop(&stack, &op2);
        if (op != 0.0) {
          op = fmod(op2, op);
          Push(&stack, &op);
        } else {
          printf("Error: zero divisor\n");
          exit(1);
        }
        break;
      case '\n':
        Pop(&stack, &op);
        v = op;
        printf("%.8f\n", op);
        break;
      case '?': /* Prints top element of the stack */
        Pop(&stack, &op);
        printf("%.8f\n", op);
        Pop(&stack, &op);
        break;
      case 'c': /* Clear the stack */
        StackClear(&stack);
        break;
      case 'd': /* Duplicates tope elements of the stack */
        Pop(&stack, &op);
        Push(&stack, &op);
        Push(&stack, &op);
        break;
      case 's': /* Swaps the top two elements */
        Pop(&stack, &op);
        Pop(&stack, &op2);
        Push(&stack, &op);
        Push(&stack, &op2);
        break;
      case 'v':
        Push(&stack, &v);
        break;
      default:
        if (op_type >= 'A' && op_type <= 'Z') {
          var = op_type;
          Push(&stack, variable + op_type - 'A');
        } else {
          printf("Error: unknown command \n");
          exit(1);
        }
        break;
    }
  }
  return 0;
}
示例#2
0
文件: addnode.cpp 项目: bigfug/Fugio
void AddNode::inputsUpdated( qint64 pTimeStamp )
{
	NodeControlBase::inputsUpdated( pTimeStamp );

	QList<fugio::PinVariantIterator>	ItrLst;
	int									ItrMax = 0;
	QMetaType::Type						OutTyp = QMetaType::UnknownType;

	for( QSharedPointer<fugio::PinInterface> P : mNode->enumInputPins() )
	{
		ItrLst << fugio::PinVariantIterator( P );

		ItrMax = std::max( ItrMax, ItrLst.last().count() );

		if( OutTyp == QMetaType::UnknownType )
		{
			OutTyp = ItrLst.last().type();
		}
	}

	if( !ItrMax || OutTyp == QMetaType::UnknownType )
	{
		return;
	}

	mValOutputArray->setVariantType( OutTyp );
	mValOutputArray->setVariantCount( ItrMax );

	switch( OutTyp )
	{
		case QMetaType::Double:
			Operator::add<double>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::Float:
			Operator::add<float>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QPoint:
			Operator::add<QPoint>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QPointF:
			Operator::add<QPointF>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QSize:
			Operator::add<QSize>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QSizeF:
			Operator::add<QSizeF>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::Int:
			Operator::add<int>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QString:
			Operator::add<QString>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QVector2D:
			Operator::add<QVector2D>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QVector3D:
			Operator::add<QVector3D>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QVector4D:
			Operator::add<QVector4D>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QQuaternion:
			Operator::add<QQuaternion>( ItrLst, mValOutputArray, ItrMax );
			break;

		case QMetaType::QMatrix4x4:
			Operator::add<QMatrix4x4>( ItrLst, mValOutputArray, ItrMax );
			break;

		default:
			{
				fugio::MathInterface::MathOperatorFunction	MathFunc = MathPlugin::instance()->findMetaTypeMathOperator( OutTyp, fugio::MathInterface::OP_ADD );

				if( !MathFunc )
				{
					return;
				}

				MathFunc( ItrLst, mValOutputArray, ItrMax );
			}
			break;
	}

	pinUpdated( mPinOutput );
}