16.11.2013 Aufrufe

Kapitel 1

Kapitel 1

Kapitel 1

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Einführung in die Programmierung - 1 -<br />

Einführung in die Programmierung<br />

WS 2002/2003<br />

Werner Pohlmann<br />

Technisches:<br />

Termin:<br />

Proseminar:<br />

Vorlesung – Klausur:<br />

Skriptum:<br />

Di 10 15 – 12 45 , 15 min Pause<br />

Einschreibung auf Aushang<br />

Beginn: Mi alle Teilnehmer 14 15 T01<br />

am Semesterende<br />

Kopien der Folien im Sekretariat zum Ausleihen<br />

Programmierbeispiel online unter:<br />

http://student.cosy.sbg.ac.at/project/tutorien/prog-einf/<br />

§ 1 Einführung<br />

1.1 Zweck der Vorlesung<br />

Grundelemente der<br />

<br />

<br />

Imperativen Programmierung<br />

zB.: Datentypen, Programmvariable, Zuweisungen,<br />

Kontrollstrukturen,...<br />

Objektorientierten Programmierung<br />

zB.: Klassen, Objekte,...<br />

Mit Java als Arbeitssprache<br />

Beispiel 1:<br />

Aufgabe: Stelle fest, wie oft der Buchstabe „e“ oder „E“ in einem Text vorkommt.<br />

Lösungsansatz:<br />

setze Zähler auf 0;<br />

solange Text nicht erschöpft:<br />

lies nächstes Zeichen an, Text;<br />

falls (Zeichen = ’e’ oder Zeichen = ’E’)<br />

erhöhe Zähler um 1;<br />

gib aus Zähler;


Einführung in die Programmierung - 2 -<br />

So etwas ist ein Algorithmus (= vollständige und eindeutige Festlegung einer Folge<br />

elementarer Operationen),<br />

Typische Beispiele für Algorithmen im Alltag (?) sind „schriftliche“ Rechnungsarten,<br />

wie zB.: 47 . 12<br />

47<br />

94<br />

564<br />

Objektorientiertes Vorgehen dient der Gliederung von Software in Teile mit je<br />

spezifischen Aufgaben/Verantwortlichkeiten<br />

ähnliche wichtige technische Gebilde:<br />

Auto besteht aus,...<br />

Objekt <br />

Gebilde mit Eigenschaften (Zustand, Arten,...)<br />

Mit „Methoden“ (= Operationen, Handlungsmöglichkeiten)<br />

Klasse Schema für gleichartige Objekte<br />

(oder aus: Sammlung von Methoden)<br />

Beispiel:<br />

Tabellenkalkulation<br />

Tabelle besteht aus Zellen<br />

Hat Methoden wie „belegen“, „auswerten“<br />

Eigenschaften wie Inhalt (ausgewählt ja/nein)<br />

Inhalt ist<br />

Zeichenreihe<br />

Zahl<br />

Formel<br />

Hat Methoden wie „auswerten“<br />

Hat Eigenschaften wie „Bezug auf andere Zelle“<br />

1.2 Literatur (siehe Angaben in VL)<br />

1.3 Mein erstes Programm<br />

Die folgende Seite (8) zeigt Programmtext plus Protokoll einer Sitzung mit<br />

Kompilieren: javac Kreis.java<br />

Ausführen: java Kreis<br />

, mit Variation der Eingabe<br />

! Programm braucht zur Eingabe die Klassen SavitchIn (aus dem Buch von W.<br />

Savitch); wir nehmen hier an, dass diese Klasse im aktuellen<br />

Arbeitsverzeichnis kompiliert vorliegt.


Einführung in die Programmierung - 3 -<br />

Für die Ausgabe benutzt das Programm das Objekt System.out, das über die Klasse<br />

System der Standardumgebung ( wir müssen uns nicht darum kümmern) zur<br />

Verfügung steht.<br />

/***************************************************<br />

*Programm berechnet Umfang & Flaeche eines Kreises<br />

*dessen Radius der Benutzer (auf Aufforderung) gibt.<br />

*beachte:<br />

*Zahl und "return" erwartet!<br />

*SavitchIn.class im selben Verzeichnis!<br />

***************************************************/<br />

public class Kreis{<br />

public static void main(String[] args){<br />

double radius, umfang, flaeche;<br />

final double PI = 3.14159;<br />

System.out.println();<br />

System.out.println("Gib Radius!");<br />

radius = SavitchIn.readLineDouble();<br />

umfang = 2*PI*radius;<br />

flaeche = PI*radius*radius;<br />

}<br />

}<br />

System.out.println("Umfang = " + umfang);<br />

