Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    0

    [C++] Controllo input alfanumerico

    Ciao a tutti,
    per un progetto scolastico sto scrivendo un programma in C++ ad oggetti (nozioni base) per l’organizzazione e gestione di prodotti in un ipotetico magazzino.
    Sto riscontrando grosse difficoltà con la definizione del controllo input. Per rendere la scrittura più maneggevole ne ho fatto una classe a parte e creato il file .h
    La struttura indicativa da cui ci è stato indicato di partire è questa
    codice:
    template <class T>
    void Inserimento(T& a){                         
        std::cin.clear();;
        std::cin>>a;
        if(std::cin.fail()){
          std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
          Inserimento(a);
        }
    }

    ma è ovviamente molto generica e per nulla efficiente.
    Nel complesso del progetto, ho individuato tre diverse casistiche di input che devo verificare:
    - int per numeri
    - char per “scelta rapida” (y/n)
    - string per controllo sui prodotti del catalogo
    Nello specifico, ho pensato di sviluppare gli specifici controlli in base alla tipologia, così:
    codice:
    template <typename T>
    void Inserimento(){                         
      T ins;
      std::locale loc;
      std::string insStr, insInt;
      bool check=false;
      do{
        std::cin.clear();
        std::cin>>ins;
        //controllo int
        if(std::is_same<T, int>()){
          insInt = ins;
          for(int i=0; i<insInt.length(); i++){
        if(isdigit(insInt[i])) {
          check=true;
          if(check != true){
            std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
            std::cin.clear();
            check=false;
            break;}
        }
          }
        }
        //controllo char
        else if(std::is_same<T, char>()){
          if(std::isalpha(ins,loc)){
        check=true;}
          else{
        std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
        std::cin.clear();}
        }
       //controllo string
        if(std::is_same<T, std::string>()){
          insStr = ins;
          for(int i=0; i<insStr.length(); i++){
        if(isalpha(insStr[i])) {
          check=true;
          if(check!= true){
            std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
            std::cin.clear();
            check=false;
            break;}
        }
          }
        }
        else{
          std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
          std::cin.clear();
          check=false;
        }
      }while(check==false);
    }

    E’ una struttura che ha senso? Si può rendere più lineare? Come posso migliorarlo?

    Grazie a chiunque abbia voglia di darmi un consiglio

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,333
    ma è ovviamente molto generica e per nulla efficiente.


    No, è proprio sbagliata.

    Non puoi chiamare ricorsivamente la funzione/metodo in questo modo credendo che non succeda nulla.

    Devi includere il controllo in un ciclo che viene ripetuto se hai un errore.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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 © 2020 vBulletin Solutions, Inc. All rights reserved.