⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fractioninstruction.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "fractioninstruction.h"#include "doubledata.h"// Data typevoid BaseFractionInstruction::eval() {    FractionData *acc = (FractionData *)systemEngine->getData();    if (argCount == 1)	doEval(acc);    else {	FractionData *num = (FractionData *)systemEngine->getData();	doEval(acc,num);	delete num;    }    delete acc;}BaseFractionInstruction::BaseFractionInstruction()    : Instruction() {	type = retType = "Fraction"; // No tr    }// Factoryvoid iFractionFactory::eval() {    FractionData *ret = new FractionData();    ret->clear();    systemEngine->putData(ret);}iFractionFactory::iFractionFactory():Instruction() {    type = retType = "Fraction"; // No tr    name = "Factory"; // No tr};// Copyvoid iFractionCopy::eval() {    FractionData *src = (FractionData *)systemEngine->getData();    FractionData *tgt = new FractionData();    tgt->clear();    tgt->set(((FractionData *)src)->getNumerator(),	    ((FractionData *)src)->getDenominator());    systemEngine->putData(src);    systemEngine->putData(tgt);};iFractionCopy::iFractionCopy():BaseFractionInstruction() {    name = "Copy"; // No tr    retType = type = "Fraction"; // No tr    argCount = 1;};// Conversion functionsvoid iConvertDoubleFraction::eval() {    FractionData *ret = new FractionData();    double target,tmp, diff;    int upper,lower;        DoubleData *doubleD = (DoubleData *)systemEngine->getData();    target = doubleD->get();    QString formattedOutput = doubleD->getFormattedOutput();    bool ok=FALSE;    if (formattedOutput.contains('.') == 0) {	ret->set(formattedOutput.toInt(&ok),1);    }    int maxCycles = 0;    if (!ok) {	diff = upper = lower = 1;	tmp = 0;	while ( (diff > 0.0000001 || diff < -0.0000001) &&  maxCycles < 100000) { // limited precision            maxCycles++;	    if (tmp < target)		upper++;	    else {		lower++;		upper = (int) target * lower;	    }	    tmp =  (double) upper / (double) lower;            diff = tmp-target;	}	ret->set(upper,lower);    }    if (ok || maxCycles < 100000) {        systemEngine->putData(ret);        delete doubleD;    } else {        delete ret;        systemEngine->putData(doubleD); // put data back on stack for recover        systemEngine->setError(eOutOfRange, FALSE);    }}iConvertDoubleFraction::iConvertDoubleFraction():Instruction() {    name = "Convert"; // No tr    retType = "Fraction"; // No tr    type = "Double"; // No tr}// Mathematical functionsvoid iAddFractionFraction::doEval (FractionData *f,FractionData *fractionNum) {    FractionData *result = new FractionData();    int nn,nd,fn,fd;    nn = fractionNum->getNumerator();    nd = fractionNum->getDenominator();    fn = f->getNumerator();    fd = f->getDenominator();    result->set(nn * fd + nd * fn, nd * fd);    systemEngine->putData(result);}void iSubtractFractionFraction::doEval (FractionData *f,FractionData *fractionNum) {    FractionData *result = new FractionData();    int nn = fractionNum->getNumerator();    int nd = fractionNum->getDenominator();    int fn = f->getNumerator();    int fd = f->getDenominator();    result->set(nn * fd - nd * fn, nd * fd);    systemEngine->putData(result);}void iMultiplyFractionFraction::doEval (FractionData *f,FractionData *fractionNum) {    FractionData *result = new FractionData();    int nn = fractionNum->getNumerator();    int nd = fractionNum->getDenominator();    int fn = f->getNumerator();    int fd = f->getDenominator();    result->set(nn * fn, nd * fd);    systemEngine->putData(result);}void iDivideFractionFraction::doEval (FractionData *f,FractionData *fractionNum) {    FractionData *result = new FractionData();    int nn = fractionNum->getNumerator();    int nd = fractionNum->getDenominator();    int fn = f->getNumerator();    int fd = f->getDenominator();    result->set(nn * fd, nd * fn);    systemEngine->putData(result);}void iNegateFractionFraction::doEval (FractionData *f) {    FractionData *result = new FractionData();    result->set( -f->getNumerator(), f->getDenominator() );    result->setEdited(TRUE);    systemEngine->putData(result);}iAddFractionFraction::iAddFractionFraction():BaseFractionInstruction() {    name = "Add"; // No tr    precedence = 10;    displayString = "+";    argCount = 2;}iSubtractFractionFraction::iSubtractFractionFraction():BaseFractionInstruction() {    name = "Subtract"; // No tr    precedence = 10;    displayString = "-";    argCount = 2;}iMultiplyFractionFraction::iMultiplyFractionFraction():BaseFractionInstruction() {    name = "Multiply"; // No tr    precedence = 15;    displayString = "x";    argCount = 2;}iDivideFractionFraction::iDivideFractionFraction():BaseFractionInstruction() {    name = "Divide"; // No tr    precedence = 15;    displayString = "/";    argCount = 2;}iNegateFractionFraction::iNegateFractionFraction():BaseFractionInstruction() {    name = "Negate"; // No tr    precedence = 0;    argCount = 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -