Technische Informatik - Grundlagen der Informatik - ANSI C 2.0 Grundlagen Programmierung - Einführung Prof. Dr.-Ing. Frank Artinger
[email protected]
Hinweise: Die vorliegende Vorlesung – ANSI C 2.0 Grundlagen Programmierung - basiert in wesentlichen Teilen auf dem gleichnamigen Skriptum des HERDT-Verlages für ITSchulungsunterlagen. Die ständige Aktualisierung sichert gleichzeitig die Aktualität der Lehrinhalte (ANSI-Standard). Hyperlink: http://www.herdt4you.de/
Inhalt der Vorlesung Einführung Einführung Organisatorisches Literatur, WWW Resources Motivation (Primär, Aktuelle Trends, Arbeitsmarktanalyse, Globalisierung) Inhaltsübersicht der Informatik Vorlesung Was ist Informatik? Begriff „Informatik“ Information und Daten Ingenieur- und/oder Strukturwissenschaft? Teilgebiete der Informatik Daten und Algorithmen Programmiersprachen (Genealogie) Beispielalgorithmus Warum C/C++ Programmierspache erlernen?
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
3
Organisatorisches MT • • • • • •
5 SWS (6 cp) Abschließende Klausur (90 min Dauer) (PL, TF) Vorlesung/Übung (3 SWS, 3 cp) Labor (2 SWS, 3 cp) (gem. Terminplanung) Hinweis: Vorlesung und Labor im PC-Pool (F101) Downloads zur Vorlesung (Powerslides, etc.) liegen unter: \\ads\dfs\MMT\public\Mitarbeiter\Artinger\Vorlesungen\Informatik
• Seminar-Unterlage zur Vorlesung: ANSI C 2.0 Grundlagen Programmierung, HERDT-Verlag
• Erreichbarkeit Telefon: (0721) 925 - 1716 / - 1701, Fax: (0721) 925 - 1707 Sekretariat (Fr. Loykowski): (0721) 925 - 1708 eMail
[email protected] Sprechzeit Di 12:30 – 13:30h oder nach Vereinbarung Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
4
Labor MT (SL) Labortermine und Inhalte (Aufgabenblätter) \\ads\dfs\MMT\public\Mitarbeiter\Artinger\Vorlesungen\Informatik\Uebu ng\Allgemeines (Excel-Tabelle MT)
„Spielregeln“ für den Erhalt der Studienleistung BE a) Laborvorbereitung Bearbeitung der Multiple-Choice Aufgaben (2-er / 3-er Gruppe) HINWEIS: Jede Antwort zu einer Multiple-Choice Frage ist zu begründen! MT: Abgabe der bearbeiteten Aufgabenblätter spätestens am vereinbarten Tag vor dem Labortermins bis 10:00h (Postfach im Sekretariat) (je 2-er/3-er Gruppe)
b) Teilnahme am Labor Kontrolle durch Anwesenheitsliste mehr als 1 unentschuldigtes Fehlen führt automatisch zum NB mehr als 1 unentschuldigte Nicht-Abgabe führt autom. zum NB
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
5
Übung MT (SL) (1) Übungsblätter über e-Learning Plattform ILIAS Parallel zur Vorlesung werden Sie eigenständig Übungsblätter (Programmieraufgaben) bearbeiten Hierfür steht ein vorgegebener Zeitraum zur Verfügung (ca. jeweils 1 Monat) Die Abgabe Ihrer Lösungen (innerhalb des Bearbeitungszeitraumes) ist verpflichtend und wird mit einer abschließenden SL (Studienleistung) bewertet Die Organisation der Übung erfolgt über die e-Learning Plattform ILIAS
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
6
Übung MT (SL) (2) FAQs zu ILIAS Wo befindet sich ILIAS? http://www.ilias-karlsruhe.de/
Wie funktioniert ILIAS? Adobe Acrobat 7.0 Document
Anmeldung bei ILIAS Nachfolgend wird der Anmeldevorgang bei ILIAS (allgemein) und die notwendigen Schritte zum Beitritt zur Übungsveranstaltung in Snaphots erläutert.
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
7
Übung MT/FT (SL) (3)
Danach: Anmeldung mit Benutzername / Passwort
Erstmalig: Neues Benutzerkonto anlegen (als Benutzername bitte unbedingt IZ-Kürzel (z.B. arfr0001) verwenden! (Passwort frei wählbar)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
8
Übung MT (SL) (3)
Sicht auf Persönlichen Schreibtisch
Jetzt anwählen (falls nicht verfügbar bitte unter Magazin auswählen)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
9
Übung MT/FT (SL) (3)
hier sind bereits die LV in Fakultät MMT sichtbar..
Jetzt Gruppe der MMT-Studenten beitreten Passwort: MMT- Beispiel: WS0910: MMT-09ws
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
10
Bitte Pfad folgen bis GDI (Grundlagen der Informatik)
hier bitte MT LV wählen und Beitreten Passwort MT: MTB241
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
11
z.B. Übungsblatt 1 mit Angabe des Bearbeitungszeitraums!
hier bitte Übungsblatt (*.doc) herunterladen
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
12
Einreichung auswählen zum Upload Ihrer Lösung(en)
hier Ihren lokalen Pfad eingeben/auswählen
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
13
Übersicht: Termine - Themen Termine - Themen W
Thema
W
Thema
1
Einführung und Organisation
9
Zeiger (Grundlagen)
10
Zeiger (Dynamische Speicherplatzverwaltung)
11
Zeiger (Anwendungen)
2 L1: Grundlagen / Datentypen
L2: Ein-Ausgabe Operatoren
3
Grundlagen (IDE, „Hello world“, Ein-/Ausgabe, Funktionen) Datentypen und Operatoren Teil 1
4
Datentypen und Operatoren Teil 2
12
Modulare Programmierung
5
Nützliche Funktionen und Speicherklassen
13
Spezialitäten (Überladung, inline, etc.)
6
Steuerstrukturen (Teil 1)
14
Standardbibliotheken
7
Steuerstrukturen (Teil 2)
15
Noch Fragen ?
8
Komplexe Datentypen
L3: Steuerstrukturen Funktionen
L4: Zeiger Vektoren
W: Woche
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
14
Klausur MT Prüfungsmodalität • Schriftliche Prüfung (ohne PC) • Verständnisfragen (Multiple Choice), Fehlersuche im Code und eigenständige Programmierung
Prüfungsinhalte • Sprachumfang ANSI-C/C++ • prozedural (ohne Objektorientierung) • Klausuraufbau vgl. Labor/Übungsblätter
Bewertungskriterien • logischer Gedankenfluss (vor allem bei Programmieraufgaben) • Syntax wird natürlich bewertet, aber keine Panik!
Nicht Bestandteil der Prüfung • UML Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
15
Organisatorisches Bezugsmöglichkeiten der begleitenden Seminar-Unterlage Alternative 1: direkte Bestellung beim HERDT-Verlag Kosten: 16,50 € (Stand: 09/07)
Alternative 2: HERDT-Verlag kooperiert seit ca. 10 Jahren mit dem Rechenzentrum der Universität Hannover (RRZN) RZ Karlsruhe (TH) bietet als Partner einen vergünstigsten Bezug ausgewählter Seminar-Unterlagen an (Liste verfügbarer Handbücher unter: http://www.rz.uni-karlsruhe.de/publikationen/2817.php) Studentenausweis + Mensakarte
Titel: C Die Programmiersprache C, Ein Nachschlagewerk Kosten: ca. 3,60 €, bargeldlos im Foyer beim BIT8000 erhältlich
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
16
Literatur Grundlagen Informatik Grundlagen der Informatik H.Balzert: Lehrbuch Grundlagen der Informatik. Spektrum Lehrbuch, Heidelberg 2005. C.Vogt: Informatik. Eine Einführung in Theorie und Praxis. Spektrum Lehrbuch, Heidelberg 2004. P.Levi,U.Rembold: Einführung in die Informatik für Ingenieure und Naturwissenschaftler. Carl Hanser Verlag, München 2003. (Informatik Vorlesung Uni Karlsruhe, Stuttgart) P.Rechenberg: Was ist Informatik? Eine allgemeinverständliche Einführung. Carl Hanser Verlag, München 2000. H.-P.Gumm, M.Sommer: Einführung in die Informatik. Oldenbourg, 2002
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
17
Literatur C/C++ Programmierung Grundlagen der C/C++ Programmierung ISO/IEC 14882-1998, International Standard –Programming Language – C++. (elektronisch über http://www.ansi.org erhältlich) U.Breymann: C++ Eine Einführung. Carl Hanser Verlag, München 1999. (http://www.informatik.hs-bremen.de/~brey) P.Prinz, U.Kirch-Prinz: C++ Lernen und professionell anwenden. mitpVerlag, Bonn, 2002. P.Prinz, U.Kirch-Prinz: C für PCs Einführung und professionelle Anwendung. mitp-Verlag, Bonn, 2002. B.Stroustrup: Die C++ Programmiersprache. Addison-Wesley, München, 2000. (http://www.research.att.com/) A.Willms: C++ Programmierung. Addison-Wesley, München, 1997 S.Qualline: Praktische C++ Programmierung. O‘Reilly, Köln, 2004 B.Eckel: Thinking in C++. 2nd Edition, Volume 1 + 2, Prentice Hall, 2000. (http://bruceeckel.com kostenlos erhältlich) C/C++ Tutorials im Web: http://www.c-plusplus.de HERDT-Verlag: ANSI C 2.0 http://www.herdt.de Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
18
Literatur weiterführend.. Objektorientierte Analyse und Design (OOA/OOD) G.Booch: Objektorientierte Analyse und Design. Addison-Wesley, München, 1995
Software-Technik H. Balzert: Lehrbuch der Software-Technik. Spektrum Akademischer Verlag, Heidelberg, 2000
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
19
Literatur weiterführend.. UML, SW-Entwicklungsprozess, Patterns G.Booch, J.Rumbaugh, I.Jacobson: The Unified Modeling Language User‘s Guide. Addison Wesley 1999 (ISBN 0-201-57168-4) G.Booch, J.Rumbaugh, I.Jacobson: The Unified Modeling Language Reference Manual. Addison Wesley 1999 (ISBN 0-201-30998-X) G.Booch, J.Rumbaugh, I.Jacobson: The Unified Software Development Process. Addison Wesley 1999 (ISBN 0-201-30998-X) M.Fowler, K.Scott: UML Distilled, Addison Wesley 1997 (ISBN 0-20132563-2) B.Oestereich: Objektorientierte Software-Entwicklung, Oldenburg Verlag 1998 (ISBN 3-486-24787-5) E.Gamma, R.Helm, R.Johnson et.al.: Design Patterns, Addison Wesley 1995 (ISBN 0-201-63361-2)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
20
WWW Resources weiterführend.. www.omg.org
Object Management Group
www.rational.com
Firma Rational
www.cetus-links.org
Links zu „Objects & Components“
www.hillside.net/pattern
Patterns Home Page
sunset.usc.edu
Center for Software Engineering
www.esi.es
European Software Institute
www.sei.cmu.edu
Software Engineering Institute
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
21
Motivation – Primäre Sicht Erwartungen, Beweggründe -> Ihre Meinung ist gefragt ! Antwort 1)
„Steht im Lehrplan, da muß man durch!“
Antwort 2)
„Seitdem ich die Sprachhierarchie von Noam Chomsky studiert habe liebe ich formale Sprachen!“
Antwort 3)
„Warum spielt die Objektorientierung eine so große Rolle? Wie unterstützt eine Sprache das? Was steckt hinter informationstechnischen Trends wie XML, component-based, UML und Enterprise Solution Development?“
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
22
Motivation – Aktuelle Trends Thema: Software in der Automobilindustrie “… zentrales Thema .. der Gesellschaft für Informatik ist daher der Anwendungsbereich Automobil: Software und Elektronik sind die wichtigsten Innovationsfaktoren in der Automobilindustrie. Sie steuern sowohl das Bordnetz als auch Fahrwerk und Antrieb. Sie übernehmen nicht nur das Motormanagement, sondern auch Sicherheitsaufgaben und sorgen für mehr Komfort beim Fahren. Dazu kommen Navigations- und Telematiksysteme als Teile des neuen Infotainment im Auto… Laut aktuellen Marktforschungen wird der Wertschöpfungsanteil der Elektronik am Fahrzeug in den nächsten 15 Jahren von derzeit 20 auf 40 Prozent wachsen, der Anteil von Automobilsoftware soll sich sogar von rund 25 Milliarden Euro im Jahr 2000 auf 100 Milliarden Euro im Jahr 2010 vervierfachen... Hier ist ganz besonders die Informatik herausgefordert. Der Entwicklungsprozess für Software ist methodisch aufwändiger als in der Mechanik, insbesondere brauchen wir zur Qualitätsverbesserung einen herstellerübergreifenden Standardisierungsprozess„ (GI-Präsident Heinrich C. Mayr)..“ (Quelle: Jahrestagung INFORMATIK 2003, VDI Pressemitteilung Oktober 2003)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
23
Motivation – Aktuelle Trends Thema: Software in der Automobilindustrie Interview mit Fa. VALEO zur New Yorker Motorshow zum Thema Ausrüstung von Nissans Infiniti Modelle mit einem Fahrspurerkennungssystem/Fahrassistenzsystem: „... Neben der Hardware spielt, gerade bei Fahrerassistenzsystemen, die Software eine Rolle. Wie bedeutend ist diese Rolle? Sehr. Wir unterteilen aber das Softwareengineering: in Systemengineering. Dies beschreibt das Systemverhalten und orientiert sich sehr nah an der Anwendung und erfordert daher ein tiefes Verständnis des Produkts. Und Programmierung. Also der Übersetzung in die Maschinensprache mit all den Einschränkungen der Hardware. Software ist auch das Herz künftiger Assistenzsysteme. Es ist wie der Zucker im Kaffee, essenziell und unsichtbar. Demnach gehört die Softwareentwicklung zum Kerngeschäft? Definitiv ja. …
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
24
Motivation – Aktuelle Trends ... Fortsetzung ... Sehen Sie die Automobilbranche genügend gut aufgestellt, um die Anforderungen an die Softwareentwicklung zu meistern? Ich sehe das Thema nicht ganz so kritisch, wie es manchmal dargestellt wird. Die auftretenden Probleme lassen sich oftmals natürlich als Softwareproblem darstellen. Aber es sind vielmehr nicht verstandene Systemaspekte. Ich erwähnte bereits die immense Anzahl möglicher Konfigurationen im Fahrzeug, die nicht mehr alle erprobt werden können, in der Konzeptphase der Entwicklung müssen sie daher sehr systematisch vorgehen und genau wissen was für Optionen sie benötigen und wie diese zusammen spielen. Oftmals bereitet nicht das alleinstehende Produkt das Problem, vielmehr das Produkt im Zusammenspiel mit anderen Systemen.” (Quelle: AUEL – AUTOMOBIL-Elektronik, Heft 3/2004, S. 16-17)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
25
Motivation – Der Arbeitsmarkt Arbeitsmarktsituation
(Quelle: CDI – Deutsche Private Akademie für Wirtschaft GmbH, Stellenmarktanalyse 2003)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
26
Motivation – Der Arbeitsmarkt Arbeitsmarktsituation
(Quelle: CDI – Deutsche Private Akademie für Wirtschaft GmbH, Stellenmarktanalyse 2003)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
27
Motivation - Globalisierung Stichwort „Globalisierung“ • Steigende Integration weltweiter Volkswirtschaften durch Handel und Finanzströme • „Ungleichheit“ (insbes. Pro-Kopf-Einkommen) führt zur Verlagerung („outsourcing“, „off-shoring“, etc.) lohnkostenintensiver Arbeitstätigkeiten (insbes. Fertigung)
Microsoft owerPoint Presentatio
Lessons learned • Konzentration auf höherwertige Tätigkeiten (Entwicklung, Forschung) • „Jede Kultur besitzt ihre einzigartigen Vorzüge“ (Quelle: International Monetary Fund, Globalisierung: Bedrohung oder Chance?)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
28
Inhalt der Vorlesung Einführung
Einführung Was ist Informatik? Warum C/C++ Programmierung erlernen? Grundlagen Rechnerarchitektur Maschinen und Maschinenmodelle
Grundlagen Programmierung Zahlensysteme Zeichencodes
ANSI C/C++ Programmierung Einleitung Das erste Programm in C Konstanten Einfache Datentypen Unterprogramm-Technik Nützliche Funktionen Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
29
Inhalt der Vorlesung Einführung Steuerstrukturen Typvereinbarungen von Variablen Zeiger Der Präcompiler Modulare Programmierung Entwicklungsumgebungen Standardbibliotheken Anhang
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
30
Was ist Informatik? Orientierung Einführung
ORIENTIERUNG
Was ist Informatik? Warum C/C++ Programmierung erlernen? Grundlagen Rechnerarchitektur Maschinen und Maschinenmodelle
Grundlagen Programmierung Zahlensysteme Zeichencodes
ANSI C/C++ Programmierung Einleitung Das erste Programm in C Konstanten Einfache Datentypen Unterprogramm-Technik Nützliche Funktionen Steuerstrukturen Typvereinbarungen von Variablen
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
31
Was ist Informatik? Ziele ¾ Wissenschaftliche Einordnung des Begriffs „Informatik“ ¾ Welche wichtigen Teilgebiete der „Informatik“ gibt es? ¾ Was bedeutet Informationsverarbeitung?
ZIELE
¾ Wofür benötigen wir Programmiersprachen? ¾ Wie unterscheiden sich die Programmiersprachen? ¾ Zum Beispiel ein Beispiel..
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
32
Was ist Informatik? Inhalt Was ist Informatik? Begriff „Informatik“ Information und Daten Ingenieur- und/oder Strukturwissenschaft?
INHALT
Teilgebiete der Informatik Daten und Algorithmen Programmiersprachen Beispielalgorithmus
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
33
Was ist Informatik? Begriff „Informatik“ Begriff Informatik und „Computer-Führerschein“ • Begriff „Informatik“ mittlerweile fester Bestandteil des deutschen Wortschatzes, wird i.A. aber sehr unspezifisch gebraucht • Häufig verbunden mit „Fertigkeit in der Bedienung eines Computers“ -> z.B. „Computer-Führerschein“
Eurpean Computer Driving License (ECDL)
• Genauso wenig wie Inhaber eines Kfz-Füherscheins automatisch Experte für Kfz-Technik ist, macht die reine Bedienung des Computers noch keinen „Informatiker“ aus • es fehlt der tiefere Einblick „unter die Motorhaube“ wie man ihn an Unis/Fachhochschulen vermittelt (grundlegende Prinzipien, Modelle und Methoden der systematischen Verarbeitung von Informationen und ihre Anwendung in der Praxis)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
34
Was ist Informatik? Begriff „Informatik“ Balanceakt zwischen „Breite“, „Tiefe“, „Überschaubarkeit“ • Informatikvorlesung (gerade im Nebenfach) steht immer in dem Spannungsfeld von 3 konkurrierenden Forderungen: • A) Breit angelegt: Möglichst alle Themen ansprechen, die in der modernen Informatik bedeutsam sind • Klassische Themen: Zahlencodierung, Maschinen- und Sprachmodelle, Algorithmen • Moderne Themen: objektorientierte-SW-Entwicklung, Rechnernetze, verteilte Systeme (Client-Server, Web-basierte Systeme), Multimedia • B) Tiefgängig: Themenkomplexe möglichst detailliert behandeln, möglichst wenig Fragen offen lassen • C) Überschaubar: Themen übersichtlich strukturieren, Ermüdungserscheinungen vorbeugen
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
35
Was ist Informatik? Begriff „Informatik“ Ziele der Informatik 1 Vorlesung • Konzentration auf ein modernes Thema der Informatik: „Programmierung in der Sprache C/C++“ • Keine Beschränkung auf die rein formalen Sprachelemente, sondern Fokussierung auf die Denkweise der OOP1 • Weiterhin gehen wir auch auf das in der Praxis äußerst wichtige Thema des „Programmierstils“ ein • Für Themen, die sich aus Zeitgründen einer tiefergehenden Betrachtung entziehen erfolgen Hinweise auf weiterführende Literatur/Links im WWW
1
: Objekt-Orientierte Programmierung
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
36
Was ist Informatik? Information und Daten Information • besitzt Bedeutung für den Nutzer • beinhaltet etwas Neues, Unbekanntes • vermehrt Wissen und beeinflusst Verhalten • z.B. Öldruckmessgerät im Fahrzeug liefert Information über den Öldruck
Daten • Formale Darstellung der Information • Repräsentation / Codierung von Information • z.B. Anzeige im Analogmessgerät oder Ziffernfolge in digitaler Anzeige
Repräsentation
Codierung Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
37
Was ist Informatik? Information und Daten Kerninhalte der Informatik • Speicherung, Verarbeitung und Übertragung von Informationen in Form von Daten ¾stellt grundlegende Prinzipien, Modelle bereit ¾Praktisch-technische Umsetzung mit Methoden und Geräten ¾Ermöglicht die Anwendung in vielen Bereichen
Zentrales Werkzeug Datenverarbeitung im „großen Stil“ „Computerwissenschaft“
Digitalrechner
Frank Artinger Technische Informatik und Programmieren
„Computer Science“ (U.S.)
Informatik - Einführung
38
Was ist Informatik? Ingenieur- und/oder Strukturwissenschaft? Ingenieurwissenschaft • Technisch-konstruktive Aspekte im Vordergrund ¾Entwurf, Realisierung und Einsatz technischer Geräte/Systeme (Computer, PDAs, Spielekonsolen, Prozessoren für Gerätesteuerung) ¾Konzepte der Elektrotechnik, Mikroelektronik, neuerdings auch Optik, Quantenphysik, Genetik (z.B. Evolutionäre Algorithmen) ¾Software Engineering: ing.-mäßiges Entwickeln großer SWAnwendungen ¾Kommunikationssysteme (Übertragungstechnik, Vernetzung von Computern) -> Nachrichtentechnik
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
39
Was ist Informatik? Ingenieur- und/oder Strukturwissenschaft? Strukturwissenschaft • Schaffung von Ordnungsprinzipien („Denkschule“): Modelle, Methoden, Regeln, Verfahren zur Datenspeicherung, -verarbeitung, -übertragung ¾Systematische Verarbeitung von Information durch Strukturierung von Daten (z.B. Binärcodierung, Filesystem, Database) ¾Algorithmen: Rechenvorschriften für Transformation Eingabedaten -> Ausgabedatensysteme (Grob- / Feinstruktur) ¾Systeme: Einbettung von Daten und Algorithmen (Schnittstellen, Dienste, Komponenten, Hierarchie und Modularisierung) ¾Abstraktion: Systementwicklung über das Modell (Entwurf der Systemstruktur) zur Realisierung (Implementierung) ¾Formale Beschreibung: Dokumentenbeschreibungssprachen (HTML, XML), Programmiersprachen (C, C++, Java, C#)
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
40
Was ist Informatik? Teilgebiete der Informatik (Curriculum) Theoretische Informatik • Mathematisch geprägt (formale Maschinen-/Berechnungsmodelle) • Berechenbarkeit und Komplexität von Algorithmen • Theorie der formalen Sprachen (Hierarchie der Grammatiken) • Automatentheorie
Technische Informatik • Logischer Entwurf und technische Realisierung von Computern (Rechnerarchitektur) und Rechennetzen • Digitale Schaltnetze, Prozessoren, Speicher, Peripheriegeräte
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
41
Was ist Informatik? Teilgebiete der Informatik (Curriculum) Praktische Informatik • Programmierung von Computern • Entwicklung von Programmiersprachen-/verfahren • Compiler-/Interpreterbau • Software-Engineering (Leitlinie für komplexe Systeme) • Systemsoftware, Betriebssysteme, SW-Entwicklungsumgebungen (IDE1s), UI (User-Interface), Bedienoberflächen • Datenbank- und Informationssysteme (Documentation-Management) • Distributed Systems (verteilte Systeme) • Real-Time Systems (Echtzeitsysteme)
Angewandte Informatik • Lösungen für spezielle Benutzerprobleme (Büroautomatisierung, Computergraphik, Multimedia, Simulationen, medizinische Informatik) 1
: Integrated Development Environment
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
42
Was ist Informatik? Daten und Algorithmen als Kernbegriffe der Informatik Benutzer
Algorithmen: Strukturierte Verarbeitung ... ... von Information Daten: Strukturierte Darstellung ...
Mathematik / Logik Linguistik
Elektrotechnik / Nachrichtentechnik Physik: Optik, Quantenmechanik Biologie: Genetik, Neurologie
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
43
Was ist Informatik? Programmiersprachen - Definition Programm: Übertragung eines durch einen Algorithmus lösbaren Problems auf den Computer. Die erforderlichen Anweisungen werden in einer für den Computer verständlichen Programmiersprache formuliert
.. oder etwas anders ausgedrückt .. • dem Rechner mitteilen, was und wie er etwas tun soll • Programm ist damit eine Software, die bei ihrer Ausführung die Hardware steuert • Programm ist ein „Kochrezept“ für die Ausführung von Anweisungen, geschrieben in einer besonderen d.h. formalen Sprache • Schwerpunkt liegt auf den einzelnen Schritten/Anweisungen, die der Rechner zur Lösung der Aufgabe ausführen muß
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
44
Was ist Informatik? Genealogie – Entstehung von Programmiersprachen
Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
45
Was ist Informatik? Programmiersprachen - Sprachklassen Hardwarenahe Sprachen
Höhere Sprachen
Maschinensprachen z.B. Intel- und SPARC-CPUs 1./2. Gen.
Imperative Sprachen
3. Gen.
Assemblersprachen z.B. Intel- und SPARC-CPUs Rein prozedurale Sprachen z.B. C, Pascal Objektorientierte Sprachen z.B. C++, Java, C# Scriptsprachen z.B. Perl, VBS
nichtimperative funktionale Sprachen Sprachen z.B. LISP Logiksprachen z.B. Prolog 4. Gen. Anfragesprachen z.B. SQL Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
46
Was ist Informatik? Beispielalgorithmus - Definition Algorithmus für „Größten gemeinsamen Teiler (ggT)“ Algorithmus basiert auf 3 mathematischen Regeln: ggT (x,y) = ggT (x,y-x) ggT (x,y) = ggT (x-y,y) ggT (x,y) = x
für x < y; für x > y: für x = y;
x, y ∈ Ν
Beispiel: x = 28; y = 42; 1. Schritt 2. Schritt Ergebnis
ggT (28,42) = ggT (28,14); ggT (28,14) = ggT (14,14); ggT (28,42) = 14;
Das ist noch kein Algorithmus, es fehlen: • Reihenfolge der Ausführung (Kontrollstruktur) • Explizite Operationen wie Wertzuweisungen od. Ausgaben Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
47
Was ist Informatik? Beispielalgorithmus - Beschreibungsformen Umgangssprachliche (textuelle) Beschreibung: 1)
Lies 2 natürliche Zahlen ein und speichere sie in den Variablen x und y
2)
Sind die Werte der Variablen x und y gleich, so gib x als Resultat aus und beende die Ausführung.
3)
Ist der Wert der Variablen x kleiner als der Wert der Variablen y, so speichere in der Variablen y den Wert y-x und setze die Ausführung bei Schritt 2) fort.
4)
Ist der Wert der Variablen x größer als der Wert der Variablen y, so speichere in der Variablen x den Wert x-y und setze die Ausführung bei Schritt 2) fort.
Das ist ein Algorithmus, denn: • Anwendbar auf beliebige Paare natürlicher Zahlen (Allgemeine Problemstellung) • Endliche Beschreibung, d.h. A. terminiert • Einfache Einzelschritte, d.h. A. besitzt Kontrollstruktur • ABER: äh, wie führt der Computer den A. aus??? Frank Artinger Technische Informatik und Programmieren
Informatik - Einführung
48
Was ist Informatik? Beispielalgorithmus - Beschreibungsformen Struktogramm
Programmablaufplan (PAP, flowchart)
Nassi-Shneiderman-Diagramm
BEGINN
Zwei natürliche Zahlen Zwei natürliche Zahlen
in die Variablen x,y einlesen
in die Variablen x,y einlesen Solange x ≠ y ja
x = y? nein x < y?
x < y?
ja nein
y ← y-x
ja y ← y-x
nein x ← x-y
x ausgeben x ← x-y
x ausgeben ENDE
Frank Artinger Technische Informatik und Programmieren
Hinweis zur Notation: x ← x-y ist eine Zuweisung des Wertes x-y an die Variable x
Informatik - Einführung
49
Was ist Informatik? Beispielalgorithmus - Beschreibungsformen Bruchrechnen rein prozedural (ggt als Unterprogramm im C-Programm) #include int ggt (int x, int y) {
/* Einbindung Ein-/Ausgabefunktionen */ /* Funktion/Unterprogramm zur Berechnung des ggT */
while (x!=y) if (x Arbeitsplatzrechner für einzelnen Benutzer • Workstations -> Arbeitsplatzrechner oder auch „Multi-User“ fähig • Großrechner / Supercomputer -> rechenintensive Anwendungen • Mobile Systeme (PDAs, Mobiltelephone) -> Versorgung nicht-ortsfester Benutzer mit Computerdiensten • Eingebettete Systeme (embedded systems) -> Steuerungsaufgaben in Geräten z.B. Fahrzeuge, Haushalt etc. Trotz unterschiedlicher Ausrichtung haben die meisten Computer ein gemeinsames Organisationsprinzip: Architektur Kern der Architektur: Von-Neumann-Prinzip
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
4
Maschinen und Maschinenmodelle Von-Neumann-Architektur Technischer Aufbau von Computern CPU: Central Processing Unit -> alle Operationen auf Daten
main memory: direkter, rascher CPU-Zugriff -> Eingabe-/Ausgabedaten für Operationen
optional: Cachespeicher
Hardware-Struktur eines heutigen Computers
¾ Zentraleinheit und Peripherie sind durch einen / mehrere Busse verbunden (Bus: Leitungen mit zugehöriger Steuerungselektronik für Daten / Signale) ¾ Grenzen zwischen Zentraleinheit / Peripherie verschwinden zusehends.. ¾ Alles, womit gearbeitet werden soll, muß im Hauptspeicher sein!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
5
Maschinen und Maschinenmodelle Von-Neumann-Architektur Universalrechner Steuerung der Hardware durch Software
Software
PCs, Workstations, Großrechner: UINVERSALRECHNER
nicht auf ein spezifisches Anwendungsproblem ausgerichtet
Flexibilität durch Programmierung (der Hardware)
John von Neumann (1946): Konzept für den Aufbau eines programmierbaren Universalrechner (genauer: Zentraleinheit d.h. Prozessor & Hauptspeicher)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
6
Maschinen und Maschinenmodelle Von-Neumann-Architektur Von-Neumann-Architektur
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
7
Maschinen und Maschinenmodelle Von-Neumann-Architektur Von-Neumann-Architektur - Hauptspeicher == Arbeitsspeicher (RAM: random access memory) -> wahlfreier Zugriff Lesen und Schreiben!
Feld (Array) aus Speicherzellen einheitlicher Größe (z.B. 32 Bits)
Daten + Programme (Operationen) -> Kostenersparnis!
direkter Zugriff durch CPU
binäre Werte schnelle Busanbindung zur CPU
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
8
Maschinen und Maschinenmodelle Von-Neumann-Architektur Von-Neumann-Architektur - Hauptprozessor == CPU (Central Processing Unit) Programmzähler Control Unit: steuert Ausführung der Maschinenbefehle (z.B. Reihenfolge, Einlesen des nächsten Befehls aus Hauptspeicher)
Maschinenprogramm (Daten + Maschinenbefehle)
Daten + Anweisungen aus Hauptspeicher Register == kleiner Speicher innerhalb der CPU
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
9
Maschinen und Maschinenmodelle Von-Neumann-Architektur Von-Neumann-Architektur - Hauptprozessor Steuerwerk (Leitwerk bzw. Control Unit) • steuert die Ausführung der Verarbeitungsschritte mit Hilfe von Registern Befehlszählerregister (Programmzähler bzw. Program Counter): • hier steht die Speicheradresse (RAM) des nächsten (Maschinen)Befehls • Befehlszähler wird nach Befehlsausführung inkrementiert • d.h. ohne Sprunganweisungen (jumps) entspricht Befehlsreihenfolge im RAM der Ausführungsreihenfolge in der CPU Befehlsregister (Instruction Register): • enthält den aktuell auszuführenden Maschinenbefehl • Maschinenbefehl beschreibt Operationen und Operanden (Daten) • evtl. müssen zusätzliche Daten aus RAM ausgelesen werden Zustandsregister (Program Status Word): • Zusatzinformation zum Ergebnis der zuletzt ausgeführten Operation (z.B. null oder negativ etc.)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
10
Maschinen und Maschinenmodelle Von-Neumann-Architektur Von-Neumann-Architektur - Hauptprozessor Rechenwerk (ALU bzw. Arithmetic Logic Unit) • führt einfache Operationen auf Daten aus Typische Operationen: • arithmetische Op. (Addition, Subtraktion, Multiplikation, Division) • logische Op. (UND, ODER, XOR etc.) • Shift-Op. (Links-/Rechtsschieben einer Bitgruppe) • Register-Op. (Inkrementieren / Dekrementieren des Registerinhalts) Eingangsregister: • hier stehen die Operanden d.h. Daten (nur kurzfristig) Ausgangsregister: • hier steht das Ergebnis der Op. (nur kurzfristig) Arbeitsregister: • kann Daten länger als Eingangs-/Ausgangsregister halten
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
11
Maschinen und Maschinenmodelle Von-Neumann-Architektur Befehlsausführungszyklus Steuerwerk Maschinenbefehl 0 Maschinenbefehl 1
Befehlszyklus
Maschinenbefehl n
Maschinenprogramm
Phase 1: Steuerungsphase Befehlsauswahl Was ist zu tun? Womit ist es zu tun?
Phase 2: Ausführungsphase Operanden laden (RAM oder xx Register) Operation ausführen (ALU) Ergebnis in xx Register schreiben
klassische von Neumann-Architektur: streng sequentielle Abarbeitung des Maschinenprogramms (neuere Architekturen z.B. Multi-Prozessor PCs unterstützen sog. Nebenläufigkeit d.h. gleichzeitige Bearbeitung mehrerer Anweisungen)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
12
Maschinen und Maschinenmodelle Von-Neumann-Architektur Beispiel: Maschinenprogramm zur Addition zweier Zahlen Summand 1 Summand 2 Ergebnis
Daten
Maschinenprogramm
Akkumulator Zustand des Rechners nach Ausführung der Addition, vor Rückspeicherung des Ergebnisses in den Hauptspeicher Hinweis: Daten und Maschinenprogramm sind symbolisch dargestellt (binäre Codierung in Realität)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
13
Maschinen und Maschinenmodelle Von-Neumann-Architektur Beispiel: Maschinenprogramm zur Addition zweier Zahlen
Akkumulator: spezielles Arbeitsregister Ein-Adressbefehle z.B. LDA: beschreibt die Operation (load accumulator) xx0000: Operandenteil, also Daten, mit denen die Operation ausgeführt werden soll
Beschreibung der Maschinenbefehle: LDA XX0000: kopiert Inhalt der Speicherzelle 0 in den Akkumulator ADD XX0001: addiert Inhalt der Speicherzelle 1 zum Akkumulatorinhalt STA XX0002: kopiert Akkumulatorinhalt in Speicherzelle 2 (STA store akkumulator) STP: Stopp-Befehl
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
14
Maschinen und Maschinenmodelle Von-Neumann-Architektur Beispiel: Maschinenprogramm zur Addition zweier Zahlen Eingangsregister enthalten noch die Summanden
BZ wurde bereits inkrementiert
Befehlszähler: Speicherzelle des nächsten Befehls Befehlsregister: Addition wird gerade ausgeführt
Ausgangsregister enthält Ergebnis (bereits zusätzlich im Akkumulator)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
15
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Motivation Hardware bietet dem Programmierer/Benutzer Dienste an
Dienste nutzen
Laden/Ausführen Maschinenprogramm Programmierer / Benutzer
Hardware Hardwareschnittstelle
Probleme: • kein einheitlicher Standard für Hardwareschnittstellen (z.B. unterschiedliche Prozessorfamilie INTEL x86 oder Mac?) • Dienste der Hardwareschnittstelle sehr primitiv (Maschinenbefehle..)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
16
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Lösung durch Abstraktion (Virtualisierung) z.B. Dateien erzeugen, löschen, editieren
„Veredelung“
nur Maschinensprache bzw. primitive Dienste
Virtualisierung durch Abstraktion der realen Hardware
Vorteile:
Anwendungsbeispiel: HAL in Win-Treiberprogrammierung
• Benutzer/Programmierer verwenden leichter nutzbare und übertragbare Schnittstelle (nicht mehr die reale Hardwareschnittstelle) ¾ Software spiegelt die Schnittstelle vor (sog. Emulation) ¾ es handelt sich um eine virtuelle Maschine Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
17
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Beispiele für Virtualisierung Systemsoftware (Betriebssysteme) • setzt auf HW auf, Anwender bedient ereignisorientiert über graphische Oberfläche (komfortable Emulation..) höhere Programmiersprachen (C, JAVA, C# etc.) • keine Maschinenbefehle sondern Compilation bzw. Interpretation zur Bildung plattformspezifischer Maschinenbefehlsfolgen Netzwerkprotokolle • virtuelles Kommunikationsnetz durch paketorientierte Protokolle wie TCP/IP abstrahieren von reiner Netzhardware (elektrische, optische Signale) schauen wir uns die Systemsoftware etwas näher an ..
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
18
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Systemsoftware und Betriebssystem Systemsoftware • alle Programme für den komfortablen Gebrauch des Computers (z.B. Programmierumgebung, Webbrowser, Betriebssysteme etc.) • setzt unmittelbar auf der Hardware auf und bietet „nach oben“ Schnittstellen (== Grundlage für Anwendungsprogrammierung z.B. Office) Hauptaufgaben des Betriebssystems (operating system) • Verwaltung aller Hard-/Softwarekomponenten (Betriebsmittel) • Realisierung von Schnittstellen (z.B. UI user interface für Benutzer oder auch sog. API Application programming interfaces d.h. System- bzw. Programmierschnittstellen) Win32-API z.B. Zugriffe auf File system oder Zeitgeber (Counter) ..
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
19
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Grobstruktur und Schnittstellen eines Betriebssystems
Virtualisierung 1: Benutzer
kernel
Virtualisierung 2: Programmierer
Beispiele: MS Windows, UNIX, Linux
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
20
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Wichtigste Bestandteile eines Betriebssystems Dateisystem (file system) • strukturierte Ablage von Daten auf einem Speichermedium (z.B. FAT, NTFS, etc.) • dazu: strukturierter Namensraum (Dateibaum) für geordneten Zugriff Prozeßsystem • Organisation aller Aktivitäten, die auf einem Rechner ablaufen (insbesondere: Zuteilung der Betriebssystemressourcen) • z.B. laufendes Programm (Application) benötigt Prozessorzeit, Speicherplatz; Koordination mit anderen laufenden Programmen • jede Aktivität läuft in einem geschützten „Prozeßraum“ • Zugriffe über Prozeßgrenzen hinweg bedürfen spezieller Mechanismen z.B. IPC (inter-process communication) wie pipelining oder shared memory ...
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
21
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Virtuelle Hardware Prinzip der virtuellen Maschinen:
System-/Anwendungssoftware
Virtuelle Maschine Veredelung der „primitiven“ HW-Schnittstelle
reale Hardware
2 Grundkonzepte sind typisch: (1) Mehrere virtuelle Hardwareschnittstellen für dieselbe Hardware (2) Dieselbe virtuelle Hardwareschnittstelle für unterschiedliche reale Hardwareplattformen
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
22
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Virtuelle Hardware (Variante 1)
z.B. Gerätetreiber
Anwendungsbeispiele: • Multi-user Zugriffe auf Geräte z.B. Soundkarte (e.g. DirectX) • VM-Ware: komplette Emulation des Betriebssystems inkl. Hardware (z.B. 1 Windows-Instanz und 1 Linux-Instanz auf einer PC-Hardware)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
23
Maschinen und Maschinenmodelle Virtuelle Maschinen und Betriebssysteme Virtuelle Hardware (Variante 2)
Anwendungsbeispiel: • Java-Applets: liegen in sog. Byte-Code vor (intermediate code) und können auf der JVM (Java Virtual Machine) auf jeder unterstützten Plattform (Sun, Unix, Linux, Windows etc.) ablaufen
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
24
Grundlagen der Informatik I - Grundlagen Programmierung Prof. Dr.-Ing. Frank Artinger
[email protected]
Hinweise: Die vorliegende Vorlesung – Grundlagen Programmierung basiert in wesentlichen Teilen auf dem gleichnamigen Skriptum des HERDT-Verlages für IT-Schulungsunterlagen. Die ständige Aktualisierung sichert gleichzeitig die Aktualität der Lehrinhalte (ANSI-Standard). Hyperlink: http://www.herdt4you.de/
Grundlagen Orientierung
ORIENTIERUNG
Grundlagen Grundlagen der Software-Entwicklung Programmiersprachen Werkzeuge der Software-Entwicklung Grundlegende Sprachelemente Darstellungsmittel für Programmabläufe Kontrollstrukturen Elementare Datenstrukturen Prozeduren und Funktionen Algorithmen Spezielle Algorithmen Objektorientierte Programmierung Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
3
Grundlagen Ziele ¾ Was sind Programme? ¾ Welche verschiedenen Zahlensysteme gibt es? ¾ Welche Zeichencodes gibt es?
ZIELE
¾ Wie werden Daten innerhalb des Computers dargestellt?
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
4
Grundlagen Inhalt Grundlagen Grundbegriffe Warum programmieren? Zahlensysteme
INHALT
Dezimalsystem Dualsystem Oktalsystem Hexadezimalsystem Programme basieren auf Zahlen Digitales Rechnen Zeichencodes Übung
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
5
Grundlagen Grundbegriffe Computer im Zentrum der Informatik (Computer Science) • Computer alleine löst keine Probleme • Vorgabe eines Rechenwegs (Algorithmus) notwendig • Programme beinhalten des Lösungs-/Rechenweg
Bedeutung des Computers - Entwicklung • vor einigen Dekaden ging es im wesentlichen um die Lösung mathematischer Problemstellungen • steigende Leistungsfähigkeit (Integrationsdichte) und kostengünstige Verfügbarkeit öffneten den Einsatz für Routineaufgaben (viele Bereiche des täglichen Lebens, E-Commerce, C2C, B2C, B2B, Internet-Banking, ELearning, etc.) Marktdurchdringung mit Internetanschlüssen > 50% (Stand E2004)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
6
Grundlagen Definition eines Programms Was ist ein Programm überhaupt? • Bearbeitungsvorschrift (Algorithmus) für einen Computer zur Lösung einer vorgegebenen Aufgabe • Formulierung in einer speziellen (sog. formalen) Sprache == Programmiersprache • für verschiedene Anwendungsgebiete existieren unterschiedliche (spezialisierte) Programmiersprachen • vor der Programmausführung ist eine Übersetzung (Compilation oder Interpretation) des Programms in eine für den Computer verständliche Form (sog. Maschinensprache) notwendig
Programm ist eine Bearbeitungsvorschrift (Algorithmus), dessen Anweisungsfolge in einer Programmiersprache formuliert ist. Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
7
Grundlagen Definition von Software Was ist dann Software? • Software ist umfassender als Programm
Software umfaßt alle immateriellen Teile eines Computers (Programme + zugehörige Daten + Dokumentation) Beispiel: Aufbau eines E-Learning-Systems
Quelle: VSI-System, Uni Erlangen-Nürnberg
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
8
Grundlagen EVA-Prinzip EVA-Prinzip (Eingabe – Verarbeitung – Ausgabe) • Grundprinzip der Datenverarbeitung Eingabe: • Benutzer, andere Programme oder Applikationen, Datenbanken Verarbeitung: • Datenfilterung, algorithmische Verarbeitung (Datenveredelung) Ausgabe: • Ergebnisse der Verarbeitung, Ausgabe an Benutzer, andere Programme oder Datenbank(en)
Eingabe
Verarbeitung
Ausgabe
Datenfluß durch ein Programm
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
9
Grundlagen Motivation Warum programmieren? • -> s. Motivationsfolien im Intro Standard-Software anpassen • Tätigkeitsfeld der Unternehmensberater (Geschäftsprozeßoptimierung mit gleichzeitiger Erneuerung des „information backbones“ im Unternehmen z.B. durch Einführung eines SAP-Systems) • Standard-Unternehmenslösung muß an individuelle betriebliche Gegebenheiten angepaßt werden Automatisierung • im Zeitalter der Globalisierung wird im verstärkten Automatisierungsgrad ein high potential für Kostensenkungsprogramme gesehen • ca. 60% der Investitionskosten für Automatisierung werden für die SWErstellung verwendet
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
10
Grundlagen Motivation Warum programmieren? Produkt-SW-Entwicklung als Business • hohe Entwicklungskosten stehen sehr geringen Stückkosten gegenüber • bei geeigneten Marktbedingungen eine erfolgversprechende geschäftliche Tätigkeit Individual-Software als Business • meist auch als „Software für Projekte“ bezeichnet • geeignet für Märkte, die mit systematischen Standards nicht oder nur unzureichend zu durchdringen sind • größte (finanzielle) Gefahr liegt in den oft unterschätzten Aufwendungen für Wartung & Pflege individueller Projektlösungen
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
11
Grundlagen Motivation Warum programmieren? Erhöhte Nachfrage nach Software • jährliche Nachfragesteigerung bei Software beträgt ca. 10-25% • demgegenüber steht eine Produktivitätssteigerung bei der SWEntwicklung von ca. 4%
Qualitativ hochwertige Software ist ein Engpaß der Informationstechnik geworden! Typisches Beispiel: • Verfügbarkeit äußerst leistungsfähiger Computer in Mehrprozessortechnik • eine optimale Ausnutzung durch die SW-Technik gelingt nur teilweise
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
12
Grundlagen Zahlensysteme Zahlensysteme • Darstellung quantitativer Merkmale (Gegenstände, Vorgänge, etc.) erfolgt durch Zahlensysteme • eine Zahle wird nach den Regeln des Zahlensystems als Folge von Ziffern dargestellt • man unterscheidet zwischen Additionssystemen und Stellenwertsystemen (Positionssysteme) Bekannte Zahlensysteme in Europa: • Römisches Zahlensystem (I, II, III, IV, V, ...) -> Additionssystem • Arabisches Zahlensystem (0, 1, 2, 3, ...) -> Stellenwertsystem
jünger, aber bekannter in Europa (leistungsfähiger für Rechenoperationen)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
13
Grundlagen Zahlensysteme AUSFLUG: Römisch-etruskisches Zahlensystem • Vertreter des Additionssystems (Zahl entspricht der Summe der Werte ihrer Ziffern) I V X L C D M
1 5 10 50 100 500 1000
Ziffern nach abnehmender Wertigkeit geordnet z.B. 2002 entspricht MMII
Nachteile: Zahlen können sehr lang werden, Rechenoperationen entsprechend aufwendig Historie: bis ins 15. Jahrhundert in Europa verwendet
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
14
Grundlagen Zahlensysteme Grundlagen zum Stellenwertsystem (Positionssystem) • die Stelle (Position) der Ziffer impliziert den Wert • die „niederwertigste“ Position steht i.a. rechts Nennwerte: • Ziffern und Zeichen, die in einem Zahlensystem vorkommen können • alle Zahlen sind zusammengesetzt aus Nennwerten Basis des Zahlensystems: • Anzahl der Nennwerte == Basis b des Zahlensystems • Ziffern laufen von 0 bis b-1 Stellenwert (Potenz): • jede Ziffernposition hat einen Wert, der einer Potenz der Basis entspricht (sog. Stellenwert) • n-te Position hat den Wert von bn-1
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
15
Grundlagen Zahlensysteme Dezimalsystem (Stellenwertsystem) • abgeleitet aus der menschlichen Physiologie („10 Finger“) Basis: b = 10 (d.h. 10 Nennwerte von 0...9) Nennwerte:
0123456789 Beispiel zum Aufbau einer Dezimalzahl: 59647
=
Frank Artinger
7*
100
->
7
+
4*
101
->
40
+
6*
102
->
600
+
9*
103
->
9000
+
5*
104
->
50000
=
59647
Technische Informatik und Programmieren
Informatik - Basics
16
Grundlagen Zahlensysteme Dualsystem (Binärsystem) (Stellenwertsystem) • 17. Jahrhundert, entwickelt von Gottfried Wilhelm Leibniz • arbeitet nur mit Ziffern 0 und 1 • durch Kombination ist jede natürliche Zahl darstellbar Basis: b = 2 (d.h. 2 Nennwerte von 0...1) Nennwerte:
01 Beispiel zum Aufbau einer Dualzahl: 110110101 =
Frank Artinger
1*
20
->
1
+
0*
21
->
0
+
1*
22
->
4
+
0*
23
->
0
+
1*
24
->
16
+
1*
25
->
32
Technische Informatik und Programmieren
Informatik - Basics
17
Grundlagen Zahlensysteme Dualsystem (Binärsystem) (Stellenwertsystem) +
0*
26
->
0
+
1*
27
->
128
+
1*
28
->
256
=
(437)10
Hinweis: Zur Vermeidung von Mißverständnissen, welchem Zahlensystem Ziffernfolgen angehören, wird häufig die Basis tiefgestellt rechts neben der Zahl angegeben (z.B. (101)10, (101)2 oder (5)8 ) Umwandlung Dualzahl -> Dezimalzahl • Addition der Stellenwerte (s.o.)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
18
Grundlagen Zahlensysteme Dualsystem (Binärsystem) (Stellenwertsystem) Umwandlung Dezimalzahl -> Dualzahl • Division der Dezimalzahl durch 2 und Rest notieren • solange wiederholen, bis das ganzzahlige Ergebnis 0 beträgt Beispiel zur Umwandlung (426)10 -> Dualzahl 426 / 2
= 213 Rest 0
213 / 2
= 106 Rest 1
106 / 2
= 53 Rest 0
53 / 2
= 26 Rest 1
26 / 2
= 13 Rest 0
13 / 2
=6
Rest 1
6/2
=3
Rest 0
3/2
=1
Rest 1
1/2
=0
Rest 1
1
=
1
Frank Artinger
Technische Informatik und Programmieren
0 1 0 1 0 1 0 1 1
0
1
Informatik - Basics
0
1
0
1
0
19
Grundlagen Zahlensysteme Oktalsystem (Stellenwertsystem) Motivation: Länge von Dualzahlen ist unhandlich, Oktal- bzw. Hexadezimalsystem fassen mehrere Stellen einer Dualzahl zusammen! • codiert 3 Stellen einer Dualzahl (8 Kombinationen von 000 - 111) • Oktalsystem früher führend in DV, heute veraltet Basis: b = 8 (d.h. 8 Nennwerte von 0...7) Nennwerte:
01234567 Beispiel zum Aufbau einer Oktalzahl: 1213
=
Frank Artinger
3*
80
->
3
+
1*
81
->
8
+
2*
82
->
128
+
1*
83
->
512
=
(651)10
Technische Informatik und Programmieren
Informatik - Basics
20
Grundlagen Zahlensysteme Oktalsystem (Stellenwertsystem) Umwandlung Oktalzahl -> Dezimalzahl: • Addition der Stellenwerte (s.o.) Umwandlung Dezimalzahl -> Oktalzahl: • vgl. Dualzahl: Division der Dezimalzahl durch 8 und Rest notieren • solange wiederholen, bis das ganzzahlige Ergebnis 0 beträgt Beispiel zur Umwandlung (30571)10 -> Oktalzahl 30571 / 8
= 3821 Rest 3
3821 / 8
= 477
Rest 5
477 / 8
= 59
Rest 5
59 / 8
=7
Rest 3
7/8
=0
Rest 7 =
Frank Artinger
Technische Informatik und Programmieren
3 5 5 3 7 7
3
Informatik - Basics
5
5
3
21
Grundlagen Zahlensysteme Hexadezimalsystem (Stellenwertsystem) • codiert 4 Stellen einer Dualzahl (16 Kombinationen von 0000 - 1111) • mit Einführung des Byte (8 Bits) wurde das Oktal- durch das Hexadezimalsystem weitgehend abgelöst • 1 Byte wird durch 2 Hexadezimal-Zahlen dargestellt
1010 1111 A F
1111 1110 F E
Aufbau einer Hexadezimalzahl Basis: b = 16 (d.h. 16 Nennwerte von (0 .. 15) ) Nennwerte: • da das arabische Zahlensystem nur 10 Ziffern besitzt wurde vereinbart, die übrigen Ziffern mit Buchstaben zu bezeichnen: 10 = A, 11 = B, 12 = C, 13 = D, 14 = E und 15 = F
0123456789ABCDEF Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
22
Grundlagen Zahlensysteme Hexadezimalsystem (Stellenwertsystem) Beispiel zum Aufbau einer Hexadezimalzahl: 7B1
=
1*
160
->
1
+
11 *
161
->
176
+
7*
162
->
1792
=
(1969)10
Umwandlung Hexadezimalzahl -> Dezimalzahl • Addition der Stellenwerte, d.h. Summe der Potenzen zur Basis 16 (s.o.) Umwandlung Dezimalzahl -> Hexadezimalzahl • vgl. Dualzahl: Division der Dezimalzahl durch 16 und Rest notieren • solange wiederholen, bis das ganzzahlige Ergebnis 0 beträgt
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
23
Grundlagen Zahlensysteme Hexadezimalsystem (Stellenwertsystem) Beispiel zur Umwandlung (251277)10 -> Hexadezimalzahl: 251277 / 16= 15704 Rest 13
D
15704 / 16 = 981
Rest 8
8
981 / 16
= 61
Rest 5
61 / 16
=3
Rest 13
3 / 16
=0
Rest 3
3
=
3
5 D D
5
8
D
(251277)10 = (3D58D)16
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
24
Grundlagen Zahlensysteme Hexadezimalsystem (Stellenwertsystem) Umwandlung Hexadezimalzahl Dualzahl A) Umwandlung (AFFE)16 -> Dualzahl
1010 1111 1111 1110 A F F E
2 Hex-Ziffern entsprechen 1 Byte jede Hexziffer entspricht 4 Bits
B) Umwandlung (1010 1111 1111 1110)2 -> Hex-Zahl A (10)
1010
F (15)
1111
F (15)
1111
E (14)
1110 =
Frank Artinger
1010
1111
Technische Informatik und Programmieren
1111
1110
Informatik - Basics
25
Grundlagen Zahlensysteme Programme basieren auf Zahlen Analoge Daten • analoge Daten werden durch eine kontinuierliche Funktion (z.B. Zeigerdarstellung der Uhr oder Skala beim Thermometer) dargestellt • analog bedeutet: entsprechend, vergleichbar Digitale Daten • immer durch Ziffern dargestellt (digit == Ziffer) • Datenverarbeitung im Computer erfolgt nur digital!
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
26
Grundlagen Zahlensysteme Problem der begrenzten Rechengenauigkeit Beispiel:
2.0 / 3.0 * 3.0 = ? • math. exaktes Ergebnis: 2 • berechnetes Ergebnis im Computer u.U.: 1.999999998 Ursache: • eine Zahl wird im Rechner nur mit einer begrenzten Anzahl von Dezimalstellen dargestellt (z.B. wird das periodische Ergebnis 2/3 = 0.66666 abgeschnitten) • die weitere Berechnung erfolgt auf Basis der genäherten Zahlenwerte (Folgefehler durch begrenzte Rechengenauigkeit) Praxisbezug:
Frank Artinger
Zeichenprogramme für Vektorgraphik
Technische Informatik und Programmieren
Informatik - Basics
27
Grundlagen Zahlensysteme Vorteile des Dualsystems für die rechnerinterne Darstellung Vorteile: • binär codierte Daten sind einfach und mit sehr niedriger Fehlertoleranz auf verschiedene Arten darstellbar, weiterzugeben, weiterzuverarbeiten Beispiele zur Verarbeitung digitaler Daten: Nutzungsart
Ziffer 0 entspricht
Ziffer 1 entspricht
Speicherung mit Spannung
Keine Spannung
Ca. 6 Volt Spannung
Speicherung mit Magnetismus
Magnetisches Feld vorhanden
Veränderung der Polarität
Übertragung mit Tönen
Kurzer Ton
Langer Ton
Speicherung mit Relais
Schaltung offen
Schaltung geschlossen
Optische Speicherung auf
Medium undurchsichtig (kein
Medium durchsichtig (Loch)
Lochstreifen, Karte
Loch)
Optische Speicherung auf
Kein Übergang von oder zu
Übergang von oder zu einer
CD, DVD
einer Vertiefung („pits & falls“)
Vertiefung
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
28
Grundlagen Zahlensysteme Warum nicht im Dezimalsystem codieren? • prinzipiell kann (statt mit 2 z.B. 0V .. 6V) auch mit 10 Zuständen (z.B. 0V, 1V, 2V, 3V, etc.) gearbeitet werden Probleme: • höherer technischer Aufwand wegen größerer Anzahl an Signal/Spannungspegeln • Fehlerwahrscheinlichkeit steigt (Pegeldifferenzen sinken)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
2.5V -> ?
29
Grundlagen Zahlensysteme Bits & Bytes Bit: • kleinste Speichereinheit in einem Computer oder auf einem Datenträger (HD, CD etc.) • Bit == binary digit, Binärziffer, Dualziffer Byte: • Zusammenfassung von 8 Bits -> 1 Byte • 1 Byte kann intern exakt 1 Zeichen (Ziffern, Buchstaben, Sonder/Steuerzeichen) darstellen • Zeichen werden durch sog. Zeichencodes abgebildet (z.B. Buchstabe ‘A‘ entspricht der Zahl (65)10 etc.) mit 2 Byte können alle auf der Welt bekannten Zeichen codiert werden
Word (Wort): • Zusammenfassung von 2 Byte -> 16 Bits
• z.B. Internationalisierung der Zeichendarstellung (vgl. Unicode) Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
30
Grundlagen Zahlensysteme Bitmuster • Folge von Bits wird auch als Bitmuster bezeichnet • muß nicht notwendigerweise eine 8-Bit-Folge sein Bit
Bit
Bit
Bit
Bit
Bit
Bit
Bit
8 Bits = 1 Byte
1 KByte = 1 MByte = 1 GByte =
1024 Byte 1024 KByte 1024 MByte
= 210 Byte = 220 Byte = 230 Byte
417024000 Bytes / (1024)2 ≈ 397 MByte
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
31
Grundlagen Zahlensysteme Praxisbezug: Paritätsbit • Störungen in der Übertragung von Bitmustern (Nachrichtenkanal z.B. Leitung LAN oder Luft WLAN) können das Bitmuster verändern • z.B. Bit kippt durch „Schaltfehler“ von 0 -> 1 oder umgekehrt Paritätsbit zur Fehlererkennung: • zur Erkennung von Übertragungsfehlern wird ein sog. Prüfbit (Paritätsbit) an das Daten-Bitmuster angehängt • ein sog. „parity-check“ gibt Aufschluß über die Datenqualität gerade Parität: Paritätsbit 0, wenn Anzahl der 1 im Bitmuster gerade ungerade Parität: Paritätsbit 1, wenn Anzahl der 1 im Bitmuster ungerade dieses einfache Verfahren hilft allerdings nicht bei der Rekonstruktion, da unbekannt ist, welches Bit verändert wurde (i.d.R. wird das Bitmuster oder Datenpaket erneut vom Sender angefordert)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
32
Grundlagen Zahlensysteme Praxisbezug: Paritätsbit Beispiel:
1
10001111
PB
Bitmuster
Zustand des Paritätsbits: Summe der Einsen = 5 5 modulo 2 = 1 -> Paritätsbit = 1
modulo: Rest einer Ganzzahldivision
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
33
Grundlagen Zahlensysteme Digitales Rechnen • sämtliche Daten und der Programmcode liegen in binärer Form vor (Zahlen, Speicheradressen, Maschinenbefehle etc.) • Verarbeitung heißt: Rechnen mit binären Daten Addition von Dualzahlen • ähnlich der schriftlichen Addition von Dezimalzahlen Beispiel: 45 + 58 ------------------Übertrag: 10 ------------------103
101101 + 111010 --------------------------Übertrag: 1110000 --------------------------1100111
Dezimalsystem
Frank Artinger
Technische Informatik und Programmieren
0+0=0 0+1=1 1+0=1 1 + 1 = 0, Übertrag 1 Ergebnistabelle
Dualsystem
Informatik - Basics
34
Grundlagen Zahlensysteme Komplementbildung • sehr häufig benötigte Operation im Computer (vgl. Subtraktion ff.) • man unterscheidet 2 Arten von Komplementbildungen für eine positive Zahl Z mit der Basis b (b-1) Komplement • häufig für gebrochen rationale Zahlen verwendet (Zahlen mit Nachkommastellen) • Binärsystem: 1er-Komplement (Invertierung des Bits, Negation) b – Komplement • häufig für die Subtraktion ganzer Zahlen verwendet • Binärsystem: 2er-Komplement
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
35
Grundlagen Zahlensysteme Bildung des b-Komplements Das b-Komplement der positiven n-stelligen Zahl Z mit der Basis b wird wie folgt gebildet: bn – Z
für
Z≠0
0
für
Z=0
Beispiele: 10er-Komplement der Zahl 4637: 104
- 4637
= 5363
2er-Komplement der Zahl 11010101: 28 - 11010101 100000000 - 11010101
Frank Artinger
Technische Informatik und Programmieren
? -> siehe Subtraktion auf den folgenden Folien!
= = 00101011
Informatik - Basics
36
Grundlagen Zahlensysteme Subtraktion von Dualzahlen • Verfahren der schriftlichen Subtraktion für digitale Rechner ungeeignet • stattdessen wird eine Addition mit dem b-Komplement ausgeführt Kochrezept: Es soll der Ausdruck für Z1 – Z2 gebildet werden.
0–0=0 1–0=1 0 – 1 = 1, Übertrag – 1 1–1=0
(1)
b-Komplement von Z2 bilden
(2)
Addition von Z1 und Komplement Z2
(3)
Übertrag an der höchsten Stelle wird weggelassen
Ergebnistabelle
zu (3)Tritt an der höchsten Stelle kein Übertrag auf, wird vom Ergebnis der Addition das b-Komplement gebildet und mit einem negativen Vorzeichen versehen. Der negative Übertrag wird im Computer in einem speziellen Bit (sog. Borrowbit) gespeichert!
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
37
Grundlagen Zahlensysteme Subtraktion von Dualzahlen Beispiel 1:
58 – 45
Z1 = 58, Z2 = 45 (1) Komplement von 45:
10² - 45 = 100 – 45 = 55
(2) 58 + 55 = 113 (3) Übertrag streichen: 113 -> Ergebnis: 58 – 45 = 13
Beispiel 2:
111010 – 101101
TRICK (Erklärung folgt)
Z1 = 111010, Z2 = 101101 (1) Komplement von 101101:
26 - 101101 = 1000000 – 101101 = 10011
(2) 111010 + 10011 = 1001101 (3) Übertrag streichen: 1001101 -> Ergebnis: 111010 – 101101 = 001101 = 1101
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
38
Grundlagen Zahlensysteme Subtraktion von Dualzahlen Beispiel 3:
101001 – 110001 (negativer Übertrag!)
TRICK (Erklärung folgt)
Z1 = 101001, Z2 = 110001 (1) Komplement von 110001:
26 – 110001 = 1000000 – 110001 = 1111
(2) 101001 + 1111 = 111000 (3) kein Übertrag, Komplement des Ergebnisses: 000111 + 1 = 1000 -> Ergebnis: 101001 – 110001 = - 1000
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
39
Grundlagen Zahlensysteme TRICK zur einfachen Berechnung des 2er Komplements (2K, K2) Kochrezept: • sämtliche Ziffern negieren (aus 0 -> 1, aus 1 -> 0) • zur negierten Zahl + 1 addieren 2K von 110001:
001110 + 1 = 1111
2K von 111000:
000111 + 1 = 1000
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
40
Grundlagen Zahlensysteme Weitere Bedeutung des 2er-Komplements • 2er-Komplement ist eine Möglichkeit, negative Zahlen im Binärsystem darzustellen (ohne zusätzliche Symbole wie „+“ oder „-“) • 2er-Komplement ist die vorherrschende Art, wie negative Zahlen im Computer dargestellt werden Funktionsprinzip: • sowohl die eigentliche Zahl als auch das negative Vorzeichen werden in der binären Kodierung dargestellt • üblicherweise wird für den Betrag der Zahl (positiv und negativ) eine feste Stellenzahl (n) verwendet, das führende Bit (auch MSB most significant bit) wird für das Vorzeichen VZ verwendet Vorzeichenbehaftete Ganzzahl (z.B. signed short int)
VZ 7-Bits für den Zahlenbereich [0 .. 27 – 1]
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
41
Grundlagen Zahlensysteme Weitere Bedeutung des 2er-Komplements Zahlendarstellung: Positive Zahlen sind durch 0 im VZ-Bit gekennzeichnet 0
1
1
1
1
1
1
(1111111)2 = (127)10
1
7-Bits für den Zahlenbereich [0 .. 27 – 1]
Negative Zahlen sind durch 1 im VZ-Bit gekennzeichnet; der Zahlenwert wird im 2er-Komplement dargestellt! 1
1
1
1
1
1
1
1
2K(1111111)2 = (1)2 = (1)10
7-Bits für den Zahlenbereich [0 .. 27 – 1]
1
0
0
0
0
0
0
0
(-1)10 2K(0000000)2 = (10000000)2 = (128)10
7-Bits für den Zahlenbereich [0 .. 27 – 1]
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
(-128)10
42
Grundlagen Zahlensysteme Weitere Bedeutung des 2er-Komplements Zahlendarstellung, weitere Beispiele: +410 -410 -110 12710 -12810
= = = = =
00000100 11111011 + 1 = 11111100 11111111 01111111 10000000
Großer Vorteil der 2er-Komplementdarstellung: Es gibt nur eine Darstellung für die Zahl 0! (0 0000000)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
43
Grundlagen Zahlensysteme Weitere Bedeutung des 2er-Komplements Zahlendarstellung, nochmal Beispiele: undführt Subtraktion benötigen keine Fallunterscheidung (Überträge, -• 4Addition + 3 = -1 zu Überläufe werden abgeschnitten) 11111100 + 00000011 = 11111111; + 4 – 4 = 0 führt zu 00000100 + 11111100 =100000000 -> durch Abschneiden des Übertrags 1 wird daraus 00000000 = 0
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
44
Grundlagen Zahlensysteme Multiplikation von Dualzahlen • Multiplikation wird im Rechner durch bitweise Verschiebungen (bit shift) und Addition realisiert • ähnlich der schriftlichen Multiplikation
0*0=0 1*0=0 0*1=0 1*1=1
Beispiele: 58 * 115 -----------58 + 58 + 290 -----------6670
111010 * 101 -----------------111010 + 000000 + 111010 -----------------100100010
Dezimalsystem
Dualsystem
Ergebnistabelle
left shift und Addition
Wie wird die Multiplikation im Rechenwerk des Computers realisiert?
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
45
Grundlagen Zahlensysteme Multiplikation von Dualzahlen Multiplikation im Computer: • Zwischenergebnisse der Multiplikation werden sofort addiert (Adder) • die Zwischenergebnisse werden im Akkumulator (Speicher für Rechenergebnisse) gespeichert • wenn alle Zwischenergebnisse addiert wurden, steht das Endergebnis im Akkumulator
¾ Multiplikation wird durch Linksverschieben und Addition realisiert
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
46
Grundlagen Zeichencodes Zeichencodes Warum Zeichencodes? • da der Rechner Daten nur in binärer Form verarbeiten kann, müssen Zeichen (Ziffern, Buchstaben, Sonderzeichen etc.) binär kodiert werden • die Interoperabilität (d.h. die Zusammenarbeit) zwischen Rechnern, Datenaustausch, plattformübergreifende Ablauffähigkeit von Applikation etc. erfordern kompatible standardisierte Zeichencodes Definition eines Zeichencodes: Ein Zeichencode stellt eine Zuordnungsregel dar, mit deren Hilfe jedes Zeichen eines Zeichenvorrates eindeutig durch bestimmte Zeichen eines anderen Zeichenvorrates dargestellt werden. Beispiele für standardisierte Zeichencodes: • ASCII-Code, ANSI-Code, Unicode etc.
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
47
Grundlagen Zeichencodes Praxisbezug: Zeichencodes Stichwort: Globalisierung in der Software-Entwicklung 80% aller Großunternehmen besitzen „Offshoring“ Aktivitäten
mit zweistelligen Wachstumsraten sorgt SEA für marktwirtschaftl. Expansion
Exportchancen von SW werden entscheidend durch die Unterstützung der Landessprache beeinflußt! Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
48
Grundlagen Zeichencodes Der ASCII-Code • ASCII == American Standard Code for Information Interchange • als ANSI-Standard X3.4 von Bob Bemer1 (1968) eingeführt • amerikanischer Normcode auf 7-Bit-Basis (binäre Ganzzahlen, mit 7 Ziffern dargestellt), sehr weit verbreitete Textdarstellung im Computer u.a. technischen Geräten • Standard-ASCII Code umfaßt damit: 27 = 128 Zeichen (im wesentlichen lateinisches Alphabet, Steuerzeichen) Was ist mit nationalen Sonderzeichen wie z.B. deutsche Umlaute? • ASCII-Code wurde später auf 8-Bit (28 = 256 Zeichen) erweitert (sog. erweiterter ASCII-Code oder „IBM character set“) • darin sind auch einige nationale Sonderzeichen (sog. diakritische Zeichen) enthalten • HINWEIS: international ist nur der Standard-ASCII Code zugesichert! Werfen wir einen Blick auf die ASCII Code Tabelle.. 1
: Computerpionier, berühmt durch Publikationen zum Y2K-Problem (2-stellige Angabe der Jahreszahl)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
49
Grundlagen Zeichencodes Standard-ASCII-Code (0 – 127)
Dezimal-Code Hex-Code Zeichen
32 Steuerzeichen (0-31) (keine Schriftzeichen, z.B. Steuerung von Druckern, 0x07 BEL: Glocke, 0x20 SP: space, blank)
druckbare Zeichen (33-126) (Buchstaben, Ziffern, Satzzeichen)
„Löschzeichen“ (DEL) (Historie: Lochstreifen)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
50
Grundlagen Zeichencodes Erweiterter-ASCII-Code (128 – 255) (Codepage CP437)
diakritische Zeichen (nationale Sonderzeichen, z.B. dt. Umlaute)
Graphikzeichen (vgl. WANG-Maschinen)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
51
Grundlagen Zeichencodes Praxisbezug: Direkte Eingabe von ASCII-Zeichen in MS Windows Im Windows-Betriebssystem kann ein ASCII-Zeichen direkt über die Tastatur eingegeben werden: ¾ bei gedrückter ALT-Taste den ASCII-Wert über den numerischen Tastaturblock eingeben
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
52
Grundlagen Zeichencodes EBCDI-Code (IBM) • EBCDI == Extended Binary-Coded Decimal Interchange • 8-Bit-Code vor allem auf Großrechnern verwendet
länderspezifische Zeichensätze
• es existieren mehrere Varianten (Codepages) um Sprachunterschiede auszugleichen • EBCDI ist dem ASCII-Code sehr ähnlich ABER: es gibt keine gleichen Teilmengen • die Codeumwandlung ASCII EBCDI muß mit Hilfe von Kodierungstabellen erfolgen
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
53
Grundlagen Zeichencodes ANSI-Code (vgl. erweiterter ASCII-Code) • ANSI == American National Standards Institute (vgl. zur DIN) • 8-Bit-Code, character set von Microsoft Windows Hinweis: • MS-DOS verwendet den Standard-ASCII-Code • MS Windows (auch XP) verwendet den erweiterten ASCII/ANSI-Code • -> beim Datenaustausch zwischen DOS und Windows-Applikationen kann es u.U. zu Konvertierungsproblemen kommen!
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
54
Grundlagen Zeichencodes Unicode (ISO: Universal Character Set UCS) • internationaler Standard für die digitale Kodierung aller sinntragenden Zeichen aller bekannten Schriftkulturen und Zeichensysteme • wird als Lösung bislang inkompatibler länderspezifischer Zeichencodes angesehen Motivation: • mit den bisherigen Zeichencodierungen (ASCII, ANSI etc.) können nur wenige Sprachen gleichzeitig in einem Text dargestellt werden (Folge: Behinderung des internationalen Datenaustauschs) Beteiligte Organisation: • Unicode Consortium (www.unicode.org) • ISO (International Organization for Standardization) Norm: ISO 10646
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
55
Grundlagen Zeichencodes Unicode (ISO: Universal Character Set UCS) Funktionsprinzip und Charakteristika • aktueller Standard ist ein 16-Bit-Code (Coderaum 216 = 65536 Zeichen) • hebräische, lateinische, chinesische Buchstaben sind Zeichensatzwechsel darstellbar • AKTUELL: Arbeiten an Unicode Version 4.0 (32-Bit-Code) • Speicherung / Übertragung von Unicode erfolgt in unterschiedlichen Formaten: UTF-8 (Unicode Transformation Format) -> Webbrowser, Betriebssysteme UTF-7 -> Umsetzung aus vorhandenen 7-Bit-Codes UTF-EBCDIC -> Umsetzung von EBCDIC in Unicode ¾WICHTIG: einmal kodierte Zeichen dürfen niemals wieder entfernt werden (Langlebigkeit digitaler Daten), vor der Normierung eines Zeichens erfolgt eine sorgfältige Prüfung (kann Jahre dauern..)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
56
Grundlagen Zeichencodes Praxisbezug: Unicode und Alternativen in MS Windows Plattformen ab MS Windows 2000 (NT-Basis) • volle Unterstützung des 16-Bit-Unicodes • jedes Zeichen wird immer durch 2 Bytes dargestellt (dadurch immanent höherer Speicherbedarf, aber international erweiterbar!) Plattformen MS Win95, 98, ME etc. • keine Unterstützung von Unicode • nur MBCS (multibyte character set) möglich (Obermenge des ASCIIZeichencodes, manche Zeichen werden mit 2 Bytes, manche mit 1 Byte kodiert) EMPFEHLUNG: Wenn immer möglich, sollte die Implementierung auf Unicode-Basis vorgenommen werden!
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
57
Grundlagen Übung Vorlesungsbegleitende Übung (1)
Was ist ein Programm?
(2)
Was verstehen Sie unter dem EVA-Prinzip?
(3)
Erstellen Sie eine Tabelle mit 4 Spalten. Tragen Sie in die erste Spalte die Dezimalzahlen von 1 bis 16 ein. In die zweite Spalte sind dann die entsprechenden Dualzahlen, in der dritten Spalte die Oktalzahlen und in der vierten Spalte die Hexadezimalzahlen einzutragen.
(4)
Wandeln Sie die Dezimalzahl 12345 in eine hexadezimale Zahl um.
(5)
Geben Sie die hexadezimale Zahl 1F binär im Dualsystem an.
(6)
Welchen dezimalen Wert hat die Oktalzahl 1357?
(7)
Rechnen Sie die Dezimalzahl 735 in das Dual- und Oktalsystem um.
(8)
Stellen Sie die Binärzahl 1101 1100 1011 1010 in hexadezimaler Form dar.
(9)
Was verstehen Sie unter dem Begriff Bit und Byte?
(10) Addieren Sie die Dualzahlen 11011011 und 1010011001.
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
58
Grundlagen Übung Vorlesungsbegleitende Übung (11) Lösen Sie die folgende Aufgabe: 1101111 – 111111 und 1011000 – 1100011 (12) Multiplizieren Sie die Zahlen 1011110 und 110010. (13) Rechnen Sie um: 3600 Bytes in KByte, sowie 1,44 MByte in Byte. (14) Warum mußte das Unicode-Zeichensystem entwickelt werden?
(Lösung: ueb01.pdf)
Frank Artinger
Technische Informatik und Programmieren
Informatik - Basics
59
Grundlagen der Informatik - ANSI C 2.0 Grundlagen Programmierung Prof. Dr.-Ing. Frank Artinger
[email protected]
Hinweise: Die vorliegende Vorlesung – ANSI C 2.0 Grundlagen Programmierung - basiert in wesentlichen Teilen auf dem gleichnamigen Skriptum des HERDT-Verlages für ITSchulungsunterlagen. Die ständige Aktualisierung sichert gleichzeitig die Aktualität der Lehrinhalte (ANSI-Standard). Hyperlink: http://www.herdt4you.de/
ORIENTIERUNG
Einleitung Orientierung Einleitung Das erste Programm in C Konstanten Einfache Datentypen Unterprogramm – Technik – Nützliche Funktionen Steuerstrukturen Typvereinbarungen von Variablen Zeiger Der Präcompiler Modulare Programmierung Entwicklungsumgebungen Standardbibliotheken Anhang
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
3
Einleitung Ziele ¾ Woraus ist die Programmiersprache C entstanden? ¾ Zusammenhang zwischen Algorithmus und Programm ¾ Wie wird ein Programm erstellt?
ZIELE
¾ Wie wird ein Programm mit dem Compiler übersetzt?
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
4
Einleitung Inhalt Einleitung Systemimplementierungssprachen Entstehung von C (und C++) Übersicht zu C / C++
INHALT
Designhinweise (Stärken & Schwächen von C) Algorithmus und C-Programm Erstellen des Maschinenprogramms Vom Quellcode zum Maschinenprogramm Kommentare Präcompiler Übung
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
5
Einleitung Vorwort ANSI-Standard • Der vorliegende C-Programmierkurs hält sich streng an die Vorgaben des ANSI Standard Buches von Brian Kernighan und Dennis Ritchie „The C Programming Language, second edition“
Erweitertes C • es wird grundsätzlich die erweiterte C-Schreibweise verwendet, also mit ANSI C++ Erweiterungen auf prozeduraler Ebene
WICHTIGER HINWEIS: Die Übersetzung von Quellcode mit ANSI C++ Erweiterungen erfordert einen C++ Compiler!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
6
Einleitung Systemimplementierungssprachen Systemprogramme vs. Anwendungsprogramme • traditionell wird zwischen beiden unterschieden • Grenze verläuft allerdings unscharf Typische Systemprogramme
Anforderung an
• Betriebssysteme (OS) • Compiler, Interpreter
Programmierung
Effizienz Hardwarenähe Zuverlässigkeit
• Editoren • Treiberprogramme für Peripheriegeräte Typische Anwendungsprogramme
gute Anpassung Anforderung an an das Problem • Tabellenkalkulation, Finanzbuchhaltung leichte Programmierung • Maschinensteuerungen (z.B. SPS) Erlernbarkeit Wartbarkeit • Textverarbeitung (z.B. MS Word)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
7
Einleitung Systemimplementierungssprachen Konsequenzen • abhängig vom Bereich haben sich spezielle Sprachen etabliert Anwendungsprogrammierung
Sprache
Anwendung
COBOL
Kommerzielle Anwendungen
Fortran
Wissenschaftlich-technische Aufgabenstellungen
Pascal, Modula
Lehr- und „general purpose“ Sprachen
Java, C#
Plattform unabhängige Sprachen
Systemprogrogrammierung
Frank Artinger Technische Informatik und Programmieren
C / C++
Anwendungsgrammierung
Informatik - ANSI C 2.0 / ANSI C++
8
Einleitung Systemimplementierungssprachen Systemprogrammierung • tlw. heute noch Assemblerprogrammierung in extrem zeitkritischen Anwendungen (z.B. Echtzeitanforderungen bei Steuerungsaufgaben durch Mikrocomputer1) • in den meisten Fällen ist aber die Verwendung einer höheren Sprache (z.B. C / C++) aus Gründen der Zuverlässigkeit und Wartbarkeit möglich! (viele Mikrocontroller-Hersteller bieten C-Compiler und Entwicklungsumgebungen an siehe auch INTEL 8051)
Die Verwendung strukturierter Sprachen ist bei der Entwicklung großer Systeme ein wesentliches Hilfsmittel zur Bewältigung der exponentiell wachsenden Komplexität solcher Programme. 1
: Verweis auf Vorlesung Grundlagen Mikrocomputer v. Prof. Walter
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
9
Einleitung Entstehung von C (und C++) Geschichte von C und C++ • Ursprünge von C (vgl. Ada1) in Europa • ausgehend von der Sprache BCPL (Basic Combined Programming Language, Entwurf durch Martin Richards, 1967) für Systemaufgaben enstand in den Forschungslaboratorien von Bell Telephone (USA) die Sprache B, aus der dann schließlich C reslutierte (Anfang 70er Jahre)
In demselben Labor entstand in den 1970ern das wichtigste Standard-Betriebssystem neben der Microsoft Welt: UNIX (anfangs noch in Assembler geschrieben, spätere Implementierung in C (dadurch rel. leicht portierbar) Viele Kernel aktueller Betriebssysteme sind in C geschrieben. 1
: Ada: erste strukturierte standardisierte Hochsprache (Ada83, Ada95), Mitglied der Pascal-Familie, Einsatz in sicherheitsrelevanten Bereichen wie Flugsicherung, Raumfahrt etc.)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
10
Einleitung Entstehung von C (und C++) Geschichte von C und C++ • Väter von C: Brian Kernighan & Dennis Ritchie (Verfasser des Standardwerks über C: „The C Programming Language“, Prentice Hall) -> frühe 1970er Jahre Überblick und wichtige Eigenschaften von C: • C steht auf fast allen Computersystemen zur Verfügung • die Syntax von C wurde mit ANSI1-C (ab 1989) genormt, d.h. es gibt rel. einheitliche Implementierungen über die Plattformen hinweg • die Norm regelt z.B. einheitlich die Aufrufreihenfolge der Inkrement/Dekrementoperatoren (++ / --) und legt die C-Bibliotheken fest! • 1990 wurde die ANSI-C Norm fast vollständig durch die ISO2 (ISO/IEC 9899:1990 (C89), aktuell: 9899:1999 auch als C99 bekannt) übernommen • ANSI-C ist die Sprachbasis für alle C-Derivate, auch für die Erweiterung C++, die zusätzlich objektorientierte und generische Methoden einführt 1 2
: ANSI: American National Standards Institute : ISO: International Organization for Standardization
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
11
Einleitung Entstehung von C (und C++) Bestandteile eines C/C++ Compilers • zusammen mit einem C/C++ Compiler werden jeweils auch immer: ¾Präprozessor ¾Library-Funktionen (C-Bibliotheken) ausgeliefert. • beide sind nicht Bestandteil der Sprache C/C++ • die ANSI-Norm erstreckt sich aber auch auf die compilerexternen Komponenten
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
12
Einleitung Übersicht zu C / C++ Übersicht zu C / C++ • Vorlesung verwendet grundsätzlich ANSI-C • wo es sinnvoll erscheint, werden C++ Elemente (erweitertes C) verwendet
Erweiterungen zu ANSI-C werden im Quelltext kursiv gekennzeichnet
• Objektorientierung ist allerdings nicht Bestandteil dieser Vorlesung (Informatik II)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
13
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ ist nicht restriktiv, Einschränkung der Portabilität Problem: • im Gegensatz zu Sprachen wie Pascal, Modula-2 etc. setzt C/C++ kein sehr restriktives Type-Checking durch • wichtigstes Beispiel: C-Sprachdefinition gibt die Speichergröße von Datentypen nicht explizit vor! (Vorgabe erst in ISO:C99) -> große Probleme bei der Portierung auf andere Prozessoren (16 bit -> 32 bit -> 64 bit) Lösung: • durch konsequentes Deklarieren und Definieren kann jedoch der Programmierer dem Compiler das Type-Cheking ermöglichen • Fehlermedungen und Warnungen des Compilers werden sehr viel hilfreicher und zielführender sein! • Verwendung eines C99-kompatiblen Compilers
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
14
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ lebt von Nebeneffekten Problem: • grundsätzlich ist die gezielte Ausnutzung sprachlicher Schwächen (Nebeneffekte) zu vermeiden (Portabilität wird dadurch eingeschränkt) Lösung: • werden Nebeneffekte dennoch ausgenutzt (z.B. aus Gründen der Effizienz), sollten diese unbedingt klar dokumentiert werden (Kommentare!!)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
15
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ unterstützt Goto‘s Problem: • die Verwendung unbedingter Sprunganweisungen (Goto) in Steuerstrukturen erzeugen schwer lesbaren, unübersichtlichen „SpagettieCode“ Lösung: • Verzicht auf Goto‘s (Nachweis z.B. durch Nassi-Shneiderman Struktogramme) ¾die eigentliche Gefahr ensteht durch denjenigen, der damit umgeht und die Art und Weise des Umgangs!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
16
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ hat Pointer (Zeiger) Problem: • Zeiger können auf beliebige Speicheradressen (Daten) zeigen • dadurch können sehr schwer zu diagnostizierende Fehler entstehen (z.B. fälschliches Überschreiben eines Speicherblockes einer anderen Anwendung) Lösung: • genereller Verzicht ist nicht möglich (z.B. C-Zeichenketten, C-Felder, dynamische Speicherverwaltung, etc.) ¾ein gezielter und konsistenter Umgang ist aber unerläßlich!
Gleichzeitig einer der größten Vorteile von C: hardwarenahe Programmierung möglich durch direkten Speicherzugriff (Bits, Bytes), Speicherarithmetik möglich! Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
17
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ ist kurz & bündig Problem: • C-Programme können sehr kompakt (damit schwer lesbar) geschrieben werden • viele Symbole werden nicht mit Schlüsselwörtern sondern mit Sonderzeichen dargestellt (z.B. Anweisungsblock statt BEGIN, END wird {..} verwendet Lösung: • sinnvolle Variablennamen, eingerückte Darstellung, klare Kommentare ¾in der professionellen SW-Entwicklung: Einführung & Durchsetzung sog. Development-Styleguides F:\ hschule\FH_KA-Lehr
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
18
Einleitung Übersicht zu C / C++ Designhinweise für die Praxis mit C / C++ C/C++ Felder und Zeichenketten Problem: • C kennt zwar den Datentyp Feld und erlaubt die Definition von mit Konstanten vorbelegten Feldern • intern werden Felder aber als Zeiger verwaltet! • eine evtl. notwendige dynamische Speicherverwaltung muß vom Programmierer selbst implementiert werden • Feldgröße wird beim Zugriff nicht geprüft (illegale Feldzugriffe möglich!) • Zeichenketten werden in C als Zeichenfeld (mit terminierender \0) implementiert (kein integrierter „String“-Datentyp) Lösung: • sorgfältigen Umgang erlernen, konsistente Behandlung
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
19
Einleitung Algorithmus und C-Programm Algorithmus und C-Programm • C ist eine imperative Programmiersprache Anweisung 1
Anweisung 2
Anweisung 2
Anweisung n
jede Anweisung kennt die Folgeanweisung
• Anweisungsfolge (Sequenz) wird durch einen Algorithmus vorgegeben Was ist ein Algorithmus?
umgangssprachlich, grob: Handlungsschritte
Ein Algorithmus ist eine Folge von genau beschriebenen Anweisungen, die unter gleichen Ausgangswerten nach endlich vielen Schritten in einer endlichen Zeit das gesuchte Ergebnis ermitteln. Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
20
Einleitung Algorithmus und C-Programm Beispiel für einen einfachen Algorithmus: ... int summe; int a = 12; int b = 33; summe = a + b; printf("Ausgabe: Summe ist %d.", summe); ...
Beschreibung der Anweisungssequenz: • Werte der Variablen a und b (12 und 33) addieren • Ergebnis der Variablen Summe zuweisen • Anschließend den Wert in der Variablen Summe auf dem Bildschirm ausgeben
Demo VC++ .NET: \K1_Einleitung\Bsp1\Bsp1.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
21
Einleitung Algorithmus und C-Programm Deklarative Sprachen als Alternative zu imparativen Sprachen Beispiel:
PROLOG (Programming in Logic, logische Progr.sprache) „Maschinensprache eines Logik-Prozessors“
Grundprinzip: • PROLOG Programme bestehen aus einer Datenbasis (Fakten und Regeln) • Benutzer formuliert Anfragen an die Datenbasis, der PROLOG-Interpreter benutzt die Fakten und Regelen, um systematisch eine Antwort zu finden • POSITIVES RESULTAT („YES“): Antwort logisch ableitbar • NEGATIVES RESULTAT („NO“): Antwort aufgrund der Datenbasis nicht möglich • -> nicht vergleichbar mit prozeduralen (imparativen) Sprachen • -> Anwendung vor allem in sog. Expertensystemen (Bereich KI Künstliche Intelligenz, Computerlinguistik) z.B. Unterstützung bei medizinischer Diagnose oder Wetterbeobachtung / fore cast (XPS stellt eine große Wissensbasis bereit)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
22
Einleitung Algorithmus und C-Programm Beispiel für ein PROLOG-Programm: I) Datenbasis (Fakten und Regeln): mann(adam). mann(tobias). mann(frank). frau(eva). frau(daniela). frau(ulrike). vater(adam,tobias). vater(tobias,frank). vater(tobias,ulrike). mutter(eva,tobias). mutter(daniela,frank). mutter(daniela,ulrike).
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
23
Einleitung Algorithmus und C-Programm Beispiel für ein PROLOG-Programm: II) PROLOG-Programm besteht aus dem Stellen logischer Anfragen: ?- mann(tobias). yes. ?- mann(heinrich). heinrich existiert nicht in Datenbasis no. ?- frau(X). Variablen: Token mit GROSSBUCHSTABEN X=eva ; X=daniela ; X=ulrike ; yes. (keine weiteren Antworten). Neben Fakten können auch Regeln spezifiziert werden: grossvater(X,Y) :X ist Großvater von Y, wenn es ein Z gibt, so daß vater(X,Z), X Vater von Z ist und Z Vater von Y. Damit ist der vater(Z,Y). Großvater väterlicherseits definiert Regeloperator
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
24
Einleitung Algorithmus und C-Programm Weitere Alternative: Funktionale Programmiersprache Beispiel:
LOGO (speziell für Kinder entwickelte, mit LISP verwandte Sprache)
Grundprinzip: • nur wenige Befehle sind systemseitig vorgegeben • der Anwender definiert neue Befehle • durch die Kombination von bereits „gelernten“ Befehlen zu wieder neuen Befehlen erweitert sich die Leistungsfähigkeit der Sprache ständig Beispiel: to fakultaet :n if :n = 0 [make "n 1] if :n > 1 [make "n :n * fakultaet :n - 1] output :n bekannt: Turtlegraphics end (virtuelle Schildkröten, die Linien hinterlassen) print fakultaet 6 Aufruf
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
25
Einleitung Erstellen des Maschinenprogramms Natürliche vs. formale Sprache • im Gegensatz zu natürlichen Sprachen (Englisch, Deutsch, etc.) müssen formale Sprachen (Programmiersprache) eindeutig sein! • jede formale Sprache besitzt eine Reihe reservierter Wörter
z.B. verlesen als „falsch lesen“ oder „auslesen“ oder „aussortieren“ -> Homonym
Übersicht der Schlüsselwörter (reservierten Wörter) in C / C++:
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
26
Einleitung Erstellen des Maschinenprogramms Fortsetzung: Schlüsselwörter in C / C++
CAVE: alles kleinschreibung!!
Schlüsselwörter (Keywords) in ANSI-C und ANSI-C++
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
27
Einleitung Erstellen des Maschinenprogramms Wie entsteht ein C-Programm technisch? 1. Schritt: C-Quellprogramm • C-Programm wird als Quelltext (Textform!) in einem Editor erstellt • Sprachbefehle (z.B. Schlüsselwörter) können nicht beliebig angeordnet werden, die „Befehls-Syntax“ bezeichnet das Regelwerk, das die Notation einer Anweisung festlegt • Quelltext in Datei speichern, Dateierweiterung: *.c / *.cpp
empfehlenswert: Syntax-Highlighting
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
28
Einleitung Erstellen des Maschinenprogramms Wie entsteht ein C-Programm technisch? 2. Schritt: Übersetzung des C-Quellprogrammes in Maschinensprache • ein Programm wird durch den Prozessor ausgeführt (z.B. INTEL x86 o.a.) • Prozessor verarbeitet aber nur die ihm bekannte Maschinensprache (Plattformabhängigkeit!) • hierzu muß der C-Quelltext „übersetzt“ werden (Textform -> Maschinensprachbefehle) Compiler
Interpreter
Kompletter Quelltext wird in
Zeilenenweise Übersetzung und
Maschinensprache (ausführbarer Code für eine Prozessor-Plattform) übersetzt Schneller, kompakter binärer Maschinencode (Optimierungen!) C == Compiler-Sprache
Frank Artinger Technische Informatik und Programmieren
Ausführung des Programmcodes Meist langsamer (weniger optimiert) als compilierter Code aber universeller! Z.B. viele Scriptsprachen (JavaScript, VisualBasicScript, etc.)
Informatik - ANSI C 2.0 / ANSI C++
29
Einleitung Vom Quellcode zum Maschinenprogramms Wesentliche Einzelschritte der technischen Programmerzeugung Folgende Schritte werden durchlaufen, um aus einem C-Programm ein ausführbares Maschinenprogramm (Application) zu erzeugen:
(1) Header-Datei Dateierweiterung: .h .hpp
(2) Quellcode -Datei
(3) Objectcode -Datei
Dateierweiterung: .c .cpp
Dateierweiterung: .o .obj
Präcompiler (Präprozessor)
Loader (Lader)
C/C++ Compiler
(4) Maschinenprogramm-Datei (Application) Dateierweiterung: .exe
Linker (Binder)
(5) Ausführung der Applikation (Laden in RAM-Speicher des Betriebssystem)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
30
Einleitung Vom Quellcode zum Maschinenprogramms Erläuterung der Einzelschritte... (1-2) Header-Dateien (Textform!) werden durch den Präcompiler (Präprozessor) in die Quellcode-Datei eingefügt. Dadurch können Standardbibliotheken und fremde Funktionen in das C-Programm eingebunden werden ohne Quelltext zu kopieren! Der Präcompiler wird über Direktiven gesteuert, die alle mit dem Zeichen # („Gartenzaun“) beginnen. (2-3) Der Compiler übersetzt den Quellcode (Quellcode-Datei inkl. HeaderDatei) in eine Objektdatei (Objectcode), eine Art binärer Zwischencode (intermediate code), der allerdings noch nicht ausführbar ist (Lage im Hauptspeicher (RAM) des Rechners muß durch den Linker noch angepaßt werden).
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
31
Einleitung Vom Quellcode zum Maschinenprogramms Erläuterung der Einzelschritte... (3-4) Der Linker (Binder) erstellt das ausführbare Hauptprogramm (Application). Dabei werden evtl. weitere Objektdateien (*.o, *.obj) verbunden und die Adresslage des Programms im Haupt/Arbeitsspeicher (RAM) wird eingerichtet. Das Programm kann in dieser übersetzten und gelinkten Form direkt vom Prozessor abgearbeitet werden. (5)
Der Loader (Lader) ist eine Funktion des Betriebssystems, die für das Laden der Applikation in den Arbeitsspeicher verantwortlich ist. Der Lader wird implizit (verdeckt) z.B. durch Doppelklicken auf eine *.exe aufgerufen.
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
32
Einleitung Das erste Programm – Lauffähig.. Problembeschreibung Analyse und Entwurf (SW-Entwicklung)
Editor weitere Quellprogramm-Module..
Modellbildung (Datenstrukturen, Algorithmen), später Klassen, Objekte Quellprogramm editieren Übersetzen -> object code
Compiler
Fehlerkorrektur Vervollständigung
Bibliotheks-Module.. Linker
Binden der object code(s) -> ausführbares Programm
Lader
Ausführen und Testen des Programms fertiges Programm
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
33
Einleitung Notepad-Coding Einzelschritte in der Kommandozeile... (1)
Anzeige des Quellcodes (z.B. mit type-Befehl)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
34
Einleitung Notepad-Coding Einzelschritte in der Kommandozeile... (2)
Aufruf des C-/C++ Compilers (inkl. Präprozessor) -> Common Object
File Format (COFF) object (.obj) files VS.NET 2008 (neu): /c /P erzeugt nur noch Präprozessor-Output /c anschließend zur Erzeugung des obj-files
cl.exe ruft den C/C++ Compiler auf Optionsschalter /c: Compilation ohne Linken: Compilation ohne Linken Optionsschalter /P: Präprozessor-Output wird in eine Datei geschrieben
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
35
Einleitung Notepad-Coding Einzelschritte in der Kommandozeile... (3)
Aufruf des Linkers mit LINK.exe -> Linkvorgang erstellt aus
HelloWorld.obj und stdio.lib die ausführbare Datei HelloWorld.exe
link.exe ruft den LINKER auf dieser sorgt dafür, dass die benötigten Bibliotheksfunktionen (hier: printf(), getchar() ) aus der Standardbibliothek eingebunden werden
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
36
Einleitung Kommentare in C / C++ Kommentare in C / C++ Was sind Kommentare? • umgangssprachliche Zusatzinformationen im Quelltext • können sich über mehrere Zeilen erstrecken • werden vom Compiler nicht übersetzt und müssen daher besonders gekennzeichnet werden Warum sollten Kommentare in den Quelltext eingefügt werden? • Kommentare dienen der Verständlichkeit und sollen beschreiben, was der Programmierer sich bei der Problemlösung gedacht hat • ausführliche Kommentare sind exorbitant wichtig bei der Wartung & Pflege größerer SW-Projekte (LOC1 > 10.000) • erleichtert das Lesen des Quellcodes und die spätere Fehlersuche enorm („es gibt keine fehlerfreie Software..“) • i.A.wird viel zu wenig Zeit für das Schreiben guter Kommentare aufgewendet 1
: LOC: Lines of Code Anzahl der Quellcodezeilen (ohne Kommentare etc.), Komplexitätsmaß von SW
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
37
Einleitung Kommentare in C / C++ Kommentare in C / C++ Wie werden Kommentare gekennzeichnet? Kommentare in ANSI-C: /* ...alles Kommentar... */ /* ............... .....alles Kommentar..... */ /*...alles bis zum Dateiende Kommentar
Variante a) einzeilig Variante b) mehrzeilig
Variante c) auch mehrzeilig
zusätzlich in ANSI-C++: //... einzeiliger Kommentar
Demo VC++ .NET: \K1_Einleitung\Kommentar\Kommentar.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
38
Einleitung Präcompiler (Präprozessor) Präprozessor / -compiler (Kurzeinführung) Was ist der Präprozessor und was macht er? • Vor dem eigentlichen Übersetzungsvorgang (C-Compiler) startet der Präprozessor seine Aktivitäten Wesentliche Aufgaben: • Einfügen von Header-Dateien in den Quellcode • Bereitstellen verschiedener Definitionen (auch Konstanten) • dadurch wird u.a. auch die Compilation vorbereitet (z.B. ist die Konstante _DEBUG gesetzt, erzeugt der C-Compiler beim Übersetzen einen DebugStand) Wichtigste Merkmale: • besitzt eine eigene Syntax ≠ C/C++ Syntax • alle Präprozessor-Anweisungen beginnen mit dem Zeichen #
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
39
Einleitung Präcompiler (Präprozessor) Präprozessor / -compiler (Kurzeinführung) Einbinden von Standard-Funktionen (Standard-Header) #include #include
/* Ein-/Ausgabe in ANSI-C */ // Ein-/Ausgabe in ANSI-C++
Makro (Textersetzung) #define Name Wert
• jedes Auftreten der Zeichenfolge Name im Quelltext wird durch Wert ersetzt (reine Textersetzung!) /* Beispiel: Definition von Konstanten */ #define MOUNT_EVEREST 8848 #define MWST 0.16
#define ist im gesamten Programm gültig!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
40
Einleitung Präcompiler (Präprozessor) Präprozessor / -compiler (Kurzeinführung) Code-Beispiel:
Demo VC++ .NET:\K1_Einleitung\Bsp2\Bsp2.vcproj
#include #include #define PI 3.14 using namespace std;
/* // /* //
notwendig für printf() Funktion */ notwendig für cout-Stream definiert die Konstante PI */ importiert Namensraum std
int main(void) /* Beginn des Hauptprogramms */ { double umfang; /* definiert Gleitkommavariable */ int d = 5; /* definiert Ganzzahlvariable */ umfang = PI * d; /* Wertzuweisung (Anweisung) */ /* ANSI-C */ printf("Umfang des Kreises mit d=%d beträgt %f.\n", d, umfang); // ANSI C++" cout , Ende --> + "); scanf("%c", &answer); if(answer == 'q' || answer == 'Q') break; fflush(stdin); // Eingabepuffer loeschen } return 0; Frank Artinger 54 Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren Demo VC++ .NET:\K7_Steuerstrukturen\ASCII\ASCII.vcproj }
Steuerstrukturen Sprünge weiteres Beispiel zur Break-Anweisung
Bildschirmausgabe (1. Seite)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
55
Steuerstrukturen Sprünge Programmsprünge mit Goto • goto erlaubt einen beliebigen Sprung innerhalb derselben Funktion (z.B. main()-Funktion) • Sprungziele müssen als Marken (Labels) vereinbart werden
... Sprungziel: Anweisungen; goto Sprungziel; ...
Markierung (Label) mit : gekennzeichnet
Sparsamer Umgang mit Goto‘s!! Programm verliert schnell an Übersichtlichkeit (Spaghetti-Code) -> Goto‘s können in den meisten Fällen umgangen werden
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
56
Steuerstrukturen Sprünge .. evtl. eine sinnvolle Anwendung von goto .. • sofortiges Verlassen einer tiefgeschachtelten Schleifenkonstruktion for( .. ) for( .. ) if(error) goto errorcheck; ... errorcheck: // Fehlerbehandlung
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
57
Steuerstrukturen Sprünge Konkretes Beispiel zu Goto.. • Fehlerbehandlung für die Eingabe einer ungültigen Note #include int main(void) { int i; goto Eingabe; Hinweis: printf("Es gibt nur die Noten von 1 - 6 !!\n\n"); Eingabe : printf("Bitte geben Sie Ihre Note ein ( 1-6 ): "); scanf("%d",&i); if ((i < 1) || (i > 6)) goto Hinweis; fflush(stdin); return 0; }
Demo VC++ .NET:\K7_Steuerstrukturen\Goto\Goto.vcproj
HINWEIS: es geht auch ohne goto ..
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
58
Steuerstrukturen Sprünge umgeschriebenes Beispiel ohne goto .. #include int main (void) { int i, a; do { a=0; printf("Bitte geben Sie Ihre Note ein (1-6): "); scanf("%d",&i); switch (i) { case 1: printf( "Sehr Gut!" ) ;a=1; break; case 2: printf( "Gut!" ) ; a=1; break; case 3: printf( "Befriedigend!" ) ; a=1; break; case 4: printf( "Genügend!" ) ; a=1; break; case 5: printf( "Ausreichend!" ) ; a=1; break; case 6: printf( "Ungenügend!" ) ; a=1; break; default: printf("Fehlerhafte Eingabe!\n"); printf("Nur Noten von 1-6 sind gueltig!\n"); } Frank Artinger Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren } ..
59
Steuerstrukturen Sprünge umgeschriebenes Beispiel ohne goto .. } .. while (a==0); fflush(stdin); getchar(); return 0; }
Demo VC++ .NET:\K7_Steuerstrukturen\SwitchStattGoto\SwitchStattGoto.vcproj
etwas länger zwar, aber leichter wartbar da übersichtlicher
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
60
Steuerstrukturen Rekursion Rekursion • Rekursion == besondere Form der Wiederholung • Realisierung mit einem Unterprogramm (Funktion), die 2 Randbedingungen erfüllen muß: 1) Funktion muß eine Abbruchbedingung für die Rekursion enthalten 2) Funktion ruft sich selbst auf und übergibt ein Teilergebnis der Abarbeitung Beispiel: Fakultätsberechnung int fak(int z) { int r = 1; rekursive Bildungsvorschrift if(z > 1) { a1 = 1, an = n * an-1 und n > 0} r = fak(z – 1); z.B. 5! = 5 * 4 * 3 * 2 * 1 = 120
return(r * z); }
Frank Artinger
rekursiver Abstieg
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
61
Steuerstrukturen Rekursion Beispiel zur Rekursion (Fakultät) #include "stdafx.h" using namespace std;
Beispiel: Fakultätsberechnung -> Verfolgen des Programmablaufs im Debugger
int fak(int z) { int r = 1; if(z > 1) r = fak(z-1); return(r * z); } int _tmain(int argc, _TCHAR* argv[]) { int zahl = 0; cout zahl; cout 1) // Rekursionsbedingung ergebnis=2*rechne(z-1); // Rekursion (Selbstaufruf) else ergebnis = 1; // rekursiver Abstieg abgeschlossen -> Aufstieg gesamt += ergebnis; aufstieg(z,ergebnis); // Anzeige der Rekursionsschritte Frank Artinger return ergebnis; // Rücksprung (Körneranzahl Informatik - ANSI C Vorgängerfeld) 2.0 / ANSI C++ Technische Informatik und Programmieren } ...
69
Steuerstrukturen Rekursion Code-Beispiel zur Rekursion (Kornbeispiel) int main(void) { int n; float u; printf("Welches Feld wollen Sie bestimmen: "); scanf("%d",&n); // Eingabe Feldnummer u=rechne(n); // Übergabe des größten Felds: Start der Rekursion printf("Es sind %5.0f Koerner auf dem %d ten Feld.\n\n",u,n); printf("Insgesamt liegen %E Koerner auf dem Schachbrett.",gesamt); getchar(); return 0; }
Demo VC++ .NET:\K7_Steuerstrukturen\Rekursion\Rekursion.vcproj
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
70
Steuerstrukturen Rekursion Rekursiver Algorithmus zur Zahlensuche (Zahlenraten) Aufgabe: • Erraten einer Zahl aus einem vorher festgelegten Zahlenbereich (z.B. 1 .. 100) • Triviale Lösung: alle Zahlen erfragen -> max. 100 Fragen, technische Lösung z.B. mit Zählschleife und 100 Durchläufen • Ziel: Suche nach einer schnelleren Lösung Rekursiver Lösungsansatz: • sog. binäre Suche ermöglicht eine deutliche Einschränkung der Fragestellungen (z.B. max. 10 Fragen, wenn zusätzlich die Information verfügbar ist, ob die gezogene Zahl < oder > der gesuchten Zahl ist) • Anwendung z.B. bei der Suche nach Telefonbucheinträgen
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
71
Steuerstrukturen Rekursion Struktogramm des Algorithmus SuchZahl min, max: Bereichsgrenzen test: Wert, der gerade getestet wird
zahl: gesuchte Zahl
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
72
Steuerstrukturen Rekursion Funktionsweise des Algorithmus Suche Zahl (binäre Suche) Verbale Beschreibung: ¾ Zahlenbereich (1 .. 100) in der Mitte teilen ¾ Vergleich der mittleren Zahl (Testzahl) mit der gesuchten Zahl ¾ falls Testzahl < gesuchte Zahl -> nochmaliger Funktionsaufruf mit Zahlenbereich Testzahl .. Maximum (hier muß die gesuchte Zahl dann wohl liegen) ¾ falls Testzahl > gesuchte Zahl -> nochmaliger Funktionsaufruf mit Zahlenbereich Minimum .. Testzahl ¾ jetzt wieder der 1. Schritt, allerdings mit halbierten Zahlenintervall ¾ gesuchte Zahl ist spätestens dann gefunden, wenn das zu untersuchende Intervall nur noch eine Zahl enthält (oder die gesuchte Zahl wurde zuvor bereits zufällig erraten)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
73
Steuerstrukturen Rekursion Tabellendarstellung zur rekursiven Zahlensuche Arbeitsweise für Zahlenbereich {min, max} = {0, 20}
gesuchte Zahl
Vergleich: 5 Aufrufe (rekursive Suche) vs. 20 Aufrufe bei sequentieller Suche
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
74
Steuerstrukturen Rekursion Code-Beispiel zur rekursiven Zahlensuche • rekursive Funktion SucheZahl() ruft sich selbst auf • in der Rekursionsbedingung wird entschieden, mit welchen Parametern die Funktion sich selbst aufruft • ist die Zahl gefunden, wird die Funktion mit der Übergabe der gesuchten Zahl verlassen (Abbruchbedingung)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
75
Steuerstrukturen Rekursion Code-Beispiel zur rekursiven Zahlensuche min, max: Bereichsgrenzen #include int zahl; int nummer = 0; int SuchZahl( int min, int max ) /*rekursive Funktion */ { int test; nummer++; printf("\nDurchlauf Nr.: %d\n",nummer); test=( min+max ) / 2; /* arithm. Mittel */ if ( test < zahl ) /* Rekursionsbedingung */ { test = SuchZahl( test,max ); } Programmverzweigung in else der Rekursion { if ( test > zahl ) { test = SuchZahl( min,test ); } } rekursiver Abstieg beendet, return test; Frank Artinger Informatik - ANSI C 2.0 / ANSI C++ rekursiver Aufstieg beginnt Technische }...Informatik und Programmieren
76
Steuerstrukturen Rekursion Code-Beispiel zur rekursiven Zahlensuche int main( void ) { int min; int max; WHILE- Bedingung zur int ergebnis; Wiederholung fehlerhafter do Eingaben { printf( "Zufallszahl aus dem Intervall: " ); scanf( "%d", &zahl ); clrscr(); // oder printf( "\033[2J" ); für Linux printf( "\nAnfangswert des Intervalls: \t " ); scanf( "%d", &min ); printf( "\nEndwert des Intervalls: \t" ); scanf( "%d", &max ); negative Zahlenbereichsgrenze? } while ((min-max) > 0 || (min*max) < 0 || (zahl < min) || (zahl>max )); ergebnis = SuchZahl( min, max ); printf( "\n\aDie Zahl ist: %d\n", ergebnis ); fflush(stdin); getchar(); Demo VC++ .NET:\K7_Steuerstrukturen\Ztest\Ztest.vcproj Frankreturn Artinger0; 77 Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren }
Steuerstrukturen Rekursion Lessons learned .. • rekursive Funktionsabläufe sind schwer aus dem Quelltext abzulesen • der Programmablauf muß meist über das Verständnis des Prinzips abgeleitet/erschlossen werden • Hinweise (Kommentare) im Quelltext rekursiver Funktionen vereinfachen vielfach das Verständnis für die komplexen Abläufe in rekursiven Schleifen
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
78
Steuerstrukturen Übungen Vorlesungsbegleitende Übung
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
79
Steuerstrukturen Übungen Vorlesungsbegleitende Übung
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
80
ORIENTIERUNG
Typvereinbarungen von Variablen Orientierung Einleitung Das erste Programm in C Konstanten Einfache Datentypen Unterprogramm – Technik – Nützliche Funktionen Steuerstrukturen Typvereinbarungen von Variablen Zeiger Der Präcompiler Modulare Programmierung Entwicklungsumgebungen Standardbibliotheken Anhang
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
1
Typvereinbarungen von Variablen Ziele Wie werden eigene (benutzerdefinierte) Datentypen vereinbart? Wie werden Aufzählungsdatentypen deklariert und
ZIELE
definiert? Was sind zusammengesetzte Datentypen? Wie werden zusammengesetzte Datentypen verwendet?
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
2
Typvereinbarungen von Variablen Inhalt
INHALT
Typvereinbarungen von Variablen Grundlagen Typvereinbarung Syntax der Typvereinbarung Klassifikation der Datentypen Aufzähldatentyp Syntax der enumeration Beispiele Arrays (Felder) Syntax von Arrays Beispiele zu Feldern Mehrdimensionale Arrays (Felder) Syntax mehrdimensionaler Felder Beispiele zu mehrdimensionalen Feldern Strukturen (struct) Syntax von Strukturen Zugriff auf einzelne Felder eines Datensatzes Verschachtelte Strukturen Union Syntax einer Union Beispiele zur Union Bitfelder Syntax von Bitfeldern Beispiele zu Bitfeldern Übung
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
3
Typvereinbarungen von Variablen Grundlagen Typvereinbarungen (strukturierte Datentypen) • bislang haben wir sog. Grunddatentypen verwendet (z.B. int, float etc.) -> werden durch ANSI-C/C++ bereitgestellt • aus diesen Grund- oder Basisdatentypen können wir selbst komplexere Datenstrukturen erzeugen und in unserem Programm verwenden Beispiel: Programm zur Fahrzeugsimulation Klassifikation realer Gegenstände führt zu Eigenschaften -> Abbildung in Datentstruktur im Programm
Eigenschaften (Attribute): - Farbe, Lack - Anzahl Räder - Leistung Motor - cw-Wert - etc.
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
4
Typvereinbarungen von Variablen Grundlagen Typvereinbarungen (strukturierte Datentypen) • ANSI-C/C++ bietet die Möglichkeit, weitere (benutzerdefinierte) Datentypen (-strukturen) einzuführen • wie bei Variablen, Funktionen müssen neue Typen vereinbart (deklariert) werden, bevor sie verwendet werden können • sehr sinnvoll ist es, neuen Datentypen eigene (eindeutige) Namen zu geben
Syntax der Typvereinbarung (typedef) • Schlüsselwort typedef dient zur Definition neuer Typnamen typedef Datentyp NeuerTypName; neuer Typname (Aliasname für Datentyp) C-Grunddatentyp (int, float,..) oder eigener HINWEIS: Auch ein bereits vorhandener Typname kann einen neuen (evtl. intuitiveren) Namen erhalten.
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
5
Typvereinbarungen von Variablen Typvereinbarung (typedef) Beispiele zu typedef leitet Typvereinbarung ein (Schlüsselwort!) Datentyp des neuen Typs neuer Typname typedef float real; typedef int temperatur; typedef unsigned long ULONG; // Anwendung im Programm ULONG eineUnsignedLongVariable; temperatur t_Raum1 = 20; real stuetzpunkt = sqrt(3)/2.0; neuer Datentyp wird verwendet wie Grunddatentypen
VORTEILE: Lesbarkeit des Programms wird verbessert maschinenabhängige Datentypen können zentral behandelt werden
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
6
Typvereinbarungen von Variablen Typvereinbarung (typedef) Wichtige Eigenschaften von typedef • in einer neuen typedef-Definition nimmt der neue Typname immer die Position eines Variablennamens ein (ohne das führende typedef würde eine neue Variable und kein neuer Typname vereinbart) • Typdefinitionen reservieren keinen Speicherplatz, es wird auch kein neuer Datentyp konstruiert • es wird lediglich ein neuer Name für einen bereits existierenden Datentyp eingeführt
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
7
Typvereinbarungen von Variablen Klassifikation der Datentypen
Grunddatentypen
Enumerationen
Grunddatentypen benutzerdefinierter Datentyp
Frank Artinger Technische Informatik und Programmieren
Vorstufe der Klasse
Informatik - ANSI C 2.0 / ANSI C++
8
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Aufzähltypen (enum) • Aufzählungstyp wird mit dem Schlüsselwort enum definiert • der Wertebereich eines enums umfaßt bestimmte Ganzzahlen (nur Typ int) • die möglichen Werte und deren Namen werden durch eine Aufzählung festgelegt
Syntax der Enumeration (enum) Variante 1) mit automatischer Numerierung typedef enum {rot, gelb, gruen} t_Ampel; Bezeichner für den Datentyp typedef enum {Sa, So} t_Wochenende; Aufzählungsliste
• Aufzählungsliste enthält Konstanten vom Typ int • Wert der Konstanten ergibt sich bei automatischer Numerierung aus der Reihenfolge in der Liste (z.B. rot = 0, gelb = 1, gruen = 2 bzw. Sa = 0, So = 1)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
9
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Syntax der Enumeration (enum) Variante 1 mit expliziter Wertzuweisung: typedef enum {blau, rot, gruen, gelb} t_farbe; typedef enum {blau, rot = 10, gruen = 20, gelb} t_farbe1; t_farbe wand = rot; Variablen vom Typ t_farbe und t_farbe1 t_farbe1 wand1 = rot;
• automatische Numerierung: blau = 0, rot = 1, gruen = 2, gelb = 3 Var. wand besitzt den Wert 1 • explizite Numerierung: blau = 0, rot = 10, gruen = 20, gelb = 21 Var. wand1 besitzt den Wert 10 Vorteile der enumeration: • nicht-ordinale Merkmale können intuitiv im Programm abgebildet werden • Compiler prüft den Wertebereich vor einer Variablenzuweisung (Typsicherheit!) • enums erleichtern häufig die Lesbarkeit des Codes
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
10
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Beispiel zu enum (Variante 1 mit typedef) #include
/* printf() und scanff() */
int main() { typedef enum {blau, rot, gruen, gelb} t_farbe; t_farbe wand; for (wand = blau; wand < gelb; wand = (t_farbe)(wand + 1) printf(“Die Farbe der Wand ist: %d.\n“, wand); getchar(); return 0; }
enums können auch in switch – case Verzweigungen eingesetzt werden
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
11
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Syntax der Enumeration (enum) Variante 2) (ohne typedef) • gem. ANSI C99 kann eine enumeration auch ohne typedef eingeführt werden // automatische Numerierung enum BOOL {false, true}; // allg. Definition enum BOOL {false, true} flag; // Definition + Var. flag erzeugen enum BOOL flag; // Variable flag vom Typ BOOL erzeugen BOOL flag; // dito, auch möglich
beliebige int-Konstanten (auch negativ!) // explizite Numerierung enum grundfarbe {blau = 1, gruen = 2, rot = 4} farbe; enum schalter {aus,off = 0, ein,on = 1}; Konstanten aus und off erhalten den Wert 0
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
12
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Syntax der Enumeration (enum) zu Variante 2) (ohne typedef) // weitere Variante von enum enum {rot_zeit = 23, gelb_zeit = 3, gruen_zeit = 20}; hier fehlt der Name des enum enums können auch ohne Namen angegeben werden: Aufzählungstyp später aber nicht mehr verwendbar (d.h. es kann keine Variable vom Typ des enums erzeugt werden) nur die int-Konstanten können genutzt werden ergo: Alternative zu const int oder #define // später.. Funktion(rot_zeit); int x = gelb_zeit;
Frank Artinger Technische Informatik und Programmieren
// int-Konstante rot_zeit // int-Konstante gelb_zeit
Informatik - ANSI C 2.0 / ANSI C++
13
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Beispiel zu enum (Variante 2 ohne typedef) /* Ampel.c --> Dieses Programm simuliert die Phasen einer Ampel. * * Mit Unterbrechungstaste (Strg+C) beenden. */ #include #include // wg. Timer nur Konstanten definieren enum farben { rot, gelb, gruen }; enum { rot_zeit = 23, gelb_zeit = 3, gruen_zeit = 20}; // Sekunden void warte( int sekunden), schalte( int farbnr); void main() { enum farben
phase = rot; // oder: farben phase = rot;
printf("\n\n"); ...
Demo VC++ .NET:\K8_Typvereinbarungen\Ampel\Ampel.vcproj Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
14
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Beispiel zu enum (Variante 2 ohne typedef) ... while(1) { schalte( phase); switch( phase) int-Konstante, Wert 23 { case rot: warte( rot_zeit); phase = gelb; break; case gelb: warte( gelb_zeit); phase = gruen; break; case gruen: warte( gruen_zeit); phase = rot; break; default: phase = rot; break; } } } ...
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
15
Typvereinbarungen von Variablen Aufzähltypen (enumeration) Beispiel zu enum (Variante 2 ohne typedef) ... void warte( int sek) { long start = time(NULL); while( time(NULL) < start + sek) ; }
Timer (OS-Funktion) nutzen
void schalte( int farbnr) „Gedächtnis“ der Funktion { static char *kontroll_str[] = { "ROT", "GELB", "GRUEN\n" }; printf("\t %s\n", kontroll_str[farbnr] ); }
Hinweis: Standardfunktion time(NULL) gibt die aktuelle Systemzeit in UTC (coordinated universal time) an d.h. Anzahl Sekunden seit Mitternacht 00:00:00, 1.Jan 1970 statt NULL kann auch ein Zeiger auf eine Variable angegeben werden Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
16
Typvereinbarungen von Variablen Array (Felder, Vektoren) Array (Felder, Vektoren) • Arrays können mehrere Elemente desselben Typs aufnehmen • bei der Definition des Arrays wird die Anzahl der n Elemente bestimmt • der Zugriff auf die Elemente erfolgt über einen Index [0 .. n-1]; n:= Anzahl der Elemente
Beispiel zu Array char puffer[100]; puffer[0] = ‘A‘; puffer[0]
Anzahl der Elemente (100), Index von [0, 99] Ansprechen eines Elements per Index
‘A‘
puffer[1] ...
Vektor (Array) puffer im Speicher kann 100 Elemente vom Typ char aufnehmen jedes Element ist über Index [0, 99] erreichbar belegt 100 * 1 Byte zusammenhängenden Speicher
puffer[99]
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
17
Typvereinbarungen von Variablen Array (Felder, Vektoren) Syntax von Arrays typ name[anzahl];
// allg. Syntax
int lottozahlen[6]; // Def. int-Array mit 6 Elementen // Definition und Initialisierung int-Array mit 6 Elementen int lottozahlen[] = {3, 27, 35, 6, 15, 21}; // nur Element [0], [1] initialisieren int lottozahlen[] = {3, 27}; // schreibender Zugriff auf ein Element per Index lottozahlen[2] = 23; // lesender Zugriff auf ein Element per Index printf(“%d“, lottozahlen[2]);
• anzahl muß eine Konstante sein (oder Ausdruck, der nur Konstanten enthält)
Es gibt keine Fehlermeldung, wenn zur Laufzeit des Programms der Index den zulässigen Wertebereich verlässt! -> Folge: Speicherüberschreiber (evtl. Absturz!!) Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
18
Typvereinbarungen von Variablen Array (Felder, Vektoren) Syntax von Arrays • Arrays können mit jedem Datentyp gebildet werden double zahl[20]; // double-Array (Vektor) int i; // Index // füllen der double-Elemente mit 1/1, 1/2, 1/3, .. 1/20 for(i = 0; i < 20; i++) zahl[i] = 1.0 / (double)(i+1); C- type cast: wandelt int-Ergebnis (i+1) in double
• Laufbedingung i < 20 stellt sicher, daß Index i im zulässigen Bereich [0, 19] bleibt • type cast (double) (i+1) wäre nicht unbedingt erforderlich, macht aber deutlich, daß eine Gleitkommadivision (z.B. 1.0 / 12.0) erfolgen soll!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
19
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel zu Arrays /* Dreh.c --> Eine Zeile einlesen und umgekehrt ausgeben. #include Konstante für Elementanzahl #define MAXL 100 int main() { int c, i;
*/
char puffer[MAXL];
printf("\nBitte geben Sie eine Zeile Text ein:\n\n"); for(i = 0; i < MAXL && (c = getchar()) != '\n'; ++i) puffer[i] = c; // Zeile einlesen. putchar('\n');
// Neue Zeile.
while( --i >= 0) putchar(puffer[i]);
// Zeile umgekehrt // ausgeben.
putchar('\n'); return 0;
// Neue Zeile.
Demo VC++ .NET:\K8_Typvereinbarungen\Dreh\Dreh.vcproj 20 Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren } Frank Artinger
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays • Ziel: alphabetische Sortierung von 5 eingegebenen Großbuchstaben (5 Ganzzahlen gem. ASCII-Zeichencodetabelle) Angewandtes Sortierverfahren: Zahlenpaar 1 (1,18) • paarweiser Vergleich, links beginnend (1,18) • Zahllinks < Zahlrechts -> o.k. Zahlenpaar 2 (18,3) • Zahllinks > Zahlrechts -> tausche Position u.s.w.
am Ende des Arrays ist 1 Ziffer korrekt sortiert d.h. bei n Elementen sind n Durchläufe erforderlich falls in einem Durchlauf kein Tausch erfolgt -> Elemente sind sortiert (Abbruchkriterium) Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
21
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays Struktogramm zum Buchstabensortieren:
Durchlaufzähler Zahllinks < Zahlrechts ?
tausche Zahllinks , Zahlrechts
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
22
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Buchstabensortieren) #include #define MAX 20 Anzahl der zu sortierenden Buchstaben int main (void) { int index; Position eines Elementes in der Liste int nummer; Anzahl der Durchläufe 1 == Tausch im Durchlauf, 0 == kein Tausch im Durchlauf -> ABBRUCH! int flag; char buchstabe; Zwischenspeicher beim Tausch der Buchstaben char liste[MAX]; char-Array, Index [0, MAX-1] printf("Bitte geben Sie die Liste der Buchstaben ein: \n"); for (index = 0; index < MAX; index++) { scanf("%c",&liste[index]); if (liste[index] < 65 ) index--; /*Entfernen der Steuerzeichen */ } ...
Demo VC++ .NET:\K8_Typvereinbarungen\Sort\Sort.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
23
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Buchstabensortieren) Hinweis zu scanf(): scanf("%c",&liste[index]);
• entweder: alle Zeichen eingeben und mit RETURN abschließen (pro Schleifendurchlauf liest scanf() dann 1 Zeichen aus dem Eingabepuffer) • oder: Eingabe jedes einzelnen Buchstabens mit RETURN abschließen Filtern von Steuerzeichen (ASCII-Code < 65): if (liste[index] < 65 ) index--;
• wird ein ASCII-Zeichen < 65 eingegeben -> Listen-Index wird zurückgesetzt (index--) d.h. das eingelesene Zeichen (< 65) wird im nächsten Schleifendurchlauf überschrieben
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
24
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Buchstabensortieren) ... nummer = 0; /* NUMMER DES DURCHLAUFS */ do Sortierschleife { vor jedem Durchlauf auf 0 setzen flag = 0; nummer++; for(index = 0 ; index < MAX-nummer ; index++) { Zahllinks > Zahlrechts ? if (liste[index] > liste[index + 1]) { jetzt 1, da getauscht wird flag = 1; buchstabe = liste[index]; liste[index] = liste[index + 1]; tausche Zahllinks , Zahlrechts liste[index + 1] = buchstabe; }; } } Abbruchkriterium, falls keine Sortierung mehr notwendig while (flag==1); ...
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
25
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Buchstabensortieren) ... printf ("Sortierte Liste: \n"); for (index = 0; index < MAX; index++) { printf("%c ",liste[index]); }
Ausgabe der sortierten Liste
printf("\nSortierung erfolgte nach %d Durchlaeufen.",nummer); fflush(stdin); // Eingabepuffer leeren getchar(); return 0; }
Demo VC++ .NET:\K8_Typvereinbarungen\Sort\Sort.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
26
Typvereinbarungen von Variablen Array (Felder, Vektoren) Initialisierung von Arrays • Initialisierung mit einer Liste von Elementen { .. } // mit Längenangabe int num[3] = {2, 4, 6}; // ohne Längenangabe int num[] = {2, 4, 6};
// num[0] = 2, num[1] = 4, num[2] = 6 // num[0] = 2, num[1] = 4, num[2] = 6
Längenangabe kann entfallen // unterbestimmte Liste int num[3] = {2, 4}; // num[2] wird mit 0 belegt // überbestimmte Liste int num[3] = {2, 4, 6, 8, 10}; // Werte 8 und 10 werden ignoriert
Frage: Wann werden die Arrays (Vektoren) erzeugt?
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
27
Typvereinbarungen von Variablen Array (Felder, Vektoren) Lokal und global definierte Arrays Lokale Arrays (z.B. innerhalb einer Funktion) • Erzeugung erst zur Laufzeit des Programms • sog. dynamische Erzeugung Globale Arrays (außerhalb jeder Funktion, auch main() ) • Erzeugung bereits zum Übersetzungszeitpunkt • sog. statische Erzeugung
Arrays, die initialisiert werden (Liste) oder größeren Speicherplatz (z.B. > 1 kByte) benötigen sollten global definiert werden! Elemente eines nichtinitialsierten lokalen Arrays haben zunächst undefinierte Werte! -> Wertzuweisung erfolgt meist durch ein nachfolgende Schleife
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
28
Typvereinbarungen von Variablen Array (Felder, Vektoren) Ausflug: Fibonacci-Zahlen Leonardo Fibonacci (L. von Pisa, L. Pisano) (1170 – 1240) • Hauptwerk Liber abbaci (1202) • popularisiert das in der arabischen Welt • übliche Dezimalsystem • (Ablösung des römischen Zahlensystems) Fibonacci-Zahlen • math. Folge von positiven ganzen Zahlen • rekursive Definition: f0 = 0; f1 = 1; fn = fn-1 + fn-2 Folge: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, .. • Beispiel zur Berechnung einer Kaninchenpopulation • zu Beginn gibt es ein Paar neugeborene Kaninchen • Jedes neugeborene Kaninchenpaar wirft nach 2 Monaten ein weiteres Paar • Anschließend wirft jedes Kaninchenpaar jeden Monat ein weiteres • Kaninchen leben ewig und haben einen unbegrenzten Lebensraum Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
29
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Initialisierung) /* * * * * * * * * *
Fibo.c --> Dieses Programm berechnet die ersten 20 Fibonacci-Zahlen und die zugehoerigen Fibonacci-Quotienten. -----------------------------------------------------------Die ersten zwei Fibonacci-Zahlen sind 0 und 1. Jede folgende Fibonacci-Zahl ist die Summe der beiden Vorgaenger. Das ergibt die Zahlenfolge: 0, 1, 1, 2, 3, 5, 8, 13, ... . Die Quotienten der Fibonacci-Zahlen durch ihre Vorgaenger, also 1/1, 2/1, 3/2 .... ,heissen Fibonacci-Quotienten. Sie konvergieren gegen den Grenzwert (1 + sqrt(5)) / 2.
#include #include #define GRENZE 20
* * * * * * * * * */
fn+1/fn ≈ a = Ф ≈ 1,618... (Goldener Schnitt, irrationalste Zahl) // Prototyp von sqrt()
long fib[GRENZE+1] = { 0, 1 }; ...
Element [0] und [1] initialisiert
Demo VC++ .NET:\K8_Typvereinbarungen\Fibo\Fibo.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
30
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Initialisierung) ... char header[] = "\n\n" " Index Fibonacci-Zahl Fibonacci-Quotient Abweichung\n" " Quotient - Grenzwert" "\n\n"; int main() { int i; double q, lim; for( i=1 ; i < GRENZE ; ++i) fib[i+1] = fib[i] + fib[i-1];
// Berechnung der // Fibonacci-Zahlen.
lim = (1.0 + sqrt(5.0)) / 2.0;
// Der Grenzwert.
printf(header); printf("%5d %20ld\n", 0, fib[0]); printf("%5d %20ld\n", 1, fib[1]); ...
Frank Artinger Technische Informatik und Programmieren
// Ausgabe der ersten // 2 Fibonacci-Zahlen.
Informatik - ANSI C 2.0 / ANSI C++
31
Typvereinbarungen von Variablen Array (Felder, Vektoren) weiteres Beispiel zu Arrays (Initialisierung) ... for( i = 2 ; i Verwenden mehrdimensionaler Vektoren. #include
Matrize vom Typ char
char vertreter[2][20] = { "Lauber, Otto", "Forsch, Heidi" };
Zeile 1 Zeile 2
// Jeder Vertreter hat vier verschiedene Artikel // im Sortiment, davon wurden verkauft: int artikel_anzahl[2][4] = { { 20, 5, 30, 17}, {150, 120, 90, 110} }; ... Matrize vom Typ int
Demo VC++ .NET:\K8_Typvereinbarungen\Vertreter\Vertreter.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
40
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel zur Verwendung 2-dimensionaler Arrays ... int main() { int i, j; for( i = 0; i < 2; ++i) Zugriff auf i-te Zeile { printf("\n\nVertreter: %s", vertreter[i]); printf("\nVerkaufte Stueckzahlen:"); Zugriff auf i,j-tes Element for( j = 0; j < 4; ++j) printf("%8d", artikel_anzahl[i][j]); } printf("\n"); return 0; }
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
41
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Spielregeln: • Spielsteine werden im Wechsel von 2 Spielern aufgelegt • Gewinner ist, wer zuerst 4 Spielsteine seiner Farbe zusammenhängend diagonal, senkrecht oder waagrecht gelegt hat (vgl. „Vier-Gewinnt“) • sind alle Felder ohne Gewinnsituation besetzt -> unentschieden! Beispiel:
Spieler A hat gewonnen!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
42
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Vorüberlegungen zum Programmentwurf (Design): • Funktion zum ausgeben des aktuellen Spielstandes (== aktuelle Position der Spielsteine) auf dem Bildschirm • Funktion zur Kontrolle der Gewinnsituation • Funktion zur Eingabe der Feld-Zeile durch den Spieler • Funktion zur Eingabe der Feld-Spalte durch den Spieler • Hauptprogramm zur Koordination und Ausgabe des Gewinners
HINWEIS: Es sind natürlich auch andere Entwürfe denkbar! Bemerkenswert: Der Entwurf berücksichtigt nur die allgemeine Logik und ist daher prinzipiell auch für eine fensterorientierte Realisierung geeignet!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
43
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Funktionsprinzip:
Spieler A: Spielstein setzen (Eingabe Zeilen-/Spaltennummer)
Aktuelle Spielsituation ausgeben
Spieler B: Spielstein setzen (Eingabe Zeilen-/Spaltennummer)
Gewinnsituation! (Siegerermittlung ausgeben)
jetzt fehlt nur noch die Implementierung ..
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
44
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) #include char brett[8][8];
char-Matrize: 8 Zeilen, 8 Spalten (8 x 8 Spielfeld)
Funktion zum Aufbau des Spielbrettes int init(void) { int i; int j; for (j = 0; j < for (i = 0; i brett[j][i] return 0; }
Initialisierung der char-Matrize (Spielfeld) Zeilen 8; j++) < 8; i++) = 'O';
Doppelschleife um 8 x 8 Spielfeld mit ‘o‘ zu belegen Spalten
Demo VC++ .NET:\K8_Typvereinbarungen\Brett\Brett.vcproj Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
45
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Funktion zur Eingabe der Zeilennummer durch den aktiven Spieler int zeile() { int z; printf("Zeile: "); scanf("%d",&z); return z; }
Tastaturabfrage
Funktion zur Eingabe der Spaltennummer durch den aktiven Spieler int spalte() { int s; printf("Spalte: "); scanf("%d",&s); return s; }
Tastaturabfrage
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
46
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Funktion zur Kontrolle der Gewinnsituation int erg(int sp) sp == 1 -> Spieler B, sp == -1 -> Spieler A { Spielstein (‘A‘ oder ‘B‘) char zeichen; r == Anzahl gleicher Spielsteine (‘A‘ oder ‘B‘) int r = 0; int i; int j; if (sp < 0) zeichen = 'A'; else zeichen = 'B'; for (j = 0; j < 8; j++) Rücksetzen, falls weniger { senkrechte Felder prüfen.. als 4 gleiche Spielsteine if (r < 4) r = 0; hintereinander for (i = 0; i < 8; i++) if(brett[i][j] == zeichen) r++; else if(r < 4) r = 0; } for (j = 0; j < 8; j++) { waagrechte Felder prüfen.. if (r < 4) r = 0; for (i = 0; i < 8; i++) if(brett[j][i] == zeichen) r++; else if(r < 4) r = 0; } r == 4 bei Gewinnsituation, sonst r == 0 return r; }
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
47
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Funktion zum Ausgeben des aktuellen Spielstandes int ausgabe(int i, int j, int sp) sp == 1 -> Spieler B, sp == -1 -> Spieler A { int a; i, j == Zeilen-/Spaltenposition des Spielsteins (‘A‘ oder ‘B‘) int b; if (sp < 0) brett[i][j]='A'; setzen des aktuellen Spielsteins if (sp > 0) brett[i][j]='B'; (entweder Spieler A oder B) printf("\n"); for (a = 0; a < 8; a++) { printf("\n"); for (b = 0; b < 8; b++) printf(" %c",brett[a][b]); } return 0;
Doppelschleife zur Ausgabe des gesamten Spielfeldes (8 x 8 Brett)
}
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
48
Typvereinbarungen von Variablen Array (Felder, Vektoren) Beispiel: Brettspiel (2-dimensionale Arrays) Hauptprogramm (Koordination der Funktionsaufrufe) int main(void) { max. 64 Runden bei 8 x 8 Brett int runde = 64; int i, j; int spieler = 1; sp == 1 -> Spieler B, sp == -1 -> Spieler A init(); while ((runde > 0) && (erg(spieler) < 4)) { i = zeile(); j = spalte(); Spielerwechsel! spieler *= -1; ausgabe(i,j,spieler); printf("\n"); nach jeder Runde dekrementieren runde--; } if(runde > 0) d.h. erg(spieler) = 4 -> Gewinnsituation! printf("Gewonnen!!!"); fflush(stdin); getchar(); Frank Artinger return 0; Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren }
49
Typvereinbarungen von Variablen Array (Felder, Vektoren) Mehrdimensionale Arrays • im vorigen Brett-Beispiel wurde ein 2-dimensionales Array verwendet • 3- und mehrdimensionale Arrays sind ähnlich in der Handhabung // 3-dimensionales Array int a[2][4][3]; // Definition a[0][0][0] = 15; // Wertzuweisung an das 1. Element
Beschränkung von Arrays: • Elementgröße und Dimension von Arrays werden durch den Wertebereich von unsigned int und den Speicherplatz beschränkt!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
50
Typvereinbarungen von Variablen Strukturen Strukturen (komplexer Datentyp) Datensätze (records) • Datensatz faßt logisch zusammengehörige Daten zu einer Einheit zusammen (z.B. Personaldaten eines Mitarbeiters mit Tel.Nr, Anschrift etc.) • jeder Datensatz unterteilt sich in mehrere Datenfelder • C/C++ bildet Datensätze in Strukturen (struct) ab mögliche Speicherbelegung
Beispiel: // Definition der Struktur adresse struct adresse { char strasse[30]; char ort[30]; Komponenten unsigned long tel; }; struct adresse a,b;
strasse Strukturvariable a
ort tel strasse
Strukturvariable b
ort tel
2 Strukturvariablen vom Typ adresse
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
51
Typvereinbarungen von Variablen Strukturen Definition von Strukturvariablen • bei der reinen Defintion einer Struktur (Festlegung des Strukturtyps) wird noch kein Speicherplatz reserviert // Definition der Struktur adresse struct adresse { char strasse[30]; char ort[30]; unsigned long tel; };
keine Speicherplatzreservierung für die Komponenten (Datenfelder)
• erst bei der Definition von Strukturvariablen (Variablen vom Typ der Struktur) // Strukturvariablen definieren struct adresse a, b;
Frank Artinger Technische Informatik und Programmieren
jetzt werden reserviert: 2 * 30 * 1 Byte + 2 * 30 * 1 Byte + 2 * 4 Byte ------------------------128 Byte
Informatik - ANSI C 2.0 / ANSI C++
52
Typvereinbarungen von Variablen Strukturen Syntax von Strukturen (struct) Variante 1: typedef struct spielkarte { char farbe; Datenfelder int wert; } t_karte; t_karte karte1, karte2; struct spielkarte karte3;
Variante 2: struct spielkarte { char farbe; int wert; } karte1; struct spielkarte karte2, karte3;
• Schlüsselwort struct leitet Struktur ein (typedef ist optional) • optional kann ein Name folgen (Name der Struktur, hier spielkarte) • es folgen die Datenfelder im Block { .. } • direkt im Anschluß an die Strukturvereinbarung können Strukturvariablen erstellt werden (z.B. karte1 in Variante 2 oder ein Typ t_karte1 in Variante 1)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
53
Typvereinbarungen von Variablen Strukturen Syntax von Strukturen (struct) Variante 3: (Strukturdefinition ohne Strukturnamen) struct { char farbe; Datenfelder int wert; } karte1, karte2;
sizeof(karte1); Speicherbedarf der Strukturvariablen == Speicherbedarf der Datenfelder -> sizeof () liefert den Wert in Bytes
• werden nach der Strukturdefinition unmittelbar Strukturvariablen erzeugt (hier karte1, karte2) kann der Strukturname entfallen NACHTEIL: • auf die Struktur kann später kein Bezug mehr genommen werden d.h. es kann keine weitere Strukturvariable erstellt werden (z.B. karte3)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
54
Typvereinbarungen von Variablen Strukturen Verschachtelte Struktur • ein Datenfeld darf wiederum vom Typ einer Struktur sein typedef struct { int x; int y; } t_koord; // neuer Typ
struct tkart { float z; t_koord p; } Karte;
verschachtelte Struktur
VORTEILE: • komplexe Datenstrukturen lassen sich mit verschachtelten Strukturen (relativ) einfach realisieren ☺ • werden Zeiger verwendet, können (neue) dynamische Datenstrukturen (zur Laufzeit des Programms) erzeugt werden ☺
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
55
Typvereinbarungen von Variablen Strukturen Initialisierung von Strukturen • jede Komponente (Datenfeld) einer Strukturvariablen kann durch eine Initialisierungsliste mit einem Anfangswert vorbelegt werden Beispiel: /* Definition des Strukturtyps struct personal */ // Definition von struct adresse wie gehabt.. struct personal { unsigned long nummer; // Personalnummer char name[50]; // Name struct adresse adr; // Adresse double income; // Gehalt }; Datenfeld darf wiederum eine Struktur oder ... ein anderer benutzerdefinierter Datentyp sein
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
56
Typvereinbarungen von Variablen Strukturen Initialisierung von Strukturen ... // Definition und Initialisierung einer Strukturvariablen // vom Typ struct personal struct personal chef = // personal chef ebenfalls möglich { 1234567, “Spenzer, Max“, { “Flowerweg 12“, Initialisierungsliste “81234 Muenchen“, 8325756 }, 269000.0 }; enthält die Initialisierungsliste weniger Anfangswerte als Datenfelder in der Struktur vorhanden sind -> restliche Datenfelder werden mit 0 initialisiert!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
57
Typvereinbarungen von Variablen Strukturen Zugriff auf Komponenten/Datenfelder der Struktur • mit dem . Operator sind Datenfelder zugreifbar (lesend / schreibend) // Zugriff auf Datenfelder der Struktur
Beispiel:
chef.income = 90000.0; Zugriff auf verschachteltes Datenfeld char c_field[30] = {0}; char c = 0; strcpy(c_field, chef.adr.strasse); // Standardbibliothek //c_field = chef.adr.strasse; // leider nicht möglich //c_field[0] = chef.adr.strasse[0]; // geht auch nicht c = chef.adr.strasse[0];
Demo VC++ .NET:\K8_Typvereinbarungen\struct\struct.cpp
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
58
Typvereinbarungen von Variablen Strukturen Beispiel: Personendatenerfassung #include int main(void) { int i; struct person { char name[30]; int nummer; } student; // Strukturvariable, uninitialisiert printf ("Bitte geben Sie die Studiennummer ein: "); scanf("%d",&student.nummer); printf("Bitte geben Sie den Namen ein (Ende mit Leertaste):\n"); i = 0; do { student.name[i]=getchar(); i++; ASCII-Code Leerzeichen (space) } while(student.name[i-1] != 32 ); /*Ende mit Leertaste*/ ...
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
59
Typvereinbarungen von Variablen Strukturen Beispiel: Personendatenerfassung ... printf("Kontrollausdruck:\n"); printf("Studentennummer: %d\n", student.nummer); printf("Name: "); i = 0; do { printf("%c", student.name[i]); i++; Leerzeichen wurde miteingelesen } while(student.name[i] != 32); /*Auslesen bis Leertaste*/ fflush(stdin); getchar(); return 0; } Demo VC++ .NET:\K8_Typvereinbarungen\Daten\Daten.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
60
Typvereinbarungen von Variablen Union (Variante) Union (Variante) • Union ist ähnlich einer Struktur aufgebaut Unterschiede Union vs. Struktur: • nicht für jedes Datenfeld wird Speichplatz angelegt • für alle Felder wird ein gemeinsamer Speicherbereich verwendet • Größe des gemeinsamen Speicherbereichs == Speicherplatzbedarf des größten Datenfeldes (oder: längste Komponente) der Union Konsequenz: • zum gleichen Zeitpunkt kann nur der Inhalt eines Datenfeldes gespeichert werden! • bei Speicherung eines weiteren Datenfeldes wird der bestehende Inhalt überschrieben!
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
61
Typvereinbarungen von Variablen Union (Variante) Syntax von Unions (union) Variante 1:
Variante 2:
typedef union name { int nummer; char kette[10]; längstes Datenfeld } t_variabel; t_variabel t1, t2; // oder union name t3;
union t_karte { char farbe; int wert; } karte1; union t_karte karte2, karte3; t_karte karte4; // auch möglich
Startadresse
Frank Artinger Technische Informatik und Programmieren
Größe: 10 Byte == kette[10]
Informatik - ANSI C 2.0 / ANSI C++
62
Typvereinbarungen von Variablen Union (Variante) Zugriff auf Datenfelder / Komponenten einer Union Beispiel:
Vektor nx im Speicher
union zahl { long n; längstes Datenfeld double x; }; union zahl nx[10]; // Vektor // Zugriff auf Elemente nx[5].n = 77; nx[0].x = 2.23; // oder äquivalent (Zeiger) (nx + 5) -> n = 77; nx -> x = 2.23;
nx[0].n
32 Bit
nx[0].x
32 Bit
. . . nx[9].n
32 Bit
nx[9].x
32 Bit
längstes Datenfeld bestimmt die Größe (hier double, 64 Bits)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
63
Typvereinbarungen von Variablen Union (Variante) Initialisierung von Unions • Union-Variable kann bei der Definition initialisiert werden Unterschied zur Struktur: • Initialisierungsliste enthält nur einen Anfangswert (== Typ des 1. Datenfeldes!) Erklärung: • alle Datenfelder der Union werden im gleichen Speicherbereich gehalten • dieser hat die Größe des „längsten“ Datenfeldes • d.h. zu einem Zeitpunkt kann nur auf 1 Datenfeld zugegriffen werden ein Beispiel bitte..
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
64
Typvereinbarungen von Variablen Union (Variante) Initialisierung von Unions Beispiel: union word_byte { unsigned short w; Größe der Union: 2 Byte (16 Bit) unsigned char b[2]; }; union word_byte wb = { 256 }; nur ein Anfangswert (Typ des 1. Datenfelds) // gespeicherte Bit-Folge: 0000 0001 0000 0000 = 25610 = 0x100 b[1]
b[0]
// Zugriff auf Wort (2 Byte) printf(“WORD = %d“, wb.w); // liefert 256 // byte-weiser Zugriff printf(“Low-Byte = %d, High-Byte = %d“, wb.b[0], wb.b[1]); // liefert: Low-Byte = 0, High-Byte = 1
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
65
Typvereinbarungen von Variablen Union (Variante) Code-Beispiel zur Union #include int main(void) Demo VC++ .NET:\K8_Typvereinbarungen\Union\Union.vcproj { union vario { int ganze; speichert Gleitkommazahl oder Ganzzahl float gleit; } zahl; zahl.ganze = 15; // Ganzzahl printf("Ganze Zahl: %d\n\n", zahl.ganze); zahl.gleit = 8.25; // Gleitkommazahl printf("Gleitkommazahl: %f\n\n", zahl.gleit); printf("Ganze Zahl: %d\n\n", zahl.ganze);/*Fehler, da Gleitkommazahl gespeichert ist*/ getchar(); return 0; Compiler meldet keinen Fehler! } (nur im Programm verkehrt interpretiert!)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
66
Typvereinbarungen von Variablen Union (Variante) Code-Beispiel zur Union Bildschirmausgabe:
Compiler meldet keinen Fehler! (Gleitkommazahl 8.25 wird als Ganzzahl interpretiert!)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
67
Typvereinbarungen von Variablen Bitfelder Bitfelder (systemnahe Programmierung) • Bitfeld == spezielle Struktur für den Zusammenschluß einzelner Bits oder Bitgruppen • ein Rechnerwort (16 Bit) wird in sog. Bit-Felder aufgeteilt Vorteile: • Erhöhung der Informationsdichte (z.B. bei begrenztem Speicherplatz) • direktes Ansprechen einzelner Bits eines Rechnerwortes möglich (z.B. auf Registerinhalte der Computerhardware) • übersichtlicher (weniger fehleranfällig als Bit-Masken) Anwendungsgebiete: • Statusinformationen für Peripheriegeräte (z.B. Druckerstatus überprüfen)
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
68
Typvereinbarungen von Variablen Bitfelder Syntax von Bitfeldern (systemnahe Programmierung) Breite des Bitfelds bit0_4 (also 5 Bits) == 32 Zustände struct { unsigned bit0_4 : 5; Lücke von 10 Bits (kein Zugriff möglich, da ohne Name) unsigned : 10; unsigned bit15 : 1; } Strukturvariable vom o.a. Strukturtyp wort; // Zugriff auf Bitfelder wort.bit0_4 = 0x1F // Wert 31 wird in den unteren 5 Bits gespeichert maximale Bitfeld-Breite == Rechnerwort (i.a. 16 Bit)
• Bitfelder == Datenfelder einer Struktur (struct) • Typ des Bitfelds: unsigned int oder signed int (default) • optional einen Namen (ohne Name: Ausrichtung nachfolgender Bitfelder) • Breite des Bitfelds: nach dem Doppelpunkt Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
69
Typvereinbarungen von Variablen Bitfelder Code-Beispiel zu Bitfeldern /* Checkprn.c --> Dieses Programm ueberprueft den Druckerstatus. * * Hinweis: * * Das Programm ist als DOS-Programm oder Konsolen-Anwendung * * unter Windows 9x lauffähig. Dagegen erlaubt Windows NT einem * * Anwenderprogramm nicht den direkten Zugriff auf die Hardware. */ #include #include #define LPT1_PORT 0x378 // Portadresse der ersten prallelen // Scnittstelle. (0x3BC bei PCs mit // Adapter fuer Momochrom-Bildschirm.) struct prn_status {
unsigned bit012 unsigned error unsigned select unsigned paper unsigned ack unsigned busy } LPT1_status;
void get_status( char *status_ptr); ... Artinger Frank Technische Informatik und Programmieren
: : : : : :
3; 1; 1; 1; 1; 1;
// // // // // //
Nicht verwendet. 0= I/O-Fehler. 1= Drucker online. 1= kein Papier. Quittungssignal. 1= Drucker bereit.
Informatik - ANSI C 2.0 / ANSI C++
70
Typvereinbarungen von Variablen Bitfelder Code-Beispiel zu Bitfeldern int main( ){ do { get_status( (char *)&LPT1_status); printf("\nStatusbyte(HEX):%02X\n", *(unsigned char*)&LPT1_status); if( LPT1_status.busy && LPT1_status.select ) { printf("\nDrucker bereit!\n"); break; } else if( LPT1_status.paper ) printf("\nKein Papier im Drucker!\n"); else if( !LPT1_status.select ) printf("\nDrucker nicht online!\n"); else printf("\nDrucker nicht bereit!\n"); printf("\nBitte Fehler am Drucker beseitigen.\n" andere Taste -> Status pr fen.\n"); Frank Artinger "Esc -> Abbruch,Informatik - ANSI C 2.0 / ANSI C++ Technische Informatik und Programmieren
}while( getch() != 27);
71
Typvereinbarungen von Variablen Bitfelder Code-Beispiel zu Bitfeldern return 0; } #ifdef __GNUC__ #define inp(portadr) #endif
inportb( portadr)
void get_status( char *status_ptr) { *status_ptr = inp(LPT1_PORT+1) & 0xF8; }
// Statusport lesen.
Demo VC++ .NET:\K8_Typvereinbarungen\Checkprn\Checkprn.vcproj
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
72
Typvereinbarungen von Variablen Übung Vorlesungsbegleitende Übung (1)
Legen Sie einen benutzerdefinierten Datentyp über eine Typvereinbarung an, der Daten eines Fahrzeugs speichern kann (Modell, Farbe, Vmax, Hubraum, etc.).
(2)
Schreiben Sie ein Programm, das nach Eingabe von 5 Wertepaaren aus dem Nettopreis und der Mehrwertsteuer den Gesamtbruttopreis berechnet. Speichern Sie dazu die Eingabewerte in einem 2dimensionalen Array.
(3)
Schreiben Sie ein Programm, das in einem Array 5 Automarken speichern kann. Die Eingaben werden über eine while-Schleife realisiert. Lesen Sie die Automarken als unterschiedlich lange Zeichenketten (max. 20 Zeichen) über die Tastatur ein.
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
73
Typvereinbarungen von Variablen Übung Vorlesungsbegleitende Übung (4)
Schreiben Sie ein Programm zur Verwaltung einer CD-Sammlung. Ermöglichen Sie über die Tastatur die Eingabe der CD-Nummer, der Gesamtspiellänge in min, der Anzahl der Titel sowie eines Kennbuchstaben für die Musikarten (R = Rock, K = Klassik etc.) und nehmen Sie diese Werte in eine Struktur auf. Erstellen Sie zuvor einen Datentyp dieser Struktur. Speichern Sie 3 Angaben zu Ihnen bekannten CDs in einem Array dieser Struktur ab.
Frank Artinger Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
74
ORIENTIERUNG
Zeiger Orientierung Einleitung Das erste Programm in C Konstanten Einfache Datentypen Unterprogramm – Technik – Nützliche Funktionen Steuerstrukturen Typvereinbarungen von Variablen Zeiger Der Präcompiler Modulare Programmierung Entwicklungsumgebungen Standardbibliotheken Anhang
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
1
Zeiger Ziele ¾ Was sind Zeiger? ¾ Wie greift man mit Zeigern auf Speicherinhalte zu? ¾ Wie wird Speicherplatz mit Zeigern reserviert und
ZIELE
freigegeben? (dynamische Speicherplatzverwaltung) ¾ Wie werden Zeiger auf benutzerdefinierte Datentypen definiert? ¾ Was ist ein Zeiger auf Funktionen und wozu wird er verwendet?
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
2
Zeiger Inhalt
INHALT
Zeiger Grundlagen Zeigertypen Operatoren für Zeiger Syntax von Zeigern Wertzuweisung und Initialisierung von Zeigern Speicherplatzanforderung Funktionen malloc(), calloc() und realloc() Speicherplatz freigeben Dynamische Speicherverwaltung Speicheraufteilung in stack und heap Zeigerarithmetik Zeigerzuweisungen, Inkrementieren und Dekrementieren Addieren und Subtrahieren, Differenz zweier Zeiger Nullwert-Zuweisung, Vergleichsoperatoren Zeiger auf Strukturen, Zeiger auf dynamisch verwaltete Strukturen Zeiger in Strukturen Einfach verkettete Listen Listenelement anhängen, einfügen und löschen Doppelt verkettete Listen Binäre Bäume Back-Tracking-Technik Zeiger auf Arrays Mehrdimensionale Arrays, Arrays dynamisch erzeugen Zeiger auf Zeiger Beispiele Zeiger auf Funktionen Funktionszuweisung, Funktionsaufruf über Zeiger, Anwendung Sprungtabelle Zeiger auf Strings (Einlesen von Strings über Tastatur, Bildschirmausgabe von Strings) Übung
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
3
Zeiger Einführung Warum beschäftigen wir uns mit Zeigern (Pointern)? • effiziente Programmlogik -> nicht mit Daten selbst sondern mit Referenzen auf Daten wird gearbeitet (z.B. Übergabe eines Arrays an eine Funktion: nicht der gesamte Inhalt sondern nur die Anfangsadresse wird übergeben) • Zeiger sind damit unverzichtbare Elemente in C/C++ • die Funktionsweise von C-Arrays und C-Strings basiert auf Zeigern • dynamische Objekte (Objekte, die zur Laufzeit erzeugt werden) werden mit Zeigern verwaltet
Zeiger bieten große Freiheit!
Zeiger beinhalten auch ihre Tücken! Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
4
Zeiger Zeiger und Adressen Zeiger und Adressen Was ist ein Zeiger? • vergleichbar mit anderen Variablen: Name + Typ + Wert + Operationen möglich • Unterschied:
Wert der Zeigervariablen == Speicheradresse eines Objekts • Analogie-Beispiel: Raum 03 04 01 Stockwerk Raum 02 06 04
Raumnummer
Flur
Gebäude
Frank Artinger
== Pointer (Zeiger) auf einen Raum im Gebäude
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
5
Zeiger Zeiger und Adressen Zeiger und Adressen Wie sieht ein Zeiger in C/C++ aus? Beispiel: int i = 99;
// int-Variable definieren und initialisieren
Speicher (stack, Stapel-/Kellerspeicher)
(1) Compiler legt Speicherplatz mit symbolischen Namen i an (2) der Wert 99 wird eingetragen (3) Compiler hat Speicher an der Adresse 10123 reserviert (Adresse ist uns unbekannt!) Wie kommen wir zur Adresse?
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
6
Zeiger Zeiger und Adressen Beispiel zu Zeigern /*
Adressen.c
-->
Wert und Adresse von Variablen ausgeben.
*/
#include int a, *p;
Zeiger auf int (kurz: int-Zeiger) // Definition der Variablen a und p
int main() { a = 5; p = &a; p speichert die Speicheradresse der int-Variablen a printf("\nWert von a: %10d ", a); printf(" Adresse von a: %10u", &a); printf("\nWert von p: %10u ", p); printf(" Adresse von p: %10u\n", &p); return 0; }
Demo VC++ .NET:\K9_Zeiger\Adressen\Adressen.vcproj Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
7
Zeiger Zeiger und Adressen Beispiel zu Zeigern Bildschirmausgabe:
Variable (Name) a p
Wert (Inhalt) ... 5 4359392 3 4
Adresse (Inhalt) 4359392 4359396
ZUFALL: Compiler hat die Objekte unmittelbar hintereinander im Speicher angelegt
Zeiger haben wie gewöhnliche Variablen einen Namen + Typ + Wert
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
8
Zeiger Zeiger und Adressen Zeiger und Adressen int* ip; ip = &i;
// „Zeiger auf“ einen int-Wert (uninitialisiert) // Adresse von i wird dem Zeiger ip zugewiesen
• mit dem *-Operator (Dereferenzierung) erstellen wir einen “Zeiger auf” int an einer beliebigen (vom Compiler zugewiesenen Speicheradresse z.B. 10224), der Wert von ip ist rein zufällig, da er nicht initialisiert ist • mit dem &-Operator (Adreßoperator) wird jetzt ip die Adresse von i zugewiesen, d.h. ip hat jetzt den Wert 10123 int-Variable i
Zeiger auf int i: ip
ip hat als Wert die Adresse von i
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
9
Zeiger Zeiger und Adressen Zeiger und Adressen F: Können mehrere Zeiger auf i gerichtet sein? int* ip2 = &i;
// 2.er „Zeiger auf“ den int-Wert i
10123
jetzt 2 Zeiger auf int i: ip und ip2
10123 Adresse von i
F: Wie können wir von der Adresse auf den Wert kommen? *ip oder *ip2
// Dereferenzierung d.h. Zugriff auf den Wert!
• der *-Operator ermöglicht es, auf den eigentlichen Wert zuzugreifen • *ip -> (1) lese Wert von ip = 10123, (2) gehe zur Adresse 10123, (3) lese den Wert aus Adresse 10123 (im Beispiel 99)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
10
Zeiger Zeiger und Adressen Zeiger und Adressen F: Dann haben wir jetzt mehrere Möglichkeiten um auf den Wert von i zuzugreifen? i = 99; *ip = 99; *ip2 = 99;
// entweder direkt.. // oder über Dereferenzierung des Zeigers.. // dito..
• *ip oder *ip2 werden als Aliasnamen bezeichnet • alle 3 Anweisungen oben bewirken dasselbe
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
11
Zeiger Zeiger und Adressen Zeiger und Adressen Hinweise zur Schreibweise int* ip, x; int * ip, x; int *ip, x;
// Schreibweise 1 // Schreibweise 2 // Schreibweise 3 nur ip ist ein Zeiger! // oder besser: nur eine Variable pro Deklaration int *ip; // Schreibweise 4 int x;
int* ip; int x;
// Schreibweise 5
• alle 5 Schreibweisen sind äquivalent! • WICHTIG: der * bezieht sich nur auf den direkt im Anschluß folgenden Namen!! • TIPP: Besser jede Deklaration einzeln vornehmen (Schreibweise 4 oder 5)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
12
Zeiger Zeiger und Adressen Zeiger und Adressen mögliche Fehlerfallen .. (nicht abschließend) • Zeiger auf (C++) Referenzen sind nicht möglich! int i = int& ir int* ip int* ip
nur C++!
99; = i; = &i; = &ir
// Referenz auf int i // möglich, ip zeigt auf Adresse von i // Fehler: kein Zeiger auf Referenz
• nur initialisierte Zeiger dereferenzieren! int* xp; *xp = -154;
// Zeiger auf xp (uninitialisiert) // Fehler!! xp „zeigt“ an eine beliebige Adresse (Wert von xp ist zufällig vom Compiler bestimmt..)
durch Dereferenzieren wird der Wert -154 an die beliebige Speicheradresse geschrieben -> es kann „beliebiger“ Schaden entstehen, denn wir wissen nicht, wer die Speicheradresse gerade verwendet -> Absturzgefahr, sog. „Speicherüberschreiber“
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
13
Zeiger Zeiger und Adressen Beispiel zur Verwendung des Dereferenzierungsoperators float a, b, *pa; pa = &a; *pa = 12; *pa += 5.5; b = sqrt(*pa);
// // // //
pa auf a zeigen lassen an a den Wert 12 übergeben a um 5.5 erhöhen Wurzel von a in b ablegen
pa
Adresse von pa
a
Adresse von a == Wert von pa
Wert von a
&a pa
a *pa
&pa Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
14
Zeiger Zeigertypen Zeigertypen • Zeiger können für jeden Datentyp erstellt werden // Variablen int i; float f; char c; struct person testp; // Zeiger auf .. Zeiger auf float int* ip = &i; float* fp = &f; char* cp = &c; struct person* ptestp = &testp;
auch für benutzerdefinierte Typen (e.g struct, enum, etc.)
L-Wert / R-Wert • L-Wert: Datenobjekt im Speicher des Rechners z.B. Variablenname oder Zeigername (vgl. Zuweisung: linker Operand vor = muß eine Speichstelle bezeichnen) • R-Wert: kein L-Wert (z.B. Ausdruck x + 1) Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
15
Zeiger Zeigertypen Größe eines Zeigers • unabhängig vom Grundtyp (“Zeiger auf int”, “auf char”, “auf double” ..) belegt jede Zeigervariable gleich viel Speicherplatz == Speicherplatzbedarf für die Speicherung einer Adresse • Typisch: 32 Bits (4 Byte) auf PC
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
16
Zeiger Zeigertypen Zeigertypen
sog. leerer Zeiger
NULL-Zeiger zur Initialisierung von Zeigern • ein mit NULL initialisierter Zeiger zeigt garantiert nicht auf ein (gültiges) Objekt • NULL ist als logischer Wert abfragbar (NULL stammt aus der “C-Welt”) • in C++: NULL wird durch eine 0 oder 0L (long) implementiert int* iptr = 0; int* iptr = NULL; if(iptr) {..tue etwas}
// Zeiger auf „nichts“ // Zeiger auf „nichts“ // Wert von ip logisch abfragbar
egal, wo iptr zuvor hingezeigt hat, nach der Anweisung zeigt er auf kein Objekt mehr!
TIPP: Zeiger auf NULL oder 0 setzen um sich zu merken, daß der Zeiger noch nicht oder nicht mehr auf ein gültiges Objekt zeigt Bem.: NULL ist im Standard-Header oder enthalten
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
17
Zeiger Zeigertypen Typprüfung von Zeigern (nur C++) • im Gegensatz zu C wird der Typ eines Zeigers in C++ geprüft (Compiler) char* cp; int* ip; void* vp;
// Zeiger auf char // Zeiger auf int // Zeiger auf void (beliebiger Typ!) vp kann auf jedes Objekt zeigen
• Typumwandlungen vp = cp; cp = vp;
// möglich, da vp alle Typen abdeckt // Fehler! cp kann nur Typ char
// Alternative: bewußte Typumwandlung cp = static_cast(vp); // nur in dringenden Fällen!
TIPP: Typumwandlung von Zeigern mit static_cast umgeht die Typkontrolle des Compilers! Bitte nur aus wichtigem Grund anwenden!! Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
18
Zeiger Zeigertypen noch mehr Fehlerfallen.. Zeigerzugriff auf automatische Variablen int i = 9; int* ip = &i; // Zeiger ip zeigt auf i *ip = 8; // weist i den Wert 8 zu { // neuer Block beginnt int j = 7; ip = &j; // Zeiger ip zeigt jetzt auf j // weiterer Programmcode } *ip = 8;
// Blockende, hier wird j ungültig! // gefährlich! (kann zum Absturz führen)
hier wird versucht über den Aliasnamen ip an j einen Wert zuzuweisen! -> j existiert aber nicht mehr (Blockende) -> an der Speicheradresse von früher j kann sich bereits ein anderes Objekt befinden! -> sog. „Speicherüberschreiber“!
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
19
Zeiger Zeigertypen noch mehr Fehlerfallen.. Zeigerzugriff auf automatische Variablen • das vorhergehende Beispiel zeigt, daß die versehentliche Verwendung von Zeigern zu Dateninkonsistenz und dadurch zum Systemabsturz führen kann ERKENNTNIS: • möglichst nicht mit Zeigern auf lokale Objekte zeigen, deren Gültigkeitsbereich kleiner ist als der der Zeiger ¾ lieber Zeiger mit demselben Gültigkeitsbereich wie die Variable (Objekt), auf den sie zeigen
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
20
Zeiger Konstante Zeiger Konstante Zeiger auf konstante Werte (Spezialität) Variante 1: Zeiger auf konstantes Objekt (Variable) const char* cp1; // Zeiger auf konstante Zeichen cp1
Variante 2: Konstanter Zeiger auf ein Objekt (Variable) char* const cp2; // konstanter Zeiger auf Zeichen cp2
Variante 3: Konstanter Zeiger auf konstantes Objekt (Variable) const char* const cp3;
// konstanter Zeiger auf konstantes // Zeichen
TIPP: Von rechts nach links lesen!
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
21
Zeiger Zeiger und Arrays C-Arrays: Einführung • primitives Äquivalent zu C++ Vektoren • “roher” Speicherbereich • Nutzung (eingeschränkt) wie C++ Vektoren • Vektoren basieren auf C-Arrays Definition:
• Anzahl_der_Elemente muß eine Konstante sein (oder Ausdruck mit konstantem Ergebnis) int i_table[5]; // enthält 5 Elemente von [0] – [4] // Alternative gutes Design: Array leicht erweiterbar! const int n = 5; int i_table2[n]; // o.k., weil n eine Konstante ist
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
22
Zeiger Zeiger und Arrays C-Arrays “behind the scenes” F: Was macht der Compiler beim Anlegen von C-Arrays? • reserviert für alle Elemente ausreichend Speicherplatz • Anzahl der Elemente ist später nicht mehr änderbar • tendenziell: Vorsichtshalber lieber einige Elemente mehr anlegen int i_table[5];
// enthält 5 Elemente von [0] – [4]
Feldname == Zeiger (const) mit Startadresse des Feldes i_table
Startadresse == Adresse des ersten Feldelementes kann (fast) wie ein Zeiger verwendet werden
Unterschied: da der Wert des Zeigers i_table die Adresse des ersten Elementes besitzt, bitte diesen Wert nicht ändern!
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
23
Zeiger Zeiger und Arrays C-Arrays: Verwendung und Nutzung Beispiele: • Anlegen eines Feldes mit 10 char-Elementen (sog. Zeichenkette) char c_array[10];
// Zeichenkette mit 10 Elementen // Index von [0] – [9]
• Zugriff auf ein Zeichen mit Indexoperator [ ] oder Zeigerarithmetik c_array[5] = '?'; *(c_array + 5) = '?'; char c = c_array[9];
// ? als 6. Zeichen einfügen // gleichwertig: Array = roher Speicher // 10. Zeichen (Element)
Vorsicht: Index beginnt bei 0!
c_array == Feldname == Startadresse 1. Element c_array + 5 == Adresse 6. Element *(c_array + 5) == Dereferenzierung d.h. Wert des 6. Elementes
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
24
Zeiger Zeiger und Arrays Beispiel für den Zusammenhang von C-Arrays und Zeigern #include int a[4] = {0, 10, 20, 30}; int main() { int i, *pa; pa = a;
int-Array mit 4 Elementen (Index 0 .. 3)
Name des Arrays == Zeiger auf das 1. Array-Element // alternativ: pa = &a[0];
printf(“\nAdresse und Wert der Vektorelemente:\n\n“); TRICK: liefert die Anzahl der Arrayelemente
}
for(i = 0; i < (sizeof(a) / sizeof(a[0])); i++) { printf(“Adresse: %p, Wert: %2d\n“, pa + i, *(pa + i)); } Zeigerarithmetik return 0; z.B. pa + 1 zeigt auf a[1]
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
25
Zeiger Zeiger und Arrays Beispiel für den Zusammenhang von C-Arrays und Zeigern
Zeigerarithmetik: Addition von Ganzzahlen
Graphische Darstellung:
Elementnamen
Zeiger
Werte
pa
0
a[0]
pa + 1
10
a[1]
pa + 2
20
a[2]
pa + 3
30
a[3]
pa + 5
Frank Artinger
Technische Informatik und Programmieren
ungeschützter Zugriff auf nichtreservierten Speicher!!
Informatik - ANSI C 2.0 / ANSI C++
26
Zeiger Zeiger und Arrays Name und Adresse des C-Arrays • sehr enger Zusammenhang zwischen Zeigern und Arrays in C/C++ • Name des Arrays == konstanter Zeiger auf das 1. Element int a[4] = {0, 10, 20, 30}; // äquivalente Anweisungen int* pa = a; // a entspricht der Anfangsadresse des Arrays pa = &a[0]; // identisch mit Adresse des 1. Elements
Iterieren in Arrays (Zeigerarithmetik) • Ganzzahlen können zu Zeigern addiert / subtrahiert werden • Größe des Objekts auf das gezeigt wird, wird berücksichtigt! pa pa pa // pa
+ 1 + i gefährlich! – 1
-> -> ->
zeigt auf a[0] zeigt auf a[1] zeigt auf a[i]
->
zeigt auf Adresse vor a[4]
pa + 1 d.h. Zeiger springt um sizeof(int) i.d.R. 4 Byte weiter
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
27
Zeiger Zeiger und Arrays Werte und Adressen in C-Arrays Beispiele für äquivalente Ausdrücke: a == Zeiger auf 1. Array-Element!
// Adreßebene &a[i]
a + i
pa + i
// Werteebene a[i]
*(a + i)
*(pa + i)
pa[i]
• Vektorschreibweise auch bei Zeigern möglich! ( pa[i] ) Interpretation durch den Compiler: • a[i] interpretiert der Compiler als *(a + i) d.h. “Gehe von Anfangsadresse a um i Datenobjekte weiter und nehme dort den Wert!” • dasselbe gilt für pa[i]
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
28
Zeiger Zeiger und Arrays C-Arrays: Verwendung und Nutzung Beispiele: • Zeiger auf ein Feld (Array) char c = c_array[9]; char* cp; cp = &c; cp = c_array;
// 10. Zeichen (Element)
// Zeiger auf char // möglich // cp zeigt auf Feldbeginn d.h. *cp==c_array[0]
c_array == Feldname == Startadresse 1. Element == &c_array[0] ->*c_array == Dereferenzierung d.h. Wert des 1. Elementes
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
29
Zeiger Zeiger und Arrays C-Arrays: Verwendung und Nutzung Beispiele: • VORSICHT: Einschränkung bei Zeiger auf ein Feld (Array)
Ein Array ist kein Links-Wert (lvalue), d.h. der Feldname (== Startadresse) darf nicht auf der linken Seite einer Zuweisung stehen! NEGATIV-Beispiel: c_array = cp; c_array = &c;
// Fehler! c_array ist kein L-Wert (lvalue) // Fehler! c_array ist kein L-Wert (lvalue)
c_array == Feldname == Startadresse 1. Element == &c_array[0] wenn c_array verändert wird -> wir verlieren die Startadresse des Feldes -> das Feld ist nicht mehr „auffindbar“
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
30
Zeiger Zeiger und Arrays Zeiger vs. Arrays: Gegenüberstellung Zeiger und Arrays sind im Gebrauch sehr ähnlich aber nicht identisch! Zeiger: • Zeiger hat einen Speicherplatz • der Wert des Speicherplatzes ist ein Adresse Array • Array besitzt in diesem Sinne keinen Speicherplatz • Array ist ein symbolischer Name für die Adresse (== Startadresse) eines zusammenhängenden Speicherbereiches • der Feldname wird syntaktisch wie ein konstanter Zeiger behandelt
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
31
Zeiger Zeiger und Arrays C-Arrays und sizeof Problemstellung: • C-Arrays sind als “roher” Speicher keine Objekte im bisherigen Sinn! • es gibt keine Methoden, die verwendet werden könnten: for(int i = 0; i < Kosten.size(); i++) cout zeiger; // Nachfolger des eingefügten Elements z -> zeiger = hzgr; // Nachfolger des Vorgängerelements // zeigt auf neu eingefügtes Element }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
84
Zeiger Dynamische Datenstrukturen Funktionsprinzip Operation „Listenelement einfügen“ Element2 Inhalt A2 Inhalt B2 ptr_neu
Aufgetrennte Verbindung
Hilfszeiger ptr_neu
neues El. Inhalt A5 Inhalt B5 ptr_3
Element3 Inhalt A3 Inhalt B3 ptr_4
Algorithmus: (1)
neues Element erzeugen (new) und Werte zuweisen (hzgr)
(2)
Zeigervariable des Vorgängerelementes (zgr -> Zeiger) als Zeigervariable des neuen Elements (hzgr -> Zeiger) übernehmen: hzgr zeigt damit auf bisherigen Nachfolger von zgr
(3)
Zeigervariable von zgr aktualisieren (zgr -> Zeiger = hzgr -> Zeiger): zgr zeigt jetzt auf neuen Nachfolger hzgr
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
85
Zeiger Dynamische Datenstrukturen Beispielprogramm zur einfach verketteten Liste // Element z löschen void loeschen(struct telement *z) { struct telement *hzgr; hzgr = anker; while (hzgr -> zeiger != z) // Element z suchen { hzgr = hzgr -> zeiger; } hzgr -> zeiger = z -> zeiger; // Zeiger umsetzen delete z; // Element z löschen }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
86
Zeiger Dynamische Datenstrukturen Funktionsprinzip Operation „Listenelement löschen“ Element2 Inhalt A2 Inhalt B2 ptr_4
Neue Verbindung überspringt Element3
Element3 Inhalt A3 Inhalt B3 ptr_4
Hilfszeiger ptr_3
Element4 Inhalt A4 Inhalt B4 ptr_5
zu löschendes Element
Algorithmus: (1)
zu löschendes Element z suchen
(2)
hzgr zeigt auf Vorgängerelement von z
(3)
Zeigervariable des zu löschenden Elements z -> Zeiger (bisheriger Nachfolger von z) retten und an Vorgänger (hzgr -> Zeiger) übergeben
(4)
Listenelement z löschen (delete, da dynamisch erzeugt)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
87
Zeiger Dynamische Datenstrukturen Beispielprogramm zur einfach verketteten Liste // Element nach Inhalt suchen struct telement* nav(int merkmal) { struct telement *hzgr; hzgr = anker; while((hzgr -> inhaltA != merkmal) && (hzgr -> zeiger !=NULL)) hzgr = hzgr -> zeiger; return hzgr; };
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
88
Zeiger Dynamische Datenstrukturen Beispielprogramm zur einfach verketteten Liste // Inhalt der Listenelemente ausgeben void ausgabe(void) { struct telement *hzgr; hzgr = anker; do { cout inhaltB = 12; ausgabe(); anhaengen(anker,3,2); ausgabe(); einfuegen(anker,1,1); einfuegen(anker,17,18); ausgabe(); loeschen(nav(1)); ausgabe(); return 0; }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
90
Zeiger Dynamische Datenstrukturen Beispielprogramm zur einfach verketteten Liste Bildschirmausgabe:
Demo VC++ .NET:\K9_Zeiger\Liste\Liste.vcproj
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
91
Zeiger Dynamische Datenstrukturen Doppelt verkettete Listen Erweiterung zur einfachen Verkettung: • jedes Listenelement enthält 2 Zeiger (Vorgänger und Nachfolger) Vorteil gegenüber einfacher Verkettung: • Navigation durch die Liste in beide Richtungen möglich (da jedes Element Vorgänger/Nachfolger kennt)
Funktionsprinzip doppelt verketteter Listen
ANKER ptr_1
Element1 Inhalt A1 Inhalt B1 ptr_2 NULL
Element2 Inhalt A2 Inhalt B2 ptr_3 ptr_1
Element3 Inhalt A3 Inhalt B3 ptr_4 ptr_2
Element4 Inhalt A4 Inhalt B4 NULL ptr_3
nextptr prevptr
Frank Artinger
Doppelt verkettete Liste mit 4 Elementen (+ Anker)
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
92
Zeiger Dynamische Datenstrukturen Funktionsprinzip doppelt verketteter Listen • mind. 2 Zeigerfelder (nextptr, prevptr) im Listenelement • Liste besitzt wieder einen „Anker“ (Startposition) • 1. Listenelement: prevptr == NULL • letztes Listenelement: nextptr == NULL Beispiel:
Struktur eines Listenelementes (doppelt verkettet)
// Listenelement als Struktur struct telement { int inhaltA; // Infoteil int inhaltB; // Infoteil struct telement* nextptr; // Zeiger auf Nachfolger struct telement* prevptr; // Zeiger auf Vorgänger };
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
93
Zeiger Dynamische Datenstrukturen Beispiel: Funktion einfuegen für doppelt verkettete Listen // neues Element nach Element z einfügen void einfuegen(struct telement *z, int a, int b ) { struct telement *hzgr, *h1zgr; hzgr = new telement; // neues Element dynamisch erzeugen hzgr -> inhaltA = a; hzgr -> inhaltB = b; // Werte zuweisen h1zgr = z -> nextptr; // Zeiger auf Nachfolger hzgr -> nextptr = z -> nextptr; // Nachfolger in neues Element // übernehmen z -> nextptr = hzgr; // neues Element als Nachfolger eintragen hzgr -> prevptr = z; // Vorgänger im neuen Element eintragen h1zgr -> prevptr = hzgr; // neues Element im Nachfolger eintragen }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
94
Zeiger Dynamische Datenstrukturen Datenringe Erweiterung zur einfachen/doppelten Verkettung: • Zeigervariable des letzten Listenelements enthält nicht NULL sondern zeigt auf das 1. Listenelement (daher: geschlossener „Ring“) Vorteil gegenüber einfacher/doppelter Verkettung: • Datenring kann mit Schleifen (for, while, do-while durchlaufen werden)
Funktionsprinzip von Datenringen
ANKER ptr_1
Element1 Inhalt A1 Inhalt B1 ptr_2
Element2 Inhalt A2 Inhalt B2 ptr_3
Element3 Inhalt A3 Inhalt B3 ptr_4
Element4 Inhalt A4 Inhalt B4 ptr_1
Datenring (einfach verkettet) mit 4 Elementen (+ Anker)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
95
Zeiger Dynamische Datenstrukturen Beispiel für einen (einfach verketteten) Datenring #include #include typedef struct telement { char zeichen; struct telement *zeiger; };
// new und delete
Listenelement mit 1 Zeigervariablen (einfache Verkettung)
// Anker erstellen telement *anker;
Demo VC++ .NET:\K9_Zeiger\Ring\Ring.vcproj
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
96
Zeiger Dynamische Datenstrukturen Beispiel für einen (einfach verketteten) Datenring // Operationen // neues Element nach Element z einfügen void einfuegen(struct telement *z, char zei) { telement *hzgr; hzgr = new telement; // neues Element dynamisch erzeugen hzgr -> zeichen = zei; // Wert zuweisen hzgr -> zeiger = z -> zeiger; // Nachfolger des neuen Elements z -> zeiger = hzgr; // Nachfolger des Vorgängerelements // zeigt auf neu eingefügtes Element }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
97
Zeiger Dynamische Datenstrukturen Beispiel für einen (einfach verketteten) Datenring // Datenring ausgeben (Ring mehrfach durchlaufen) void ausgabe(void) { int i; telement *hzgr; hzgr = anker; for (i = 1; i < 100; i++) { cout zeichen; hzgr = hzgr -> zeiger; } cout zeiger =anker; cout > z; anker -> zeichen = z; for (i = 1; i < 9; i++) { DEMO: 9 Zeichen eingeben cin >> z; einfuegen(anker,z); }; ausgabe(); fflush(stdin); getchar(); Demo VC++ .NET:\K9_Zeiger\Ring\Ring.vcproj return 0; }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
99
Zeiger Dynamische Datenstrukturen Binäre Bäume Motivation: • Zugriff auf Informationen: Suche in verketteten Listen immer sequentiell (worst case: jedes Element vergleichen -> / Laufzeit) • wesentlich schnelleren Zugriff ermöglicht ein binärer Baum (Elemente sind nicht linear geordnet wie bei verketteten Listen) • vereinigt die Vorteile dynamischer Datenstrukturen mit denen sortierter Vektoren, auf die das binäre Suchverfahren angewendet werden kann Definition & Eigenschaften: • binärer Baum besteht aus Knoten (nodes) -> enthalten die zu speichernde Information • jeder Knoten besitzt höchstens 2 direkte Nachfolger • genau 1 Knoten ohne Vorgänger -> Wurzel (root) • jeder Knoten ≠ Wurzel hat die Wurzel als Vorgänger
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
100
Zeiger Dynamische Datenstrukturen Ein binärer Baum Element1
Element2
Element4
Element8
Element5
Element9
Teilbaum Element3
Element6
Element10
Element7
Element11
Element12
Nachfolgeknoten: Element10 ist Nachfolger von Element6 Blätter: Knoten ohne Nachfolgeknoten (z.B. Element5 und > Element8
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
101
Zeiger Dynamische Datenstrukturen Darstellung von Knoten • kann als verkettete Folge von Knoten implementiert werden (vgl. Listenelement) • Knoten enthält die zu speichernde Information + 2 Zeigervariablen (linker und rechter Nachfolger vgl. nächste Folie) • AUSNAHME: Knoten am Baumende (Blätter) enthalten 2 NULL-Zeiger
Binärer Suchbaum • sind die Daten im Baum nach bestimmten Regeln abgelegt, ist eine Suche sehr effizient (Aufsteigen reduziert Ergebnismenge exponentiell) • Sortierung (Ordnung) eines binären Suchbaums: (1) 1. Element in Wurzel (root) (2) jedes weitere Element mit 1. Element vergleichen: Fall „kleiner“: Vergleiche fortführen im linken Teilbaum, Fall „größer“: Vergleiche fortführen im rechten Teilbaum (so lange, bis es keinen Nachfolger mehr gibt) (3) neuen Knoten als Nachfolger erstellen (== Blatt) Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
102
Zeiger Dynamische Datenstrukturen Binärer Baum mit 2 Ebenen (+ Anker) WURZEL ANKER ptr_root
Element2 Inhalt 2 ptr_4 ptr_5
Element4 Inhalt 4 NULL NULL
Frank Artinger
Element5 Inhalt 5 NULL NULL
Technische Informatik und Programmieren
Element1 Inhalt 1 ptr_2 ptr_3
EBENE 1
EBENE 2
Element3 Inhalt 3 ptr_6 ptr_7
Element6 Inhalt 6 NULL NULL
Element7 Inhalt 7 NULL NULL
Informatik - ANSI C 2.0 / ANSI C++
103
Zeiger Dynamische Datenstrukturen Beispiel zu binären Bäumen Ziel des Programms: • Textzeilen von der Standardeingabe (Tastatur) einlesen • diese in einen binären Baum einsortieren • lexikographisch sortiert ausgeben Funktionen: getline():
Textzeile einlesen, Speicherplatz dynamisch reservieren und Zeiger auf eingelesene Zeile zurückgeben
insert():
Einsortieren der Textzeilen in binären Baum, erzeugt für jede Zeile einen neuen Knoten und liefert Zeiger auf den Knoten zurück
print_tree(): Inhalt des Baumes auf Bildschirm ausgeben
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
104
Zeiger Dynamische Datenstrukturen Beispiel für einen binären Suchbaum
Demo VC++ .NET:\K9_Zeiger\Sort1\Sort1.vcproj
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
105
Zeiger Arrays von Zeigern (Zeigervektoren) Zeigervektoren Motivation: • Zeiger sind oft die einzige Möglichkeit für den einfachen/effizienten Umgang mit großen Datenmengen (z.B. Sortieren von Strings: nicht die Strings selbst sondern Zeiger auf Strings werden sortiert!) • wird eine große Anzahl von Zeigern benötigt, kann ein Vektor (Array) von Zeigern verwendet werden -> Vektor von Zeigern Beispiele: // Zeigervektoren long* zahlenptr[20]; // // char* strptr[500]; // //
enthält long-Zeiger Elemente: zahlenptr[0] .. zahlenptr[19] Vektor mit 500 char-Zeigern Elemente: strptr[0] .. strptr[499]
Hinweis: Die Zeiger im Vektor sind uninitialisiert!
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
106
Zeiger Arrays von Zeigern (Zeigervektoren) Initialisierung von Zeigervektoren char-Zeigervektor: char* strptr[500];
// Vektor mit 500 char-Zeigern // Elemente: strptr[0] .. strptr[499]
// Initialisierung mit String-Konstanten strptr[0] = “Hallo“; strptr[1] = “Guten Tag“; in C/C++: String-Konstante ist ein konstanter Zeiger auf das 1. Zeichen im String!
Alternative: • Angabe einer Initialisierungsliste von String-Konstanten (s. Beispiel)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
107
Zeiger Arrays von Zeigern (Zeigervektoren) Beispiel zur Initialisierung von Zeigervektoren /* Error_ex.c --> Die Funktion error_exit() erhaelt * eine Fehlernummer als Argument und * beendet das Programm mit einer * entsprechenden Fehlermeldung. #include #include
* * * */
Speicherklasse static void error_exit(int error_nr) -> nur beim 1. Aufruf initialisieren! { static char *error_msg[] = { Initialisierungsliste "Ungueltige Fehlernummer.\n" , (String-Konstante) "Fehler 1: Zu viele Daten.\n" , "Fehler 2: Nicht genuegend Speicher.\n" , "Fehler 3: Keine Daten vorhanden.\n" insgesamt }; 4 char-Zeiger if(error_nr < 1 || error_nr > 3) error_nr = 0; fputs(error_msg[error_nr], stderr); exit(error_nr); }
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
108
Zeiger Zeiger auf Zeiger Zeiger auf Zeiger Motivation: • Zeigervariablen sind selbst Datenobjekte, auf die wiederum über einen Zeiger zugegriffen werden kann • Anwendung: Zeigervektoren oder Übergabe von Arrays als Parameter an Funktionen Beispiel:
Vektor von Zeigern (Zeigervektor)
char* tag[] = { “MONTAG“, “DIENSTAG“, “MITTWOCH“, “DONNERSTAG“, “FREITAG“, “SAMSTAG“, “SONNTAG“}; // tag[i] zeigt auf i-ten String, i darf Werte von 0 .. 6 annehmen *tag[0] // Buchstabe M aus MONTAG *(tag[1] + 2) // Buchstabe E aus DIENSTAG // tag ist konstanter Zeiger auf das 1. Vektorelement (also Zeiger auf char-Zeiger)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
109
Zeiger Zeiger auf Zeiger Zeiger auf Zeiger Beispiel:
Vektor von Zeigern (Zeigervektor)
char* tag[] = { “MONTAG“, “DIENSTAG“, “MITTWOCH“, “DONNERSTAG“, “FREITAG“, “SAMSTAG“, “SONNTAG“}; // äquivalente Ausdrücke: *tag *(tag + i) **(tag + i) *(*(tag+i)+j)
Frank Artinger
tag[0] tag[i] *tag[i] *(tag[i]+j)
Technische Informatik und Programmieren
// // // //
0-ter i-ter 0-tes j-tes
Zeiger Zeiger Zeichen im i-ten String Zeichen im i-ten String
Informatik - ANSI C 2.0 / ANSI C++
110
Zeiger Zeiger auf Zeiger Beispiel zu Zeiger auf Zeiger Ziel: • mehrere Wörter unterschiedlicher Länge speichern Lösungsansatz: • Array mit char-Zeigern • jeder char-Zeiger zeigt auf ein char-Array, das ein Wort enthält Vorteile: • die char-Arrays müßen nur so lange sein, wie für das Wort notwendig • werden alle Arrays dynamisch angelegt, kann die Datenstruktur beliebig erweitert werden (Voraussetzung: genügend Hauptspeicher verfügbar)
Frank Artinger
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
111
Zeiger Zeiger auf Zeiger Funktionsprinzip des Zeigervektors aus char-Arrays char** aptr
Zeiger-Array wptr_1 wptr_2 wptr_3 wptr_4 wptr_5
A|N|K|A|R|A S|O|F|I|A B|E|R|L|I|N
Ausdruck *aptr *wptr_1 *(*aptr) *((*aptr)+1) *((*aptr)+2) *(*(aptr+1)) *(*(aptr+3)) *(*(aptr+3)+1)
Frank Artinger
Technische Informatik und Programmieren
T|O|K|I|O
R|O|M
Wert wptr_1 ‘A‘ ‘A‘ ‘N‘ ‘K‘ ‘T‘ ‘R‘ ‘O‘
Informatik - ANSI C 2.0 / ANSI C++
112
Zeiger Zeiger auf Zeiger Code-Beispiel zu Zeiger auf Zeiger #include #include using namespace std; int main (void) { char wptr1[] = char wptr2[] = char wptr3[] = char wptr4[] = char wptr5[] =
"ANKARA" ; "TOKIO" ; "SOFIA" ; "ROM" ; "BONN" ;
char **aptr; aptr = new char*[5]; *aptr = wptr1; *(aptr+1) = wptr2; *(aptr+2) = wptr3; *(aptr+3) = wptr4; *(aptr+4) = wptr5;
Frank Artinger
// new, delete
/* Ablegen der Zeiger. */
Demo VC++ .NET:\K9_Zeiger\Scrable\Scrable.vcproj
Technische Informatik und Programmieren
Informatik - ANSI C 2.0 / ANSI C++
113
Zeiger Zeiger auf Zeiger Code-Beispiel zu Zeiger auf Zeiger cout