计算机二级

3773考试网计算机等级考试计算机二级正文

C++编写24程序

来源:fjzsksw.com 2010-4-28 15:21:41

 

  009using namespace std;

  010#include "Token.h"

  011#include "ExpCalc.h"

  012#include "24Game.h"

  013int Game::minOperand = 1;

  014int Game::maxOperand = 13;

  015extern char operators[7];

  016Game::Game()

  017{

  018    srand(time(NULL));

  019}

  020void Game::GenNewNumbers()

  021{

  022    while (1)

  023    {

  024        for (int i = 0;i<4;i++)

  025            generated_operands[i] = rand()%(maxOperand-minOperand+1) + minOperand;

  026        if (hasSolutions()) break;

  027    }

  028    //generated_operands[0] = 4;

  029    //generated_operands[1] = 8;

  030    //generated_operands[2] = 4;

  031    //generated_operands[3] = 9;

  032

  033}

  034

  035//若有解,只保存一组先

  036bool Game::hasSolutions()

  037{

  038    vector<double> a(4);//操作数

  039    vector<Operator> ops(3);//操作符

  040    double res;

  041    copy(generated_operands,generated_operands+4,a.begin());

  042    sort(a.begin(),a.end());

  043    while (next_permutation(a.begin(),a.end()))

  044    {

  045        for (int i = ADD_OPR;i<=DIV_OPR;i++)

  046        {

  047            for (int j = ADD_OPR;j<=DIV_OPR;j++)

  048            {

  049                for (int k = ADD_OPR;k<=DIV_OPR;k++)

  050                {

  051                    ops[0] = Operator(i);ops[1]=Operator(j);ops[2] = Operator(k);

  052                    bool isOk = calc.PostfixCalc(a,ops,res);

  053                    if (isOk && fabs(res - 24) < 1e-6)

  054                    {

  055                        solu_operands = a;

  056                        solu_operators = ops;

  057                        hasSolu = true;

  058                        return true;

  059                    }

  060                }

  061            }

  062        }

  063    }

  064    hasSolu = false;

  065    return false;

  066}

  067

  068void Game::ShowNums()

  069{

  070    for (int i = 0;i<4;i++)

  071        cout << generated_operands[i] << " ";

  072    cout << endl;

  073}

  074

  075void Game::ShowSolution()

  076{

  077    for (int i = 0;i<solu_operands.size();i++)

  078        cout << solu_operands[i]<<" ";

  079    for (int i = 0;i<solu_operators.size();i++)

  080        cout << operators[solu_operators[i]] << " ";

  081    cout << endl;

  082}

  083

  084bool Game::Calc(vector<Token>& tokens,double & res)

  085{

  086    return calc.infixCalc(tokens,res);

  087}

  088

  089bool Game::Check(vector<Token>& tokens)

  090{

  091    vector<double> a;

  092    for (int i = 0;i<tokens.size();i++)

  093    {

  094        if (tokens[i].type == Numeric)

  095            a.push_back(tokens[i].x);

  096    }

  097    sort(a.begin(),a.end());

  098

  099    vector<double> opr_copy(4);

  100    copy(generated_operands,generated_operands+4,opr_copy.begin());

  101    sort(opr_copy.begin(),opr_copy.end());

  102

  103    if (opr_copy.size()!=a.size())

  104    {

  105        return false;

  106    }

  107    for (int i = 0;i<a.size();i++)

  108    {

  109        if (a[i]!=opr_copy[i])

  110        {

  111            return false;

  112        }

  113    }

  114    return true;

  115}

  24Points:主文件

  01#include <string>

  02#include <iostream>

  03#include <vector>

  04#include <stack>

  05#include <cmath>

  06using namespace std;

  07#include "Token.h"

  08#include "ExpCalc.h"

  09#include "24Game.h"

  10int main()

  11{

  12    Game game;

  13    double res;

  14    while (1)

  15    {

  16        cout << "开始本轮算24游戏"<<endl;

  17        game.GenNewNumbers();

  18        game.ShowNums();

  19        while(1)

  20        {

  21            cout << "输入你的表达式:以#结尾,只输入#将显示答案,案例:(4*9 -4-8)"<<endl;

  22            string expression;

  23            getline(cin,expression);

  24            if (expression == "#")

  25            {

  26                game.ShowSolution();

  27                break;

  28            }

  29            vector<Token> tokens;

  30            Parse(expression,tokens);

  31

  32            if (!game.Check(tokens))

  33                cout << "输入的数字不对"<<endl;

  34            bool isOk = game.Calc(tokens,res);

  35            if (!isOk)

  36                cout << "输入格式有误" <<endl;

  37            else if (fabs(res - 24) < 1e-6 )

  38                cout <<"您算对了"<<endl;

  39            else

  40                cout << "您算错了"<<endl;

  41        }

  42    }

  43    return 0;

  44}

 

 

上一页  [1] [2] [3] [4] 

触屏版 电脑版
3773考试网 琼ICP备12003406号-1