Quersumme berechnen

  • 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

    Wer FU sagt, muss auch T sagen

  • 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:

    Code
    1. [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]
    2. [/SIZE][size=10][COLOR=#0000ff]int[/COLOR][/SIZE][size=10] [COLOR=black]quersumme = (Zahl[0]-48) + (Zahl[1]-48) + (Zahl[2]-48);[/COLOR]
    3. [/SIZE][/COLOR][/SIZE][size=10]
    4. [/SIZE]



    müsste funktionieren

    640K ought to be enough for anybody. :eek2:

  • 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 :D
    Das Ganze ist deshalb dann so: ('0' - '0' == 0), ('1' - '0' == 1), usw.


    Die flexible Quersummenberechnung kann man folglich z.B. so schreiben (ungetestet):

    Code
    1. char Zahl[LEN];
    2. int ergebnis = 0;
    3. for (int i = 0; i < LEN; i++) {
    4. ergebnis += Zahl[i] - '0';
    5. }


    edit: hm, da waren wohl ein paar andere in der Zwischenzeit auch schon mit Erklärungen da.

    "Egbert B. Gebstadter is the Egbert B. Gebstadter of indirect self-reference." - Egbert B. Gebstadter

  • 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.....

  • 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..

    640K ought to be enough for anybody. :eek2:

  • 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.

    640K ought to be enough for anybody. :eek2:

  • 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.

  • 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.


    Quote

    Was 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 :)

  • Hi Nanny. funktioniert es denn so bei dir? wie bist du auf das mit dem "%" gekommen? und was genau bedeutet var?

    Wer FU sagt, muss auch T sagen