Domanda Risolto Array di caratteri con numeri a più di una cifra

Stato
Discussione chiusa ad ulteriori risposte.

Showme

Utente Silver
26 Settembre 2017
112
18
23
59
Salve ragazzi, rieccomi con un altra domanda...
Sto cercando di creare un programma che presi in input dei caratteri li vada a mettere in un array di caratteri, il problema è che i caratteri che devo andare a mettere nell'array
sono dei numeri con più di una cifra, ad esempio (18 ,22 ecc...) e dei simboli (+, -, *, /). In sostanza quando vado a stampare l'array deve venire fuori un espressione algebrica del tipo (33+4-7).
Ho provato a scrivere un codice ma quando stampa, mi escono fuori simboli strani al posto dei numeri, e sono sicuro che il problema stia nella conversione che vado ad applicare, ma non riesco a venirne a capo...
C++:
#include <iostream>

using namespace std;




int main()
{

    char array[3];

    char c;

    for(int i = 0; i < 3; i++)
    {
        cin >> noskipws >> c;
        if(i == 0) //Se i = 0 allora ho sicuramente un numero (tralascio l'invalid input)
        {
            array[i] = c-'0';
        }
        if('0' <= array[i-1] && array[i-1] <= '9' && '0' <= c && c <= '9') //Se nel posto precedente ho un numero, e il carattere inserito è un numero allora moltiplico x 10 e sommo il carattere
        {
            array[i-1] = ((array[i-1] * 10) + (c -'0')); //Credo che il problema dipenda da quella moltiplicazione (char * int)
            i--; //Torno indietro di uno visto che sto andando a modificare il precedente senza aggiungere nulla al posto successivo
        }
        if(array[i-1] == '+' || array[i-1] == '*' || array[i-1] == '/' || array[i-1] == '-') //Se nella posizione precedente ho un simbolo allora devo mettere un numero, quindi sottraggo il val di '0'
        {
            array[i] = c-'0';
        }
        if(c == '+' || c == '*' || c == '/' || c == '-') //Se sono dei simboli non sottraggo il valore di '0'
        {
            array[i] = c;
        }

    }

    cout << endl;

    for(int j=0; j < 3; j++) //Ciclo di stampa
    {
        cout << array[j] << " ";
    }




    return 0;
}

avete qualche consiglio da darmi?
Grazie ;D
 
Ultima modifica:
non so se stai facendo un esercizio che ti pone dei limiti in quello che puoi usare...
io l'input lo prendei come stringa sinceramente , e non lavorerei con i char che hanno un limite basso (-128,127)

prenderei l'input come stringa e lo passerei ad int con strtoi o atoi (#include <cstdlib> mi pare)
poi conserverei in un array di char solo le operazioni che vengono inserite (*,+,-,/) e una volta ricevute tutte le informazioni potrai fare l'operazione..

se non hai limiti posti dall'esercizio puoi usare anche qualcosa di più "avanzato" come i vector per contenere i dati , e fare una struttura chiamata ad esempio
infoOperazione che contiene due numeri come int (il primo input e il secondo) e un tipo di operazione che invece è un char..
poi non lo so dipende da quanto vuoi fare "avanzato" il codice


edit:
comunque ho scordato di dire che il problema nel tuo codice ovviamente è che stai confondendo il carattere '0' ('1','2' ecc..) con il numero 0,1,2..
infatti nella tabella ascii il carattere '0' in valore numeri char equivale a 48 se non ricordo male... quindi non puoi fare direttamente operazione sull'input che hai preso ma devi prima convertirlo in veri numeri int/char (dove 0 è 0 e 1 è 1...) altrimenti fare operazioni sul carattere 48 ('0') moltiplicandolo per 10 ad esempio , darebbe 480 (che è numerical overflow visto che il char ha valore massimo 127)

per informazione aggiungo che il carattere char 0 (char carattere = 0; ) altri non è che il terminatore di stringa (aka nullchar) ovvero il carattere nullo...
 
Ultima modifica:
Vorrei farlo con gli array anche per capire come fare a risolvere quel problema, cioè trattare il char in base a quello che devo fare..
 
non so se stai facendo un esercizio che ti pone dei limiti in quello che puoi usare...
io l'input lo prendei come stringa sinceramente , e non lavorerei con i char che hanno un limite basso (-128,127)

prenderei l'input come stringa e lo passerei ad int con strtoi o atoi (#include <cstdlib> mi pare)
poi conserverei in un array di char solo le operazioni che vengono inserite (*,+,-,/) e una volta ricevute tutte le informazioni potrai fare l'operazione..

