Übungen / Aufgaben zu C#

1 Lösung Lösung noch nicht öffentlich
Zeichenprogramm / Paint für Arme
Anfänger - C# von Exception - 15.07.2018 um 08:17 Uhr
Hallo zusammen,

heute wird ein Grafikprogramm (Windows Forms) erstellt, mit dem man verschiedene geometrische Formen zeichnen kann.
Zunächst genügt es, die Formen "Ellipse", "Rechteck" und "Linie" zu implementieren.

Alle diese Formen haben folgende Gemeinsamkeiten:
- eine Position (Point, linke obere Ecke)
- eine Größe (Size)
- Rahmenfarbe / Linienfarbe (Color)

Das heißt, dass alle Formen drei gemeinsame Eigenschaften haben.

Für die GUI bzw. das Zeichnen auf dem Bildschrim soll in Form1 eine PictureBox angelegt werden - die Leinwand.
Zusätzlich eine ComboBox für die geometrische Form und eine für die Farbe.

Zusätzlich muss jede abgeleitete Klasse eine eigene Implementierung der Methode
Quellcode ausblenden C#-Code
void Draw(Graphics g) { ... }

besitzen (näheres siehe weiter unten).

Klassen:

Erstelle nun folgende Klassen:
- CsGeoForm (Basisklasse)
- CsRectangle, CsEllipse, CsLine (abgeleitete Klasse)

Zum Instanziieren müssen immer alle drei Eigenschaften (Position, Größe, Farbe) den (öffentlichen) Kontstruktoren übergeben werden.

Nachdem alle vier Klassen implementiert wurden wird nun die oben angesprochene Draw Methode implementiert.
Dies ist praktisch ein Zweizeiler.
Es wird zuerst ein Pen angelegt, der die entsprechende Farbe hat.
Anschließend wird die entsprechende Methode aus der Graphics Klasse verwendet.
Und fertig ist die Methode.

Wieder zurück zu Form1:
- Die PictureBox sollte die Eigenschaft BorderStyle auf "Fixed Single" gestellt werden.
- Nun brauchen wir eine Methode "getColor()", diese liefert später anhand der Farbauswahl der ComboBox die entsprechende systemdefinierte Farbe.
- Die Picturebox braucht nun ein Event - MouseClick.

Für die Implementierung des Events "MouseClick":
- zuerst muss geprüft werden, ob die linke oder rechte Maustaste gedrückt wurde.
- Linksklick: Startkoordinaten werden festgelegt.
- Rechtsklick: Höhe und Breite wird festgelegt und anschließend wird eine Instanz dder entsprechenden geometrischen Form erstellt.
Zum Schluss ist die geometrische Form durch einen Aufruf der Draw Methode zu zeichnen.
Hierfür ist ein Graphics-Objekt erforderlich
-> picturebox1.CreateGraphics()
--> Achtung: Muss später wieder mit Dispose() freigegeben werden!

Probleme, die es noch behoben werden müssen:

1)
Sollte das Fenster minimiert werden, so sind alle gezeichneten Rechtecke, etc. weg.
Das darf nicht sein!
Tipp: Weiteres Event -> "Paint"

2)
Evtl ist es während dem Testen bereits aufgefallen: Das Rechteck wird bei negativer Höhe/Breite nicht durch die Methode DrawRectangle gezeichnet!
Das sollte so auch nicht sein...
Tipp: Im Konstruktor von CsRectangle prüfen ob Höhe / Breite kleiner 0 ist.

Nice 2 Have / Erweiterungen:

- Weitere Formen
- ...


Viel Spaß :)
1 Lösung Lösung noch nicht öffentlich
Lesen und Bearbeiten von MP3-Dateien
Anfänger - C# von Exception - 14.07.2018 um 08:28 Uhr
Hallo zusammen,

heute sollt ihr Informationen aus MP3-Dateien lesen und editieren.

Dafür sollt ihr eine Windows Forms Anwendung schreiben,
in der ihr per Klick auf einen Button eine MP3-Datei einlesen und nach der Bearbeitung wieder speichern könnt.

Die folgenden Informationen sollen ausgelesen werden:
- Titel des Stücks (30)
- Interpret (30)
- Album / CD-Titel (30)
- Erscheinungsjahr (4)
- Kommentar (30)
- Genre (1)

Diese Informationen ("ID3-Tags") liegen als Zeichenketten in den letzten 125 Byte der Datei.
Die in der Klammer stehende Zahl zeigt an, wieviel Byte für die entsprechende Information belegt sind.

Doch zuvor muss geprüft werden ob die Datei auch wirklich eine gültige MP3-Datei ist.
Diese Information beginnt im 128. Byte und ist insg. 3 Byte lang.
(D.h., dass der komplette ID3-Tag 128 Byte lang ist)
In diesen 3 Byte muss "TAG" stehen (= TAG-Identifizierung), wenn nicht wird eine Exception o.ä. geworfen - ist euer Bier.
(Sicherlich kann es vorkommen, dass bei einer anderen Datei, genau an dieser Stelle ebenfalls "TAG" steht, aber für die Einfachkeit belassen wir es hierbei)

Wenn die Datei eingelesen ist und z.B. in Textboxen die Informationen ausgegeben wurden können diese bearbeitet werden und mit einem anderen Button gesichert / geschrieben werden.


Viel Spaß! :)


Hilfe / Nützliches:
- BinaryReader
- BinaryWriter
2 Lösungen Lösungen noch nicht öffentlich
Programmierung von MasterMind
Anfänger - C# von hollst - 02.07.2018 um 10:54 Uhr
MasterMind ist ein deduktives Spiel, das insbesondere Anfang der 70er Jahre sehr beliebt war.
Ziel des Spiels ist es, einen Geheimcode zu entschlüsseln.

In der klassischen Variante ordnet ein Spieler, genannt "codemaker", eine Sequenz von vier Symbolen
geheim an. Praktisch geschieht dies mittels unterschiedlich oder teilweise bzw. gänzlich
gleich gefärbter Pins oder Murmeln in einer Reihe, wobei maximal sechs Farben zur Verfügung stehen.

Ein zweiter Spieler, genannt "codebreaker", versucht durch Testmuster, gleichfalls bestehend aus vier gereihten
Symbolen (Pins/Murmeln), den Code zu erraten. Hätte der codebreaker 6 * 6 * 6 * 6 = 1.296 Versuche zur Verfügung,
wäre dies kein Problem, allerdings wird die Anzahl der Tests als Spielregel auf zwölf (manchmal weniger) begrenzt.

Als Responds auf ein Testmuster muss der codemaker zwei Informationen geben:

1.) Wieviele Symbole im Testmuster stehen an exakt der gleicher Stelle wie im Geheimmuster (im Falle vier, wäre das
Spiel für den codebreaker gewonnen) und
2.) wieviele Symbole (Pin-/Murmelfarben) sind sowohl im Geheim- als auch im Testmuster
vorhanden, allerdings nicht in übereinstimmender Position in der Reihe.

Die Programmieraufgabe bestehe nun darin, MasterMind interaktiv am PC zu simulieren, wobei der Computer als
codemaker fungiert, der zunächst per Zufallsgenerator das Geheimmuster erzeugt. Anschließend sind sukzessive
maximal zwölf Testmuster vom codebreaker (User) einzugeben und vom codemaker jeweils die zwei Fagen zu beantworten.


Anmerkung: MasterMind wurde auch von Mathematikern unter die Lupe genommen und bereits Mitte/Ende der 70er Jahre konnte
bewiesen werden, dass man es mit maximal fünf Testmustern lösen kann, sehr erstaunlich, oder? Daraufhin wurde
SuperMasterMind vorgeschlagen. Unterschied: Reihen mit fünf Symbolen und acht unterschiedlichen Pin-/Murmelfarben.

Wer MasterMind lediglich als schöne Spielerei ansieht, überlege bitte folgendes: Seit 1971 (release)
wurden bisher pro Jahr im Durchschnitt eine Million Spiele weltweit verkauft. Wärest Du der Erfinder und bekämest
als Lizenzgeber pro Exemplar 10 Cent, Du hättest finanziell ausgesorgt.
3 Lösungen Lösungen öffentlich
Messwerte mit Array und Methoden
Anfänger - C# von syneex - 29.06.2018 um 16:20 Uhr
Hallo Zusammen,

mal angenommen, man arbeitet in einer Fabrik, die Druckflaschen herstellt. Es werden pro Tag beliebig viele Flaschen fertiggestellt (n), da die Mitarbeiter nicht jeden Tag identisch schnell arbeiten. Am Ende des Tages muss der Druck in den Flaschen jedoch geprüft werden.

Aufgabe:
Die Aufgabe besteht hier in der Erstellung einer Konsolenanwendung mit folgendem Menü:

-----------Messwerte-----------
1 Eingabe der Messwerte
2 Ausgabe der Messwerte
3 Berechnung des Mittelwertes
4 Ende


Menüpunkt 1 ruft eine Methode auf, die erst eine Eingabe der produzierten Flaschen erwartet. Danach wird für jede Flasche der zuvor gemessene Wert in ein Array (mit Gleitkommazahlen) eingegeben. Wenn man den letzten Wert eingegeben hat, wird wieder das Menü gezeigt.

Menüpunkt 2 ruft eine Methode auf, die für jede Flasche den Wert ausgibt. Nach der nächsten Eingabe wird wieder das Menü gezeigt.

Menüpunkt 3 errechnet den Mittelwert und gibt diesen aus. Anschließend wird wieder das Menü angezeigt.

Bei Wahl des Menüpunkts 4, schließt sich die Konsole.

Der Name der Konsole soll "Messwertecheck" sein.

Die Werte können frei erfunden werden. Es geht lediglich um die Funktionalität. :)


Grüße und viel Spaß beim Lösen ;)
0 Lösungen
Perlin Noise Algorithm
Fortgeschrittener - C# von Z3RP - 20.06.2018 um 16:18 Uhr
Die Aufgabe besteht einen Perlin Noise Algorithmus zu programmieren der 1D-2D funktioniert.
So genannte Noise Algorithmen werden zum Beispiel dazu verwendet Height Maps zu generieren oder Feuertexturen.
In Spielen werden diese of dazu verwendet das Terrain zu formen. Zum Beispiel in Minecraft, Terraria und vieles mehr.
Noise soll eine natürliche zufälligkeit darstellen.

Bitte nicht mich verurteilen falls falsch liege.

Am besten wäre es wenn man am Ende eine Methode/Klasse hat.

Eingaben Werte:
-int X ( Koordinate )
-int Y ( Koordinate )

Ausgabe:
-ein Float zwischen 0-1

Hier noch ein paar linke zu dem Thema und ein paar Bilder im Anhang:
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://en.wikipedia.org/wiki/Perlin_noise
2 Lösungen Lösungen noch nicht öffentlich
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 Lösung Lösung noch nicht öffentlich
Die beste Darlehensart berechnen
Anfänger - C# von Exception - 04.06.2018 um 17:06 Uhr
Schreibe ein Programm welches folgende Parameter übergeben bekommt:
- Nominalzins p.a.
- Laufzeit (Jahre)
- Darlehen (€)

Berechne dann anhand dieser Parameter welche der drei folgenden Darlehensarten am besten für den Kreditnehmer ist:
- Fälligkeitsdarlehen
- Ratendarlehen
- Annuitätendarlehen

... und gib die Ergebnisse aus, auch inwiefern sie sich untereinander unterscheiden - jeder Cent zählt! ;)
2 Lösungen Lösungen noch nicht öffentlich
Babylonisches Wurzelziehen / Heron-Verfahren / Heronsches Näherungsverfahren
Anfänger - C# von Exception - 03.06.2018 um 08:27 Uhr
Die zu schreibende Anwendung soll eine positive Zahl entgegennehmen und durch das Heron-Verfahren näherungsweise die Quadratwurzel berechnen.

Zusatz:
Es werden die einzelnen Schritte ausgegeben, siehe Beispiel.

Beispiel: mit Wurzel aus 12

