Inhalt Vorstellung Robert Lorenz Vorlesung Informatik I Angebot der Uni + Ihr Beitrag Universität Augsburg Vorlesungs- und Übungsbetrieb, Prüfungsmodalitäten, Klausuren Wintersemester 2010/2011 Software, Literatur/Materialien Prof. Dr. Robert Lorenz Was ist Informatik Lehrprofessur für Informatik Inhalt der Vorlesung Informatik 1 1. Organisatorisches und Motivation 1 2 Vorstellung Robert Lorenz Vorstellung Robert Lorenz Kurzer Berufsweg Lehrprofessur für Informatik Einführung in die praktische Informatik: geb. 1969 Informatik I (WS): Rechnerarchitektur, Algorithmus-Begriff, Programmieren in C Informatik II (SS): Objektorientierter Softwareentwurf mit UML, Programmieren in Java Programmierkurse (C: WS, Java: SS) Studium der Mathematik in Eichstätt (1990 – 1996) Promotion in Mathematik 2001 (Eichstätt) Habilitation in Informatik 2006 (Eichstätt) Finanziert aus Studiengebühren (Sie bestimmen mit!) Laufzeit: 2+2+2 Jahre seit 1.7.2008: Lehrprofessur für Informatik (finanziert aus Studiengebühren) Einheitliche Betreuung der ersten zwei Semester Verbesserung der Programmierausbildung 3 4 Vorstellung Robert Lorenz Das Angebot des Lehrstuhls Forschungsinteressen: Vorlesungen Design, Simulation, Verifikation, Synthese nebenläufiger Systeme: dienen der Vermittlung von abstrakten Konzepten, Wissen, Problemlösungsstrategien dienen der Anregung und Orientierung Geschäftsprozesse (Web-)Services Kommunikationsnetzwerke Verteilte Steuerungen (eingebettete Systeme) haben keinen Anspruch auf Vollständigkeit Mit theoretisch fundierten Methoden praktisch relevante Probleme lösen sollten durch selbstständiges Erarbeiten von Inhalten ergänzt werden Einheit von Lehre und Forschung 5 6 Das Angebot des Lehrstuhls Das Angebot des Lehrstuhls Übungen Service dienen der konkreten Anwendung der abstrakten Konzepte Folien und Vorlesungsmitschrift online fördern dadurch deren Verständnis Beispielprogramme zur Vorlesung online verschiedene Übungsangebote: Musterlösungen zu allen Aufgaben online http://www.informatik.uni-augsburg.de/lehrstuehle/inf/ Übungsblätter als „Hausaufgaben“ (Korrektur, Musterlösungen) Übungsgruppen (Vorrechnen von Lösungen) Betreutes Programmieren Betreute Themen im Studentenforum http://studentenforum.uni-augsburg.de/ 7 8 Das müssen Sie leisten Das müssen Sie leisten Studium selbstständig organisieren Eigenstudium (8-10 Stunden/Woche) Studien- und Prüfungsordnung lesen zu Prüfungen und Lehrveranstaltungen anmelden Engagement in Gremien (Fachschaft Studienbeiträge) Gruppenarbeit: anderen Inhalte erklären am meisten profitieren die Erklärer Grundlagen schaffen zum Lösen der Hausaufgaben nicht die Aufgaben selbst aufteilen! Probleme frühzeitig artikulieren Herausforderungen annehmen/suchen Übungsaufgaben lösen Vorlesung nachbereiten und ergänzen über den Tellerrand hinaus schauen Inhalte hinterfragen auf Vorlesung/Übungsgruppe vorbereiten Präsenzstudium (6 Stunden/Woche) Vorlesung: Selektiv Mitschreiben, Mitdenken, Fragen stellen Übungsgruppen: Vorrechnen, Fragen stellen, Diskutieren, Mitarbeiten 1 LP = 30 Stunden: 8 LP = 240 Stunden 1 Semester = 15 Wochen: 16 Stunden/Woche 9 10 Verwaltungssysteme Verwaltungssysteme LectureReg: Verwaltungssystem der Lehrstühle https://peaches.informatik.uni-augsburg.de/lecturereg/ STUDIS: Verwaltungssystem des Prüfungsamts https://www.studis.uni-augsburg.de/studisaugsburg/fai/ Anmeldung zu Übungsgruppen (18.10. - 22.10.) Anmeldung zu Klausuren (1.12. - 10.12. + 7.1. - 17.1.) Abfrage von Ergebnissen Anmeldung zu Prüfungsmodulen (7.1. - 17.1.) Teilnahme an den Klausuren ohne STUDIS-Anmeldung ist NICHT möglich Anmeldefristen: Lehrstuhl-Webpage, Rundmails, Vorlesung Anmeldefristen: Lehrstuhl-Webpage, Rundmails, Vorlesung Der Lehrstuhl ist nicht für Studis zuständig Bei Problemen: Prüfungsamt! 11 12 Vorlesungsbetrieb Übungsbetrieb Zwei Vorlesungen pro Woche im Hörsaal 1 (HS1) Montag 10:00 – 11:30 Mittwoch 12:15 – 13:45 Übungsblätter Folien zur Vorlesung http://www.informatik.uni-augsburg.de/lehrstuehle/inf/ Bearbeitung (nur) in Teams von 2 bis 3 Studenten einer Übungsgruppe 1 Übungsblatt/Woche, Ausgabe Montags (Start 25.10.) unter http://www.informatik.uni-augsburg.de/lehrstuehle/inf/ auch ausgedruckt (4 Folien/Seite) Bearbeitungszeit 1 Woche Jede Übungsaufgabe bringt 1 Übungspunkt Übungspunkte benötigt man für die Klausurzulassung 13 14 Übungsbetrieb… Übungsbetrieb Übungsblätter Übungsgruppen Abgabe… Geleitet durch Tutor (Student aus höherem Semester) …bis Montag, 12 Uhr: …per Mail an den Tutor der eigenen Übungsgruppe …und schriftlich in Vorlesungs-Briefkasten im Informatikgebäude Besprechen und Vorrechnen der Übungsblätter (nach deren Abgabe und Korrektur) Rückgabe der korrigierten Übungsblätter Angabe von… Start: 25.10. (Kennenlernen, Teambildung, Fragen) …Name+Matrikelnummer aller Teammitglieder …und Nummer der Übungsgruppe Vorrechnen einer Aufgabe bringt einen Übungspunkt Übungspunkte benötigt man für die Klausurzulassung 15 16 Übungsbetrieb Übungsbetrieb Übungsgruppen Übungsgruppen 13 Gruppen zu maximal 20-25 Teilnehmern Anmeldung: Automatische Verteilung auf die Gruppen durch Lehrstuhl Vorregistrierung und Angabe von Prioitäten notwendig 1. Unter https://peaches.informatik.uni-augsburg.de/lecturereg/ in Vorregistrierungs-, Lehramts- oder Wiederholergruppe (Anmeldefrist bis 22.10.2010, Mitternacht) Wiederholergruppe (zur Verwaltung, für Rundmails): 2. Vorregistrierungsgruppe: Zusätzlich Angabe von Prioritäten unter http://141.78.96.4/PrioMan/ (Anmeldefrist bis 22.10.2010, Mitternacht) Klausurzulassungen ab WS 2008/2009 sind gültig Anmeldung bei keiner Teilnahme am Übungsbetrieb Lehramtsgruppe (zur Verwaltung, für Rundmails): Anmeldung als Lehramtsstudent (keine Klausurteinahme), falls keine Teilnahme am Übungsbetrieb 3. Wir starten Algorithmus zur optimalen Einteilung gemäß Prioritäten keine Ausnahmen, Einteilung gültig ab 25.10.2009, Bekanntgabe am Wochenende online (Lehrsuhl-Webseite) 17 18 Übungsbetrieb Übungsbetrieb Betreutes Üben/Programmieren Globalübung Bearbeiten zusätzlicher Übungs-/Programmier-Aufgaben mit Unterstützung durch Tutoren Mittwoch, 14.00 – 19.00 Räume 1001 N + 1002 N (neues Gebäude) Beginn: 27.10. Nach Korrektur eines Übungsblatts Fragen, häufige Fehler, alternative Lösungen, Nachbetrachtungen, kein Vorrechnen Betreuung durch den Lehrstuhl Dienstag, 15.45 – 17.15 Raum 1058 N (neues Gebäude) Beginn: 16.11. Zusatzaufgabe bringt einen Übungspunkt Übungspunkte benötigt man für die Klausurzulassung 19 20 Übungsbetrieb Übungsbetrieb Verbreitung von Lösungen Rechnerräume Übungsleistungen sind Teil der Prüfungsleistung 1001 N (neues Gebäude) 1002 N (neues Gebäude) Verbreitung von Lösungen nur eingeschränkt erlaubt: 1005 N (neues Gebäude) innerhalb des Übungsblatt-Teams nach Besprechung in letzter Übungsgruppe 134 T (Physikgebäude) Nach der Besprechung in letzter Übungsgruppe: Wir unterstützen Veröffentlichung kommentierter Lösungen Wir stellen kommentierte Musterlösungen online 21 22 Prüfungsmodalitäten Prüfungsmodalitäten Für ALLE gilt: Für ALLE gilt: Am Semesterende: 1. Klausur Vor Veranstaltungsbeginn nächstes Semester: 2. Klausur Man soll zielgerichtet studieren, d.h. jede Prüfungsmöglichkeit (jedes Klausurangebot) wahrnehmen Anmeldung notwendig unter Studis und LectureReg Achtung: Studis-Anmeldung führt zur Bewertung auch bei Nicht-Teilnahme (als nicht bestanden) Nicht zielgerichtet zu studieren hat Nachteile Je nach Studiengang unterscheiden sich Anmelde-Modalitäten Anzahl der Prüfungsversuche Erhöhung des Lernaufwands (über die Ferien alles vergessen) mehr Überschneidungen mit anderen Veranstaltungen Probleme bei Anträgen auf Fristverlängerung Bereiten Sie sich aus denselben Gründen gleich auf die 1. Klausur gründlich und gewissenhaft vor 23 24 Prüfungsmodalitäten Prüfungsmodalitäten Für Bsc. Informatik/Informatik&Multimedia ab PO 2008 gilt: Für Bsc. Informatik/Informatik&Multimedia nach PO 2008 gilt: Nach dem 3. Semester müssen zur Orientierungsprüfung zählende Prüfungen bestanden sein u.a. in Informatik I, Informatik II, Programmierkurs, … Jede Klausur ist ein eigenes Prüfungsmodul für jede Klausur (Prüfung) ist Studis-Anmeldung erforderlich Sonderregelung: Man kann mit 2. Klausur Note verbessern in Informatik 1 (und Informatik 2) Damit hat man faktisch: 3 Prüfungsversuche in Informatik I 2 Prüfungsversuche in Informatik II 5 Prüfungsversuche im Programmierkurs 25 26 Prüfungsmodalitäten Prüfungsmodalitäten Für Bsc. Wirtschaftsinformatik gilt: Für Bsc. Wirtschaftsinformatik gilt: Einführung in die Informatik = Informatik 1 Einführung in die Softwaretechnik = 1. Hälfte Informatik 2 Jede Klausur ist ein eigenes Prüfungsmodul für jede Klausur (Prüfung) ist Studis-Anmeldung erforderlich Bei Bestehen kann die Note nicht mehr verbessert werden 27 Informatik 1 (und Informatik 2) sind Pflichtveranstaltungen müssen bis spätestens zum 8. Semester bestanden sein Nach dem 2. Semester müssen für Orientierungsprüfung notwendigen Leistungspunkte (30 LP) gesammelt sein Informatik 1 (Informatik 2) können/müssen aber nicht eingebracht 28 Prüfungsmodalitäten Programmierkurs Für alle anderen gilt: Teilnehmer: Beide Klausuren zählen zusammen als ein Prüfungsmodul nur eine Studis-Anmeldung vor 1. Klausur nötig Es zählt die bessere Note aus beiden Klausuren Anzahl der Prüfungsversuche, Obergrenze Semesteranzahl bitte eigene PO lesen! Verpflichtend für Bsc. Informatik/Informatik&Multimedia Kann nur von Bsc. Informatik/Informatik&Multimedia belegt und eingebracht werden Angebote: Im WS: Programmiersprache C Im SS: Programmiersprache Java 29 30 Programmierkurs Programmierkurs Termine und Modalitäten: 1. Prüfung: 5 Tagesprüfungen jeweils zum Tagesthema Integriert in Veranstaltungsblock jeweils 60-90-minütige Programmieraufgabe 1 Woche Blockveranstaltung täglich 9 – 16 Uhr Teilnehmerzahl/Block: maximal 30 Im WS: 2 Blöcke, im SS: 1 Block Inhalt: Vertiefung des Programmierstoffs aus Informatik 1 (im WS) bzw. Informatik 2 (im SS), 5 Tagesthemen 31 2. Prüfung: Vor Veranstaltungsbeginn nächstes Semester Eine 5-6-stündige Prüfung mit 5 Aufgaben Ohne Veranstaltungsblock 32 Klausur Klausur Zulassung (gilt für alle trotz unterschiedlicher POs!) Zulassung Mindestens 20 Übungspunkte aus… Mindestens 1 mal Vorrechnen in der Übungsgruppe …Bearbeitung von Übungsblättern (ca. 11-12 Stück) 1 Punkt für jede richtig bearbeitete Aufgabe 4 Aufgaben pro Übungsblatt Anmeldung zur Klausur in LectureReg und Studis …Vorrechnen in den Übungsgruppen 1 Punkt jede vorgerechnete Aufgabe Maximal 12 mal Vorrechnen zählen …Bearbeitung der zusätzlichen Aufgabe im betreuten Programmieren (ca. 14-15 Termine) 1 Punkt für richtig bearbeitete Aufgabe 33 34 Klausur Klausur Bewertung Alte Zulassungen Für je 5 Punkte über der Zulassungsgrenze (20 Punkte) gibt es einen Bonuspunkt es sind maximal ca. 10-11 Bonuspunkte erreichbar Zulassungen/Bonuspunkte seit WS08/09 bleiben erhalten Zulassungen vor WS08/09 zählen nicht In der Klausur sind 120 Punkte erreichbar Zum Klausurergebnis werden die Bonuspunkte hinzugezählt Das Prüfungsmodul ist bestanden mit 50% der Gesamtpunkte (also 60 Punkten) Klausurnote zählt zur Endnote 35 36 Klausur Klausur Termine Vorbereitung 1. Klausur: Teil 1: 22.12., HS 1 + 1001 Jura, 60 Minuten 12.00 – 13.00 Uhr (Block 1) 13.00 – 14.00 Uhr (Block 2) Stoff: bis einschließlich Übungsblatt 6 (29.11.) Teil 2: 9.2., HS 1 + 1001 Jura, 60 Minuten 12.00 – 13.00 Uhr (Block 1) 13.00 – 14.00 Uhr (Block 2) Punkte beider Teile zusammengerechnet bewertet Erfahrungen: < 20%, die die 1.Klausur nicht bestehen, schaffen die 2.Klausur ca. 30% bestehen die erste Klausur nicht Bonuspunktedurchschnitt Nicht-Bestehen: 3-4 (wenig geübt) Bonuspunktedurchschnitt Bestehen: 6-8 (viel geübt) > 95% würden auch ohne Bonuspunkte bestehen Bereiten Sie sich schon auf die 1.Klausur ausreichend vor Üben Sie viel und gleichmäßig über das Semester 2. Klausur: 1-2 Wochen vor Folgesemester, 120 Minuten 37 38 Klausur Klausur Vorbereitung Vorbereitung Lernen Sie nicht auswendig, sondern verstehen Sie den Stoff: Wiederholen Sie alte Übungsaufgaben ohne Benutzung der Lösung Setzen Sie Inhalte in Beziehung zueinander Hinterfragen Sie Inhalte: Wieso mache ich etwas so und nicht anders? Verschaffen Sie sich einen kompletten Überblick über den Stoff Eine Lösung nachvollziehen können reicht nicht; Sie müssen selbst auf die Lösung kommen. Sehen Sie nur in die Musterlösung, wenn sie an einer Stelle absolut nicht weiterkommen. Arbeiten Sie den roten Faden heraus Wenn ihre Lösung nicht mit der Musterlösung übereinstimmt, überprüfen Sie, ob die Musterlösung falsch oder alternativ ist Erstellen Sie sich eigene Zusammenfassungen in unterschiedlicher Detailliertheit (Abstraktionsebene) Verschaffen Sie sich andere Perspektiven auf die Inhalte durch Bücher 39 Üben Sie „schriftliches“ Programmieren, d.h. üben Sie, Programme auf einem Blatt Papier aufzuschreiben 40 Software Software Programmiersprache C: Entwicklungsumgebungen: Editor-Programme zum bequemeren Programme-Schreiben GNU Compiler Collection Verfügbar unter Windows, Linux und Mac Dürfen Sie nach Ihrer Wahl verwenden Aber: der Lehrstuhl unterstützt kein bestimmtes Programm Installationshilfe: Tutoren, Studentenforum Frei verfügbare Programme: Zur Übersetzung/Ausführung von C-Programmen Dev-C++ CodeBlocks ... In den Rechnerräumen zur freien Verwendung installiert 41 42 Literatur/Materialien Literatur/Materialien Programmiersprache C Programmiersprache C C Programmieren von Anfang an: H. Erlenkötter, rororo, 2008 Programmieren in C: B. W. Kernighan, D. M. Ritchie, A.-T. Schreiner, und E. Janich, Hanser, 1990 sehr leichte Einführung geht pädagogisch vor führt in vielen Themen nur in Grundlagen ein vermittelt kaum vertieftes Wissen ausreichend für die ersten 6 Wochen geeignet für Programmierneulinge (auch zum Kauf) Das Standard- und Nachschlagewerk: komplette Darstellung von C Inhaltlicher Aufbau/Beispiele anspruchsvoll, weniger pädagogisch ideal zur Ergänzung der Vorlesung ergänzend notwendig nach ca. 6 Wochen Informatik-Hauptfächler/Programmiererfahrene: unbedingt kaufen! 43 44 Literatur/Materialien Literatur/Materialien Programmiersprache C Theoretische Inhalte Problem - Algorithmus - Programm: R. Richter, P. Sander und W. Stucky, Teubner, 1993 Online-Dokumentationen zum selbst recherchieren C Standard Bibliothek: http://www2.hs-fulda.de/~klingebiel/c-stdlib/ dient der Vorlesung als Vorlage wird leider nicht mehr verkauft GNU C Library: http://www.gnu.org/software/libc/manual/html_mono/libc.html 45 Literatur/Materialien 46 Literatur/Materialien Grundsätzliches Theoretische Inhalte Einführung in die Informatik: Gumm, Sommer sehr umfassend, enthält auch Informatik 2 – Anteile Vorlesungsrelevante Kapitel: 1. Informationsdarstellung, Zahlendarstellungen, Hardware,… 2. Programmiergrundlagen, Problem-Spezifikation,…(zu wenig) (3. Java: relevant für Informatik 2) 4. Algorithmen/Datenstrukturen, Such-und Sortierverfahren (zu viel) 5. Rechnerarchitektur, Maschinensprachen, Assembler (zu viel) (8. Internet: relevant für Informatik 2) trifft leider den Vorlesungsinhalt nicht genau 47 Selbstständig in Bibliothek/Internet recherchieren! alternative Bücher anlesen/durchlesen Inhalte einordnen bzgl. Relevanz für Vorlesung Vorlesungsinhalt „wiederentdecken“ Über den Tellerrand schauen Aktuelle Entwicklungen verfolgen 48 Literatur/Materialien Bei Fragen Über den Tellerrand geschaut http://studentenforum.uni-augsburg.de/ http://www.informatik.uni-augsburg.de/lehrstuehle/inf/ Erich Fromm: Die Furcht vor der Freiheit (Standardwerk zu Freiheit) David Gelernter: Machine Beauty – Elegance and the heart of technology (Schönheit und Technik) Volker Grassmuck: Freie Software – Zwischen Privat- und Gemeineigentum (Geistiges Eigentum und Open Source) Glyn Moody: Die Software-Rebellen (Standardwerk zur Entstehung von Linux) Eric S. Raymond: The Cathedral and the Bazaar (Programmieren und östliche Philosophie – Programmierer sind Künstler) Eric S. Raymond: The art of Unix programming (Standardwerk Open Source) [email protected] [email protected] [email protected] Sprechzeiten Mittwoch, 10:00 – 11:00, Raum 1023 N (neues Gebäude) Direkt nach der Vorlesung Joseph Weizenbaum: Die Macht der Computer und die Ohnmacht der Vernunft (Standardwerk zu Computer und Gesellschaft) Tom deMarco: Der Termin (IT-Consulting Guru) 49 Was ist Informatik? 50 Was ist Informatik? Wissenschaft der Verarbeitung, Speicherung und Übertragung von Information Namensbestandteile: Informatik = Information + Mathematik Was ist nun Information? Wissenschaft der Verarbeitung, Speicherung und Übertragung von Information Nachricht endliche Folge von Symbolen zur Speicherung/ Übertragung von Information vom konkreten Medium abstrahierte Form von Mitteilung Nicht alle Symbolfolgen stellen Nachrichten dar Die Syntax gibt an, welche Symbolfolgen Nachrichten sind Beispiel: Nachricht: „Lorenz“ 51 52 Was ist Informatik? Was ist Informatik? Wissenschaft der Verarbeitung, Speicherung und Übertragung von Information Wissenschaft der Verarbeitung, Speicherung und Übertragung von Information Information Daten einer Nachricht durch Interpretation zugeordnete Bedeutung Paare aus Nachricht und zugeordneter Information ebenfalls vom Medium abstrahiert Die Semantik gibt die Bedeutung von Symbolfolgen an Beispiel: Nachricht: „Lorenz“, Semantik: Nachname 53 Was ist Informatik? 54 Was ist Informatik? Wissenschaft der Verarbeitung, Speicherung und Übertragung von Information Informatik ist eine präzise Wissenschaft Machen Ihnen Mathematik oder naturwissenschaftliche Fächer Spaß? Theoretische Informatik (Einführung in die theoretische Informatik, Informatik III, Diskrete Strukturen, Mathematik für Informatiker, …) Praktische Informatik (Informatik I+II, Programmierkurs, Softwareprojekt, Softwaretechnik, Datenbanken, …) Technische Informatik Informatik ist eine konstruktive Wissenschaft Interessieren Sie sich für Computerprogramme, Kommunikationsnetzwerke, das Internet? Gestalten Sie gern Neues und sind kreativ? (Systemnahe Informatik, Kommunikationssysteme,… ) Angewandte Informatik (Wirtschaftsinformatik, Geoinformatik,…) Definition, Beziehungen: eigene Recherche, z.B. Wikipedia, Gesellschaft für Informatik (GI), … (Übungsaufgabe) 55 56 Was ist Informatik? Was ist Informatik? Aufklärung von Klischees Aufklärung von Klischees Informatiker entwerfen Anwendungen (Anwendungen nutzen ist Sache der Anwender) Nachhaltige Ideen in der Informatik sind theoretisch fundiert! (Schnelle ad-hoc-Lösungen haben langfristige Folgeprobleme) Informatik ist die Kunst, sich das Programmieren zu erleichtern (Informatik : Programmieren = Architektur : Bau) Was zählt ist das Können (nicht der Abschluss) (Abschluss für Einstieg, praktisches Können für mittelfristigen Erfolg, theoretisches Können für langfristiges Behaupten) Informatiker arbeiten zusammen mit anderen Menschen (in Teams, in Projekten, mit Kunden, als Führungskräfte, …) Informatik ist mehr als PC+Internet (98% der Chipproduktion für eingebettete Systeme) 57 58 Das lernen Sie an der Uni… Das lernen Sie in Informatik 1 …und brauchen Sie in Wissenschaft und Wirtschaft: Inhalt: F Eigenverantwortung, Selbstständigkeit, Engagement Fachinhalte kommunizieren (aufschreiben und vortragen) Probleme, Zusammenhänge, Trends erkennen Aktuellen Stand der Technik kennen Unmögliches für möglich halten Strukturieren, Formalisieren, Abstrahieren Teamfähigkeit Wie man Probleme der Informationsspeicherung und Informationsverarbeitung mit dem Rechner löst: Schwerpunkt liegt auf methodischen und fachlichen Grundlagen Voraussetzung für innovative Entwicklungen Erleichtert Einstellung auf neuartige technische Gegebenheiten Die Uni besteht nicht aus Kursen in aktuellen Anwendungen 59 Problem Algorithmus Programm 60 Das lernen Sie in Informatik 1 Praktisches Problem Das lernen Sie in Informatik 1 Programmieren ist also nur ein Teil des Vorlesungsinhalts Informationssuche Mustererkennung … Andere wichtige Fertigkeiten: Modellbildung, Abstraktion, formale Grundlagen Abstraktion Mathematisches Modell Kreativer Schritt Algorithmus Programmierung Programm Eingabedaten Ausgabedaten Funktionale Abhängigkeit exakte programmiersprachenunabhängige Formulierung mechanisch ausführbarer Abläufe für beliebig viele Instanzen (verständlich für den Benutzer) Formulierung des Algorithmus in der „Sprache“ der Maschine (verständlich für den Computer) 61 62 Abstraktion Abstraktion Betrachtung eines Problems ohne Kenntnis bestimmter Details auf verschiedenen Ebenen (aus verschiedenen Perspektiven) Arbeitsteilung Elektroniker / Hardware-Designer / Programmierer / Modellierer / … Welche Details sind „wesentlich“, welche „unwichtig“? abhängig von der Perspektive! Stabile Lösungen auf abstrakter Ebene bei Technologiewandel, Wiederverwendbarkeit hilft bei Fehlervermeidung gestattet einheitliche Sicht auf heterogene Welt gestattet Konstruktion aus Sicht des Benutzers gestattet Strukturierung komplexer Systeme 63 64 Inhalt Inhalt Theorie: Programmieren: Rechnerarchitektur Variablen und Konstanten Zahlen- und Zeichendarstellung Kontrollstrukturen (Fallunterscheidung, Wiederholung) Spezifikation von Problemen Funktionen Darstellung von Algorithmen Präprozessor und modularisierte Implementierung größerer Programme Eigenschaften von Algorithmen Zeichenketten und Felder Korrektheit von Algorithmen Zeiger Effizienz von Algorithmen Dynamische Speicherverwaltung Datenstrukturen Komplexe Datentypen 65 66 Zusammenfassung Alle haben die Chance mitzukommen (wir fangen bei „0“ an, kein Vorwissen nötig) Vorlesung Informatik I Ohne Mathematik geht nichts Universität Augsburg Wintersemester 2010/2011 Spaß am Computer/Programmieren hilfreich Prof. Dr. Robert Lorenz Wer sich engagiert, schafft auch den Schein Lehrprofessur für Informatik Ohne Üben kann man Programmieren nicht erlernen 67 Programmieren in C – Erste Schritte 1 Inhalt Kommandozeile Im einfachsten Fall erfolgen Aufruf und Ausgabe von Programmen per Kommandozeile Die Kommandozeile Andere Bezeichnungen: Befehlszeile, command-line interface - CLI, Konsole, Terminal Ein einfaches Programm Programm erstellen Die Kommandozeile ist Eingabebereich für die Steuerung von Software, typischerweise (aber nicht zwingend) im Textmodus Programm aufrufen Kommandos werden als Zeichenfolgen per Tastatur eingegeben Die Funktion printf 2 Kommandozeile 3 Kommandozeile Kommandos: Programmaufrufe Vordefinierte Kommandos zur Navigation im Dateisystem (abhängig vom Betriebssystem, Selbststudium) Steuerung der Ausführung über sog. Kommandozeilenparameter des Programms (Syntax: Selbststudium) Vordefinierte Kommandos zur Steuerung des Betriebssystems (weiterführend, benötigen wir nicht) Keine interaktive Befragung des Benutzers durch das Programm Automatisiertes Abarbeiten mehrerer Kommandos: Name eines ausführbaren Programms (.exe-Endung) Stapelverarbeitungs-Dateien (Batch-Dateien, weiterführend, benötigen wir nicht) Kommando ausführen Kommando eintippen und Eingabetaste drücken Bei Programmen: vorher ins Programmverzeichnis wechseln 4 5 Ein einfaches Programm Ein einfaches Programm Ein Programm ist ein Text bestehend aus Anweisungen Ein Programm ist ein Text bestehend aus Anweisungen In der einfachsten Form: Sequenz von Anweisungen (ähnlich einer Bedienungsanleitung): Anweisungen müssen „Computerverständlich“ sein direkt vom Computer ausführbar = Maschinensprache übersetzbar in Maschinensprache = höhere Programmiersprache (für Anweisung 1 den Menschen verständlich!) Definition von Programmiersprachen = für den Computer verständliche Sprachen Anweisung 2 … Nicht jeder Text ist als Programm interpretierbar Anweisung n Computer = Maschine, die man mit Programmen steuert 6 Ein einfaches Programm 7 Ein einfaches Programm Ein Programm ist ein Text bestehend aus Anweisungen /* bsp01.c */ #include <stdio.h> main(){ /* Anweisung 1 */ printf("Dies ist unser erstes C-Programm.\n"); /* Anweisung 2 */ printf("\nEs illustriert die Benutzung "); /* Anweisung 3 */ printf(" der Funktion 'printf'.\n"); } Ein Programm ist eine Textdatei, die nach bestimmten Grammatik- Regeln geschrieben wird Das Format der Textdatei ist nicht relevant Programme können mit jedem Texteditor geschrieben werden 8 9 Ein einfaches Programm Ein einfaches Programm /*bsp01.c*/#include<stdio.h>main(){/*Anweisung 1*/ printf("\nDies ist unser erstes C-Programm.\n");/* Anweisung 2*/printf("\nEs illustriert die Benutzung ");/*Anweisung 3*/printf(" der Funktion 'printf'.\n");} Dasselbe Programm, wenn auch völlig unleserlich für den Programmierer Dies ist unser erstes C-Programm. Es illustriert die Benutzung der Funktion 'printf'. _ Ausgabe erfolgt in der Kommandozeile (Grafische Programme: nächstes Semester) Man beachtet Formatierungsregeln aus Gründen der Fehlervermeidung, Lesbarkeit, Wartbarkeit und Veränderbarkeit 10 11 Ein einfaches Programm Ein einfaches Programm (1) Kommentar, auch mehrzeilig: optional erhöht Verständlichkeit wird bei der Programmausführung ignoriert (1) (2) (3) (4) (5) (6) (7) (2) Fügt Bibliotheksquellcode (Sammlung vordefinierter Funktionen) aus der Datei stdio.h ein Macht die printf-Funktion benutzbar /* bsp01.c */ #include <stdio.h> main(){ printf("\nDies ist unser erstes C-Programm.\n"); printf("\nEs illustriert die Benutzung "); printf(" der Funktion 'printf'.\n"); } (1) (2) (3) (4) (5) (6) (7) 12 /* bsp01.c */ #include <stdio.h> main(){ printf("\nDies ist unser erstes C-Programm.\n"); printf("\nEs illustriert die Benutzung "); printf(" der Funktion 'printf'.\n"); } 13 Ein einfaches Programm Ein einfaches Programm (3) Hauptfunktion main(){...} Ausführung beginnt mit Aufruf dieser Funktion () main hat keine Eingabeparameter {...} Anweisungsblock mit Anweisungen von main (1) (2) (3) (4) (5) (6) (7) (4),(5),(6) Aufruf der Funktion printf(format) hat Zeichenfolge format als Eingabeparameter dient formatierter Ausgabe der Zeichenfolge "..." definiert eine Zeichenkette \n Zeichenfolge für neue Zeile (n=new line) ; schließt Anweisungen ab /* bsp01.c */ #include <stdio.h> main(){ printf("\nDies ist unser erstes C-Programm.\n"); printf("\nEs illustriert die Benutzung "); printf(" der Funktion 'printf'.\n"); } (1) (2) (3) (4) (5) (6) (7) /* bsp01.c */ #include <stdio.h> main(){ printf("\nDies ist unser erstes C-Programm.\n"); printf("\nEs illustriert die Benutzung "); printf(" der Funktion 'printf'.\n"); } 14 Programm erstellen 15 Programm erstellen Zusammenfassung Entwicklungsumgebungen Ein Programm ist eine Textdatei, der Programmtext heißt Quellcode Eine Entwicklungsumgebung ist ein Texteditor der durch einige zusätzliche Funktionalitäten das Erstellen von Programmen vereinfacht: Quellcode lässt sich mit einfachen Texteditoren erstellen Syntax-Highlighting: Hervorheben von reservierten Wörtern Syntaxvervollständigung: Automatische Ergänzung von Schlüsselwörtern Grafische Benutzerschnittstelle für Übersetzung und Ausführung Automatische Textformatierung (Einrücken, …), … C-Programm-Dateien müssen die Endung .c haben C-Quellcode muss erst noch in Maschinensprache (= direkt ausführbarer Code) übersetzt werden Das Benutzen von Entwicklungsumgebungen ist erlaubt 16 17 Programm übersetzen und ausführen Programm übersetzen und ausführen später mehr Quellcode Quellcode Präprozessor Compiler Übersetzung Bibliotheken Übersetzung Linker ausführbarer Code ausführbarer Code 18 Programm übersetzen und ausführen Vom Quellcode zum Programm per Kommandozeile printf /* bsp02.c */ #include <stdio.h> main(){ printf("\nWir rechnen:"); printf("\n1 + 1 = %i\n1 * 1 = %i",1+1,1*1); printf("\n1 %% 1 = %i",1%1); } gcc –o prg01 bsp01.c gcc -o prg01 bsp01.c 19 Aufruf Übersetzer (überprüft auch Übersetzbarkeit) steht für output, es muss ein Dateiname folgen (prg01) Dateiname des ausführbaren Programms Dateiname des zu übersetzenden Quellcodes prg01 prg01 Aufruf und Ausführung des Programms 20 21 printf printf Platzhalter für einen ganzzahligen Wert %i (i=integer) der einzusetzende Wert folgt durch Komma getrennt dahinter es müssen genauso viele Werte folgen wie es Platzhalter gibt Werte werden von links nach rechts für Platzhalter eingesetzt Wert kann durch einen (Rechen-)Ausdruck gegeben sein (1+1) Ausgabe: Wir 1 + 1 * 1 % rechnen: 1 = 2 1 = 1 1 = 0 /* bsp02.c */ #include <stdio.h> main(){ printf("\nWir rechnen:"); printf("\n1 + 1 = %i\n1 * 1 = %i\n",1+1,1*1); printf("\n1 %% 1 = %i",1%1); } 22 printf 23 printf Grundrechenarten + addieren * multiplizieren % modulo=Divisionsrest Sonderzeichen Ausgabe durch Voranstellen von % %% gibt das %-Zeichen innerhalb eines Textes aus /* bsp02.c */ #include <stdio.h> main(){ printf("\nWir rechnen:"); printf("\n1 + 1 = %i\n1 * 1 = %i\n",1+1,1*1); printf("\n1 %% 1 = %i",1%1); } /* bsp02.c */ #include <stdio.h> main(){ printf("\nWir rechnen:"); printf("\n1 + 1 = %i\n1 * 1 = %i\n",1+1,1*1); printf("\n1 %% 1 = %i",1%1); } 24 25 Inhalt Geschichte der Informatik Vorlesung Informatik I Von-Neumann-Rechner Hardware Universität Augsburg Software zur Bedienung eines Rechners Wintersemester 2010/2011 Prof. Dr. Robert Lorenz Lehrprofessur für Informatik Rechnerarchitektur und -organisation 1 Inhalt 2 Geschichte der Informatik Wir machen uns klar: Das älteste Konzept der Informatik ist der Algorithmus Ein Computer ist eine (zugegebenermaßen sehr komplexe) elektrische Maschine, die nur tut, was wir ihr sagen (eingeben) …Ein PC ist also sowas wie ein komplizierter Kaffeeautomat… exakte Formulierung … (Mathematisches Modell, z.B. Programmiersprache) mechanisch ausführbarer Abläufe… Wir lernen jetzt: für beliebig viele Instanzen Grund-Aufbau und -Funktionsweise heutiger Rechner ohne technische Details abstrakte Sicht Nur soviel Details, dass wir glauben, dass es funktioniert 3 4 Geschichte der Informatik Geschichte der Informatik Das älteste Konzept der Informatik ist der Algorithmus Beispiel in Pseudocode-Darstellung: Berechnung des ggT's Eingabe: a,b in Ν (ganze, positive Zahlen) Methode: repeat r ← a mod b a ← b b ← r until r = 0 a = ggT(a,b) Ausgabe: Eingabe: a,b in Ν (a,b = Variablen = Platzhalter für konkrete Zahlen) Methode: repeat r ← a mod b a ← b b ← r until r = 0 a = ggT(a,b) (Wiederholung bis Bedingung wahr) (Wertzuweisung) (Wertzuweisung) (Wertzuweisung) (Bedingung) (Ausgabe) Ausgabe: Jedes konkrete für a,b eingesetzte Zahlenpaar ist eine Instanz EUKLIDischer Algorithmus (3. Jahrhundert vor Chr.) 5 Geschichte der Informatik 6 Geschichte der Informatik Wichtige Entwicklungen zu Entwicklung von Rechenmaschinen im 20. Jhd.: - Rechenvorschriften - theoretischen Konzepten von Rechenmaschinen - konkret konstruierten Rechenmaschinen von Adam Ries(e), Blaise Pascal, Gottfried Wilhelm Leibnitz, Charles Babbage, Konrad Zuse, John von Neumann, … (in dieser zeitlichen Reihenfolge) eigene Recherche (Übungsaufgabe) 7 1950: Elektronenröhren als Schaltelemente, 1000 elementare Operationen/sec., Kein Betriebssystem, nicht programmierbar - (schneller, kleiner, billiger, komplexer, mächtiger, benutzerfreundlicher) 2000 Halbleiterschaltkreise (hochintegriert, VLSI) 2000000000 elementare Operationen/sec.(2000 MHz) (Mehrbenutzer-)Betriebssysteme, programmierbar (Lochkarten, COBOL, FORTRAN, PASCAL, PROLOG, …) 8 Geschichte der Informatik Von-Neumann-Rechner (nach Burks, Goldstine und von Neumann, 1946) Fazit: Theoretisches, aber mechanisch umsetzbares, Konzept des Aufbaus/der Konstruktion eines Rechners Die technische Entwicklung zog notwendigerweise theoretische Entwicklung nach sich Grundlegende Theorie trotzdem nach wie vor gültig – z.B. Algorithmusbegriff (Vorteil von Abstraktion von technischer Realisierung) Noch heutige Rechner beruhen wesentlich auf diesem Konzept Werden wir als Grundlage besprechen neue Entwicklungen: Parallelrechner (im praktischen Einsatz) Quantencomputer (theoretisches Konzept, nur in sehr kleinem Maßstab realisiert) 9 Von-Neumann-Rechner 10 Von-Neumann-Rechner (nach Burks, Goldstine und von Neumann, 1946) Speicherwerk: Speicherung von Daten und Programmen Rechenwerk: Ausführung arithmetischer/logischer Operationen Steuerwerk Rechenwerk Eingabewerk Speicherwerk Steuerwerk: Steuerung des Programmablaufs Eingabewerk: Eingabe von Programmen / Daten in den Speicher CPU Ausgabewerk: Ausgabe von Ergebnissen vom Speicher Ausgabe CPU = Central Processing Unit = Zentraleinheit : Datenfluß : Steuerfluß 11 12 Speicherwerk Speicherwerk Speicherung von Daten und Programmen Unterteilt in gleich große Einheiten = Speicherzellen Für jedes Problem wird Bearbeitungsvorschrift (Programm) „von außen“ eingegeben und im Speicher abgelegt. Speicherzellen mittels eindeutiger Zahlen, sogenannter Adressen, durchnummeriert. Struktur unabhängig von den zu bearbeitenden Problemen 0 1 2 Programme und Daten im selben Speicher … … Direkter Zugriff auf Speicherzellen (Random Access) 13 Speicherwerk Speicherwerk Speichereinheiten: Unterteilt in gleich große Einheiten = Speicherzellen Bit (binary digit) Speicherplatz für die kleinstmögliche Informationsmenge: 1 oder 0, Ja oder Nein, Ein oder Aus Byte Gruppierung von acht Bit (2 hoch 8 = 256 Kombinationen) Zur Darstellung eines Zeichens k M G T P E = = = = = = 14 1024 = 210 ≅ 103 (k = Kilo) 10242 = 220 ≅ 106 (M = Mega) 10243 = 230 ≅ 109 (G = Giga) 10244 = 240 ≅ 1012 (T = Tera) 10245 = 250 ≅ 1015 (P = Peta) 10246 = 260 ≅ 1018 (E = Exa) 15 Jede Speicherzelle besteht aus einer festen Anzahl k von Bits (Typisch: k ∈ {8, 16, 32, 64}) Buchstaben, Zahlen und Befehle werden durch Folgen von 0en und 1en dargestellt (kodiert) (Wie? später) Eine Speicherzelle zur Speicherung eines Zeichens, einer Zahl oder eines Befehls 0 0000 0100 1 0100 1001 2 ... 16 Speicherwerk Speicherwerk Unterteilt in gleich große Einheiten = Speicherzellen In der Praxis: Kriterien: Schnelligkeit, Kapazität, Kosten, Verlustfreiheit Wie werden Programme gespeichert? Aufeinanderfolgende Befehle in aufeinanderfolgenden Speicherzellen Probleme: Große Kapazität, geringe Kosten = Langsamer Zugriff Schneller Zugriff = hohe Kosten, kleine Kapazität Ansprechen des nächsten Befehls: Erhöhen der Speicherzellen-Adresse um Eins Sprungbefehle (zu anderer Adresse) Lösung: In einem PC gibt es mehrere Arten von Speicher, die abgestimmt zusammenarbeiten (Speicherhierarchie) Ziel: Minimierung von Speicherzugriffszeiten 17 Speicherwerk Speicherwerk In der Praxis: In der Praxis: Interner Speicher (Primärspeicher): Register Interner Speicher (Primärspeicher): Preis pro Bit Zugriffszeit Kapazität hoch niedrig niedrig integrierter Teil des Speicherwerks schnell, da ohne mechanisch bewegte Teile Register: Cache: Cache-Speicher Arbeitsspeicher 18 niedrig hoch unmittelbar dem Steuerwerk zugeordnet Bindeglied zwischen Steuerwerk und Arbeitsspeicher RAM (Random Access Memory): häufig/voraussichtlich benutzte Befehle/Daten 100 Euro/MB, 512 KB, 24 GB/sec. Arbeitsspeicher: ROM (Read Only Memory): Systemfunktionen RAM (Random Access Memory): Daten/Programme 8 Cent/MB, 512 MB, 3,2 GB/sec. hoch 19 20 Speicherwerk Speicherwerk In der Praxis: In der Praxis: Externe Speicher (Sekundär-Speicher, Massenspeicher) RAM nicht Teil des Speicherwerks über Eingabe-/Ausgabewerk mit Rechner verbunden langsam, weil mit mechanisch bewegten Teilen Lesen und Schreiben Festplatte: magnetisch 0,01 Cent/MB, 500 GB, 0,06 GB/sec. Nach dem Einschalten: leerer RAM wird mit Programmen und Daten aus externen Speichern gefüllt CD/DVD: Flüchtiger Speicher: Strom weg = Daten weg optisch Vor dem Ausschalten: Speicherung (Kopie) der veränderten Daten auf die externen Speicher Realisierung: statischer RAM (SRAM) / dynamischer RAM (DRAM) 21 Speicherwerk 22 Speicherwerk In der Praxis: In der Praxis: DRAM SRAM Speicherzelle = Kondensator + Transistor Komplizierte Schaltung mit >6 Transistoren pro Bit einhundert mal schneller als DRAM keine Auffrischung Darstellung eines Bits: Bitwert 1 = Kondensator aufgeladen, Bitwert 0 = Kondensator ungeladen Leseanforderung: Transistor gibt die elektrische Ladung frei Kondensatoren verlieren Ladung durch Leckströme Auffrischung der Ladung einige tausend Male in der Sekunde Während der Auffrischung können keine Daten gelesen werden Nachteile: benötigt mehr Platz und Energie produziert mehr Hitze Beispiel: 512MB SRAM = 50000 Euro / 30 Kilowatt Strom / 1qm Platz Verwendung im Cache-Speicher Einsatz im Arbeitsspeicher 23 24 Speicherwerk Speicherwerk S/L-Kopf-Bewegung In der Praxis: Spindel Plattendrehung Festplatte In der Praxis: Festplatte Spur Lese/Schreibkopf Zylinder Darstellung eines Bits: Magnetisierter (Bitwert 1) oder nicht magnetisierter (Bitwert 0) kleinster Datenbereich auf der Magnetplatte Eine Festplatte kann man sich als Buch mit vielen Seiten, die mit 0en und 1en vollgeschrieben sind, vorstellen Scheibe Sektoren Lücken Spuren 25 Speicherwerk 26 Speicherwerk Funktionsweise (Schreiben/Lesen): Funktionsweise (Schreiben/Lesen): Kommunikation mit dem Steuerwerk über 3 spezielle Register (Ports): Steuersignale des Steuerwerks: AM (Adress-Memory Port) A (Adress Strobe): enthält Adresse desjenigen Speicherelements, in das geschrieben bzw. aus dem gelesen werden soll meldet dem Speicher, dass eine Adresse „gelesen“ werden soll D (Direction): WM (Write-Memory Port) gibt an, ob es sich um Lese- oder Schreibzugriff handelt in das durch AM adressierte Speicherelement zu schreibender Inhalt T (Data Transfer Acknowledge): RM (Read-Memory Port) Rückmeldung, dass Zugriff erfolgreich war (da Speicher relativ langsam ist) gelesener Inhalt des adressierten Speicherelements 27 28 Speicherwerk Rechenwerk Funktionsweise (Schreiben/Lesen): Aufgabe: Verarbeitung der Daten (z.B. arithmetische und logische Operationen, Vergleiche, logische Entscheidungen,…) Beispiel: Steuerwerk schreibt Wert 30 in Speicheradresse 500 Steuerwerk „schreibt“ 500 nach AM Steuerwerk „schreibt“ 30 nach WM Steuerwerk setzt D auf Schreiben Steuerwerk sendet A Speicherwerk „liest“ Adresse von AM Speicherwerk „liest“ Daten von WM Speicherwerk überschreibt die adressierte Speicherzelle mit 30 Speicherwerk sendet T (Steuerwerk kann nächste Anweisung ausführen) 29 Rechenwerk 30 Rechenwerk In der Praxis: Funktionsweise: Akkumulator-Register Operanden und Resultat einer Operation Art und Reihenfolge der auszuführenden Rechenwerk-Operationen werden durch das Steuerwerk bestimmt. Andererseits erhält das Steuerwerk Meldesignale über den Status der ALU. Status-Register Zustandsbeschreibung der Funktionseinheiten Funktionseinheiten (Arithmetic Logic Unit, ALU) Verknüpfung gespeicherter Operanden durch fest installierte elementare Operationen (Laden, Speichern, logisches UND/ODER, Addition, Subtraktion, ...) Realisiert durch Schaltungen und Schaltwerke (technische Informatik) 31 32 Steuerwerk Steuerwerk Aufgabe: In der Praxis: Oberste Steuerung des Rechners Alle anderen Komponenten erhalten ihre Befehle vom Steuerwerk Ausführung der im Programm niedergelegten Arbeitsvorgänge „Central Processing Unit“ (CPU) / Prozessor Wichtigster Maßstab für die Leistung eines Computers EVA-Prinzip: Alle Vorgänge in einem Prozessor laufen getaktet ab 1. Eingabe von im Speicherwerk gelesenen Daten (Lesen der Daten wie beschrieben) 2. Verarbeitung der Daten im Rechenwerk (Ausführung von Rechenoperationen wie beschrieben) 3. Ausgabe der Daten in das Speicherwerk (Schreiben der Daten wie beschrieben) (danach wieder von vorn mit dem nächsten Befehl, usw.) Ein Takt beinhaltet einen EVA-Zyklus Dateneingabe/-ausgabe = Stromfluss auf bestimmten Leitungen 33 Steuerwerk 34 Steuerwerk In der Praxis: In der Praxis: „Central Processing Unit“ (CPU) / Prozessor Natürliche Grenzen der Schnelligkeit eines Prozessors: Taktfrequenz = Häufigkeit der Takte/Zeiteinheit Erster IBM-PC (1980): 5 MHz = 5 Million Takte/Sek., Taktlänge=0,2µs Heute: 2GHz = 2000 MHz, Taktlänge = 0,5ns 1. Wie weit kommt ein Elektron in einem Takt auf einem 1 GHz Prozessor-Chip? Lichtgeschwindigkeit im Vakuum = 300 000 km/sec = 0,3 * 109 m/sec 1 GHz entspricht Taktlänge = 10-9 sec = 1ns Lichtstrecke = 30 cm/Taktlänge m = 1/1000 = 10 (m = Milli) µ = 1/1000 000 = 10-6 (µ = Mikro) n = 1/1000 000 000 = 10-9 (n = Nano) p = ... = 10-12 (p = Pico) f = ... = 10-15 (f = Femto) -3 Elektronenflussgeschwindigkeit in Kupfer = 2/3 * Lichtgeschwindigkeit Elektronstrecke = 20 cm/Taktlänge Geschwindigkeit abhängig von Leitungslängen 35 36 Steuerwerk Steuerwerk In der Praxis: In der Praxis: Natürliche Grenzen der Schnelligkeit eines Prozessors: Natürliche Grenzen der Schnelligkeit eines Prozessors: 2. Zuviel Abwärme 3. Langsamere Speicherzugriffszeiten Elektrischen Schaltungen erzeugen (linear proportional) Wärme Hohe Taktfrequenzen erzeugen eine Menge Abwärme Gefahr des Durchbrennens (in 10 – 30 Sekunden) Prozessoren müssen gekühlt werden (Kühlkörper + Lüfter) Schnelle Speicher = 1GHz (= sehr teure Speicher) Lösungen Parallelisierung von Speicherzugriffen Benutze kleinen schnellen Speicher (Cache) für bestimmte Daten Benutze Vorhersagelogik zur Bestimmung voraussichtlich benutzter Daten Geschwindigkeit abhängig Kühlungsmöglichkeiten Geschwindigkeit abhängig von Cachegröße und Qualität der Vorhersagelogik 37 Steuerwerk 38 Steuerwerk Funktionsweise Funktionsweise Instruktionsregister IR enthält Befehl, der gerade auszuführen ist 1. Holen von Befehlen (FETCH) Befehlszähler PC (program counter) enthält Adresse des aktuellen Befehls im Arbeitsspeicher 2. Entschlüsseln von Befehlen (DECODE) Befehl gemäß PC adressieren und laden Erkennen der Befehlsart Zerlegung in seine Bestandteile (Operations-, Operandenteil) . 3. Initiierung der Befehlsausführung (EXECUTE) Operand(en) adressieren und laden Befehl ausführen Ergebnis speichern Befehlszähler PC verändern 39 (Eingabe:E) (Verarbeitung: V) (Ausgabe: A) 40 Steuerwerk Steuerwerk Funktionsweise Funktionsweise Beispiel: „Erhöhe Inhalt der Speicherzelle 500 um 1“ Beispiel: „Erhöhe Inhalt der Speicherzelle 500 um 1“ Inhalt von PC: Inhalt von Speicherzelle 1000: Inhalt von Speicherzelle 500: Inhalt von PC: Inhalt von Speicherzelle 1000: Inhalt von Speicherzelle 500: 1000 der zu bearbeitende Befehl 17 1000 der zu bearbeitende Befehl 17 1. FETCH: 2. DECODE: Hole den Inhalt von Speicherzelle 1000 nach IR Erkenne, dass es sich um eine Addition des Inhalts von Speicherzelle 500 mit der Konstanten 1 handelt 41 Steuerwerk 42 Überblick Funktionsweise Peripheriegeräte Beispiel: „Erhöhe Inhalt der Speicherzelle 500 um 1“ Inhalt von PC: Inhalt von Speicherzelle 1000: Inhalt von Speicherzelle 500: zur Ein- und Ausgabe von Befehlen und Daten 1000 der zu bearbeitende Befehl 17 Rechnerkern, Befehlswerk, 3. EXECUTE: Hole Inhalt (17) von Speicherzelle 500 (Eingabe) Führe Addition aus (17+1) (Verarbeitung) Schreibe Ergebnis (18) nach Speicherzelle 500 (Ausgabe) CPU Speicher verarbeitet Befehle Steuerung Befehlsabfolge (gemäß Programm) enthält Daten und Befehle (Programme) Befehlszähler PC auf den nächsten Wert. 43 44 Genauerer Blick auf die CPU und Verbindungen Überblick BIOS Uhr Vorteile: Slots Grafik-Karte Prozessor Cache/ MemoryController Prinzip des minimalen Hardwareaufwandes – „nichts kann weggelassen werden“ Sound-Karte PCIController Prinzip des minimalen Speicheraufwandes ISDN-Karte eine Speicherzelle wird durch Angabe einer Adresse referiert der Inhalt einer Zelle ist ein Maschinenbefehl oder ein Datenwert (einheitliche Struktur, Größe) Div. Controller: Laufwerke Hauptspeicher Prozessor-Hauptspeicher Subsystem Bewertung BUS Schnittstellen: seriell, parallel USB, Firewire 45 Bewertung 46 Verbesserung Nachteile: Harvard-Architektur (Variante von von-Neumann): „von-Neumann-Flaschenhals“: Verbindung Hauptspeicher / CPU Für Programm und Daten gibt es getrennte Speicher und getrennte Zugriffwege zum Prozessor durch diesen Flaschenhals ist alles sequentiell (Nacheinander) zu transportieren: Operationsbezeichnungen, Daten, Adressen, … Engpass durch die zentrale Verbindungseinrichtung beim von-Neumann-Rechner wird erweitert Die Programmierung muss den sequentiellen Verkehr durch den von-Neumann-Flaschenhals planen (Scheduling: Aufgabe des Betriebssystems, weiterführende Vorlesungen) 47 Bei fast allen heutigen Mikroprozessoren ist der auf dem Prozessor-Chip befindlichen Primär-Cache-Speicher als Harvard-Cache-Architektur organisiert. Ansonsten alles wie in von-Neumann-Architektur 48 Buskonzept Buskonzept Voraussetzung für das Zusammenwirken der Funktionseinheiten: Breite eines Busses (auch Bandbreite) Übertragung von Daten, Befehlen, Kontroll-, Statusinformationen = Anzahl der parallel übertragbaren Bits (Anzahl der Leitungen) entweder: jeweils spezielle Übertragungs- bzw. Signalleitungen hohe Übertragungsgeschwindigkeiten Zu viele Leitungen oder: „Datensammelwege“, sogenannte Busse angesprochene Funktionseinheit holt sich vom Bus, was für sie bestimmt ist Bus Gerät 1 Gerät 2 ... Gerät n 49 Buskonzept 50 Hardware Netzbuchse für Stromversorgung Teile eines Busses: Zwei Lüfter Datenbus: Daten Breite = Anzahl der Bits eines Arbeitsspeicherelements Diskettenlaufwerk Ein/Aus-Schalter DVD / CD-ROM Buchsen für Maus und Tastatur USB Schnittstellen Serielle Schnittstelle Parallele Schnittstelle für Drucker Adressbus: Quelle/Ziel der Übertragung der Daten an Netz (Ethernet) Kontrollbus: Steuersignale Grafikkarte mit Anschluss für den Bildschirm SCSI-Karte Typenschild Resetknopf Kontrollleuchten Selbststudium Soundkarte ISDN-Karte 51 Firewirekarte 52 Hardware Hardware Selbststudium 1. Schacht für Laufwerke: DVD, CD, Diskette und Festplatten. Netzteil Prozessor (CPU) mit Lüfter Memory Controller Stromanschlüsse Prozessor (CPU) mit Lüfter 2. Schacht für Laufwerke: Weitere Festplatten. Grafikkarte Selbststudium Hauptspeicher PCI-Controller SCSI-Karte Sound-Karte ISDN-Karte Hauptplatine (Motherboard) Karten Batterie Firewire-Karte 53 Hardware Memory - Controller 54 Bedienung Schnittstellen (teilweise verdeckt) Sound, Netz, parallel, seriell, USB, Tastatur, Maus AGP Slot Selbststudium 5 PCI Slots CPU-Sockel für Pentium 4 Middleware Treiber 4 RIMM Sockel BIOS Schnittstellen Batterie PCI Controller Stecker für Floppy und Festplatten Netz-Anschluss 55 56 Bedienung Bedienung Schnittstelle: Treiber(programm): Konvention für eine Verbindung mit verschiedenen, aber gleichartigen Bauteilen z.B. Drucker verschiedener Hersteller Anpassungsprogramme zur Ansteuerung einer SW- oder HWKomponente (z.B. Druckertreiber, Maustreiber, ...) Regelung des Signal- und Datenaustauschs (Hardware + Software) Verbirgt die speziellen Anforderungen eines herstellertypischen Geräts vor den höheren SW-Schichten (z.B. einheitlichen Druckbefehl an Drucker anpassen) Treiber müssen installiert werden (Windows: mittels des setup.exe-Programm; Dateierweiterung .dll) oder sind im Betriebssystem integriert 57 Bedienung 58 Bedienung Betriebssystem: Betriebssystem: Macht die Hardware nutzbar: Prozessverwaltung (Prozess = eigenständig ablaufendes Programm mit eigenem Speicherbereich) Adressrechnung Ein-/Auslagern von Prozessen zwischen Haupt- und Plattenspeicher (virtuelle Speicherverwaltung), Prozessscheduling Kommunikation zwischen Prozessen Schutz vor dem Zugriff anderer Prozesse Prozessverwaltung Speicherwerwaltung Dateiverwaltung 59 60 Bedienung Bedienung Betriebssystem: Betriebssystem: Speicherverwaltung Dateiverwaltung Verwaltung von Code und Daten mehrerer Prozesse, die gleichzeitig im Hauptspeicher sind Zugriffsschutz Freispeicherverwaltung Zuordnung von Dateien und ihren Namen zu Teilbereichen der Festplatte Dateisystem: heute meist hierarchisch gegliedert (Verzeichnis, Unterverzeichnisse ) Namensgebung (mit Erweiterungen, z.B. .txt, .doc, .html, .jpg, .zip, .sys, .exe, ...) 61 Bedienung 62 Bedienung Middleware: Grafisches Bediensystem Softwareschicht, welche die Heterogenität der einer Anwendung zugrundeliegenden Systemplattform (Hardware, Netzwerke, Betriebssysteme, Progr.sprachen) „maskiert“ Täuscht eine homogene Systemplattform vor macht heterogenes System programmierbar (vs. Betriebssystem: macht Hardware nutzbar) Beispiele: Managementsystem für verteilte Datenbanken, RPC, Email, Remote Login, File Transfer, ... 63 Schnittstelle zur Anforderung von Leistungen des Betriebssystems (via Tastatur, Maus, etc.) im einfachsten Fall: Kommandozeile (vgl. DOS) heute üblich: graphisch / fensterorientiert ursprünglich erfunden von Xerox (70er Jahre) zuerst aufgegriffen für Macintosh-Rechner (Apple) heute Standard unter allen gängigen Betriebssystemen (Windows, Unix/Linux, Mac) 64 Inhalt Variablen Vorlesung Informatik I Wertzuweisung Universität Augsburg Konstanten Wintersemester 2010/2011 Ausdrücke (informal eingeführt) Prof. Dr. Robert Lorenz Die Funktion scanf Lehrprofessur für Informatik Programmieren in C – Variablen 1 Variablen 2 Variablen Motivation: Motivation: Wir wollen jetzt Werte (von Zahlen, Zeichen, ...) während des Programmlaufs über Tastatur eingeben Bisher: Zahlen, Zeichen, Zeichenketten waren im Code fest angegeben (als sog. Konstanten): Andere Werte anderes Programm Notwendig: Speicherung von Werten im Arbeitsspeicher Zugriff auf Werte über (Namen für) Speicheradressen Funktion für das Einlesen von Benutzereingaben Jetzt: Wie kann man mit Werten rechnen, die erst noch vom Benutzer eingegeben werden (also dem Programmierer nicht bekannt sind)? 3 4 Variablen Variablen /* bsp03.c */ #include <stdio.h> main(){ int x,y; printf("A d d i e r p r o g r a m m\n"); printf("Geben Sie zwei ganze Zahlen ein:\n"); scanf("%i",&x); scanf("%i",&y); printf("\nDie Summe von %i und %i ist %i",x,y,x+y); } A d d i e r p r o g a m m Geben Sie zwei ganze Zahlen ein: 3 12 Die Summe von 3 und 12 ist 15_ 5 Variablen 6 Variablen Eine Variable ist ein (vom Programmierer festgelegter) Name für eine Speicheradresse Zusammenfassung 1 Eine Variable hat eine Speicheradresse Programmierer deklariert eine Variable (legt den Namen fest) Bei der Übersetzung (in Maschinencode) wird der Variable eine feste Speicheradresse zugeordnet Eine Variable hat einen Namen, über den die Speicheradresse identifiziert wird Eine Variable hat einen Wert (den Wert, der an der Speicheradresse gespeichert ist) Über die Variable kann man im Programm auf den Wert zugreifen (lesen/schreiben), der an dieser Speicheradresse gespeichert sind 7 8 Variablen Variablen Variablen deklarieren Variablen deklarieren Unterschiedliche Typen von Werten/Daten (Zeichen, ganze Zahl, ...) benötigen unterschiedlich viel Speicherplatz (in Bytes) Wieviel Bit sind nötig, um eine ganze Zahl zu speichern? Ein Datentyp legt fest, wieviel Speicherplatz (in Bytes) notwendig ist, um einen Wert von diesem Typ zu speichern Platzsparende Speicherverwaltung: Bei Übersetzung des Programms soll der für die Speicherung der Daten notwendige Speicherplatz (in Bytes) festgelegt werden (nicht erst zur Laufzeit nach der Benutzereingabe) In einer Programmiersprache stehen verschiedene Datentypen, zur Verfügung (ganze Zahl, Fließkommazahl, Zeichen, ...) Deklaration legt Namen und Datentyp einer Variablen fest In einer Variable können nur Werte passenden Datentyps gespeichert werden 9 10 Variablen Variablen Variablen deklarieren Zusammenfassung 2 Ein Datentyp legt fest, wieviel Speicherplatz (in Bytes) zur Verfügung gestellt wird, um einen Wert diesen Typs zu speichern Eine Variable hat eine Speicheradresse (= Adresse der ersten Speicherzelle des reservierten Bereichs) Bei der Übersetzung steht durch Kenntnis des Datentyps fest, wieviel Platz (wieviele Speicherzellen) für die Variable reserviert werden muss Eine Variable hat einen Namen, über den die Speicheradresse identifiziert wird Der Größe des reservierten Speicherplatzes bestimmt die Anzahl der möglichen Werte (Variablen können nur endlich viele Werte annehmen!!!) 1 Byte = 8 Bit bietet Platz für 256 verschiedene Werte 11 Eine Variable hat einen Wert (den Wert der an der Speicheradresse gespeichert ist) Eine Variable hat einen Datentyp, der den verfügbaren Speicherplatz und die endliche Menge der möglichen Werte festlegt 12 Variablen Variablen Variablen deklarieren Variablen deklarieren erste Beispiele für Datentypen: erste Beispiele für Datentypen: int ganze Zahl (int=integer) benötigt 4 Byte: 232 Zahlen darstellbar Wertebereich: -231 bis 231-1 double Was passiert, wenn in einer Berechnung oder durch eine Benutzereingabe dieser Bereich verlassen wird? Bereichsüberlauf (später genauer) Dezimalzahl (in Fließkommadarstellung) benötigt 8 Byte Wertebereich: 2.22507 * 10-308 bis 1.79769 * 10308 -2.22507 * 10-308 bis -1.79769 * 10308 Es sind natürlich nicht alle Zahlen zwischen diesen Grenzen darstellbar Rundungsfehler (später genauer) 13 14 Variablen Variablen Variablen deklarieren Variablen deklarieren erste Beispiele für Datentypen: Syntax von Deklarationen, einfache erste Version: char Zeichen (Buchstabe, Ziffer, Sonderzeichen) benötigt 1 Byte: 28 Zeichen darstellbar Darstellung: später <Datentyp> <Name>; Beispiele: int alter; double zins; char geschlecht; 15 16 Variablen Variablen Variablen deklarieren Variablen deklarieren Regeln der Namensgebung: Namenskonventionen: Name Folge von Buchstaben und Ziffern, beginnend mit einem Buchstaben (der Unterstrich wird wie ein Buchstabe verwendet) Erster Buchstabe = Kleinbuchstabe Schlüsselworte (wie z.B. main, include) dürfen nicht verwendet werden Sprechende/aussagekräftige Namen verwenden Keine Abkürzungen verwenden Nicht mit Unterstrich beginnen (für den Anfang) Groß- und Kleinbuchstaben werden unterschieden 17 Variablen 18 Variablen /* bsp04a.c */ #include <stdio.h> main(){ int x,y; printf("M u l t i p l i k a t i o n s p r o g r.\n"); printf("Geben Sie zwei ganze Zahlen ein:\n"); scanf("%i",&x); scanf("%i",&y); printf("\n%i multipliziert mit %i ist %i",x,y,x*y); } 19 M u l t p l i k a t i o n s p r o g r. Geben Sie zwei ganze Zahlen ein: 300 500 300 multipliziert mit 500 ist _ Ergebnis kann Wertebereich überschreiten Falsches Ergebnis wird angezeigt 20 Variablen Variablen Geben Sie eine Zahl ein: 0.01234567890123456789 Endergebnis = _ /* bsp04b.c */ #include <stdio.h> main(){ double zahl; printf("Geben Sie eine Zahl ein: "); scanf("%lf",&zahl); printf("\nEndergebnis = %.20lf",zahl); } Ergebnis kann nicht exakt dargestellt werden Gerundetes Ergebnis wird angezeigt %lf %.20lf Platzhalter für Fließkommazahl (l=long,f=float) ... mit 20 Nachkommastellen 21 22 Variablen Variablen Wertzuweisungen Wertzuweisungen Speichert (schreibt) man einen Wert an der Speicheradresse einer Variable, so sagt man: Der Variable wird ein Wert zugewiesen Syntax von Wertzuweisungen: <Name> = <Ausdruck>; Ausdrücke sind Variablen, Konstanten und mittels Operationszeichen verknüpfte Variablen und Konstanten Ausdruck kann ausgewertet werden Wert des Ausdrucks wird der Variable zugewiesen (wird dazu ggf. automatisch in den Variablen-Typ umgewandelt) 23 24 Variablen Variablen Wertzuweisungen Wertzuweisungen Beispiele (Wert passt zum Typ): Beispiel (Wert passt nicht zum Typ): //mehrere Variablen gleichen Typs deklarieren: int x,y; //an Speicheradresse von x Wert 5 speichern: x = 5; //an Speicheradresse von y Wert von x speichern: y = x; //Wertzuweisung in der Deklaration vornehmen: int x = 5.5; (//x hat nun den Wert 5 (Information geht verloren) double y = 5; y//y hat den Wert 5.0... (Ergänzen des Werts) //an Speicheradresse von x den Wert der Summe der //Werte von x und y speichern: x = x + y; 25 Variablen 26 Variablen Wertzuweisungen (Automatische) Typumwandlung durch Wertzuweisung Enthält die Wertemenge eines Datentyps DT1 die Wertemenge eines Datentyps DT2, so sagt man: DT1 ist länger als DT2 Typ des Werts des Ausdrucks länger als der Typ der Variable: es geht Genauigkeit und Information verloren Typ des Werts des Ausdrucks kürzer als der Typ der Variable: keine Veränderung der Genauigkeit Information kann verloren gehen (veränderte Interpretation) 27 /* bsp05.c */ #include <stdio.h> main(){ int laenge, breite, flaecheninhalt; printf("\t F l a e c h e n i n h a l t\n"); printf("Laenge und Breite eines Rechtecks:\n"); scanf("%i",&laenge); scanf("%i",&breite); flaecheninhalt = laenge * breite; printf("\nFlaecheninhalt = %i",flaecheninhalt); } 28 Variablen Konstanten Konstanten sind feste (unveränderliche) im Code benutzte Werte F l a e c h e n i n h a l t Laenge und Breite: 3 2 Flaecheninhalt = 6_ Bei der Übersetzung wird jede benutzte Konstante an einer festen Speicheradresse gespeichert Es gibt unterschiedliche Typen von Konstanten (vgl. VariablenTypen), für die unterschiedlich viel Speicherplatz verwendet wird Auch hier nur endlich viele Werte pro Typ benutzbar Bei der Übersetzung wird der Typ einer Konstanten aus deren Darstellung/Schreibweise abgeleitet 29 Konstanten 30 Konstanten Ganzzahl-Konstante Fließkommazahl-Konstante Ziffernfolge ohne 0 am Anfang optional ‘-‘ – Zeichen am Anfang (negative Zahl) Typ: int Beispiel: 100 Festkommaschreibweise Zwei Ziffernfolgen durch ‘.‘ – Zeichen getrennt Erste Ziffernfolge ohne 0 am Anfang optional ‘-‘ – Zeichen am Anfang (negative Zahl) eine der Ziffernfolgen kann leer sein Typ: double Beispiele: 100.01, 3. (entspricht 3.0), -.4 (entspricht -0.4) Später: Oktal-, Hexadezimal-Schreibweise 31 32 Konstanten Konstanten Fließkommazahl-Konstante Zeichen-Konstanten Fließkommaschreibweise <Festkommazahl>e<ganzeZahl> (oder <Festkommazahl>E<ganzeZahl>) Typ: double entspricht: <Festkommazahl>*10<Dezimalzahl> Beispiele: -24.0e-1 (entspricht -2.4), 4.E2 (entspricht 400) Buchstaben werden in Hochkommas ‘‘ eingeschlossen Typ: char Beispiel: ‘A‘ Sonderzeichen werden durch sog. Escapesequenzen mit vorangestelltem ‘\‘ – Zeichen angegeben Zwischenraumzeichen: \n,\r,\t,\v,\b,\f Andere Sonderzeichen: \‘,\“,\\,\a,\? 33 Konstanten 34 Ausdrücke Zeichenketten-Konstanten Ausdrücke sind mittels Operationszeichen verknüpfte Variablen und Konstanten Werden in Anführungszeichen ““ eingeschlossen Können Escapesequenzen enthalten jede Escapesequenz zählt als ein Zeichen Diese Definition ist noch zu unpräzise: Was ist eigentlich ein Operationszeichen? Was heißt verknüpft? Weitere Details (Typ, …) später Wir definieren das aber erst später mathematisch! 35 36 Ausdrücke Ausdrücke Operationszeichen Operationen Jede Programmiersprache stellt eine Reihe von Operationszeichen zur Verfügung (z.B. Für arithmetische Operationen: +,-,*,/,%) Eine Operation ist eine Rechenvorschrift, die aus ihren Argumenten einen Wert berechnet Bei der Prgrammausführung wird für jedes Operationszeichen eine Operation ausgeführt Welche Operation ausgeführt wird, hängt vom Datentyp der im Ausdruck verwendeten Variablen und Konstanten ab Operationszeichen steht nicht immer für die gleiche Operation! Die Argumente einer Operation heißen Operanden Die Anzahl der Operanden einer Operation heißt Stelligkeit einstellig = unär (z.B. Negation einer Zahl) zweistellig = binär (z.B. Subtraktion von zwei Zahlen) Eine Operation schreibt den Datentyp ihrer Operanden vor 37 Ausdrücke 38 Ausdrücke /* bsp06.c */ #include <stdio.h> main(){ int x,y; printf("D i v i s i o n s p r o g r a m m\n"); printf("Geben Sie zwei ganze Zahlen ein:\n"); scanf("%i",&x); scanf("%i",&y); printf("\n%i dividiert durch %i ist %i",x,y,x/y); } D i v i s i o n s p r o g a m m Geben Sie zwei ganze Zahlen ein: 3 2 3 dividiert durch 2 ist 1_ Hier handelt es sich um ganzzahlige Division! 39 40 Ausdrücke Ausdrücke D i v i s i o n s p r o g a m m Geben Sie zwei ganze Zahlen ein: 3 2 3.00 dividiert durch 2.00 ist 1.50_ /* bsp07.c */ #include <stdio.h> main(){ double x,y; printf("D i v i s i o n s p r o g r a m m\n"); printf("Geben Sie zwei ganze Zahlen ein:\n"); scanf("%lf",&x); scanf("%lf",&y); printf("\n%.2lf dividiert durch %.2lf ist %.2lf",x,y,x/y); } Hier handelt es sich um Division auf Fließkommazahlen! %f %.2f 41 scanf Platzhalter für eine Fließkommazahl (f=float) ... mit zwei Nachkommastellen 42 scanf dient der Eingabe von Text aus der Kommandozeile (oder aus einer Datei) dient der Eingabe von Text aus der Kommandozeile (oder aus einer Datei) Argumente (ähnlich wie bei printf): - Format-Zeichenfolge mit Platzhaltern (für Datentypen) - Zu jedem Platzhalter eine Variable (passenden Typs von links nach rechts) mit &-Zeichen davor Verwendung - Nach Aufruf der scanf-Funktion erwartet Programm Benutzereingabe über Kommandozeile - Eingabe wird nach abschließendem Drücken der Eingabetaste eingelesen 43 44 scanf scanf dient der Eingabe von Text aus der Kommandozeile (oder aus einer Datei) Was passiert, wenn die Eingabe nicht zum Format passt? (Standard-) Eingabestrom (von Zeichen) Interpretation der Argumente: Zeichenfolge bestimmt das Format der Eingabe Adressoperator & (unär) liefert die Adresse einer Variablen An dieser Adresse wird der eingegebene Wert gespeichert Die Variable hat dann diesen Wert ( (später mehr: Rechnen mit Adressen, Adressen als Datentyp, …) Tastatur Eingabefunktionen: scanf() getchar() Programm Puffer (zeilenweise) Was passiert, wenn die Eingabe nicht zum Format passt? 45 scanf 46 scanf Beispiel für gültige/ungültige Eingaben: Eingabe: 21 Puffer: \n 1 2 scanf(“%i“,&x) [x hat Wert 21] Puffer: \n [\n bleibt stehen] Eingabe: 6 Puffer: \n 6 \n scanf(“%i“,&x) [überliest \n am Anfang] [x hat Wert 6] Puffer: \n 47 Beispiel für gültige/ungültige Eingaben (Fortsetzung): Puffer: \n Eingabe: a Puffer: \n a \n scanf(“%i“,&x) [Format passt nicht] [x hat weiter Wert 6] Puffer: \n a [Eingabe bleibt stehen] Eingabe: 4 Puffer: \n 4 \n a [Kein Zugriff auf 4] scanf(“%i“,&x) [Format passt nicht] [x hat weiter Wert 6] 48 scanf scanf Beispiel für gültige Anfangsstücke von Eingaben: Eingabe: 1.2a Puffer: \n a 2 . 1 scanf(“%f“,&r) [Anfangsstück passt] [r hat weiter Wert 1.2] Puffer: \n a [Rest bleibt stehen] Beispiele für (komplexere) Format-Zeichenfolgen: Zeichen der Format-Zeichenfolge müssen an richtiger Stelle in der Eingabe vorkommen scanf("%i.%i.%i", &day, &month, &year); 23.12.1981 _ scanf("%i-%i-%i", &day, &month, &year); 23-12-1981 _ 49 scanf 50 scanf Zusammenfassung: Zusammenfassung: Zeichen werden nach dem FIFO-Prinzip aus dem Puffer geholt (FIFO: First In, First Out) Es wird geprüft, ob ein Anfangsstück der Eingabe zur FormatZeichenkette passt: restliche Zeichen bleiben im Puffer stehen Zwischenraumzeichen zu Beginn werden überlesen Eingabe schlägt fehl, wenn das Format nicht passt (Umwandlung nicht möglich ist): (restliche) Zeichen bleiben im Puffer stehen Formatangaben sorgen für eine Umwandlung eingegebener Zeichen in Werte von gewünschtem Typ Normale Zeichen in der Format-Zeichenkette müssen an richtiger Stelle in der Eingabe vorkommen 51 Man muss überprüfen (können), ob Eingabe geklappt hat [später] Man muss nach jeder Eingabe Puffer leeren (können) [später] 52 Inhalt Motivation: Vorlesung Informatik I Im Arbeitsspeicher/Cache wird Information durch Spannungen dargestellt, wobei nur zwei Spannungen unterschieden werden: Universität Augsburg niedrige Spannung: 0 V bis 0,8 V (=0) höhere Spannung: 2,0 V bis 3,0 V (=1) (Versorgungsspannung 3 Volt) Wintersemester 2010/2011 Prof. Dr. Robert Lorenz Dadurch lassen sich zwei Ziffern darstellen (0 und 1), also 1 Bit Lehrprofessur für Informatik Codierung und Zahlensysteme 1 Inhalt 2 Inhalt Motivation: Motivation: Im binären Zahlensystem bestehen Zahlen nur aus 0en und 1en Aber wieso unterscheidet man nicht 10 verschiedene Spannungen? Dann könnte man Zahlen im dezimalen System direkt im Rechner speichern Das binäre Zahlensystem kann man verwenden, um jede Information (Zahlen, Texte, Bilder, Musik, Videos, ...) durch eine Folge von 0en und 1en computergerecht darzustellen Problem: Spannungen müssten sehr genau eingehalten werden, um sie unterscheiden zu können Diese Genauigkeit ist mit Halbleiterbauelementen nur durch Operationsverstärker erreichbar (zu teuer, brauchen zu viel Platz) 3 4 Inhalt Inhalt Motivation: Motivation: Nur auf der Basis eines binären Zahlensystems kann man bezahlbare Computer bauen Nur auf der Basis eines binären Zahlensystems kann man bezahlbare Computer bauen Allerdings: Binärzahlen sind sehr lang und unübersichtlich: Man benutzt aushilfsweise auch noch andere Zahlensysteme (Hexadezimalsystem, Oktalsystem) Außerdem sollte man wissen: Kenntnis von Zahlensystemen für Programmierer notwendig, für normale Benutzer nützlich (technische Anleitungen, Fehlermeldungen, …) was man dabei beachten muss (Möglichkeit der Decodierung, Arithmetik auf codierten Zahlen usw.) wie Zahlen, Zeichen, Ton, Bilder, usw. in Folgen von 0en und 1en codiert werden (können) 5 Inhalt 6 Codierungstheorie Codierungstheorie (Grundlagen) Relevante Gebiete für die Umwandlung (Codierung) von Daten: Speicherung im Rechner (siehe Motivation) Zahlensysteme Nachrichtenübertragung (Telegraphie, Telephon, DFÜ...) Bildsignalübertragung (Video-Übertragung, HDTV) Geheimhaltung (Militär, Datenschutz, Kryptographie) Übersetzung (Fremdsprachen, Programmiersprachen) 7 8 Codierungstheorie Codierungstheorie Inhalt dieser Folien: Alphabet, Buchstabe: Formalisierung der Begriffe Code, Codierung, ... Wir betrachten eine endliche Menge A und nennen diese Alphabet Die Elemente von A nennen wir Buchstaben Weiterführende Inhalte (andere Vorlesungen): |A| bezeichnet die Anzahl der Buchstaben (Elemente) von A Untersuchung mathematischer Zusammenhänge: - Entschlüsselung, - Entdeckung und Korrektur von Fehlern, - Redundanz, ... (Datenkompression) 9 Codierungstheorie 10 Codierungstheorie Alphabet, Buchstabe: Wort: Wir nehmen an, dass die Buchstaben in einer festen Reihenfolge geordnet sind, ausgedrückt durch eine Relation < Ein Wort über A ist eine endliche Folge w = a1a2 ... ak von Buchstaben aus A Beispiele: Menge der Binaärzahlen IB = {0,1} mit der Ordnung 0 < 1 Menge der Dezimalziffern ID = {0,...,9} mit der Ordnung 0 < 1 < … < 9 Lateinische Großbuchstaben mit der Ordnung A < ... < Z |w| bezeichnet die Anzahl der Buchstaben eines Wortes w, genannt Länge des Wortes Wir führen ein leeres Wort ε ein mit Länge |ε|:= 0 Achtung: ε ist kein Buchstabe! Wir bezeichnen Ak := {w | w Wort über A, |w| = k} IB0 = {ε}, IB1 = {0,1}, IB2 = {00,01,10,11}, … 11 12 Codierungstheorie Codierungstheorie Wort: Sprache: Hintereinandergeschriebene Worte u und v ergeben ein neues Wort uv Menge aller Worte über A: Gilt w = uv für Worte u und v, so heißen u,v Teilworte von w und u Anfangsstück von w A* := {w | w Wort über A} = ∪A k A+ := A*\{ε} Eine Teilmenge L ⊆ A* heißt Sprache 13 Codierungstheorie 14 Codierungstheorie Lexikographische Ordnung: Codierung, Code, Codewort: Ähnlich der alphabetischen Ordnung lässt sich die lexikografische Ordnung aus der Ordnung der Buchstaben ableiten Wir betrachten zwei Alphabete A,B Eine Abbildung c: A → B* heißt Codierung Der Bildbereich c(A):={c(a)|a∈A} heißt Code Deshalb ordnet man die Wörter zuerst der Länge nach, und dann innerhalb einer Länge alphabetisch: Jedes Element b ∈ c(A) heißt Codewort Gilt |w|<|v|, so definieren wir w<v Gilt |w|=|v| und w=uaw‘, v=ubv‘, a<b, so definieren wir w<v Informal: Eine Codierung ordnet jedem Zeichen eines Alphabets ein Wort eines anderen Alphabets zu Mit der alphabetischen Ordnung ließe sich die Menge aller Wörter aber nicht der Reihe nach aufzählen, da Worte beliebige Länge haben können Beispiel: 0<1<00<01<10<11<000<001<010<011<100<… 15 16 Codierungstheorie Codierungstheorie Beispiel: Morsecode cM:{A,...,Z,0,...,9}∪{Ä,Ö,Ü,CH}→ {•,_}* Codewort Codewort Codewort Beispiel: Zählcodierung cT:{0,...,9}→{O,L}* (Impulswahlverfahren) Codewort 1 LO 6 LLLLLLO 2 LLO 7 LLLLLLLO •••__ 3 LLLO 8 LLLLLLLLO 4 ••••_ 4 LLLLO 9 LLLLLLLLLO ••__ 5 ••••• 5 LLLLLO 0 LLLLLLLLLLO A •_ I •• R •_• 1 •____ Ä •_•_ J •___ S ••• 2 ••___ B _••• K _•_ T _ 3 C _•_• L •_•• U ••_ CH _ _ _ _ M __ Ü D _•• N _• V •••_ 6 _•••• E • O ___ W •__ 7 __••• F ••_• Ö ___• X _••_ 8 ___•• G __• P •__• Y _•__ 9 ____• H •••• Q __•_ Z __•• 0 _____ Läßt sich beim Morsecode eine Nachricht immer dekodieren? Läßt sich bei der Zählcodierung eine Nachricht immer dekodieren? 17 Codierungstheorie 18 Codierungstheorie Wichtige Codierungsklassen: Codierung von Nachrichten (Wörtern): Wir betrachten zwei Alphabete A,B Wir betrachten eine Codierung c: A → B* c: A → B heißt Chiffrierung, c(A) heißt Chiffre c: A → Bn (n fest) heißt Blockcodierung Man codiert Wörter, indem man die Codes der einzelnen Buchstaben hintereinanderschreibt: c: A → IB* heißt Binärcodierung c: A → IBn (n fest) heißt n-Bit-Codierung c*(ε) := ε c*(wa) := c*(w)c(a) für w ∈ A*, a ∈ A Beispiele: cT*(214) = LLOLOLLLLO * cM (ESEL) = • • • • • • _ • • cM*(SEINE) = • • • • • • _ • • [Wir werden nachher nur n-Bit-Codierungen betrachten] 19 20 Codierungstheorie Codierungstheorie Decodierung von Nachrichten (Wörtern): Fragen/Aufgaben: Ein Code heißt decodierbar, falls nicht zwei unterschiedliche Wörter gleich codiert werden Konstruiere eine decodierbare Codierung, die nicht die FanoBedingung erfüllt Erfüllen Blockcodierungen die Fano-Bedingung? Ein hinreichendes (aber nicht notwendiges) Kriterium für die Decodierbarkeit ist die sog. Fano-Bedingung: Wie lässt sich die Morsecodierung so modifizieren, dass sie die Fano-Bedingung erfüllt? Kein Codewort ist Anfang eines anderen Codewortes … Decodierungsverfahren: man läuft von links nach rechts über den codierten Text und stoppt beim ersten erkannten Codewort 21 Zahlensysteme 22 Zahlensysteme Wir betrachten eine nicht-negative ganze Zahl B > 2 und nennen sie Basis Existenz einer solchen eindeutigen Summendarstellung k-1 x =Σ biBi = b0B0 + b1B1 + ... + bk-1Bk-1 Jede nicht-negative ganze Zahl x hat dann eine eindeutige Summendarstellung bzgl. B der folgenden Form i=0 k-1 (1) Man bestimmt k mit Bk-1 ≤ x < Bk für ein maximales b < B x =i=0 Σ biBi = b0B0 + b1B1 + ... + bk-1Bk-1 (2) Man bestimmt b < B maximal mit bBk-1 ≤ x < Bk mit nicht-negativen ganzen Zahlen bi < B (3) Setze bk-1:= b und mache dasselbe für den Rest x-bk-1Bk-1 B=10: 27 = 7*100 + 2*101 (0≤ bi ≤9) B=2: 27 = 1*20 + 1*21 + 0*22 + 1*23 + 1*24 (0≤ bi ≤1) 23 24 Zahlensysteme Zahlensysteme Berechnungsbeispiel: Wie kann man Sie einfach(er) berechnen?: Horner-Verfahren k-1 x =i=0 Σ biBi = b0B0 + b1B1 + ... + bk-1Bk-1 (1) Man betrachtet den Rest bei ganzzahliger Division x/B (2) Da alle bis auf den ersten Summanden durch B teilbar sind, ist dieser Rest gleich b0 (3) Jetzt dasselbe für die Zahl x/B (usw.): Rest bei ganzzahliger Division (x/B)/B ist b1 127 / 3 42 / 3 14 / 3 4 / 3 1 / 3 = = = = = 42 14 4 1 0 Rest Rest Rest Rest Rest 1 0 2 1 1 127 = 1*30 + 0*31 + 2*32 + 1*33 + 1*34 Allgemein: Rest nach n-maliger ganzzahliger Division durch B ist bn-1 25 Zahlensysteme 26 Zahlensysteme Gilt für eine nicht-negative ganze Zahl x die Summendarstellung Umrechnung zwischen Zahlensystemen k-1 x =i=0 Σ biBi = b0B0 + b1B1 + ... + bk-1Bk-1 so heißt die Ziffernfolge (bk-1bk-2…b1b0)B B-adische Darstellung von x 127 hat die 3-adische Darstellung (11201)3 Wir können jetzt zu einer nicht-negativen ganzen Zahl die Badische Darstellung für eine beliebige Basis B berechnet Wir können auch x aus seiner B-adischen Darstellung berechnen (benutze obige Summenformel) Damit können wir (über das Dezimalsystem) auch B-adische Darstellungen zu verschiedenen Basen ineinander umrechnen (direkte Verfahren besprechen wir hier nicht) 27 28 Zahlensysteme Zahlensysteme Für den Informatiker wichtige Basen sind 2, 8 und 16 Das 8-adische Zahlensystem heißt auch Oktalsystem Das 2-adische Zahlensystem heißt auch Dualsystem Im Oktalsystem gilt: B = 8 Erlaubte Ziffern: 0,1,...,7 Im Dualsystem gilt: B = 2 Erlaubte Ziffern: 0,1 Einfache Umrechnung ins Dualsystem: Wegen 8 = 23 stehen jeweils 3 Dual-Ziffern für eine Oktalziffer Beispiel: (174)8 = (001111100)2 29 Zahlensysteme 30 Zahlensysteme Das 16-adische Zahlensystem heißt auch Hexadezimalsystem Im Hexadezimalsystem gilt: Beliebige reelle Zahlen (insbesondere Brüche) r haben eine Badische Darstellung, nämlich von der Form: k-1 r =i=-∞ Σ biBi =...+ b-1B-1 + b0B0 + ... + bk-1Bk-1 B = 16 Erlaubte Ziffern: 0,1,...,9,A,…,F (A=10,…,F=15) B-adische Festpunktdarstellung: r=(bk-1bk-2…b1b0.b-1b-2…)B Einfache Umrechnung ins Dualsystem und zurück: Wegen 16 = 24 stehen jeweils 4 Dual-Ziffern für eine Hexadezimalziffer Diese Darstellung kann wie die Dezimaldarstellung endlich oder unendlich sein Beispiel: (1B9)16 = (000110111001)2 31 32 Zahlensysteme Zahlensysteme B-adische Darstellung berechnen für reelle Zahlen: B-adische Darstellung berechnen für reelle Zahlen: k-1 r =i=-∞ Σ biB =...+ b-1B i -1 k-1 + b0B + ... + bk-1B 0 r = k-1 Σ i=-∞ biBi =...+ b-1B-1 + b0B0 + ... + bk-1Bk-1 Sei r = x + y mit x ganzzahlig und 0 ≤ y < 1 (x = Vorkommastellen, y=Nachkommastellen) Sei r = x + y mit x ganzzahlig und 0 ≤ y < 1 (x = Vorkommastellen, y=Nachkommastellen) (1) Vorkommastellen werden aus x berechnet (wie vorhin) (2) Nachkommastellen: - b-1 entspricht den Vorkommastellen von y*B - b-2 wird nun aus (Nachkommastellen von) y*B berechnet wie b-1 aus r, usw. - Abbruch, falls keine Nachkommastellen übrig bleiben 33 Zahlensysteme 34 Zahlensysteme Berechnungsbeispiel für 127.5: Man kann in allen B-adischen Festpunktdarstellungen rechnen wie im Dezimalsystem 0.5 * 3 = 1.5 Ziffer 1, Rest 0.5 0.5 * 3 = 1.5 … ... 127.5 = (11201.111...)3 Stellenweises Addieren/Subtrahieren mit Übertrag (Achtung: Übertrag bei Summen >B-1!) Multiplizieren/Dividieren (Sonderfall: schnelle Berechnung von *B oder /B) Berechnungsbeispiel für 127.33...: 0.33... * 3 = 1 Ziffer 1, Rest 0 127.5 = (11201.1)3 35 36 Zahlensysteme Zahlensysteme Man kann in allen B-adischen Festpunktdarstellungen rechnen wie im Dezimalsystem Reelle Zahlen haben auch Gleitpunktdarstellungen r = (bk-1bk-2…b1b0.b-1b-2…)B = bk-1bk-2…b1b0.b-1b-2… * B0 Beispiel im Dualsystem Übertrag ab Wert 2: = bk-1bk-2…b1.b0b-1b-2… * B1 1 1 1 1.0 0 1 + 1 1 0.1 Übertrag:1 1 1 = 1 0 1 0 1.1 0 1 = ... = 0.0bk-1bk-2…b2.b1b0b-1b-2… * Bk+1 = ... = bk-1bk-2…b1b0b-1.b-2… * B-1 = ... = <Mantisse> * B<Exponent> 37 Zahlensysteme Zahlensysteme Eine reelle Zahlen hat unendliche viele Gleitpunktdarstellungen r = <Mantisse> * B<Exponent> mit reeller Zahl <Mantisse> und ganzer Zahl <Exponent> Beispiel für Basis 10: 12.53 = = = = = = = 12.53 * 1.253 * ... 0.01253 ... 125.3 * ... 38 Man normiert die Gleitpunktdarstellung reeller Zahlen r durch Eingrenzungen des Bereichs für die Mantisse r = <Mantisse> * B<Exponent> Übliche Normierungen: 100 101 1/B ≤ |<Mantisse>| < 1 also: r = 0.b-1b-2…b-m * B<Exponent> mit b-1 > 0 * 103 Beispiele: 15.3=0.153 * 102, 0.002=0.2 * 10-2,... 10-1 39 40 Zahlensysteme Zahlensysteme Man normiert die Gleitpunktdarstellung reeller Zahlen r durch Eingrenzungen des Bereichs für die Mantisse Rechnen mit normierten Gleitpunktdarstellungen Sei r1 = m1 ⋅ Be1, r2 = m2 ⋅ Be2 r = <Mantisse> * B<Exponent> mit r1,r2>0 (zur Vereinfachung!) und 1/B ≤ m1, m2 < 1 Übliche Normierungen: Vergleiche: 1 ≤ |<Mantisse>| < B also: r = b0.b-1b-2…b-m * B<Exponent> mit b0 > 0 r1<r2 genau dann wenn (gdw) (e1<e2 ) oder (e1=e2 und m1<m2) r1=r2 gdw (e1=e2 und m1=m2) Beispiele: 15.3=1.53 * 10 , 0.002=2.0 * 10 ,... 1 -3 41 Zahlensysteme 42 Zahlensysteme Rechnen mit normierten Gleitpunktdarstellungen Sei r1 = m1 ⋅ Be1, r2 = m2 ⋅ Be2 Rechnen mit normierten Gleitpunktdarstellungen Sei r1 = m1 ⋅ Be1, r2 = m2 ⋅ Be2 mit r1,r2>0 (zur Vereinfachung!) und 1/B ≤ m1, m2 < 1 mit r1,r2>0 (zur Vereinfachung!) und 1/B ≤ m1, m2 < 1 Addition (o.B.d.A. sei r1 ≥ r2) Subtraktion (o.B.d.A. sei r1 ≥ r2) r1 + r2 r1 - r2 = m1 ⋅ Be1 + (m2 ⋅ Be2-e1) Be1 [Exponentenangleich] = m1 ⋅ Be1 - (m2 ⋅ Be2-e1) Be1 [Exponentenangleich] = (m1 + m2⋅ Be2-e1) Be1 = (m1 - m2⋅ Be2-e1) Be1 [Addition der Mantissen] = m ⋅ Be [Normierung: m =m1+m2⋅Be2-e1 od. =(m1+m2⋅Be2-e1)/B] 43 [Addition der Mantissen] = m ⋅ Be [Normierung: m =m1-m2⋅Be2-e1 od. =(m1-m2⋅Be2-e1)/B] 44 Zahlensysteme Zahlensysteme Rechnen mit normierten Gleitpunktdarstellungen Rechnen mit normierten Gleitpunktdarstellungen Sei r1 = m1 ⋅ Be1, r2 = m2 ⋅ Be2 Beispiele (zur Basis 2) mit r1,r2>0 (zur Vereinfachung!) und 1/B ≤ m1, m2 < 1 (0.1*22)+(0.11*2-1) Multiplikation (Division analog) (0.11*2-1)+(0.1*2-1) r1 ⋅ r2 = m1 ⋅ m2 ⋅ Be1+e2 (0.11*2-1)-(0.1*2-1) = m ⋅ Be [Normierung: m = m1 ⋅ m2 od. = m1 ⋅ m2 ⋅ B] (0.1*22)*(0.11*2-1) = = = = = = = = (0.1 *22)+(0.11 *2-3)*22 0.10011* 22 1.01 * 2-1 0.101 * 20 0.01 * 2-1 0.1 * 2-2 0.011 * 21 0.11 * 20 45 Ausblick 46 Ausblick Technische Beschränkung für Rechner: Fragen: Es ist nur die Verarbeitung von n-Bit-Worten möglich (für ein festes n) Mit dieser Bitzahl muss man nun ganze Zahlen, reelle Zahlen, Zeichen, usw. darstellen In der Praxis: n unterschiedlich groß für unterschiedliche Datentypen (Zeichen: 8 Bit, ganze Zahl: 32 Bit, usw…) Welche Zahlen sollen codiert werden (zusammenhängender Bereich, ganze/gebrochene/reelle Zahlen?) Wie codiert man negative Zahlen? Mit welcher Genauigkeit (Rundungsfehler) codiert man reelle Zahlen? Folgerung: Man kann nur endlich viele Zahlen/Zeichen darstellen 47 48 Ausblick Fragen: Vorlesung Informatik I Wie lassen auf den Codierungen arithmetische Operationen realisieren? Universität Augsburg (x, y) op c Codierung (c(x), c(y)) x op y c Codierung op c(x op y) = c(x) op c(y) Wintersemester 2010/2011 op ∈ {+, -, *, / } Prof. Dr. Robert Lorenz op ∈ {+, -, *, / } Lehrprofessur für Informatik Zahlen- und Zeichendarstellungen Wie muss op aussehen, damit das Diagramm kommutativ ist? 49 Inhalt 1 Inhalt Motivation Motivation Technische Beschränkung für Rechner: Welche Zahlen sollen codiert werden (zusammenhängender Bereich, ganze/gebrochene/reelle Zahlen?) Es ist nur die Verarbeitung von n-Bit-Worten möglich (für ein festes n) Wie codiert man negative Zahlen? Mit dieser Bitzahl muss man nun ganze Zahlen, reelle Zahlen, Zeichen, usw. darstellen (in der Praxis n abhängig vom Datentyp) Mit welcher Genauigkeit (Rundungsfehler) codiert man gebrochene Zahlen? Folgerung: Man kann nur endlich viele Zahlen/Zeichen darstellen 2 3 Inhalt Inhalt Motivation Zahldarstellungen (Vorzeichen-Betrag, Exzeß-q, 1-Komplement, 2-Komplement, Festpunkt, Gleitpunkt) Wie lassen auf den Codierungen arithmetische Operationen realisieren? (x, y) op x op y c Codierung (c(x), c(y)) c Codierung op c(x op y) = c(x) op c(y) Zeichendarstellungen (ASCII, Unicode) op ∈ {+, -, *, / } op ∈ {+, -, *, / } Wie muss op aussehen, damit das Diagramm kommutativ ist? 4 Zahlendarstellungen 5 Zahlendarstellungen Notationen Notationen Jedes Wort über dem Alphabet {0,1} bezeichnen wir als Bitmuster Wir benutzen also Bitmuster als Codewörter für Zahlen. Ein gegebenes Bitmuster kann aber für verschiedene Zahlen stehen, je nachdem, welche Codierung man verwendet hat. Ab jetzt benutzen wir ausschließlich n-Bit-Codierungen. Die Bezeichnung einer Codierung ist immer von der Form c<Name>,n <Name> n ist eine Abkürzung für den Namen der Codierung ist die Anzahl der verwendeten Bit c<Name>,n(x) bezeichnet also das zu der Zahl x gehörende Bitmuster bzgl. der Codierung c<Name>,n Durch die Notation (<Bitmuster>)<Name>,n geben wir an, dass wir <Bitmuster> als Codewort bzgl. der Codierung c<Name>,n auffassen (<Bitmuster>)<Name>,n bezeichnet die Zahl, für die c<Name>,n((<Bitmuster>)<Name>,n)=<Bitmuster> gilt 6 7 Zahlendarstellung ganzer Zahlen Zahlendarstellung ganzer Zahlen Vorbereitungen Grundidee Für x ∈ {0, ..., 2n - 1} bezeichnen wir mit c2,n(x) die Dualdarstellung von x in n Stellen, evtl. aufgefüllt mit führenden Nullen Darstellung eines Zahlbereiches A = {xu,xu+1,...,xo-1,xo}, mit: xu Eignet sich noch nicht für die Darstellung negativer Zahlen 0 xo xu < 0 < xo Bei Addition / Subtraktion / Multiplikation kann der darstellbare Zahlenbereich über-/unterschritten werden - was dann? A maximal, d.h. |A| ≈ 2n A symmetrisch zum Nullpunkt, d.h. |xu| ≈ |xo| Beispiele: c2,8(7)=00000111 (00000111)2,8=7 Arithmetische Operationen (auf codierten Zahlen) leicht zu realisieren (z.B. durch bitweise Operationen) 8 Vorzeichen-Betrag-Darstellung 9 Vorzeichen-Betrag-Darstellung Beispiele Definition AVB,n = {-(2n-1-1),...,-0,+0,1,...,2n-1 - 1} cVB,8(7)= 0c2,7(7)=00000111 (00000111)VB,8=7 cVB,n : AVB,n → IBn cVB,n(x) := 0c2,n-1(|x|) cVB,n(x) := 1c2,n-1(|x|) , falls 0 ≤ x < 2n-1 , falls -2n-1 < x ≤ 0 cVB,4(-7)= 1c2,3(7)=1111 (1111)VB,4=-7 Also: Positive Zahlen: Negative Zahlen: 0 Betrag in Dualdarstellung 1 Betrag in Dualdarstellung 10 11 Vorzeichen-Betrag-Darstellung Vorzeichen-Betrag-Darstellung Berechnung Arithmetik Für Arithmetik der Vorzeichen-Betrag-Darstellung: Sehr aufwendig! cVB,n(x) = bn-1 ... b1b0 (selbst überlegen: z.B. postive Zahl + negative Zahl = ? Fallunterscheidung nötig) gilt n-2 x=(bn-1 ... b1b0)VB,n=(+/-) Σ i = 0 Wird in der Praxis nicht verwendet bi 2i für bn-1 = (0/1) 12 Exzeß-q-Darstellung 13 Exzeß-q-Darstellung Definition Beispiele: AEx-q,n={-q,...,0,1,...,2n–1–q} cEx-32,8(7)= c2,8(39)=00100111 (00100111)Ex-32,8=7 für q ganze nicht-negative Zahl cEx-8,4(-7)= c2,4(1)=0001 cEX-q,n : AEx-q,n → IBn (0001)Ex-8,4=-7 cEx-q,n(x) := c2,n(x+q) 14 15 Exzeß-q-Darstellung Exzeß-q-Darstellung Berechnung Arithmetik Für Sei + die Addition, - die Subtraktion auf Dualzahlen Addition ⊕ (auf Exzeß-q-Darstellungen) cEx-q,n(x) =bn-1 ... b1b0 cEx-q,n(x) ⊕ cEx-q,n(y) gilt (x, y) =cEx-q,n(x+y) n-1 x = (bn-1 ... b1b0 )Ex-q,n = Σ i = 0 =c2,n(x+y+q) bi ⋅ 2i – q + c c (c(x),c(y)) =c2,n(x+q)+c2,n(y+q)-c2,n(q) x + y ⊕ c(x + y) = c(x) ⊕ c(y) =cEx-q,n(x)+cEx-q,n(y)–c2,n(q) Beispiel: cEx-32,8(7)⊕cEx-32,8(-7)=00100111+00011001-00100000=00100000 16 Exzeß-q-Darstellung 17 Exzeß-q-Darstellung Arithmetik Arithmetik Sei + die Addition, - die Subtraktion auf Dualzahlen Bei Bereichsüberlauf (also bei x+y > 2n–1–q oder <-q) brechen C-Programme mit Fehlermeldung ab Subtraktion Θ (auf Exzeß-q-Darstellungen) cEx-q,n(x) Θ cEx-q,n(y) = cEx-q,n(x-y) =c2,n(x-y+q) =c2,n(x+q)-c2,n(y+q)+c2,n(q) (x, y) - c c (c(x),c(y)) Multiplikation/Division: zu kompliziert! x - y Θ c(x - y) = c(x) Θ c(y) Wird zur Darstellung des Exponenten bei Gleitpunktdarstellungen verwendet (bemerke: da braucht man nur Addition / Subtraktion) =cEx-q,n(x)-cEx-q,n(y)+c2,n(q) Beispiel: cEx-32,8(7) Θ cEx-32,8(-7)=00100111-00011001+00100000=00101110 18 19 1- und 2-Komplement-Darstellung 1- und 2-Komplement-Darstellung Grundidee Grundidee Wir betrachten eine feste ganze nicht-negative Zahl k Stelle positive Zahlen durch Binärcodierung dar: Für eine ganze nichtnegative Zahl x ≤ k/2 sei c(x) := c2,n(x) x := k – x Stelle negative Zahlen durch Binärcod. des Komplements dar: das Komplement von x bzgl. k 0 x k/2 c(-x) := c2,n(x) = c2,n(k-x) k-x Subtraktion durch Addition des Komplements: k c(y)-c(x) = c(y)+c(-x) = c2,n(y)+c2,n(k-x) 20 1- und 2-Komplement-Darstellung 21 2-Komplement-Darstellung Grundidee Definition Wähle k so, dass Komplementbildung und Subtraktion von k A2K,n = {-2n-1,...,0,1,...,2n-1 – 1} leicht realisierbar sind: c2K,n : A2K,n → IBn k = 2n (2-Komplement) c2K,n(x) := c2,n(x) falls 0 ≤ x < 2n-1 c2K,n(x) := c2,n(2n + x) falls -2n-1 ≤ x < 0 k = 2n-1 (1-Komplement) 0 0 x k/2 k-x x 2n-1 2n-x 2n k 22 23 2-Komplement-Darstellung 2-Komplement-Darstellung Beispiele: Beispiel für n=4 (komplett) c2K,4(0) = 0000 c2K,4(7)= c2,4(7)=0111 (0111)2K,4=7 c2K,4(-8)= c2,4(24-8)=1000 (1000)2K,4=-8 c2K,4(1) = 0001 c2K,4(-1) = 1111 c2K,4(2) = 0010 c2K,4(-2) = 1110 ... ... c2K,4(7) = 0111 c2K,4(-7) = 1001 c2K,4(-8) = 1000 24 2-Komplement-Darstellung 25 2-Komplement-Darstellung Berechnung Arithmetik Für Komplementbildung c2K,n(x) = bn-1 ... b1b0 Sei x∈{1,...,2n-1 - 1}, c2K,n(x)=c2,n(x)=bn-1...b1b0 Dann gilt: gilt n-2 x = (bn-1 ... b1b0 )2K,n = -bn-12n-1 + Σ i = 0 c2K,n(-x) = c2,n(x) bi ⋅ 2i =c2,n(2n - 1) -c2,n(x) =(11...11)2,n -(bn-1 ... b1b0 )2,n + c2,n(1) + (00...01)2,n =((1 - bn-1) ... (1 - b1)(1 - b0))2,n + (00...01)2,n (Rechnung?) Komplementbildung = „Kippen“ aller Bits und Addition von 1 26 27 2-Komplement-Darstellung 2-Komplement-Darstellung Arithmetik (formal) Arithmetik (anschaulich) c2K,n(x)⊕c2K,n (y) := (c2K,n(x)+c2K,n(y)) modulo 2n Addition: + einer positiven Zahl y: y Schritte gegen Uhrzeigersinn. ist die Addition auf Dualzahlen modulo 2n bedeutet anschaulich: „Ignorieren“ des Überlaufs (führende 1 ignorieren, falls Ergebnis n+1 Stellen hat) einer negativen Zahl y: y Schritte im Uhrzeigersinn. Subtraktion: durch Addition des Komplements Multiplikation / Division: Zurückführung auf Addition 28 2-Komplement-Darstellung 29 2-Komplement-Darstellung Arithmetik (formal) Arithmetik (formal) Rechnung für 2n-1>x,y≥0, x+y<2n-1: Rechnung für 2n-1>x≥0,0>y≥−2n-1,x+y<0: c2K,n(x)⊕c2K,n (y) c2K,n(x)⊕c2K,n (y) = c2K,n(x+y) = c2K,n(x+y) = c2,n(x+y) = c2,n(x+y+2n) = c2,n(x) + c2,n(y) = c2,n(x+y+2n) modulo 2n = (c2,n(x) + c2,n(y)) modulo 2n = (c2,n(x) + c2,n(y+2n)) modulo 2n = (c2K,n(x) + c2K,n(y)) modulo 2n = (c2K,n(x) + c2K,n(y)) modulo 2n 30 31 2-Komplement-Darstellung 2-Komplement-Darstellung Arithmetik (formal) Arithmetik (formal) Rechnung für 2n-1>x≥0,0>y≥−2n-1,x+y≥0: Rechnung für 0>x,y≥−2n-1,x+y≥-2n-1 : c2K,n(x)⊕c2K,n (y) c2K,n(x)⊕c2K,n (y) = c2K,n(x+y) = c2K,n(x+y) = c2,n(x+y) + 2n - 2n = c2,n(x+y+2n) + 2n - 2n = (c2,n(x+y) + 2n) modulo 2n = (c2,n(x+y+2n) + 2n) modulo 2n = (c2,n(x) + c2,n(y+2n)) modulo 2n = (c2,n(x+2n) + c2,n(y+2n)) modulo 2n = (c2K,n(x) + c2K,n(y)) modulo 2n = (c2K,n(x) + c2K,n(y)) modulo 2n 32 2-Komplement-Darstellung 33 2-Komplement-Darstellung Arithmetik (formal) Arithmetik (formal) Ergebnis bei Bereichsüberlauf 2n-1>x,y≥0, x+y≥2n-1: Ergebnis bei Bereichsüberlauf -2n-1≤x,y<0, x+y < -2n-1: ((c2K,n(x)+c2K,n(y))modulo 2n)2K,n= ((c2K,n(x)+c2K,n(y))modulo 2n)2K,n= ((c2,n(x)+c2,n(y))modulo 2n)2K,n= ((c2,n(x+2n)+c2,n(y+2n))modulo 2n)2K,n= (c2,n(x+y))2K,n= (c2,n(x+y+2n))2K,n= x+y-2n x+y+2n Kein Abbruch, sondern Rückgabe des falschen Ergebnisses Kein Abbruch, sondern Rückgabe des falschen Ergebnisses (Anschaulich im Zahlenring: Zyklischer Bereichsüberlauf) (Anschaulich im Zahlenring: Zyklischer Bereichsüberlauf) 34 35 1-Komplement-Darstellung 1-Komplement-Darstellung Definition Beispiele: A2K,n = {-(2n-1-1),...,-0,+0,1,...,2n-1 – 1} c1K,4(7)= c1,4(7)=0111 (0111)1K,4=7 c1K,n : A1K,n → IBn c1K,n(x) := c2,n(x) c1K,n(x) := c2,n(2n -1 + x) 0 x 2n-1-1 c1K,4(-7)= c1,4(24-1-7)=1000 (1000)1K,4=-7 falls 0 ≤ x < 2n-1 falls -2n-1 < x ≤ 0 2n-1-x 2n-1 36 37 1-Komplement-Darstellung 1-Komplement-Darstellung Berechnung Beispiel für n=4 (komplett) c1K,4(+0) = 0000 c1K,4(-0) = 1111 Für c1K,4(1) = 0001 c1K,4(-1) = 1110 c1K,n(x) = bn-1 ... b1b0 c1K,4(2) = 0010 c1K,4(-2) = 1101 gilt ... c1K,4(7) ... = 0111 x c1K,4(-7) = 1000 n-2 = (bn-1 ... b1b0 )1K,n = -bn-1(2n-1-1)+ Σ i = 0 bi ⋅ 2i (Rechnung?) 38 39 1-Komplement-Darstellung 1-Komplement-Darstellung Arithmetik Arithmetik (anschaulich) Komplementbildung Sei x∈{1,...,2n-1}, c1K,n(x)=c2,n(x)=bn-1...b1b0 Addition: Dann gilt: einer positiven Zahl y: y Schritte gegen Uhrzeigersinn. c1K,n(-x) = c2,n(x) = c2,n(2n - 1) einer negativen Zahl y: y Schritte im Uhrzeigersinn. -c2,n(x) = (11...11)2,n -(bn-1 ... b1b0 )2,n Subtraktion: durch Addition des Komplements =((1 - bn-1) ... (1 - b1)(1 - b0))2,n Multiplikation / Division: Zurückführung auf Addition Komplementbildung = „Kippen“ aller Bits 40 1-Komplement-Darstellung 41 Zahlendarstellung reeller Zahlen Arithmetik (formal) Ziel: Analog zu 2-Komplement: Betrachte (2n-1) statt 2n Darstellung rationaler und reeller Zahlen als n-Bit-Worte c1K,n(x)⊕c1K,n (y) = (c1K,n(x)+c1K,n(y)) modulo 2n-1 + Problem: Nur endlich viele Zahlen exakt darstellbar mit n Bits (Festpunkt oder Gleitpunkt) ist die Addition auf Dualzahlen modulo 2n-1 bedeutet anschaulich: „Addition“ des Überlaufs (führende 1 ignorieren und an letzter Stelle addieren , falls Ergebnis n+1 Stellen hat) unendlich viele Zahlen nur approximativ (gerundet) darstellbar Frage: Welche Zahlen wollen wir exakt darstellen? 42 43 Festpunktdarstellung mit n Bits Festpunktdarstellung mit n Bits Definition: Definition: Seien m (Anzahl Nachkommastellen) und k (Anzahl Vorkommastellen) nichtnegative ganze Zahlen fest gegeben .. k = n-m Hat eine nicht-negative ganze Zahl x die Summendarstellung m Sind die Nachkommastellen einer Zahl x nicht exakt darstellbar, so rundet man zur nächstgelegenen exakt darstellbaren Zahl: x = (bk-1...b0.b-1...b-m)2 Mit rd bezeichnen wir den Rundungsoperator, der eine Zahl x zur nächstgelegenen ganzen Zahl rundet. Er erfüllt also heißt c2,m,k(x) = bk-1...b0b-1...b-m = c2,m+k(x*2m) 2-adische Festpunktdarstellung von x mit k Vorkomma- und m Nachkommastellen und x heißt exakt darstellbar |rd(x)-x|=min{|y-x| | y ist eine ganze Zahl} 44 Festpunktdarstellung mit n Bits Festpunktdarstellung mit n Bits Definition: Beispiel: Stelle Dezimalzahl 1.2 in folgender 8-Bit Festpunktdarstellung bzgl. der Basis 2 dar: .. k = n-m 45 .. m 4 Wir definieren für beliebiges x: 4 Multiplizieren der Zahl mit 2 : 1.2 * 24 = 19.2 4 c2,m,k(x):= c2,m+k(rd(x*2m)) So können wir also bei der Berechnung vorgehen: Auf- bzw. Abrunden in ganze Zahl: rd(19.2)=19 (1) Multiplizieren der Zahl mit 2m (2) Auf- bzw. Abrunden in eine ganze Zahl (3) Dual-Darstellung mit n Bit Dual-Darstellung mit 8 Bit: c2,4,4(1.2)= c2,8(rd(1.2* 24))=c2,8(19)=00010011 (00010011)2,4,4=(00010011)2,8/ 24 =1.1875 46 47 Festpunktdarstellung mit n Bits Festpunktdarstellung mit n Bits Berechnung Absoluter Rundungsfehler: |x-(c2,m,k(x))2,m,k | Für |x-(c2,m,k(x))2,m,k | c2,m,k(x) = bn-1 ... b1b0 = |x-(c2,m+k(rd(x*2m)))2,m+k /2m| gilt = |x-(rd(x*2m))/2m| x = |x*2m -(rd(x*2m))|/2m = (bn-1 ... b1b0 )2,m,k n-1 = Σ i=0 < 0.5/2m bi ⋅ 2i-m = 1/2m+1 (Abstände zwischen exakt darstellbaren Zahlen gleichbleibend) = (bn-1 ... b1b0)2,m+k/2m 48 Festpunktdarstellung mit n Bits 49 Festpunktdarstellung mit n Bits Relativer Rundungsfehler: |x-(c2,m,k(x))2,m,k|/|x| Arithmetik: |x-(c2,m,k(x))2,m,k|/|x| .. k=n-m < 1/|x|2m+1 m Zurückführen auf Rechenoperationen für ganze Zahlen durch Multiplizieren der Zahl mit 2m (kann beliebig groß werden für kleine x) 50 51 Festpunktdarstellung mit n Bits Festpunktdarstellung mit n Bits Eigenschaften: Eigenschaften: .. k = n-m .. m k = n-m Gleichbleibender Abstand 1/2m zwischen exakt darstellbaren Zahlen m Problem: Unterschiedliche Größenordnungen in Anwendungen: Geeignet für Zahlen ähnlicher Größenordnung (Anzahl der Nachkommastellen m an Größenordnung anpassen, s.d. Rundungsfehler tolerierbar) Avogadrozahl: Planck – Konstante: L = 6.0225 ⋅ 1023 h = 6.6260755 ⋅ 10-34 Besser: Darstellung als Gleitpunktzahl mit n Bits 52 Gleitpunktdarstellung mit n Bits 53 Gleitpunktdarstellung mit n Bits Darstellung normierter Gleitpunktzahlen zur Basis 2 in n-Bits: Definition Jede reelle Zahl r besitzt eine eindeutige Darstellung der Form (siehe Kapitel zu Zahlensystemen): r = m ⋅ 2 mit 1 ≤ |m| < 2 e V Charakteristik n-2 Betrag der Mantisse k-2 0 V = Vorzeichen der Mantisse =0 für positive Zahlen Idee: Codiere (m, e) in geeigneter Weise als n-Bit-Zahl: =1 für negative Zahlen k Bits für die Darstellung von m (Festpunktdarstellung) n - k Bits für e (Exzeß-q-Darstellung) (0 < k < n) 54 55 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Definition Definition V Charakteristik n-2 Betrag der Mantisse k-2 V 0 Charakteristik Betrag der Mantisse n-2 k-2 0 Darstellung der Mantisse (k-1 Bits): Festpunktdarstellung mit Darstellung des Exponenten = Charakteristik (n-k Bits): (1) einer Vorkommastelle (muss nicht dargestellt werden, da immer =1) (2) k-1 Nachkommastellen Exzeß-(2n-k-1-1)-Darstellung Für c2,k-1,1(|m|) = 1b-1b-2... b-k-2 definieren wir: (Exponenten zwischen –(2n-k-1-1) und 2n-k-1 darstellbar) c2,exp,n-k(e) := cEX-q,n-k(e) mit q=(2n-k-1-1) c2,man,k-1(|m|) := b-1b-2... b-k-2 56 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Definition V Charakteristik n-2 57 Beispiel: V Betrag der Mantisse k-2 0 7 Charakteristik 6 Betrag der Mantisse 4 3 0 3-Bit Charakteristik: q=3, Exponent zwischen –3 (Bitmuster 000) und 4 (Bitmuster 111) cGP,k,n(m⋅2e ) := 0c2,exp,n-k(e)c2,man,k-1(|m|), falls 0 ≤ m cGP,k,n(m⋅2e ) := 1c2,exp,n-k(e)c2,man,k-1(|m|), falls m < 0 Diese Bitmuster (und weitere) stehen dabei nicht zur Verfügung: Spezielle Darstellung der 0: Bitmuster 00…00…0 Spezielle Darstellung von +∞: Bitmuster 01…10…0 Spezielle Darstellung von -∞: Bitmuster 11…10…0 58 4-Bit Mantisse: Werte zwischen 1 (Bitmuster 0000) und 2-2-5 (Bitmuster 1111) 59 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Beispiel: Stelle die Zahl 4.6 dar 0 7 1 0 1 6 0 4 Beispiel: Stelle die Zahl 4.6 dar 0 1 0 3 0 0 7 (1) Normierte Gleitpunktdarstellung (m und e bestimmen): 1 0 1 6 0 4 0 1 0 3 0 (2) Vorzeichen bestimmen: 4.6 = 2.3*21 = 1.15*22 0 für positive Zahl Ergebnis: |m| = 1.15 und e=2 60 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Beispiel: Stelle die Zahl 4.6 dar 0 7 1 6 0 1 0 4 61 Beispiel: Stelle die Zahl 4.6 dar 0 1 3 0 0 0 7 1 6 0 1 0 4 0 1 0 3 (3) Charakteristik bestimmen: (4) Code der Mantisse bestimmen: c2,exp,3(2)= cEX-3,3(2)= c2,3(2+3)=101 c2,4,1(1.15)=c2,5(rd(1.15*24))=c2,5(18)=10010 0 Ergebnis: c2,man,4(1.15)=0010 62 63 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Berechnung: Beispiel: Stelle die Zahl 4.6 dar 0 7 1 0 1 6 0 4 0 1 0 3 V Charakteristik Betrag der Mantisse n-2 0 Also: cGP,4,8(4.6)=01010010 k-2 0 Für cGP,k,n(x) = bn-1 ... b1b0 gilt Umgekehrt: (01010010)GP,k,8 = (1.0010)2*2(101) x EX-3,3 =(100.1)2=4.25 = (bn-1 ... b1b0)GP,k,n = (+/-) (1.bk-2 ... b1b0 )2 * 2(b n-2 ...b k-1 )EX-q,n-k für bn-1=(0/1) und q=2n-k-1-1 64 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Beispiele: V 7 Beispiel: Charakteristik 6 65 Betrag der Mantisse 4 3 V 0 7 Charakteristik 6 Betrag der Mantisse 4 3 0 Kleinste positive darstellbare Zahl: Größte positive darstellbare Zahl: Kleinster Exponent: (000)2,exp,3 = (000)EX-3,3 = (000)2,3 -3 = 0-3 = -3 Größter Exponent: (111)2,exp,3 = (111)EX-3,3 = (111)2,3 -3 = 7-3 = 4 Kleinste Mantisse (Bitmuster 0…0 schon vergeben): (0001)2,man,4 = (10001)2,4,1 = (1.0001)2 Größte Mantisse (Bitmuster 1…1 schon vergeben): (1110)2,man,4 = (11110)2,4,1 = (1.1110)2 Ergebnis: (00000001)GP,4,8 = (1.0001)2*2-3 = (0.0010001)2 Ergebnis: (01111110)GP,4,8 = (1.1110)2*24 = (11110)2 = 30 66 67 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Beispiele: IEEE-Standard 754 Beispiele: IEEE-Standard 754 Einfache Genauigkeit: Doppelte Genauigkeit: V Charakteristik 31 30 23 Betrag der Mantisse 22 V 0 Charakteristik 63 62 8-Bit Charakteristik: Exponent zwischen –127 (Bitmuster 0...0) und 128 (Bitmuster 1...1) (23 + 1)-Bit Mantisse: Werte zwischen 1 (Bitmuster 0...0) und 2-2-24 (Bitmuster 1...1) 52 Betrag der Mantisse 51 0 11-Bit Charakteristik: Exponent zwischen –1023 (Bitmuster 0...0) und 1024 (Bitmuster 1...1) (52 + 1)-Bit Mantisse: Werte zwischen 1 (Bitmuster 0...0) und 2-2-53 (Bitmuster 1...1) 68 Gleitpunktdarstellung mit n Bits 69 Festpunktdarstellung mit n Bits Absoluter Rundungsfehler: |m⋅2e-(cGP,k,n(m⋅2e))GP,k,n| Beispiele: IEEE-Standard 754 |m⋅2e-(cGP,k,n(m⋅2e)) Erweiterte Genauigkeit: GP,k,n | = |m-(c2,k-1,1(m))2,k-1,1|⋅2e V Charakteristik 79 78 64 Betrag der Mantisse 63 < 2e/2k 0 (Kann sehr groß werden für große Zahlen: 15-Bit Charakteristik: Exponent zwischen –(2-14-1) (Bitmuster 0...0) und 214 (Bitmuster 1...1) (64 + 1)-Bit Mantisse: Werte zwischen 1 (Bitmuster 0...0) und 2-2-65 (Bitmuster 1...1) –(2n-k-1-1)≤e≤2n-k-1) 70 71 Festpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Relativer Rundungsfehler: |m⋅2e-(cGP,k,n(m⋅2e))GP,k,n|/|m⋅2e| |m⋅2e-(cGP,k,n(m⋅2e))GP,k,n|/|m⋅2e| Arithmetik: V < 2e/|m⋅2e|2k Charakteristik n-2 Betrag der Mantisse k-2 0 < 2e/2e2k Wie Arithmetik normierter Gleitpunktzahlen: < 1/2k Addition/Subtraktion: Exponentenangleich - Mantissen addieren/subtrahieren - neu normieren Multiplikation/Division: Exponenten addieren/subtrahieren - Mantissen mult./div. - neu normieren (Gleichbleibend für alle Zahlen) mit Ausnahmefällen: Bereichsüberlauf oder -unterschreitung bei Darstellung des Exponenten („overflow“/“underflow“); z.B. bei Multiplikation sehr großer/kleiner Zahlen 72 Gleitpunktdarstellung mit n Bits Gleitpunktdarstellung mit n Bits Arithmetik: V Charakteristik n-2 73 Arithmetik: Ergebnisse von Gleitpunktberechnungen können u.U. erheblich von dem exakten Wert abweichen! Betrag der Mantisse k-2 0 Auswege: Große Rundungsfehler möglich: durch Exponentenangleich bei Addition sehr unterschiedlich großer Zahlen ((2-9+223)-223=0,2-9+(223-223)=2-9) durch Stellenauslöschung bei Subtraktion gleich großer Zahlen (1023((10-9+1)- 1)=0, 1023(10-9+(1-1))=1014) 74 Exakte Arithmetik (z.B. Intervallarithmetik: nicht durch Hardware realisiert, aber Software erhältlich) Rechnungen geeignet organisieren (Gruppierung von Zahlen nach Größenbereichen) Übliche Rechengesetze gelten i.A. nicht (Assoziativ-/Distributiv/Kommutativgesetz, siehe obiges Beispiel) 75 Gleitpunktdarstellung mit n Bits Zeichendarstellungen Arithmetik: Grundidee: Sonderrolle der 0: Schritt 1: Verwende Code-Tabelle zur Übersetzung von Zeichen in Zahlen (ASCII, Unicode) Keine nGP-Darstellung arithmetische Sonderbehandlung (siehe IEEE-Standard) Schritt 2: Codiere alle Zahlen in 0en und 1en (binäres Zahlensystem) exaktes Ergebnis 0 wird in der Regel nicht angenommen bei Abfragen: nicht „r == 0“, sondern „|r| < ε “ nicht „x == y“, sondern „|x - y| < ε“ 76 Zeichendarstellungen 77 Zeichendarstellungen ASCII - Tabelle: ASCII - Tabelle: American Standard Code for Information Interchange Das erste Bit verwendete man früher als Kontrollbit für die Datenübertragung: Gebräuchlichste Code-Tabelle für Computer Auf 0 oder 1 gesetzt, je nachdem ob die Anzahl der 1-en an den übrigen 7 Bitpositionen gerade (even) oder ungerade (odd) ist Alle wichtigen Zeichen der englischen Sprache von 0 bis 127 nummeriert (dargestellt durch Bits 2 bis 8) Ergebnis: Gesamtanzahl der 1-en immer gerade (even parity). Darunter: Auch „nicht druckbare“ Zeichen mit ausschließlich formatierender Wirkung (z.B. Tabulatorzeichen, siehe auch CVorlesung) Später: ASCII zur Speicherung, verbesserte Datenübertragung Kein Kontrollbit mehr, ASCII um 128 Zeichen erweitert (es existieren mehrere unterschiedliche Erweiterungen deutsche Umlaute, Sonderzeichen anderer Sprachen, …) Folgerung: Erkenne, wenn bei Übertragung ein Bit verfälscht wurde 78 79 Zeichendarstellungen Zeichendarstellungen ASCII – Tabelle, Beispiele: Zeichen … 0 … 9 … A B … a b … dezimal … 48 … 57 … 65 66 … 97 98 … Unicode – Tabelle: binär … 0110000 … 0111001 … 1000001 1000010 … 1100001 1100010 … 256 Zeichen reichen nicht für alle Sprachen aus Mit Unicode kann man alle jemals von Menschen verwendeten Schriftzeichen speichern MS-Office 2000, OpenOffice und jedes andere moderne Programm erkennt automatisch, ob ein Text im alten ASCII-Code oder im neuen Unicode gespeichert ist (Groß- und Kleinbuchstaben in alphabetischer Reihenfolge) 80 Zeichendarstellungen 81 Zeichendarstellungen Unicode – Tabelle: Unicode – Tabelle: Verschiedene Versionen: UTF-32, UTF-16, UTF-8 Zeichen codiert gemäß UCS (Universal Character Set): können alle den kompletten Zeichensatz darstellen Zeichen 0 – 127: wie ASCII Zeichen 128 – 255: wie Latin-1-Erweiterung von ASCII verwendet 32 Bits mit führenden 0en UCS-Code eingebettet in syntaktisches Format mit Kontrollbits: UTF: Unicode-Transformation-Format Erkennen von Zeichengrenzen, Korrektheitstest sind verlustfrei in jeweils andere Darstellung transformierbar UTF-32: fixe Länge für alle Zeichen (32 Bit) UTF-16,UTF-8: unterschiedliche Längen für verschiedene Zeichen (führende 0en zum Teil weglassen) UTF-8: am weitesten verbreitete Darstellung, Quasi-Standard 82 83 Zeichendarstellungen Zeichendarstellungen Unicode – Tabelle, Beispiel UTF-8 : Unicode – Tabelle, Beispiel UTF-8 : 7-Bit ASCII-Zeichen: werden mit einem Byte kodiert, in der Form 0<ASCII-Code> Wird von Java unterstützt, aber im allgemeinen nicht von höheren Programmiersprachen (auch nicht von C) andere: verwenden zwischen 2 und 4 Bytes Code beginnt mit 1 1-Byte-Codes: 0xxx xxxx 2-Byte-Codes: 110x xxxx 10xx xxxx n-Byte-Zeichen: Erstes Byte beginnt mit n 1-en mit einer anschließenden 0 Jedes Folgebyte beginnt mit 10 Übrige Bits: Kodierung eines Unicode-Zeichens mit UCS (weglassen überschüssiger führender 0en) 3-Byte-Codes: 1110 xxxx 10xx xxxx 10xx xxxx 4-Byte-Codes: 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx 84 85 Zusammenfassung Daten werden über dem Alphabet {0,1} codiert mit endlich vielen Bits Vorlesung Informatik I Wir haben verschiedene Codierungen für unterschiedliche Datentypen kennengelernt Universität Augsburg In den verschiedenen Codierungen können identische Codeworte vorkommen Wintersemester 2010/2011 Wie ein Codewort interpretiert wird, hängt von der Codierung (also dem Datentyp) ab! Prof. Dr. Robert Lorenz Welche und wieviele Werte codiert werden (können), hängt von der Anzahl der verwendeten Bits ab 86 Lehrprofessur für Informatik Programmieren in C – Fallunterscheidungen 1 Inhalt Inhalt Motivation: Motivation: Bisher: Ausgeführte Anweisungen waren unabhängig von Daten (z.B. Benutzereingabe) Bisher: Ausgeführte Anweisungen waren unabhängig von Daten (z.B. Benutzereingabe) Jetzt: Abhängig von Datenwerten soll ein Programm unterschiedlichen Verlauf nehmen können Jetzt: Abhängig von Datenwerten soll ein Programm unterschiedlichen Verlauf nehmen können Beispiel: Unterscheidung zwischen gültigen und ungültigen Eingaben Unterschiedliche Zinsen für unterschiedliche Anlagebeträge Anweisungen hängen von sog. Bedingungen ab (das sind Ausdrücke, die wahr oder falsch sein können) Als Vorbereitung werden Ausdrücke formal definiert 2 Inhalt 3 Inhalt Vorbereitung: Ausdrücke (formal) Abhängig von Datenwerten soll ein Programm unterschiedlichen Verlauf nehmen können Bedingungen Die Operation ?: Bedingung erfüllt nicht erfüllt Anweisung 1a Anweisung 1b Anweisung 2a Anweisung 2b … … Bedingte Anweisung: if-else Fallunterscheidungen Zeichen 4 5 Ausdrücke Ausdrücke Ausdrücke sind mittels Operationszeichen verknüpfte Variablen und Konstanten zur Darstellungen von Rechenvorschriften Ausdrücke sind mittels Operationszeichen verknüpfte Variablen und Konstanten zur Darstellungen von Rechenvorschriften Konstruktion von Ausdrücken: Konstruktion von Ausdrücken: Variablen und Konstanten sind Ausdrücke Beispiele: laenge,breite,’\n’,3,-4e2,... Ist op ein n-stelliges Operationszeichen und sind E1,…,En Ausdrücke ) Ausdrücke können aus Variablen und Konstanten mit Hilfe von Operationszeichen beliebig verschachtelt aufgebaut werden +(3,*(5,6)), *(+(3,5),6) passenden Typs, so ist op(E1,…,En) ein Ausdruck Beispiele: *(laenge,breite),-(3,-4e2),... 6 Ausdrücke 7 Ausdrücke Schreibweisen für Operationen (Infix-Notation): Unär: statt op(E) schreibt man i.d.R. op E Beispiel: -5 Auswertung Ein Ausdruck hat einen Wert, der sich durch die Werte der Variablen und Konstanten und der Auswertung der Operationen ergibt Binär: statt op(E1,E2) schreibt man i.d.R. E1 op En op(E1,…,En) wird ausgewertet, indem - zuerst E1,…,En ausgewertet werden Beispiel: 3+5 - und dann op ausgewertet wird Ausdrücke werden also von innen nach aussen ausgewertet Auswertungsreihenfolge ist durch den Ausdruck gegeben 8 9 Ausdrücke Ausdrücke Auswertung Problem: Der Infixnotation sieht man die Auswertungsreihenfolge nicht mehr an Beispiel: 3+5*6 Lösung 1: Klammerung vorrangig auszuwertender Operationen Beispiele: 3+(5*6) entspricht +(3,*(5,6)) (3+5)*6 entspricht *(+(3,5),6) Lösung 2: Kenntnis der Bindungsstärke von Operationszeichen Auswertung Auch wenn in der Infixnotation auf Klammerung verzichtet wird, gibt es eine eindeutige Auswertungsreihenfolge: Jede Programmiersprache versieht Operationszeichen mit unterschiedlich starker Bindung der Operanden an die Operation Stärker bindende Operationen werden vorrangig ausgewertet 3+5*6 == 3+(5*6) Gleich stark bindende Operationen werden von links nach rechts ausgewertet 3/5*6 == (3/5)*6 10 Ausdrücke 11 Ausdrücke Auswertung Auswertung Außerdem kann es zu impliziten Typumwandlungen kommen: Grundsätzlich werden vor der Auswertung alle Operanden einer Operation in den längsten vorhandenen Typ umgewandelt Bindungen arithmetischer Operationen: *,/,% binden stärker als +,*,/,% binden gleich stark +,- binden gleich stark Beispiel: Auswertung des Ausdrucks 3.0 / 2 (1) 2 wird in den Typ double umgewandelt, also in 2.0 (2) Operation = Division auf Fließkommazahlen 1(3) Ergebnis: 1.50 x * y / z % 2 entspricht ((x * y) / z) % 2 x + y / z - 2 entspricht (x + (y / z)) – 2 12 13 Ausdrücke Ausdrücke Auswertung Die Auswertung eines Ausdrucks lässt sich gut durch einen sog. Syntaxbaum ausdrücken Auswertung Die Auswertung eines Ausdrucks lässt sich gut durch einen sog. Syntaxbaum ausdrücken Vorbereitende Definitionen 1: Ein gerichteter Graph ist ein Paar (V,F), wobei - V endliche Menge von Knoten - F ⊆ V×V Menge von gerichteten Kanten zwischen Knoten Vorbereitende Definitionen 2: Vorgänger eines Knotens v: {w ∈ V | (w,v)∈F} Nachfolger eines Knotens v: {w ∈ V | (v,w)∈F} Vorgänger von u:{u} Nachfolger von u:{u,w} Grafische Darstellung: Zeichne Pfeile zwischen Knoten V={u,w}, F={(u,u),(u,w)} u w u w 14 Ausdrücke 15 Ausdrücke Auswertung Die Auswertung eines Ausdrucks lässt sich gut durch einen sog. Syntaxbaum ausdrücken Auswertung Die Auswertung eines Ausdrucks lässt sich gut durch einen sog. Syntaxbaum ausdrücken Vorbereitende Definitionen 3: Ein gerichteter Graph heißt azyklisch falls es keine Folge von Knoten v1,...,vn∈V gibt mit (v1,v2),...,(vn-1,vn), (vn,v1)∈F (eine solche Folge heißt Zyklus) Vorbereitende Definitionen 4: Ein Baum ist azyklischer gerichteter Graph (V,F), wobei - es genau einen Knoten ohne Vorgänger gibt (die Wurzel) - jeder Knoten höchstens einen Vorgänger hat Zyklus u Verboten: u w 16 17 Ausdrücke Ausdrücke Auswertung Die Auswertung eines Ausdrucks lässt sich gut durch einen sog. Syntaxbaum ausdrücken Vorbereitende Definitionen 5: Sei (V,F) ein Baum: w Vater von v: (w,v)∈F w Kind von v: (v,w)∈F v Blatt: v hat keine Kinder Blatt Auswertung Der Syntaxbaum eines Ausdrucks E ist ein Baum (V,F), wobei - V die Menge der Teilausdrücke von E ist - E die Wurzel ist - Teilausdrücke, die Variablen oder Konstanten sind, Blätter sind - Teilausdrücke der Form op(E1,…,En)Kinder E1,…,En haben Blatt (Die Teilausdrücke eines Ausdrucks op(E1,…,En) sind E1,…,En Wurzel Blatt Vater und deren Teilausdrücke) Kinder 18 Ausdrücke Bedingungen Auswertung Beispiel: Syntaxbaum des Ausdrucks 2*x+5: Eine Bedingung ist ein Ausdruck, der nur die Werte wahr und falsch annehmen kann Konstruktion von Bedingungen: +(*(2,x),5) *(2,x) 2 19 Mittels sog. Vergleichsoperatoren verknüpfte Ausdrücke sind Bedingungen 5 Mittels sog. logischer Operatoren verknüpfte Bedingungen sind Bedingungen x 20 21 Bedingungen Bedingungen Vergleichsoperationen zur Konstruktion von Bedingungen: Logische Operationen zur Verknüpfung komplexer Bedingungen “kleiner als”-Operation “größer als”-Operation “kleiner oder gleich”-Operation “größer oder gleich”-Operation “genau gleich”-Operation “ungleich”-Operation < > <= >= == != Diese Operationen sind alle binär und u.a. für die Datentypen int, double, char definiert [Hinweis: Verwechseln Sie NICHT = und ==] && logisches “und”, binär B1&&B2 genau dann wahr, wenn B1 und B2 wahr sind || logisches “oder”, binär B1||B2 genau dann falsch, wenn B1 und B2 falsch sind ! logisches “nicht”, unär !B ist genau dann falsch, wenn B wahr ist 22 Bedingungen 23 Bedingungen Wahrheitstafeln Das Verhalten logischer Operatoren lässt sich gut durch sog. Wahrheitstafeln illustrieren Wahrheitstafeln Die Operanden können selbst wieder mit logischen Operationen konstruierte komplexe Bedingungen sein Eine Wahrheitstafel stellt die Auswertung einer logischen Operation in Abhängigkeit vom Wahrheitsgehalt der Operanden dar: Auch deren Auswertung kann in die Wahrheitstafel integriert werden B !B B1 B2 B1&&B2 B1 B2 B1||B2 0 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 24 Mit Wahrheitstafeln lassen sich komplexe Bedingungen auswerten 25 Bedingungen ?:-Operation Besonderheiten der Programmiersprache C: 1. Die Werte wahr und falsch werden durch die ganzen Zahlen 1 und 0 dargestellt man kann auf Bedingungen alle Operationen für ganze Zahlen anwenden ((x>5)+(y<1)) 3-stellige Operation zur situationsbedingten Ausführung einer Anweisung Syntax: B ? E1 : E2 B Bedingung E1, E2 Ausdrücke 2. Als Operand logischer Operationen wird ein Wert ungleich 0 als wahr, und der Wert 0 als falsch interpretiert jeder Ausdruck kann als Bedingung aufgefasst werden (auch Variablen und Konstanten) (5&&(y<1)) Auswertung: falls B wahr ist, wird E1 ausgewertet (der Wert des Ausdrucks B ? E1 : E2 ist der Wert von E1) falls B falsch ist, wird E2 ausgewertet (der Wert des Ausdrucks B ? E1 : E2 ist der Wert von E2) 26 27 ?:-Operation ?:-Operation Beispiel (Ausgabe der größeren von zwei Zahlen) 3-stellige Operation zur situationsbedingten Ausführung einer Anweisung: B ? E1 : E2 /* bsp08.c */ #include <stdio.h> main() { int x,y; printf("\nZ a h l e n v e r g l e i c h\n"); printf("\nBitte x eingeben: "); scanf("%i",&x); printf("Bitte y eingeben: "); scanf("%i",&y); printf("\nGroessere Zahl: %i", (x>y) ? x : y); } B erfüllt E1 nicht erfüllt E2 28 29 Auswertungsreihenfolgen (bisher) if-else Unäre Operationen binden stärker als arithmetische Operationen Bisher: ?:-Operation für situationsabhängige Ausführung einer Anweisung Arithmetische Operationen binden stärker als Vergleichsoperationen Was, wenn man eine ganze Gruppe von Anweisungen situationsabhängig ausführen möchte? Vergleichsoperationen binden stärker als logische binäre Operationen Logische binäre Operationen binden stärker als ?:-Operation 30 if-else 31 if-else Ausführung von (mehreren) Anweisungen, falls eine Bedingung wahr ist: if (Bedingung) { <Anweisungen> } Ausführung von (mehreren) Anweisungen, falls eine Bedingung wahr ist: if (Bedingung) { <Anweisungen> } Bedingung erfüllt Anweisung 1a Falls die Bedingung zutrifft, werden die Anweisungen im {} – Block (dem sog. if-Block) ausgeführt Ist die Bedingung falsch, wird der if - Block wird übersprungen 32 Anweisung 2a … 33 if-else if-else Ausführung von alternativen Anweisungen abhängig vom Wahrheitsgehalt einer Bedingung Ausführung von alternativen Anweisungen abhängig vom Wahrheitsgehalt einer Bedingung: if (Bedingung) { <Anweisungen> } else { <andere Anweisungen> } if (Bedingung) { <Anweisungen> } else { <andere Anweisungen> } Bedingung erfüllt Falls die Bedingung zutrifft, werden die Anweisungen im if – Block ausgeführt, sonst die im else - Block nicht erfüllt Anweisung 1a Anweisung 1b Anweisung 2a Anweisung 2b … … 34 if-else 35 if-else Beispiel (finden Sie diesen Code gut?) /* bsp09a.c */ #include <stdio.h> main() { int jahreseinkommen; printf("\nJahreseinkommen eingeben: "); scanf("%i",&jahreseinkommen); if (jahreseinkommen < 20000) { printf("\n Sie koennen Eigenheimzulage beantragen"); } if (jahreseinkommen >= 20000) { printf("\n Sie koennen keine Eigenheimzulage beantragen"); } } 36 Beispiel (besser, da keine überflüssigen Bedingungen / aber schon perfekt?) /* bsp09b.c */ #include <stdio.h> main() { int jahreseinkommen; printf("\nJahreseinkommen eingeben: "); scanf("%i",&jahreseinkommen); if (jahreseinkommen < 20000) { printf("\n Sie koennen Eigenheimzulage beantragen"); } else { printf("\n Sie koennen keine Eigenheimzulage beantragen"); } } 37 if-else if-else Beispiel (jetzt auch Behandlung nicht sinnvoller Eingaben) Beispiel (jetzt auch Behandlung ungültiger Eingaben) /* bsp09c.c */ #include <stdio.h> main() { int jahreseinkommen; printf("\nJahreseinkommen eingeben: "); scanf("%i",&jahreseinkommen); if (jahreseinkommen < 0) { printf("\n Bitte positive Zahl eingeben "); } else { if (jahreseinkommen < 20000) { …} else { …} } } /* bsp09d.c */ #include <stdio.h> main() { int jahreseinkommen; printf("\nJahreseinkommen eingeben: "); if (scanf("%i",&jahreseinkommen)==1){ if (jahreseinkommen < 0) { printf("\n Bitte positive Zahl eingeben"); } else { if (jahreseinkommen < 20000) { …} else { …} } } else {printf("\n Bitte eine ganze Zahl eingeben");} } 38 39 Fallunterscheidungen if-else Exkurs scanf: Bisher: Alternative Ausführung zweier Anweisungsblöcke scanf hat einen Rückgabewert vom Typ int Rückgabewert gibt an, wievielen Variablen durch die Eingabe erfolgreich ein Wert zugewiesen wurde Was, wenn man mehr als zwei Alternativen zur Verfügung hat? Man kann diesen Wert in einer Bedingung überprüfen Eingabe nur dann gültig, wenn allen Variablen ein Wert zugewiesen werden konnte 40 41 Fallunterscheidungen Fallunterscheidungen Verschachtelung von if-else-Blöcken zur Auswahl aus mehreren sich ausschließenden Alternativen: Auswahl bezüglich vereinfachter Bedingungen aus mehreren sich ausschließennden Alternativen: if (Bedingung1) { Anweisungen } else if (Bedingung2) { Anweisungen } ... else { Anweisungen } Bedingung1 wird ausgewertet Falls Bedingung1 wahr ist, wird erster Anweisungsblock ausgeführt Falls Bedingung1 falsch ist, wird Bedingung2 ausgewertet usw... Falls alle Bedingungen falsch, wird letzter Anweisungsblock ausgeführt switch (Ausdruck) { case Konstante1: Anweisungen /*entspricht if(Ausdruck == Konstante1){Anweisungen}*/ ... case KonstanteN: Anweisungen default: Anweisungen /*entspricht else{Anweisungen}*/ } Ausdruck und Konstanten müssen vom Typ int sein Konstanten müssen alle verschieden sein default-Zeile ist optional Mit der Anweisung break; springt man aus dem switch-Block Ohne break;-Anweisung werden die weiteren Konstanten überprüft 42 Fallunterscheidungen 43 Zeichen Bekannt: /* bsp10.c */ #include <stdio.h> #include <ctype.h> main() { char eingabe; int zahl; printf("\nWaehle (I)nteger, (C)har: "); eingabe = getchar(); printf("\nDezimalzahl eingeben: "); scanf("%i",&zahl); switch (toupper(eingabe)) { case 'I': printf("\n%i",zahl); break; case 'C': printf("\n%c",zahl); break; default: printf("\nKeine gültige Auswahl"); } } Der Datentyp für Zeichen ist char Sein Speicherbedarf beträgt 1 Byte Darstellung im Speicher: Zeichen in C-Programmen werden als ganze Zahlen zwischen 0 und 127 (255) dargestellt Die Zuordnung von Zeichen zu Zahlen gibt die sog. ASCIITabelle an (siehe Kapitel zu Zeichendarstellungen) 44 45 Zeichen 0 - 127 Zeichen Folgerungen: Mit Zeichen kann man wie mit ganzen Zahlen rechnen (alle Operationen für ganze Zahlen verwendbar) Man kann eine ganze Zahl als Zeichen oder als ganze Zahl auffassen Für die Interpretation als Zeichen dient der Platzhalter %c in printf- und scanf- Formatanweisungen 46 Zeichen 47 Zeichen Zeichen-Funktionen Zeichen-Funktionen int getchar() Bei Aufruf wartet das Programm auf eine Benutzer-Eingabe. Nach Drücken der Eingabetaste wird das erste Zeichen des Standard-Eingabestroms gelesen und zurückgegeben. ctype.h Deklaration verschiedener Zeichenfunktionen (u.a. toupper()) stdio.h-Funktion Keine Eingabeparameter Gibt das erste Zeichen des Standard-Eingabestroms zurück Rückgabetyp: int 48 49 Zeichen Zeichen-Funktionen Vorlesung Informatik I toupper(char c) Universität Augsburg Wandelt Kleinbuchstaben in Großbuchstaben um Wintersemester 2010/2011 Eingabeparameter: ein Zeichen vom Typ char Rückgabewert: Eingabewert umgewandelt in Großbuchstaben (läßt Großbuchstaben unverändert, nicht für Umlaute und ß) Prof. Dr. Robert Lorenz Lehrprofessur für Informatik Umwandlung in Kleinbuchstaben: tolower() Programmieren in C – Wiederholungen 50 Inhalt 1 Inhalt Motivation: Motivation: Bisher: Anweisungen werden höchstens einmal ausgeführt Bisher: Anweisungen werden höchstens einmal ausgeführt Jetzt: Anweisungen wiederholt ausführen Jetzt: Anweisungen wiederholt ausführen Beispiele Wiederholte Eingabe von Daten durch den Benutzer Mehrere (durch den Benutzer eingegebenen) Zahlen summieren Euklidischer Algorithmus Restliche Zeichen des Eingabestroms (zeichenweise) einlesen Anweisungen werden wiederholt, solange eine Bedingung gilt 2 3 Inhalt Inhalt Anweisungen wiederholt ausführen Zählschleifen Bedingungs-Schleifen Bedingung erfüllt Aussetzen/Fortsetzen von Schleifen nicht erfüllt … Anweisung 1 Anweisungsblöcke verschachteln … Eingabestrom leeren Anweisung n 4 Zählschleifen Zählschleifen Anzahl der Wiederholungen steht fest Anzahl der Wiederholungen steht fest int i,n=...; for(i=0;i<n;i=i+1) { <Anweisungen> } int i=...,n=...; i < n erfüllt Anweisung 1 5 nicht erfüllt Anweisungen werden (hier) n-mal wiederholt … i heißt Zählvariable zählt die Anzahl der Wiederholungen (i<n) heißt Schleifenbedingung von ihrem Wert hängt Ausführung der Anweisungen ab … i=i+1 6 7 Zählschleifen Zählschleifen Allgemeine Form: Allgemeine Form: for(A;B;C) { <Anweisungen> } for(A;B;C) { <Anweisungen> } A legt Anfangswert einer Zählvariable fest (erste ausgeführte Anweisung, Anfangswert ist beliebig) Achtung vor Unendlichschleifen: bei schlechter Festlegung ist die Bedingung nach jeder Wiederholung wieder erfüllt: Anzahl der Wiederholungen unbegrenzt Schleife terminiert nicht Beispiel: for(i=0;i!=9;i=i+2) { <Anweisungen> } B ist eine Bedingung, die die Zählvariable erfüllen muss, damit Anweisungen im for-Block ausgeführt werden C verändert Wert der Zählvariablen (wird immer nach den Anweisungen im for-Block ausgeführt) 8 9 Zählschleifen Zählschleifen Beispiel: Berechnung der Fakultät n! = 1 * 2 * … * n Beispiel: Berechnung der Fakultät n! = 1 * 2 * … * n /* bsp12.c */ #include <stdio.h> main() { int i,n,fak=1; printf("Natuerliche Zahl n eingeben: "); scanf("%i",&n); for(i=1; i<=n; i++) { fak=fak*i; } printf("%i! = %i",n,fak); } (1) (2) (3) for(i=1; i<=n; i++) { fak=fak*i; } Werte verfolgen per Tabelle: Zeile (1) (2) (3) (1) (2) (3) (1) 10 i 1 1 2 2 2 3 3 * * fak 1 1 1 1 1 2 2 2 n 2 2 2 2 2 2 2 2 (i<=n) 1 1 0 11 Zählschleifen Zählschleifen Beispiel: Summen-/Mittelwertbildung – Benutzer gibt Anzahl der Summanden vorher an /* bsp11.c */ #include <stdio.h> main() { int i,anzahl; double zahl,summe=0.0; printf("Wieviel Werte wollen Sie eingeben: "); scanf("%i",&anzahl); for(i=0; i<anzahl; i++) { printf("Bitte %i. Zahl eingeben : ",i+1); scanf("%lf",&zahl); summe=summe+zahl; } printf("Summe der Zahlen = %f",summe); printf("\nMittelwert der Zahlen = %f",summe/anzahl); } Beispiel: Summen-/Mittelwertbildung – Benutzer gibt Anzahl der Summanden vorher an Wieviele Werte wollen Sie eingeben: 2 Bitte 1. Zahl eingeben: 8 Bitte 2. Zahl eingeben: 13 Summe der Zahlen: 21 Mittelwert der Zahlen: 10.5000000 12 Bedingungs-Schleifen 13 Bedingungs-Schleifen Bisher: Anzahl der Wiederholungen steht von vornherein fest Anzahl der Wiederholungen steht nicht fest, Bedingung vor erster Ausführung überprüft: Jetzt: Anzahl der Wiederholungen steht nicht von vornherein fest Bedingung erfüllt Anweisung 1 Beispiel: Summenberechnung ohne vorherige Eingabe der Anzahl der Zahlen zu summierenden Zahlen: viel benutzerfreundlicher! Abbruch des Programms durch besondere Eingabe erlauben nicht erfüllt … … Anweisung n 14 15 Bedingungs-Schleifen Bedingungs-Schleifen Anzahl der Wiederholungen steht nicht fest, Bedingung vor erster Ausführung überprüft: Anzahl der Wiederholungen steht nicht fest, Bedingung vor erster Ausführung überprüft: while (Bedingung) { <Anweisungen> } while (Bedingung) { <Anweisungen> } Anweisungen werden solange wiederholt wie die Bedingung erfüllt ist: Wichtig: Bedingung wird auch vor der ersten Ausführung der Anweisungen überprüft: Variablen der Bedingung vor der Schleife initialisieren! Vor dem ersten Durchlauf sollte die Bedingung wahr sein Anweisungen sollten dazu führen, dass die Bedingung nach endlich vielen Wiederholungen nicht mehr zutrifft (sonst hat man eine Unendlichschleife programmiert) 16 Bedingungs-Schleifen 17 Bedingungs-Schleifen Beispiel: Flexibler Abbruch der Eingabe von Zahlen for-Schleife durch while-Schleife ausdrücken: /* bsp13a.c */ #include <stdio.h> main() { int anzahl=0; double zahl =1,summe=0.0; printf("Beenden der Eingabe mit '0' "); while (zahl != 0) { printf("Bitte %i. Zahl eingeben : ",anzahl+1); scanf("%lf",&zahl); summe=summe+zahl; anzahl++; } … for(A;B;C) { <Anweisungen> } entspricht A; while (B) { <Anweisungen> C; } 18 19 Bedingungs-Schleifen Bedingungs-Schleifen Anzahl der Wiederholungen steht nicht fest, Bedingung nach erster Ausführung überprüft: Anzahl der Wiederholungen steht nicht fest, Bedingung nach erster Ausführung überprüft: do { Bedingung erfüllt <Anweisungen> } while (Bedingung); nicht erfüllt Anweisung 1 … Anweisungen werden solange wiederholt wie die Bedingung erfüllt ist … Bedingung wird erst nach der ersten Ausführung der Anweisungen überprüft: Anweisungen werden auf jeden Fall einmal ausgeführt! Anweisung n 20 Bedingungs-Schleifen 21 Bedingungs-Schleifen Beispiel: Flexibler Abbruch der Eingabe von Zahlen Abbruch von Unendlichschleifen mit break: /* bsp13b.c */ #include <stdio.h> main() { int anzahl=0; double zahl,summe=0.0; printf("Beenden der Eingabe mit '0' "); do { printf("Bitte %i. Zahl eingeben : ",anzahl+1); scanf("%lf",&zahl); summe=summe+zahl; anzahl++; } while (zahl != 0); … while(1) { ... if (Bedingung) { break;} ... } Durch Ausführung von break wird die Schleife verlassen 22 23 Bedingungs-Schleifen Bedingungs-Schleifen Beispiel: Flexibler Abbruch der Eingabe von Zahlen Fortsetzung von Unendlichschleifen mit continue: /* bsp13c.c */ #include <stdio.h> main() { int anzahl=0; double zahl,summe=0.0; printf("Beenden der Eingabe mit '0' "); while(1) { printf("Bitte %i. Zahl eingeben : ",anzahl+1); scanf("%lf",&zahl); if (zahl==0){break;} summe=summe+zahl; anzahl++; } … while(Bedingung1) { ... if (Bedingung2) { continue;} ... } Durch Ausführung von continue werden nachfolgende Anweisungen übersprungen und mit einem neuen Schleifendurchlauf begonnen Beispiel: Neue Eingabe nach ungültiger Eingabe 24 Bedingungs-Schleifen Verschachtelung von Blöcken Beispiel: Fortsetzung von vorn bei ungültiger Eingabe /* bsp13d.c */ #include <stdio.h> main() { int anzahl=0; double zahl,summe=0.0; printf("Beenden der Eingabe mit '0' "); while(1) { printf("Bitte %i. Zahl eingeben : ",anzahl+1); if (scanf("%lf",&zahl)==0){ printf("Bitte Zahl eingeben"); continue; } if (zahl==0){break;} summe=summe+zahl; anzahl++; } … 25 Wir kennen schon verschiedene sog. Anweisungsblöcke: if- else-,for-,while-,do-Block Diese Blöcke können in beliebiger Tiefe ineinander verschachtelt werden in der Form: [Anfang Block 1] { [Anfang Block 2] { }[Ende Block 2] }[Ende Block 1] 26 27 Verschachtelung von Blöcken Verschachtelung von Blöcken Wir kennen schon verschiedene sog. Anweisungsblöcke: if- else-,for-,while-,do-Block Wir kennen schon verschiedene sog. Anweisungsblöcke: if- else-,for-,while-,do-Block Nicht möglich ist es, Blöcke ineinander zu verschränken: Variablen-Deklarationen und break-/continue-Anweisungen betreffen nur den Block, in dem diese stehen, und weiter innen liegende Blöcke, aber nicht umfassende Blöcke [Anfang Block 1] { [Anfang Block 2] { }[Ende Block 1] }[Ende Block 2] 28 Eingabestrom leeren 29 Eingabestrom leeren Es existiert standardmäßig keine vordefinierte Funktion zum Leeren restlicher Zeichen aus dem Eingabestrom!!! (insbesondere: fflush/rewind haben nicht diese Funktionalität) Wir müssen uns das selbst überlegen Grundidee: Jede Eingabe wird mit \n abgeschlossen und enthält sonst kein \n-Zeichen: Hole nach jede Eingabe restliche Zeichen mit getchar() aus dem Eingabestrom bis einschließlich dem \n-Zeichen 30 Hole nach jede Eingabe restliche Zeichen mit getchar() aus dem Eingabestrom bis einschließlich dem \n-Zeichen char c = getchar(); while (c!=‘\n‘) { c = getchar(); } oder kürzer (Anweisungen zusammenfassen): while (getchar()!=‘\n‘) { } 31 Eingabestrom leeren Beispiel: /* bsp13e.c */ #include <stdio.h> main() { int anzahl=0; double zahl,summe=0.0; printf("Beenden der Eingabe mit '0' "); while(1) { printf("Bitte %i. Zahl eingeben : ",anzahl+1); if (scanf("%lf",&zahl)==0){ while (getchar()!='\n') { } printf("Bitte Zahl eingeben"); continue; } if (zahl==0){break;} summe=summe+zahl; anzahl++; while (getchar()!='\n') { } }... 32
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
advertisement