第三次作业

代码上传至这里

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

一开始看到题目的时候是吃惊的,因为几乎可以说是没看懂。然后就去查了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;
}
原文地址:https://www.cnblogs.com/shadeinblue/p/5225780.html