Hexadezimalzahl -> Dezimalzahl
-
als ersten mal ein freundliches hallo,
ich stehe vor zwei aufgaben und weiß absolut nicht, wie ich anfangen soll und bräuchte da eine kleine oder vielleicht auch größere starthilfe.
zur aufgabe1:
ich soll ein programm schreiben, dass eine Hexadezimalzahl einliest (bei falschen werten den benutzer zur widereingabe auffordert) und diese in dezimaler schreibweise ausgibt.
verlangt wird:
eingelesen wird eine nicht negative hexadezimalzahl mit 8 ziffern in ein char feld . durchlauf des feldes, aus den gespeicherten ziffern soll der wert der zahl berechnet in eine variable gespeichert und anschließend in dezimaler schreibweise ausgegeben werden.finde leider keinen ordentlichen anfang und komme auf keine lösung, wie ich die wertigkeiten verteilen soll bzw überhaupt es realisieren soll, dass wenn zum beispiel nur 6 hexadezimalziffern eingegeben werden, das die forderen stellen den wert 0 bekommen.
zur aufgabe2:
ein programm, das die berechnung eines skalarproduktes realisiert.
vorgabe:
zwei int felder a und b jeweils der länge 5 sollen eingelesen werden (a0,a1,a2...) (b0,b1,b2...)
es soll nach der formel skprod=∑i=0..4 Ai*Bi berechnet werden und anschließend sollen die beiden vektoren a und b bzw ihre komponenten sowie das ergebniss skprod ausgegeben werden.das 2. programm ist nicht das hauptproblem. da hab ich nur ein wenig probleme bei der richtigen berechnung, aber bei der 1. aufgabe stehe ich absolut auf dem schlauch.
ich hoffe mein problem ist nicht schon vorhanden und es gehört in diese rubrik. hatte schon gesucht aber nichts passendes gefunden
bin für alle hilfe dankbar
mfg tim
-
Text einlesen
Länge prüfen
Inhalt prüfen (nur 1-f)
Dezimalwert ausrechnen (16^0 = 1, 16^1 = 16, 16^2 = 256...)
-
hmmm kaum zu glauben, aber das hat mir schon sehr weiter geholfen.
zwar weiß ich noch nicht, wie ich das mit der eingabe "schön" lösen soll, aber der rest macht jetzt sinn.beim inhalt prüfen. spontan würde ich das mit ner IF abfrage machen:
if (eing[1] >= 0 and eing[1] <=9 or ein[1]== A or ein[1] ==B or ein[1]==C ...)
{...}gibts da eine elegantere lösung für?
nochmals danke.
-
Der Inhalt von "eing" (char[] nehm ich mal an) wird nicht 1 sondern '1' sein. Die char Werte kannst du genauso vergleichen wie Zahlen, da sie eigentlich nur Zahlen sind und jeder Buchstabe einer Zahl entspricht(siehe ASCII Tabelle).
Alsofor(int pos=0... if (eing[pos] >= '0' && eing[pos] <='9' ... )// zwischen 'A' und 'F' gehts genauso.
Du verwendest schon C, oder?
-
ohje. mir ist gerade erst aufgefallen, was ich fürn mist ich eben geschrieben hatte, tut mir leid. das is die übermüdung. so langsam klingelts im kopf. die abfragung dürfte jetzt keine probleme mehr machen.vielen vielen dank.,jedoch weiß ich noch nicht genau, wie die eingabe zu realisieren ist.
ist es möglich, das der benutzer eine ziffer eingibt und dieser wert direkt in ein char feld gespeichert wird? also das nur die letzte ziffer mit "ENTER" bestätigt werden muss?achja noch eine frage fällt mir gerade ein. es könnte ja sein, das der benutzer weniger als 8 ziffern eingibt. wie setze ich das um, das die wertigkeiten dann trozdem richtig verteilt werden?
lass ich jedes mal die länge zählen und mach dann zu jeder erlaubten länge eine IF anweisung, wo die wertigkeiten immer variieren? da gibts doch sicher eine einfachere methode oder ?
-
Nachrichtentext: schrieb:
Du verwendest schon C, oder?
ich glaub' das machen fast alle in diesem unterforum
@OP
man könnte auch sowas machen (für jedes zeichen)... if (c > '9') c = (c&0xdf) - 'A' + 10; // buchstaben ergeben 10...X else c -= '0'; // zahlen ergeben 0...9 if (c > 15) { // fehleingabe } else { // okay (0<=c<=15) } ...
kann beides, gross- und kleinbuchstaben verarbeiten. in c steht dann 0 für '0' bis 15 für 'f' bzw. 'F'
-
ich glaube er hat sich gewundert warum ich AND und OR geschrieben habe
naja wie gesagt. zu viel arbeit zu wenig zeit das führt zu wenig schlaf und "dummen einträgen"hm verstehe dein code leider nicht ganz.
könntest du das näher erleutern, was was ist?if (c > '9') c = (c&0xdf) - 'A' + 10; // buchstaben ergeben 10...X else c -= '0';
besonders:
(c&0xdf)
und
c -= '0'
-
tim-buktu schrieb:
besonders:
(c&0xdf)
damit wird das bit 5 ausgeblendet und dann hat man immer grossbuchstaben.
tim-buktu schrieb:
und
c -= '0'
das macht aus den ascii-zeichen '0' bis '9' zahlenwerte (0 bis 9)
-
hmmm nur mal so ob ichs verstanden hab.
für 11 wäre der code dann folgender:... if (c > '9') c = (c&0xdf) - 'B' + 11; else c -= '0'; ...
c ist vom typ char oder ?
hättest du vielleicht ein etwas längeres beispiel, denn irgend wie blick ich immer noch nicht ganz durch... bin was neben der spur im moment, sorry.
achja, das problem mit der eingabe ist auch noch da. also die realisierung von der wertigkeitvergabe. ich wüsste nur, wie ichs machen könnte, wenn der benutzer IMMER 8 ziffern eingibt. zu meinem nachteil soll er jedoch auch weniger eingeben können.
-
tim-buktu schrieb:
hmmm nur mal so ob ichs verstanden hab.
für 11 wäre der code dann folgender:nee, hast es leider nicht verstanden...
'c' ist die variable, der code bleibt unverändert.
wenn vorher c=='B' dann nachher c==11
:xmas2:
-
okay. ich stell mich mal in die ecke:D
kannst du mir noch erklären, was das (- 'A' + 10
) genau bewirkt und warum? für die ganz doofen wie mich halt
gut. bin eben von der arbeit gekommen, werd jetzt mal anfangen. weiß jedoch noch nicht wie das mit der wertigkeitverteilung umzusetzen ist. wenn man immer 8 ziffern eingibt, dann ists ja kein problem, aber bisher ist mir noch kein lich aufgegangen, wie es bei variabler anzahl funktionieren soll.
-
c = (c&0xdf) - 'A' + 10;
(c&0xdf) wandelt kleinbuchstaben wie 'a', 'h' usw. in großbuchstaben 'A', 'H' usw. um.
-'A' + 10 wandelt die zahl in dezimal um.
-'A' zieht erstmal von c den ascii-wert von 'A' ab. +10 kommt daher, weil 0-9 schon durch die abfrage vorher abgedeckt ist(if c > '9') und dann somit z.B. A, 10 ist.
Bsp.
'C' - 'A' == 2
2+10==12ps. sorry wenns nich gut formuliert ist, ist halt schon bisschen spät
-
alles klar. ich habs verstanden. wäre ich nich drauf gekommen.
so füße sind hochgelegt, kaffee steht aufm schreibtisch, jetzt kanns losgehen.
hmmm aber mit den wertigkeiten is mir immer noch nichts eingefallen. da brauch ich auf jedenfall noch hilfe, wenns möglich ist.
-
du meinst das mit der variablen anzahl ziffern?
wie wärs den mit einer variabel, die bei jeder neuen ziffer hochgezählt wird? (do-while schleife z.B.)
-
hatte ich auch schon dran gedacht.
das es 8 unterschiedliche fälle gibt. also wenn zählervariable 1 ist, dann wertigkeit 16^0 wenn 2 dann erste zahl 16^1 und zweite zahl 16^0... so meinst du das doch oder ?
gibt es da noch eine elegantere lösung?
-
3F = 3 * 16^1 + F *16^0
Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.
-
BuddyHolly schrieb:
3F = 3 * 16^1 + F *16^0
Du musst also von hinten mit 0 anfangen, egal wie lang der text ist.ausgehend von dem code weiter oben:
unsigned long hexstring_to_number (char *str) { unsigned long res = 0; while (*str) { char c = *str++; if (c > '9') c = (c&0xdf) - 'A' + 10; // buchstaben ergeben 10...X else c -= '0'; // zahlen ergeben 0...9 if (c > 15) { // fehleingabe // muss irgendwie behandelt werden } else { // okay (0<=c<=15) res = (res<<4) + c; } } return res; }
-
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?
-
tim-buktu schrieb:
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?jede hexziffer steht für 4 bits (0x0 == 0000, 0xf == 1111).
'res' akkumuliert diese bits. für jede neue ziffer (eine stelle mehr) wird res erstmal 4 mal links geschoben (entspricht einer multiplikation mit 16) und dann kommen die neuen 4 bits an die frei gewordenen stellen...
:xmas2:testing...
-
tim-buktu schrieb:
ich hab mal wieder was nich ganz verstanden.
was bewirkt die variable res ?
und warum wird sie um 4 bit nach links verschoben?Egal. Machst doch ganz einfach
summe = 0 Text von hinten her durchgehen { wenn textzeichen bei aktueller position zwischen '0' und '9' summe += (textzeichen bei aktueller position - '0') * 16^(länge-position) sonst das selbe mit 'a' bis 'f' }
Dann brauchst du auch nix schieben.