Announcement

Collapse
No announcement yet.

Hex in Dezi mit getch()

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hex in Dezi mit getch()

    Hallo liebe Community,
    ich bin gerade dabei Ansi C zu erlernen. Programmierkenntnisse habe ich bisher nur in Vb.net sammeln können. Ich habe nun eine Aufgabe erhalten in der ich eine Hexziffer eingeben und diese dann als dezimal ausgeben soll. Bei eingabe die nicht zum Hexadezimalsystem gehören soll eine Fehlermeldung erscheinen.

    Beispiel:
    Bitte geben Sie eine Hex-Ziffer ein: F
    Die Ziffer hat den Wert 15.
    Bitte geben Sie eine Hex-Ziffer ein: 3
    Die Ziffer hat den Wert 3.

    als Hinweis habe ich folgendes erhalten:

    Die Eingabe erfolgt durch das Einlesen einzelner ASCII-Zeichen, zweckmäßig mit getch().
    ASCII-Werte: 'A' = 65; 'a' = 97; '0' = 48
    Es sollen keine Funktionen aus <string.h> oder <ctype.h> wie z. B. isdigit()
    oder isanum() verwendet werden!

    So mein Problem besteht nun darin das getch() mir den Dezimalen ASCII Code der eingegebenen Ziffer zurückliefert. Wenn ich diesen dann natürlich in Hex oder dezimal umrechne kann ja nicht das richtige rauskommen.


    Deshalb habe ich das ganze mit scanf("%x",&d) versucht. Nur wenn ich dort eine Ziffer auserhalb des Hex-Systems einlese komme ich in eine endlosschleife, was auch verständlich ist.

    Eine if abfrage kann ich ja auch nicht einfügen da diese nach dem scanf erfolgen müsste (wo ich ja schon in der schleife bin).

    Könnte mir bitte jemand helfen und mich auf den richtigen Weg lenken.

    Danke im vorraus
    Vertax

    PS: Wie gesagt beschäftigen wir uns ausschließlich mit ANSI C, deshalb bitte nur antworten die auch nur innerhalb C funktionieren C++ darf ich leider nicht verwenden.

  • #2
    Du vermischt hier die Sachverhalte:

    - Eingabe
    - Validierung
    - Verarbeitung

    Nimm das nacheinander vor

    Eingabe egal was annehmen
    Eingabe prüfen -> ggf. Fehlermeldung und Abbruch
    Dann erst die Eingabe verarbeiten

    Insofern kannst du alles mit getch annehmen, wenn du es danach prüfst.Von ASCII-Wert der Eingabe könnte man etwas subtrahieren um auf die Ziffer zu kommen....
    Christian

    Comment


    • #3
      Eingabe egal was annehmen
      Eingabe prüfen -> ggf. Fehlermeldung und Abbruch
      Dann erst die Eingabe verarbeiten

      ok wenn ich mit a = getch() eine taste einlese, a mittels if oder switch überprüffen ob der ascii code ein Buchstabe von A-F oder von 0-9 ist.

      Wenn ich jetzt allerdings eingabe verarbeiten wll, habe ich immre noch den Dezimalen ASCII Wert von A,B,C,D,E oder F bzw der Zahlen. Damit kann ich ja nichts anfangen, vorallem ist A die 65 in Dezimal und 41 in Hex da müsste ich 65-24 nehmen. Bei den Zahlen geht die 0 bei Dezimal 48 und Hex 30 los wo ich 18 abziehen müsste.

      Comment


      • #4
        Genau, man nennt das programmieren....

        Wenn du keine Formel finden kannst, erstelle eine Tranformationstabelle, arbeite mit 16 mal if oder erstelle 2 Formeln, die für 2 Bereiche (Buchstaben und Zahlen gelten)
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          ... erstelle eine Tranformationstabelle, arbeite mit 16 mal if oder erstelle 2 Formeln, die für 2 Bereiche (Buchstaben und Zahlen gelten)
          Und genau das ist mir Verboten, ich hatte als aller erste Variante einfach mit switch den ASCII abgefragt und dann nachgeschaut ob er im Hexsystem vorkommt.

          Aber das sind dann ja 16 Case Abfragen und dann habe ich nur die Großbuchstaben und die Zahlen. Die Kleinbuchstaben habe ich dann immer noch nicht.

          Ich brauche als Lösung irgendetwas allgemeines das ich für jede Taste verweden kann.

          Comment


          • #6
            Und genau das ist mir Verboten,
            Sicherlich ist dir das nicht verboten!!

            if(eingabe>=65&& eingabe<70)
            subtrahiere für Buchstaben

            else if...kleinbuchstaben
            subtrahiere Kleinbuchstaben

            else
            subtrahiere für Zahlen
            Christian

            Comment


            • #7
              Achso meinst du das, ja das ist mir nicht verboten. Nur das Problem ist ja an der Sache das wenn ich mit eingabe=getch einen tastendruck einlese habe ich ja den dezimalen ASCII Code der gedrückten taste. Wenn ich diesen mittels printf in hex darstellen will, kommt nicht das richtige raus. Bei A = 2B4F wahllos aus dem speicher aus und nicht 10

              Code:
              #include <conio.h>
              #include <stdio.h>
              
              int main()
              {
                 char eingabe;
                 
                 eingabe = getch();
                 if(eingabe>=65&& eingabe<70)
                 {
              	   printf("%x",&eingabe);
                 }
              
              }

              Comment


              • #8
                a) falsche main-Methode
                int main(int argc, char* argv[])

                b) printf macht genau das was du gesagt hast: zeigt die Adresse von eingabe in hexadezimaler Form an

                höchstwahscheinlich meinst du

                printf("%x",eingabe);
                Christian

                Comment


                • #9
                  Trotzdem kommt nicht das richtige raus, hatte tatsächlich printf("%x",eingabe) gemint. Aber als Wert kommt 41 und nicht 10 raus bei der Eingabe A.
                  Zuletzt editiert von Vertax; 22.10.2009, 20:47.

                  Comment


                  • #10
                    Trotzdem kommt nicht das richtige raus, hatte tatsächlich printf("%x",eingabe) gemint. Aber als Wert kommt 41 und nicht 10 raus.
                    Was für ein sinnvoller Hinweis, wenn man nicht weiss was du eingegeben hast


                    Ich weiss nicht wo du Umrechung in das hexadezimale System gelernt hast, aber wenn ich A eingebe =65 ist 41 das richtige Ergebnis

                    Wäre irgendwie hilfreich, wenn das was in vorigen Posts steht Berücksichtigung findet
                    Christian

                    Comment


                    • #11
                      Ja das ist mir kla, du verstehst aber nicht was ich meine.Wenn ich A eingebe =65 ist 41H ja logisch weil 65 die Dezimalzahl von A ist und 41H ist A in Hexadezimal.
                      Nur ich möchte das er mir die Wertigkeit im Hexadezimalsystem ausgibt.

                      1 = 1
                      2 = 2
                      .
                      .
                      .
                      A = 10
                      B = 11
                      C = 12
                      .
                      .
                      .

                      Comment


                      • #12
                        Mir wird das jetzt zu dumm

                        Was was dann an

                        "subtrahiere für Buchstaben"

                        nicht verständlich?


                        Oder alternativ rechne "A" nach Hexadezimal
                        Gute Nacht
                        Christian

                        Comment


                        • #13
                          Noch die Alternative um einen String in eine hexadezimale Zahl umzurechnen:

                          char *eingabe="A";
                          int zahl=strtol(eingabe,NULL,16);// Ergebnis = 10

                          Bisher wurden Ziffern in eine hexadezimale Zahl umgerechnet
                          Christian

                          Comment


                          • #14
                            Ich hab das ganze nun so geregelt

                            Code:
                            #include <conio.h>
                            #include <stdio.h>
                            
                            void main()
                            {
                               char Zahl;
                              
                              printf("hexadezimale Zahl (ohne 0x) eingeben: ");
                              scanf("%x", &Zahl);
                             
                                if(Zahl>=10 && Zahl<=15 || Zahl>=0 && Zahl<=9)
                               {
                            	   printf("hexadezimal 0x%x in dezimaler Darstellung: %d\n",Zahl,Zahl);
                            	   	  
                               }
                            	else
                            	{
                            		printf("Dies ist keine Hexzahl\n");
                            	}
                            }
                            Nur bekomm ich die Fehlermeldung Stack arround the Variable 'Zahl' was corrupted
                            Ansonsten ist alles richtig was es ausgibt. Was halt mein Problem ist ich muss getch() nehmen und nicht scanf. Und hier bekomme ich wie gesagt die Dezimale ASCII Zahl des Buchstabens und nicht seinen Wert im Hexsystem
                            Zuletzt editiert von Vertax; 22.10.2009, 21:32.

                            Comment


                            • #15
                              if(Zahl>=10 && Zahl<=15 || Zahl>=0 && Zahl<=9)
                              überarbeite das
                              Christian

                              Comment

                              Working...
                              X