Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565

    C++ - Convertitore esadecimale

    Ho provato a fare un convertitore esadecimale
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main() 
    {
    	int Numero = 0;
    	char Convertito[100];
    	cout <<"Inserisci il numero da convertire\n";
    	cin >> Numero;
    	for (int i = 0;(Numero / 16) == 0;i++)
    		{
    				switch (Numero % 16) 
    				{
    				case 15:
    					Convertito[i] = 'F';
    					break;
    				case 14:
    					Convertito[i] = 'E';
    					break;
    				case 13:
    					Convertito[i] = 'D';
    					break;
    				case 12:
    					Convertito[i] = 'C';
    					break;
    				case 11:
    					Convertito[i] = 'B';
    					break;
    				case 10:
    					Convertito[i] = 'A';
    					break;
    				default:
    					Convertito[i] = Numero % 16;
    					break;
    				Numero = Numero / 16;
    				}
    		}
    
    	for (int a = strlen(Convertito); a = 0; a--)
    		{
    			cout<<Convertito[a];
    		}
    			cout<<endl;
    			system("PAUSE");
    	return 0;
    }
    Ma quando lo avvio e inserisco il numero questo non mi stampa un bel niente...
    Posso capire che alcuni caratteri sono vuoti poichè strlen(Converito) mi restituisce 100 e quindi li printa vuoti...ma gli altri dove sono?
    Usando il debug di Visual C++ 6.0 e premendo F11, noto che il primo ciclo for lo salta completamente!!
    Sapete aiutarmi, magari anche ad ottimizzarlo?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    codice:
    	int Numero = 0, i = 0;
    	char Convertito[100];
    	char c;
    	
    	cout <<"Inserisci il numero da convertire\n";
    	cin >> Numero;
    	
    	do
    	{
    		c = (Numero % 16) + '0';
    		Convertito[i++] = ((c>'9') ? c+7 : c);
    		Numero /= 16;
    	} while(Numero);
    
    	Convertito[i] = 0;
    
    	strrev(Convertito);
    
    	cout << Convertito << endl;
    
    	system("PAUSE");
    	return 0;

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Veramente io non volevo il codice completo da incollare nel compilatore.
    Volevo cercare di capire l'errore, magari spiegi quello che ha i fatto nel codice...
    In particolare...
    while(Numero)
    Che condizione vuol dire? Finchè numero == a qualcosa?

  4. #4
    Originariamente inviato da XWolverineX
    while(Numero)
    Che condizione vuol dire? Finchè numero == a qualcosa?
    Si esatto, in pratica finchè Numero non è == 0 il ciclo
    while() continua.

    Considera che :

    Se Numero > 0 Il controllo da true (il ciclo continua)
    Se Numero < 0 Il controllo da true (il ciclo continua)
    Se Numero = 0 Il controllo da false (il ciclo si interrompe)
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Prova a spiegare tu cosa dovrebbe fare questa linea

    for (int i = 0;(Numero / 16) == 0;i++)

    e cosa c'e' di sbagliato in questa

    for (int a = strlen(Convertito); a = 0; a--)

    cosi' arrivi anche a capire cosa sbagli ...

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Ho riflettuto un po sul codice e ho prodotto quest'altro
    codice:
    #include <iostream>
    
    using namespace std;
    
    int main() 
    {
    	int Numero = 0;
    	int i = 0;
    	char Convertito[100];
    	cout <<"Inserisci il numero da convertire\n";
    	cin >> Numero;
    	for (i = 0;(Numero / 16) != 0;i++)
    
    		{
    				switch (Numero % 16) 
    				{
    				case 15:
    					Convertito[i] = 'F';
    					Numero = Numero / 16;
    					break;
    				case 14:
    					Convertito[i] = 'E';
    					Numero = Numero / 16;
    					break;
    				case 13:
    					Convertito[i] = 'D';
    					Numero = Numero / 16;
    					break;
    				case 12:
    					Convertito[i] = 'C';
    					Numero = Numero / 16;
    					break;
    				case 11:
    					Convertito[i] = 'B';
    					Numero = Numero / 16;
    					break;
    				case 10:
    					Convertito[i] = 'A';
    					Numero = Numero / 16;
    					break;
    				default:
    					Convertito[i] = Numero % 16;
    					Numero = Numero / 16;
    					break;
    				i++;
    				Convertito[i] = 'F';
    				}
    		}
    
    	for (int a = strlen(Convertito); a != 0; a--)
    		{
    			cout<<Convertito[a];
    		}
    			cout<<endl;
    			system("PAUSE");
    	return 0;
    }
    Però non va lo stesso, mi da dei caratteri stranissimi, perchè 'F' mi restituisce il codice Ascii, ma se faccio "F" mi da errore...come potrei fare??

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Quando ti ho suggerito di controllare la prima for, non intendevo dire che invece di == dovevi usare != ma che la for non ha molto senso ... devi spiegare e spiegarti perche' hai scritto quella for e cosa volevi fare con quella for, che invece non fa ...

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da oregon
    Prova a spiegare tu cosa dovrebbe fare questa linea

    for (int i = 0;(Numero / 16) == 0;i++)

    e cosa c'e' di sbagliato in questa

    for (int a = strlen(Convertito); a = 0; a--)

    cosi' arrivi anche a capire cosa sbagli ...
    Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

    nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...

  9. #9
    Originariamente inviato da XWolverineX
    Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

    nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...
    Metti questo cout per vedere cosa fa il primo ciclo for:
    cout<<"i="<<i<<" Numero"<<Numero<<endl;

    Qual'è la differenza tra assegnazione e confronto ?
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da XWolverineX
    Bhe nella prima faccio continuare il ciclio finchè il numero diviso 16 non è uguale a 0

    nella seconda faccio printare al contrario tutti i caratteri del char finchè a, che è uguale alla lunghezza del char (100) non è uguale a 0...
    "finche' il numero ..."

    No ... la for non funziona cosi'. Se la condizione e' falsa, la for termina. Prendi il numero 171 ...

    All'inizio 171/16 non e' zero e la for non viene eseguita ...

    E' il ciclo for che *non è adatto* alla soluzione del problema ... ecco perche' non l'ho usato ...

    Nella seconda, come ti e' stato detto,

    == e' per il confronto

    = per l'assegnazione

    e, in ogni caso, e' piu' comodo usare la funzione di libreria

    strrev

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