Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.09.2015, 16:20

[C#] Problem mit Schriftlicher Addition

Hi,

Ich möchte einen "Schridtlichen Additions"-Algorithmus in C# schreiben. (Bitte sagt mir jetzt nicht das normale Int-Rechnung sowieso viel schneller wäre, das weiß ich auch, ich mach das nur als Lernaufgabe).

Ich habe es auch soweit geschafft. Man kann 2 Zahlen in String-Form eingeben und diese werden dann adidert. Die Übertragrechnung funktioniert eigentlich auch und die meisten Aufgaben die ich dann ausprobiere stimmen dann auch.

Mein Problem: Es gibt ein paar spezielle Aufgaben wo völliger Quatsch als Ergebnis rauskommt. Und ich weiß nicht woran das liegt.
Hier ist der Code:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
        /// the constructor
        /// </summary>
        /// <param name="type">the operation type</param>
        /// <param name="left">first number</param>
        /// <param name="right">second number</param>
        public Calculator(OpType type, string left, string right)
        {
            // change color
            Console.ForegroundColor = ConsoleColor.Yellow;

            // add zeroes (if needed)
            if (left.Length == right.Length)
            {
                // alles ok
            }
            else if (left.Length > right.Length)
            {
                right = Util.AddZeroes(right, left.Length - right.Length);
            }
            else if (left.Length < right.Length)
            {
                left = Util.AddZeroes(left, right.Length - left.Length);
            }

            // calculate
            if (type == OpType.Add)
            {
                Add(left, right);
            }
        }

        /// <summary>
        /// adds two numbers together
        /// </summary>
        /// <param name="left">the first number</param>
        /// <param name="right">the second number</param>
        public void Add(string li, string ri)
        {
            // carry switcher
            bool over = false;
  
            // the additon result
            List<int> res = new List<int>();

            // calculation loop
            for (int x = li.Length - 1; x > -1; x--)
            {
                // get ints
                int l = (int)Char.GetNumericValue(li[x]);   // left
                int r = (int)Char.GetNumericValue(ri[x]);   // right

                // calculate result
                int e = l + r;

                // if greater than 9
                if (e > 9)
                {
                    // subtract 10 from the result to get real number
                    int ne = e - 10;

                    // if over is true
                    if (over == true)
                    {
                        // add one to result
                        ne = ne + 1;
                    }

                    // add result
                    res.Add(ne);

                    // set over to true
                    over = true;
                }
                else
                {
                    // add to result list
                    if (over == true)
                    {
                        // increase result by one
                        e = e + 1;
                    }

                    // add result
                    res.Add(e);

                    // set over to false
                    over = false;
                }
            }

            // get result string
            string result = Util.Reverse(String.Join("", res.ToArray()));

            // print result
            Console.WriteLine(result);
        }


Und hier dann ein Bild vom Programm nachdem ein paar Aufgaben ausgerechnet wurden:

(Link)


Wie man sieht, stimmen die ersten drei, das vierte aber nicht.
Könnte mir vielleicht jemand sagen wo der Fehler liegt?

Danke :)
mfg

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

12.09.2015, 16:24

Du wirst deinen Fehler sehr schnell finden, wenn du den Debugger verwendest. starte dein programm nur mit deinem fehlerhaften anwendungsfall, setze einen haltepunkt am Anfang der Funktion und debugge schrittweise durch. Wenn du mit Visual Studio arbeitest kannst du auch einfach die Maus über eine Variable deiner Wahl halten und du siehst den Wert. Einfach, damit du es auch in Zukunft selbst lösen kannst. :)

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

12.09.2015, 16:25

Du addierst die zwei Stellen der Zahl, überprüfst ob das Ergebnis größer als 9 ist und weißt dann dass du einen Übertrag hast. Aber erst danach guckst du was mit dem alten Übertrag ist. Das musst du vorher machen. Beide Zahlen addieren plus den letzten Übertrag und erst jetzt gucken. Ich würde dir vorschlagen deine Variablenbenennung noch mal zu überdenken. Dinge wie over etc sind nicht besonders aussagekräftig und ich hätte sie erst falsch interpretiert.

edit: TrommlBomml hat an sich recht. Es wäre sinnvoll wenn du da mit dem Debugger an solche Probleme ran gehst. Solltest du in diesem Fall auch trotzdem mal machen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

4

12.09.2015, 16:29

@Schorsch: Meinst du diese Stelle?

C#-Quelltext

1
2
3
4
5
6
7
8
9
               // subtract 10 from the result to get real number
                    int ne = e - 10;

                    // if over is true
                    if (over == true)
                    {
                        // add one to result
                        ne = ne + 1;
                    }

Du sagst ja das ich den alten Übertrag zuerst auswerten soll meinst du das so?

C#-Quelltext

1
2
3
4
5
6
7
8
9
int ne;
if (over == true)
{
   ne = e - 10 + 1
}
else
{
 ne = e - 10
}

??

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GameXCraft« (12.09.2015, 16:35)


5

12.09.2015, 16:40

Vergisst einfach meine Frage "Meinst du diese Stelle?"

Da hab ich nicht wirklich nachgedacht :)
Ich hab mir Schorsch's Nachricht noch mal richtig durchgelesen und jetzt funktioniert es.

Danke! :thumbup:

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

12.09.2015, 16:41

Nein. Mach mal was TrommlBomml gesagt hat. Dann sollte klar werden wo das Problem liegt. Und der Debugger ist ein super Werkzeug das man sich möglichst früh ansehen sollte weil es dir unendlich viel Frust bei der Fehlersuche erspart.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

12.09.2015, 16:45

Ok, ja mach ich. Ja trotzdem danke.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

8

12.09.2015, 16:46

@GameXCraft: Die ersten paar Jahre habe ich auch meinen Code durch reine Analyse untersuchen wollen und war zu "faul" für Debuggen bzw. fand es unsinnig. Mittlerweile stehe ich genau anders herum dazu und ärgere mich, wenn ich mal was nicht debuggen kann, was nicht offensichtlich falsch ist. Glaub mir, du wirst es lieben! (Gerade mit C#)

9

12.09.2015, 21:19

@TrommlBomml: Ja, ich werde deinen Rat befolgen, da ich glaube das du auch schon "ein bisschen" erfahrener bist als ich. Ich frage in Foren auch nur wenn ich etwas lange probiert habe und trotzdem nicht geschafft habe und es dann im Internet dazu keine passenden Lösungen gibt. Ja ok danke an euch :)

Werbeanzeige