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

#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:
C#-Code
- 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.
- 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:

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

von Z3RP (1020 Punkte)
- 18.06.2018 um 08:47 Uhr
BruchC Klasse
C#-Code
MainWindow.xaml
MainWindow.xaml.cs
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

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
Seite 1 von 0
1