se non hai limiti posti dall'esercizio puoi usare anche qualcosa di più "avanzato" come i vector per contenere i dati , e fare una struttura chiamata ad esempio
infoOperazione che contiene due numeri come int (il primo input e il secondo) e un tipo di operazione che invece è un char..
poi non lo so dipende da quanto vuoi fare "avanzato" il codice


edit:
comunque ho scordato di dire che il problema nel tuo codice ovviamente è che stai confondendo il carattere '0' ('1','2' ecc..) con il numero 0,1,2..
infatti nella tabella ascii il carattere '0' in valore numeri char equivale a 48 se non ricordo male... quindi non puoi fare direttamente operazione sull'input che hai preso ma devi prima convertirlo in veri numeri int/char (dove 0 è 0 e 1 è 1...) altrimenti fare operazioni sul carattere 48 ('0') moltiplicandolo per 10 ad esempio , darebbe 480 (che è numerical overflow visto che il char ha valore massimo 127)

per informazione aggiungo che il carattere char 0 (char carattere = 0; ) altri non è che il terminatore di stringa (aka nullchar) ovvero il carattere nullo...


No ma appunto so che '0' vale 48, infatti il problema sta che non posso moltiplicarlo per 10, ma non so allora come andare ad inserire un ipotetico 22 all'interno del mio array di caratteri, deve essere di caratteri perché deve contenere anche i simboli.. questo è il problema.
Dopo aver fatto ciò devo pure farci operazioni all'interno
 
Ultima modifica:
ho visto comunque che usi fare c - '0' che in qualche modo dovrebbe portare alla conversione da ascii number a numero intero ...
quindi vuoi usare necessariamente l'array di char di 3 elementi? con 3 elementi come fai a fare due numeri di due cifre e l'operazione?
se ho ben capito vuoi salvare l'input del primo numero nel primo char e poi l'operazione e l'altro numero nel secondo e nel terzo , giusto?
se cosi fosse ti consiglio un cambiamento del genere..

Codice:
    for(int i = 0; i < 3 ;)
    {
        cin >> c;
     
        if(c == '.')
            break;
     
        if(isdigit(c) && i != 1 )
        {
            if(array[i] != 0)
                array[i]*=10;
             
            array[i] += c - '0';
        }
     
        else if(!isdigit(c) && i == 0)
        {
            array[++i] = c;
            i++;
        }
     
        else
        {
            cout << "invalid input... " << (i == 1 ? "insert a operation (+,-,*,/)": "insert a number") << endl;
        }
    }

con questo ciclo puoi ottenere i numeri e l'operazione correttamente (per interrompere l'input perchè il secondo numero è finito basta digitare il "." a fine inserimento del calcolo..

il resto lo lascio sviluppare a te

ps: per usare isdigit (che verifica che il carattere sia numerico) devi includere cstdlib





edit :

se vuoi liberarti dell'array di char puoi fare in questo modo... (credo sia abbastanza chiaro , se non capisci qualcosa dimmelo)
C++:
#include <cstdlib>
#include <iostream>

using namespace std;


#define IS_OPERATOR_SYMB(symb) ((symb=='*' || symb == '+' || symb == 47 || symb == '-'  )?true:false)

char c =0;

struct Calcolo
{
    int first_number,second_number;
    char operation_symb;
  
    Calcolo() : first_number(0) , second_number(0) , operation_symb('+')
    {
    }
};

int main()
{
    Calcolo nCalcolo;
    bool firstInputHappened = false;
  
    for(int i = 0; i < 3 ;)
    {
        cin >> c;
      
        if(c == '.')
            break;
      
        if(isdigit(c) && i != 1 )
        {
            int& rNumber = (i==0?nCalcolo.first_number : nCalcolo.second_number);
          
            if(rNumber != 0)
                rNumber *= 10;
              
            rNumber += (int) (c-'0');
          
            if(!firstInputHappened)
                firstInputHappened= true;
        }
      
        else if(!isdigit(c) && i == 0 && IS_OPERATOR_SYMB(c) && firstInputHappened)
        {
            nCalcolo.operation_symb = c;
            i = 2;
        }
      
        else
        {
            cout << "invalid input... " << (i == 2 ? "insert a number":(nCalcolo.first_number!=0?"insert a operation (+,-,*,/)": "insert number")) << endl;
        }
    }
  
    cout << "first number [" << nCalcolo.first_number << "], operation char[" << nCalcolo.operation_symb << "] , second number[" << nCalcolo.second_number << "]" << endl;
  
}
 