System.out.println("Flaeche = " + flaeche);<br />

System.out.println();<br />

/*-----------------------------------------------<br />

12 pohlmann@drache:javac Kreis.java<br />

13 pohlmann@drache:java Kreis<br />

Gib Radius!<br />

3<br />

Umfang = 18.849539999999998<br />

Flaeche = 28.274309999999996<br />

14 pohlmann@drache:java Kreis<br />

Gib Radius!<br />

3.0<br />

Umfang = 18.849539999999998<br />

Flaeche = 28.274309999999996<br />

15 pohlmann@drache:java Kreis<br />

Gib Radius!<br />

drei<br />

Your input number is not correct.<br />

Your input number must be<br />

an ordinary number either with<br />

or without a decimal point,<br />

such as 42 or 9.99<br />

Please, try again.<br />

Enter the number:<br />

3<br />

Umfang = 18.849539999999998


Einführung in die Programmierung - 4 -<br />

Flaeche = 28.274309999999996<br />

---------------------------------------------------*/<br />

Programmtext des Beispiels enthält:<br />

<br />

Buchstaben, Ziffern, Satzzeichen, math. Symbole, Zwischensumme<br />

(Leerzeichen, blanks), ...<br />

Daraus gebildet:<br />

<br />

Kommentare<br />

= Text, der vom Rechner ignoriert wird, der für menschliche Leser bestimmt<br />

ist.<br />

/* ............. */<br />

Anfang Ende<br />

oder<br />

// .......................<br />

Anfang Ende = Zeichenende!<br />

Bezeichner (identifier) wie public, class, Kreis, radius, ...<br />

dabei gibt es:<br />

o Reservierte Wörter mit vorgegebener Bedeutung zB.: public, class,<br />

double,...<br />

o Durch Kontext erklärte Wörter zB.: System.out, Println, SavitchIn.<br />

ReadlineDouble<br />

o Vom Programmierer frei gewählte und mit Bedeutung verknüpfte<br />

(deklarierte, vereinbarte) Namen<br />

zB.: Kreis: Name des „Programms“ (Klasse)<br />

radius: Name einer Programmvariablen für Werte vom Typ<br />

„double“<br />

PI: Name für eine Konstante vom Typ double mit dem Wert 3.14..<br />

o Zusammengesetzte Bezeichnung (dot )<br />

zB.: System.out.println (....)<br />

= Auswahl von Diensten einer Klasse oder eines Objekts;<br />

Literale (Notationen für bestimmte feste Wert)<br />

zB.: 3.14159 - Zahl<br />

“Umfang =“ - Zeichenreihe<br />

<br />

Ausdrücke (Kompositen)<br />

zB.:<br />

2*PI*radius<br />

“Umfang =“ + umfang<br />

- arithmetischer Ausdruck („Formel“)<br />

* ... bedeutet „mal“<br />

- Zeichenreihen<br />

Ausdruck + bedeutet hier: aneinanderfügen<br />

SavitchIn.readLineDouble() - Aufruf einer Methode, die einen Wert vom Typ<br />

double zurückgibt.<br />

Operationszeichen in Ausdrücken haben feste vorgegebene aber womöglich<br />

vom Kontext abhängige Bedeutung, zB.: „+“ überladen


Einführung in die Programmierung - 5 -<br />

<br />

<br />

<br />

<br />

<br />

Anweisungen („statements“, Befehle)<br />

zB.:<br />

Umfang = 2*PI*radius; - Wertzuweisung<br />

println (....);<br />

- Ausgabeanweisung<br />

Vereinbarungen (declarations)<br />

zB.:<br />

double radius, umfang, flaeche;<br />

- radius, umfang, flaeche werden als Programmvariable für reelle Zahlen<br />

(double) eingeführt.<br />

Syntaktische Struktur im Großen<br />

wie<br />

public class ... {...} - Klassendefinition<br />

public static void main (String[ ]args) {...} - Definition der main-Methode<br />

…..;<br />

…..; Aneinanderreihung von Deklarationen und Anweisungen<br />

…..;<br />

! Syntax = Regelwerk (Grammatik) für formale Zulässigkeit sprachlicher<br />

Gebilde<br />

zB.: öffnende Klammer “(“<br />

erfordert<br />

schließende Klammer “)“<br />

Semantik = Bedeutung, Wirkung bei Ausführung durch den Rechner<br />

Semantik ist abgestützt auf Syntax und Vereinbarungen<br />

! einstweilen (aber nur einstweilen) schreiben wir einfache Programme der Form<br />

public class ... {<br />

}<br />

public static void main (String [ ] args) {<br />

.<br />

.<br />

.<br />

}<br />

