Wie kann man C# besser verstehen?

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Viele Anfänger (ob du dazugehörst, kann ich natürlich nicht sagen) haben die Vorstellung, Programme zu entwickeln, würde an der Tastatur direkt mit dem Code beginnen. Das ist allerdings eine Vorgehensweise, die die Wahrscheinlichkeit zu scheitern stark anhebt.

Daher empfehle ich stets, eine analytische Vorgehensweise einzuschlagen, die ungefähr so aussieht:

1) Du musst das Problem (z.B. die Aufgabenstellung) erfassen. Du solltest es in wenigen Sätzen grob für dich verständlich beschreiben können. Schreibe stichpunktartig die Anforderungen heraus. In anderen Schulfächern solltest du ein ähnliches Vorgehen auch schon gelehrt bekommen haben (z.B. bei Sachaufgaben in der Grundschule: Was ist gegeben? Was wird gesucht?).

All die Punkte, die dir unverständlich erscheinen, solltest du erfragen / nachrecherchieren.

2) Probleme sind oft zu komplex, als das man sie auf einen Schlag lösen könnte. Um nur ein Beispiel zu nennen: Wenn ich dir sage, dass du eine Bankautomatensimulation entwickeln solltest, müsstest du auch erst einmal schauen: Was kann so ein Bankautomat und wie gestalten sich seine einzelnen Funktionen konkret? Eine Funktion bargeldAuszahlen hat z.B. nicht nur die Anforderung, eine Geldsumme zu liefern, sondern soll vielleicht ebenso prüfen, ob die geforderte Summe überhaupt zulässig ist. Das es so ein Verhalten gibt, sollte man sich allerdings im Voraus überlegen. Während des Code eintippens auf solche Ideen zu kommen, ist etwas spät und fehlerträchtig.

Schau also, inwiefern du dein Hauptproblem / deine Aufgabe in Teilaufgaben zerlegen kannst (und wenn du es als notwendig erachtest, teile auch diese nochmals auf). Ziel wäre es, die Teilproblem leichter lösbar zu gestalten.

Für diese Aufteilung sowie das Aufstellen eines Lösungswegs halte ich einen Programmablaufplan als eines der hilfreichsten Tools. So ein Plan beschreibt mit sehr einfachen Grundelementen (Eingabe, Ausgabe, if-else) in Einzelschritten, wie ein Programm ablaufen müsste, um zu einer Lösung zu gelangen. In dieser Hinsicht zwingt er dich auch etwas dazu, mehr in Einzelschritte zu denken.

Installiere dir ruhig den PapDesigner dazu und beschreibe darin den Programmablauf, wie du ihn dir vorstellen würdest. Komplexe Einzelschritte kannst du mit dem Unterprogramm-Knoten darstellen. Wenn du das Unterprogramm öffnest, hast du einen neuen Ablaufplan, in dem du dich nur der Beschreibung des aktuellen, komplexen Einzelschritts widmest. In C# entspräche ein Unterprogramm dann einer eigenen Funktion.

Bestimmte C#-Funktionen, die du bereits kennst, kannst du natürlich bei der Arbeit schon mit einbeziehen. Das heißt, einen Schritt Wurzel berechnen musst du ganz sicher nicht nochmal in weitere Einzelschritte unterteilen, wenn du weißt, dass .NET da schon etwas in petto hat.

Du dürftest bei diesem Vorgehen merken: Du überdenkst vielleicht bestimmte Programmwege öfter / mehr und eine spätere Übersetzung in C#-Code dürfte auch nicht mehr so schwer fallen. Außerdem ist so ein Plan etwas formloser, als Programmcode. Du trennst hier das Austüfteln der Programmlogik von der Beschäftigung mit einer konkreten, komplizierteren Syntax (mit Klammern, Semikolons, etc.).

3) Im letzten Schritt übersetzt du alles in Programmcode.

Du kannst dir meine Antwort von hier einmal anschauen, denn sie zeigt an einer gestellten Übungsaufgabe, so eine aufteilende Vorgehensweise. Das dort zu zeichnende Feld wird in Teilfelder aufgeteilt, an primitivster Stelle steht ein einfaches Kästchen. Folgend kann man davon ausgehen, dass man, wenn man ein Kästchen beliebigen Typs erst zeichnen, sich der nächsten Ebene (einer ganzen Reihe an Kästchen) widmen kann.

Ein weiteres Hilfsmittel können Skizzen oder stichpunktartige Überlegungen sein. Bei Such- und Sortieraufgaben für Listen könntest du dir z.B. ein Kartenspiel zur Hand nehmen und einmal analysieren, wie du als Mensch vorgehen würdest, um bspw. eine bestimmte Karte zu finden (sofern verfügbar - Karte nehmen, Kartenwert/-farbe lesen, mit gesuchtem/-r Kartenwert/-farbe vergleichen und entweder abbrechen oder nächste Karte ziehen). Wichtig ist die genaue Beobachtung / eine präzise, kleinteilige Beschreibung, denn gerade in solchen einfachen Einzelschritten muss man sich später dem Computer gegenüber ausdrücken.

