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

Odpowiedz Nowy wątek
2019-02-10 12:33
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] << " ";
    }
}
edytowany 2x, ostatnio: furious programming, 2019-02-10 12:38

Pozostało 580 znaków

2019-02-10 13:07
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/Ja[...]or/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).


edytowany 1x, ostatnio: lion137, 2019-02-10 13:08

Pozostało 580 znaków

2019-02-10 17:34
0
exp_tab[j] != "/" || "+" || "-" || "*" || ")" || "("

To jest parsowane tak:

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

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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