Diesen Rahmen erklären wir später und gehen über zu komplexen und sinnvollen<br />

Strukturen!<br />

1.4 Fehlerhafte Programme<br />

sind an der Tagesordnung!<br />

<br />

<br />

Unterscheide:<br />

a) Verstoß gegen Regeln der Sprache, technische Schranken,<br />

usw.<br />

b) Falscher Lösungsweg für Problem („Denkfehler“)<br />

Unterscheide weiter:<br />

Wann wird Fehler des Typs a) manifest?


Einführung in die Programmierung - 6 -<br />

a1) zur Laufzeit (runtime): zB.: benötigte Datei fehlt,<br />

Speicherkapazität erschöpft<br />

a2) zur Übersetzungszeit (compile time); zB.: fehlende Klammer,<br />

Variable nicht deklariert, ...<br />

Fehlermeldungen des Compilers sind oft nicht genau zutreffend, schwer verständlich<br />

oder auch unvollständig;<br />

Also: es hat schon einen Grund ... genau hinschauen!<br />

/***************************************************<br />

*Programm berechnet Umfang & Flaeche eines Kreises<br />

*dessen Radius der Benutzer (auf Aufforderung) gibt.<br />

*beachte:<br />

*Zahl und "return" erwartet!<br />

*SavitchIn.class im selben Verzeichnis!<br />

***************************************************/<br />

public class KreisCompileTimeError{<br />

public static void main(String[] args){<br />

double radius, umfang, flaeche<br />

final double PI = 3.14159;<br />

System.out.println();<br />

System.out.println("Gib Radius!");<br />

radius = "drei";<br />

umfang = 2.PI*radius;<br />

Flaeche = PI*radius*radius;<br />

}<br />

}<br />

