c++ - 如何比较文件包含的下一个字符?

标签 c++ dev-c++

我在阅读代码时遇到了一些问题。这是文本文件。

2X^6+3X^3+4X^0=0
5X^6+X^2+X^1-4X^0=0

我在第一行得到了正确的输入,但在第二行我首先需要忽略。我在这里搜索并找到了如何使用它,它可以转到下一行而忽略第一行的所有剩余字符。

你可以看到在第二行 X 没有整数,现在问题是第二个 while 循环连续运行。如果我在带有 X 的文本文件中添加 1,文件将完美读取。另外,我怎样才能满足这个条件,当直接有 X-X 时,它应该存储 1- 1 并转到下一个字符?您还可以看到 ^ 我必须将它存储在一个变量中,而我应该忽略它但不知道如何忽略它?

提前致谢

int main()
{
int in;
int power;
char x;
char f;
fstream fin;
fin.open("input1.txt");
list l1,l2;

while(fin.peek() != 61)
{
        fin>>in;
        fin>>x;
        fin>>f;
        fin>>power;
        cout<<in<<endl<<x<<endl<<f<<endl<<power<<endl;
        l1.addtoend(in,power,x);
        cout<<endl;
}
fin.ignore(2,'\n');

while(fin.peek() != 61)
{
        fin>>in;
        fin>>x;
        fin>>f;
        fin>>power;
        cout<<in<<endl<<x<<endl<<f<<endl<<power<<endl;
        l2.addtoend(in,power,x);
        cout<<endl;
}
l1.display();
l2.display();
}

最佳答案

不幸的是,这并没有想象的那么简单。

我们需要将任务拆分成更小的部分。

您想要做的是,将您的方程拆分为项,并从中提取系数和指数。

将某些东西拆分成相似的部分也称为分词。

因此,您的等式由项组成,它们都遵循相同的模式。首先是一个可选的符号,然后是系数,然后是“X^”,最后是指数(可能有也可能没有符号)。

由于所有术语都具有相同的模式,我们可以使用所谓的正则表达式找到它们。 C++ 支持此功能。此外,为了将文本拆分为更小的标记/术语/模式匹配,我们有一个特殊的迭代器 std::sregex_token_iterator。与 C++ 中的任何其他迭代器一样,它迭代源字符串并提取(和复制)所有匹配的模式。

OK,那么我们已经找到了第一个子任务的解决方案。提取所有术语并将它们放入 std::vector 中。我们将使用 std::vector 的范围构造函数来执行此操作,同时定义变量。

下一步是获取系数。这里我们需要一些特殊处理,因为系数可以用假设的 1 省略。使用这个假设,我们将读取项并将系数转换为整数。因为我们想在一条语句中做到这一点,所以我们使用了 STL 算法库中的 std::transform

获取指数更容易。我们只需将“^”符号后的术语中的任何内容转换为整数。我们再次使用 std::transform 在一个语句中处理所有项。

最后但同样重要的是,我们将得到等式的右边并将其也转换为整数。

请注意:

所有这些也可以用 float 类型的值来完成 我们还可以在等式中允许空格

为此,我们将简单地修改 std::regex-string。

请看下面的完整示例:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <regex>
#include <algorithm>
#include <iomanip>

int main() {

    std::string equation{ "5X^6+X^2+X^1-4X^0=0" };

    const std::regex re(R"(([+-]?\d?X\^[+-]?\d+))");
    std::vector<std::string> terms{ std::sregex_token_iterator(equation.begin(), equation.end(), re,1),std::sregex_token_iterator() };


    std::vector<int> coefficients(terms.size());
    std::vector<int> exponents(terms.size());
    int rightHandSite{ 0 };

    // Everything in front of X is the coefficient. Handle special case, when no digit is given
    std::transform(terms.begin(), terms.end(), coefficients.begin(), [](const std::string& s) {
        std::string temp = s.substr(0U, s.find('X'));
        if (1 == temp.size() && !std::isdigit(temp[0])) temp += '1';
        return std::stoi(temp); });

    // Get all exponents
    std::transform(terms.begin(), terms.end(), exponents.begin(), [](const std::string & s) {
        return std::stoi(s.substr(s.find('^') + 1)); });

    // Get right Hand site of equation
    rightHandSite = std::stoi(equation.substr(equation.find('=') + 1));

    // Show result
    std::cout << "\nEquation: " << equation << "\n\nFound '" << terms.size() << "' terms.\n\nCoeffient  Exponent\n";
    for (size_t i = 0U; i < terms.size(); ++i)
        std::cout << std::right << std::setw(9) << coefficients[i] << std::setw(10) << exponents[i] << "\n";
    std::cout << "\n                  --> " << rightHandSite << "\n";

    return 0;
}

还有许多其他可能的解决方案。但也许它会让您对可以做什么有所了解。

关于c++ - 如何比较文件包含的下一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58665577/

相关文章:

C 套接字编程 -"undefined reference"

c++ - 为什么我在 dev c++ 中使用 "gets function"后不能使用 "cin function"?

c++ - 在 Windows 中使用 DevC++ 和在 Ubuntu 中使用 gcc 写入文件有什么区别

c++ - 将输入数组与字符串进行比较

C++0X 什么时候?

c++ - 如何检查cmake正在使用什么编译器?

c++ - 编译错误 g++

c++ - 纹理模型

c++ - 警告 : second argument of ‘int main(int, char***)’ should be ‘char **’ [-Wmain] (GNU C++ compiler; Ubuntu 12. 10)

c++ - JavaScript 位操作到 C++ 位操作