Informatik_MTB241_ARTINGER

February 14, 2018 | Author: hornalexander90 | Category: Computer Science, C++, C (Programming Language), Computer Memory, Computer Program
Share Embed Donate


Short Description

Download Informatik_MTB241_ARTINGER...

Description

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
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF