Umrechnen von Hexzahlen



  • LordJaxom schrieb:

    <nochpedantischer>
    Und 'A'-'F' könnte man ebenso zusammenfassen, mit iEingabe - 'A' + 10 (sogar in EBCDIC :D)
    </nochpedantischer>

    <extrempedantisch>
    Es ist nicht garantiert, dass das Alphabet in seiner Reihenfolge durchdummeriert wird 😃
    </extrempedantisch>



  • Ich würde diese Funktion gerne nehmen, nur muss ich mich Schritt für Schritt an C heran arbeiten. Sprich mein Ausbilder erlaubt es mir immer nur das zu nehmen, was ich auch schon kenne bzw. wie weit ich im Buch bin..

    👍 Cstoll du bist Spitze! 👍



  • TactX schrieb:

    Simon2 schrieb:

    case '9': iAusgabe = iEingabe - 48; break;
    

    Schreibt doch lieber '0' statt der 48, da sieht man sofort was gewollt ist...

    <pedantic>
    ... und außerdem ist nicht unbedingt garantiert, dass die '0' den Dezimalwert 48 hat, auch wenn das auf den meisten Systemen der Fall ist
    </pedantic>

    Das ist mir vollkommen klar und gerade bei solche Sachen muss ich hier sogar portabel programmieren (und würde das deswegen überhaupt nicht so machen).
    Ich wollte ihm als Anfänger nur mal das "switch" zeigen ... und das erkennt er am Besten, wenn ich sonst möglichst wenig an seinem Programm ändere (OK, die endl- und die isxdigit()-Abfragen habe ich auch gleich mit reingepult - aber auch das diente der Demonstration vom switch).

    Gruß,

    Simon2.



  • Bezog sich auch nicht speziell auf dich 🙂



  • TactX schrieb:

    Bezog sich auch nicht speziell auf dich 🙂

    Ach soooo. 💡

    (Immerhin hast Du auch den Imperativ Plural verwendet, wie mir erst jetzt auffiel). 😋

    Gruß,

    Simon2.



  • Hallo nochmal,

    erstmal vielen dank für die zahlreichen und wirklichen guten Beiträge von gestern.

    Habe das Programm auch erfolgreich mit euren Tipps "umgeschrieben".

    Nur muss ich heute vor Feierabend meinem AUsbilder das "Ursprungs-Programm" zeigen.

    Nun habe ich folgende Frage.

    Alles funktioniert so wie ich will, jetzt muss ich aber noch einbauen das ich in der Eingabe z.B. ein "0x" oder "0X" davor setzen kann.

    Ungefähr so: 0xAF oder ähnlich

    Hier der Code:

    #include <stdio.h>
    #include <ctype.h> // Bibliothek für die Funktion isxdigit
    #include <math.h>  // Bibliothek für die Funktion pow
    
    #define BASIS 16                // BASIS (später für die Rechnung)
    #define MAXCHAR 100             
    
    void main()
    {
    	char    hex[MAXCHAR];   	// für Hex-Eingabe
      char    cEingabe;        	// Eingabevariable
      double  dezimalzahl = 0;  // Umgerechnete Dezimalzahl
      int     iArray = 0;      	// neues Array-Ende
      int     nenner = 0;       // Nenner
      int     summand = 0;     	// einzelner Summand
      int     iZaehler = 0;     // Zähler
      int     iAusgabe;       
    
       for (iZaehler = 0; iZaehler <=MAXCHAR && (cEingabe=getchar()) != EOF; iZaehler++)// Zeichen werden eingelesen
       {																																								// überprüfen ob es sich um eine
          if (cEingabe != '\n' && ! isxdigit(cEingabe))																	// Hex-Ziffer handelt!
          {
         	 	printf("Keine Hex-Ziffer eingegeben! %d\n", iZaehler);
          }
          	if (cEingabe == '\n')
          	{
          		hex[iZaehler] = '\0';
            	iArray = iZaehler - 1;
          	}
          	else
          	{
          		hex[iZaehler] = cEingabe;
          	}
       	}
    
       			for (iZaehler = iArray; iZaehler >= 0; iZaehler--) // Array auslesen.
       			{																									 // Hex-Ziffern in entsprechende Dezimalzahl umwandeln
       				if (hex[iZaehler] == 'A')												// und ausgeben.
         			{
        	  		iAusgabe = 10;
          		}
          		else if (hex[iZaehler] == 'B')
          		{
          			iAusgabe = 11;
          		}
          		else if (hex[iZaehler] == 'C')
          		{
          			iAusgabe = 12;
          		}
          		else if (hex[iZaehler] == 'D')
         	 		{
          			iAusgabe = 13;
          		}
          		else if (hex[iZaehler] == 'E')
          		{
         	  		iAusgabe = 14;
          		}
          		else if (hex[iZaehler] == 'F')
          		{
          			iAusgabe = 15;
          		}
          		else
          		{
          			iAusgabe = hex[iZaehler] - '0'; // Ziffern von 0 bis 9
    					}
                    summand = (iAusgabe * (pow(BASIS, nenner)));
                    nenner++;
                    dezimalzahl = summand;  
        		}																		
    
            				printf("Dezimal-Zahl: %0.f", dezimalzahl);
    }
    

    Hatte mir gedacht das in etwa so einzubauen:

    if(hex[iZaehler] == 0)
    	{
    		iAusgabe = ' ';
    	}
    	else if(hex[iZaehler] == 'x' || hex[iZaehler] == 'X')
    	{
    		iAusgabe = ' ';
    	}
    

    Nur ist dann das Problem, das ich ein Fehler bekomme, wenn ich eine 0 an dritter Stelle eingebe.

    Hat jemand einen Tipp für mich wie ich das einbinde das nur die ersten 2 Stellen berücksichtigt werden?

    Gruß
    Mimas



  • Du kannst vor der eigentlichen Rechenschleife eine Spezialüberprüfung vorsetzen:

    if(hex[0]=='0' && toupper(hex[1]=='X')
      ende=2;
    else
      ende=0;
    ...
    for (iZaehler = iArray; iZaehler >= ende; iZaehler--) // Array auslesen.
      ...
    


  • Gibt es auch eine Möglichkeit das toupper wegzulassen? darf das eigentlich noch nicht benutzen?
    Wasrum hast du hex[l] genommen?

    Gruß
    Mimas



  • Mimas schrieb:

    Gibt es auch eine Möglichkeit das toupper wegzulassen? darf das eigentlich noch nicht benutzen?

    Ja: (hex[1]=='X'||hex[1]=='x')

    Wasrum hast du hex[l] genommen?

    Wenn die Eingabe eine Hex-Kennung (0x...) enthält, dann steht sie in den ersten beiden Zeichen deines Eingabestrings (in hex[0] die '0' und in hex[1] das 'x')



  • CStoll, du hast mir meinen A... gerettet! 🙂

    Vielen dank und noch einen schönen :xmas1: Nikolaus! :xmas1:


Anmelden zum Antworten