gpt4 book ai didi

c++ - 接受多个输入的计算器,例如 +、- 和平方数。从文本文件中提取信息

转载 作者:行者123 更新时间:2023-11-27 23:47:55 25 4
gpt4 key购买 nike

我有这个任务:

Write an even better calculator program calc3.cpp that can understand squared numbers. We are going to use a simplified notation X^ to mean X2. For example, 10^ + 7 - 51^ should mean 10^2 + 7 − 51^2.

假设您有一个文件 formula.txt,其求和公式如下:

    5^; = 25    1000 + 6^ - 5^ + 1;  = 1012

At first I used switch/case statements, which didn't exactly work, and was too hard for me to understand. I'm using if statements now. I'm not sure what's wrong with my if statements, I think there's more I need to add in each of the if statements inside the +, and - statements, but I don't know what.

Thank you so much!

cin >> sum;                      
sum == rightNum;

while (cin >> op) {
if(op == '^') {
sum += rightNum * rightNum;
cin >> op;
}

if(op == '+') {
cin >> rightNum;
cin >> op;
if(op == '^') {
sum += rightNum * rightNum;
}
else {
sum += rightNum;
}
}


if(op == '-') {
cin >> rightNum;
cin >> op;
if(op == '^') {
sum -= rightNum * rightNum;
}
else {
sum -= rightNum;
}
}


if(op == ';') {
cout << sum << endl;
cin >> sum;
}
}

最佳答案

因为您已经将收集和执行下一个操作构建到处理上一个操作的代码中,所以您构建了一个无法有效扩展的程序。而是循环获取运算符并获取正确的操作数,然后,如果可以忽略运算符优先级,则对先前的结果和操作数执行操作。如果您必须考虑运算符优先级,请忽略此答案并开始研究优先级队列和树。

有点像

cin >> result; // get first operand. If there is no operator, this is the answer
while (true) // loop forever!
{
cin >> op;
if (op == ';')
{
print result and exit loop.
}
cin >> operand;
switch(op)
{
case '+':
result += operand;
break;
case '-':
result -= operand;
break;

other operations go here
}
}

现在我们有了一个可以处理任意数量操作的基本框架,我们可以处理 ^。最好不要将其视为一项操作,因为它没有被用作一个操作。它更像是一个修饰符。

如果语法看起来像 10 ^ 2,您会有一个运算符,但 10^ 没有右手操作数,这会搞砸其余代码的左操作数、运算符、右操作数结构。

那么我们该怎么做呢?每当您从用户那里读取一个数字时,请查看下一个字符。如果是^,则将读取的数乘以自己。

T 替换为所需的任何类型。

T readnumber()
{
T val;
cin >> val;
if (cin.peek() == '^')
{ // found ^
val *= val; // square the value
cin.ignore() // remove the ^ so no one else trips over it
}
return val;
}

请注意,上面的代码完全忽略了输入验证,并且会滑稽地错误处理错误的输入。用户是出了名的愚蠢和糟糕的打字员。不要相信用户会给程序好的输入。一般来说,根本不要相信用户。

readnumber 替换 cin >> 我们得到类似的东西

result = readnumber(); 
while (true)
{
cin >> op;
if (op == ';)
{
print result and exit loop.
}
operand = readnumber();
switch(op)
{
case '+':
result += operand;
break;
case '-':
result -= operand;
break;

other operations go here
}
}

旁注:考虑将 cin 替换为通用 std::istream,以便这些函数可用于任何类型的流。

基于评论的建议:

int calculate(istream & in)
{
result = readnumber(in);
while (true)
{
in >> op;
if (op == ';)
{
break;
}
operand = readnumber(in);
switch(op)
{
case '+':
result += operand;
break;
case '-':
result -= operand;
break;

other operations go here
}
}
return result;
}

calculate 然后进入循环并重复调用,直到用完所有输入。

额外建议:使用 std::getline 获取由“;”分隔的语句

string statement;
while (getline(in, statement, ';'))
{
calculate(stringstream(statement));
}

getline 移除 ';'所以它不能用于退出 calculate 中的循环,但这实际上使事情变得更容易一些:您可以在 stringstream 为空或处于失败状态时退出,

关于c++ - 接受多个输入的计算器,例如 +、- 和平方数。从文本文件中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com