Ich will von einer dreistelligen Zahl die Quersumme berechnen.
Ich hab dies geschrieben:
char Zahl[5];
quersumme = Zahl[0] + Zahl[1] + Zahl[3]
aber es funktioniert nicht. wenn die zahl 123 lautet, dann kommt 150 raus oder irgendsowas komisches
Ich will von einer dreistelligen Zahl die Quersumme berechnen.
Ich hab dies geschrieben:
char Zahl[5];
quersumme = Zahl[0] + Zahl[1] + Zahl[3]
aber es funktioniert nicht. wenn die zahl 123 lautet, dann kommt 150 raus oder irgendsowas komisches
okay ich probiers mal aus! also mdk's code funzt nicht. jetzt probier ich dimitrij's
boah ich dreh durch mit dem beispiel. ich kriegs einfach net raus. auch die lösung von dimitrij stimmt net
Du hast also die Zahl in einem char Array stehen? Wenn das wirklich character aus der ASCII Tabelle sind, dann musst du 48 abziehen. Das liegt daran, dass das ZEICHEN "0" in der Tabelle den Wert 48 hat usw.
siehe z.B.: http://bueltge.de/wk-ascii-zeichen/162
Also:
[size=10][/SIZE][size=10][COLOR=#0000ff][size=10][/SIZE][size=10][COLOR=#0000ff]char[/COLOR][/SIZE][size=10]* [COLOR=black]Zahl = [/COLOR][/SIZE][size=10][COLOR=black]"123"[/COLOR][/SIZE][size=10][COLOR=black];[/COLOR]
[/SIZE][size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] [COLOR=black]quersumme = (Zahl[0]-48) + (Zahl[1]-48) + (Zahl[2]-48);[/COLOR]
[/SIZE][/COLOR][/SIZE][size=10]
[/SIZE]
müsste funktionieren
Ja, Dimitrijs Code sollte funktionieren. Das ursprüngliche geht deshalb nicht, weil nämlich deine Zahl als char-Array gespeichert ist, und '1' ist der ASCII-Wert des Buchstabens '1', nicht die Zahl 1.
Die ganzen ASCII-Werte für '0' bis '9' liegen zwar auch alle nebeneinander, haben aber viel höhere Zahlenwerte als die eigentlichen Zahlen. (Um 48 höher als die Originalzahl.) Deshalb musst du schauen, dass du aus deinem ASCII-Wert wieder zum Originalwert kommst, und das geht mit ([ASCII-Wert] - '0'). Wobei '0' für 48 steht, is aber leichter zu merken
Das Ganze ist deshalb dann so: ('0' - '0' == 0), ('1' - '0' == 1), usw.
Die flexible Quersummenberechnung kann man folglich z.B. so schreiben (ungetestet):
edit: hm, da waren wohl ein paar andere in der Zwischenzeit auch schon mit Erklärungen da.
Deswegen kommt bei dir auch 150 raus.. du hast 3 character mit jeweils 48 zuviel.. 48*3 = 144 + 6 = 150. (Da 6 die quersumme ist)
ich hab das bei dem beispiel mit der durch drei teilbaren zahl so gelöst:
int zahl,z1, z2, z3, var, summe;
cout << "Geben Sie eine dreistellige Zahl ein: " << '\n';
cin >> zahl;
z1 = zahl % 10;
var = zahl/10;
z2 = var % 10;
var = var/10;
z3 = var % 10;
summe = z1+z2+z3;
cout << zahl;
if ((summe % 3) == 0) cout << " ist durch 3 teilbar " << endl;
else cout << " ist nicht durch 3 teilbar" << '\n';
wie das 1. beispiel geht, ist mir nicht so ganz klar, muss zwar sicherlich mit denselben strategien lösbar sein, aber wie ich die stellen dann vergleichen soll.....
dann musst du 48 abziehen
Wäh, pfui, graus. Wenn schon jemand die korrektere, selbstdokumentierende, portable Antwort, daß man '0' abziehen muß, gepostet hat, wieso dann noch so einen Schund schreiben?
Was soll daran Schund sein? Ein character ist im Prinzip nur ein Zahlenwert, der durch eine Tabelle einem Zeichen entspricht. Was spricht dagegen von einem Wert eine Zahl abzuziehen? Und wie kommst du darauf, dass '0' "korrekter" ist?
Man muss '0' abziehen? Na Mahlzeit..
Und wie kommst du darauf, dass '0' "korrekter" ist?
'0' ist verständlicher, du siehst auf einen Blick, warum das dortsteht.
aber es is nicht korrekter.. Und ehrlich gesagt ich tu mir leichter, wenn ich wirklich weiß, wieviel abgezogen wird.. weil wenn ich jetzt 3 mehr abziehen muss, was zieh ich dann ab? Was steht 3 Werte hinter '0'? Jedem wie ers lieber hat, aber darüber herziehn braucht keiner.
Eine fixe Zahl ist nicht besonders portabel. Auf einem anderen Zeichensatz stimmt sowas schnell nicht mehr. Lesbarer ist es außerdem wirklich mit '0', man hat vielleicht nicht den kompletten ASCII-Code im Kopf, was mit '0' gemeint ist, ist allerdings klar.
Ich nehms eh zur Kenntnis, dass '0' als Referenz überschaubarer ist, aber mir gings darum, dass es genauso korrekt ist.
Man muss '0' abziehen? Na Mahlzeit..
Interpretier da nicht zu viel rein, du hast zuerst das Verb "müssen" verwendet.
aber es is nicht korrekter..
Es bietet weniger Möglichkeiten für den Code, nicht gemäß der Spezifikation zu funktionieren. Für mich ist das korrekter.
ZitatWas steht 3 Werte hinter '0'?
'0' + 3 == '3'. Du kannst die ASCII-Tabelle auswendig, ich den C-Standard. Ich glaube, meine Variante ist für C-Programmierer sinnvoller
'0' + 3 == '3'.
Mit "hinter" hab ich eigentlich davor gemeint.. war schlecht ausgedrückt.
Alles anzeigenich hab das bei dem beispiel mit der durch drei teilbaren zahl so gelöst:
int zahl,z1, z2, z3, var, summe;
cout << "Geben Sie eine dreistellige Zahl ein: " << '\n';
cin >> zahl;z1 = zahl % 10;
var = zahl/10;
z2 = var % 10;
var = var/10;
z3 = var % 10;
summe = z1+z2+z3;cout << zahl;
if ((summe % 3) == 0) cout << " ist durch 3 teilbar " << endl;
else cout << " ist nicht durch 3 teilbar" << '\n';
wie das 1. beispiel geht, ist mir nicht so ganz klar, muss zwar sicherlich mit denselben strategien lösbar sein, aber wie ich die stellen dann vergleichen soll.....
Hi Nanny. funktioniert es denn so bei dir? wie bist du auf das mit dem "%" gekommen? und was genau bedeutet var?
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!