• 第三次作业


    代码上传至这里

    之前不知道为什么一直没法将代码上传,纠结了好久,不过现在总算成功了。

    一开始看到题目的时候是吃惊的,因为几乎可以说是没看懂。然后就去查了string和queue的用法。大概了解一点后再回去看题目。

    题目第二点要求在scan类中写一个函数,能将一个运算input扫描成一堆string。再把这堆string放到队列里。

    因为是第一次操作,所以没有去详细的考虑分类什么的,只写了将输入的字符串一个一个打出来的代码。原以为应该很顺利,结果发现,当我输入“21+5”时,输出只有2,1。
    这点我觉得很奇怪,所以又输入了“213+456”,这时出现了“2,1,3,+”。

    看不出问题所在。在输出里加入了测量队列长度的函数,还是输入“213+456”,结果是循环前为7,循环后为3。直接加了三次循环。变成了“2,1,3,+,4”。难以置信。又加了4次。正常输出了。但完全不明白是怎么回事。为了把长度为7的代码挨个输出我得循环14次?

    终于意识到循环的时候直接写“i<str.size()”似乎是不行的,于是把弹出元素前的元素数量先定义了,现在总算能在我输入“213+456”时跳出“2,1,3,+,4,5,6”了。

    换了一组数,“-(21+5)*100”,发现括号变成两个空行了。又输了一遍却发现正常。突然意识到我第一次输入时的括号是中文的……这个应该不用列入考虑范畴吧。

    现在
    要开始考虑如何把数字不分开了。首先得要能辨识出数字。搜了一下后发现了下的isdigit函数。用它判断出数字,然后把相连的数字放在一起。

    尝试了“21+5”,正常。但“-21(21+5)”时,与(间多了个空行。很奇怪,但在这之前,我决定先把之前压根没考虑到的小数点先加进去。

    “21.5+5”的结果正常。加小数点的过程中发现了之前的疏忽之处,现在输入“-(21.5+5)100/3”的结果已经正常了。与(间的空行消除了。

    最后是数字超过十位要报错。这个真的非常困扰。最后还是选择尝试了非常不熟悉的bool。设了一个bool函数,为了美观把它移到了外面。中间因为对bool太陌生,尝试了很多次才成功。

    最终虽然完成了代码,但过程磕磕绊绊,代码也很冗繁。主要还是对C++的了解不够深刻,运用太生疏。以后还要好好努力。

    这是代码:

    sp.h

    #ifndef SP_H
    #define SP_H
    #include<iostream>
    #include<stdlib.h>
    #include<cctype>
    #include<string>
    #include<queue>
    using namespace std;
    
    
    class Scan                                     //定义Scan类
    {
    public:
        string IN;
        string temp;
        queue<string> str;
    
        queue<string> ToStringQueue(string input);
    };
    	
    class Print                                    //定义Print类
    {
    public:
        void toprintqueue(queue<string>str)
        {
    	    int a=str.size();                      //循环次数
    	    for(int i=0;i<a;i++)
    	    {
    		    cout << str.front() << endl;       //输出队列首位元素
    		    str.pop();                         //去除队列首位元素
    	    }
        }
    };
    

    calculator.cpp

    #include<iostream> 
    #include<stdlib.h> 
    #include<cctype> 
    #include<string> 
    #include<queue> 
    using namespace std; 
    
    
    queue<string> Scan::ToStringQueue(string input)
    {
        for(int i=0;i<input.size();i++)                 //从第一个元素开始循环
        {
    	    IN=input[i];
    	    if(isdigit(input[i])) temp+=IN;             //如果是数字,就暂存到字符串temp中
    	    else 
    	    {
    		    if(input[i]=='.') temp+=IN;             //如果是小数点,也暂存到temp中
    		    else                                    //若是其余符号
    		    {
    			    if(temp.empty()) str.push(IN);      //当temp为空时,直接push到队列中
    			    else
    			    {
    				    str.push(temp);                 //否则,先push temp                 
    				    str.push(IN);                   //然后push符号
    				    temp.clear();                   //最后清空temp
    			    }
    		    }
    	    }
        }
        if(!temp.empty()) str.push(temp);               //循环结束后,若temp不为空,push进队列
        return str;
    }
    
    
    bool num(string in);
    
    
    int main()
    {
        string INPUT;
        cin >> INPUT ;                          //输入运算式
    
        bool x=num(INPUT);                      //通过num函数来判断是否要继续运行
    
        if(x)                                   //若x=1
        {
            Scan scan;                          //创建scan对象
            queue<string> d;
            d=scan.ToStringQueue(INPUT);        //获取队列
    
            Print print;                        //创建print对象
            print.toprintqueue(d);              //输出队列
        }
        else cout << "It is wrong." << endl;    //若x=0,报错
    
        system("pause");
        return 0;
    }
    
    
    bool num(string in)
    {
        bool y=false;                            //定义一个bool值
        int n=0;
        for(int i=0;i<in.size();i++)          
        {
    	    if(isdigit(in[i]))                   //判断元素是否为数字
    	    {
    		    n+=1;                            //若是,加一
    		    if(n>10) {y=0; break;}           //若总数大于10,y=0
    		    else y=1;                        //否则y=1
    	    }
    	    else
    	    {
    		    if(in[i]=='.')                   //若不是数字而是小数点
    		    {
    			    n+=1;                        //加一
    			    if(n>10) {y=0; break;}       //若总数大于10,y=0
    			    else y=1;                    //否则y=1
    		    }
    		    else {n=0; y=1;}                 //若为运算符,y=1
    	    }
        }
    
        return y;
    }
  • 相关阅读:
    走进MongoDB(二)
    走进MongoDB(一)
    InnoDB锁与事务模型
    InnoDB引擎架构的主要组件构成
    InnoDB多版本存储引擎简介
    mysql 数据库备份与恢复
    mysql 字符集
    java常见问题笔记
    mysql5.7 Installing MySQL on Microsoft Windows Using a noinstall Zip Archive(mysql解压版安装)
    作业day03吴童
  • 原文地址:https://www.cnblogs.com/shadeinblue/p/5225780.html
Copyright © 2020-2023  润新知