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