Kalkulator używając arraya, ze stringiem jako input

0

Siemanko, mam problem. Głowię się z tym już dłuższą chwilkę. Chcę napisać algorytm, który po wprowadzeniu jakiegoś działania matematycznego, składającego się jedynie ze znaków +, /, -, *, i nawiasów (, ), policzy mi wynik tego działania. Oczywiście może to być działanie wieloczłonowe, mam na myśli, że z użyciem kilku liczb, a nie jedynie jednego operatora i dwóch liczb - bo takie coś jest za proste. Na chwilę obecną stoję w miejscu, gdzie po zaczytaniu działania, przepisuje mi je do tablicy. Jedynie problem jest taki, że mój algorytm odpowiadający za łączenie sąsiednich cyfr w liczbę nie chce działać, zasymulujmy co mam na myśli:

tab = { 2, 0, 4, +, 5, 3, *, 2};

powiedzmy, że to jest nasze działanie matematyczne po przerzuceniu do tablicy i teraz chcę sprawić, aby wszystkie sąsiednie cyfry znajdowały się pod jednym indeksem, aby później było łatwiej je parsować do integera i liczyć, czyli:

tab = { 204, +, 53, *, 2};

ma ktoś jakiś pomysł? wkleję tu swój algorytm, który niestety działa tylko dla jednego indeksu, nie wiem czy może jest tu problem z pętlą czy z czym innym.

for (int j = 0; j < expression.length(); j++) {
    if(exp_tab[j] != "/" || "+" || "-" || "*" || ")" || "(") { 
        if (exp_tab[j + 1] != "/" || "+" || "-" || "*" || ")" || "(") {
            exp_tab[j] += exp_tab[j + 1];
            exp_tab[j + 1] = "";
        }   
    }
}

exp_tab[i] = tablica typu string, w której przechowuje zmienne po przerzuceniu ze stringa,

expression = zmienna typu string, input naszego działania. Użyłem tam expression.length() aby prościej było sprawdzić wielkość tablicy.

A tu jest cały kod mojego programu, na końcu jest pętla wypisująca wszystkie dane z tablicy, rozdzielając je spacją by sprawdzić, czy się połączyły.

#include "pch.h"
#include <iostream>
#include <string>
 
int main()
{
    std::string expression = "", exp_var = "", exp_tab[64];
 
    std::cout << "expression: ";
    std::cin >> expression;
 
    for (int i = 0; i < expression.length(); i++) {
        exp_tab[i] = expression[i];
    }
 
    for (int j = 0; j < expression.length(); j++) {
        if(exp_tab[j] != "/" || "+" || "-" || "*" || ")" || "(") { 
            if (exp_tab[j + 1] != "/" || "+" || "-" || "*" || ")" || "(") {
                exp_tab[j] += exp_tab[j + 1];
                exp_tab[j + 1] = "";
            }   
        }
    }
 
    for (int k = 0; k < expression.length(); k++) {
        std::cout << exp_tab[k] << " ";
    }
}
0

Jak Dasz rady, to Możesz spróbować "otoczyć" nawiasy i operatory spacjami, np.: replace("+", " + "); wtedy to co zostanie to będą liczby. Tak, zrobiłem, w Javie, tutaj: https://github.com/lion137/Java-Numeric-Calculator/blob/master/Tokenizer.java .
A jak nie, to Napisz prosty parser, Masz tylko dwa rodzaje tokenów: liczby i operatory plus nawiasy; te ostatnie są jednoznakowe (najmnijeszy problem).

0
exp_tab[j] != "/" || "+" || "-" || "*" || ")" || "("

To jest parsowane tak:

(exp_tab[j] != "/") || "+" || "-" || "*" || ")" || "("

jako, że przykładowo, (bool)"+" == true, to sprawdzenie jest bez sensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1