Quersumme berechnen

  • Eine fixe Zahl ist nicht besonders portabel. Auf einem anderen Zeichensatz stimmt sowas schnell nicht mehr.


    Auf der anderen Seite gehst du aber davon aus, dass die Zeichen 123456789 immer genau in dieser Reihenfolge nach dem Zeichen 0 kommen. Wenn ein Zeichensatz zB 1234567890 drinnen hat (was gar net soo überraschend wäre), funktioniert der Code erst recht nicht.
    De facto verwendet seit den 80ern des vorigen Jahrhunderts kein System mehr einen Zeichensatz, der nicht auf ASCII basiert (sogar das LCD vor mir mit HD44870-Controller verwendet ein encoding, das in den ersten 128 Zeichen ASCII entspricht). Im Grunde geht es bei '0' vs. 48 nur darum, was besser lesbar ist. Niemand weiß, was 48 bedeuten soll dort. Wenn man zusätzlich noch 3 abziehen will, kann man ja einfach ('0'-3) schreiben.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]


    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Wenn ein Zeichensatz zB 1234567890 drinnen hat (was gar net soo überraschend wäre), funktioniert der Code erst recht nicht.


    Das wär für einen C-Programmierer insofern kein Problem, als der C-Standard vorschreibt, daß die Ziffern von 0 bis 9 direkt aufeinanderfolgend in der richtigen Reihenfolge im Zeichensatz vorkommen. (Für Buchstaben gilt das nicht.)


    Zitat

    De facto verwendet seit den 80ern des vorigen Jahrhunderts kein System mehr einen Zeichensatz, der nicht auf ASCII basiert


    z/OS auf IBMs zSeries verwendet (optional, glaub ich, aber doch) zum Beispiel noch EBCDIC. Außerdem muß man sich in bestimmten Bereichen auch heutzutage immer wieder mit Legacy-Systemen rumschlagen. (Meine Mutter muß unter anderem immer wieder steinalte Cobol-Progamme warten -- es ist halt nicht alles Java und PHP :))


    Zitat

    Niemand weiß, was 48 bedeuten soll dort. Wenn man zusätzlich noch 3 abziehen will, kann man ja einfach ('0'-3) schreiben.


    Klar, wobei fraglich ist, ob das irgendeine sinnvolle Semantik besitzt.

  • z/OS auf IBMs zSeries verwendet (optional, glaub ich, aber doch) zum Beispiel noch EBCDIC.


    Dass jemand mit einem Gegenbeispiel daherkommt war mir klar :)


    Zitat

    Klar, wobei fraglich ist, ob das irgendeine sinnvolle Semantik besitzt.


    48 besitzt überhaupt keine Semantik, außer, die 47. Zahl nach der 1 zu sein.


    Ich halte ja "3 Zeichen vor '0'" allgemein für keine Sache, die wirklich in der Praxis vorkommt, aber man sollte ja immer für alle Eventualitäten gerüstet sein.

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]


    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • so. i habsjetzt auf meine art gemacht. allerdings funktionierts so nur manchmal (bei 123 zB. kommt 5 raus. bei 222 allerdings 6). i weiß net wo der fehler liegt. vielleicht seht ihr es (die zeile, wo a b und c ausgegeben werden soll hab ich n ur geschrieben, damit i kontrollieren kann was er da ausgrechnet hat für die einzelnen werte.


    #include <iostream>
    using namespace std;


    int main()
    {


    double x, y, z, a, b, c;


    cout << "Bitte geben Sie eine dreistellige Zahl ein: ";
    cin >> x;


    a = x / 100; // zB 436 a = 4,36
    a = int(a); // a = 4


    y = (x / 100) - a; // 436 / 100 - 4 = 0,36
    b = (y * 10); // b = 0,36 * 10 = 3,6
    b = int(b); // b = 3


    z = (y * 10) - b; // 0,36 * 10 - 3 = 0,6
    c = z * 10; // c = 6,0
    c = int(c); // c = 6



    cout << "a: " << a << ", b: " << b << ", c: " << c << endl;


    int quersumme;


    quersumme = a + b + c;


    cout << "Die Quersumme betraegt " << quersumme << endl;



    if (quersumme % 3 == 0)


    cout << "Die Ziffernsumme ist durch drei teilbar";
    else
    cout << "Die ziffernsumme ist nicht durch drei teilbar";


    return 0;
    }

  • nachdem ich mir nach jeder zeile jetzt jeden wert ausgeben lassen hab, bin ich draufgekommen, dass es an der zeile


    quersumme = a + b + c


    liegen muss.


    er hat zwar für a, b und c die richtigen werte, gibt aber immer eins weniger aus, als die lösung (bei 123 gibt er fünf aus. bei 464 gibt er 13 aus usw.). außer bei gleichziffrigen zahlen (zB. 333 oder 222). da gibts immer die richtige lösung. ich frag mich echt wieso

  • Also wenn der oben gepostete Code bei dir tatsächlich falsche Werte liefert, würd ich an deiner Stelle meinen Compiler kübeln und einen gescheiten verwenden. g++ in der Version 4.1.1 hat keine Probleme, die Ziffernsummen werden korrekt berechnet.


    Nur eine Frage: Wieso arbeitest du eigentlich mit double, wenn du ohnehin nur ganzzahlige Werte hast?

Jetzt mitmachen!

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