Sich so eine Denkweise anzueignen, geschieht allerdings nicht so einfach von heute auf morgen. Deshalb ist natürlich die Übung ziemlich wichtig. Ich weiß nun nicht, welche Aufgaben dir von deinen Lehrern gestellt werden - vielleicht sind sie bereits ziemlich gut oder aber eher nicht. Ich halte z.B. Aufgabenstellungen, die Lösungen anleitungsartig vorkauen, für nicht so ziehlführend.

Ich kann dir daher einmal ein paar Aufgaben auflisten, die dir bei einer Weiterentwicklung helfen sollten. Zusätzlich würde ich dir Processing empfehlen. Dabei handelt es sich um eine Programmumgebung, in der du leicht grafische Simulationen und Minispiele programmieren kannst. Die Programmiersprache in dieser Umgebung heißt ebenfalls Processing und ist mehr auf Grundelemente (Variablen, Arrays, Schleifen, Verzweigungen, Funktionen) beschränkt. Für dich wäre es wohl kaum eine Umstellung, da die Syntax kaum bis gar nicht von C# abweicht.

Übungsaufgaben:

  • Gib das Ein-Mal-Eins (1-100) in der Konsole aus.
  • Lege ein Array mit fünf Elementen an, befülle es und vergrößere es im Anschluss, sodass du nachträglich weitere Elemente einfügen kannst. Verzichte auf den Einsatz irgendwelcher .NET-Methoden, sondern löse das Problem mit den dir bekannten Grundwerkzeugen (Variablen, Schleifen, etc.).
  • Lege ein Array mit zehn beliebigen Zahlen an und lasse dir alle geraden Werte in der Konsole ausgeben.
  • Suche die kleinste Zahl im Array (aus der vorherigen Aufgabe) heraus.
  • Lege ein Array an, welches die Werte 1-15 beinhaltet. Sortiere das Array in zufälliger Reihenfolge und lasse dir im Anschluss alle isolierten Zahlen ausgeben (das sind die Zahlen, die keinen direkten Vorgänger n-1 oder Nachfolger n+1 haben).
  • Berechne das Produkt zweier Zahlen, ohne den Multiplikationsoperator zu verwenden.
  • Berechne die Quersumme einer (maximal) dreistelligen Zahl.
  • Berechne die Fakultät einer Zahl.
  • Lasse dir die ersten 8 Ziffern der Fibonacci-Folge ausgeben, wobei die einzelnen Zahlen (natürlich) erst vom Programm berechnet werden müssen.
  • Zeichne ein rechtwinkliches Dreieck (beliebiger Breite), ein Karo (die Breite soll eine beliebige ungerade Zahl sein) und einen Tannenbaum in der Konsole. Für diese Formen kannst du Leerzeichen und Sternchen * verwenden oder irgendein anderes Zeichenpaar.
  • Löse die Aufgabe mit der optischen Täuschung (s. verlinkte Frage weiter oben). Dafür wäre Processing ein geeigneter Kontext.
  • Schreibe ein Ver-/Entschlüsselungsprogramm. Nutze dafür den Caesar-Chiffre.
  • Auf Wikipedia findest du einen Artikel über Sortierverfahren. Schau dir Bubblesort, Selectionsort, Insertionsort, Quicksort und Mergesort an und versuche sie anhand der Beschreibung zu implementieren.
  • Durchsuche eine sortierte Liste mittels binärer Suche.
  • Minispiele/-simulationen für Processing: Pong, Snake, Conway's Game Of Life
  • Schreibe eine eigene Stack-Klasse mit selbst implementierten Methoden für push und pop.
  • Bau eine doppelt verkettete zirkuläre Liste. So eine Liste besteht aus mehreren Knoten, die jeweils ihren Vorgänger und Nachfolger kennen und der Startpunkt ist zugleich der Endpunkt. Die Liste sollte Methoden bekommen, mit denen man neue Knoten einfügen, bestehende Knoten entfernen und suchen kann.
  • Entwickle einen eigenen Graph (ein Graph besteht aus Knoten = Vertices, die mit Kanten = Edges miteinander verbunden werden können). Jeder Knoten sollte mindestens mit zwei anderen Knoten über Kanten verbunden werden, sie Kanten bekommen beliebige Zahlenwerte zugeordnet. Im Anschluss wäre die Aufgabe, von einem beliebigen Knoten A aus zu schauen, welches der kürzeste Weg zu einem Knoten B wäre. Die Wegstrecke berechnet sich durch die Summe aller passierten Kantenwerte.
  • Entwickle ein Mau-Mau-Spiel. Es reicht, die Spieloberfläche textuell zu visualisieren.

Bei diesen Aufgaben sind typische Klassiker (wie die Fibonacci-Folge) mit unter gemischt und ab und an wirst du vermutlich auch etwas Recherche betreiben müssen (Wikipedia sollte hierbei schon als Nachschlagewerk genügen). Die schwierigsten Aufgaben sind womöglich die mit dem Graph und Mergesort. Das Mau-Mau-Spiel gehört zu den komplexeren Übungen (ist deswegen aber nicht kompliziert).

