Einleitung Copyright 2009 – Heimo Gaicher Dieses Skriptum richtet sich an Programmier-Einsteiger, die mit der Sprache C# eine moderne objektorientierte Programmiersprache erlenen möchten. Da es für Einsteiger nicht gerade einfach ist, eine Programmiersprache zu erlernen, wurde dieses Skript schrittweise mit vielen Beispielen ausgearbeitet. Auf Blattfüllende allgemeine Einführungen und Erläuterungen wurde bewußt verzichtet. Da die meisten Anfänger mit der Objektorientierung zu Beginn Verständnisprobleme haben, wurde kein objektorientierter Zugang gewählt. Die entsprechenden Beispiele werden im Programmiercode genau erklärt und führen so zu einem besseren Verständnis. Eine Programmiersprache lernt man am besten, indem man programmiert. Arbeiten Sie dieses Skript von Anfang an genau durch und versuchen Sie auch die Übungsaufgaben selbständig zu lösen. Alle Beispiele sind vollständig mit Code erklärt. Für die Übungsbeispiele gibt es absichtlich keine Musterlösung, da dies Ihre Aufgabe sein soll, entsprechende Überlegungen zu treffen und Lösungen zu finden. Dieses Skript wurde im Zuge meiner eigenen Ausbildung mit großer Sorgfalt geschrieben. Sollten sich dennoch Fehler eingeschlichen haben, freue ich mich über entsprechende Hinweise. Anmerkungen und Kritiken sind unter [email protected] immer willkommen. Alle Markennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt und sind möglicherweise eingetragene Warenzeichen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Viel Spaß beim Erlernen von C# Heimo Gaicher Copyright 2009 – Heimo Gaicher Inhalt 1. Arbeiten mit VISUAL STUDIO 1.1. Download und Installation 1.2. Start mit VISUAL STUDIO Seite 5 6 2. Programmieren in der Konsole 2.1. Unser erstes Programm 2.2. Klassen und Methoden 2.3. Struktur einer Klasse 2.4. Ausgabe mit Zeit und Datum 2.5. Variablendeklaration und Variablentypen, Werte einlesen und ausgeben 2.6. Datentypen in Visual C# 2.7. Ausgabe mit Variablen 2.8. Formatierte Ausgabe von Zahlen – Formatausdruck{} 2.9. Escape-Zeichen 2.10. TypeCasting – Umwandlung von Datentypen 2.11. Einlesen von Werten 2.12. Debugging 2.13. Typeabfrage von Variablen mit GetType 2.14. Eigenschaften der Klasse Console & Formatierungen 2.15. Zeichenketten – Strings 2.16. Strings anlegen und ausgeben 2.17. Strings einfügen, ersetzen und löschen 2.18. Strings verketten und vergleichen 2.19. Bezeichner in C# - Schlüsselwörter 7 8 11 12 14 15 17 18 19 20 21 22 25 29 29 30 31 32 34 35 3. Rechnen in C# 3.1. Integerdivision 3.2. Operatoren in C# 3.3. Zuweisungen 3.4. Vergleiche 3.5. Aussagenlogik 3.6. Die Math-Klasse – Potenzen, Wurzel, Logarithmen 3.7. Der Operand Modulo % 36 36 37 38 39 40 41 43 4. Übungsbeispiele 4.1. Übungsbeispiel Treibstoffverbrauch 4.2. Übungsbeispiel Freier Fall mit Luftwiderstand 4.3. Übungsbeispiel Umrechnung von Grad Celsius in Grad Fahrenheit 4.4. Übungsbeispiel Berechnung des Ostersonntages nach Gauss 44 45 46 47 48 5. Verzweigungen 5.1. Die if-else Verzweigung 5.2. Geschachtelte if-else Anweisung 5.3. Abfragen mit switch / case 5.4. Die Anweisungen break, continue und goto 5.5. Übungsbeispiel Taschenrechner 5.6. Übungsbeispiel Wochentag 49 49 53 55 57 58 59 Copyright 2009 – Heimo Gaicher 5.7. 5.8. 5.9. 5.10. 5.11. 5.12. 5.13. 5.14. 5.15. 5.16. 5.17. 5.18. 5.19. 5.20. 5.21. 5.22. 5.23. 5.24. 5.25. 5.26. 5.27. 6. Klassen 6.1. for – Schleifen Übungsbeispiel Sägezahn Kopfgesteuerte Schleife mit while Fussgesteuerte Schleife mit do – while Übungsbeispiel Dezimalzahl in eine Binärzahl umwandeln Übungsbeispiel quadratische Funktion Übungsbeispiel zur Berechnung der Fibonacci Zahlenfolge Übungsbeispiel schräger Wurf Zufallszahlen erzeugen Arrays Arrays – parallele Felder Übungsbeispiel Umwandlung einer Binärzahl in eine Dezimalzahl Arrays – mehrdimensionale Felder Arrays – Abfrage mit einer foreach-Schleife Arrays – ArrayList (Felder mit dynamischer Größe) Unterprogramme und Funktionen Übungsbeispiel Passwortgenerator Gültigkeitsbereich von Variablen Globale Variablen Call by Value – Wertübergabe Call by Reference – Adressübergabe 63 65 68 69 70 73 77 78 79 81 86 87 88 89 89 92 95 97 98 98 100 Deklaration von Klassen 101 101 7. Programmierung mit Windows Forms 7.1. Kontrollkästchen - CheckBox 7.2. Automatischer Farbwechsel 7.3. Buttons & Labels – Programmbeispiel Countdown 7.4. Textboxen 7.5. Standardschaltflächen 7.6. Objekte, Eigenschaften und Methoden 7.7. Ereignisse 7.8. Das KeyPress Ereignis 7.9. Übungsbeispiel Berechnung des BMI 7.10. Übungsbeispiel Rechentrainer 7.11. Übungsbeispiel Textverschlüsselung 7.12. Übungsbeispiel Währungsumrechner 7.13. InputBox aus Visual Basic 7.14. Die Methoden IndexOf und LastIndexOf 7.15. Übungsbeispiel Lotto 6 aus 45 7.16. Try – Catch, Ausnahmebehandlung 7.17. Übungsbeispiel Würfelspiel 7.18. Die Klasse RadioButton 7.19. Tool Tip Steuerelement 7.20. Picture Box 7.21. Scroll Bar – Bildlaufleiste 105 108 110 115 117 118 118 119 121 123 125 127 128 129 131 134 137 139 142 144 145 147 Copyright 2009 – Heimo Gaicher 7.22. 7.23. 7.24. 8. Anhang 8.1. 8.2. 8.3. 8.4. 8.5. 8.6. Anwendungen für andere Nutzer veröffentlichen Combo Box List Box 151 152 155 Strings formatieren mit C# Zahlen individuell formatieren Datumswerte formatieren Datumswerte individuell formatieren Math Klasse – Methodenübersicht ASCII-Tabelle 157 157 157 157 158 159 160 Copyright 2009 – Heimo Gaicher 1. Arbeiten mit VISUAL STUDIO 2008 Um in C# programmieren zu können, benötigen wir eine Software (Entwicklungsumgebung). Wir verwenden VISUAL STUDIO 2008 EXPRESS EDITION. VISUAL STUDIO 2008 EXPRESS EDITION ist eine kostenlose Software und Sie können Sie direkt von der Microsoft-Webseite herunterladen. 1.1 Download und Installation VISUAL STUDIO 2008 EXPRESS einrichten Hier der Downloadlink: http://www.microsoft.com/germany/express/download/webdownload.aspx Wählen Sie VISUAL STUDIO 2008 EXPRESS EDITION und klicken Sie im Fenster Visual C# auf Download. Wählen Sie bei der Installation alle Optionen aus. Copyright 2009 – Heimo Gaicher 1.2 Start mit VISUAL STUDIO 2008 Starten Sie ie VISUAL STUDIO 2008 EXPRESS. Beim Start öffnet sich ein Fenster enster mit den letzten Projekten. Um ein neues Projekt zu erstellen, klicken Sie auf Erstellen: Projekt… und es öffnet sich ein Assistent zum Erstellen eines neuen Projektes. Wählen Sie Konsolenanwendung solenanwendung aus und geben Sie dem Projekt einen Namen z.B. „Ausgabe“. Klicken Sie auf OK und es öffnet sich die Konsole. Copyright 2009 – Heimo Gaicher Sie sehen bereits einen ersten Code. Die Bedeutung des gesamten Codes soll uns aber an dieser Stelle noch nicht kümmern. Projektmappen-Explorer Dieser enthält alle Dateien, die zum Projekt gehören. Die Datei Program.cs enthält den Programmcode. Unseren Programmiercode schreiben wir innerhalb der geschweiften Klammern. In VISUAL STUDIO 2008 lässt sich die Anordnung der Fenster flexibel gestalten. Sämtliche Fenster lassen sich an allen Ecken andocken. So können Sie sich VISUAL STUDIO 2008 nach Ihren eigenen Bedürfnissen einrichten. 2. Programmieren in der Konsole Die Programmierung in der Konsole dient am Anfang dazu, um Code bzw. kleine Programme zu schreiben und diese zu verstehen. Grafische Komponenten, Formulare usw. wären hier am Anfang für den Lernenden hinderlich. Sobald aber das Grundgerüst erarbeitet ist, steigen wir um und programmieren in WindowsForms. Unser Projekt (auch jedes andere) startet an der Stelle static void Main(string[] args)und wird von den beiden geschwungenen Klammern { } eingeschlossen. Innerhalb der beiden Klammern wird unser Code schrittweise abgearbeitet und das Programm entsprechend ausgeführt. Copyright 2009 – Heimo Gaicher 2.1 Unser erstes Programm Wir gehen gleich an die Sache heran und schreiben unser erstes kleines Programm. Wir verzichten an dieser Stelle an eine „Einführung“ in C#, .Net usw., da dies anfangs ohnehin für einen Einsteiger nur schwer verstanden wird und nur einen unnötigen Ballast darstellt. Unser erstes Programm soll einfach nur „Hallo, C# macht Spaß!“ auf den Bildschirm ausgeben. Um etwas auszugeben verwenden wir den „Befehl“ Console.WriteLine gefolgt von dem, (in Klammern und unter “ “) was wir ausgeben möchten also ("Hallo, C# macht Spass!"); Das Semikolon ; am Ende schließt die Befehlszeile ab. Achtung! C# unterscheidet zwischen Groß- und Kleinschreibung! Wenn Sie ein C in die Konsole eingeben, öffnet sich ein Fenster, die IntelliSense und hilft Ihnen eine Auswahl möglicher Befehle zu treffen. Um Schreibfehler zu vermeiden sollten Sie die IntelliSense immer verwenden. Sobald Sie den Punkt setzen meldet sich die IntelliSense erneut und schlägt erneut mögliche Befehle vor. Wählen Sie WriteLine und vollenden Sie die Befehlszeile. Copyright 2009 – Heimo Gaicher 2.3 Struktur einer Klasse Ein C#-Programm besteht aus Klassen. Eine Klasse beschreibt Daten und Operationen, die ausgeführt werden können. Innerhalb einer Klasse werden Operationen als Methoden definiert. Eine Methode kann selbst erstellt werden oder auch fertig als Routine aus einer Klassenbibliothek verwendet werden. Anhand des folgenden Beispielprogrammes läßt sich die Grundstruktur eines C#-Programmes erkennen. Das Programm enthält eine einzige Klasse – die Klasse Program und diese beinhaltet die Methode Main. Die statische Methode Main muss in jedem Programm vorhanden sein, denn hier beginnt die Programmausführung. Main ist sozusagen der Startpunkt eines jeden C#-Programmes. Das Schlüsselwort static bedeuted, dass die Methode an die Klasse Program gebunden ist. Name der Klasse Beginn der Klasse Beginn der Methode Ende der Methode class Program { static void Main(string[] args) { Console.WriteLine("Hallo, C# macht Spass!"); Console.ReadLine(); } } Ende der Klasse Die Methode Main enthält zwei Anweisungen. 1. Console.WriteLine("Hallo, C# macht Spass!"); WriteLine() ist eine Methode der Klasse Console. Wird die Methode WriteLine () aufgerufen, gibt sie den Text in den beiden Klammern gefolgt von einem Linefeed (Absatz) aus. 2. Console.ReadLine(); ReadLine()ist eine Methode der Klasse Console. Wird die Methode ReadLine() aufgerufen, wartet sie an dieser Stelle auf eine Eingabe gefolgt von einem Enter. Unser Programm wird somit an dieser Stelle angehalten und nicht sofort beendet. Das nächste Beispiel zeigt, wie ein C#-Programm mit mehreren Klassen strukturiert ist. In der Klasse Program befindet sich die Methode Main(). Diese ruft einerseits die Methode WriteLine() und andererseits die Methode Message() der Klasse End auf. Der Klassenname wird gefolgt von einem Punkt dem Namen der Methode vorangestellt. Die Methode Message() ist in der Klasse End als public deklariert. public bedeuted, dass die Methode öffentlich zugänglich ist. Somit kann sie auch außerhalb ihrer Klasse aufgerufen werden. Die Methode Main() könnte, da sie der Einstiegspunkt ist, auch als public deklariert werden. Copyright 2009 – Heimo Gaicher Beide Methoden sind als void deklariert. void bedeuted, es wird kein Wert zurückgegeben. Sie besitzen keinen Return-Wert. In C# ist die Reihenfolge in der die Klassen deklariert werden nicht vorgeschrieben. Es könnte also auch zuerst die Klasse End gefolgt von der Klasse Program deklariert werden. Somit werden also Methoden aufgerufen bevor sie definiert sind. Hier ein C#-Programm mit zwei Klassen: namespace mehrereKlassen { class Program { static void Main() { Console.WriteLine("Start!"); End.Message(); Console.ReadLine(); } } class End { public static void Message() { Console.WriteLine("Ende!"); } } } Beide Klassen sind in einem eigenen namespace (Namensbereich) deklariert. Namensbereiche unterstützen die interne Organisation von Programmen und verhindern dadurch Konflikte in der Namensvergabe. Hier ein weiteres Beispiel: class Program { static void Main() { Console.WriteLine("Start!"); Klasse1.Sterne(); Console.WriteLine("Drücken Sie Enter!"); Console.ReadLine(); Klasse2.Ende(); Console.ReadLine(); } } class Klasse1 { public static void Sterne() { Console.WriteLine("******"); } Ausgabe: } class Klasse2 { public static void Ende() { Console.WriteLine("Danke!"); } } Copyright 2009 – Heimo Gaicher Was sind eigentlich Variablen? Variablen speichern Zahlen, Buchstaben oder Zeichenketten und stellen sie dem Programm zur Verfügung. Jede Variable ist von einem bestimmten Datentyp, der angibt, welche Art von Information die Variable speichern soll. Beispiel: Der Variablen mit dem Namen Sum wird der Inhalt von Variable a + Variable b zugeordnet. In Sum wird der Wert 12 gespeichert. Da in diesem Fall die Variablen ganzzahlige Werte enthalten, müssen wir die Variablen richtig deklarieren, also einem Datentyp zuordnen. In unserem Beispiel wählen wir den Datentyp Integer (Int 32), welcher ganzzahlige Werte zwischen -231 bis 231 -1 speichern kann. Als Programmcode sieht das so aus: int Sum, a=10, b=2; //Variablen werden als Integer deklariert. //a wird der Wert 10 und b der Wert 2 zugeordnet. Sum = a + b; //Sum speichert den Inhalt von a + b Wertzuweisung von Variablen Wird einer Variablen kein Wert zugewiesen, beschwert sich Visual C# bei der Ausführung mit einer Fehlermeldung. Beispiele für Wertzuweisungen: int maxWert = 10000; //Weist der Variablen maxWert die Zahl 10000 zu. double messwert = 2.3; //Weist der Variablen messwert vom Typ double die Zahl 2.3 zu. string b; b = "Ich bin eine Zeichenkette und daher ein String"; //Deklariert die Variable b vom Typ String //Weist der Variable b die Zeichenkette "Ich bin eine Zeichenkette und daher ein String" zu. Copyright 2009 – Heimo Gaicher 2.6 Datentypen in Visual C# Datentyp Wertebereich bool byte sbyte char short ushort int uint float ulong long double decimal true oder false 0 ... 255 -128 ... 127 0 ... 65535 -215 -215 -1 0 ... 65535 -231 - 231 -1 Bit 1,4 x 10- 45 ... 3,4 x 1038 0 ... 264 -1 -263 - 263 -1 5,0 x 10- 324 ... 1,7 x 10308 ±1,0 x 10-28 ... ±7,9 x 1028 1 8 8 16 16 16 32 32 32 64 64 64 128 Laufzeittyp Boolescher Wert Byte SByte Unicode Zeichen Int16 UInt16 Int32 UInt32 Single UInt64 Int64 Double Decimal Typischerweise werden Variablen dazu verwendet, um z.B. Werte einzulesen, diese zu verarbeiten und auszugeben. Dies geschieht mit der Klasse Console und deren Methoden z.B. ReadLine oder WriteLine. Überblick Wertetypen Wahrheitswerte bool Zeichen char sbyte, byte short, ushort Ganzzahlen int, uint long, ulong float Gleitkommazahlen double decimal Copyright 2009 – Heimo Gaicher Laufzeitfehler: Wird während eines Programmablaufes eine falsche Typenumwandlung durchgeführt, so kommt es zu einem Laufzeitfehler (Runtime Error) und das Programm stürzt ab. Beispiel: Es sollte eine Zahl eingelesen werden aber der Benutzer gibt einen Buchstaben ein! 2.7 Einlesen von Werten Um einen Wert einzulesen verwenden wir die Methode ReadLine. Console.ReadLine(); ACHTUNG! Console.ReadLine()liest immer einen String (Zeichenkette) ein! Möchte man z.B. eine Zahl einlesen und diese in eine Variable speichern, muss diese zuvor in den Typ Int, long, float ect. konvertiert werden. Dies klingt logisch, da man ja nicht wissen kann, welcher Wert (Zahlen, Buchstaben oder Zeichen) eingelesen wird, muss man zwangsweise eine Zeichenkette (String) einlesen. Daher liest Console.ReadLine() immer einen String ein, der dann in den gewünschten Datentypen umgewandelt (konvertiert) werden muss. Eine Konvertierung von Datentypen erfolgt durch die Klasse gefolgt von der gewünschten Methode z.B: Convert.ToInt32 für den Datentyp Integer oder Convert.ToDouble für den Datentyp Double. Copyright 2009 – Heimo Gaicher Jetzt möchten wir aber ein kleines Programm schreiben, welches eine Zahl einliest und diese mit 5 multipliziert. Das Ergebnis soll wie gewohnt ausgegeben werden. Zuerst werden zwei Variablen deklariert. Wir benennen sie mit zahl1 und ergebnis und deklarieren beide vom Datentyp Integer. Die Variablen werden mit einem Beistrich getrennt und abgeschlossen wird mit einem Semikolon. int zahl1, ergebnis; Jetzt soll der Benutzer aufgefordert werden, eine Zahl einzugeben. Console.WriteLine("Bitte eine Zahl eingeben!"); Jetzt wird eingelesen! Der eingelesene Wert wird in Int32 konvertiert und in zahl1 gespeichert. Die Variable zahl1 ist vom Datentyp Integer. zahl1 = Convert.ToInt32(Console.ReadLine()); Die Variable ergebnis, welche zuvor noch keinen Wert hatte, erhält nun den eingegebenen Wert (Wert von zahl1) multipliziert mit 5. ergebnis = zahl1 * 5; Die Ausgabe der Werte erfolgt über die beiden Platzhalter. Zahl1 in Platzhalter {0} und ergebnis in Platzhalter {1}. Console.WriteLine("5 mal {0} = {1}", zahl1, ergebnis); Console.ReadLine(); Die Ausgabe der Werte kann aber auch ohne Platzhalter durchgeführt werden. Man setzt einfach die Variablen direkt ein und verbindet mit +! z.B: Console.WriteLine("5 mal " + zahl1 + " = " + ergebnis); Liefert das selbe Ergebnis! Der Code auf einem Blick: int zahl1, ergebnis; Console.WriteLine("Bitte eine Zahl eingeben!"); zahl1 = Convert.ToInt32(Console.ReadLine()); ergebnis = zahl1 * 5; Console.WriteLine("5 mal {0} = {1}", zahl1, ergebnis); Console.ReadLine(); Copyright 2009 – Heimo Gaicher 2.12 Debugging An dieser Stelle betrachten wir unser Programm etwas genauer. Wir nutzen den Debugger um das Programm schrittweise ablaufen zu lassen. Besonders bei etwas längerem Programmcode schleichen sich gerne Fehler ein. Of erkennt man die Fehler sofort aber manchmal sucht man „ewig“! Um Fehler (besonders logische Fehler) besser isolieren und beheben zu können, macht es Sinn, den Debugger zu verwenden. Wir debuggen obiges Beispiel und setzen an der linken Seite auf der Leiste einen Haltepunkt. Den Haltepunkt setzen Sie, wenn Sie mit der linken Maustaste an diese Stelle klicken. Jetzt starten wir unser Programm wie gewohnt (grüner Pfeil oder F5). Der Startpunkt wird markiert und im unteren Fenster sehen wir alle Variablen mit den derzeitigen Werten. Copyright 2009 – Heimo Gaicher 2.14 Strings einfügen, ersetzen und löschen Auch hier liefert uns C# verschiedene Methoden. Einfügen: berei vorhandenen String Mit der Methode können Sie einen String an eine vordefinierte Position in einen bereits einfügen. Beispiel: string str1 = "programm"; string str2 = str1.Insert(0,"C# str1.Insert(0, "); string str3 = str2.Insert(11, "ieren"); Console.WriteLine(str2); Console.WriteLine(str3); Console.ReadLine(); Als Ausgabe erhalten wir: Achten Sie auf die Positionen in Strings. Diese beginnen immer bei 0! Positionen in Strings P 0 r 1 o 2 g 3 r 4 a 5 m 6 m 7 Beispiel: str3 = str2.PadLeft(16); Mit PadLeft(); und PadRight(); wird ein String mit beginnenden oder nachfolgenden Leerzeichen aufgefüllt. Der String str3 beginnt mit 5 Leerzeichen und hat die Länge 16. Löschen und Ersetzen Mit der Methode Remove() können Sie alle Zeichen ab einer definierten Position Position in einem String ersetzen. string str1 = "C# Programmierer"; Programmierer" string str2 = str1.Remove(11); str2 enthält dann den String „C# Programm“ , da ab der 11.Stelle alle weiteren Zeichen entfernt wurden. Im Gegensatz zur Methode Remove() liefert die Methode Substring() alle Zeichen ab einer definierten Position in einem String. Copyright 2009 – Heimo Gaicher 3.4 Die Math-Klasse - Potenzen, Wurzel, Logarithmen Die Klasse Math stellt verschiedene mathematische Funktionen wie z.B. Wurzel, sin, cos, tan, log, Min, Max, PI, Potenzen usw. zur Verfügung. ACHTUNG! Die Klasse Math verlangt den Datentyp double Wir schreiben ein Programm, welches die Hypothenuse eines rechtwinkeligen Dreiecks berechnet. Laut Pythagoras ist: c2 = a2 + b2 - somit ist c die Wurzel aus ( a2 + b2 ) Unser Programm soll die beiden Seitenlängen a und b einlesen und die Seitenlänge c berechnen. Hier eine mögliche Lösung namespace Pythagoras { class Program { static void Main(string[] args) { float a, b, c; Console.WriteLine("Dieses Programm berechnet die Seitenlänge eines rechtwinkeligen Dreiecks.\n" + "Bitte geben Sie einen Wert für die Seite a in cm ein!"); a = Convert.ToSingle(Console.ReadLine()); //Konvertieren, da ReadLine immer einen String einließt! Console.WriteLine("Bitte geben Sie einen Wert für die Seite b in cm ein!"); b = Convert.ToSingle(Console.ReadLine()); //Konvertieren, da ReadLine immer einen String einließt! c = Convert.ToSingle(Math.Sqrt((a * a) + (b * b))); //Math.Sqrt verlangt den Typ double -> daher Konvertierung in float Console.WriteLine("Die Seite c hat eine Länge von {0:F2} cm", c); Console.ReadLine(); } } } Copyright 2009 – Heimo Gaicher 4.2 Übungsbeispiel! Freier Fall mit Luftwiderstand Ein Fallschirmspringer beschleunigt so lange, bis die Erdanziehungskraft gleich groß ist, wie der Luftwiderstand. Die Endgeschwindigkeit berechnet sich aus: (m …Masse des Fallschirmspringers, A..Querschnittsfläche) Eingabe: m, A Ausgabe: v Copyright 2009 – Heimo Gaicher 4 Verzweigungen Bisher haben wir nur linear (ein Befehl folgt auf den anderen) programmiert. Die meißten Probleme erfordern aber andere Lösungen. In Abhängigkeit einer Bedingung (WAHR oder FALSCH) wird entweder der eine oder der andere Programmteil ausgeführt. 5.1 Die if – else Verzweigung Die if - else Verzweigung fragt eine Bedingung ab und prüft sie auf true oder false. Syntax: if (Bedingung) { WAHR-ZWEIG } else { SONST-ZWEIG } Wir schreiben ein Programm, welches bei Eingabe von zwei Zahlen prüft, welche Zahl größer ist. Oft verwendet man wie hier dargestellt ein Struktogramm (Nassi-Schneidermann-Diagramm) um den Programmablauf übersichtlicher darzustellen. Man kann hier gut den Programmablauf erkennen. Es wird geprüft, ob Zahl1 größer ist als Zahl2. Ist die Bedingung wahr, wird der ja-Zweig ausgeführt, sonst der nein-Zweig. Eine Software um Struktogramme zu erstellen ist als Download z.B. auf www.555.at zu finden. Copyright 2009 – Heimo Gaicher 5.2 Abfagen mit switch / case switch / case prüft Bedingungen auf die Erfüllungen fixer vorher definierter Werte. Im Unterschied zur if-Anweisung prüft switch fixe Werte ab. Wir verwenden switch, wenn sich der zu prüfende Wert nicht ändert! Beispiel Kaffeeautomat: Wir schreiben ein Programm, welches einen Kaffeeautomaten simuliert. Es stehen 4 Eingabetasten zur Verfügung. Davon sind drei belegt und die vierte ist leer. Taste 1= Kaffee groß Taste 2= Kaffee mittel Taste 3= Kaffee klein Taste 4= leer Copyright 2009 – Heimo Gaicher 5.12 Übungsbeispiel! Quadratische Funktion Es soll ein Tabellenblatt wie abgebildet zu erstellen. Berechnet wird die Funktion f(x)=ax²+bx+c. Eingabe: a,b,c, startwert von x, endwert von x, schrittweite von x Hier eine mögliche Lösung: namespace quadrat_funktion { class Program { static void Main(string[] args) { int a, b, c, start, end, schritt; double x; Console.WriteLine("Funktionstabelle für f(x) = ax²+bx+c"); Console.WriteLine("------------------------------------"); Console.Write("a=? "); a = Convert.ToInt32(Console.ReadLine()); Console.Write("b=? "); b = Convert.ToInt32(Console.ReadLine()); Console.Write("c=? "); c = Convert.ToInt32(Console.ReadLine()); Copyright 2009 – Heimo Gaicher 5.19 Arrays - mehrdimensionale Felder Ein zweidimensionales Feld besteht aus Zeilen und Spalten. Wie z.B. eine Excel-Tabelle. Möchte man z.B. Messwerte über 4 Wochen einlesen, so entsprechen die Wochen den Zeilen und die Tage den Spalten. Jedem Feld (Zeile x, Spalte y) wird ein Wert zugeordnet. Hier ein Beispiel: Mit diesem Programm sollen Einnahmen über 4 Wochen, a' 6 Tage eingelesen werden. Man benötigt also ein Feld mit 4 Zeilen und 6 Spalten [4,6]. Zusätzlich soll der Durchschnitt und der Tag mit den geringsten Einnahmen ausgegeben werden. Tag 1 Tag 2 Tag 3 Tag 4 Tag 5 Tag 6 Woche 1 Feld [0,0] Feld [0,1] Feld [0,2] Feld [0,3] Feld [0,4] Feld [0,5] Woche 2 Feld [1,0] Feld [1,1] Feld [1,2] Feld [1,3] Feld [1,4] Feld [1,5] Woche 3 Feld [2,0] Feld [2,1] Feld [2,2] Feld [2,3] Feld [2,4] Feld [2,5] Woche 4 Feld [3,0] Feld [3,1] Feld [3,2] Feld [3,3] Feld [3,4] Feld [3,5] namespace einnahmen { class Program { static void Main(string[] args) { //Einnahmen über 4 Wochen, a' 6 Tage. Durchschnitt und Tag mit MIN? float summe = 0,durchschnitt=0,minimum=0,tag=0,woche=0; float[,] einnahmen = new float[4, 6]; //4 Zeilen und 6 Spalten for (int i = 0; i < 4; i++) //äussere Schleife für die Zeilen { for (int j = 0; j < 6; j++) //innere Schleife für Spalten { Wie Sie sehen, sind die Variablen der Funktion flaechenberechnung anders benannt. Es wird also nicht die Variable a oder b übergeben, sondern nur deren Werte. Diese werden in laenge und breite gespeichert. Copyright 2009 – Heimo Gaicher Wir schreiben ein Programm, welches die Fläche zwischen einer Funktion f(x) und deren X-Achse berechnet. Beispiel: Gegeben ist die Funktion f(x)=x2 Unser Programm soll nun die Fläche zwischen der Funktion und der X-Achse innerhalb zweier Punkte (x1 und x2) berechnen. x1 und x2 sind zwei Werte auf der X-Achse. (In diesem Beispiel x1=-2 und x2=3) Hier die Berechnung: Programmablauf: 1. 2. 3. 4. Begrüßung mit einer Prozedur Einlesen der beiden X-Werte (x1, x2) Berechnung der Fläche mit einer Funktion Ausgabe Tip: Versuchen Sie es zuerst selbst! Eine mögliche Lösung sehen Sie auf der nächsten Seite. Hier eine mögliche Lösung des Programmbeispieles: Copyright 2009 – Heimo Gaicher Das Konzept von Klassen z.B. die Klasse AUTO: AUTO Klasse AUTO Eigenschaften: • • • • • Baujahr Hubraum Leistung Fahrgestellnummer ……. Fähigkeiten: • • • • Beschleunigen Bremsen Abbiegen ……. Objekte AUTO1 Eigenschaften: • • • • Baujahr = 2002 Hubraum = 1900 Leistung = 136 Fahrgestellnummer = 123456 Fähigkeiten • …….. AUTO2 Eigenschaften: • • • • Baujahr = 2002 Hubraum = 1900 Leistung = 136 Fahrgestellnummer = 123456 Fähigkeiten • …….. Copyright 2009 – Heimo Gaicher 7 Programmierung mit Windows Forms Ab jetzt wenden wir uns der Programmierung mit der grafischen Oberfläche zu und erstellen gleich ein kleines Programm, welches auf den Klick eines Buttons den Text "Hallo ich bin ein c#-Fan!" ausgeben soll. Wir erstellen wieder ein neues Projekt, aber diesmal nicht mehr in der Konsolenanwendung sondern in der Windows Forms-Anwendung. Geben Sie der Anwendung einen Namen und klicken Sie ok! Es erscheint ein Formular mit der Bezeichnung Form1 Copyright 2009 – Heimo Gaicher 7.3 Buttons & Labels - Programmbeispiel Countdown Mit diesem Programmbeispiel wollen wir Schleifen wiederholen. Es soll ein Countdown von 10 bis 0 ausgegeben werden. Mit drei Buttons sollen wir die Art der Schleife (For-Schleife, Kopfgesteuerte- und Fußgesteuerte Schleife) wählen können. Wir bauen unser Formular mit vier Buttons und einem Label auf: this.label1.Text = Convert.ToString(i); // gibt den Text i als String auf label1 aus System.Threading.Thread.Sleep(1000); // damit wird der aktuelle Thread für 1000ms (1 Sekunde) angehalten this.Refresh(); // erneuert die Anzeige Hier der vollständige Programmcode: Copyright 2009 – Heimo Gaicher 7.11 Übungsbeispiel! Textverschlüsselung In diesem Beispiel verschlüsseln wir einen Text. Jedes eingegebene Zeichen soll soll durch sein nachfolgendes ersetzt werden. Wir bauen ein Formular mit mehrzeiligen Textboxen auf. Um eine Textbox mehrzeilig zu verwenden, setzen wir in den Eigenschaften der Textbox Multiline auf true. Buchstaben werden intern als ASCII-Zeichen ASCII Zeichen (American Standard Code for Information Interchange) gespeichert. Der Buchstabe A entspricht dem ASCII-Code ASCII 65, B = 66 usw. Eine vollständige ASCII-Tabelle finden inden Sie im Anhang. als als ASCII-Code. Der Datentyp char speichert ein Zeichen also private void cmd_start_Click(object cmd_start_Click( sender, EventArgs e) { string neu = "", , original; char buchstabe; original = txt_1.Text; for (int i = 0; i < original.Length; orig i++) { buchstabe = original[i]; neu = neu + Convert.ToChar(buchstabe Convert + 1); } txt_2.Text = neu; } Wenn Sie im Originaltext den Buchstaben z oder Z eingeben, so ist der nachfolgende kein Buchstabe mehr. Versuchen Siee das Programm so umzuändern, dass nach einem z ein a bzw. nach einem Z ein A umgewandelt wird. Copyright 2009 – Heimo Gaicher 7.13 InputBox aus Visual Basic Wir „borgen“ uns aus Visual Basic die InputBox aus. Dafür benötigen wir einen Verweis auf Visual Basic. Hierzu klicken wir im Projektmappen-Explorer mit der rechten Maustaste auf Verweise und wählen „Verweis hinzufügen“. Es öffnet sich ein neues Fenster. Wir wählen den Verweis „Microsoft Visual Basic“ und bestätigen mit OK. Nun können wir die InputBox aus Visual Basic einbauen. Copyright 2009 – Heimo Gaicher 7.17 Übungsbeispiel Würfelspiel Wir programmieren ein Würfelspiel rfelspiel mit 6 Würfeln. Pro Wurf ist also eine Augensumme von min. 6 bis max. 36 möglich. Erstellen Sie folgendes Formular. Um eine Grafik in das Formular einzufügen wählen Sie in der Toolbox „PictureBox“ aus und ziehen sie in das Formular. Wenn Sie auf den Pfeil klicken, öffnet sich ein Fenster mit den PictureBox Aufgaben. Hier können Sie ein Bild auswählen bzw. importieren, die Größe festlegen usw. Der Spieler gibt einen Tip ab und es soll sich eine MessageBox melden. Klickt der Spieler auf den Button „Würfeln“, sollen die gewürfelten Augen sowie die Augensumme ausgegeben werden. Copyright 2009 – Heimo Gaicher 7.18 Die Klasse RadioButton Radio Buttons sind Optionsschaltflächen. Sie bieten dem Benutzer Optionen an, die sich aber gegenseitig ausschließen. Sie ähneln den Kontrollkästchen, wobei aber immer nur eine eine einzige Optionsschaltfläche aktiv sein kann. Optionsschaltflächen sind in einer Gruppe zusammengefasst. Daher müssen Sie vorher eine GroupBox oder ein Panel erstellen. Eine GroupBox hebt sich mit einem Rahmen von der Form ab. Ein Panel hebt sich optisch nicht ab. Programmieren Sie einen Taschenrechner mit RadioButtons! Aus der Toolbox ziehen Sie die GroupBox. in die Form und den ziehen Sie in die Die wichtigste Eigenschaft eines RadioButton ist i Checked. Diese wird bei der Abfrage auf true gesetzt. Copyright 2009 – Heimo Gaicher 7.22 Anwendungen für andere Nutzer veröffentlichen Mit dem RGB-Farbmischer Farbmischer haben Sie nun ein Programm, Programm, welches aber nur auf Ihrem Computer in der IDE läuft. Damit auch andere Benutzer dieses Programm ohne Entwicklungsumgebung öffnen und verwenden können müssen Sie es zuvor veröffentlichen. Wählen Sie im Menü „Erstellen“ und „Farben veröffentlichen“. Es meldet sich der Publishing-Assistent. Assistent. Akzeptieren Sie die Grundeinstellungen und klicken Sie auf Fertig stellen. Im entsprechenden Unterordner (z.B.: file:///C:/Visual Studio 2008/Farben/Farben/publish/) 2008/Farben/Farben/publish werden nun die entsprechenden Installationsdateien erstellt. Hier werden die Unterstützungsdateien für den Installer gespeichert Diese Datei teilt dem Installer alles mit, was bei der Installation des Programmes eingeschlossen werden muss. Die Setup-Datei. Datei. Damit können die Benutzer das Programm installieren. Copyright 2009 – Heimo Gaicher