Stringhe C++ Trova l'errore! (sto impazzendo)

di il
23 risposte

Stringhe C++ Trova l'errore! (sto impazzendo)

Salve, sarò breve:

#include <iostream>
#include <cmath>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;


double conv(string prova)
{
    stringstream ss(prova);
    double s_to_i;
    ss >> s_to_i;
    return s_to_i;
}



string sost(string prova5)
{
    int meno;
    do
    {
    meno = prova5.find("-");
    if(meno!=-1)
    {
        prova5.replace(meno, 1, "+m");
    }
    }while(meno!=-1);

    prova5.replace(prova5.find("="), 1, "+=");
    return prova5;
}



string unsost(string prova10)
{
    do
    {
        if(prova10.find("m")!=-1)
        {
            prova10.replace(prova10.find("m"), 1, "-");
        }
    }while(prova10.find("m")!=-1);
    return prova10;
}



int separ(string prova3)
{
    if(prova3.find("+")!=-1)
    {
        int prova4=prova3.find("+");
        return prova4;
    }
    else
    {
        return -1;
    }
}



string spezz(int prova9, string prova7)
{
    if(separ(prova7)!=0)
    {
    while(prova9!=0)
    {
        prova9--;
        prova7.erase(0, separ(prova7)+1);
    }
    string prova6=prova7.substr(0, separ(prova7));
    return prova6;
    }
    else
    {
        return 0;
    }
}


int main()
{
    string equazione;
    cout << "Inserisci la tua equazione: ";
    cin >> equazione;

    int lunghezza = equazione.length();
    int ugu = equazione.find("=");
    if(ugu == -1)
    {
        equazione.replace(lunghezza, 1, "=0");
    }
    equazione = sost(equazione);
    lunghezza = equazione.length();
    equazione.replace(lunghezza, 1, "+");
    cout << "Equazione ricevuta: " << equazione << endl;
//FINE SOSTITUZIONI INIZIALI

    string equa_p=equazione.substr(0, equazione.find("="));
    string equa_d=equazione.substr(equazione.find("=")+1, equazione.length());
//DIVISIONE DELL'EQUAZIONE IN PRIMA DELL'UGUALE E DOPO DELL'UGUALE
    if(equa_d.find("m")==1)
    equa_d.replace(0, 2, "m");



    string eq_p[100], eq_d[100];
    double coeffx[100], coeffnoto[100];
    int quant1=0, quant2=0, quantx=0, quantnoto=0;

    cout << "prima della sostituzione: " << equa_d << endl;
    cout << "prima della sostituzione: " << equa_p << endl;

    equa_d=unsost(equa_d); // sostituzione dell m con - al secondo membro
    cout << "dopo la sostituzione: " << equa_d << endl;
    equa_p=unsost(equa_p); // sostituzione dell m con - al primo membro
    cout << "dopo la sostituzione: " << equa_p << endl;

    size_t ndopo = count(equa_d.begin(), equa_d.end(), '+');
    size_t nprima = count(equa_p.begin(), equa_p.end(), '+');
    int i;
    for(i=0;i<(ndopo+nprima);i++)
        {
            eq_d[i]=spezz(i, equa_d);
            if(eq_d[i]!="0")
                quant1++; // secondo membro

            eq_p[i]=spezz(i, equa_p);
            if(eq_p[i]!="0")
                quant2++; // primo membro
        }
 for(i=0;i<quant1;i++)
        {
            if(eq_d[i].find("x")!=-1)
            {
                coeffx[quantx]=conv(eq_d[i])*-1;
                quantx++;
            }
            else
            {
                coeffnoto[quantnoto]=conv(eq_d[i])*-1;
                quantnoto++;
            }
        }
for(i=0;i<quant2;i++)
        {

            if(eq_p[i].find("x")!=-1)
            {
                coeffx[quantx]=conv(eq_p[i]);
                quantx++;
            }
            else
            {
                coeffnoto[quantnoto]=conv(eq_p[i]);
                quantnoto++;
            }
            cout << i << " , "; 			//SE IL COUT VIENE TOLTO DAL COMMENTO IL RISULTATO CAMBIA
        }


double sommax=0, sommanoto=0;

    for(i=0;i<quantx;i++){
        sommax+=coeffx[i];}
        cout << sommax << endl;

    for(i=0;i<quantnoto;i++){
        sommanoto+=coeffnoto[i];}
        cout << sommanoto << endl;

    return 0;
}
questo è il programma che ho creato, serve per "provare a risolvere equazioni", il suo funzionamento è questo: una volta inserita l'equazione (tipo string), dato che dopo ogni termine si trova un + o un - (per iniziare ho preferito usare solo + e -), nel caso ci fosse un - lo sostituisce con "+m" (la emme la risostituisco dopo con la funzione 'unsost').
In questo modo fra due + c'è sempre un termine, che viene separato e preso singolarmente dal programma.
Successivamente ogni termine viene trasformato da string a double e messo in un array (coeffnoto); se nella stringa si trovava una x, viene tolta e il numero double viene messo in un array a parte (coeffx).
Dopo di che, il mio intento era quello di fare i calcoli con i numeri e ridare il risultato, ma non capisco perché i calcoli sono sbagliati!
In particolare nel punto dove c'è:
 cout << i << " , "; 
(verso la fine del programma)
se questo cout viene commentato (//) il risultato è uno, se non viene commentato è un'altro!!!!
E non capisco perché il cout influisce sul programma, è una settimana che provo a risolverlo da solo, ma non ce la faccio.
Ringrazierò a vita chi mi può aiutare!!! Accetto qualsiasi consiglio anche sulla struttura del programma!!
Grazie mille! (non sono stato breve come avevo detto inizialmente)

23 Risposte

  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Ma con quale input hai provato? Quale equazione hai inserito?
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Ad esempio 12x+4=0
    Il risultato della x è 12 ed è giusto ma la somma dei termini noti è 8, quando invece è 4 (4+0)
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Io ho questo output

    Inserisci la tua equazione: 12x+4=0
    Equazione ricevuta: 12x+4+=0+
    prima della sostituzione: 0+
    prima della sostituzione: 12x+4+
    dopo la sostituzione: 0+
    dopo la sostituzione: 12x+4+
    0 , 1 , 2 , 12
    0


    Questo 8 dove lo vedi?
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    A me da questo:

    Inserisci la tua equazione: 12x+4=0
    Equazione ricevuta: 12x+4+=0+
    prima della sostituzione: 0+
    prima della sostituzione: 12x+4+
    dopo la sostituzione: 0+
    dopo la sostituzione: 12x+4+
    0 , 1 , 2 , 12
    4

    Process returned 0 (0x0) execution time : 5.906 s
    Press any key to continue.


    se invece commento quel cout, senza modificare altro e inserendo esattamente gli stessi caratteri mi dà

    Inserisci la tua equazione: 12x+4=0
    Equazione ricevuta: 12x+4+=0+
    prima della sostituzione: 0+
    prima della sostituzione: 12x+4+
    dopo la sostituzione: 0+
    dopo la sostituzione: 12x+4+
    12
    8

    Process returned 0 (0x0) execution time : 5.906 s
    Press any key to continue.
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Se commento la cout ottengo correttamente

    Inserisci la tua equazione: 12x+4=0
    Equazione ricevuta: 12x+4+=0+
    prima della sostituzione: 0+
    prima della sostituzione: 12x+4+
    dopo la sostituzione: 0+
    dopo la sostituzione: 12x+4+
    12
    0


    Quale compilatore usi?
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Code::Blocks
    E comunque il risultato dovrebbe essere 12 e 4
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Prima dovresti capire perché la variabile

    quantnoto

    assume valore 4 (ma non ci sono 4 valori noti).

    Controlla il tuo algoritmo.
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    4 è la variabile sommanoto, ottenuta sommando tutti i valori di coeffnoto, nell'ultimo ciclo for, ho fatto un po' di prove e ho visto che la parte dei coefficienti con la x funziona sempre, quindi è solo la parte dei termini noti a dare problemi.
    In più facendo un po' di prove ho visto anche che il risultato (sommanoto) è sempre il doppio del risultato giusto, se metti 3x+8=0 ti darà 3 e 16 e così via
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Però non trovo l'errore
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Ripeto ... la variabile quantnoto assume un valore sbagliato. Se i termini noti sono 2, la variabile vale 4 ... devi trovare perché succede questo.
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Ciao, non conoscendo alcune delle librerie/funzioni che hai utilizzato (e non avendo adesso voglia di studiarmele ) non sono in grado di dirti dove sia il bug (o meglio l'heisenbug, da quello che racconti ), ma se lo scopo è quello di risolvere delle semplici equazioni di primo grado ti posso assicurare che il tutto può essere fatto molto più semplicemente.

    Per esempio sarebbe sufficiente scorrere la stringa s dell'equazione per ottenere una seconda stringa, chiamiamola t, contenente l'equazione "formattata", per poi ottenere il coefficiente e il termine noto scorrendo quest'ultima una sola volta.

    Seguendo la mia idea, la formattazione consiste nel:
    - inserire "+" all'inizio;
    - inserire "+" subito dopo lo "=";
    - inserire "+" prima dei "-";
    - inserire "1" prima delle "x" senza coefficiente.

    Per esempio:
    s --> 388-50x=+x-9
    t --> +388+-50x=++1x+-9

    Siano poi a, b ed n 3 variabili intere inizializzate a 0 che rappresentano rispettivamente il coefficiente della x, il termine noto ed il generico numero dell'equazione.
    A questo punto basta scorrere t al contrario ed agire di conseguenza in base a quello che troviamo:
    una cifra --> aggiorniamo il valore di n;
    - --> cambiamo n di segno;
    x --> impostiamo un flag (variabile booleana) a true;
    + --> in base al valore del flag aggiorniamo a o b. Resettiamo poi il flag ed n;
    = --> cambiamo a e b di segno.
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Grazie per il feedback, cmq intendevo qualcosa del genere:
    #include <iostream>
    
    using namespace std;
    
    string formatta_stringa(const string &s_in)
    {
        string s_out;
        s_out.push_back('+');
        for(unsigned int i = 0; i < s_in.size(); ++i)
        {
            if(s_in[i] == '-')
            {
                s_out.push_back('+');
            }
            else if(s_in[i] == 'x' && (!i || (s_in[i - 1] < '0' || s_in[i - 1] > '9')))
            {
                s_out.push_back('1');
            }
            s_out.push_back(s_in[i]);
            if(s_in[i] == '=')
            {
                s_out.push_back('+');
            }
        }
        return s_out;
    }
    
    int main()
    {
        int a = 0; //COEFFICIENTE
        int b = 0; //TERMINE NOTO
        int n = 0;
        int m = 1;
        bool flag = false;
        string s;
        cout << "EQUAZIONE --> ";
        cin >> s;
        s = formatta_stringa(s);
        for(int i = s.size() - 1; i >= 0; --i)
        {
            if(s[i] == 'x')
            {
                flag = true;
            }
            else if(s[i] == '=')
            {
                a *= -1;
                b *= -1;
            }
            else if(s[i] == '-')
            {
                n *= -1;
            }
            else if(s[i] == '+')
            {
                if(flag)
                {
                    a += n;
                }
                else
                {
                    b += n;
                }
                n = 0;
                m = 1;
                flag = false;
            }
            else
            {
                n += m * (s[i] - '0');
                m *= 10;
            }
        }
        if(a)
        {
            cout << "x = " << (double)-b / a;
        }
        else
        {
            if(b)
            {
                cout << "EQUAZIONE IMPOSSIBILE";
            }
            else
            {
                cout << "EQUAZIONE INDETERMINATA";
            }
        }
    }
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Ciao, scusa se non ti ho risposto ma mi ero totalmente dimenticato, avevo qualche domanda da farti:

    1. che fa la funzione push_back()?
    2. non so cosa vuoldire const string &s_in a cosa serve il &?
    3. perchè se l'equazione immessa è una variabile di tipo string tu la tratti come array?
    4. Questa condizione cosa serve a escludere?
    (s_in[i - 1] < '0' || s_in[i - 1] > '9'))
    Ti faccio tutte queste domande perché sono ancora un novellino
    Scusami ancora tantissimo se ti ho risposto solo adesso

    Grazie.
    -Ario
  • Re: Stringhe C++ Trova l'errore! (sto impazzendo)

    Se non conosci i ancora questi argomenti che senso ha usare quel codice fatto da altri con altro livello di conoscenze?
Devi accedere o registrarti per scrivere nel forum
23 risposte