【问题标题】:C++ How to interpret an Equation as a string C++ (NOT C) [closed]C ++如何将方程式解释为字符串C ++(非C)[关闭]
【发布时间】:2014-04-06 00:09:23
【问题描述】:

我正在尝试用 C++ 编写一个程序,用户将在其中输入一个方程式(例如:y = 3x + 6)。我如何确定什么是值、什么是角色以及它们在哪里?

所以从这个例子中,我会知道:

  • 值 3 在位置 stringArray[4]
  • 值 6 在位置 stringArray[9]
  • 字符 x 位于 stringArray[5] 位置

我该怎么写?

当我在 Visual Studio 2013 中输入y = 3x 时,它会出现一个错误框:

Unhandled exception at 0x77662EEC in Graphmatica_WhatsInDatInput.exe: Microsoft C++ exception: std::invalid_argument at memory location 0x00FAF94C.

但是当我输入任何不是以字符开头的东西时,这很好(例如1 + 3x

这是我目前的代码:

#include <iostream>
#include <string>

using namespace std;

int main(){

    string Equation;
    double dNumber;

    cout << ": ";
    getline(cin, Equation);


    for (int i = 0; i < Equation.size(); i++){
        if (isdigit(Equation[i])) {
            cout << "Number: ";
            dNumber = stod(Equation);
            cout << dNumber << endl;

        }
        else {
            if (Equation[i] != ' ') {
                cout << "Character" << endl;
            }
        }
    }

    cout << endl;
    system("pause");
}

【问题讨论】:

  • 您决定哪些字符有意义(即运算符),哪些字符没有意义(即空格),哪些是文字(即数字),哪些是变量(即字母)。然后你一次遍历一个字符,对字符进行相应的分类并决定如何处理它。注意:这并不意味着你盲目地从左到右执行事情:算术有规则。但是您会发现这与阅读方程式的方式相同:从左到右,一次一个字符。计算机只需要有关如何执行此操作的帮助和说明。
  • Infix expression evaluation 的可能重复项
  • 我不认为这是重复的,尽管该问题提供了有关如何解析此类表达式以及如何解决此问题的见解。这个问题涉及到变量的使用,以及如何将它们与表达式中的其他“事物”区分开来。
  • @user3502489 'I get an error.' 太模糊了,请解释一下(再次修改你的问题!)。
  • 已编辑!我的错误是:Graphmatica_WhatsInDatInput.exe 中 0x77662EEC 处的未处理异常:Microsoft C++ 异常:内存位置 0x00FAF94C 处的 std::invalid_argument。

标签: c++ arrays string data-conversion


【解决方案1】:

你的错误是因为这一行:

dNumber = stod(Equation);

它的异常文档说:如果不能执行转换,则会抛出std::invalid_argument 异常。

当你输入一个字母时,无法进行转换,你得到了异常。

其次,您试图将整个等式转换为双精度。如果是这种情况,那么检查字符串中的每个索引是否是数字有什么意义?

我想你的意思是把:stod(to_string(Equation[I])) 改为..

您还可以使用 C 中已经为您提供的转换函数创建自己的转换函数。

#include <iostream>
#include <string>

using namespace std;

inline double strtodouble(char c) noexcept
{
    return strtod(&c, NULL);
}

inline double strtodouble(const char* str) noexcept
{
    return strtod(str, NULL);
}

inline double strtodouble(const std::string str) noexcept
{
    return strtod(str.c_str(), NULL);
}


int main()
{

    string Equation;
    double dNumber;

    cout << ": ";
    getline(cin, Equation);


    for (int i = 0; i < Equation.size(); i++)
    {
        if (isdigit(Equation[i]))
        {
            cout << "Number: ";
            dNumber = strtodouble(Equation[i]);
            cout << dNumber << endl;

        }
        else
        {
            if (Equation[i] != ' ')
            {
                cout << "Character" << endl;
            }
        }
    }

    cout << endl;
    system("pause");
}

【讨论】:

  • 我认为他想要 stod(Equation.substr(i),&i);
  • 谢谢!除了现在当我输入 y = 3x 时,是说:字符字符数:51 .... 为什么??
  • 等一下,stod(Equation.substr(i));完美运行!谁能解释一下如何/为什么?
  • 不确定你的意思..如果我输入Y = 3x,上面的代码会打印CharacterCharacterNumber: 3Character
  • 并建议内联教程?真的很想学做一个更好的程序员
猜你喜欢
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
相关资源
最近更新 更多