鱼C论坛

 找回密码
 立即注册
查看: 3649|回复: 4

大家看看有什么可以改进的地方

[复制链接]
发表于 2012-10-18 15:23:48 | 显示全部楼层 |阅读模式
1鱼币
一个计算器,只能顺序计算之后的值,不支持括号。。。
话说加括号就要全部推翻重改程序了吧。。。
代码中有多处重复和不合理的地方。。。
/*
** Copyright (C) QPSOFT.COM All rights reserved.
*/
#define PLEASE 1
#define ADD '+'
#define SUB '-'
#define MUL '*'
#define DIV '/'
#define TRUE 1

#include <iostream>
#include <string>
#include <math.h>
#include <stdlib.h>
class caclu
{

private:
    float result;

    std::string buffer;
public:
    void pleaseinput(void);
    void sayhello(void);
    void error(void);
    void outputresult(void);
    void thank(void);

    bool getbuffer(void);                   //此处接受从键盘输入的命令

    bool judege_process(void);                     //数据处理(核心)

    bool process(bool flag);

    caclu():result(0.0){}
};
void caclu::thank(void)
{
    std::cout<<"thank you !see you!"<<std::endl;
}

void caclu::sayhello(void)
{
    std::cout<<"the result is>> "<<result;
}
void caclu::pleaseinput(void)
{
    std::cout<<"please input command:";
}
void caclu::error(void)
{
    std::cout<<"symtax error!!"<<std::endl;
    result=0;
    //错误处理!
}



bool caclu::getbuffer(void)                           //每次进行输入的时候只需要使用这个函数不需要使用pleaseinput函数。
{
    sayhello();
    std::cout<<std::endl;
    pleaseinput();
    std::getline(std::cin,buffer);
    return 1;
}

bool caclu::process(bool flag)                     /*函数的目的是处理缓冲区的数据*/
{
    char temp='?';bool late=0;flag=0;                      /*buffer存放现在指针所指的数的
                                                                    前一个运算符,num存放加数,late指示
                                                                    如果当前为字符的话late为那个字符*/

    for(std::string::iterator i=buffer.begin();i!=buffer.end();i++)
    {
        if(!((*i=='+'||*i=='-'||*i=='*'||*i=='/')||((*i>='0'&&*i<='9')||(*i=='.')))){error();return 0;}

        std::string::iterator front,end;
        if(*i=='+'||*i=='-'||*i=='*'||*i=='/'){late=1;temp=*i;}      //如果为字符则判断上一个是不是也是字符
        else late=0;
        if((late==flag)&&flag==1){error();return 0;}


        if((*i>='0'&&*i<='9')||(*i=='.'))                                            //如果为数则进行复杂的处理
        {

            {
                float sum(0);
                front=i;
                for(;(*i>='0')&&(*i<='9')||(*i=='.');i++)
                {
                    end=i;
                }

                std::string cacluate(front,end+1);
                int times=0;bool sign=0;int time=0 ;                          //启用一个新的string变量存放数
                for(std::string::iterator k=cacluate.begin();k!=cacluate.end();k++)
                   {
                        if(*k=='.'){sign=1;times++;continue;}
                       if(!sign)sum=sum*10+(*k-48);
                       else
                       {
                           time++;
                           sum=sum+(*k-48)/pow(10,time);
                       }

                       if(times>=2){error();return 0;}

                   }

                switch (temp)
                    {
                        case '+':result+=sum;break;
                    case '-':result-=sum;break;
                    case '*':result*=sum;break;
                    case '/':result/=sum;break;
                    case '?':result=sum;break;
                    default:std::cout<<"wrong!!!!!!!!!!!!!!!!!!!!!!!!";
                    }

                }
                i--;
        }


        flag=late;


    }

}




bool caclu::judege_process(void)                   /*这个函数的作用是处理缓冲区里面的string并且处理其中数据*/
{

    short flag=0;
    if(buffer[0]=='+'||buffer[0]=='-'||buffer[0]=='*'||buffer[0]=='/')flag=1;      //若为运算符将标志致1
    else if((buffer[0]>='0' && buffer[0]<='9')||buffer[0]=='.')flag=0;
    else if (buffer[0]=='q'){thank();exit(0);}
    else{error();return 0;}
    if(process(flag)==0)return 0;

    return 1;

}







int main(void)
{
    caclu a;
    while(TRUE){
    if(!a.getbuffer()){std::cout<<"buffer unavaliable"<<std::endl;return 1;}

    if(!a.judege_process())continue;
    a.sayhello();
    }
    return 0;
}


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-18 17:24:30 | 显示全部楼层
只能说:你太狠了,还是靠自己吧!:lol
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-18 19:01:07 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-18 21:09:18 | 显示全部楼层
写得不错,以下地方可以改进:
1. 不需要把所有的成员函数都设为公有的,很多别人不会直接调用的函数应该是私有的
2.一些const成员函数没标const
3.用C++你还用宏定义?如加减乘除部分可用enum表示如下:
enum op{ ADD = '+', SUB = '-', MUL = '*', DIV = '/'  };
4.作为实际开发的流程,不应该先实现class caclu,而应该先编写使用该类的main函数,然后再编写该类满足main函数的需求。就你的main函数来看,class caclu的使用显然不够简洁。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-18 21:26:53 | 显示全部楼层
仰望天上的光 发表于 2012-10-18 21:09
写得不错,以下地方可以改进:
1. 不需要把所有的成员函数都设为公有的,很多别人不会直接调用的函数应该是 ...

谢谢你的建议{:2_31:}我会加紧写第二版的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-15 18:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表