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!
  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 27. Oktober 2006 um 13:49
    • #21
    Zitat von gelbasack

    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.

  • Plantschkuh!
    Punkte
    6.173
    Beiträge
    1.181
    • 27. Oktober 2006 um 14:14
    • #22
    Zitat von hal

    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.

  • hal
    Punkte
    11.122
    Beiträge
    2.208
    • 27. Oktober 2006 um 14:19
    • #23
    Zitat von Plantschkuh!

    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.

  • Ivy
    Punkte
    4.920
    Beiträge
    889
    • 27. Oktober 2006 um 16:46
    • #24

    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;
    }

  • Ivy
    Punkte
    4.920
    Beiträge
    889
    • 27. Oktober 2006 um 17:03
    • #25

    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

  • Paulchen
    Gast
    • 27. Oktober 2006 um 17:28
    • #26

    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?

  • Ivy
    Punkte
    4.920
    Beiträge
    889
    • 27. Oktober 2006 um 17:31
    • #27

    jo ich versuchs mal mit int. vielleicht liegts echt am double. vielleicht checkt ers einfach net gscheit zu runden

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum