Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

too few arguments to function


Rekomendowane odpowiedzi

Opublikowano

//dalem zly tytul posta, bo to mialem w schowku, bo szukalem w googlach, gdyby ktos mogl zmienic bylbym wdzieczny xD

 

Czesc, mam problem z programem :D

 

 

 

#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <cstdlib>
#include <stdio.h>
#include <cmath>

using namespace std;

class Exp
{
public:
    virtual double eval() = 0;
};

class Atom : public Exp
{
    double val;
public:
    Atom(double v) : val(v) { }
    virtual double eval()
    {
        return val;
    }
};

class BiOp : public Exp
{
    Exp* right, *left;
    char op;
public:
    BiOp(char o, Exp* r, Exp* l) : op(o), right(r), left(l) { }
    virtual double eval()
    {
        switch(op)
        {
        case '+': return left->eval() + right->eval();
        case '-': return left->eval() - right->eval();
        case '*': return left->eval() * right->eval();
        case '/': return left->eval() / right->eval();
        }
    }
};



struct Token
{
    double val;
    char op;
    Token(double v, char o = 'N') : val(v), op(o)
    {

    }
};

class Parser
{
    int i;
    vector<Token* > tokens;
public:
    Parser(vector<Token* > t) : tokens(t), i(0) { }

    Exp* ParseAtom()
    {
        return new Atom(tokens[i++]->val);
    }

    Exp* ParseParentheses()
    {
        char op = tokens[i]->op;
        if(op != '(')
            return ParseAtom();
        i++;
        Exp* inside = ParseSummands();
        i++;

        return inside;
    }

    Exp* ParseFactors()
    {
        Exp* num1 = ParseParentheses();

         while(1)
        {
           char op = tokens[i]->op;
           if(op != '*' && op != '/')
                return num1;
           i++;

           num1 = new BiOp(op, num1, ParseParentheses());
        }
    }



    Exp* ParseSummands()
    {
        Exp* num1 = ParseFactors();
        while(1)
        {
           char op = tokens[i]->op;
           if(op != '+' && op != '-')
                return num1;
           i++;

           num1 = new BiOp(op, num1, ParseFactors());
        }
    }

    Exp* Evaluate()
    {
        Exp* e = ParseSummands();
        return e;
    }
};

class Tokenizer
{
    string input;
    string tmp;
public:
    Tokenizer(string in) : input(in), tmp("")
    {

    }
    void tokenize(vector<Token* > & tokens)
    {
        for(int i=0; i<input.size(); i++)
        {
            if(isdigit(input[i]) || input[i] == '.')
            {
                while(isdigit(input[i]) || input[i] == '.')
                {
                    tmp += input[i];
                    i++;
                }
                tokens.push_back(new Token(strtod(tmp.c_str(), NULL), 'N'));
            }
            if(input[i] == '+' ||
               input[i] == '-' ||
               input[i] == '/' ||
               input[i] == '*' ||
               input[i] == ')' ||
               input[i] == '(' )
            {
                tmp = input[i];
                tokens.push_back(new Token(0, tmp[0]));
                tmp.clear();
            }
        }

    }
};

double pierwiastek(double liczba, double stopien)
{
    cout<<pow(liczba, 1/(stopien))<<endl<<endl;
    return 0;
}

double potega(double liczba, double wykladnik)
{
    cout<<pow(liczba, wykladnik)<<endl<<endl;
    return liczba;
}

void blad()
{
    puts("");
    puts("Chyba cos zle zrobiles, podaj prawidlowa liczbe.");
    puts("");
    puts("-------------------------------------------------");
    puts("");

}

int main()
{
   string input;
   unsigned short menu;
   double liczba, stopien;
   do{
   puts("Wybierz tryb dzialania: ");
   puts("+-------------------------+");
   puts("|  1. Parser              |");
   puts("|  2. Potega              |");
   puts("|  3. Pierwiastek         |");
   puts("|  0. Wyjscie             |");
   puts("+-------------------------+");
   puts("");
   puts("");

//scanf("%d", &menu);
cin>>menu;
switch (menu)
{
case 1:
    {

          cout<<"Wpisz dzialanie: ";

    vector<Token*>tokens;


   cin>>input;

   Tokenizer tk(input);

   tk.tokenize(tokens);

   tokens.push_back(new Token(0, '$'));

    Parser p(tokens);

    Exp* e = p.Evaluate();

    cout<<"Wynik: "<<e->eval()<<endl<<endl<<"==============="<<endl<<endl;

    }
    break;
case 2:
    puts("Podaj liczbe, ktora ma byc potgowana: ");
    cin>>liczba;
    puts("Podaj wykladnik potegi: ");
    cin>>stopien;
   potega(liczba, stopien);
    break;
case 3:
    puts("Podaj liczbe, ktora ma byc pierwiastkowana: ");
    cin>>liczba;
    puts("Podaj stopien pierwiastka: ");
    cin>>stopien;
    pierwiastek(liczba, stopien);
    break;
case 5:
    break;
case 0:
    puts("Dziekuje za wspolprace :D");
    puts("Nacisnij dowolny klawisz, aby wyjsc.");
    break;

default:
    blad();
    break;
}

    }while(menu != 0);
    return 0;
}

 

 

mam taki program, no i po wlaczeniu mam menu, gdy wpisze 1, to wlacza parser, 2 potega, etc... ale gdy w menu po wlaczeniu wpisze np 2+2=5, to program sie zapetla i leci taka nieskonczona petla. jak mozna to zabezpieczyc?

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...