C# Variablenwert nach Berechnung immer 0

>|Sh4d0w|<

Commander
Dabei seit
Jan. 2009
Beiträge
2.375
Hallo Leute, ich erstelle mir gerade einen Bruchrechner, der im momentanen Stadium ersteinmal 2 Brüche dividieren kann. Später erfolgen dann noch switch case Anweisungen.
Ich habe absichtlich eine Struktur angelegt, damit ich Strukturen gleichzeitig mal übe.

So - jetzt zu meinem Problem. Ich habe ersteinmal beide Brüche gegenseitig multiplizert. D. h Zähler1 * Nenner 2 und Nenner1 * Zaehler 2. Diese ergeben dann meine beiden Zwischenvariablen uiZaehlerErg und uiNennerErg. Der Bruch wird später mit Abhängigkeit des Vorzeichens am Ende und gleichzeitig in einer Kommazahl ausgegeben. Jetzt hakt es bei der Kommazahl, denn diese ist immer 0.

gerechnet wird mit:
berechnung.fErgebnis = (1 / berechnung.uiNennerErg) * berechnung.uiZaehlerErg;

Es funktioniert wenn ich z. B eingebe.:
berechnung.fErgebnis = 100 + 10;

Zum testen habe ich mir innerhalb der BerechnungBruch - Methode eine C.WL Ausgabe eingefügt, die die eingegebenenen Werte auch ausgibt, um zu prüfen ob die Variablenwerte richtig übergeben wurden etc. Das geht auch alles!

Wo liegt jetzt der Fehler :freak:? Ich such mittlerweile schon fast ne Stunde rum und ein Schulkollege findet den Fehler ebenfalls nicht.

MfG Alex :D




Code:
using System;
using System.Collections.Generic;
using System.Text;

namespace Bruchrechner
{
    class Program
    {
        public struct Bruch
        {
            public uint uiZaehler1;
            public uint uiZaehler2;
            public uint uiZaehlerErg;
            public uint uiNenner1;
            public uint uiNenner2;
            public uint uiNennerErg;
            public char cVorzeichen1;
            public char cVorzeichen2;
            public char cVorzeichenErg;
            //Für Konvertierung
            public string sZaehler1;
            public string sZaehler2;
            public string sNenner1;
            public string sNenner2;
            public string sVorzeichen1;
            public string sVorzeichen2;

            public float fErgebnis;
        }

         static void Main(string[] args)
        {
            Console.WriteLine("\t\tBruchrechner");
            Console.WriteLine("\t\t============");

            Bruch meinBruch = EingabeBruch();

            Bruch ausgabeBruch = BerechnungBruch(meinBruch);

            AusgabeBruch(ausgabeBruch);
            
        }

        static Bruch EingabeBruch()
        {
            Bruch eing = new Bruch();

            //Eingabe 1. Bruch
            do
            {
                Console.WriteLine("1. Bruch");
                Console.Write("Vorzeichen des Bruches: ");
                eing.sVorzeichen1 = Console.ReadLine();
                eing.cVorzeichen1 = Convert.ToChar(eing.sVorzeichen1);
            } while (eing.cVorzeichen1 != '-');

            Console.Write("Zaehler eingeben: ");
            eing.sZaehler1 = Console.ReadLine();
            eing.uiZaehler1 = Convert.ToUInt32(eing.sZaehler1);

            do
            {
                Console.Write("Nenner eingeben: ");
                eing.sNenner1 = Console.ReadLine();
                eing.uiNenner1 = Convert.ToUInt32(eing.sNenner1);
            } while (eing.uiNenner1 == 0);

            //Eingabe 2. Bruch
            Console.WriteLine("\n\n2. Bruch");
            Console.Write("Vorzeichen des Bruches: ");
            eing.sVorzeichen2 = Console.ReadLine();
            eing.cVorzeichen2 = Convert.ToChar(eing.sVorzeichen2);

            Console.Write("Zaehler eingeben: ");
            eing.sZaehler2 = Console.ReadLine();
            eing.uiZaehler2 = Convert.ToUInt32(eing.sZaehler2);

            do
            {
                Console.Write("Nenner eingeben: ");
                eing.sNenner2 = Console.ReadLine();
                eing.uiNenner2 = Convert.ToUInt32(eing.sNenner2);
            } while (eing.uiNenner2 == 0);

            return eing;
        }
        
