Algoritmo esadecimale

di il
6 risposte

Algoritmo esadecimale

Salve! Mi sono cimentato a fare questo semplicissimo convertitore:
#include <iostream>
#include <cstdlib>
using namespace std;

int main(){
	int n;
	int scelta;
	cout<<"Scegli qual conversione vuoi fare:"<<endl;
	cout<<"1 = Da decimale ad esadecimale"<<endl;
	cout<<"2 = Da esadecimale a decimale"<<endl;
	
	cin>>scelta;
	cout<<endl<<"_______________________________________"<<endl;
	
	while(scelta!=1 && scelta!=2){
		cout<<"Inserisci un numero tra 1 e 2!\n";
		cin>>scelta;
	}	
	
	switch(scelta){
		case 1:
		cout<<"Hai scelto di convertire da decimale ad esadecimale"<<endl<<"Inserisci il numero decimale da convertire:\t";
		cin>>n;
		
		cout<<n<<" in esadecimale e': "<<hex<<n<<endl;
		break;
		
		case 2:
			cout<<"Hai scelto di convertire da esadecimale ad decimale"<<endl<<"Inserisci il numero esadecimale da convertire:\t";
		cin>>n;
		
		cout<<n<<" in decimale e': "<<dec<<n<<endl;
		break;
	}

	system("PAUSE");
	return 0;
}
Ho provato a usare:
cout<<dec<<n<<endl;
Ma la conversione da ESA a DEC non ha funzionato, esiste un algoritmo ad-hoc?

