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 Eine Problemstellung soll gelöst werden, und zwar mit Hilfe der Rechenleistung einer Maschine. Beispiele: A) Problem Zubereitung von Nudeln mit Tomatensauce Zutaten Ausführung Nudeln, Tomatenmark, Tomaten, 1. Kochen der Nudeln in Zwiebeln, Salz, Gewürze , ... soundsoviel gesalzenem Wasser 2. Sauce: 2.1 Schneide Zwiebeln klein ... Berechne den Wert eines Parameter a , b, c 1. Vorgabe von a,b,c Polynoms p(x)=ax²+bx+c Argument x 2. Eingabe von x 3. Berechnung von y=p(x) 4. Ausgabe von y B) Problemstellung: Biologen wollen die Population einer Spezies, deren Entwicklung, Einflußgrößen etc. untersuchen ­> Aufnahme geeigneter Meßdaten, Auswertung, Modellierung der Entwicklung der Population, Simulationen, Voraussagen Vorgehensweise zur Lösung: Merkmale des Problems erfassen ⇩ Formulierung eines Lösungsweges ⇩ Formalisieren des Lösungsweges (Algorithmus) ⇩ Implementieren in einem Computerprogramm Dieser Weg wird oftmals mehrfach durchlaufen: abhängig von den Ergebnissen sind Änderungen des Algorithmus oder des Modells bis hin zur Neuformulierung des Problems nötig. Merkmale des Problems erfassen ­ Welche Daten sind erhältlich? ­ Was ist das gewünschte Ziel? Welche Ergebnisse ? ­ Welche Einflüsse sind wesentlich, welche vernachlässigbar? ­ Welche Randbedingungen sind zu beachten? ... im Beispiel: – Daten: Anzahl Tiere, nur zu diskreten Zeitpunkten meßbar, fehlerbehaftet – Ziel: statistische und graphische Datenauswertungen Modellierung der Entwicklung der Spezies, Anzahl als Funktion der Zeit Vorhersage durch Simulationen am Modell etc. Formulierung eines Lösungsweges ­ Eingangsdaten: Meßdaten ­ Wahl eines geeigneten Modelltyps (Idealisierung) ➢ Bestimmung der Modellparameter aus den Messungen ­ Berechnung statistischer Größen (Formeln anwenden) ­ Wahl von Visualisierungstechniken ­ Simulationen durch Lösen der Modellgleichungen ➢ Wahl von Methoden zur Lösung der Modellgleichungen ­ weitere Analyse durch Auswertung der Computerergebnisse Formalisieren des Lösungsweges (Algorithmus) ­ prinzipielle Aufeinanderfolge der Schritte in der Sprache grundsätzlicher algorithmischer Strukturen + Verifikation, d.h. Nachweis der Korrektheit Implementieren in einem Computerprogramm ­ Wahl einer geeigneten höheren Programmiersprache ­ Nutzung vorhandener Software, Funktionsbibliotheken Was ist ein Algorithmus – aus Sicht der Informatik? 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: Diskretheit: die Vorschrift kann präzise auf formale Weise beschrieben werden die Vorschrift besteht aus einer Folge von elementaren Einzelschritten Vollständigkeit: Determiniertheit: es werden alle möglichen Fälle behandelt bei gleichem Startzustand wird stets derselbe Endzustand erreicht Haltebedingung: Endzustand nach endlich vielen Schritten mit Ergebnis (dies ist eine mögliche, aufs Wesentliche beschränkte Definition, für eine vollständige 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 SELEKTION: Sequenz von Anweisungen, die nur unter bestimmten Bedingungen ● ausgeführt werden SCHLEIFE: Sequenz von Anweisungen, die mehrfach 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, matlab, ... : „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 name.exe 2.1 Grundsätzliche Elemente eines C­Programms Beispielprogramm: Hauptprogramm: #include <stdio.h> int main() { int i; /* i ist eine ganze Zahl */ i=1; printf(''i=%d\n'',i); return 0; } int main () { ... return 0; } wird durch die Funktion main gebildet, alle Befehle, die dort nacheinander abgearbeitet werden, sind in Klammern { ... } eingeschlossen = { Funktionsblock } Rückgabewert steht vor dem Funktionsnamen und ist vom Typ int, Rückgabe des Wertes über return­Anweisung (hier Rückgabe von 0) 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, kann sich über mehrere Zeilen erstrecken // i ist eine ganze Zahl ist eine Kommentarzeile 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 ); die Zeichenkette zwischen “...“ wird auf dem Bildschirm ausgegeben anstelle des Platzhalters %d wird dabei der in i gespeicherte Wert eingefügt. Bedeutung von \n ist Zeilenumbruch z.B. printf(“Geo\ngraphie“); Bildschirmausgabe: Geo graphie Präprozessor­Direktiven: #include <stdio.h> ­ Funktion printf zur Bildschirmausgabe muß dem Compiler bekannt gemacht werden ­ sie ist in der C­Ein/Ausgabe­Funktionsbibliothek stdio.h vorhanden ­ durch die include­Direktive wird der Quelltext der „Headerdatei“ stdio.h durch den Präprozessor in das Progamm 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 eine ganze Zahl: Typbez. %d ) &i gibt die Speicheradresse der Variablen i im Arbeitsspeicher an; dorthin wird der eingegebene Wert gespeichert. Also allgemeiner Befehlsaufbau: scanf(“Format des Eingabewertes“, Speicheradresse der Variablen für Eingabewert); mögliche Zahlentypen/Formate: Zahlentyp Format zeichen int short int %d %d %i %i long int %ld Ganzzahlige Variablentypen Zeichentyp Format zeichen float double %f %lf %e exponentielle Darstellung %le exponentielle Darstellung Reelle Variablentypen einfach bzw. doppelt genau char %c Variablentyp für Einzelzeichen 2. Programmstrukturen 2.2.2. Selektion: ­ wesentliche Komponente vieler Algorithmen ­ Fallunterscheidung (Verzweigung) im Programm abhängig von Bedingungen oder Auswahl aus einem Katalog (Menue) möglicher Aktionen Beispielfälle: ­ Reaktion des Programms abhängig von einer Eingabe, z.B. Wurzel aus einer Zahl ­ Reaktion abhängig vom Ergebnis einer Berechnung, z.B. Dreieck stumpfwinklig, rechtwinklig, spitzwinklig ­ Auswertung von Fehlermeldungen ­ Auswahl einer Aktion, z.B. für eine Meßwertreihe x1,x2, ... , xn 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 (s. weiter unten) (z.B. in Fortan SELECT, in Pascal CASE OF) if­Anweisung: ⇨ohne Alternative wenn Bedingung erfüllt ist tue etwas (führe Aktionen aus) (ende) if (Bedingung) { Anweisungen } ● Die Anweisungen im if­Rahmen werden genau dann ausgeführt, wenn die Bedingung WAHR ist, d.h. die Bedingung ist ungleich 0. ● Die Bedingung ist nicht erfüllt, wenn sie FALSCH ist, d.h. die Bedingung hat den Wert 0. Was ist eine Bedingung ? Eine Bedingung ist ein in der Programmiersprache sinnvoller Ausdruck. Was ist ein Ausdruck ? In einer Programmiersprache ist dies eine Aufzählung von Zahlen, Zeichen und Operatoren, die sich zu einem Wert auflösen lassen. z.B. A­2*(b+1) ergeben sich aus dem Programmlauf zuvor für die Variablen A und b z.B. die Werte A=1 und b=0 so ist A­2*(b+1)=­1 . ⇨ mit Alternative wenn Bedingung erfüllt ist tue dies (führe Aktionen aus) ansonsten tue das (führe alternative Aktionen aus) (ende) if (Bedingung) { Anweisungen } else { Anweisungen } wenn Bedingung_1 erfüllt ist führe Aktion_1 aus ⇨ mehrere Fälle: sonst wenn Bedingung_2 erfüllt führe Aktion_2 aus sonst wenn Bedingung_3 erfüllt führe Aktion_3 aus ... sonst 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 (Entscheidung/Verzweigung)besteht mindestens aus der if­.Anweisung, die else­if­Zweige und der alternative else­Zweig sind optional. 2.2.2 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(x1)+f(x2)+...+f(xn)=∑ f(xi) o.ä. Berechnungen, ­ rekursive Funktionsberechnungen xk=f(xk­1) ­ Arbeit mit Feldern von Variablen Varianten: (in C) a) Anzahl der Durchläufe ist festgelegt: for­Schleife b) Anzahl der Durchläufe ist durch Bedingung(en) gesteuert: while­Schleife In anderen höheren Programmiersprachen ist die Syntax der Schleifenstrukturen ähnlich. for­Schleife: für k = Startwert , ... , Endwert (mit Schrittweite s) führe Aktion(k) aus (ende) for (Ausdruck1; Ausdruck 2; Ausdruck 3) { Anweisungen } hier bedeutet: Ausdruck 1 ... i.a. Zuweisung eines Startwertes an die Laufvariable (Initialisierung) wird genau einmal, am Anfang, ausgeführt Ausdruck 2 ... Abbruch­Bedingung (meist der Test, ob Laufvariable Endwert erreicht hat) wird zu Beginn jedes Schleifendurchlaufes geprüft Ausdruck 3 ... Aufdatierung der Laufvariablen („Weiterzählen“) wird am Ende jedes Schleifendurchlaufes ausgeführt while­Schleife: zwei Varianten in C ⇨anfangsgeprüfte Schleife: solange Bedingung erfüllt ist (ende) C­Syntax: tue etwas (führe Aktion aus) while (Bedingung) { Anweisungen } Die Bedingung ist dabei einfach wiederum 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) C­Syntax: solange Bedingung erfüllt ist do { Anweisungen } while (Bedingung); (Achtung! Semikolon nicht vergessen!) Sinnvoll, wenn mindestens ein Durchlauf gefordert ist. Zweite Variante einer SELEKTION: Auswahl 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) (ende Fall 2) trifft kein Fall zu: führe Aktion_alternativ aus 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 Schlüsselwort case case + Konstante: 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)