多项式计算器

Vla*_*lad 0 c++ calculator polynomial-math

我正在做一个多项式计算器,我需要一些帮助,因为我将继续使用代码.

现在我只创建了polinom类,我把它表示为带有术语和一些函数的链表(现在只读取和打印多项式函数).

这是主程序,现在只读取多项式并打印出来:

#include "polinom.h"

int main()

{

polinom P1;
bool varStatus = false;
char var = '\0', readStatus = '\0';

cout << "P1 = ";
P1.read(readStatus, var, varStatus); // i don't need readStatus yet as i haven't implemented the reset and quit functions 

cout << "\n\nP = ";
P1.print(var);

getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)

头文件polinom.h:

#ifndef _polinom_h
#define _polinom_h

#include <iostream>
#include <list>
#include <cstdlib>
#include <cctype>
#include <cstdio>
#include <conio.h>


using namespace std;

class polinom 
{
class term
{
    public:
        int coef;
        int pow;

        term() 
        {
            coef = 1;
            pow = 0;
        }    
};

list<term> poly;
list<term>::iterator i;

public:

    bool printable(char c) 
    {

        return (
                  ((int(c) > 42 && int(c) < 123) || isspace(c)) && int(c) != 44 && int(c) != 46 && int(c) != 47 && 
                  int(c) != 58 && int(c) != 59 && 
                  int(c) != 60 && int(c) != 61 && int(c) != 62 && int(c) != 63 && int(c) != 64 && int(c) != 65 && 
                  int(c) != 91 && int(c) != 92 && int(c) != 93 && int(c) != 95 && int(c) != 96
                ); 
    }


    void read(char &readStatus, char &var, bool &varStatus)
    {

        term t; // term variable to push it into the list of terms
        char c, lc, sign; // c = current char, lc = lastchar and sign the '+' or '-' sign before a coefficient
        int coef, pow; //variables to pass the coef and power to term t
        bool coefRead = false, powRead = false; //reading status of coef and power 

        while (c != '\r') { //we read characters until carriage return
            c = getch(); // get the new imputed char

            if (tolower(c) == 'r' || tolower(c) == 'q') { //if the user inputed r or q we reset the input or quit the program
                    readStatus = c; //pass current char value to readStatus so the program will know what to do next
                    return; //aborting the reading process
            }

            else 
            {
                if (printable(c)) cout << c; //print on screen only the correct characters

                if (!coefRead && !powRead) //we set term coef to the inputed value
                {                    
                    if (isdigit(c)) { 
                        if (isdigit(lc)) coef = coef * 10 + int(c); //if the last char was also a digit we multiply the last value of coef by 10 and add current char
                        else {                                    
                            if (sign == '-')  coef = -(int(c));//if the current coef has '-' before we set coef to it's negative value 
                            else              coef = int(c);   //this means a new term's coef is read
                    }
                    if (!isdigit(c) && isdigit(lc)) coefRead = true; //if the last char was a digit and we reached the var name we stop reading the coefficient
                }

                else if (coefRead && !powRead) //after coefficient is read we get the term's varname and power 
                {
                    if (isdigit(c)) { // just like in the case with coefficient we read the power until the current char is not a digit
                        if (isdigit(lc)) pow = pow * 10 + int(c);
                        else pow = int(c);
                    }

                    else if (isalpha(c) && isdigit(lc) && !varStatus) { //if the last char was a digit and the current not we reached the var name
                    var = c;                                            //also even though the variable is inputed more than once we save it only once
                    varStatus = true; //we mark the var name as read
                    }
                    else {
                        if (isdigit(lc)) powRead = true;
                    }   
                }

            else {
                if (c == '+' || c == '-') { // if a sign was inputed it means a new term is coming and we push the current term to the list and reset 
                    t.coef = coef;          // coefRead and powRead so we can read another term 
                    t.pow = pow;
                    poly.push_back(t);
                    sign = c;
                    coefRead = false;
                    powRead = false;
                }
            }

           lc = c; // we save the last character

            }
        } 
    }

    void print(char var)
    {
        for ( i=poly.begin() ; i != poly.end(); i++ ) { //going through the entire list to retrieve the terms and print them 

            if (i == poly.end() - 1) { // if we reached the last term 
                if (*(i->pow == 0) //if the last term's power is 0 we print only it's coefficient
                    cout << *(i->coef);
                else 
                    cout << *(i->coef) << var << "^" << *(i->pow); //otherwise we print both
            }

            else {
                if (*(i->coef > 0) //if the coef value is positive 
                    cout << *(i->coef) << var << "^" << *(i->pow) << " + "; //we also add the '+' sign
                else 
                    cout << *(i->coef) << var << "^" << *(i->pow) << " - "; // otherwise we add '-' sign
            }
        }
    }

};


#endif                    
Run Code Online (Sandbox Code Playgroud)

编辑

由于JonH,现在修复了所有编译错误,但由于输入字符未正确插入列表,因此读取功能无法正常工作.我知道这对你们来说可能是微不足道的,但是如果你帮助我的话会很棒.

谢谢!

Joh*_*ing 10

我在整个代码中发现了许多缺少花括号和关闭parens的内容.在花了几分钟修理其中至少10分之后,我认为如果我帮助你学习钓鱼,而不是在今晚的晚餐上给你鱼,你会更好.

你的代码就像一条意识流.当您构建代码时,您的思维会跳跃,思考您需要构建的其他内容以及您刚刚撰写的任何内容引入的新需求.当你想到这些东西时,你就去写它们并回到你原来的位置.在你知道它之前,你已经编写了数百行代码,可以在这里和那里写一些代码.这样做的问题在于,你不可能继续处理像这样的代码段而不会遗漏一些语法位.

您应该采用更迭代的方法来编写代码.你是如何做到这一点将有经验,但这里有一些指导:

  1. 首先使用一些(最好是1个)核心方法和成员变量来删除类声明.
  2. 编译.您将收到链接器错误等,但您不应该得到任何语法错误,如丢失的parens或分号.在继续之前修复您找到的任何内容.
  3. 实现刚刚存根的方法/功能.编译并修复非链接器错误.
  4. 当您考虑在上述步骤中出现的次要或依赖要求时,请在代码中编写注释,// TODO: Implement bool DoTheThing(int); 但尚未实现它们.
  5. 循环回到步骤1,尽可能保持您正在处理的范围有限且基本.如果没有干净的编译,切勿超越编译步骤.

重复,直到你实现了一切.在此过程中,您可能会编译50次或更多次.

  • 好答案.它解决了问题的根源并提出了长期解决方案.您可以从另一个答案中看到,专门修复编译错误并没有帮助提问者,因为他立即遇到另一个错误但仍然不知道该怎么做. (2认同)