Frage zu Programm bzgl Hexadezimalumwandlung



  • Schönen Guten Abend,

    ich bins mal wieder. Ich habe eine Aufgabe zu lösen, wo irgendwas aber noch nicht hinhaut. Folgende Aufgabe + mein Programm:

    /*
    15.  Schreiben Sie ein Programm, das eine Dezimalzahl abfragt und diese
         als Hexadezimalzahl ausgibt.
         Hinweis: 
          1. Ausschließlich die Verwendung der "stdio.h" Bibliothek ist erlaubt!
          2. Den Rechenweg mit ausgeben, wie bei schriftlicher Konvertierung.
    */
    
    #include <stdio.h>
    
    #define HEXA 16
    
    int main(void)
    {
    
    	int Eingabe[100];
    	char Hexa[100];
    	char Hexaverg[] = "123456789ABCDEF";
    	int i =0;
    	int a =0;
    
    	printf("Bitte geben Sie eine Dezimalzahl ein die in eine Hexadeimalzahl konvertiert werden soll: \n");
    	scanf("%i", Eingabe);
    
    	printf("\n\n");
    
    	for(i =0;Eingabe[i] !='\0' ;i++)   // Schleife zum durchgehen der Felder
    		{
          Eingabe[i+1] = Eingabe[i] / HEXA;   // Division ohne Rest
    			printf("%i : %i = %i", Eingabe[i], HEXA, Eingabe[i+1]);
    
    			a =Eingabe[i] % HEXA;  // Restangabe
    
    				if(a !=0)    //überprüfung ob rest > 0
    					{			
    						printf(" - Rest %i --> %c \n", a, Hexaverg[a-1]);				// String startet bei [0]
    						Hexa[i] = Hexaverg[a-1]; // abspeichern aus Hexaverg[1 - F]
    					}
    				else
    					{
    						printf(" - Rest %i --> 0 \n", a);
    						Hexa[i] = 0;
    					}
    		}
    
    	printf("\n\nDie konvertiere Hexadezimalzahl lautet: ");
    
    	for(i ;i >=0; i--) // Rückwärts durchgehen des Arrays zur Ausgabe der Hexa zahlen
    		{
    			printf("%c", Hexa[i]);
    		}
    
      printf("\n");
    
    return 0;
    }
    

    So bevor sich irgendjemand über ein evtl schlechte programmierweise aufregt, ich bin gern für Verbesserungen offen. Möchte es ja lernen.

    Jetzt habe ich das Problem, mit folgenden Beispielen:

    ///////////////////////////////////
    555

    555 : 16 = 34 - Rest 11 --> B
    34 : 16 = 2 - Rest 2 --> 2
    2 : 16 = 0 - Rest 2 --> 2

    Die konvertiere Hexadezimalzahl lautet: �22B
    //////////////////////////////////
    5555

    5555 : 16 = 347 - Rest 3 --> 3
    347 : 16 = 21 - Rest 11 --> B
    21 : 16 = 1 - Rest 5 --> 5
    1 : 16 = 0 - Rest 1 --> 1

    Die konvertiere Hexadezimalzahl lautet: 15B3
    //////////////////////////////////
    2

    2 : 16 = 0 - Rest 2 --> 2

    Die konvertiere Hexadezimalzahl lautet: N2
    //////////////////////////////////

    SO wie ihr seht, bei 4 eingegeben Zahlen ist alles ok. bei 3 setzt er schon was davor und bei 2 und 1 auch.

    Ich weiß, bei Buchstaben funktioniert das Programm nicht, also er gibt nu blödsinn aus. Aber das ist ok, es steht ja da das eine Dezimalzahl eingegeben werden soll.

    Ich häng an dem Problem ab 3 Zahlen und weniger. Ich versteh nicht warum er sowas davor setzt? Ich counte doch den Index hoch und dann frag ich ihn ab und geb den String rückwärts aus.

    Vllt könnte mal jemand rüber schauen, wäre euch sehr Dankbar.

    Bedanke mich schonmal und wünsche einen schönen Abend



  • int Eingabe[100];
    scanf("%i", Eingabe);
    

    ???
    Du willst eine Zahl einlesen, nicht 100 Stück...

    int Eingabe;
    scanf("%i", &Eingabe); //scanf möchte die Adresse der Variable haben
    

    Kompiliert immerhin fast ohne Warnungen, nur das einzelne i in der for-schleife wird kritisiert (statement without effect).

    Den eigentlichen Algorithmus muss ich erstmal in Ruhe betrachten.



  • Irgendwas ist da grundlegend faul.

    int Eingabe[100];
    scanf("%i", Eingabe);
    for(i =0; Eingabe[i] !='\0' ; i++)
    

    Hu? Einzig Eingabe[0] enthält überhaupt einen definierten Wert und zwar eine Zahl, keine Zeichenkette... Ist dir der Unterschied dazwischen bewusst? Erklär doch mal deinen Algorithmus in Worten.



  • Danke dir erstmal für deine Mühe.

    Ich habe ein Eingabe[100] definiert um weitere Zahlen drin abzuspeichern.

    Es ist doch so, das ich in Eingabe[0] die Zahl speicher die eingegeben wird. In allen weitern Eingaben[i] speichere ich die Ergebnisse aus Eingabe[i] / HEXA

    Also dient mir das Array als Speichermöglichckeit.

    Wenn ich was falsch verstanden habe an der ganzen Sache korregier mich bitte, aber ich kann ja nicht meine Ergebnisse aus den Division in einer Variablen speichern?

    Ich kommentiere kurz in den Code hinein.



  • Sorry, ich war etwas schnell, jetzt hab ich die Sache genau angeguckt und hoffentlich kapiert...

    Klar kannst du Zahlen in Eingabe[] speichern.

    for(i =0;Eingabe[i] !='\0' ;i++)
    

    Nein, du willst testen ob Eingabe[i] ungleich Zahl Null ist, nicht ob das das Ende einer Zeichenkette ist. '\0' ergibt auch 0 aber es macht dort keinen Sinn. --> !=0 schlicht und einfach. Das hatte mich verwirrt.

    char Hexaverg[] = "123456789ABCDEF";
    

    Da fehlt die 0 als erste Ziffer. Dann braucht man auch nicht zwei unterschiedliche Blöcke je nachdem ob a =0 oder !=0 ist. Vorsicht, richtigen Index für Hexaverg[] verwenden! Achja, a ist kein besonders aussagekräftiger Name...

    for(i ;i >=0; i--) // Rückwärts durchgehen des Arrays zur Ausgabe der Hexa zahlen
    

    Als erstes i=i-1, denn die for-Schleife davor inkrementiert _erst_ i und prüft _dann_ die Bedingung, das heisst i wird auch nach dem letzten Durchlauf inkrementiert. Spiel das mal wie ich eben mit Papier und Bleistift durch, dann wird es klar!



  • Gewöhne dir an, mit Funktionen zu arbeiten. Die machen in allen Fällen das Leben leichter.
    http://ideone.com/Tynn9D

    void printhex(unsigned x)
    {
    	if( x )
    	    printhex(x>>4),putchar("0123456789ABCDEF"[x&15]);
    }
    
    int main(void)
    {
    	unsigned u;
    
    	if( 1==scanf("%u",&u) )
    	{
    		if( u==0 )
    			puts("0");
    		else
    			printhex(u);
    	}
    	return 0;
    }
    


  • Vielen Dank für eure Hilfe funktioniert alles!

    war echt i = i-1

    @ Wutz danke auch für dein Tip, werde damit jetzt anfangen. Hielt es für überflüssig, da meine Quellcodes ja doch sehr klein sind.

    Danke euch!



  • @Wutz
    Das nenne ich eine kompakte Implementierung! 👍
    (auch wenn es für den TO mangels Anzeige des Rechenwegs nicht geeignet ist)



  • Es geht noch kürzer:

    unsigned u;
    
    scanf("%u",&u);
    printf("%X", u);
    

    😉



  • Sicher geht es kürzer, das weiß ich auch, aber in der Aufgabenstellung stand was von "Beschreibung jedes Teilschrittes", und das ist bei printf nicht gegeben.


Log in to reply