System.out.println("Umfang = + umfang);<br />

System.out.println("Flaeche = " + flaeche);<br />

System.out.println();<br />

/*-------------------------------------------------------------------<br />

18 pohlmann@drache: javac KreisCompileError.java<br />

KreisCompileTimeError.java:13: ; expected.<br />

Double radius, umfang, flaeche<br />

^<br />

KreisCompileTimeError.java:20: Invalid character in number.<br />

Umfang = 2.PI*radius;<br />

^<br />

KreisCompileTimeError.java:23: String not terminated at end of line.<br />

System.out.println(“Umfang = + umfang);<br />

^<br />

KreisCompileTimeError.java:30: Unbalanced parentheses.<br />

^<br />

KreisCompileTimeError.java:30: } expected.<br />

^<br />

5 errors<br />

--------------------------------------------------------------------*/


Einführung in die Programmierung - 7 -<br />

! akzeptiert der Compiler das Programm, so muss man es<br />

testen (systematisch ausprobieren)<br />

debuggen (Fehler finden und beheben)<br />

Mehr dazu später!<br />

1.5 Jetzt alles genauer:<br />

<br />

<br />

Bezeichner<br />

o Bestehen aus Buchstaben, Ziffern, Unterstrich<br />

o Dürfen nicht mit Ziffer anfangen<br />

o ! Groß- und Kleinbuchstaben sind verschiedenen Buchstaben!<br />

Konvention: Bezeichner für<br />

o Klasse: beginnen mit Großbuchstaben,<br />

o Variablen, Methoden, Objekte: Beginnen mit Kleinbuchstaben<br />

o Konstanten: enthalten nur Großbuchstaben<br />

! Lesbarkeit von Programmen<br />

Suggestive Bezeichner zB.: natürliche Sprache, übliche Namen und<br />

Abkürzungen<br />

! Komposita mit inneren Großbuchstaben: KreisFlaeche, ersteAbleitung, ...<br />

<br />

Layout ist in Java frei, aber für menschliche Leser ist etwas Mühe angesagt:<br />

o Einrückungen verdeutlichen Struktur (Schachtelung):<br />

public class ... {<br />

public static void main ....{<br />

<br />

}<br />

}<br />

Leerzeichen/Kommentarzeilen können Folgen von Anweisungen sinnvoll<br />

gliedern.<br />

/***************************************************<br />

*Programm berechnet Umfang & Flaeche eines Kreises<br />

*dessen Radius der Benutzer (auf Aufforderung) gibt.<br />

*beachte:<br />

*Zahl und "return" erwartet!<br />

*SavitchIn.class im selben Verzeichnis!<br />

***************************************************/<br />

public class KreisUnlesbar{public static void main(String[]<br />

args){double rmpflstxx, rnpflstxx;final double x4711 = 3.14159;<br />

System.out.println();System.out.println("Gib Radius!");rmpflstxx<br />

=SavitchIn.readLineDouble();double Rmpflstxx=2*x4711*rmpflstxx;rnpflstxx<br />

=x4711*rmpflstxx*rmpflstxx;<br />

System.<br />

out.println("Umfang = "+Rmpflstxx);<br />

out.println("Flaeche = "<br />

+rnpflstxx);<br />

System.out<br />

.println();}<br />

}<br />

System.


Einführung in die Programmierung - 8 -<br />

/*-------------------------------------------------------------------<br />

55 pohlmann@drache:javac KreisUnlesbar.java<br />

56 pohlmann@drache:java KreisUnlesbar<br />

Gib Radius!<br />

3<br />

Umfang = 18.849539999999998<br />

Flaeche = 28.274309999999996<br />

--------------------------------------------------------------------*/<br />

<br />

<br />

Programmvariable<br />

o Werden im Programm zur Speicherung von Daten benutzt<br />

(Zwischenergebnisse, Eingabewerte u. ä. )<br />

also: änderbarer Wert mit festem Bezeichner, (Zeichnung<br />

Behältermodell fehlt)<br />

o Werden zusammen mit Typ vor dem ersten Gebrauch vereinbart<br />

Behälter spezifisch für Inhalt (Zeichnung spezifische Behälter fehlt)<br />

o Typfestlegung wesentlich für<br />

Maschine: erforderlicher Speicherplatz, Codierung<br />

Programmierer: Einschränkung des sinnvollen Gebrauchs -<br />

nicht Äpfel und Birnen addieren;<br />

Compiler kann Fehler finden<br />

Zuweisung<br />

setzt Wert einer Variablen (früherer Wert futsch!) ✮<br />

allgemeine Form:<br />

Variable = Ausdruck<br />

zB.: umfang = 2*PI*radius;<br />

Wirkung:<br />

1. rechte Seite auswerten<br />

2. Ergebnis wird neuer Wert der Variablen auf der linken Seite<br />

zB.: x = 3.0;<br />

x = x+x; // x hat jetzt Wert 6.0, Ausrechnung der rechten Seite<br />

// benutzt alten Wert<br />

o Zuweisungssymbol „=“ (sprich: ergibt sich zu)<br />

nicht verwechseln mit Gleichheit:<br />

Java<br />

Mathematik<br />

x=x+1 x wird um 1 erhöht Gleichung, die<br />

keine Lösung hat<br />

<br />

Rechte und linke Seite müssen in ihrem Typ zueinander passen; (oft gleicher<br />

Typ; aber auch einige weitergehende Verträglichkeitsregeln, s. u.)


Einführung in die Programmierung - 9 -<br />

<br />

Variablen müssen vor dem ersten (lesenden) Gebrauch durch eine<br />

Wertzuweisung initialisiert werden!<br />

zB.: double eins; eins = 1.0;<br />

oder: double eins = 1.0;<br />

! bei fehlender Initialisierung kann Compiler<br />

o Default-Wert einsetzten, oder<br />

o Fehler melden<br />

✮Verhalten von Java-Implementierungen ist nicht einheitlich und verlässlich!<br />

/***************************************************<br />

*Programm vertauscht die Belegung von zwei int Variablen,<br />

*die vorher der Benutzer (auf Aufforderungen) eingibt.<br />

*Zum Vertauschen wird eine Hilfsvariable benutzt.<br />

*beachte:<br />

*jeweils ganze Zahl und "return" erwartet!<br />

*SavitchIn.class im selben Verzeichnis!<br />

***************************************************/<br />

public class Vertausche{<br />

public static void main(String[] args){<br />

int ersteZahl, zweiteZahl, hilf;<br />

System.out.println();<br />

System.out.println("Gib ersteZahl!");<br />

ersteZahl = SavitchIn.readLineInt();<br />

System.out.println("Gib zweiteZahl!");<br />

zweiteZahl = SavitchIn.readLineInt();<br />

hilf = ersteZahl;<br />

ersteZahl = zweiteZahl;<br />

zweiteZahl = hilf;<br />

}<br />

}<br />

System.out.println("ersteZahl = " + ersteZahl);<br />

System.out.println("zweiteZahl = " + zweiteZahl);<br />

System.out.println();<br />

/*-------------------------------------------------------------------<br />

65 pohlmann@drache:javac Vertausche.java<br />

66 pohlmann@drache:java Vertausche<br />

Gib ersteZahl!<br />

1<br />

Gib zweiteZahl!<br />

2<br />

ersteZahl = 2<br />

zweiteZahl = 1<br />

--------------------------------------------------------------------*/

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!