Betriebssystem? Der Rahmen, in dem Programme auf Rechner ausgeführt werden können z.b. Windows XP, UNIX Abstraktion der Hardware auf geeignete Software-Schnittstellen Software läuft auf verschiedenen Rechnern Schnellkurs in UNIX Betriebssystem Login am UNIX-System Wichtigste Programme für EPROG Wichtigste UNIX-Dateibefehle Verwaltung der angeschlossenen Hardware UNIX 1969-74 Entwicklung der ersten UNIX-Version bei Bell Laboratories durch Ritchie und Thompson UNIX wird in eigens entwickelter Sprache C geschrieben UNIX-Code ist frei (kostenloses Betriebssystem!) PC-Variante nennt sich Linux Heute Standard auf Großrechnern Mehrbenutzerbetrieb Multitasking Mehrprozessoren-Unterstützung Literatur M. Harlander: Einf. in UNIX (pdf auf Homepage) 1 UNIX ist textbasiert Shell = Befehlsfenster mit Textprompt z.b. bash, sh, ksh manchmal auch Begriff X-Term (= Shell) Anders als Windows werden die Programme in UNIX i.d.r. durch Eingabe eines Befehls in einer Shell gestartet Man muss die wichtigsten Befehle kennen! Maus-Bedienung ist i.d.r. nicht möglich! Befehl xterm & öffnet weiteres Shell-Fenster Werbung für CYGWIN cygwin = freier UNIX-Emulator für Windows Download unter http://www.cygwin.com Unter cygwin stehen zur Verfügung ssh = Remote Login auf UNIX-System scp = Kopieren von Software von/auf anderes UNIX-System gcc = C-Compiler für Übungen emacs = guter Texteditor Wichtiges zum Start: cygwin startet im Textmodus Eingabe von startx eröffnet Möglichkeit, weitere Fenster zu öffnen (sog. graphisches Arbeiten) Login auf einem UNIX-System Immer nötig: Eingabe von Username & Passwort Accounts auf lva.student.tuwien.ac.at Username: e + Matrikelnummer Passwort: wie bei TUWIS 3 Varianten für Login lokales Login am Terminal triviales Login remote Login über Internet von UNIX aus wichtigste Variante für Übungen remote Login über Internet von Windows aus Bitte beachten: UNIX ist case sensitive, d.h. Groß- und Kleinschreibung werden unterschieden Keine deutschen Sonderzeichen verwenden, da Systeme i.d.r. englische Zeichencodierung 3 4
Remote Login von UNIX aus Ausgangspunkt: bereits Shell geöffnet auf einem UNIX-System Eingabe der folgenden Befehle in der Shell ssh -X username@rechnername oder ssh -X rechnername -l username Option -X erlaubt graphisches Arbeiten, d.h. kann remote Programme starten, die im lokalen Fenster arbeiten Nach korrekter Passworteingabe erscheint im selben Shell-Fenster die Eingabeaufforderung des Remote-Rechners Remote Login von Windows aus Nur mit Zusatzsoftware möglich, z.b. http://gd.tuwien.ac.at/utils/shells/ssh /SSHSecureShellClient-3..9.exe Im allgemeinen kein graphisches Arbeiten möglich, d.h. alle Arbeiten nur im Textfenster! Ggf. also mehrfach auf lva.student.tuwien.ac.at einloggen, um mehrere Text-Fenster zu haben. Alle ab jetzt eingegebenen Befehle werden also auf Remote-Rechner ausgeführt! Logout vom Remote-Rechner durch Eingabe von logout oder exit 5 6 UNIX-Dateisystem Die wichtigsten Programme für EPROG Eingabe der folgende Befehle in einer Shell emacs = Texteditor Wenn graphisches Arbeiten möglich, startet emacs im eigenen Fenster Aufruf mit emacs & erlaubt weiteres Arbeiten in Shell (Symbol & = Multitasking-Aufruf in UNIX) gcc = Standard-C-Compiler, der für Übung verwendet werden muss matlab startet Matlab-Interpreter inkl. graphischer Oberfläche + Editor (wie im Skript) matlab -nojvm startet Matlab in Shell Aufbau wie in Windows: Verzeichnisse + echte Dateien Verzeichnisse sind im Baum geordnet in Windows mittels Explorer visualisierbar in UNIX muss sich Benutzer i.d.r. textbasiert zurechtfinden Nach Login ist man stets im eigenen Home-Verzeichnis pwd (print working directory) gibt aus, in welchem Verzeichnis man (= Shell) aktuell ist cd (change directory) ohne Angabe wechselt ins eigene Home-Verz.. = Abkürzung für aktuelles Verzeichnis.. = Abkürzung für eine ebene höher ~ = Abkürzung für eigenes Home-Verz. Beispiel: Es gäbe Verz. /home/dirk/eprog/vo Nach Login bin ich in /home/dirk/ cd eprog wechselt nach /home/dirk/eprog cd vo wechselt dann nach /home/dirk/eprog/vo cd.. wechselt dann nach /home/dirk/eprog cd.., cd, cd ~ wechselt dann nach /home/dirk nur im eigenen Home-Verzeichnis + Unterverzeichnissen hat man Schreib- und Leserechte! 7 8
Die wichtigsten Befehle ls = List (Verzeichnis-Inhalt ausgeben) mkdir = Make Directory rmdir = Remove Directory cp = Copy (Files) cp -r = Copy (Directories) mv = Move (Files & Directories) rm = Remove (Files) rm -rf = Remove (ohne Rücksicht, inkl. Verz.) Vorsicht, es gibt keinen Papierkorb in UNIX! d.h. gelöscht ist gelöscht! Dateinamen Namen für Dateien & Verz. (max. 53 Zeichen) Buchstaben, aber keine dt. Sonderzeichen Ziffern Underscore ( ), Punkt (.), Minuszeichen (-) UNIX unterscheidet Groß-/Kleinschreibung Viele Dateibefehle erlauben sog. Wildcards * vertritt beliebige Anzahl beliebiger Zeichen? vertritt genau ein beliebiges Zeichen BSP. ls *.ps zeigt Dateien mit Endung.ps Kopieren von Dateien/Verzeichnissen cp quelle ziel quelle = Name der Ausgangsdatei ziel = Name der Zieldatei Existiert ziel nicht, so wird Datei angelegt Existente ziel wird überschrieben Ist ziel ein Verzeichnisname, so wird Datei quelle in dieses Verzeichnis kopiert quelle darf Wildcards enthalten Option -r zum Kopieren von Verzeichnissen nötig z.b. cp -r quelle ziel Abkürzungen bei Verzeichnissen.,.., ~ erlaubt Beispiel cp /tmp/*. kopiert alle Dateien (aber keine Unter-Verz.) aus Verzeichnis /tmp ins aktuelle Verzeichnis 9 Kopieren von Dateien zwischen UNIX-Rechnern Mittel scp (secure copy) analog zu cp scp quelle user@rechner:ziel kopiert Datei quelle von lokal nach rechner, wo Benutzer user Account haben muss Vor Kopieren wird Passwort abgefragt Falls ziel fehlt, wird ins Home-Verz. kopiert Falls : fehlt, gilt scp = cp Wildcards sind erlaubt Kopieren von Verzeichnissen mit Option -r scp user@rechner:quelle ziel kopiert datei quelle von rechner nach lokal Kopieren von Windows nach UNIX und umgekehrt Nur mit Zusatzsoftware möglich, z.b. http://gd.tuwien.ac.at/utils/shells/ssh /SSHSecureShellClient-3..9.exe installiert SFTP-Programm, das wie Windows-Explorer aussieht und bedient wird Das erste C-Programm Source-Code & Executable Compiler & Interpreter Syntaxfehler & Laufzeitfehler Wie erstellt man ein C-Programm? main printf (Ausgabe von Text) #include <stdio.h> 11 1
Source-Code in Programmiersprache geschriebenes Programm wird bei Ausführung bzw. Compilieren schrittweise abgearbeitet im einfachsten Fall: sequentiell Programmzeile für Programmzeile von oben nach unten Programmiersprachen Grobe Unterscheidung in Interpreter- und Compiler-basierte Sprachen Interpreter führt Source-Code zeilenweise bei der Übersetzung aus d.h. Übersetzen & Ausführen ist gleichzeitig z.b. Matlab, Java, PHP Compiler übersetzt Source-Code in ein ausführbares Programm (Executable) Executable ist eigenständiges Programm d.h. (1) Übersetzen, dann () Ausführen z.b. C, C++, Fortran Achtung C ist Compiler-basierte Programmiersprache Compilierter Code ist systemabhängig, d.h. Code läuft idr. nur auf dem System, auf dem er compiliert wurde Source-Code ist systemunabhängig, d.h. er sollte auch auf anderen Systemen compiliert werden können. C-Compiler unterscheiden sich leicht Bitte vor Übung alle Programme auf der lva.student.tuwien.ac.at mit dem Compiler gcc compilieren und testen nicht-lauffähiger Code = schlechter Eindruck und ggf. schlechtere Note... Alternative Unterscheidung (siehe Schmaranz) imperative Sprachen, z.b. Matlab, C, Fortran objektorientierte Sprachen, z.b. C++, Java funktionale Sprachen, z.b. Lisp 13 14 Wie erstellt man ein C-Programm? Starte Editor Emacs aus einer Shell mit emacs & Die wichtigsten Tastenkombinationen: C-x C-f = Datei öffnen C-x C-s = Datei speichern C-x C-c = Emacs beenden Öffne eine (ggf. neue) Datei name.c Endung.c ist Kennung eines C-Programms Die ersten beiden Punkte kann man auch simultan erledigen mittels emacs name.c & Schreibe den sog. Source-Code (= C-Programm) Abspeichern mittels C-x C-s nicht vergessen Compilieren z.b. mit gcc name.c Falls Code fehlerfrei, erhält man Executable a.out unter Windows: a.exe Diese wird durch a.out bzw../a.out gestartet Compilieren mit gcc name.c -o output erzeugt Executable output statt a.out Das erste C-Programm 5 printf("hello World!\n"); 6 } Zeilennummern gehören nicht zum Code (sind lediglich Referenzen auf Folien) Jedes C-Programm besitzt die Zeilen 3, 4, 6. Die Ausführung eines C-Programms startet immer bei main() egal, wo main() im Code steht Klammern {...} schließen in C sog. Blöcke ein Hauptprogramm main() bildet immer einen Block Logische Programmzeilen enden mit Semikolon, vgl. 5 printf gibt Text aus (in Anführungszeichen), \n macht einen Zeilenumbruch Anführungszeichen müssen in derselben Zeile sein Zeile 1: Einbinden der Standardbibliothek für Input-Output (später mehr!) 15 16
Syntaxfehler Syntax = Wortschatz (Befehle) & Grammatik einer Sprache (Was man wie verbinden kann...) Syntaxfehler = Falsche Befehle oder Verwendung merkt Compiler und gibt Fehlermeldung 1 main() { 3 printf("hello World!\n"); 4 } Fehlt Einbindung der stdio.h Compilieren liefert Fehlermeldung: wrongworld1.c:3: warning: incompatible implicit declaration of built-in function printf 5 printf("hello World!\n") 6 } Fehlt Semikolon am Zeilenende 5 Compilieren liefert Fehlermeldung: wrongworld.c:6: error: syntax error before } token Variablen Was sind Variable? Deklaration & Initialisierung Datentypen int und double Zuweisungsoperator = arithmetische Operatoren + - * / % Type Casting int, double printf (Ausgabe von Variablen) scanf (Werte über Tastatur einlesen) Laufzeitfehler Fehler, der erst bei Programm-Ausführung auftritt 17 18 Variable Variable = symbolischer Name für Speicherbereich Variable in Math. und Informatik verschieden: Mathematik: Sei x R fixiert x Informatik: x=5 weist x den Wert 5 zu, Zuweisung kann jederzeit geändert werden z.b. x=7 Datentypen Bevor man Variable benutzen darf, muss man idr. erklären, welchen Typ Variable haben soll Elementare Datentypen: Gleitkommazahlen (ersetzt Q, R), z.b. double Integer, Ganzzahlen (ersetzt N, Z), z.b. int Zeichen (Buchstaben), idr. char int x; deklariert Variable x vom Typ int Deklaration Deklaration = das Anlegen einer Variable d.h. Zuweisung von Speicherbereich auf einen symbolischen Namen & Angabe des Datentyps Zeile int x; deklariert Variable x vom Typ int Zeile double var; deklariert var vom Typ double Initialisierung Durch Deklaration einer Variablen wird lediglich Speicherbereich zugewiesen Falls noch kein konkreter Wert zugewiesen: Wert einer Variable ist zufällig Deshalb direkt nach Deklaration der neuen Variable Wert zuweisen, sog. Initialisierung int x; (Deklaration) x = 0; (Initialisierung) Deklaration & Initialisierung auch gleichzeitig möglich: int x = 0; 19 0
Ein erstes Beispiel zu int 5 int x = 0; 6 7 printf("input: x="); 8 scanf("%d",&x); 9 printf("output: x=%d\n",x); } Einbinden der Input-Output-Funktionen (Zeile 1) printf gibt Text (oder Wert einer Var.) aus scanf liest Tastatureingabe ein in eine Variable Prozentzeichen % in Zeile 8/9 leitet Platzhalter ein Datentyp Platzhalter printf Platzhalter scanf int %d %d double %f %lf Beachte & bei scanf in Zeile 8 scanf("%d",&x) aber: printf("%d",x) Dasselbe Beispiel zu double 5 double x = 0; 6 7 printf("input: x="); 8 scanf("%lf",&x); 9 printf("output: x=%f\n",x); } Beachte Platzhalter in Zeile 8/9 scanf("%lf",&x) aber: printf("%f",x) Verwendet man %f in 8 Falsches Einlesen! vermutlich Laufzeitfehler! sorgfältig arbeiten! Wenn man & vergisst Laufzeitfehler Compiler merkt Fehler nicht (kein Syntaxfehler!) Sorgfältig arbeiten! 1 Zuweisungsoperator 5 int x = 1; 6 int y = ; 7 8 int tmp = 0; 9 printf("a) x=%d, y=%d, tmp=%d\n",x,y,tmp); 11 1 tmp = x; 13 x = y; 14 y = tmp; 15 16 printf("b) x=%d, y=%d, tmp=%d\n",x,y,tmp); 17 } Das einfache Gleich = ist Zuweisungsoperator Zuweisung immer rechts nach links! Zeile x = 1; weist den Wert auf der rechten Seite der Variablen x zu Zeile x = y; weist den Wert der Variablen y der Variablen x zu insb. haben x und y danach denselben Wert d.h. Vertauschen der Werte nur mit Hilfsvariable a) x=1, y=, tmp=0 b) x=, y=1, tmp=1 Arithmetische Operatoren Bedeutung eines Operators kann vom Datentyp abhängen! Operatoren auf Ganzzahlen: a=b, -a (Vorzeichen) a+b, a-b, a*b, a/b (Division ohne Rest), a%b (Divisionsrest) Operatoren auf Gleitkommazahlen: a=b, -a (Vorzeichen) a+b, a-b, a*b, a/b ( normale Division) Achtung: /3 ist Ganzzahl-Division, also Null! Notation für Gleitkommazahlen: Vorzeichen -, falls negativ Vorkommastellen Dezimalpunkt Nachkommastellen e oder E mit ganzzahligem Exponenten (er Potenz!), z.b. e = E = = 00 Wegfallen darf entweder Vor- oder Nachkommastelle (sonst sinnlos!) Wegfallen darf entweder Dezimalpunkt oder e bzw. E mit Exponent (sonst Integer!) Also:./3. ist Gleitkommadivision 0.6 3 4
Type Casting Operatoren können auch Variablen verschiedener Datentypen verbinden Vor der Ausführung werden beide Variablen auf denselben Datentyp gebracht (Type Casting) 5 int x = 1; 6 double y =.5; 7 8 int sum_int = x+y; 9 double sum_dbl = x+y; 11 printf("sum_int = %d\n",sum_int); 1 printf("sum_dbl = %f\n",sum_dbl); 13 } Welchen Datentyp hat x+y in Zeile 8, 9? Den mächtigeren Datentyp, also double! Type Casting von Wert x auf double Zeile 8: Type Casting, da double auf int Zuweisung durch Abschneiden, nicht durch Rundung! sum int = 3 sum dbl = 3.500000 Implizites Type Casting 5 double dbl1 = / 3; 6 double dbl = / 3.; 7 double dbl3 = 1E; 8 int int1 = ; 9 int int = 3; 11 printf("a) %f\n",dbl1); 1 printf("b) %f\n",dbl); 13 14 printf("c) %f\n",dbl3 * int1 / int); 15 printf("d) %f\n",dbl3 * (int1 / int) ); 16 } a) 0.000000 b) 0.666667 c) 66.666667 d) 0.000000 Warum Ergebnis 0 in a) und d)?, 3 sind int /3 ist Ganzzahl-Division Werden Variablen verschiedenen Typs durch arith. Operator verbunden, Type Casting auf gemeinsamen (mächtigeren) Datentyp vgl. Zeile 6, 14, 15 ist int, 3. ist double /3. ergibt double 5 6 Explizites Type Casting 5 int a = ; 6 int b = 3; 7 double dbl1 = a / b; 8 double dbl = (double) (a / b); 9 double dbl3 = (double) a / b; double dbl4 = a / (double) b; 11 1 printf("a) %f\n",dbl1); 13 printf("b) %f\n",dbl); 14 printf("c) %f\n",dbl3); 15 printf("d) %f\n",dbl4); 16 } Kann dem Compiler mitteilen, in welcher Form eine Variable interpretiert werden muss Dazu Ziel-Typ in Klammern voranstellen! a) 0.000000 b) 0.000000 c) 0.666667 d) 0.666667 In Zeile 8, 9, : Explizites Type Casting (jeweils von int zu double) In Zeile 9, : Implizites Type Casting Fehlerquelle beim Type Casting 5 int a = ; 6 int b = 3; 7 double dbl = (double) a / b; 8 9 int i = dbl; 11 printf("a) %f\n",dbl); 1 printf("b) %f\n",dbl*b); 13 printf("c) %d\n",i); 14 printf("d) %d\n",i*b); 15 } a) 0.666667 b).000000 c) 0 d) 0 Implizites Type Casting sollte man vermeiden! d.h. Explizites Type Casting verwenden! Bei Rechnungen Zwischenergebnisse in richtigen Typen speichern! 7 8