Input controllato

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Input controllato

    Dany30 ha scritto:


    Non conosco il C, potresti brevemente spiegare cosa hai fatto?
    Grazie!
    Il codice è già compatibile con C++, solo che non è lo stile di programmazione tipico di questo linguaggio.
    Viene prelevata la stringa di caratteri che immetti da tastiera e poi la funzione strtol() fa già tutto quello che hai chiesto: l'unico problema è che il C non ha le eccezioni e strtol() ha un return value uguale a zero per gli errori di conversione, per questo vedi il ciclo for finale che controlla che tu non abbia scritto esattamente zero.

    Prova a scrivere tu una strtol() dove fai i calcoli direttamente, e prova ad usare cin con la gestione degli errori, oppure segui una delle altre strade che ti hanno indicato
  • Re: Input controllato

    Cercherò di essere breve e coinciso, ho scritto un pezzo del programma, con le MIE CONOSCENZE...
    lo allego quì spiegando quello che ho fatto.
    Ho ragionato nel seguente modo:
    per qualsiasi base che l' utente immetterà passo prima per la base 10 e successivamente alla base finale eseguendo le divisioni ripetute.
    Per passare alla base 10 ho scritto una funzione nella quale faccio un for che va da I fino alla lunghezza della stringa(cioè numero1 ,al quale è passato l'argomento numero nel main), in questo modo ogni volta prendo il carattere del numero, iniziando da quello finale, e lo converto in intero, in modo che poi possa moltiplicare il numero ottenuto in intero per la base elevata all' esponente i, che se ricordate era proprio il contatore nel ciclo for. Tutti i prodotti saranno messi all' interno di una variabile somma e successivamente sommata e aggiornata con i valori della variabile conv.
    ES. 120 base 4 --> 0*4^0 , 2*4^1, 1*4^2, i risultati vengono progressivamente sommati nella variabile somma.
    Il problema è il seguente: ho il timore che abbia sbagliato a fare il casting, perché il ragionamento è corretto.
    Sto sviluppando solo il passaggio di transizione alla base 10, non incominciate a dire che non è completo...
    
    #include <iostream>
    #include <cmath>
    #include <string>
    using namespace std;
    int somma;
    int conversione(string numero1,int base_start1){
    	int cast,conv,lunghezza;
    	char carattere;
    	lunghezza=numero1.length();
    	for(int i=0;i<lunghezza;i++){
    		carattere=numero1[lunghezza-i]; // il carattere è alla posizione finale! 
    		cast=static_cast <int>(carattere);
    		conv=cast*pow(base_start1,i);
    		somma += conv;	
    	}return somma;
    }
    
    int main(){
    	int base_start,base_end;
    	string numero;
    	cout<<"Inserisci numero da convertire--> "<<endl; cin>>numero;
    	cout<<"Inserisci la base di partenza--> "<<endl;   cin>>base_start;
    	cout<<conversione(numero,base_start);
    	cout<<"Inseririsci la base di arrivo--> "; cin>>base_end;
    return 0;
    }
  • Re: Input controllato

    Usa i tag CODE per il codice !
  • Re: Input controllato

    Ho usato il tag code, ora credo sia più chiaro! Ciao!
  • Re: Input controllato

    
    long conversione(string numero1, long base_start1){
        long totale = 0, potenza = 1;
        for(int i = numero1.length() - 1; i >= 0; i--, potenza *= base_start1)
            totale += (long)(numero1[i] - '0') * potenza;	
        return totale;
    }
    
    Vai avanti
  • Re: Input controllato

    Grazie! Sono arrivato alla conclusione, non ho copiato il tuo codice l'ho riadattato a modo mio! Ciao!
  • Re: Input controllato

    Dany30 ha scritto:


    Grazie! Sono arrivato alla conclusione, non ho copiato il tuo codice l'ho riadattato a modo mio! Ciao!
    A logica prima si deve inserire la base, come in qualsiasi calcolatrice per programmatori, in modo che puoi controllare che l'utente inserisca caratteri validi.
    Comunque per chiudere in bellezza, ci fai vedere cosa hai fatto? grazie.
  • Re: Input controllato

    Il programma in C++ che segue fa una parte di quanto richiesto.
    Converte un numero decimale (base10) in un numero con una base a scelta.
    Il programma è flessibile, basta inserire in carattere[] la stringa che rappresenta la numerazione desiderata anche di fantasia, nell'esempio "0123456789ABCDEF"
    in Nbit, i bit massimi del numero che potrà essere inserito, nell'esempio 16.
    Il programma si adatta a queste due costanti calcolando la base massima e il numero massimo inseribile.
    Routine input controllato.
    Sto studiando, sono graditi corrrezioni e consigli per migliorare.
    Buone conversioni.
    
    #include <iostream>
    #include <math.h>
    #include <string.h>
    #include <conio.h>
    
    using namespace std;
    
    /************************************
     * C++ da decimale a base 2/BaseMax *
     ************************************/
    
     // input controllato, i tasti non ammessi non producono effetto
     // 0/9: accettati
     // ESC: esce dal programma
     // INVIO: accetta le cifre digitate (se fuori range ripete l'input)
     // BACKSPACE: annulla e ripete l'input
     // FRECCIA DESTRA: immette il numero massimo (solo se il valore attuale è zero)
    
    const char carattere[] = "0123456789ABCDEF"; // scegli la base massima e tipo numerazione modificando la stringa
    const unsigned short Nbit = 16; // scegli i bit elaborati (attenzione oltre 32 si eccede la capacità degli unsigned int)
    
    const unsigned short BaseMax = strlen(carattere); // base massima calcolata
    const unsigned int ValoreMax = pow(2,Nbit)-1; // max valore decimale a Nbit calcolato
    void DecToBase(unsigned int nDecimale, unsigned short base, char *Uscita); // convertitore
    unsigned int inputNum(char *Ascii); // input controllato
    
    int main(){
    
    riinput:
        unsigned int Ingresso = 0;
        unsigned short Base = 0;
        char Ascii[] = {0}; // verrà modificato da inputNum
        cout<<endl<<"************** CONVERSIONE NUMERI DECIMALI A "<<Nbit<<"BIT ******************"<<endl<<endl;
        while ((Base < 2) || (Base > BaseMax)){ // fuori range, riesegue
            do{
                cout<<"scegli in quale base vuoi la conversione 2/"<<BaseMax<<" -> ";
                Base = inputNum(Ascii);
            }while (Ascii[0] == (char)8); // backspace, riesegue
            if (Ascii[0] == (char)224){cout<<BaseMax; Base = BaseMax;} // freccia destra, immette valore max
            cout<<endl;
        }
        cout<<endl;
        do{
            do{
                cout<<"Digitare un numero decimale 0/"<<ValoreMax<<" -> ";
                Ingresso = inputNum(Ascii);
            }while (Ascii[0] == (char)8); // backspace, riesegue
            if (Ascii[0] == (char)224){cout<<ValoreMax; Ingresso = ValoreMax;} // freccia destra, immette valore max
            cout<<endl;
        }while(Ingresso > ValoreMax); // fuori range, riesegue
    
        char Uscita[Nbit+1]={carattere[0]}; // vettore che verrà riempito da DecToBase
        DecToBase(Ingresso, Base, Uscita); // routine calcolo base x
        cout<<endl<<Ingresso<<" in base "<<Base<<" vale: "<<Uscita<<endl;
    
        goto riinput;
        return 0;
    }
    
    void DecToBase(unsigned int _Decimale, unsigned short _Base, char *Uscita){
    
        int _LunVett = 0;
        short _Resto = 0;
    
        // il resto di MOD identifica il carattere
        while (_Decimale > 0){
            _Resto = _Decimale % _Base;
            Uscita[_LunVett] = carattere[_Resto]; // scelgo il carattere
            _Decimale = _Decimale / _Base; // per il prossimo calcolo
            _LunVett++; // indice del carattere
        }
        // inversione
        for (int _i = 0; _i < _LunVett / 2; _i++){
            swap (Uscita[_i],Uscita[_LunVett-_i-1]);
        }
    }
    
    unsigned int inputNum(char *Ascii){
    
        unsigned short _ascii = 0;
        unsigned int _cifra = 0;
    next:
        do{
                _ascii = getch (); // lettura tastiera
                Ascii[0] = _ascii; // ultimo tasto digitato pubblico
                if (_ascii == 27) {cout<<endl; exit(0);} // esc
                if (_ascii == 8) {cout<<endl; return 0;} // backspace
                if (_ascii == 224 && _cifra == 0) return 0; // freccia destra
        }while ((_ascii<'0' || _ascii>'9') && _ascii != 13);
    
        if (_ascii == 13){ // invio
            return _cifra; // ritorno risultato
        }
        else{
            cout<<_ascii - '0'; // visualizzazione tasto premuto
            _cifra = (_cifra * 10) + (_ascii - '0'); // calcolo del risultato
            goto next;
        }
    }
    
Devi accedere o registrarti per scrivere nel forum
22 risposte