6 Risposte

  • Re: Algoritmo esadecimale

    Ci sono diverse soluzioni, dalla più banale a quelle che coinvolgono tecniche di algebra avanzata e comunque in internet è pieno di esempi. Detto ciò hai 2 possibilità naif:
    - Dividere il numero in base 10 per 16 tenendo conto del resto
    - Sfruttare >> e AND bitwise operando su una copia del numero se esso va conservato
    
    while (n > 0)
    {
        tmp = n & ? + ?;
        printf("......");
        n = n >> ?;
    }
    
    Insomma completa il codice che ho postato aggiungendo ciò che manca e adattalo al C++ ( anche se alla fine stai usando il C cin e cout al posto di fgets e fputs). Non conoscendo il C++ non posso aiutarti con le stringhe ma se capisci il C puoi guardare qui http://forum.ubuntu-it.org/viewtopic.php?f=33&t=609103&p=4864293&hilit=itob#p4864293 all'ultimo post dove la funzione è scritta (scolasticamente) bene. Occhio a non copiare, devi ricordare che esiste la convenzione di Ginevra

    PS: puoi usare anche lo shift verso sinistra << e un'opportuna mask per evitare il reverse della stringa
  • Re: Algoritmo esadecimale

    Se segui il consiglio di loopunrolling (che secondo me è quello più sensato dal punto di vista didattico) ti consiglio di leggere non un valore intero ma una stringa perchè altrimenti come fai ad inputare le cifre da A a F?
    Se invece vuoi provare con cin e cout (lo sconsiglio perchè non ti insegna niente) puoi vedere questo http://stackoverflow.com/questions/13196589/getting-hex-through-cin che suggerisce sostanzialmente di fare cin >> hex >> n
  • Re: Algoritmo esadecimale

    Grazie mille ad entrambi.
    @loopunrolling purtroppo sono a gli inizi del c++, non conoscendo bene il c.
    Quindi l'80% di ciò che mi hai detto lo conosco per sentito dire ma non so come applicarlo e non conosco tali funzioni.
    In pratica so solamente come dividere il numero in base 10 per 16 tenendo conto del resto.

    Alla fine mi sono aggrappato al consiglio di @candular , molto utile anche se, come ha già detto, non mi insegna nulla.

    Il codice che ne è uscito fuori è questo:
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;
    
    int main(){
    	int num;
    	int scelta;
    	cout<<"Scegli quale conversione vuoi fare:"<<endl;
    	cout<<"1 = Da decimale ad esadecimale"<<endl;
    	cout<<"2 = Da esadecimale a decimale"<<endl;
    	cin>>scelta;
    	cout<<endl<<"_______________________________________"<<endl;
    	
    	while(scelta!=1 && scelta!=2){
    		cout<<"Inserisci un numero tra 1 e 2!\n";
    		cin>>scelta;
    	}	
    	
    	switch(scelta){
    		case 1:
    		cout<<"Hai scelto di convertire da decimale ad esadecimale"<<endl;
    		cout<<"Inserisci il numero decimale da convertire:\t";
    		cin>>num;
    		
    		cout<<num<<" in esadecimale e': "<<hex<<num<<"\n\n";
    		cout<<"Vuoi uscire?\n"<<"[SI]=S   |   [NO]=N"<<endl;
    		break;
    		
    		case 2:
    			cout<<"Hai scelto di convertire da esadecimale ad decimale"<<endl;
    			cout<<"Inserisci il numero esadecimale da convertire:\t";
    		cin>>hex>>num;
    		
    		cout<<"In decimale e': "<<num<<"\n\n";
    		cout<<"Vuoi uscire?\n"<<"[SI]=s   |   [NO]=n"<<endl;
    		
    		break;
    	}
    	
    		
    	system("PAUSE");
    }
    
    Dopo le operazioni eseguite vorrei che l'utente possa scegliere se chiudere il programma o fare un'altra operazione; ma riflettendo ho notato che se mettessi un if dovrei perforza re-inserire tutto lo switch diventato disordinato e sconveniente. Non potrei richiamare lo switch come se fosse una sorta di funzione?
  • Re: Algoritmo esadecimale

    Puoi farne una funzione ma ad ogni modo il tutto si risolve con un ciclo al cui interno ci metti le operazioni da ripetere (che può essere il codice che hai scritto oppure la chiamata alla funzione in cui hai inserito tale codice).
    Ti consiglio di scrivere la sequenza in pseudo-codice (in maniera discorsiva) oppure graficamente con un flowchart e solo dopo che hai chiarito come deve funzionare "tradurlo" in c/c++.
  • Re: Algoritmo esadecimale

    Uhm, sto cercando di capire per bene (ti ringrazio tantissimo).
    Quindi potrei fare un ciclo for/do-while?

    Non mi è chiaro del tutto
  • Re: Algoritmo esadecimale

    Ci sono riuscito!
    Ho capito cosa intendevi e ci sono arrivato.
    Ecco il codice completo:
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    using namespace std;
    
    int main(){
    	int num;
    	int scelta,scelta_2;
    	do{
    	
    	
    	cout<<"Scegli quale conversione vuoi fare:"<<endl;
    	cout<<"1 = Da decimale ad esadecimale"<<endl;
    	cout<<"2 = Da esadecimale a decimale"<<endl;
    	cin>>scelta;
    	cout<<endl<<"_______________________________________"<<endl;
    	
    	while(scelta!=1 && scelta!=2){
    		cout<<"Inserisci un numero tra 1 e 2!\n";
    		cin>>scelta;
    	}	
    	
    	switch(scelta){
    		case 1:
    		cout<<"Hai scelto di convertire da decimale ad esadecimale"<<endl;
    		cout<<"Inserisci il numero decimale da convertire:\t";
    		cin>>num;
    		
    		cout<<num<<" in esadecimale e': "<<hex<<num<<"\n\n";
    		cout<<"Vuoi uscire?\n"<<"[SI]=1   |   [NO]=0"<<endl;
    		cin>>scelta_2;
    		break;
    		
    		case 2:
    			cout<<"Hai scelto di convertire da esadecimale ad decimale"<<endl;
    			cout<<"Inserisci il numero esadecimale da convertire:\t";
    		cin>>hex>>num;
    		
    		cout<<"In decimale e': "<<num<<"\n\n";
    		cout<<"Vuoi uscire?\n"<<"[SI]=1   |   [NO]=0"<<endl;
    		cin>>scelta_2;
    		break;
    	}
    }
    while (scelta_2==0);
    		
    	system("PAUSE");
    }
    
    Grazie mille, mi hai fatto lavorare con il cervello!
Devi accedere o registrarti per scrivere nel forum
6 risposte