C# :: Aufgabe #216 :: Lösung #1

2 Lösungen Lösungen öffentlich
#216

Brüche und überladene Operatoren

Anfänger - C# von Exception - 09.06.2018 um 09:07 Uhr
- Erstelle eine Klasse "Bruch"

- In dieser Klasse gibt es zwei Attribute: Zähler, Nenner (jeweils Integer)

- In dieser Klasse gibt es zudem noch überladene Opteratoren (+, -, *, /)
Diese Operatoren haben jeweils zwei Parameter, die übergeben werden müssen -> zwei Objekte der Klasse Bruch.
Die Operatoren geben einen neuen Bruch zurück.

In der Hauptmethode (oder sonst wo) soll dann folgendes möglich sein:
Quellcode ausblenden C#-Code
Bruch b1 = new Bruch(1, 2);
Bruch b2 = new Bruch(3, 4);
Bruch b3 = b1 + b2;  // auch -, *, /

- Die Klasse Bruch braucht für das Teilen von Brüchen evtl. noch ein bisschen mehr... #Methoden ;)

- Das Anlegen / Erzeugen von Brüchen soll mit Textboxen realisiert werden, sodass das ganze Programm grafisch etwas her macht.

- Die Rechenopertation (+,-,*,/) soll mit einer Dropdown Liste o.ä. ausgewählt werden.

- Mit einem Button soll die Berechnung starten und das Ergebnis anschließend in zwei weitere Textboxen (read only) geschrieben werden.

- Damit die Brüche nicht zu groß werden (50/100 o.ä.) soll bevor das Ergebnis in die Textbox geschrieben wird geschaut werden, ob sich der neue Bruch kürzen lässt.
#1
vote_ok
von Z3RP (1020 Punkte) - 18.06.2018 um 08:47 Uhr
BruchC Klasse
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bruch
{
    public class BruchC
    {
        public double zaehler { get; set; }
        public double nenner { get; set; }

        public BruchC(double zaehler, double nenner)
        {
            this.zaehler = zaehler;
            this.nenner = nenner;
        }

        public static BruchC operator +(BruchC b1, BruchC b2)
        {
            bruchKuerzen(ref b1, ref b2);
            if (b1.nenner == b2.nenner)
            {
                return new BruchC(b1.zaehler + b2.zaehler, b1.nenner);
            }
            else
            {
                return new BruchC(b1.zaehler * b2.nenner + b2.zaehler * b1.nenner, b1.nenner * b2.nenner);
            }

        }

        public static BruchC operator -(BruchC b1, BruchC b2)
        {
            bruchKuerzen(ref b1, ref b2);
            if (b1.nenner == b2.nenner)
            {
                return new BruchC(b1.zaehler - b2.zaehler, b1.nenner);
            }
            else
            {
                return new BruchC(b1.zaehler * b2.nenner - b2.zaehler * b1.nenner, b1.nenner * b2.nenner);
            }

        }

        public static BruchC operator *(BruchC b1, BruchC b2)
        {
            bruchKuerzen(ref b1, ref b2);

            return new BruchC(b1.zaehler * b2.zaehler, b1.nenner * b2.nenner);
        }

        public static BruchC operator /(BruchC b1, BruchC b2)
        {
            BruchC newB2 = new BruchC(b2.nenner, b2.zaehler);
            BruchC newB = b1* newB2;
            bruchKuerzen(ref newB2, ref newB);

            return newB;
        }

        private static void bruchKuerzen(ref BruchC b1, ref BruchC b2)
        {
            if (b1 != null)
                for (double i = b1.nenner; i >= 0; i--)
                {
                    if (b1.nenner % i == 0 && b1.zaehler % i == 0)
                    {
                        b1.nenner /= i;
                        b1.zaehler /= i;
                        break;
                    }
                }

            if (b2 != null)
                for (double i = b2.nenner; i >= 0; i--)
                {
                    if (b2.nenner % i == 0 && b2.zaehler % i == 0)
                    {
                        b2.nenner /= i;
                        b2.zaehler /= i;
                        break;
                    }
                }
        }
    }
}


MainWindow.xaml
<Window x:Class="Bruch.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Bruch"
mc:Ignorable="d"
Title="Bruch Rechner" Height="180.932" Width="249.153" WindowStyle="ToolWindow" ResizeMode="NoResize">
<Grid>
<TextBox x:Name="z1" PreviewTextInput="NumberValidationTextBox" HorizontalAlignment="Left" Height="27" Margin="21,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" TextAlignment="Center"/>
<TextBox x:Name="n1" PreviewTextInput="NumberValidationTextBox" HorizontalAlignment="Left" Height="27" Margin="21,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" TextAlignment="Center"/>
<TextBox x:Name="z2" PreviewTextInput="NumberValidationTextBox" HorizontalAlignment="Left" Height="27" Margin="97,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" TextAlignment="Center"/>
<TextBox x:Name="n2" PreviewTextInput="NumberValidationTextBox" HorizontalAlignment="Left" Height="27" Margin="97,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" TextAlignment="Center"/>
<TextBox x:Name="z3" HorizontalAlignment="Left" Height="27" Margin="166,19,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" IsReadOnly="True" TextAlignment="Center"/>
<TextBox x:Name="n3" HorizontalAlignment="Left" Height="27" Margin="166,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="27" IsReadOnly="True" TextAlignment="Center"/>
<Label Content="= " HorizontalAlignment="Left" Margin="142,33,0,0" VerticalAlignment="Top" Height="31" Width="19"/>
<Button Content="Rechne" HorizontalAlignment="Left" Margin="21,97,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<ComboBox x:Name="opr" HorizontalAlignment="Left" Margin="54,37,0,0" VerticalAlignment="Top" Width="38" Height="27" SelectedIndex="0"/>

</Grid>
</Window>


MainWindow.xaml.cs
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Bruch
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            opr.Items.Add("+");
            opr.Items.Add("-");
            opr.Items.Add("*");
            opr.Items.Add("/");
        }

        private void NumberValidationTextBox(object sender, TextCompositionEventArgs e)
        {
            var textBox = sender as TextBox;
            e.Handled = Regex.IsMatch(e.Text, "[^0-9]+");
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            BruchC b1 = new BruchC(Convert.ToDouble(z1.Text), Convert.ToDouble(n1.Text));
            BruchC b2 = new BruchC(Convert.ToDouble(z2.Text), Convert.ToDouble(n2.Text));




            BruchC b3 = null;


            switch (opr.SelectedItem)
            {
                case "+":
                    b3 = b1 + b2;
                    break;
                case "-":
                    b3 = b1 - b2;
                    break;
                case "*":
                    b3 = b1 * b2;
                    break;
                case "/":
                    b3 = b1 / b2;
                    break;
            }


            z3.Text = Convert.ToString(b3.zaehler);
            n3.Text = Convert.ToString(b3.nenner);
        }
    }
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2130825

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.