0
回答
Visual C++ 無小數四則運算計數機(求高手大大指點)
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

// calculator.cpp: 定義主控台應用程式的進入點。
//

//有沒有bug , 可改善的地方 ?

#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>

using namespace std;

/*

        indes 是搜索開始位置。

*/

int FindSymbolBR(string s, int indes);//根據先乘除後加減的方法找符號。
int ResultOfFormula(string s, int indes);//計算答案。
int GetNextNumber(string s, int indes);//找符號後的數字。(indes 是符號位置)
int GetPreviousNumber(string s, int indes);//找符號前的數字。(indes 是符號位置)
int FindSymbol(string s, int indes, int add);//找符號 , add 是方向。
bool Fix(string *s);//處理一些 "1--2" , "1*-2" 之類的問題 。 遇到不合理的 ,例如 : "1+*5" , "1**5" 之類的情況會返回 false。

int main()
{
    string formula;
    int indes, result, FirstValue, SecondValue;
    cout << "  ";
    cin >> formula;
    if (!Fix(&formula)) {
        cout << "\n[ERROR !]\n";
        system("pause");
        return 0;
    }
    while((indes = FindSymbolBR(formula, 1)) > 0)
    {
        result = ResultOfFormula(formula, indes);
        FirstValue = FindSymbol(formula, indes - 1, -1) + 1;
        SecondValue = FindSymbol(formula, indes + 1, 1) - FirstValue;
        formula.replace(FirstValue, SecondValue, to_string(result));
        cout << " =" << formula<<"\n";
    }
    system("pause");
    return 0;
}

int FindSymbol(string s, int indes, int add) {
        for (int i = indes; (add > 0) * (i < s.size()) || (add < 0) * (i > 0); i += add) 
                    if (s[i] == '*' || s[i] == '/' || s[i] == '+' || s[i] == '-') 
                        return i;
    return -1 + (add > 0) * (s.size() + 1);
}

bool Fix(string* str)
{
    for (int i = 0; i < (*str).size() - 2; i++) {
        if ((*str)[i] >= '0' && (*str)[i] <= '9')
            continue;
        switch ((*str)[i])
        {
        case '+':
            switch ((*str)[i + 1])
            { 
            case '+':
                (*str).replace(i, 2, "+");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '-':
                (*str).replace(i, 2, "-");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '*':
            case '/':
                return false;
            }
            break;
        case '-':
            switch ((*str)[i + 1]) {
            case '+':
                (*str).replace(i, 2, "-");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '-':
                (*str).replace(i, 2, "+");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '*':
            case '/':
                return false;
            }
            break;
        case '*':
            switch ((*str)[i + 1])
            {
            case '-':
                (*str).replace(i, 2, "*");
                (*str).insert(FindSymbol((*str), i - 1, -1) + 1, "-");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '+':
                (*str).replace(i, 2, "*");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '*':
            case '/':
                return false;
            }
        case '/':
            switch ((*str)[i + 1]) {
            case '+':
                (*str).replace(i, 2, "/");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '-':
                (*str).replace(i, 2, "/");
                (*str).insert(FindSymbol((*str), i - 1, -1), "-");
                cout << "==" << (*str) <<endl;
                return Fix(str);
            case '*':
            case '/':
                return false;
            }
        }
    }
    return true;
}

int FindSymbolBR(string s, int indes) {
    for (int i = indes; i < s.size(); i ++)
        if (s[i] == '*' || s[i] == '/')
            return i;
    for (int i = indes; i < s.size(); i++)
        if (s[i] == '+' || s[i] == '-')
            return i;
    return -1;
}

int GetNextNumber(string s, int indes) {
    string number;
    int FirstValue, SecondValue;
    FirstValue = indes + 1;
    SecondValue = FindSymbol(s, indes + 1, 1) - FirstValue;
    number.assign(s, FirstValue, SecondValue);
    return atoi(number.c_str());
}

int GetPreviousNumber(string s, int indes) {
    string number;
    int FirstValue, SecondValue;
    FirstValue = FindSymbol(s, indes - 1, -1) + 1;
    if (FirstValue == 1 && s[0] == '-') {
        FirstValue = 0;
    }
    SecondValue = indes - FirstValue;
    number.assign(s, FirstValue, SecondValue);
    return atoi(number.c_str());
}

int ResultOfFormula(string s, int indes) {
    switch (s[indes])
    {
    case '+':
        return GetNextNumber(s, indes) + GetPreviousNumber(s, indes);
    case '-':
        return GetPreviousNumber(s, indes) - GetNextNumber(s, indes);
    case '*':
        return GetPreviousNumber(s, indes) * GetNextNumber(s, indes);
    case '/':
        return round(double(GetPreviousNumber(s, indes)) / double(GetNextNumber(s, indes)));
    }
}
/*

例如輸入 : 78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37--534*-534/+534-534-+534++-5*+746541

輸出 : 

==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37+534*-534/+534-534-+534++-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37+-534*534/+534-534-+534++-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/+534-534-+534++-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-+534++-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534++-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534+-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*+746541
==78+6-786*786/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-617796/786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-78*67/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-5226/86*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-61*7-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-543*563/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-305709/78*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-3919*6341-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-8657*63/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-545391/74357-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-7-637+37-534*534/534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-7-637+37-285156/534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-7-637+37-534-534-534-5*746541
 =78+6-786-427-867+867-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =84-786-427-867+867-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-702-427-867+867-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-1129-867+867-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-1996+867-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-1129-32-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-1161-24850379-231+27+867-7-637+37-534-534-534-3732705
 =-24851540-231+27+867-7-637+37-534-534-534-3732705
 =-24851771+27+867-7-637+37-534-534-534-3732705
 =-24851744+867-7-637+37-534-534-534-3732705
 =-24850877-7-637+37-534-534-534-3732705
 =-24850884-637+37-534-534-534-3732705
 =-24851521+37-534-534-534-3732705
 =-24851484-534-534-534-3732705
 =-24852018-534-534-3732705
 =-24852552-534-3732705
 =-24853086-3732705
 =-28585791

*/

//求可以改善的地方

<无标签>
举报
EMCJava
发帖于2个月前 0回/41阅

以下是话题补充:

  • @EMCJava :可一次輸入整個算式 (2个月前)
顶部