Imparare il C++ , cin

di il
8 risposte

Imparare il C++ , cin

Sto esaminando la seguente porzione di codice C++ riportata su un testo di studio:

int base, ris, cifra;
char c;
cout << "scrivi la base del numero";
cin >> base;
cout << "scrivi il numero in base " << base;
cin >> c;

ris = 0;
cifra = c - '0';

while (cifra>=0 && cifra<base)
{
ris=ris*base+cifra;
cin.get(c);
cifra = c -c'0';
}


In sostanza dato il numero X in base Y si converte X dalla base Y alla base 10.
Ciò che non capisco è l'input del numero, perché secondo voi è stata utilizzata l'istruzione cin>>c e successivamente cin.get(c) ? Che senso ha?
La funzione 'cin >> c', se non capisco male, ignora gli spazi e restituisce il primo carattere digitato poiché 'c' è di tipo char.
Nel caso il primo carattere digitato fosse un valore numerico esterno all'intervallo 0 e 'base' il ciclo while non verrebbe mai eseguito, mentre se lo fosse verrebbe invocata la cin.get(c) fin quando la cifra immessa non sarà esterna all'intervallo.
Se base fosse 6 e volessi digitare il valore 1234 dovrei inserire 1 (invio), 2 (invio), 3 (invio), 4 (invio) ? Corretto?




Non avrei potuto costruire un ciclo con solo cin.get(c) dove controllavo

8 Risposte

  • Re: Imparare il C++ , cin

    L'input avviene con

    1234 (invio)

    perché il primo carattere va in c e gli altri sono estratti dal buffer dalle get ripetute (compreso invio che fa terminare il ciclo, anche se solo dopo essere stato assegnato a cifra ...)
  • Re: Imparare il C++ , cin

    oregon ha scritto:


    L'input avviene con

    1234 (invio)

    perché il primo carattere va in c e gli altri sono estratti dal buffer dalle get ripetute (compreso invio che fa terminare il ciclo, anche se solo dopo essere stato assegnato a cifra ...)
    Se non capisco male la cin.get preleva il carattere dal buffer dove è posizionato il puntatore ed immagino solo nel caso il buffer sia vuoto chiederà di inserire un valore.
    Mi chiedo se non avessi utilizzato 'cin >> c' per l'inserimento ma solo 'cin.get(c)' avrei potuto fare la stessa cosa?
    La cin.get(c) dovrebbe restituirmi comunque il carattere presente nel buffer dopodiché fa avanzare il relativo puntatore, quindi alla successiva chiamata mi restituirebbe il secondo carattere e così via. Corretto il mio ragionamento?
  • Re: Imparare il C++ , cin

    In quel caso la prima get avrebbe estratto il carattere invio del precedente cin e non avrebbe funzionato
  • Re: Imparare il C++ , cin

    Se non capisco male la cin.get preleva il carattere dal buffer dove è posizionato il puntatore ed immagino solo nel caso il buffer sia vuoto chiederà di inserire un valore.
    Esatto.
    Mi chiedo se non avessi utilizzato 'cin >> c' per l'inserimento ma solo 'cin.get(c)' avrei potuto fare la stessa cosa?
    Intendi rimuovere la riga "'cin >> c" o sostituirla con "cin.get(c)'"?


    Supposto che il numero c inserito sia corretto (ossia una sequenza di cifre minori della base), il programma potrebbe essere impostato nel seguente modo che ritengo più chiaro:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int base;
        int ris = 0;
        int cifra;
        char c;
        cout << "BASE: ";
        cin >> base;
        cout << "NUMERO: ";
        cin >> c;
        while(c != '\n')
        {
            cifra = c - '0';
            ris = ris * base + cifra;
            cin.get(c);
        }
        cout << "RISPOSTA: " << ris;
    }
  • Re: Imparare il C++ , cin

    Nippolo ha scritto:


    Intendi rimuovere la riga "'cin >> c" o sostituirla con "cin.get(c)'"?
    Intendo cambiare completamente approccio rimuovendo la riga e basandomi solo su cin.get(c) eliminando cin>>c.
    Quindi inserendo al primo ciclo di cin.get(c) l'intero valore ed ai successivi estraendone gli altri caratteri.
  • Re: Imparare il C++ , cin

    oregon ha scritto:


    In quel caso la prima get avrebbe estratto il carattere invio del precedente cin e non avrebbe funzionato
    infatti la prima cin la toglierei.
  • Re: Imparare il C++ , cin

    C'è cmq la riga cin >> base che lascia il carattere newline nel buffer. Affinché tale carattere sia ignorato e il successivo get funzioni correttamente dovresti chiamare la funzione cin.ignore() per svuotare il buffer.

    Una cosa del genere insomma:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int base;
        int ris = 0;
        int cifra;
        char c;
        cout << "BASE: ";
        cin >> base;
        cin.ignore();
        cout << "NUMERO: ";
        while(true)
        {
            cin.get(c);
            if(c == '\n')
            {
                break;
            }
            cifra = c - '0';
            ris = ris * base + cifra;
        }
        cout << "RISPOSTA: " << ris;
    }
  • Re: Imparare il C++ , cin

    Chiarissimo, grazie
Devi accedere o registrarti per scrivere nel forum
8 risposte