...
Die Wurzel aus 12 ist zwischen 3.5 und 3.4
...
Die Wurzel aus 12 ist zwischen 3.45 und 3.46
...


~ Viel Spaß :)
0 Lösungen
Konvertieren von JSON <---> XML <---> CSV
Anfänger - C# von Exception - 02.06.2018 um 08:07 Uhr
- Schreibe ein Programm, welches eine Datei einlesen kann.
- Diese Datei soll in einem der folgenden Formate sein: CSV, XML, JSON
- Das Programm erkennt welches Format die eingelesene Datei hat und zeigt dies an (z.B. "Format: JSON")
- Dem Nutzer soll die Möglichkeit gegeben werden im Anschluss die Datei in einem der anderen beiden Formate abzuspeichern

Beispiel:

JSON wird eingelesen
JSON wird zu CSV umgewandelt
CSV wird als neue Datei abgespeichert
3 Lösungen Lösungen öffentlich
Programmierung eines Anagramm-Generators
Fortgeschrittener - C# von hollst - 31.05.2018 um 14:02 Uhr
Unter einem (vollständigen) Anagramm eines Basiswortes versteht man
sinnvolle Wörter, die aus den gleichen Buchstaben wie
das Basiswort zusammengesetzt sind. Z. B. sind zum Basiswort TOR die Wörter
ROT und ORT Anagramme. Die Folge OTR ist kein Anagramm (kein sinnvolles Wort).

Für den zu programmierenden Anagramm-Generator, der ein Basiswort entgegennehmen
und eine Liste sinnvoller Anagramme ausgeben soll (Bild 1), wird natürlich eine
Liste aller sinnvollen Wörter einer (natürlichen) Sprache benötigt. Mein Vorschlag
ist es, sich den Textfile germany.dic von

https://sourceforge.net/projects/germandict/

herunterzuladen. Er enthält knapp 2.000.000 Einträge "sinnvoller" deutscher Wörter,
darunter auch eines meiner Lieblingswörter:

Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz.

Dieses Wort steht in der Tat sogar im Duden, allerdings nur an Stelle zwei der Wurmwörter,
den ersten Platz hat

Grundstücksverkehrsgenehmigungszuständigkeitsübertragungsverordnung.

Ja, aber das nur zum Schmunzeln am Rande. Viel Spaß!
4 Lösungen Lösungen öffentlich
Einfacher Namensgenerator
Anfänger - C# von Exception - 30.05.2018 um 15:23 Uhr
Schreibe ein Programm, welches zwei Textdateien (zb Vorname.txt, Nachname.txt) Zeile für Zeile in ein Array lädt.
Gebe dann eine zufällige Kombination aus Vornamen und Nachnamen aus.
0 Lösungen
Code schreiben (Serialisierung)
Fortgeschrittener - C# von A.hann - 28.05.2018 um 18:09 Uhr
Ihr Kunde ist verzweifelt. Er ist im Besitz des Programmcodes einer Klasse Person sowie einer Datei friends.dat. In friends.dat sind serialisierte Bytefolgen verschiedener Person-Objekte enthalten. Ihr Kunde weiß nicht, wie er die Bytefolgen wieder "zum Leben erweckt" (aktiviert). Er möchte von Ihnen wissen, welche Personen in der Datei friends.dat stecken und wie die Freundschaftsbeziehungen zwischen den Personen aussehen. Ihr Kunde weiß, dass die Datei friends.dat ein einziges Objekt vom Typ ArrayList<Person> enthält. Hier der Quelltext der Klasse Person (im anonymen Default-Package)


Sie erhalten die Klasse Person im Quelltext sowie die Datei friends.dat als Anlage zu dieser Aufgabe. Erstellen Sie eine statische Methode decode in der Klasse Decode (im anonymen Default-Package) welche die als Dateinamen-Parameter gegebene Datei deserialisiert und dann die Freundschaftsbeziehungen in der Reihenfolge ausgibt, wie sie in der deserialisierten ArrayList stehen. Das gewünschte Ausgabeformat ist wie folgt (wobei die Datei friends.dat andere als die folgenden Personendaten enthält):