Moritz Stadler 1bhif Prog C# 1 Einführung in die Programmierung Grundelemente Allgemeine Struktur des Programmes: using System; /* Uebung n * Moritz Stadler * Datum * Beschreibung: km/h zu Knoten */ namespace Umrechnen { class Program { static void Main(string[] args) { double kmh = 0.0; double knots = 0.0; Console.Write("Bitte geben Sie die km/h ein: "); kmh = Convert.ToDouble(Console.ReadLine()); knots = kmh * 1.8; Console.WriteLine("{0} km/h sind {1} Knoten", kmh, knots); Console.ReadKey(); } } } Datentypen: NAME WERTEBEREICH BENÖTIGTER SPEICHER bool true, false 1 byte char Alle Zeichen (1) 2 byte string byte Alle Zeichen (unbegrenzt) 0 - 255 String.Lenght abhängig 1 byte short -32768 - 32767 2 byte int -2147483648 - 2147483647 4 byte long -9223372036854775808 9223372036854775807 ±1,5 × 10-45 bis ±3,4 × 1038 (auf 7 Stellen genau) ±5,0 × 10−324 bis ±1,7 × 10308 8 byte float double abhängig 8 byte Moritz Stadler 1bhif Prog C# 2 Elemente von Algorithmen Daten werden in Variablen und Konstanten gespeichert. Variablen haben einen Namen, einen Datentyp, einen Wert und eine Adresse. double prNotendurchschnitt = 3.0; Datentyp Name Wert ini. Zuweisung Abschluss Konstanten deklarieren: const double prgut = 2.0; Anweisungen: x = y; //x wrid zu y VAR = WERT Sequenz: Sequenzen sind aufeinander folgende Anweisungen Anweisung 1; Anweisung 2; Anweisung n; Verzweigungen: Verzweigungen sind werteabhängige Folgen im Programm (z.B if). Sie ist von einer Bedingung abhängig ? Anweisung x; z.B. Anweisung y; if (a == b) { f(); } else if (a < b) { f2(); } else { f3(); } Moritz Stadler 1bhif Prog C# IF Anweisung if (statement) { Anweisung } Logische FALLS Verknüpfung statement => Wert Vergleichsoperator Wert 1 3 a == < == 1 4 b Wenn das if Statement nicht zutrifft wird die Anweisung im falls vorhandene else Zweig ausgeführt. Wenn dieser nicht vorhanden ist, so wird die Programm-Sequenz fortgesetzt if (a == b) { f(); } else { f2(); } Wenn a = b ist so wird f() ausgeführt. Ist dies nicht der Fall, f2(). Schleifen for – Schleife: for (int i = 0; i < 10; i++) { //Wird 10 mal ausgeführt } Schleifenkopf Schleifenrumpf im VS C#: for [2mal Tab] for (initializer; condition; iterator) body 1.) Initialisierung (int i = 0) 2.) Bedingung (wird vor jedem eintreten in die Schleife geprüft) 3.) Inkrenet (i++) wird nach jedem durchlaufen der Schleife ausgeführt while – Schleife: Abweisend, kopfgesteuert. while (a == b) { //solange a = b ist } 3 Moritz Stadler 1bhif Prog C# Verzweigungen Einseitig Zweiseitig if(x > 0) { x = -x; } if (x < y) { max = x; }else{ max = y; } Histogramm: using System; /* Uebung n * Moritz Stadler * Datum * Beschreibung: Historgarmm */ namespace Umrechnen { class Program { static void Main(string[] args) { int i = 1; int j = 0; while (i > 0) { i = Convert.ToInt32(Console.ReadLine()); j = 0; while (j < i) { Console.Write("*"); j++; } Console.WriteLine(); } } } } 4 Moritz Stadler 1bhif Prog C# switch-case – Verzweigung: switch (input) { case 'f': Console.WriteLine("Fleisch"); break; case 'F': Console.WriteLine("Fisch"); break; case 'o': Console.WriteLine("Obst"); break; case 'g': Console.WriteLine("Gemüse"); break; default: Console.WriteLine("Fehler"); break; } Funktionsaufrufe Math.Pow(Basis, Exponent); Casts: (double); do { } while (true); double.TryParse(); for (int i = 0; i < length; i++) { } Bsp.: Quersumme, Primzahlen while (Int31.TryParse(input, out zahl) == false) //solange falsche Eingabe //wenn int true ist wird zahl ausgegeben mit out wird es an derselben Stelle gespeichert. f(x) -> x ist ein Parameter Formalparameter: (int i, double z) static returnwert Frame(Formalparameter) Aktualparameter: (Beim Aufruf) (ohne Datentyp) Frame(Aktualparameter) ref: Aktual und Formalparameter besitzen den gleichen Speicherort! 5 Moritz Stadler 1bhif Prog C# do-while – Schleife: (Fuß-gesteuert) do { input = Console.ReadLine(); } while (Int32.TryParse(input, out zahl) == false); Diese wird so lange ausgeführt, wie eine falsche Eingabe getätigt wurde. 6 Moritz Stadler 1bhif Prog C# 7 Vorbereitung LF 1. 2. 3. 4. 5. Leistungsfeststellung Ablauf Stoppuhr Eingabeüberprüfung(int) Übungsbeispiele für Schleifen BlackBox Modell für Funktionen Als Black Box bezeichnet man in der SystemAls Black Box bezeichnet man in der Systemtheorie ein (möglicherweise sehr komplexes) System, von welchem im gegebenen Zusammenhang nur das äußere Verhalten betrachtet werden soll. Die innere Struktur mag bekannt sein; solche Kenntnis darf aber nicht benutzt werden. Man beschränkt sich bei der Untersuchung und Beschreibung auf die Messung der Input-Output-Beziehungen (EVA-Prinzip). Stoppuhr in C#: System.Diagnostics.Stopwatch name = new System.Diagnostics.Stopwatch(); name.Start(); //code hier wird die Dauer gemessen name.Stop(); sek = name.Elapsed.Seconds; //int Moritz Stadler 1bhif Prog C# Eingabeberprüfung: static int ReadandParseInt32() { const int max = 3; string input = ""; int zahl; int i = 1; bool ok = false; do { try { Console.Write("{0}. Versuch: ", i++); Console.Write("Bitte eine Zahl zwischen {0} und {1} eingeben: ", int.MinValue, int.MaxValue); input = Console.ReadLine(); zahl = int.Parse(input); ok = true; } catch { Console.WriteLine("Falsche Eingabe: " + input); zahl = 0; } } while (ok == false && i <= max); return zahl; } Im try Teil steht die Invalide Anweisung im catch die Fehlermeldung. Funktionen - Wiederholung: static bool Name123(int a) { if (a == 0) { return false; } else { return true; } } 8 Moritz Stadler 1bhif Prog C# 9 Zeichenketten Erklärung: Nehmen wir an, wir haben einen string string s = "Mein_Name_ist_Moritz"; Nun wollen wir das n-te also z.B 7. Zeichen erfassen. (Achtung: das 1. Zeichen hat den index0) char n = s[n - 1]; // n = 6 -> 7. Zeichen Also ist n in unserem Fall ‚m‘. Um die Länge eines strings herauszufinden benutzen wir s.Lenght; string s = "Mein_Name_ist_Moritz"; for (int i = 0; i < s.Length; i++) { Console.WriteLine(s[i]); } Hier wird z.B. jedes Zeichen aus dem Text in einer neuen Zeile ausgegeben. Die wäre die Darstellung in einem Raster des obrigen Beispiels. 0 M 1 e 2 i 3 n 4 _ 5 N 6 a 7 m 8 e 9 _ 10 i 11 s 12 t 13 _ 14 M 15 o 16 r 17 i 18 t 19 z Moritz Stadler 1bhif Prog C# Test driven Development Testgetriebene Entwicklung (auch testgesteuerte Programmierung, engl. test first development oder test-driven development (TDD)) ist eine Methode, die häufig bei der agilen Entwicklung von Computerprogrammen eingesetzt wird. Bei der testgetriebenen Entwicklung erstellt der Programmierer Software-Tests konsequent vor den zu testenden Komponenten. Die dazu erstellten Testfälle werden auch als Grey-Box-Tests bezeichnet. Beim TDD arbeiten wir nur in der Programm.cs Datei. Durch das Drücken von Strg + R + A werden alle Unittest ausgeführt Ein Unittest ist ein Test, der eine Funktion auf Fehler überprüft. Leitfaden für TDD: 1. Schreibe Tests für das erwünschte fehlerfreie Verhalten, für schon bekannte Fehlschläge oder für das nächste Teilstück an Funktionalität, das neu implementiert werden soll. Diese Tests werden vom bestehenden Programmcode erst einmal nicht erfüllt bzw. es gibt diesen noch gar nicht. 2. Ändere/schreibe den Programmcode mit möglichst wenig Aufwand, bis nach dem anschließend angestoßenen Testdurchlauf alle Tests bestanden werden. 3. Räume dann im Code auf (Refactoring): Entferne Wiederholungen (Code-Duplizierung), abstrahiere wo nötig, richte ihn nach den verbindlichen Code-Konventionen aus etc. Natürlich wieder mit abschließendem Testen. Ziel des Aufräumens ist es, den Code schlicht und verständlich zu machen. 10 Moritz Stadler 1bhif Prog C# 11 Weitere Funktionen & Arrays Am Beispiel eines Int-Arrays 0 456 1 23 2 11 3 -165 int name = new int[n] //n gibt die Länge des Arrays an name[0] = 456; name[1] = 23; name[2] = 11; name[3] = -165; Arrays können jeden Datentyp annehmen Definition Arrays Mit Hilfe eines Feldes können die Daten eines üblicherweise einheitlichen Datentyps so im Speicher eines Computers abgelegt werden, dass ein Zugriff auf die Daten über einen Index möglich wird. Das (Standard-)Feld verwendet im Gegensatz zum assoziativen Feld einen ganzzahligen Index zur Adressierung. Dieser kann frei gewählt werden. Weitere Funktionen: ReadText(); StrtoLower(); FillRandom(); Moritz Stadler 1bhif Prog C# 12 Wiederholung Funktionen Der Zweck von Methoden: Wiederverwendung (Code nicht kopieren) Struktur des Programms Methodenaufruf static void P() { Q(); } static void Q() { R(); } formale Parameter Im Methodenkopf (z.B. … (int x, int y) Sind die Variable der Methode Aktual Parameter An der Aufrufstelle Können Ausdrücke sein static R() { … } Moritz Stadler 1bhif Prog C# Lokale & Statische Variablen class C { static int a, b; static void P() { int x, y; } Statische V. sind in allen Methoden dieser Klasse sichtbar Lokale V. nur in dieser Methode sichtbar } Speicherplatz: Statische Variablen: Am Programmanfang angelegt, am Ende freigegeben. Lokale Variablen: Beim Methodenaufruf angelegt, am Ende der Methode freigegeben Effizienter vs. Normale Algorithmen Der effiziente Algorithmus ist bis zu x-mal schneller als der normale A. Alerdings braucht man für den effizienteren A. eine gute Idee. 13