Anda di halaman 1dari 30

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr.

Andreas Alef Fach: AWE Name:

ARBEITSBLATT C# Lehrer Programmieren: Dr. Andreas Alef (alef@tbs1.de, andreas.alef@web.de)

08.09.2010 Welche Hobbys habt Ihr? Was ist der Unterschied zwischen SW und einem Auto? SW ist immateriell Autos erzeugen bei der Entwicklung und Produktion Kosten fr Material und Lohn Die Kosten fr SW fallen bei der Entwicklung an (berwiegend Lohnkosten), die Vervielfachung und Verteilung fhrt nur zu geringen Stckkosten. 15.09.2010 Der immaterielle Charakter von SW fhrt dazu, da in der Historie Programme hufig ohne oder mit wenig Planung geschrieben wurden. Die sich durch den Mangel an Planung einschleichenden Fehler wurden manchmal besonders spt erst entdeckt und deren Behebung fhrte dann zu besonders hohen Kosten. Aus diesem Grund forderte man, da SW nach ingenieurmigen Vorgehensweisen zu produzieren sei. Die sich damit beschftigende Wissenschaftsdisziplin nennt sich SWEngineering. Das sogenannte Wasserfallmodell ist ein Phasenmodell fr die Entwicklung von SW. Der SW-Entwicklungsproze ist in 5-7 Phasen aufgeteilt. Jede Phase wird getrennt von den anderen Phasen und streng nacheinander bearbeitet. Jede Phase bernimmt die Ergebnisse der voherigen. Im einfachen Modell sind Rckschritte nicht mglich (Kritik). Im erweiterten Wasserfallmodell sind Rckschritte erlaubt. Das erweiterten Wasserfallmodell:

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

(aus wikipedia, Stichwort Wasserfallmodell, Abrufdatum 15.09.2010, 10:25h) Initialisierung: Problemverstndnis an der Oberflche, Kundengesprche usw. Analyse: Detailliertes Verstndnis und Durchdringung des Problemes, erste Lsungsanstze Entwurf: Detaillierte Planung. Kann Dokumente, Strukturplne usw. als Ergebnis haben. An dieser Stelle sollte bekannt sein, wie das Programm funktionieren wird. Realisierung: Eigentliche Programmierung Einfhrung: auf den Markt bringen, Installation beim Kunden Nutzung: Betrieb des Programmes SW-Life Cycle Spiralmodell Algorithmus Erarbeitung durch Schler: Spiralmodell und SW Life Cycle

Spiralmodell Vorgehensmodell Weiterentwicklung des Wasserfallmodells Phasen werden immer wieder spiralfrmig (von auen nach innen) durchlaufen Risikobetrachtung hoher Stellenwert Es knnen beliebig viele Zwischenschritte eingefgt werden -> flexibel 2

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Das Spiralmodell

(aus wikipedia: Stichwort Spiralmodell, 20.09.2010)) Vorgehensmodell, wie andere auch. Detailliert eine zyklische Vorgehensweise in vier Schritten (Ziele, Alternativen / Risiko, Entwicklung und Test, Planung nchster Zyklus) Diese immer gleichen Zyklen wiederholen sich in immer weiteren Verfeinerungen, und durchlaufen somit auch Anforderung, Grob-, Feinentwurf sowie die eigentliche Programmierung und Indienststellung.

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Der SW-Lifecycle

(http://sharepoint.rhsolutions.net/images/software_lifecycle.jpg, Abruf 21.09.2010) Phasenmodell zur SW-Erstellung Endet nie, solange es das zugrundeliegende Problem gibt Geht in Releases vor, die sich immer erneut aneinander reihen Ansonsten sind die Phasen hnlich Wasserfallmodell, allerdings detaillierter In obiger Darstellung ist (vermutlich) im ueren Ring die Phase benannt, im inneren das Ergebnis

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Zentraler Begriff in der Programmierung ist der Algorithmus: Finitheit: endlich beschreibbar Ausfhrbarkeit Dynamische Finitheit Terminierung: endlich viele Schritte Determiniertheit: bei gleichem Ablauf und bei gleichem Input dasselbe Ergebnis Determinismus: nchster Schritt ist immer jeweils eindeutig definiert. Aufgabe: PSPAD oder anderen Editor starten und das folgende Programm eingeben, abspeichern unter z. B. d:\test.cs (d. h. einfacher Pfad)
using System; // Zwei Schrgstriche leiten einen Zeilenkommentar ein, der vom // Compiler ignoriert wird /* mit Schrgstrich-Sternchen (/*) kann ein beliebig langer Kommentar Begonnen werde, der sich ber x Zeilen hinziehen kann. Beendet wird dieser Kommentar mit */ /* Mit using System usw. werden vordefinierte Klassenbibliotheken eingebunden */ using System.Collections.Generic; using System.Linq; // <- das ist ein q wie Kuh using System.Text; namespace ConsoleApplication1 { // Mengenklammern rahmen einen Block ein, klammern z. B. eine Methode class Program { // Einrckung dient der bersichtlichkeit und ist ein mu static void Main(string[] args) // hier fngt das Programm an { // Eine Variable ist ein Platzhalter, ein Bezeichner fr eine // Speicherstelle. int i; // Variable i wird definiert, int = Integer = Ganzzahl String str; // eine Art Text, z. B. ITF10a, itf10a Console.Write("Hello World"); // Gibt in der Konsole den String HW aus //i = Console.Read(); // wegkommentiert str = Console.ReadLine(); // liest die Eingabe von der Tastatur ein, abge// schlossen mit <Return> und schreibt die Ein// gabe in die Variable str.

Console.WriteLine(str);

// Ausgabe str auf die Konsole

} } }

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Anschlieend Konsole ffnen. Suchen nach der Datei: csc.exe : c:\windows\microsoft.NET\Framework\v4.0.30319\csc.exe In den Ordner wechseln, in dem die Datei test.cs sich befindet. Z. B. d:\ cd \ordner\ Aufruf: c:\windows\microsoft.NET\Framework\v4.0.30319\csc.exe marvin.cs
// Zeilenkommentare werden durch zwei "//" eingeleitet. /* Ein Kommentar kann auch ber mehrere Zeilen gehen, dann wird er durch Schrgstrich Sternchen eingeleitet und ende mit Sternchen Schrgstrich. */ // Ein Kommentar hilft dem Programmierer, sich auch nach // Wochen und Monaten, sich im Programm zurechtzufinden. // Der Compiler, das ist das Programm, das den C#-Code in // den ausfhrbaren Code umwandelt, ignoriert alle Kommentare. // Ein guter Programmierer verwendet viele, aussagekrftige // Kommentare. In der Schule sind Kommentare ein "Mu" und // das Unterlassen fhrt zu Punktabzgen. // Hier werden mit using System-Bibliotheken und -Klassen dem // Programm zur Verfgung gestellt using using using using System; System.Collections.Generic; System.Linq; System.Text;

