6. Übungen zur Computermathematik (C#) WS 2011/2012 Falls nichts anderes angegeben ist, steht Ihnen nachstehend die Wahl zwischen einem Konsolen- oder Windowsprogramm frei. Bei Windows-Anwendungen haben Sie überdies noch die Wahl zwischen einem Layout erstellt mit Windows Forms oder – falls Sie sich selbst die Latte höher legen wollen! – der professionelleren Kombination von XAML & WPF. 41. Man schreibe eine C#-Programm, welches in möglichst übersichtlicher Form die in der Klasse Environment gespeicherten Informationen über den Rechner des Benutzers und die diversen Datenpfade ausgibt. 42. Man verbessere das Programm C#-Demoprogramm CPrimes dahingehend, dass für t>5 von vornherein nur Probeteiler t betrachtet werden, welche nicht durch 2,3 oder 5 teilbar sind (s. dazu auch die Erläuterungen in Aufg. 22). 43. Schreiben Sie eine rekursive Methode mergesort (s. dazu das Programm in der MapleDemo), mit der Arrays von ganzen Zahlen sortiert werden können. Schreiben Sie ferner auch eine Methode bool test(int n, int s), welche für ein vorgegebnes Array und unter Verwendung der eingebauten Methode Sort von Array die Richtigkeit des Ergebnisses für n ganzen Zufallszahlen im Bereich von [0,s) überprüft. (Die Klasse System.Random und ihre Methode Next dürfte dabei nützlich sein.) 44. Man schreibe eine Windows-Anwendung, welche für sämtliche Zahlentypen in C# • • • • den Klassennamen in Langform (also z.B. System.Int32 oder Int32 statt nur int), die Größe in Bytes, den kleinsten und größten Wert in jeweils einem beschrifteten Textfeld ausgibt, wobei die Auswahl durch den Benutzer über ein Kontrollelement vom Typ Combobox möglich sein soll. 45. Man schreibe eine Windows-Anwendung, welche es dem Benutzer gestattet für die Klasse String einige der wichtigsten Eigenschaften und Methoden (etwa 6 bis 10, ähnlich wie für die Klasse StringBuilder in der C#-Einführung) in ihrer Funktionsweise zu sehen. 46. Man schreibe eine Windows-Anwendung, welche die Wurzel aus einer Zahl a ≥ 0 mit Hilfe der Rekursion x 0 = (a + 1) / 2, x n +1 = ( x n + a / x n ) / 2 ∀n ∈ N berechnet und insbesondere auch die iterierten Werte x 0 , x1 , x 2 ,... bis zur ersten Wiederholung in der durch den Benutzer in einer ComboBox einstellbaren Genauigkeit „niedrig“, „mittel“ und „hoch“ (entsprechend den verwendeten Zahlentypen float, double bzw. decimal) in einer Listbox ausgibt, und zwar mit 0 beginnend durchnummeriert. 47. Nach dem Vorbild der Klasse BigNum aus der C#-Demo schreibe man ein struct GaussInt, welche das Rechnen mit Ganzen Gaußschen Zahlen, d.h., komplexen Zahlen der Bauart a+bi, a,b ganz, ermöglicht. Man implementiere dafür mindestens die Eigenschaften Re und Im vom Typ int für Real- und Imaginärteil und den Operatoren für = =, !=, +, -, *, /,% wobei unter dem Quotienten u/v jene ganze Gaußsche Zahl w verstanden wird, die aus dem „echten“ Quotienten in C durch „Rundung“ (bei Mehrdeutigkeiten Abrundung) entsteht und u%v ist dann gewissermaßen der „Rest“ bei dieser Division, also u-w*v. Ferner soll auch eine Methode zur Berechnung des ggT von zwei ganzen Gaußschen Zahlen angegeben werden (s. dazu die Maple-Demo), eine implizite Konvertierung von int nach GaussInt möglich sein und der Parser von GaussInt sollte überdies Eingaben wie z.B. -3+4i, 5, 2i auch richtig interpretieren können. 48. Ähnlich wie in Aufg. 47 modelliere man ein struct Bruch, welches das Rechnen mit Brüchen ermöglichen soll, wobei Zähler und Nenner vom Typ BigInteger sein sollen und als weitere Eigenschaft das Vorzeichen sign in {-1,0,1} vom Typ sbyte dazukommt. Außer den Relationen und Operatoren = =, !=, +, -, *, / soll auch eine implizite und explizite Konvertierung (=Rundung auf die nächste ganze Zahl) zwischen int und Bruch möglich sein und der Parser soll Eingaben in der „Bruchschreibweise“ (also z.B. „-14/91“) „verstehen“ und mithilfe des Konstruktors in einen struct umwandeln, der diesem Bruch (nach einer ev. Kürzung!) entspricht. Ferner erstelle man eine einfache Windows-Anwendung für die Einund Ausgabe obiger Rechen- und Vergleichsoperationen.