        static Bruch BerechnungBruch(Bruch berechnung)
        {
            berechnung.uiZaehlerErg = berechnung.uiZaehler1 * berechnung.uiNenner2;
            berechnung.uiNennerErg = berechnung.uiNenner1 * berechnung.uiZaehler2;

            if (berechnung.cVorzeichen1 == '+' && berechnung.cVorzeichen2 == '+')
            {
                berechnung.cVorzeichenErg = '+';
            }

            else if (berechnung.cVorzeichen1 == '-' && berechnung.cVorzeichen2 == '-')
            {
                berechnung.cVorzeichenErg = '+';
            }

            else if (berechnung.cVorzeichen1 == '+' && berechnung.cVorzeichen2 == '-' || berechnung.cVorzeichen1 == '-' && berechnung.cVorzeichen2 == '+')
            {
                berechnung.cVorzeichenErg = '-';
            }

            [B][COLOR="Red"]berechnung.fErgebnis = 1 / berechnung.uiNennerErg * berechnung.uiZaehlerErg;[/COLOR][/B]
            
            //Überprüfung der Variablen
            //Console.WriteLine("Z1: " + berechnung.uiZaehler1 + "   N1: " + berechnung.uiNenner1 + "   Z2: " + berechnung.uiZaehler2 + "   N2: " + berechnung.uiNenner2);
            Console.WriteLine("Erg: " + berechnung.fErgebnis);

            return berechnung;
        }

        static void AusgabeBruch(Bruch ausgabe)
        {
            //Überprüfung der Variablen
            //Console.WriteLine("Z1: " + ausgabe.uiZaehler1 + "   N1: " + ausgabe.uiNenner1 + "   Z2: " + ausgabe.uiZaehler2 + "   N2: " + ausgabe.uiNenner2 + "Erg :" + ausgabe.fErgebnis);


            Console.Write("\n\n\tErgebnis: " + ausgabe.cVorzeichenErg + ausgabe.uiZaehlerErg + "/" + ausgabe.uiNennerErg);
            Console.Write("  oder  " + ausgabe.cVorzeichenErg + ausgabe.fErgebnis);
            Console.WriteLine("\n\t==========================");

            Console.ReadKey();
        }        
    }
}
 

Rumbah

Lieutenant
Dabei seit
Apr. 2004
Beiträge
642
Ich denke mal, dass du berechnung.uiNennerErg erst in float wandeln musst, sonst hast du wahrscheinlich nämlich ne Ganzzahldivision (kenne mich mit C# nicht aus, aber denke mal, dass das das Problem ist). Und wenn berechnung.uiNennerErg größer als 1 ist, dann ist natürlich 1/(Zahl größer 1) = 0. Die Ganzzahldivision ist nämlich ganz normales Teilen mit Rest, man bekommt aber als Ergebnis nur die Zahl geliefert, nicht den Rest.
 
Zuletzt bearbeitet:
C

carom

Gast
(1 / berechnung.uiNennerErg) wird immer int als Ergebnis haben, also 1/2,658 = 0. Versuchs mal mit 1.0F
 

WingX

Commander
Dabei seit
Juli 2001
Beiträge
2.303
Folgende Sachen sind mir aufgefallen.
0. Dein Programmierstil ist nicht gut, du scheinst keine Struktur im Programm zu haben.
1. In der Eingabe der Brüche kommt man aus der ersten Schleife nicht raus, wenn das Vorzeichen nicht '-' ist. Man muss also immer - als Vorzeichen wählen.
2. Du fragst 2 Brüche ab, gibst aber nur einen aus der Funktion zurück. Besser, die Funktion in der Main 2x aufzurufen.
3. Die Struktur heisst Bruch, kann aber die Daten für 2 Brüche halten, besser 2x die Struktur aufrufen.
4. Die Ergebnisse können schon mal nicht stimmen, die Erg Variablen müssen wenigestens float sein.
5. Macht euch die mathematischen Vorgänge klar. Brüche multiplizieren geht nicht mit Zähler mal Nenner.
Es gibt sicherlich noch mehr, aber damit erstmal genug. Denkt noch einmal über den Programmablauf nach, macht euch dann einen Plan, wie man das erreichen kann.
Vorschläge von mir:
1. Eine Struktur, die nur die Daten eines Bruchs hält, also Vorzeichen, Zaehler und Nenner.
2. In der Main 2 Brüche machen und die Eingabefunktion 2x aufrufen.
3. In der Berechnungsfunktion die beiden Brüche multiplizieren in einen neuen Bruch. Dazu müssen beide Brüche als Parameter übergeben werden.
4. Das Ergebnis dann ausgeben.
 
Top