Kapitel 1
Kapitel 1
Kapitel 1
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 />
--------------------------------------------------------------------*/