第三次作业
之前不知道为什么一直没法将代码上传,纠结了好久,不过现在总算成功了。
一开始看到题目的时候是吃惊的,因为几乎可以说是没看懂。然后就去查了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”,发现括号变成两个空行了。又输了一遍却发现正常。突然意识到我第一次输入时的括号是中文的……这个应该不用列入考虑范畴吧。
现在
要开始考虑如何把数字不分开了。首先得要能辨识出数字。搜了一下后发现了
尝试了“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;
}