namespace ConsoleApplication1 { class Program { static void Main(string[] args) // Hier fngt der // Programmablauf an { // Variablen int i; String str; Console.Write("Hello \r\n World"); //i = Console.Read(); str = Console.ReadLine(); Console.WriteLine(str); } } }

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Erkenntnisse: Welche Schritte sind ntig, um ein erstes Programm zu erstellen? Programmcode in einem Editor schreiben Unter der Dateiendung cs abspeichern In der Konsole Compiler csc.exe aufrufen. Der Compiler wandelt das C#-Programm in den sogenannten ausfhrbaren Code um. Der ausfhrbare Code wird in einer Ausfhrungsumgebung, einer Art virtuellen Maschine, zur Ausfhrung gebracht (hnlich Java: Java Runtime Environment Microsoft.NET) Unter Windows kann man sein Programm mit dem Aufruf test.exe zur Ausfhrung bringen.

Aufgabe: Start Visual Studio Aufruf der Mens \Datei\Neu\Projekt Konsolenanwendung auswhlen

Die Entwicklungsumgebung VS fgt einen Rumpfcode ein 7

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Testen des Programms (Ausfhren) mit STRG+F5

Aufgabe: Sie sind bei der Wellness AG als Chefprogrammierer beschftigt und sollen eine erste Anwendung in C# schreiben: das Programm soll den BMI ausrechnen. Sie haben noch nie von BMI gehrt Recherchen: Krpergre Gewicht Alter? Formel BMI = gewicht / groesse2 Was soll denn das Programm im einzelnen machen? Struktogramm: Berechnung des BMI Aufforderung / Textausgabe Krpergre in cm Eingabe der Krpergre Aufforderung / Textausgabe Gewicht in kg Eingabe des Gewichts Berechnung: BMI = gewicht / groesse2 Ausgabe des Ergebnisses Zum Struktogramm: die hier abgebildeten Elemente in Rechtecken nennt man Anweisung. Aufgabe: Auch wenn das Programm nicht vollstndig geschrieben werden kann, knnen doch die Ausgaben schon einmal programmiert werden.

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Eine Variable in einer Programmiersprache hnelt der Variablen in der Mathematik: sie kann bestimmt e Werte annehmen und speichern. Im Gegensatz zur Mathematik sind die Bereiche von Computer-Variablen beschrnkt: z. B. knnen int-Zahlen (im Gegensatz zu den ganzen Zahlen der Mathematik von unendlich bis + unendlich) nur den Bereich von 2.147.483.648 bis 2.147.483.647 annehmen. Nheres Skript von Herrn Adams (www.ralfadams.de -> C#) Ein besonderer Variablentyp ist der des Strings. Strings knnen alphanumerische Zeichenketten speichern, also z. B. Andreas Alef oder BO-KL236 oder 3,14 oder 17. Sie bestehen also aus Buchstaben und Ziffern. Wenn in einer Speicherzelle die Dualzahl 0100 0001 steht, so kann damit einerseits der Buchstabe A gemeint sein, oder auch die Zahl 65. Was gemeint ist, ist Interpretation und die Interpretation wird im Programm festgelegt. Wie sieht so etwas im Speicherbereich eines Digitalrechners aus, der ja wie bekannt nur Nullen und Einsen speichern kann? Adresse 1128 1127 1126 1125 1124 1123 0x36=0011 0110 0x33=0011 0011 0x32=0011 0010 0x4C=0100 1100 0x4B=0100 1011 6 3 2 L K 54 51 50 78 77 Inhalt Interpretation als ASCII Interpretation als Zahl

Es gilt die Regel: Eingaben werden in einen String (eine String-Variable) eingelesen und dann ggf. zur Weiterberechnung in eine Zahl (z. B. Integer) umgewandelt. String-Variablen werden wir mit einem str beginnen lassen, Integer mit einem vorangestellten i. Diese Form der Vorsilbe bei Variablen nennt man ungarische Notation. Sie erleichtert das Programmieren. Auerdem sollte man sprechende Variablennamen verwenden (Negativbeispiel: moped1, moped2). Welche Variablentypen es gibt, kann man bei Ralf Adams nachlesen.

static void Main(string[] args) { // Variablen double dGewicht=0.0; int iLaenge = 0;

// sprechende Variablennamen // double Zahl mit Nachkommastellen // int = integer ganzeZahl

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

String strGewicht; // dient zur Eingabe von der Tastatur. Keine Rechnung String strLaenge; // mglich. //--------------------------------------Console.WriteLine("BMI - Rechner: "); // Was ist hier falsch? Jetzt nichts mehr Console.Write("Bitte geben Sie Ihre Gre in cm ein: "); strLaenge = Console.ReadLine(); // // // // Statt der Stringvariablen kann auch die ReadLine()-Eingabe direkt von String in das Zielformat umgewandelt werden, indem man das Readline() innerhalb des Convert aufruft. laenge = Convert.ToInt32(Console.Readline());

Console.Write("Bitte geben Sie Ihr Gewicht in kg ein: "); strGewicht = Console.ReadLine(); // in die Stringvariable strgewicht wird an // dieser Stelle die Tastatureingabe eingelesen // und gespeichert. // gewicht = Convert.ToDouble(Console.Readline()); // siehe oben iLaenge = Convert.ToInt32(strLaenge); // // // // // // Gerechnet werden kann mit String-Variablen nicht, deswegen mssen diese zunchst in Zahlen-Variablen umgerechnet werden. Dies erledigen die Convert-Funktionen: Convert.ToInt32 -> Integerzahl Convert.ToDouble-> Doublezahl

dGewicht = Convert.ToDouble(strGewicht); //--------------------------------------------------------Console.Write("\nBei einem Gewicht von " + dGewicht + " und einer Gre von " + iLaenge + " ergibt sich ein BMI von " + dGewicht / iLaenge / iLaenge *10000 ); Console.ReadKey();

} } }

BMI Rechner als Dialogbox bzw. Windows Form Anwendung, siehe Unterlagen

Themen Klassenarbeit: 1. Einfaches Programm schreiben 2. Programm kommentieren 3. Unterschiede IDE Programmierung vs. Konsole Compiler aufrufen 4. Fragen zu SW Lifecycle / Algorithmus usw.

10

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Visual Studio speichert die zu entwickelnden Programme in sogenannten Projekten. Ein Projekt besteht aus einer Mehrzahl von Dateien und Unterverzeichnissen in einem Verzeichnis mit dem Projektnamen (z. B. BMI). Diese alle mssen bei einer Sicherung mitgenommen werden. Beispiel:

Wenn man keine Mglichkeit hat, die Dateien bzw. das Projekt mit Hilfe eines Sticks oder einer externen USB-Festplatte zu sichern, kann man alternativ folgendes Verfahren anwenden: 1. Rechtsklick auf zu sichernden Ordner

2. Zu <projektname>.rar hinzufgen auswhlen 3. Es entsteht eine einzige Datei, die alle Dateien und alle Verzeichnisse in gepackter Form enthlt:

11

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

4. Diese kann man sich per Email schicken und zu Hause oder beim nchsten Mal mit dem Programm winrar wieder auspacken (Doppelklick oder Rechtsklick). 5. Voraussetzung ist, da das Programm winrar installiert ist. Alternativen sind winzip (leider kostenpflichtig) oder 7zip, knnen alle heruntergeladen werden. Bedingungen Um in einem Programm Entscheidungen treffen zu knnen, mssen Bedingungen ausgewertet werden. Diese Bedingungen beinhalten im Endeffekt boolesche Aussagen, treffen also zu (true) oder nicht zu (false). Die Syntax einer solchen Bedingungsauswertung in C# ist if (<Bedingungsauswertung>) { // Aktion bei Zutreffen, also im true-Fall } [else { // Aktion bei Nicht-Zutreffen, also im false-Fall }] Folgende Kommentare: Der else-Teil ist optional, mu also nicht erscheinen. Die Mengenklammern zur Kennzeichnung eines Blockes knnen weggelassen werden, wenn fr den Compiler schon so ersichtlich ist, da es sich um einen Block handelt, z. B. bei nur einem Befehl. In vielen Programmierrichtlinien ist es verboten, die Mengenklammern, auch wenn nicht unbedingt erforderlich (s.o.), wegzulassen, weil der Code unbersichtlich werden kann und damit fehleranfllig ist. Das entsprechende Struktogrammelement zur Bedingung ist: 12

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Aufgabe: Sie sollen ein Programm schreiben, das Alter und Gre bei einer Achterbahnzugangskontrolle auswertet: Auerdem gilt eine Altersbeschrnkung: man darf nicht zu alt sein (70 Jahre) und auch nicht zu jung. Altersuntergrenze ist 16. Mitfahren darf nur derjenige, der grer als 100cm ist und kleiner als 200cm.

13

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

double dAlter = Convert.ToDouble(tBoxAlter.Text); double dGroesse = Convert.ToDouble(tBoxGroesse.Text); if ( (dAlter >= 16.0) && (dAlter <= 70.0) && (dGroesse >= 100.0) && (dGroesse <= 180.0)) { lbErgebnis.Text = "Sie drfen"; } else { lbErgebnis.Text = "Sie drfen nicht"; } // Alternativ if ((dAlter < 16.0) || (dAlter > 70.0) || (dGroesse < 100.0) || (dGroesse > 180.0)) { lbErgebnisAlt.Text = "Sie drfen nicht"; } else { lbErgebnisAlt.Text = "Sie drfen "; }

Die for-Schleife oder auch Zhlscheife

Mittels einer Zhlschleife knnen Vorgnge wiederholt durchgefhrt werden. Man nennt diese Schleife Zhlschleife, weil von vornherein bekannt ist, wie oft die Schleife durchluft, bzw. wie oft der zu wiederholende Anweisungsblock durchlaufen wird. Bei einer Zhlschleife arbeitet man grundstzlich mit einer Zhl- bzw. Laufvariablen, die die Schleifendurchlufe zhlt.

14

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Beispiel 1:
for (int i = 0; i < 100; i++) { /* * i: Laufvariable, * int i ist nur innerhalb dieser Schleife bekannt * Werte von 0, 1, 2, 3, ... 99 * i++: jedesmal um 1 erhhen ("inkrementieren" = erhhen) * i<100: die Schleife luft, solange i < 100 ist */ tBoxErg.Text = Convert.ToString(i); }

Beispiel 2:
int k = 17; // hier ist k 17 // hier ist k immer noch 17 for (k = 0; k < 100; k++) { /* * k: Laufvariable, * k ist innerhalb und auerhalb dieser Schleife bekannt * Werte von 0, 1, 2, 3, ... 99 * k++: jedesmal um 1 erhhen ("inkrementieren" = erhhen) * k<100: die Schleife luft, solange k < 100 ist */ tBoxErg.Text = Convert.ToString(k); }

Beispiel 3:
for (int l = 0; l < 100; l=l+2) { /* * l: Laufvariable, * l ist innerhalb dieser Schleife bekannt * Werte 0,2,4,6,8, ... 96, 98 * l=l+2: jedesmal um 2 erhhen * l<100: die Schleife luft, solange l < 100 ist */ tBoxErg.Text = Convert.ToString(l); }

Beispiel 4:
for (int m = 0, n=0; m <= 100; m++, n++) { /* * m,n: Laufvariablen * m,n sind innerhalb dieser Schleife bekannt * Werte m und n 0,1,2,3,4,5,6 ... 100 * m++, n++: jedesmal um 1 erhhen

15

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

* m<=100: die Schleife luft, solange m <= 100 ist * Besonderheit: luft mit 2 Laufvariablen */ tBoxErg.Text = Convert.ToString(m) +" --- " + Convert.ToString(n); }

Beispiel 5:
for (int p = 0; p <= 100; p++) { /* * p: Laufvariablen * p ist innerhalb dieser Schleife bekannt * Ausgabe in Textbox: 0+3, 4+3 usw. also Viererreihe plus 3. * Zuletzt ist p 99 (96+3), wird im Kopf um 1 erhht: 100, Schleifenbedingung * ist noch erfllt, dann +3, also 103 und das wird auch ausgegeben. Danach * bricht die Scheife endlich ab. * p++: jedesmal um 1 erhhen * p = p+3: noch einmal um 3 erhhen, insgesamt also +4 * p<=100: die Schleife luft, solange p <= 100 ist * Besonderheit: */ p = p + 3; // Beispiel fr unschne weil unbersichtliche Programmierung tBoxErg.Text = Convert.ToString(p); }

Falls man z. B. die Aufgabe hat, aus den Zahlen von 0 bis 6 (oder 1 bis 7) die Wochentage zu generieren, kann man mehrfache if-else Entscheidungsabfragen schachteln, was sehr schnell unbersichtlich und damit fehleranfllig wird. Beispiel:
if (iTagNr == 0) { lbAusgabe.Text = "Sonntag"; } else { if (iTagNr == 1) { lbAusgabe.Text = "Montag"; } else { if (iTagNr == 2) { lbAusgabe.Text = "Dienstag"; } else { if (iTagNr == 3) { lbAusgabe.Text = "Mittwoch"; } else { if (iTagNr == 4) {

16

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

lbAusgabe.Text = "Donnerstag"; } else { if (iTagNr == 5) { lbAusgabe.Text = "Freitag"; } else { if (iTagNr == 6) { lbAusgabe.Text = "Samstag"; } else { lbAusgabe.Text = "Fehler"; } } } } } } }

Um dies zu vereinfachen, gibt es die Mglichkeit der Bedingungsabfrage bzw. Fallauswahl oder auch kurz switch-case. Das Struktogrammsymbol ist:

(aus Wikipedia (16.02.2011)) In C# lautet die Syntax hierfr


switch (iTagNr) { case 0: lbAusgabe.Text = "Sonntag"; // hier knnen noch mehr Anweisungen kommen break; case 1: lbAusgabe.Text = "Montag"; break; // usw.

default: lbAusgabe.Text = "Fehler"; break; }

17

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Das gleiche Problem (von einer Zahl auf Wochentage schlieen) kann man auch ber String-Arrays schlieen. Ein String-Array sind mehrere Strings, die unter einem Namen wie eine Variable angesprochen werden. Will man auf einen einzelnen String zugreifen, erfolgt dies ber die Angabe eines Indizes (der Index, die Indizes). Beispiel: Ein String-Array legt man wie folgt an:
string[] strWochentage = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag" };

Dieses String-Array hat bei Anlage direkt 7 Elemente, 7 Strings: von Sonntag bis Samstag. Auf den einzelnen String greife ich ber seinen Index zu, etwa wie folgt:
tBoxAusgabe.Text = strWochentage[4];

In diesem Fall wird Donnerstag ausgegeben, denn in einem Array fngt man bei 0 an zu zhlen und endet bei n-1, in diesem Fall bei 7-1 = 6!

Bei Digitalrechnern verwendet man oft neben der normalen Division auch die RestWertberechnung. Hintergrund: Solange man mit Integer-Variablen im Ganzzahlbereich bleibt, werden Ergebnisse nach dem Komma abgeschnitten. Dies gilt vor allem fr die Division. In C# wird die Division bekannterweise mit dem / bezeichnet. Beispiel:
int iZahl1 = 17; int iZahl2 = 7; int iErgebnis = iZahl1 / iZahl2; tBoxAusgabe.Text = Convert.ToString(iErgebnis); // Eine 2 wird ausgegeben

Wenn man den Rest einer Division haben mchte, so verwendet man hierzu den sogenannten Modulo-Operator. Der Modulo-Operator hat in C# das Zeichen %. Beispiel:
int iZahl1 = 17; int iZahl2 = 7; int iErgebnis = iZahl1 % iZahl2; tBoxAusgabe.Text = Convert.ToString(iErgebnis); // Eine 3 wird ausgegeben

Die Modulo-Division ist an vielen Stellen im Bereich der Programmierung hilfreich.

18

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Wochentagsberechnung: Es soll ein Programm geschrieben werden, das ein Datum in einen Wochentag umrechnet. Leitbild ist der Wikipedia-Artikel de.wikipedia.org, Stichwort wochentagsberechnung. Programmierung Wikipedia

Offensichtlich bentigt man eine Eingabemglichkeit fr Tag, Monat und Jahr, eine Ausgabemglichkeit fr den Wochentag und einen Start-Button. Eigenschaften der Ressourcen verndern (tBoxTag, tBoxMon, tBoxJahr, lbAusgabe, btStart) Durch Doppelklick auf den Start-Button eine On-Click-Funktion erzeugen. Ab jetzt sind alle folgenden Programmierungen in dieser Funktion durchzufhren. Wie immer werden jetzt die Variablen angelegt: Dazu wird jeder Eingaberessource in der Windows-Form eine Variable zugeordnet. In diesem Fall 3 Eingabetextboxen entsprechend 3 Variablen im Programm.
int iTag = Convert.ToInt32(tBoxTag.Text); int iMon = Convert.ToInt32(tBoxMon.Text); int iJahr =Convert.ToInt32(tBoxJahr.Text);

Wir bentigen 5 Variablen:


int int int int int iTagZ = 0; iMonZ = 0; iJahrZ = 0; iJahrHundertZ = 0; iSchaltKorrektur = 0;

Zur Berechnung bentigt man die fnf folgenden Ziffern: usw.

iTagZ = iTag % 7;

Tagesziffer Die Tagesziffer: sie ist der Tag im Monat mod 7.


19

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

In diesem Fall mu offensichtlich aus dem Monat (Variable iMon) eine Auswahl getroffen werden.
Monat Januar Februar Mrz April iMon zu setzende Ziffer iMonZ 1 0 2 3 3 3 4 6

Die Monatsziffer, die man sich merken muss:


Jan = 0 Feb = 3 Mr = 3 Apr = 6 Mai = 1 Jun = 4 Jul = 6 Aug = 2 Sep = 5 Okt = 0 Nov = 3 Dez = 5

Dezember 12 5

switch (iMon) { case 1: iMonZ = break; case 2: iMonZ = break; case 3: iMonZ = break; case 4: iMonZ = break; // usw. case 12: iMonZ = break; }

0;

3;

3;

6;

5;

Jahreszahl ohne die Jahrhunderte: 1948 -> 48 2011 -> 11 1989 -> 89 Grundschuldivision: 1948 : 100 = 19 Rest 48 2011 / 100 = 20 Rest 11 Die Jahreszahl ohne die Jahrhunderte ergibt sich offensichtlich, wenn man die Restwert-Division durch 100 verwendet.
iJahrZ = iJahr % 100; // Restwert-

Man nimmt die Jahreszahl ohne die Jahrhunderte, also nur die beiden letzten Ziffern. Zu dieser Zahl addiert man das Ganzzahlergebnis der Division durch 4 derselben Zahl. Diese Summe dividiert man modulo 7. (Jahreszahl + Jahreszahl div 4) mod 7.
Mit Jahreszahl ist in der Formel Jahreszahl ohne Jahrhunderte gemeint.

20

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Divison iJahrZ / 4) % 7;

iJahrZ = (iJahrZ +

Alternativ htte man etwas komplizierter auch folgendes schreiben knnen:


iJahrZ =((iJahr%100)+(iJahr%100)/4)% 7; Das Jahrhundert erhlt man, indem man die Jahreszahl durch 100 dividiert (als Integer=Grundschul-Division) // aus 1948 wird 19, aus 2011 20 int iJahrhundert = iJahr / 100; iJahrHundertZ = (3-(iJahrhundert)%4) * 2;

Die Formel fr die Jahrhundertziffer ist (3 (Jahrhundert mod 4)) x 2.

Ein Schaltjahr ist aus den Grnden der Erdumdrehung um die Sonne alle 4 Jahre, d. h. in den Jahren, die ganzzahlig durch 4 teilbar sind. Hier wird nach dem 28. Februar ein Tag eingefgt, so da es alle 4 Jahre einen 29. Februar gibt. Diese Addition schiet ber das Ziel hinaus, dh. das Schaltjahr alle 4 Jahre addiert zuviel in die Zeitrechnung. Deswegen ist alle 100 Jahre kein Schaltjahr, aber dann doch wieder alle 400 Jahre. 1700, 1800, 1900 waren also nicht Schaltjahre, jedoch 2000 und 1600. Ein Schaltjahr ist also, wenn das Jahr durch 4 UND NICHT durch 100 ODER durch 400 teilbar ist

Wir haben bisher den Schalttag dem ganzen Jahr zugerechnet, die Rechnung stimmt also erst ab dem 1. Mrz. Wenn das Datum im Januar oder Februar eines Schaltjahrs liegt, muss eine 1 abgezogen werden (oder 6 addiert).

21

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

if ((iJahr % 4 == 0) && (iJahr % 100 != 0) || (iJahr % 400 == 0)) return true; else return false;

Erklrung der C#-Ausdrcke:


== : != : && : || :

Abfrage auf Gleichheit Abfrage auf Ungleichheit logisches UND logisches ODER

Um in einem Programm an mehreren Stellen dieselbe Schaltjahresberechnung durchfhren zu knnen, ohne sie immer wieder erneut programmieren zu mssen, kann man eine Funktion bzw. Methode einfhren. Hierzu bentigt man eine boolsche Variable bSJ, die die Information speichert, ob Schaltjahr oder nicht und eine Funktion / Methode, die die Schaltjahresbestimmung durchfhrt.
bool bSJ = false; // // // // // boolesche Variable, die beinhaltet, ob es sich um ein Schaltjahr handelt (true) oder nicht (false). Wird mit false (also kein Schaltjahr) initialisiert.

// Berechnung, ob Schaltjahr oder nicht, in einer Funktion // Die Funktion erhlt das Jahr bergeben und liefert true // oder false zurck. Dieser Rckgabewert wird in die // boolesche Variable bSJ geschrieben. bSJ = istSchaltjahr(iJahr);

Eine Methode istSchaltjahr() kennt der Compiler nicht, weil wir sie noch nicht programmiert haben. Genauer: wir mssen die Funktion / Methode programmieren, indem wir exakt bestimmen, welche Schritte sie durchfhren soll. Visual Studio hat einen Mechanismus, der hilft solche Methoden / Funktionen zu definieren. Wenn man die Aufrufstelle (das ist die Stelle, an der die Funktion benutzt wird) wie oben gezeigt kodiert, unterstreicht VS die Zeichenfolge, weil die Funktion nicht gefunden wird. Durch 22

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Rechtsklick auf die Fehlerstelle erhlt man die Mglichkeit, einen sogenannten Methodenstub anzulegen, eine Art Rumpffunktion. Die Generierung des Methodenstubs fhrt zu folgenden Code:
private bool istSchaltjahr(int iJahr) { throw new NotImplementedException(); }

Es gibt also eine Methode, die aber noch nichts macht, bzw. eine Fehlermeldung verursacht. An Stelle der Fehlermeldung kann man nun den eigentlichen Code implementieren, in unserem Fall die Berechnung, ob Schaltjahr oder nicht:
private bool istSchaltjahr(int iJahr) { if ((iJahr % 4 == 0) && (iJahr % 100 != 0) || (iJahr % 400 == 0)) return true; else return false; // mu weg: throw new NotImplementedException(); }

Die Variable iJahr in der Funktion istSchaltjahr() ist eine andere Variable als die gleichnamige Variable iJahr im aufrufenden Programm. Man htte hier auch statt iJahr z. B. iYear schreiben knnen. Erst durch den Aufruf der Methode erhlt die Variable iJahr den gewnschten Wert.
bSJ = istSchaltjahr(iJahr); if (bSJ == true) { // Januar oder Februar? if ((iMon == 1) || (iMon == 2)) iSchaltKorrektur = -1; else iSchaltKorrektur = 0; } int iWT = (iTagZ + iMonZ + iJahrZ + iJahrHundertZ + iSchaltKorrektur) % 7;

Wir haben bisher den Schalttag dem ganzen Jahr zugerechnet, die Rechnung stimmt also erst ab dem 1. Mrz. Wenn das Datum im Januar oder Februar eines Schaltjahrs liegt, muss eine 1 abgezogen werden (oder 6 addiert).

Wenn man diese 5 Zahlen addiert, und den Rest bei Division durch 7 ermittelt, erhlt man den Wochentag:

Nun mu noch der Wochentag als Klartext ausgegeben werden.


switch (iWT) { case 0: lbErg.Text = "Sonntag"; break; case 1: lbErg.Text = "Montag"; break; case 2: lbErg.Text = "Dienstag"; break; case 3:

23

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

lbErg.Text = "Donnerstag"; break; case 4: lbErg.Text = "Freitag"; break; case 5: lbErg.Text = "Samstag"; break; case 6: lbErg.Text = "Sonntag"; break; default: MessageBox.Show("Fehler!!!"); break; }

Dies kann man ber unser oben angelegtes Wochentagsarray machen: tBoxErgebnis.Text = strWochentage[iWT];

24

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Aufgabe: In welcher Sprache ist der folgende Text geschrieben? Um welchen Text handelt es sich? Vrjp tfdv, vrjp xf, Easy come, easy go, Kyrk'j aljk yfn pfl calemv, fy, That's just how you live, oh, Krbv, krbv, krbv zk rcc, Take, take, take it all, Slk pfl evmvi xzmv. But you never give. Jyflcu'mv befne pfl nrj kiflscv Should've known you was trouble Wifd kyv wzijk bzjj, From the first kiss, Yru pfli vpvj nzuv fgve. Had your eyes wide open. Nyp nviv kyvp fgve? Why were they open? [Sizuxv] Xrmv pfl rcc Z yru reu pfl kfjjvu zk ze kyv kirjy, Pfl kfjjvu zk ze kyv kirjy, pfl uzu. Kf xzmv dv rcc pfli cfmv zj rcc Z vmvi rjbvu, 'trljv Nyrk pfl ufe'k leuvijkreu zj [Tyfilj] Z'u trkty r xiveruv wfi pr (pvry, pvry) Kyifn dp yreu fe r scruv wfi pr (pvry, pvry) Z'u aldg ze wifek fw r kirze wfi pr (pvry, pvry) Pfl befn Z'u uf repkyzex wfi pr (pvry, pvry) Fy, fy, Z nflcu xf kyiflxy rcc fw kyzj grze, Krbv r slccvk jkirzxyk kyiflxy dp sirze! Pvj, Z nflcu uzv wfi pr, srsp, Slk pfl nfe'k uf kyv jrdv. Ef, ef ef [Mvijv 2] Scrtb, scrtb, scrtb reu sclv, svrk dv 'kzc Z'd elds, Kvcc kyv uvmzc Z jrzu "yvp" nyve pfl xvk srtb kf nyviv pfl'iv wifd. Dru nfdre, sru nfdre, kyrk'j aljk nyrk pfl riv, Pvry, pfl'cc jdzcv ze dp wrtv kyve izg kyv sirbvj flk dp tri [Sizuxv] Xrmv pfl rcc Z yru reu pfl kfjjvu zk ze kyv kirjy, Pfl kfjjvu zk ze kyv kirjy, pvj pfl uzu. Kf xzmv dv rcc pfli cfmv zj rcc Z vmvi rjbvu, 'trljv Nyrk pfl ufe'k leuvijkreu zj [Tyfilj] Z'u trkty r xiveruv wfi pr (pvry, pvry) Kyifn dp yreu fe r scruv wfi pr (pvry, pvry) [Bridge] Gave you all I had and you tossed it in the trash, You tossed it in the trash, you did. To give me all your love is all I ever asked, 'cause What you don't understand is [Chorus] I'd catch a grenade for ya (yeah, yeah) Throw my hand on a blade for ya (yeah, yeah) I'd jump in front of a train for ya (yeah, yeah) You know I'd do anything for ya (yeah, yeah) Oh, oh, I would go through all of this pain, Take a bullet straight through my brain! Yes, I would die for ya, baby, But you won't do the same. No, no no [Verse 2] Black, black, black and blue, beat me 'til I'm numb, Tell the devil I said "hey" when you get back to where you're from. Mad woman, bad woman, that's just what you are, Yeah, you'll smile in my face then rip the brakes out my car [Bridge] Gave you all I had and you tossed it in the trash, You tossed it in the trash, yes you did. To give me all your love is all I ever asked, 'cause What you don't understand is [Chorus] I'd catch a grenade for ya (yeah, yeah) Throw my hand on a blade for ya (yeah, yeah) I'd jump in front of a train for ya (yeah, yeah) 25

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Z'u aldg ze wifek fw r kirze wfi pr (pvry, pvry) Pfl befn Z'u uf repkyzex wfi pr (pvry, pvry) Fy, fy, Z nflcu xf kyiflxy rcc fw kyzj grze, Krbv r slccvk jkirzxyk kyiflxy dp sirze! Pvj, Z nflcu uzv wfi pr, srsp, Slk pfl nfe'k uf kyv jrdv. [Mvijv 3] Zw dp sfup nrj fe wziv, Ffy, pfl'u nrkty dv slie ufne ze wcrdvj. Pfl jrzu pfl cfmvu dv, pfl'iv r czri, 'trljv pfl evmvi, vmvi, VMVI uzu, srsp! Slk, uriczex [Tyfilj] Z'u jkzcc trkty r xiveruv wfi pr (pvry, pvry) Kyifn dp yreu fe r scruv wfi pr (pvry, pvry) Z'u aldg ze wifek fw r kirze wfi pr (pvry, pvry) Pfl befn Z'u uf repkyzex wfi pr (pvry, pvry) Fy, fy, Z nflcu xf kyiflxy rcc fw kyzj grze, Krbv r slccvk jkirzxyk kyiflxy dp sirze! Pvj, Z nflcu uzv wfi pr, srsp, Slk pfl nfe'k uf kyv jrdv. [Flkif] Ef, pfl nfe'k uf kyv jrdv Pfl nflcue'k uf kyv jrdv Ffy, pfl'u evmvi uf kyv jrdv Fyy, ef ef ef

You know I'd do anything for ya (yeah, yeah) Oh, oh, I would go through all of this pain, Take a bullet straight through my brain! Yes, I would die for ya, baby, But you won't do the same. [Verse 3] If my body was on fire, Ooh, you'd watch me burn down in flames. You said you loved me, you're a liar, 'cause you never, ever, EVER did, baby! But, darling [Chorus] I'd still catch a grenade for ya (yeah, yeah) Throw my hand on a blade for ya (yeah, yeah) I'd jump in front of a train for ya (yeah, yeah) You know I'd do anything for ya (yeah, yeah) Oh, oh, I would go through all of this pain, Take a bullet straight through my brain! Yes, I would die for ya, baby, But you won't do the same. [Outro] No, you won't do the same You wouldn't do the same Ooh, you'd never do the same Ohh, no no no

Wsqi Tistpi qec vyr. Almpi sxlivw lezi jyr. Xvcmr xs kvef alex xlic ger. Ws M pmi mr xli kveww. M leh xss qygl erh xss jewx. Erh xli fiwx sj epp xmqiw. Aemxmrk syx xli hecw xs ks fc erh aexivw vyr hvc. Fyx Mzi qehi yt qc qmrh. Mxw geppmrk qi gepp qi ercxmqi. Mxgsqmrk yt iegl erh izivc pmri. 26

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Oiit geppmrk qi gepp ercxmqi. Sl sl sl livi mw xli wsrk. Jsv xlswi als riziv iziv wmx fego erh vigsziv. Livi mw xli sri jsv xlswi als riziv wlmziv. Xli gssp gexw M ehsvi. Wsqi tistpi aiev kpsziw. Gevvcmrk xlimv tsvxmsr sj pszi. Yrxmp hiexl gsqiw jvsq efszi. Rsa jsv hvieqw erh jsv tperw. Csy xvc ew levh ew csy perh. Fyx Mzi qehi yt qc qmrh. Mxw geppmrk qi gepp qi ercxmqi. Mxgsqmrk yt iegl erh izivc pmri. Oiit geppmrk qi gepp ercxmqi. Livi mw xli wsrk. Jsv xlswi als riziv iziv wmx fego erh vigsziv. Livi mw xli sri jsv xlswi als riziv wlmziv. Xli gssp gexw M ehsvi. Xli gssp gexw M ehsvi. Xli gssp gexw M ehsvi.

27

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Das Wesen der Csar-Verschlsselung Bei der Csar-Verschlsselung wird jeder Buchstabe um eine bestimmte Anzahl nach links oder rechts im Alphabet umgesetzt bzw. verschoben, so wird z. B. aus einem A bei einer Verschiebung um 3 ein D, aus einem X ein A. Die Zahl 3 ist in diesem Fall der Schlssel. Um diesen Algorithmus mit einem C#-Programm abbilden zu knnen, mu man zunchst betrachten, wie Buchstaben in C# und allgemein auf Computern verarbeitet werden. Auf modernen Rechnern werden Buchstaben oder besser allgemein Zeichen als Zahlencode abgespeichert. Jedem Zeichen entspricht damit eine binre Kombination. Minimalanforderung an die Darstellung von Zeichen ist: Grobuchstaben (26) Kleinbuchstaben (26) Ziffern (10) Summe: 62 Zeichen

Hinzu kommen Satzzeichen Umlaute Weitere Sonderzeichen Summe: Mit 128 Zeichen kommt man gerade noch aus, 256 sind besser (Will man alle Sonderzeichen aller Sprachen bercksichtigen, so kommt man auch mit 256 Zeichen nicht aus, sondern mu weitere hinzunehmen, Erweiterung des ASCIICodes auf UTF-Codes)

Wenn man sich mit 256 unterscheidbaren Zeichen begngt, so kommt man mit 8 Bit aus: man kann so die Binrkombination von 0000 0000 bis 1111 1111 (als Zahl interpretiert: von 0 bis 255) darstellen, insgesamt 256 mglich Kombinationen. Der sogenannte ASCII-Code ist die lange Zeit gebruchliche Form, Zeichen auf Digitalrechnern zu verarbeiten. Beispiel: A = 0100 0001|2 = 41|16 = 65|10 Das bedeutet: In einer Speicherzelle ist die Binrkombination 0100 0001|2 enthalten. Diese kann als Zahl (65|10) oder als Zeichen (A) interpretiert werden. Wie eine Speicherzelle interpretiert wird, bestimmt das Programm bzw. der Programmierer (int -> Zahl, char bzw. string > Zeichen). int i = 65; char c = A; Unterschiedliche Bedeutung, aber gleicher Inhalt. Da also Zeichen und Zahlen eigentlich eine gleiche interne Darstellung im Digitalrechner haben, kann man sogar mit Zeichen rechnen.

28

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Zu verschlsselnder Text Orig. Dez B 66 E 69 A 65 T 84 S 83 T 84 E 69 A 65 K 75 S 83 Hex 42 45 41 54 53 54 45 41 4B 53 Bin 1000010 1000101 1000001 1010100 1010011 1010100 1000101 1000001 1001011 1010011

Verschlsselung Hochtransformieren + Offset - 65 +12 mod 26 +65 Chiffre 1 13 13 78 N 4 16 16 81 Q 0 12 12 77 M 19 31 5 70 F 18 30 4 69 E 19 31 5 70 F 4 16 16 81 Q 0 12 12 77 M 10 22 22 87 W 18 30 4 69 E Verschlsselung Hochtransformieren + Offset - 65 +14 mod 26 +65 Chiffre 13 27 1 66 B 16 30 4 69 E 12 26 0 65 A 5 19 19 84 T 4 18 18 83 S 5 19 19 84 T 16 30 4 69 E 12 26 0 65 A 22 36 10 75 K 4 18 18 83 S

Zu verschlsselnder Text Orig. Dez N 78 Q 81 M 77 F 70 E 69 F 70 Q 81 M 77 W 87 E 69 Hex 4E 51 4D 46 45 46 51 4D 57 45 Bin 1001110 1010001 1001101 1000110 1000101 1000110 1010001 1001101 1010111 1000101

Wie kann man nun in C# mit Buchstaben, besser Zeichen rechnen? Wo kommen die Zeichen her: aus der tBoxEingabe.Text. Fr das Rechnen mit Zeichen und den Einzelzugriff auf jedes Element eignet sich ein sogenanntes Char-Array. Ein Char-Array (Feld aus Zeichen) ist eine Art primitiver String. Was ist ein Array? Ein Array, zu Deutsch: Feld, bietet die Mglichkeit, unter einem Bezeichner (Namen) viele Variablen desselben Typs abzuspeichern. Es gibt z. B. Int-Arrays, Float-Arrays oder CharArrays usw. Beispiel jenseits Caesar-Chiffre: Double-Mewerte-Array fr Temperaturen:

29

Berufskolleg Stadt Bochum, Technische Berufliche Schule I Lehrer: Dr. Andreas Alef Fach: AWE Name:

Name: dMesswerte dMesswerte[0] dMesswerte[1] dMesswerte[2] dMesswerte[120] 20 Dieses Mewerte-Array hat 121 Mewerte. Unter einem Namen dMesswerte wird es angesprochen. Einen einzelnen Mewert liest oder schreibt man unter Benutzung einer Indexzahl oder Indexvariablen in eckigen Klammern []. Beispiel: dMesswerte[12] = 18,5; tBoxErg.Text = Convert.ToString(dMesswerte[16]); i=101; dMesswerte[i] = 18,5; tBoxErg.Text = Convert.ToString(dMesswerte[i]); In diesem Beispiel kann man 101 Mewerte unter einem Variablennamen dMesswerte mit einer Indexzahl (12, 16) oder Indexvariablen (i) ansprechen. Die Alternative wre die Definition von 101 einzelnen Variablen, sehr umstndlich, etwa so: double dMesswert_000; double dMesswert_001; double dMesswert_002; double dMesswert_003; double dMesswert_004; double dMesswert_100; 17,5 18,6 14,7

-------------------------------------------------------- Bis hier Klassenarbeitsrelevant

30

Anda mungkin juga menyukai