Einführung in die Informatik 1. Einleitung / Grundbegriffe 1.1 Was ist Informatik ? Informatik ist eine Wissenschaft, die sich befaßt mit - Methoden der Informationsverarbeitung und deren Realisierung auf Computern (SOFTWARE) - der Konstruktion informationsverarbeitender Maschinen (HARDWARE ) Unterteilung der Informatik in Teilgebiete: Die Teilgebiete kann man nicht immer scharf voneinander trennen ♦ Technische Informatik Entwicklung (logischer Entwurf) von Rechnersystemen (Rechnernetzen) und zugehörigen peripheren Komponenten (Festplatten, Laufwerken, ...) ­ Forschung auf dem Gebiet der Hardware (Rechnerkomponenten ...) - ♦ Theoretische Informatik Bindeglied zwischen Mathematik und Informatik Besondere Arbeitsgebiete: Algorithmen­ und Automatentheorie, Graphentheorie, Fragen von Berechenbarkeit von Funktionen und Entscheidbarkeit von Problemen, Komplexitätsuntersuchungen (Aufwand bzgl. Laufzeit/Speicherplatz), Programmverifikation (Korrektheit des Ergebnisses), Künstliche Intelligenz, abstrakte Datenstrukturen, formale Sprachen, Metasprachen ♦ Praktische Informatik Entwicklung von Betriebssystemen, Entwicklungsumgebungen, Compilern, Assemblierern, Debuggern, Treibern ... Entwicklung von Software als Brücke zwischen Hardware und Mensch konkrete Umsetzung von Algorithmen auf dem Computer, d.h. Programmierung ♦ Angewandte Informatik beschäftigt sich mit dem Einsatz von Computern in verschiedensten Lebensbereichen, z.B. Textverarbeitung, Tabellenkalkulation, Instrument zur Umsetzung numerischer Algorithmen in der Wissenschaft und Industrie Nutzung von Systemen zur Messung, Steuerung, Regelung, Automatisierung von ganzen Betriebsabläufen, Einsatz von Robotertechnik Fragen der Datensicherheit und des Datenschutzes, Nutzung von und Anpassung an Benutzerschnittstellen (z.B. neue Eingabemöglichkeiten – touchscreen ...) ♦ Informatik und andere Wissenschaftsbereiche z.B. Bio­Informatik (neuronale Netze), Wirtschaftsinformatik spezifischer Einsatz in Medizin, Rechtswesen, Ingenieurwissenschaften, ... 1.2 Algorithmen und Programme Bevor ein Computerprogramm geschrieben wird, gibt es ein Problem! Dieses Problem soll gelöst werden, und zwar mit Hilfe der Rechenleistung einer Maschine. Beispiele: A) Problem Zutaten Ausführung Zubereitung von Nudeln mit Tomatensauce Nudeln, Tomatenmark, Tomaten, Zwiebeln, Salz, Gewürze , ... 1. Kochen der Nudeln in soundsoviel gesalzenem Wasser 2. Sauce: 2.1 Schneide Zwiebeln klein ... Berechne den Wert eines Polynoms p(x)=ax²+bx+c Parameter a , b, c Argument x 1. Eingabe von x 2. Berechnung von y=p(x) 3. Ausgabe von y B) Problemstellung: Biologen wollen die Population einer Spezies, deren Entwicklung, Einflußgrößen etc. Untersuchen ­> Auswertung der Meßdaten, Voraussagen, Modellierung der Entwicklung der Population Vorgehensweise zur Lösung: Merkmale des Problems erfassen ⇩ Formulierung eines Lösungsweges ⇩ Formalisieren des Lösungsweges (Algorithmus) ⇩ Implementieren in einem Computerprogramm Merkmale des Problems erfassen ­ Eingabedaten, geforderte Ergebnisse ­ Ziel? Modellierung und Datenauswertung einer Spezies (statistische und graphische Auswertungen), Vorhersage ­ Merkmale nur zu diskreten Zeitpunkten meßbar ­ Randbedingungen Formulierung eines Lösungsweges ­ Eingangsdaten: Meßdaten ­ Wahl eines geeigneten Modelltyps (Idealisierungen) ­> Bestimmung von Modellparametern ­> Wahl geeigneter Methoden zur Lösung der Modellgleichungen ­> Vorhersagen, Analyse durch Simulationen ­ Berechnung statistischer Größen ­ Anwendung von Visualisierungstechniken ­ weitere Analyse von Eigenschaften durch Auswertung der Computerergebnisse Formalisieren des Lösungsweges ­ prinzipielle Aufeinanderfolge der Schritte in der Sprache (Algorithmus) grundsätzlicher algorithmischer Strukturen Verifikation, d.h. Nachweis der Korrektheit Implementieren in einem ­ Wahl einer geeigneten höheren Programmiersprache Computerprogramm ­ Nutzung vorhandener Software, Funktionsbibliotheken Was ist ein Algorithmus – aus Sicht der Informatik? (Eine mögliche, aufs Wesentliche beschränkte Definition) Ein Algorithmus ist eine Vorschrift, die Eingabe­ in Ausgabedaten überführt, indem es die Handlungen und ihre Abfolge beschreibt, und die folgenden Eigenschaften genügt: ● Exaktheit: die Vorschrift kann präzise auf formale Weise beschrieben werden ● Diskretheit: die Vorschrift besteht aus einer Folge von elementaren Einzelschritten ● Vollständigkeit: es werden alle möglichen Fälle behandelt ● Determiniertheit: bei gleichem Startzustand wird stets derselbe Endzustand erreicht ● Haltebedingung: Endzustand nach endlich vielen Schritten mit Ergebnis (s. Gödel, Turing ­> 1930) Historie: Der Name „Algorithmus“ geht auf den Namen des arabischen Mathematikers Al Chwarismi zurück (ca. 783­850). Er verfaßte um 825 im sog. Haus der Weisheit des Kalifen Harun al Raschid das Lehrbuch„Über das Rechnen mit indischen Ziffern“, dessen lateinische Übersetzung den Titel Algorismi de... („Das Werk des Al­gorismus über...“) trug. Daraus entstand die Bezeichnung „Algorithmus“. Beispiel: Euklidischer Algorithmus Grundsätzliche Strukturen eines Algorithmus: ● SEQUENZ: Folge von Anweisungen (Handlungen, Einzelschritten), die je genau einmal ausgeführt werden ● SCHLEIFE: Sequenz von Anweisungen, die mehrfach ausgeführt werden ● SELEKTION: Sequenz von Anweisungen, die nur unter bestimmten Bedingungen ausgeführt werden Theorem von Böhm/Jacobi (sinngemäß): Gibt es zur Lösung eines Problems einen Algorithmus, so läßt sich dieser unter alleiniger Verwendung der drei Grundstrukturen Sequenz, Schleife und Selektion darstellen. Konzept der höheren Programmiersprachen wie C, Fortran, Pascal, Delphi, ... : „Strukturiertes Programmieren“ 2. Erste Schritte in C Umsetzung eines Algorithmus in ein Programm? Algorithmus C­Programm als Text in „auf dem einem Editor eintippen ⇨ Papier“ ⇨ name.c Präprozessor + Übersetzen durch Compiler in Maschinencode name.obj ⇨ Verbinden mit anderen Programmen/Bibliotheken zu ausführbarem Programm 2.1 Grundsätzliche Elemente eines C­Programms Beispielprogramm: #include <stdio.h> int main() { int i; /* i ist eine ganze Zahl */ i=1; printf(''i=%d\n'',i); return 0; } Hauptprogramm: int main () { ... return 0; } wird durch die Funktion main gebildet name.exe alle Befehle, die dort nacheinander abgearbeitet werden, sind in Klammern { ... } eingeschlossen = Funktionsblock Rückgabewert ist vom Typ int, Rückgabe mit return­Anweisung Anweisungen in C: int i; Deklaration einer Integer­Variablen mit Namen i, d.h. ein Block Speicherplatz wird im Arbeitsspeicher reserviert, in dem ganzzahlige Werte gespeichert werden können /* i ist eine ganze Zahl */ ist ein Kommentar, nur zum Verständnis des eigenen Programms, alternativ: // i ist eine ganze Zahl i=1; Zuweisung des Wertes 1 an die Variable i = im Rechner: Speichere den Wert 1 auf dem unter dem Namen i reservierten Speicherplatz printf(“i=%d\n“, i ); Zeichenkette zwischen “...“ wird auf dem Bildschirm ausgegeben anstelle des Platzhalters %d wird dabei der in i gespeicherte Wert eingefügt. Bedeutung von \n (Zeilenumbruch): z.B. printf(“Lehr\namt“); Bildschirmausgabe: Lehr amt Präprozessor­Direktiven: #include <stdio.h> Funktion printf zur Bildschirmausgabe muß dem Compiler bekannt gemacht werden ist in der C­Ein/Ausgabe­Funktionsbibliothek stdio.h vorhanden durch die include­Direktive wird der Quelltext dieser Headerdatei durch den Präprozessor in das eigene Progamm direkt hineingeschrieben Eingabe über Tastatur: Funktion scanf z.B. scanf(“%d“,&i); fordert vom Nutzer die Eingabe eines ganzzahligen Wertes über Tastatur (Abschluß mit ENTER) in “...“ steht, welcher Variablen(Zahlen)typ erwartet wird (hier Platzhalter für eine ganze Zahl) &i gibt die Speicheradresse der Variablen i im Arbeitsspeicher an, auf die der eingegebene Wert gespeichert werden soll. Also allgemein: scanf(“Format der Variablen“, Speicheradresse für Eingabewert); mögliche Zahlentypen/Formate: Zahlen­ typ Format zeichen int short int %d %d %i %i long int %ld Ganzzahlige Variablentypen float double %f %lf %e exponentielle Darstellung %le exponentielle Darstellung Reelle Variablentypen einfach bzw. doppelt genau 2.2 Programmstrukturen 2.2.1 Schleifen (oder Zyklen): eine oder mehrere Anweisungen werden wiederholt durchlaufen Beispielfälle: ­ wiederholte Eingabe von Daten gleichen Typs (z.B. Name, Adresse, Tel.­Nr.) über Tastatur oder aus einer Datei ­ Aufsummierung von Termen s = f(x_1)+f(x_2)+...+f(x_n)=∑ f(x_i) o.ä. Berechnungen, rekursive Funktionsberechnungen x_k=f(x_k­1) ­ Arbeit mit Feldern (s. später) Varianten: a) Anzahl der Durchläufe ist festgelegt: for­Schleife (in C) b) Anzahl der Durchläufe ist durch Bedingung(en) gesteuert: while­Schleife in anderen Programmiersprachen ähnliche Syntax: z.B. Fortran: a) DO­Schleife b) DO­Schleife mit IF­Bedingung for­Schleife: für k=1,..., n führe Aktion(k) aus (ende) for (Ausdruck1; Ausdruck 2; Ausdruck 3) { Anweisungen } ein Ausdruck ist in einer Programmiersprache eine Aufzählung von Zahlen, Zeichen und Operatoren, die sich zu einem Wert auflösen lassen z.B. A­2*(b+1) (wenn z.B. A=1 und b=0.5 sind, hat der Ausdruck den Wert ­2 ) Ausdruck 1 ... Startwert für die Laufvariable, die die Durchläufe zählt Ausdruck 2 ... Abbruchbedingung, häufig Vergleich mit festgelegter Anzahl von Durchläufen Ausdruck 3 ... Aufdatierung der Laufvariablen („Weiterzählen“) Beispiel: Summenberechnung while­Schleife: zwei Varianten in C ⇨anfangsgeprüfte Schleife: solange Bedingung erfüllt ist tue etwas (führe Aktion aus) (ende) while (Bedingung) { Anweisungen } Die Bedingung ist dabei einfach irgendein sinnvoller Ausdruck. Sie ist genau dann erfüllt, wenn sie wahr ist, d.h. Programmtechnisch: der Ausdruck hat einen Wert ungleich 0. (Falsch bedeutet dann entsprechend, daß der Ausdruck den Wert = 0 hat) ⇨endgeprüfte Schleife: tue etwas (führe Aktion aus) solange Bedingung erfüllt ist do { Anweisungen } while (Bedingung); (Achtung! Semikolon nicht vergessen!) Sinnvoll, wenn mindestens ein Durchlauf gefordert ist 2.2.2. Selektion: ­ wesentliche Komponente vieler Algorithmen ­ gewisse Anweisungen sollen nur unter bestimmten Bedingungen ausgeführt werden ­ Auswahl aus einem Katalog (Menue) möglicher Aktionen Beispielfälle: ­ Reaktion des Programms abhängig von Eingabe ­ Reaktion abhängig vom Ergebnis einer Berechnung: (z.B. Dreieck stumpfwinklig, rechtwinklig, spitzwinklig; Wurzel für negative Zahlen nicht erklärt) ­ Auswertung von Fehlermeldungen ­ Auswahl einer Aktion, z.B. für eine Meßwertreihe x_1,x_2, ... , x_n a) Mittelwert berechnen b) maximalen Wert finden c) alle Werte kleiner vorgegebener Schranke finden zwei Varianten in C: ­ Entscheidung/bedingte Anweisung if­Anweisung (in allen höheren Programmiersprachen Schlüsselwort if) ­ Auswahl switch­Anweisung (z.B. in Fortan SELECT) if­Anweisung: ⇨ohne Alternative wenn Bedingung erfüllt ist tue dies (führe Aktion_1 aus) (ende) if (Bedingung) { Anweisungen } Die Anweisungen innerhalb des if­Rahmens werden also nur höchstens einmal ausgeführt, und zwar dann, wenn die Bedingung wahr ist (Ausdruck ungleich 0). Die Bedingung ist dabei einfach wieder irgendein in der Programmiersprache sinnvoller Ausdruck ⇨ mit Alternative wenn Bedingung erfüllt ist tue dies (führe Aktion_1 aus) ansonsten tue das (führe Aktion_2 aus) (ende) if (Bedingung) { Anweisungen } else { Anweisungen } ⇨ mehrere Fälle: wenn Bedingung_1 erfüllt ist führe Aktion_1 aus ansonsten wenn Bedingung_2 erfüllt führe Aktion_2 aus ansonsten wenn Bedingung_3 erfüllt führe Aktion_3 aus ... ansonsten führe Aktion_alternativ aus (ende) if (Bedingung_1) { Anweisungen } else if(Bedingung_2) { Anweisungen } else if(Bedingung_3) { Anweisungen } ... else { Anweisungen } zusammenfassend: Eine bedingte Anweisung besteht mindestens aus der if­.Anweisung, die else­if­Zweige und der alternative else­Zweig sind optional. switch­Anweisung: Sinnvolle Alternative zur if­else if­else­Anweisung im Falle, daß verschiedene zu betrachtende Fälle durch Zuordnung ganzer Zahlen (Nummern) oder verschiedener Zeichen charakterisierbar sind (z.B. Auswahl aus einem Menue). Wähle für Berechnungsausdruck k im Falle k=k_1: führe Aktion_1 aus (ende Fall 1) im Falle k=k_2: führe Aktion_2 aus (ende Fall 2) ... trifft kein Fall zu: führe Aktion_alternativ aus (ende) switch (Ausdruck) { case k_1: Anweisungen (break;) case k_2: Anweisungen (break;) case k_3: Anweisungen (break;) default: Anweisungen } Arbeitsweise: ­ Ausdruck wird ausgewertet und muß ganze Zahl oder Zeichen liefern ­ Fälle (case) werden nacheinander abgefragt, d.h. der Wert des Ausdrucks wird mit der Konstanten k_1 dann mit der Konstanten k_2 usw. verglichen ­ stimmt der Wert des Ausdrucks mit einer der Konstanten überein, wird das Programm dort weitergeführt ­ stimmt der Wert des Ausdrucks mit keiner der Konstanten überein, wird der default­Fall ausgeführt. Dieser ist optional! Ist also kein default­Zweig vorhanden, und kein Fall trifft zu, wird das Programm nach der switch­ Anweisung fortgesetzt case + Konstante: Schlüsselwort case ist eine Marke für eine Programmzeile, d.h. ein Sprungziel bestehend aus dem Bezeichner „case“, einer Konstanten und dem „:“ . Schlüsselwort default ist ebenfalls eine Marke. Achtung! ­ In C wird nach dem Sprung zu einer Marke (zu einer markierten Programmzeile ) das Programm dort fortgesetzt, d.h. alle folgenden Anweisungen werden durchlaufen. ­ Ist das bei einer Fallunterscheidung nicht gewünscht, muß der Programmfluß mit der break­Anweisung unterbrochen werden. break: bewirkt, daß der innerste umgebende Block sofort verlassen wird, und danach das Programm fortgesetzt wird. (nur in Schleifen und switch­Anweisungen erlaubt)