1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Quersumme berechnen

  • Ivy
  • 26. Oktober 2006 um 18:27
  • Unerledigt
  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 26. Oktober 2006 um 18:27
    • #1

    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

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 26. Oktober 2006 um 18:36
    • #2

    wie wäre es mit

    Code
    char Zahl[3];
    
    
    quersumme = Zahl[0] + Zahl[1] + Zahl[2];
  • Dimitrij
    7
    Dimitrij
    Mitglied
    Reaktionen
    12
    Punkte
    437
    Beiträge
    73
    • 26. Oktober 2006 um 18:43
    • #3
    Code
    quersumme = Zahl[0] - '0' + Zahl[1] - '0' + Zahl[2] - '0';

    also:

    Code
    quersumme = Zahl[0] + Zahl[1] + Zahl[2] - 3 * '0';

    de.lernu.net, lingwadeplaneta.info

  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 26. Oktober 2006 um 18:49
    • #4

    okay ich probiers mal aus! also mdk's code funzt nicht. jetzt probier ich dimitrij's

    Wer FU sagt, muss auch T sagen

  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 26. Oktober 2006 um 19:01
    • #5

    boah ich dreh durch mit dem beispiel. ich kriegs einfach net raus. auch die lösung von dimitrij stimmt net

    Wer FU sagt, muss auch T sagen

  • Dimitrij
    7
    Dimitrij
    Mitglied
    Reaktionen
    12
    Punkte
    437
    Beiträge
    73
    • 26. Oktober 2006 um 19:03
    • #6

    andere Möglichkeit:

    Code
    int quersumme(int z) {
        int sum = 0;
        while (z > 0) {
            sum += z % 10;
            z /= 10;
        }
        return sum;
    }

    de.lernu.net, lingwadeplaneta.info

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 26. Oktober 2006 um 19:04
    • #7

    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
    [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

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

  • J.Petso
    15
    J.Petso
    Mitglied
    Reaktionen
    14
    Punkte
    2.384
    Beiträge
    457
    • 26. Oktober 2006 um 19:05
    • #8

    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 :grinning_squinting_face:
    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
    char Zahl[LEN];
    int ergebnis = 0;
    
    
    for (int i = 0; i < LEN; i++) {
      ergebnis += Zahl[i] - '0';
    }


    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

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 26. Oktober 2006 um 19:06
    • #9

    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)

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

  • NannyOg
    2
    NannyOg
    Mitglied
    Punkte
    20
    Beiträge
    3
    • 26. Oktober 2006 um 21:24
    • #10

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

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 26. Oktober 2006 um 21:44
    • #11
    Zitat von Swoncen

    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?

    *plantsch*

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 26. Oktober 2006 um 22:44
    • #12

    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:

  • Paulchen
    1
    Paulchen
    Gast
    • 26. Oktober 2006 um 22:52
    • #13
    Zitat von Swoncen

    Und wie kommst du darauf, dass '0' "korrekter" ist?

    '0' ist verständlicher, du siehst auf einen Blick, warum das dortsteht.

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 26. Oktober 2006 um 23:04
    • #14

    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:

  • gelbasack
    25
    gelbasack
    Mitglied
    Reaktionen
    90
    Punkte
    6.525
    Beiträge
    1.241
    • 26. Oktober 2006 um 23:12
    • #15

    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.

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 26. Oktober 2006 um 23:30
    • #16

    Ich nehms eh zur Kenntnis, dass '0' als Referenz überschaubarer ist, aber mir gings darum, dass es genauso korrekt ist.

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

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 26. Oktober 2006 um 23:54
    • #17
    Zitat von Swoncen

    Man muss '0' abziehen? Na Mahlzeit..


    Interpretier da nicht zu viel rein, du hast zuerst das Verb "müssen" verwendet.

    Zitat von Swoncen

    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.

    Zitat

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

    *plantsch*

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 27. Oktober 2006 um 02:38
    • #18
    Zitat von Plantschkuh!

    '0' + 3 == '3'.



    Mit "hinter" hab ich eigentlich davor gemeint.. war schlecht ausgedrückt.

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

  • Ivy
    22
    Ivy
    Mitglied
    Reaktionen
    35
    Punkte
    4.920
    Beiträge
    889
    • 27. Oktober 2006 um 08:59
    • #19
    Zitat von NannyOg

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

    Alles anzeigen

    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

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 27. Oktober 2006 um 09:00
    • #20
    Zitat von Ivy

    wie bist du auf das mit dem "%" gekommen?

    % = modulo

    z.b. 10 % 2 = 10 mod 2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung