Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572

    [C++] - input di tipo int - char

    ho un codice di questo tipo:
    codice:
    int n = 0;
    cout << "Inserire un numero intero: ";
    cin >> n;
    cout << "\n" << n+n;
    il tutto presume che l'utente inserisca un numero intero, ma se l'utente inserisce una stringa il programma crasha.
    come faccio a controllare il tipo di dato immesso, per poi eventualmente effetture la somma?
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  2. #2

    Re: [C++] - input di tipo int - char

    Originariamente inviato da Guglie
    ho un codice di questo tipo:
    codice:
    int n = 0;
    cout << "Inserire un numero intero: ";
    cin >> n;
    cout << "\n" << n+n;
    il tutto presume che l'utente inserisca un numero intero, ma se l'utente inserisce una stringa il programma crasha.
    come faccio a controllare il tipo di dato immesso, per poi eventualmente effetture la somma?
    puoi fare un controllo del genere...
    codice:
    int n=0;
    cout << "Inserire un numero intero : ";
    cin >> n;
    
    if ( n != (int)n  )  cout << "Numero non intero...";
              else     cout << "\n" << n+n;
    non so se nel codice scritto da me ,utilizzando il controllo con il casting, funziona pefettamente ...provalo, poi fammi sapere



    ps questo fatto č un dettaglio importante ma molto spesso viene tralasciato...lasciandolo al buon senso dell'utilizzatore del programma :gren:
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  3. #3

    Re: [C++] - input di tipo int - char

    Originariamente inviato da Guglie
    ho un codice di questo tipo:
    codice:
    int n = 0;
    cout << "Inserire un numero intero: ";
    cin >> n;
    cout << "\n" << n+n;
    il tutto presume che l'utente inserisca un numero intero, ma se l'utente inserisce una stringa il programma crasha.
    come faccio a controllare il tipo di dato immesso, per poi eventualmente effetture la somma?
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int n;
      cout << "Inserire un numero intero : ";
      cin >> n;
    
      if (cin.fail())
      {
        cout << "Numero non intero..." << endl;
        return 1;
      }
      
      cout << "\n" << n+n << endl;
    
      return 0;
    }

  4. #4

    Re: Re: [C++] - input di tipo int - char

    Originariamente inviato da internet
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int n;
      cout << "Inserire un numero intero : ";
      cin >> n;
    
      if (cin.fail())
      {
        cout << "Numero non intero..." << endl;
        return 1;
      }
      
      cout << "\n" << n+n << endl;
    
      return 0;
    }
    č standars cin.fail() ?? in ogni caso come ho fatto nn vā bene? controlla se l'intero letto(n) č diverso dal casting dell'n stesso.Se sono uguali si vede che č un valore int altrimenti no...nn vā?

    fammi sapere
    thz
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  5. #5
    ho provato la soluzione che hai proposto e praticamente l'espressione nell'if risulta sempre falsa anche mettendo stringhe di caratteri alfabetici.

    Mettendo dei caratteri come input dopo la
    cin >> n;
    la variabile n essendo di tipo int non viene modificata e assume lo stesso valore che aveva prima della cin, 0 nel caso del codice di Guglie
    0xBAADF00D nel caso mio che non l'ho inizializzata

    fail() č un metodo pubblico di

    codice:
    class basic_ios: public ios_base {
    public:
      ...
      bool good() const;    // next operation might succeed
      bool eof() const;     // end of input seen
      bool fail() const; // next operation will fail
      bool bad() const;     // stream is corrupted
      ...
    }
    dallo Stroustrup
    If the state is good() the previous input operation succeded. If the state is good(), the next input operation might succed; otherwise, it will fail. Applying an input operation to a stream that is not in the good() state is a null operation. If we try to read a variable v and the operation fails, the value of v should be unchanged (it is unchanged if v is a variabile of one of the type handled by istream or ostream member functions). The difference between the states fail() and bad() is subtle. When the state is fail() but not also bad(), it is assumed that the stream is uncorrupted and that no characters have been lost. When the state is bad(), all bets are off.

  6. #6
    Originariamente inviato da internet
    ho provato la soluzione che hai proposto e praticamente l'espressione nell'if risulta sempre falsa anche mettendo stringhe di caratteri alfabetici.

    Mettendo dei caratteri come input dopo la
    cin >> n;
    la variabile n essendo di tipo int non viene modificata e assume lo stesso valore che aveva prima della cin, 0 nel caso del codice di Guglie
    0xBAADF00D nel caso mio che non l'ho inizializzata

    fail() č un metodo pubblico di

    codice:
    class basic_ios: public ios_base {
    public:
      ...
      bool good() const;    // next operation might succeed
      bool eof() const;     // end of input seen
      bool fail() const; // next operation will fail
      bool bad() const;     // stream is corrupted
      ...
    }
    dallo Stroustrup
    If the state is good() the previous input operation succeded. If the state is good(), the next input operation might succed; otherwise, it will fail. Applying an input operation to a stream that is not in the good() state is a null operation. If we try to read a variable v and the operation fails, the value of v should be unchanged (it is unchanged if v is a variabile of one of the type handled by istream or ostream member functions). The difference between the states fail() and bad() is subtle. When the state is fail() but not also bad(), it is assumed that the stream is uncorrupted and that no characters have been lost. When the state is bad(), all bets are off.
    ah io xchč in genere programmo in C quindi usando scanf("%d",&n); il controllo con casting da me fatto č giusto? mi spieghi l'errore logico che ho fatto?
    Per capire anche se nn č importantissimo

    Grazie mille
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  7. #7
    allora in C
    il codice sarebbe questo
    codice:
    #include <stdio.h>
    
    int main()
    {
      int n = 0;
      printf("Inserire un numero intero : ");
      
      scanf("%d", &n);
    
      if (n != (int) n)
      {
        printf("Numero non intero...\n");
        return -1;
      }
      
      printf("\n%d\n", n+n);
    
      return 0;
    }
    inserendo come primo carattere qualsiasi cosa che non sia un numero, scanf non modificherā la variabile n, per cui, essendo n = 0

    if (0 != (int) 0)

    č falsa e il controllo passera alla riga

    printf("\n%d\n", n+n);

    un soluzione corretta in C
    codice:
    #include <stdio.h>
    
    int main()
    {
      int n = 0, i;
      printf("Inserire un numero intero : ");
      
      /* restituisce il numero di argomenti in input assegnati */
      i = scanf("%d", &n);
    
      if (i != 1)
      {
        printf("Numero non intero...\n");
        return -1;
      }
      
      printf("%d\n", n+n);
      
      return 0;
    }
    dall'ANSI C
    The scanf function returns the number of input items assigned, which can be fewer than provided for, or even zero, in the event of an early matching failure.

    inserendo come primo carattere qualsiasi cosa che non sia un numero, scanf restituirā 0, perchč ho specificato che va letto un intero "%d"

    mentre se inserisco un numero, scanf restituirā 1


    un numero definito in grammatica BNF č
    <numero> ::= <cifra> | <cifra> <numero>
    <cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

  8. #8
    Originariamente inviato da internet
    allora in C
    il codice sarebbe questo
    codice:
    #include <stdio.h>
    
    int main()
    {
      int n = 0;
      printf("Inserire un numero intero : ");
      
      scanf("%d", &n);
    
      if (n != (int) n)
      {
        printf("Numero non intero...\n");
        return -1;
      }
      
      printf("\n%d\n", n+n);
    
      return 0;
    }
    inserendo come primo carattere qualsiasi cosa che non sia un numero, scanf non modificherā la variabile n, per cui, essendo n = 0

    if (0 != (int) 0)

    č falsa e il controllo passera alla riga

    printf("\n%d\n", n+n);

    un soluzione corretta in C
    codice:
    #include <stdio.h>
    
    int main()
    {
      int n = 0, i;
      printf("Inserire un numero intero : ");
      
      /* restituisce il numero di argomenti in input assegnati */
      i = scanf("%d", &n);
    
      if (i != 1)
      {
        printf("Numero non intero...\n");
        return -1;
      }
      
      printf("%d\n", n+n);
      
      return 0;
    }
    dall'ANSI C
    The scanf function returns the number of input items assigned, which can be fewer than provided for, or even zero, in the event of an early matching failure.

    inserendo come primo carattere qualsiasi cosa che non sia un numero, scanf restituirā 0, perchč ho specificato che va letto un intero "%d"

    mentre se inserisco un numero, scanf restituirā 1


    un numero definito in grammatica BNF č
    <numero> ::= <cifra> | <cifra> <numero>
    <cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    chiarissimo...il problema č che io nn sapevo che la funzione di lettura( scanf in C o cin in C++) NON MODIFICANO LA VARIABILI SE quello che si digita NON E' DEL TIPO SPECIFICATO

    Grazie mille

    ps ho visto che hai scritto al termine un esempio in BNF...mi servirebbe una guida-sito,ecc..,insomma qualche cosa che faccia degli esempi utilizzando questa notazione specialmente dei cicli di programmazione(for if then else while do do while ecc)
    Ti sarei veramente grato
    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  9. #9
    Utente di HTML.it L'avatar di Guglie
    Registrato dal
    Dec 2002
    Messaggi
    1,572
    wow, grazie delle risposte celeri!!
    adesso provo
    powered by GNU/Linux Gentoo
    A Elbereth Gilthoniel o menel palan-diriel, le nallon sí di-nguruthos! A tiro nin, Fanuilos!

  10. #10
    Originariamente inviato da Guglie
    wow, grazie delle risposte celeri!!
    adesso provo


    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.