1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Quersumme berechnen

  • Ivy
  • 26. Oktober 2006 um 18:27
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Ivy
    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

  • mdk
    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
    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';
  • Ivy
    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

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

  • Dimitrij
    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;
    }
  • Swoncen
    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

  • J.Petso
    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 :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
    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.

  • Swoncen
    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)

  • NannyOg
    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!
    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?

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

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

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

  • Plantschkuh!
    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 :)

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

  • Ivy
    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?

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

  1. Datenschutzerklärung
  2. Impressum