Ultima modifica:
forse ti interessa anche quest'altro listato un pò più complesso..
riesce a calcolare le variabili mancanti tramite le relazioni che tu gli passi..
tipo se tu dici a = 10 , b = 11 , poi gli passi a*c=b e a+d=b lui ti calcola c e d , il tutto in maniera automatica..
trall'altro dal define iniziale puoi cambiare il numero di variabili totali senza dover toccare nulla nel codice..
puoi anche decidere di passare solo 2 variabili e 50 relazioni con le quali poter calcolare tutte le 30 variabili mancanti..
il codice se trova modo di calcolare anche solo 1 variabile che prima non aveva , riesamina tutte le relazioni alla ricerca di qualche possibilità di calcolo di altre variabili.. insomma pur non essendo lungo , 380 line mi pare , riesce a fare parecchio..

https://www.inforge.net/forum/threads/simulatore-di-calcolo-dinamico-in-c.488006/post-4813748
 
Scusa se ti rispondo cosi tardi ma ho dovuto finire un altra cosa ieri, ho inserito il codice nel programma e risulta che da lo stesso errore nel mio, cioè una volta assunti i numeri nel momento di stampa escono dei simboli, perché appunto non si può moltiplicare (ad esempio nel tuo codice array*10) come appunto lo era per il mio, penso che proverò con le stringhe oppure con il secondo che mi hai mandato.
Grazie :D

P.S. Ho dato un occhiata al link che mi hai mandato ed effettivamente è molto interessante, solo poche righe di codice e riesce a fare quelle cose
 
Ultima modifica:
Scusa se ti rispondo cosi tardi ma ho dovuto finire un altra cosa ieri, ho inserito il codice nel programma e risulta che da lo stesso errore nel mio, cioè una volta assunti i numeri nel momento di stampa escono dei simboli, perché appunto non si può moltiplicare (ad esempio nel tuo codice array*10) come appunto lo era per il mio, penso che proverò con le stringhe oppure con il secondo che mi hai mandato.
Grazie :D


P.S. Ho dato un occhiata al link che mi hai mandato ed effettivamente è molto interessante, solo poche righe di codice e riesce a fare quelle cose
Entrambi gli script che ti ho postato ieri sono testati e funzionanti... Sicuro di non aver modificato nulla prima del tuo test?
Per printare i char con cout per vederci il valore (e non i simboli ) devi castarlo a int
(int)variabile_char

*edit
penso che il vero problema sia come ti fai printare a schermo questi value dei char..
se li printi senza cast a int ovviamente ti printa il corrispondente carattere al valore del char nella tabella ascii...
ma a prescindere io fossi in te userei il secondo script che ti fa usare gli int come tipo di dato, del resto se operi con i numeri da input non puoi sapere se inseriscono un numero > di 127 (tranne che tu non avverta prima dell input di ciò)

poi potresti anche guardarti l'altro script che ho scritto nell'altra discussione sul calcolo dinamico per vedere come prendo in input il valore delle variabili , e fare in quel modo li

Inviato dal mio LG-H870 utilizzando Tapatalk
 
Scusami magari sono io che sto sbagliando, ma se devo fare il cast da char a int dovrei fare ad esempio:

int intero;
char carattere = array[1]; (ad esempio)
intero = (int)carattere;

questo per ogni numero, quindi poi mi ritrovo ad avere i numeri in delle variabili e poi l'array come lo avevo lasciato o sbaglio?
 
Ultima modifica:
Scusami magari sono io che sto sbagliando, ma se devo fare il cast da char a int dovrei fare ad esempio:

int intero;
char carattere = array[1]; (ad esempio)
intero = (int)carattere;

questo per ogni numero, quindi poi mi ritrovo ad avere i numeri in delle variabili e poi l'array come lo avevo lasciato o sbaglio?
Puoi tranquillamente fare
cout << (int)array ;
Non verrà modificato in alcun modo il valore di array

Inviato dal mio LG-H870 utilizzando Tapatalk
 
ah si questo sicuramente, ma in questo modo riesco pure a fare delle operazioni all'interno dell'array? (pur avendo dei char)
 
ah si questo sicuramente, ma in questo modo riesco pure a fare delle operazioni all'interno dell'array? (pur avendo dei char)
No il cast ti serve solo quando vai a printare i char, per il resto non serve fare cast.. I char sono numeri , tranne quando li printi che diventano caratteri corrispondenti alla tab ascii , ed ecco perché per printare il numero di una variabile char con cout si deve fare il cast...
Comunque entrambi gli script che ti ho mandato completano l operazione di input delle informazioni... A te non resta che fare uno switch con i vari casi di operazione e eseguire il calcolo , printando il risultato con il cast a int

Inviato dal mio LG-H870 utilizzando Tapatalk
 
Stato
Discussione chiusa ad ulteriori risposte.