Nur wenigen Menschen liegt das abstrakte Denken, die meisten müssen erst lernen. Manchen fällt das leichter, als Anderen.

Es kann natürlich auch einfach sein, dass Lehrer und/oder die Aufgaben nichts taugen, wie man hört, ist das häufig der Fall. Wenn Du es also wirklich lernen willst, dann besorg dir das Buch "Visual C# 2019" (gibt auch eine 2012-Variante, die ist kostenlos, aber auch deutlich älter).

Und zum Anwenden hilft nur Üben und zwar mit eigenen Ideen und nicht nur den stumpfen Aufgaben. Wenn Du eine interessante Aufgabe hast, dann denk doch etwas weiter und ergänze eigene Funktionen. Die Begeisterung, eigene Ziele zu verfolgen und umzusetzen macht für Viele den Antrieb aus und das kann sehr motivieren und das wiederum hilft beim Lernen.

Wenn Du es wirklich verstehen und nicht nur anwenden willst, dann nimm funktionierenden Code und bau ihn um, schreibe ihn anders, mach ihn kaputt, reparieren ihn wieder, und so weiter.

Und stell dich darauf ein, dass Du am Anfang nicht alles verstehen wirst. Die tieferen Zusammenhänge können sehr komplex sein, also setz nur einen Fuß nach den Anderen.
Außerdem musst Du lernen, damit umzugehen, dass Du stunden- oder tagelang nicht weiter kommst. Das wird mit den Jahren an Erfahrung weniger, aber es gehört dazu.

Woher ich das weiß:Berufserfahrung

Für manche ist das eben schwerer als für andere. Aber das heißt nicht, dass du nicht besser werden kannst. Du musst es eben üben. Durch üben kann man in so gut wie allem besser werden. Also auch wenn du eine Aufgabe nicht schaffst, guck dir später die Lösung an und versuche sie nachzuvollziehen. Die Kreativität kommt dann später, sobald du viele verschiedene Lösungen nachvollzogen hast.

Wichtig ist, nicht so hart zu sich selbst zu sein, wenn man etwas nicht schafft, aber es trotzdem immer weiter zu probieren.

Ist aber auch nicht so schlimm, falls programmieren dir nicht so liegt. Dafür kannst du dann andere Sachen besser.

Woher ich das weiß:eigene Erfahrung

Naja, da gibts nur eine gute Lösung: Üben, üben, üben.

Gerade beim Programmieren kannst du noch so lange Vorlesungen anschauen bzw. zum Unterricht gehen und fein mitarbeiten und alles verstehen. Das hab ich am Anfang auch gemacht. Aber wenn man dann vor größeren Aufgaben steht, kam ich auch oft nicht weiter. Mit der Zeit wird man halt besser darin, abstrakt zu denken und vorher schon mal grob zu überlegen, wie man was umsetzen könnte. Natürlich auch bedingt dadurch, dass man einfach mehr Wissen hat. Aber Programmieren ist und bleibt halt etwas, was man besonders durch Übung lernt.

Bei dir hört es sich ganz danach an, dass du kleinschrittiger vorgehen musst. Am besten suchst du dir selbst Aufgaben aus dem Internet, da gibt es genug. Falls du zu C# nicht genug findest, bring dir Java bei. Für den Anfang wirst du da keine großen Unterschiede finden, beide Sprachen sind sehr ähnlich. Du kannst auch einfach Java-Aufgaben suchen und diese in C# lösen. Die Lösungen werden dich trotz anderer Programmiersprache an dein Ziel führen.

Wenn du weißt, dass du nicht einigermaßen verschiedene Dinge verbinden kannst, um eine Sache daraus zu machen, dann denke ich mal, dass programmieren allgemein nichts für dich ist. Das ist überhaupt nicht böse gemeint.

Wie lange programmierst du schon?

Eucartoonfan 
Fragesteller
 30.09.2021, 20:07

Schon seit 1 Jahr

0
NFSMostWanted29  30.09.2021, 20:08
@Eucartoonfan

Dann passt programmieren mMn nicht zu dir. Programmierst du regelmäßig oder nur, als Beispiel, jeden 3. Tag für einige Minuten und hörst dann auf?

0
Eucartoonfan 
Fragesteller
 30.09.2021, 20:12
@NFSMostWanted29

nur einige in meiner Klasse können relativ gut programmieren, die anderen haben auch die Schwierigkeiten die ich habe. Ich weiß das das mein Problem ist, aber wollte ich noch hinzufügen.

0
NFSMostWanted29  30.09.2021, 20:13
@Eucartoonfan

Also, wenn das erste auf dich zutrifft und du einige Stunden investierst so gut wie immer wenn du Zeit hast, dann liegt dir programmieren nicht.

Wenn du allerdings nur für einige Minuten mal ab und zu programmieren übst, solltest du mehr Zeit investieren.

0