Harald Nahrstedt
C++ fUr Ingenieure
Grundlagen Maschinenbau
Lehrsystem Technische Mechanik mit lehrbuch, Aufgabensa...
315 downloads
2929 Views
105MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Harald Nahrstedt
C++ fUr Ingenieure
Grundlagen Maschinenbau
Lehrsystem Technische Mechanik mit lehrbuch, Aufgabensammlung, losungsbuch sowie Formeln und Tabellen von A. Boge und W. Sch lemmer Handbuch Maschinenbau herausgegeben von A. Sage Elektrotechnik fflr Maschinenbauer von R. Busch Technische Berichte von H. Hering und L. Hering
Englisch fUr Maschinenbauer von A. Jayendran Excel+VBA fUr Maschinenbauer von H. Nahr stedt
lehrwerk Roloff/Matek Maschinenelemente von H. Wittel, O. Muhs, D. Jannasch und J. VoBiek Praktische Regelungstechnik von W. Schneide r Werkstoffkunde
von W. WeiBbach
www.viewegteubner.de
----.
Harald Nahrstedt
C++ fur
Ingenieure Effizient Programmieren erlernen Mit 157 Abbildungen und 70 Tabelien
STU DIUM
VIEWEG+ TEUBNER
Bibliogralische Information der Deutschen Nat ionalbibhothek Die Deutsche Nationalbibliothek verzeichnet diese Publikancn in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet fiber abnrtbar.
1. Aullage 2009 Aile Rechte vorbehalten C Vieweg+Teubner I GWV Fachverlage GmbH, Wiesbaden 2009 Lektorat: Thomas Zipsner I rmke Zander Vieweg+Teubner ist Teil der Fachvenagsgruppe Springer Science-Business Media. www.viewegteubner.de Das Werk eeschuesuch aller seiner Iaila lst urheberrechtlich geschctzt. jede Verwer tung auRerhalb der eogen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlags unzuliissig und stralbar. Das gill insbesondere tur Vervielfaltigungen, Obersetzungen, Mikroverfil mungen und die Einspeicherung und Verarbeitung in etekrrcnec nen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt euch chna besondere Kennzeichnung nicht zu der Annahme, dass sclcha Namen im Sinna der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betracbten waren und daher von jedermann benutzt werden ournen. Umschlaggestaltung: Kunkell opka Medienentwicklung, Heidelberg Technische Redaknon: Stefan Kreickenbaum, Wiesbaden Druck und buchbinderische verarbeirung: Krips b.v., Meppel Gedruckt auf siiurefreiem und chlorfrei gebleichtem Papier. Printed in the Netherlands ISBN 978-3-8348-0464-8
v
Vorwort lVaru", dieses Such Die erfofgrciche Hcrausgabc cines Buches fiber Excel und VBA mit dcr Kopp lung von Lchrsroff und Anwcndungs beispiclen aus dcm lngcnicurbcreich und "ide crfrculiche Zuschri llcn waren d..' f MOlor zur IiM d lung dieses lJuc hes. Auc h h i..... soli,," sowohl d cm Ing cn ic urst ud..'Tll...n als auc h dcm praktL.ic...~nden Ingc nseur Wq!c und MOglichkcilC'D der Entwicklu ng eigener Progra mm e ge.. eigt werden. Dabc i gche ich bewussl iiber einfacbe Slrukturen mcju hinaus. Ich halle einfache Programme fUr cine solide na si" eigencr Prop"am menl w id .lung und cinfache Anwendungsbeispie le Iur cine J?Ule Gnmdlage fU r cig ..m e Tests , Ich habe vcrsuch t, auf die elegaraen Tricks in C+-+ LU verzictnen, die sich bei nae nsiver Nutzung und d""01 weneren Stud iurn "on selbst einstejlen. Auf meiner Website werde ich im weitercn Vcrlauf ergsnlmd..- I lilfen und Themen emstenen
Ili/fen
Zur Ers tclhmg do...... Programme babe ich ein EntwickhmgswerkJ'ctlg von Bloodshed Software (hn p·lIwww .bloodshe d.pct)benutzt. Esisl eine Free Software Foundation und ihre Entwicklungsumgebung enthill &'11 GNU Compiler. dL'I" zur freicn Nutzung auch in viclen andcren Emwicklungsumgcbc ngen zu li nden ist . w egen der Scbnctllebigkeit in diesem Bereich verweise ich an dicser Stdle ebenfalls auf meine Website (sjche uetem. in der ich weirere Hinweise einsrellen werdc . Dort lindo.'t dcr Lese r aoch dL'1I Quellte\t &'1" Programme aus diescm Bueh.
Zum ."ul nau Die aufgcfhhrtcn Bcr eiche ems prcchcn der chronologischen Entwicklung de... Progra rnmier ung. Anhand emfachcr Modcllc versuchc ich dL'1I LeS'-'I" flrr C ++;[Ubegcistem, da s durch seine ein fache GestahWlg und kom ple xcn Ml'lg lichleih:Tl bcsticht. Die Kapitel der mod ularen und prozeduralcn Progra mmi crung babe ich kurz gcfusst, III Gunsten mreressan rcr Anwendengsbeispiele. Zum Thema objek toriemiene Programmierung habc ich d;..flrr ctwas mchr ein fhhrendcn Text verwcndct . Ieh hoffc. dass der Leser ausre ichcnd und meuvicn dcm Theme folgcn kann. 1m lctztcn Kapitcl zur gcnc rischcn Prograrnmicrung gcbc ich cincn kurzcn liinblick in zuknnffigc Bctrachnm gen und Anwcndungen. Die eiwclnen Kapitcl bcginnen mil emcm rheorcrischcn Teil zum Thema C ++ und cndcn m etst mit cmcm Anwc ndungs bcispicl. Die A nwL"Tl dunl,~he ispiele greifc n das Them a dann auf und'odcr dicncn als Vorlage zur Umsctz ung des Gelemten. J)l1nksagli nK
Ieh bcdankc mich bci all dcncn im Hause Vicwcg e'Teubncr, die stcts irn llimcrgrund wirkcnd. zum Gc ling-en dicscs Huchcs bcigcuagcn habcn. Ein bc, ondere r Dank gilt meinem Leklor T homas Z ipsner, der mir in lr eulldschlllilichcr Verbunden heit geduldig mil vielen wichligen lind ri\'hligen Kalschlagen half. den Itir den Leser hesten Weg ein/uhalten. Seine Erfahrllngen ai, Chellel tor des Lo:klorals Teehnik waren Hlr rnich sehr hilli"eich. [)lll1 ken mochte ich auBerdem ltllen Kolleginnen und Kollegcn der I' imla seneos Gmhll , Kl'll n. die llir mich cine hcrulliehe !l eima t hcdeutcl. Es isl immer wiedcr cine Frcude in einem Tcam engltgk'l1cr lngenicure an dcr Losllng technisc hcr Problemc lei lzuhabcll_Bci allcm lo rtsehri" lichen Slrehcn slchl hk'f der nL'lle und menso: hliehc Umgang an erstl'f Stelle und iSI damit die Ba, i, des Erlo lgs. An den Leser
Dieses Uuch soll ilueh Lum Dialog zwischen Aulor Wld Leser alilTordern . Daher linden Sic sowohl auf der lIomepage des Vcrla~"S www vjcwegleu hncr,de als auch au f der lI omepage des Aulon www baraldnahrslclll.de c in f orum Hir erglin/ende Programme. Anregt Ulgen. Kezcnsioncn und Kommcnlarc. Mohnesce, f ebruar 2009
lIarald Nabrstcdl
VI
Inhaltsverzeichnis Grun d lag{"n d er Progr ammierung 1.1 Emwickl ung 1.2 Grundstrukturen 1.3 Datentypen, Variable und Konsrame I A Operatoeen und Ausdracke 1.5 Anweisungen 1.6 Fe lder 1.7 Zeiger auf Datentypen 1.8 Zeic be nkeuen
1
J
9 19 31 48 58 67 77
2
Prozed urate Progra mmieru ng 2.1 Der \ Ve-g zu Losung 2.2 Funktionen 2.3 Parameter 2.4 Deklarationen und Gult igkeusbereiche 2.5 Zeiger auf Funktionen 2.6 Callback-Funktion en
87 87 93 106 117 132 141
3
:\Iod ulare Pr earammfcrung 3. 1 :\..todule 3.2 Srrukturen 3.3 Verbu nde 3.4 Zeiger au f Strukturen 3.5 Verken ete Listen 3.6 Dynamische Speicherung
149 149 158 168 178 189 20 1
4 O bjekterten ne r te Pro grammicrung 4 . 1 Der Weg zum Obj ekt 4.2 Objekte und Klassen 4.3 Spez ielle Obj ekte und Met hoden 4.4 Klassenhierarchie lind Vererbung 4 .5 Virtuelle Funktio nen 4.6 Streams 4.7 Ein- und Ausgabe von Strings 4.H Streams und Dareien
212 2 12 220 238 257 272 288 30 1 3 10
5 Gelll'r ischc Pro grammierung 5. 1 Das Grundprinzip
322 322 324 328
5.2 5.3
Punktions-Templates Klassen-Templates
Literaturverz clchni s
.. 331
Sa chwortverzeich nis C++ Thcmcn
.. 333
Sachwe rtverzcichnls Inform ali kffec:hnisch c Th em cn
336
I Gr undlage n der Pro grammierung 1.1 Ent wic k lung Die Darstellun g in Bild I-I zeig t die zeithc he Enrwicklung von C++.
,-
Simula. EitTcI I
C
---'I
....,
,-
l
e mit Klassen
J L "'f , ---'I
-v
'w,
AT&T I--' AT&T C++ ReI. 2 h C++ ReI. 3
Sma ltalk.
,m
C++
J h
,-
J l
,-
'w,
I--' Dr.ofl ---'I ISO 14882 An si h Kcmmitcc Proposal Standa rd
....,
"'f" Algol. Ada Erweiterungcn Bild I -I Die En tstebungsgcschicbte \"011 C++
C++ basien auf C, des in der Zeit urn 1970 in den Forschungslaboralorien von Bell Telephone in den USA entstand . Die Vater von C sind Kernighan und Ritchie, die auch das Standardwerk nber C ..The C Programming Language" verfassten. Gnmdlage war d ie Speache Be Pl, aus der sich erst B und dann C entwickelte. Ehemals fllr Systema ufgabe n geschr ieben. erlengre sic mil dem Betriebssystem UNIX cine gro ue Verbreitung . Bjarne Stroustrup (eben falls Bell Labs) erweit erte die Sprache urn objektori entierte Struktu ren und nannte sie C++. Tools u nd Obj ektc
Gild 1-2 zeigt anschaulich. welche werkzeoge und Daieien am Entsrebungsprozess eines auf der Basis von C++ entwickelten Programms beteiligt sind. Der grau hinterlegte Bereich stelh dabei em Mini mum dar. ru r die Erstelhmg der im Huch dargestellten Progr amme babe ich das Entwicklungs-Werkzeug .,DEV C++" [Blo odshed] benutzr. Es enthalt sowo hl einen Texteditor als auch einen Compiler (GN U) lind Linker. Da sich die Werkzeuge in einem standigen w eu erer uwicktcn gsprozess befinden. ge he ich nicht welter auf' sie ein und verwelse an d ieser Stelle eur meine Web site: www .harald- na hrstcdt. d{' Auf d ieser werde ich d ie jeweiligen Hinweise und Miueilungen der Hersteller und Leser ein-
srenen.
Nachfolgend in Bild 1· 2 und Tabe jte I-I sind die Werkzeuge und Dateien noch einmal beschrieben. Kursiv gesetzte Angaben . in der nachfolgenden Tabelle ebenso wie irn ganzen
2
I Grundlagen der Programrmerung
Buch, sind Platzhalter und besc hreiben di e eige nnic hen Angaben. In eckigen Klammem gesetzte Obj ekte kcnnen auch entfallen. Editor
n
Proj ckJ 1 Qucllcode-
Header-
Dillc i(clJ )
Dillc i(c u)
-'=j~
I
JC
J
I
Other Moduls O bjekl-
r
I II t- '--==J
Ileader-
D int main (II II Deklarationen d ouble Se i t e_a, Seite_b , Se i t e _ c; II Ei ngabe cou t « . Se i t e a ; c i n » Se i t e _ a; cou t « . Seite b ; c i n » Seite_b ;
•• ••
// Auswertung Se i t e_c ; s q r t( Se i t e _ a * Seite_a + Seite_b * Seite_b) ; 1/ Au sgabe cou t « .Seite c ; • « Se ite_c; s y stem (. Pau se~); re tu r n 0;
Komm cutarc Kommentare dien en in ellen Programmen zur besseren Lesbarke u des Quellcod es und daher solhe man an ihnen nicht sparen. In C++ Programm en wer den Kommenrare mit den Ze iche nIolgen / - und -, geklarnmen . Dabei kann der Texr uber mehrere Zeilen gehen. Einzeihger Komm entar kann mit dem Dop pel lf beginnen. Die Kommen tare in den Prograrnrnoelspielen dieses Buc hes habe ich auf des wesenth che red uziert, damit mehr Platz rur Erklarungen b leibt.
10
1 Grundlagen der Programrmerung
Zeic hc n Das Grundobj ekl eine r Sprache s ind die verw endeten Zeichen. Hier: • • • •
Klein buchstaben la ob. c•. .. . z] GroBbuchstaben {A . B. C•...• Z} Ziffe m {O. I .2•... . 9 } Sonde rzeichen t:=:. -, -•••/. [. 1. •. .. • Leerr eichen }
Bezei ch ncr
ruT
Be zeic tmer s ind Namm Obj ektc der Ptogra mmie rsprach e, wi e Variablenoamen . Standardfunktionen . Anwe isungsobj ekte u . a. Bezeichner besteben 8US e iner Folge von Buchs taben und Ziffem, so wie dem Sonderzeichen Tiefstrich: Ll . Ein Bezeichner darf auBerdem nicht mit ein er ZilTer beg innen . S ign ifikanl sind n UT die ers ten 3 1 Ze ichen cines Bezeichners . Bezeichner, die mit zwe i Ll Ze ichen beg innen. sind dem Berriebssystem vorbe halten. Sc hlasselwoner d arfen nicht als Bezei chner verwendet we rden . Sc hltiss{'h \'orte r C ++ verwal tet in Bibliotbeken S tanda rd funklionen., deren Na men a ls SchHissel worte r bezeichnet werden. Ebenso bestehen An w eis ungen a us Sc hlnsselworte m . auc h O pera toren und ande re Srrukturbezeichnu ngen.
Separa tore n Separatoren dtenen der Trennu ng von O bjekt en in ei nem C++ Progn a mm. • • •
Ein Se mik olon (;) trennt Anweisu ngen Ein Ko mm a (,) trennt O bjekt e Eine Lee rstelle ( ) rrennt Wo rte
x a mensr a ume Die im ersten Programm verw e nde te An wei sung
~ name5~~.~c~.,--s~t~d~,
---.J
besagt. dass be i a llen Zugrilfe n au f C ++ S randa rd bib hotheke n der C ++ Standard-Namensra um ve rwende t we rde n so li. Diese Anweisung wird , we nn s je nic ht vo rgege ben ist, als de fa ultAnweisung a utomatisc h ve rn Co mpiler ge setz t. Es kann nic ht aus gesc hlossen werden. dass zw ei unabh angig vo nein ander entsra ndene Quellcodes d ie gleichen Nam en verwende n. Dam wu rde in C++ de r Ne me nsreum ein gemhn . So mit konnen Deklararionen und Definit ionen unter einem Nam ensraum zusa mmenge fasst lind gegen andere Nam en abgegrenzt werden. Funkti ensaufbau
Ein C++ Programm besitzt e ine und nur ein e Fun ktion. die mit .main'' beze icbnet wi rd . Diese Funktion wird beim A ufruf des kompilierten Progzram ms zu erst gestartet. Eine Funknon besuzt ein en Datemyp . der vc m Ruck gabewert (return] abhangt . Strukturbloc ke werden d urch " I I' (gesc hwe ifte Klammem) gerahmt. Jed e Funktion besnzt den nachfolg end da rge stellten Aufb au:
1.2 Gru ndstr ukturen
11
Syntax : Muster einer Funktion Dat en typ Name ! Param e t e r[. Parameter_ I ) {
Variablen Deklara t ion en und I ni ti a li s i e r un g en ; Anll'ei s un g en ; [ ret u r n Daten;.:e r tJ;
Token A ls Token wird die kteinste vom Compiler erk ennbare syn takusc he Einheit eines C++ Programms versta nden. Token werden durch Sepera rcren ge tren m. Dies erklart, warum Bezeichner und Scblnsselwoner keine Leerzeichen enthalten durfen. Oil tritt der Fall ein, dass die Reihe nfolge der To ken vom Compi ler anders als gewoth verstenden wird. Ungar b che Xo ra tlon Bei der sog enannten ungari schen Notation hande h es sich urn Namen skonvenuonen. die auf den Ungam Charles Sinwl~\·j zurackge ben. Die Idee ist, dass sich aus de n Namen emer ProgrammgroBe so fon die wic htigsten Eigenscbaften herlei ten lassen. Ob diese Notation die Les bar keit von Progra mmen verbe ssert. ist umstritten. Nach d ieser Notation bestehen Name n aus drei mogfic ben Teilen
I [ Basistyp ] [ Pd.fi x ] I dent ifikato r
Basjstypan gabe und Prafix werde n meist d urch ein bis zwe i Zeichen geb ildet, konnen jedoc h auch emfatlen. Der ldennfikator, der eigemhche Name, sothe den verwendungszweck beschreibe n und ist da her meist lnnger. 'h bl'lI" 1-3 Beispielc '0'00 Basistypen
Basistyp
Bedeutung
"
allge meiner numerischer Wen (int, o ft auch UINT ode r LONG).
u
numenscber wen ohne Vorzeichen (VINT). Diese werde n in der Prax is j edoch on auch mit " n" bezeichnet.
I
LO NG, wird on auch mit .n'' bezeic hnet.
dw
DWOR D
b
BOOl
f
110at
f
steht in Emzelfallen auc h fur ein Flag (boolscher Wen). Flags sollte n besser mit
.b' gekennzeichnet werden.
,h
einze lnes Zeichen (char),
12
1 Grundlagen der Programrmerung
by
einzelnes Byte (BYTE).
5Z
o-terminien er String als Charakter-Array (char [J).
s
String bei Verwendung einer Stn ngklasse (eStr ing oder AnsiString).
T llbelle 1--1
8~i spiel e
fiir Prlifixe
Prlifix
Bedeutung
a
Array
c
Zahler (Counter)
d
Differenz zwischen LW ei Variablen desselben Typs
c
Element eines Arra ys
h
Handle
;
Index elnes Arrayelementes
p
Zeige r (Pointer). Man findet auch noch die 16-8 il Relikte ..lp'' und ••np" fUr long Pointer und Near Pointer.
r
Referenz
s
globale Variable
ffi_
Mernbervariabte
In
Funktion
pi
Funkncn. d ie als Parameter nbergeben wird (Callback-Funktion). Wird on auch mit .pth" bezeichnet.
Ein ldemifikator beginnt mit einem Grobbuchstahen. Setzt sich ein Identilikator aus rnehreren ..Worten" zusa mmen. so beginnt jedes .,Wort" mil einem Grolibuchsraben. Aile anderen Buchstaben werden klein geschrieben. Beispiele flir Narnen:
N=e
p s zVa l ue a fTernperatur
nM,x
l c Index bErg-ebni s ichEr s tes
Besch reibung Zeiger au f St ring, mit dem Nu ll ze i ch en termi nier t Ar r ay mi t Tempera t u rwerten v om Date ntyp f l oa t numerischer Hax imalwe rt ZAhler tiber I ndi ze s v om Datentyp l ong Ergebniswert einer bool sche n Funktion Index des ers ten Zeichens eines St r i ngs
1.2 Grundstrukturen
13
A n\wnd ungs bcis p icl: v ektnren - Kr afl e im Raum Die Kraft hat den Charakte r eines hnienfluchtigen vekrcrs und isr somit dur ch GrOBe. Wirkrichtung und AngrilTspunkt eindeuug bestimmt. Greifen mehrere Krlfk an einem Punkt an. dan n lassen sie sich mine ls der so genannten Vektoradditio n zu e iner Kraft. man spricht von einer Resultierenden. zusamrnenfassen. Urn die Lage und Richtung der Krane besumrnen zu konnen , bedie nen wir uns eines Koord ina-
teesystems {x, y. z) mil seinem Urs prung u.
y F
"
x
, Hild 1-6 Koordinatensystem
ZW"
Betrachtung riumlicher Kniftc
Die Anordnung der Krane im Raum kann beliebig sein. FUr den Fall. dass die Wirkl inie einer Kraft nicht durch den Urspn mg geht. kommen wir zur zweuen wichnge n GrOBe in der Stank. dem Moment. Ein Moment ist das Produ kt aus Kraft x Hebelarm: M =F 'a
( l.l )
Dabei ist der Hebelarm der karzeste Absland zw ischen Wirk linie der Kra ft und Ursprung u. Er Iiegt aube rdem senkrecht zur Wirklin ie. Ein Moment ist die Ursache einer Drehbewegung. Momente lassen sich genau wie Kraf'te zusamme nfassen. y
F
"
u
, Hild 1-' Kran Eund I tcbclerm a
Sind nun n Krane Fj 0= 1• ..n) gegeben. so ergibt sich die resuhierende Kraft aus der Summe
der vektoren
"
Fr =LF. i- I
( 1.2)
14
1 Grundlagen der Programrmerung
und das resuluerende Moment aus n
Mu
n
LM 2>i-F;.
""
( 1.3)
ui ""
i-I
i=1
F
Fyi
/-:"'~~l/;:ri
•
,
'J-+---:, ax;
lJild 1-8 Kompo.....'111endal'!ildlung
Genausc gilt auch filr die Projektio nen der Kra fte und Mom ente auf d ie Ach sen des Koo rdinatensystems n
F.. = 2: ~k . k E{,.pI
( 1.4)
j" l ,
n
LM
( 1.5 )
uik "" 2: ( aip ' fi q - a iq ' fi p )
M uk ""
j" l
i- I
Dari n isl k c {x. y. z } und fllr p und q als ab ha ngige Ind izes g ilt: k
P
q
x
y
z
y
,
,
x
x
y
Die betragsma uigen GroBen von resunierend er Kra ft und resultier endem Moment ergeben sich den berechneten Kcmpo nente n nach dem Satz der Pythagoras
i nt main ()
c ha r we i t e r ;
double x . Y. z ; double Fx . Fy . Fz ;
double Sux , Suy , Su z; double SuFx. SUFy . SuFz; double S uMx. SuMy, SuHz ; double Fr . Hr , p ; double Hx . My. Hz; doubl e ax, ay. az ; do (
cou t « · we i t e r ( E: Ende / N=Ne u /W=We i t e r / A=Au s g a bel "; ci n » weiter ; s wi tc h (wei t e rl I c a s e ' E' : 1* Eo d e * /
break ;
c ase ' N': ; * Ne ua n f a ng Su x 0;
*j
Su y :: 0 ; su z ::: 0 ,
susx :: 0, Su Fy '" 0, Su F z '" 0, Su Mx :: 0; SuMy :: 0; SuMz ::: 0; case ' W' : 1* wei t e r
*;
II Ei ng a b e n cou t « "Ang r i f f s p unk t c i n » X; cou t « "Anqr i f f s p unk t ci n » y ; cou t « "Angr i f f s pu nk t ci n » z;
cou t cin cout cin cout
» »
«
( x)
= ".
( y)
" ;
( 2)
= ".
" Kr llf t kompon e n t e (x,
o ,
Fx ;
«
" Kr a f t kornpone n t e (yl Fy , « - Kr ll f t kompone n t e (' I
~
~
o.
o .
1.2 Gru ndstr ukturen ci n »
17 Fz ;
II Auswertung
Sux :: s ux +x; Suy :: Suy +y; Su z :: Su z +z;
SuFx :: SUFx +Fx; SUFy :: SUFy +Fy; Su Fz :: Su Fz +Fz; SuMx :: SuMx+y " Fz - z "Fy ; SuMy :: SuMy +z " Fx - x "Fz; SuMz :: SuMz+x " Fy - y "Fx; break ; c ase ' A': I " Ausgabe " I Fr s q r t(Su Fx "S u Fx +Su Fy "SuFy +SuFz "S u Fz); Kr s q r t(SuMx"S uMx+SuMy"SuMy+SuMz "SuMz); ax :: (Su Fy "S uMz-Su Fz "S uMyI /I Fr " Fr); ay:: (Su Fz "S uMx-Su Fx "SuMz) /I Fr " Fr); az :: (SuFx "S uMy-Su Fy "S uMx) /I Fr " Fr); p :: SuFx "S uMx+Su Fy "S uMy+Su Fz "SuMz; Mx p "SuFx / (Fr "Fr ) ; My :: p" SuFy/ (Fr "Fr ) ; Mz :: p" Su Fz / (Fr "Fr l ; cou t « "Resu l t i e r e nde Kra f t « Fr « cou t « "Resu l t i e r e nde s Moment:: «Kr « cou t « "Dyname Or tsve k to r (x) :: «ax « cou t « "Dyname Or t s ve k to r ( y) :: «ay « cou t « "Dyname Or t s ve k to r Lz I « az « cou t « " Mornen t e nve k to r (x) « Mx « cou t « "Momentenvekto r (y) « My « c out « " Mome n t e nve k to r (z) :: «Mz « break ; de fault : cou t « "Pa Ls c h e Eingabe t " « e nd l ;
e nd!; endl ; endl ; endl ; e nd! ; e nd! ; end! ; endl ;
1
while (weiterl::'E');
Mild )·9 zeigt das Ergebnis emes Eingabebeispiels. Obw ohl noch nicht aile Elemente des Programms besprochen wurden, sollte der Leser soviet Progra mmierk ennrn is besi txen. dass er die Struk ruren und Methoden versteht. D bungcn
Aulier der M5g.lichk eil der Kompo ner uenangabe. gibt es zur Richrungsangabe etnes Vektors zum Urspmng und den Koordinate n, die Angabe der Richtungswink el (Mild 1-10 ). Nehmen Sie deren Bestimmung in lh re Berec hnung m it au f ~,
a ' = arccos G
a
I' fi =
( 1. 11)
18
1 Grund lagen der Programmienm g ,, " i t .. .. (E ~ End .. / N ~ Ne uAI · Weite .. /A · A u ~g .. he ) H Angri f f s punkt ( x) = 3 An g ri ff s punkt (y) = 8 Ang r iffspu n kt (z) = 8 K..aftk" .. po ne nte <x> I' K.... ftk" .. po " ent e (y) 3 Kraftko .. p o nente
(z)
0
Kra ftkonp o nente
( x)
0
Kraftko .. p o nente (y)
0
we iter (E =Ende / H=He uAI =\leit e r/A =Au sgahe> \.I Ang .. iff spu n kt (x) = 0 Angr iff spu n kt = t Ang .. i ff s punkt ( z ) • 8 K.."ftko,"po nente (y) I' K.... ftko .. po n ent e (2) = 8 Angr iff spu n kt (y) = 0 Angr if hpu n kt ( 2) = 2 5 KI'...ftkonpo n ent e (x) K.." f t k o .. po nente ( 2) I' we i t e .. (E =Ende/H=He uAI =\leiter/ A=Au sgahe) A Re sult i e r en d e Kraft 7.Iil?HI7 Re sult i e r en d e s 110 .... nt 14 . 83 57 llyn
Or t sue ktor ( ,,)
- 0 . 2 (,
llyn " Ort sv"ktDr ( y) - 0 .58 0. 7(, Dyn e O.. t ~ u e k t o .. ( ", ) <x ) B.6 MOl'len t en u ekt o r MOl'len t e n...e ktor ( y) 5.1(, Mo .. e nte nue k t or ( z) 6 .oB "e i t e r <E =Ende / H=HeuAI= \le i t e r/A=Au sg .. he)
lJild 1·9 Ausgabe des Beispicls
y
'y x
lJild 1·(0 Richtungswin kel
19
1.3 Datentypen, Varia ble Dod Konstante Vartablcnmndcl l Das nach folgende Behllltermodell hat flir aile imperariven Programmiersprachen Gu ltig ke it.
Ikzcichncr ("' amc)
t\anK:(Bacichnc r) · A Uras.::
~
Adresse in! Speicher
8Ud I - II Bcbaltcrmodel l und ZugrifT
Zu jeder Variab len gehOrl"J1 ein Name (Bezeic hnerj. eine Adre sse im Speiche r und der Inha!t (W ert ) die ses Spe icbers . In der Programmierung i SI eine Va riab le ein Speic her. dessen We rt sich andem kann . DeT ZugrifT auf die-sen We rt er folgt aber den Bezeich ner oder die Adr esse. im Gegensarz zu r Math emati k. in der eine Vari ab le ein Platzh aher zur verangemeinerung von Gleichunge n iSI.
Variab le Be-VOl ma n ein e Vari able ve rwenden kann , muss sie deklari ert werde n. Bei der Deklaration wird der Name der Var iab len eingefhhrt und ihr ein Datentyp zugewiesen. :\1il dem Darentyp wird festgeleg t. welc be Form von Daten die Varia ble spe ichem kann . Dies ist erforderhc h. we il mi t de m Datent yp gleic hzeit ig die Ope ratio nen best immt sind, die sich auf diesen Datentypen durchfiih ren lassen . Sy ntax : Va riable nde klarario n
Dat entypl Vari ablen l i s tel ;
Dat entyp2 Vari abl enl is te2 ;
M it der Dek lararion ke nnen Variab len auc h ininalisiert we rde n: Syntax : Initialisierung einer Variable n
I Dat en typ
Vari ab l e" Wert;
Konst ant e Zuslitzlich zu v ariablen konnen in C++ auch benu tze rde finie rte Kon stant en deklarien und iniualisiert werden. Syntax : Deklaration und Initialisierung einer Kon stamen
I ccnsc
Dat en t yp KONSTANTENNAME " l'le r t;
20
1 Grundlagen der Programrmerung
Der Kon staruen kann im Programm kein neuer Wert zug ewiesen werden. Urn Konstante von Variablen zu unrerscheide n. werden ihre Namen gro Ggescbrieben. Eine andere
~ 6g1 ic h kei t
bes rehr darin . Konsranren mil Hil fe des Praprozessors zu erzeugen.
Syntax: Praprozessor- Direktive zur Erzeugun g von Konsranren
I . define
Name Er s a tz
Hier wird kein Speiche rplatz beleg t. da der Praprozessor im gesa mte n Quelhext das won Name durch Ersatz ersetzt. Fu ndamcn ta ter Daten typ void
Der Datentyp void ist nur syntaktisch von Bedeutung, da es keine Objekte von diesem Typ gibt. Er wird ha uptsachlich als Funkno nstyp und fllr Para mererangaben genu rzt. ~ il der Typ angabe void wird angezeigt, class diese Funkti on keinen Wert zurtlckliefert. Void wird da her auc h als Pseudo-R uck gaberyp bezeic hnet. Ga nuahligc Da tcn typen Ganze Za hlen (e ngl. integer) werd en mil unrersc hiedlicher Anzahl von Bus verwa lrer. Die w onlange ist com pilerabbangig. T llbt llt 1-6 O~rsicht g;l1V..l'ahligcr Datcntypcn
Typ
Speicherbedarf
w ertebe reich
short in!
2 Byte
-32 7M bis 32767
unsig ned sho rt int
2 By1e
Obis 65535
int
4 Byte
-2 14748364 8 ... 2 1474 K3647
long inl
4 Byte
-2 14 74K364 K ... 2 147 483 647
unsigned long inl
4 Byte
O bis 42949672 95
Beis piel e: Deklarat ionen (und lnitia lisierungen] l ong int Ba u t eil e : 4 5 5 ; int Anz ahl _Me s s werte, S t ich p roben ; u n signe d l o n g i nt Ve rs uch e : 1 23 4 56 7 8 90;
Gau ze Zahlen werden ohne Dezima lpunkt geschriebe n. In C++ sind ein ige lnteger-Konstanren vordef iniert. d ie ohne Deklarauo n und lniti alisierung ang ewend et werden konn en. w enn die Header-Datei ..limits.h" eingefligt wird: Beispie le: lnteger-Konstante aus Bjbliothek en I NT MAX 32767 oder 21 47 483 6 47 INT MIN : -32768 oder -21 47 483648
21
1.3 Datentypen. Var iab le und Ko nsta nte Recllc Dar cntypcn
Reelle Za hlen (engl. Float) werden rech nermt em in exponentieller Fonn durch Mant isse und Expo nent da rgestellr. Dadu rc h mussen neben Speic herbeda rf auc h die Anzahl darstellbarer
Ziffem genannr werden. T ebelle 1-7 Ohcrs ichl rccuer Daicmypen
Typ
Spe iche rbedarf
Stellen
w en ebereich
float
4 Byt e
ca . 7
1.2E-38 bis 3.4E-t38
do uble
8 Byl e
ca. 15
2.2E- 308 bis 1.7E+308
long double
10 Byte
ca. 18
3.3 E-4932 bis J. 2E -t4932
Beispiele: Deklaranonen (u nd Iniriahsierungen ) f l o a t Durchbiegung : O. 123 4 e - 2; d ouble Nullstelle_l , Nulls tell e_2 , Nulls telle_3 ; l ong d ouble Loesung : 3 . 4 5e +4 ;
Fest pun ktzablen mussen emen Dezima lpunk t er halten . Auch bie r sind die darsrenbaren Grenzen dUTCh Double-Konstante in der Header-Date! ••Iimits.h" gegebe n mit DBL_MAX und D BL_:\ IIN.
Cha rac ter Daacmypcn Char-Va riablen d ienen in der Haoptsache zur Speic heru ng von AS CII-Zeic hen. T llht'lIt' I -H Ohcrsic ht ocr character Datentypen
Typ
Spe icher-
wertebe reic h
bedarf char
I Byte
- 128 bis + 127
signed char
I Byte
· 128 bis + 127
unsigned char
I Byte
o his 255
Beispiele: Deklaratio nen (und lnitia lisie rungen) c h a r Tr a e g erform : ' T'; s i gn e d c h a r geset zt ; u n s igned c h a r Ze i c hen : 2 3 1;
Die Initiali sierung kann durch em e Ze ichenkon stante (er kennb ar an den Hochkommas) od er dur ch den dezimale n A SC II-Cod e erfolg en.
22
1 Grundlagen der Programrmerung
Loglschc Dat cntypcn In C ++ is! der bools che Datentyp vordefiniert: 'I llbelle )-') Dcr boolsche Datcruyp
Typ
w en ebereich
bool
true ocer raise
Beispiel e: Deklararionen (und Initiatisierungen) boo! Te~inger ec h t : t rue ; boo! An + ~J Diskriminate 0 =
(~r + (
*r
D::Ol u:: pow ( z, f l ; e l se u'" -pow ( (- z l , f l o z '" - (ql2l-s ; i f ( z >"'OI v '" pow (z, t l ; else v "' - (( - z l , f l ; yl = u +v ; y2 '" - (u +v l l2 ; y2i '" sqrt ( 3 1+ (u -v ) /2 ; y 3 :: - (u +v ) / 2 ; y 3 i = -sqrt (3 ) * (u- v I /2; xl y l - a l3 ; x2 = y2-a l3; x3 :: y 3 -a /3 ; cou t « ~ x l :: « xl « cou t « -xz :: « x2 « « x3 « cou t « ~x3 '"
endl ; +
i~
«
• + i · «
y2i « y 3i «
e nd l ; endl;
II Stop s yst em (. Pa us e ~ I ;
~ i t Hilfe des ersretne n Progra mms lassr sich das nacbfolgende Berecbnungsprobte rn ldsen. Ein Blechtrichter nacb Bild 1-13 hat die Querschnittsform eines gleichseuigen Dreiecks und em Volu men von 1814 cm1. Gesuc hr ist der obere Durchmesser des Kegels. denn bier soli em zylindri sches Rohr angeschweiut werden.
,
.
Kild 1· 13 Gcschwcibrcr Blcchtrichtcr
Das Volumen bestimmt sich aus der Pormel V=
; ·(~r ·h.
Da der Quers chnin ein gleichseitiges Dreieck iS1. Iolgt rUT die Hohe
( 1.21)
30
1 Grundlagen der Prog ramm ien mg
(1.22)
Damit ergibt sic h d ie kubisch e Gleicb ung
d l _ 24 '~ =O =dJ _ 8000
( 1.23)
Jr · ,, 3
Mit lI ilfe des Pro gramms ergibr sich cine reeue Losung. DeTDurcbrne sser isl 20 em groB .
Ceben S i!! di e faktoren "in " " r Gle ic hun g : ,, ~ 3 • " " A2 • h " • c _ 8
••.....
•b
-
o
Di l! Lo e sung der Gle i chung " AJ • 9 " A2 • H " • - 8800 l ~
gro8er g leich
groBer
Beispie le: Anwend ung von Vergleichsope ratoren
(23 == 45 1
(7. 55 < 8 .22 ) ( ' a ' < 'B' ) ( 3 > 3)
II II II II
lie fert f a l s e
lie fe rt t rue
lie fe rt f a l s e lie fert fa l s e
Logische Ausdrtlcke kennen mit nach folgenden logischen Opereroren kombmi ert werden : Ta helle 1-'-' Logischc Opcrarcren
Operator
Bedeutung
&& II
logisch UN D
!
Nega tion
logisch DD ER
Diese liefern die aus der Boolesch en Algebra be kannten Wahrh eitstabellen . Beis piele: Anwendung logisch er Operaroren
o < Hoehe && Ho e h e < MAX_HO EHE a:bll c :b Kr af t
!:
NULL
Op erat or slzeof Mit dem Operator sizeo f karin der Speicherbede rr von Variablen und Daten typen bes um mr werden.
1.4 Operatoren und Ausdracke
33
Syntax : A ufruf als unarer Operator oder als Funktion s i zeo f Au s d r u c k si zeo f (Aus d r uckl
// u n a r e r Ope r a to r // Fun k t i o n s a u f ru f
Darin ist Ausdruck in ein fachsten Fall eine Variable. Fur den Funktionsaufruf ist a ls Ausdruck auc h ein Datenlyp erlaubr. Das nachfolg ende Programm erminet t den Speicherbedarf des benutzten Sys tems. COOl:' 1-7
An\\l:ndun~sbe i spic l
- Besiimmcn g des Spe jcherbedarfs eimger Datem ypc n
/ * Speicherbedar f.cpp
.,
Das Progr amm z e i gt den Speich e r bedar f v e rsch iedener Oa tentypen
'inclu d e
Stetlen wir zuna chsr den Algorithmus fUr d ie M ethod e Regu la Falsi auf. T abdle 1-20 zeigt d ie Meihod e in der angemeinen Form eines Struktogramms. Ich benutze dazu eine Tabellenfonn. So lassen sich Suu krogramme schnel l ers tell en T ah fl le 1·20 Su uktogramm zur Methode Regula Falsi
Emgabe Bestimm ung zweier Stanwerte x l und x2. so dass flXI )>O und f(x2) 0
J,
Nein
xj v x
x2 = X
So lange wie :r <x): >
c
Ausgabe x Nun ersetzen wir die allg emeinen Bedingungen und Formel n durch die speziellen unseres Beispiel» und erhalten so einen A lgorit hmus. wie in Tabetle 1-21 derge stellt.
42
1 Grundlagen der Programmien mg
"1IIb('lIe 1-21 Bcsrimmung dcr minimalcn Dbcrflacbc
Eingabe
Bestimmung zweier Srartwerte dj und d1. so dass O'(d j) > 0 und O '(d!) < O. Abschaltwert der lterationsschleife c
d=d-O'(d) I
I
d, - d, O'(d 1) -O'(d l ) 1st O'( d) > 0 Nein
J' d] = d
dj
e
d
So lange wie ]f( 'l ~ > c Bestimm e O "(d)
Ausgabe d und Angabe ob Minimum oder Maximum C OO t 1-9 Anwendu ngsbcispicl -. Minimalc Oberfl ache 1* Mi nOberf l a e c he . cpp
.,
Das Pr og r amm bestimmt d i e minima Ie ei nes zy l i nd r i s c he n Beh~l te rs be i v orge ge benem Voh une n
Ober f l ~c he
' inc l ud e 'inc l ude <math.h> cons t doub l e p i : 4 *ata n ll l ;
/ / Kon s t a n t e p i
II Rad i u s in em dou ble Rad (doub l e d} {
r e t urn d/2;
II Ober fl~c he i n cm~ 2 doub le Ob( do ub l e V, doubl e d} (
II 1 . Ableitung der Ober f l ac he double Ob ll doub l e V, d ouble d ) (
return 4 *p i *Rad (d ) -2 *V/ (Rad ld ) *Rad ld l ) ;
43
1.4 Operatoren und Ausdracke
II 2 . Ableitung der Ober f l a e h e d ouble Ob 2( doub l e V, d ouble d ) (
r e t urn 4* p i+4* V/ 1Ra d (d l*Rad (d )*Rad (d ) ) ; i n t me Ln (I d ouble V, dl , d2 , d, e; d ouble 0 1 , 0 2;
bool H;
eou t « endl « c i n » V, c out « e ndl « cin » dl; cou t « e ndl « c i n » 02 · cou t « endl « ci n » c o ut « e ndl «
..
" Vol ume n lc cml V ·St a r t we r t
[= l d1
•
o .
· St a r t we r t
{=I 02
•
o .
" Absch a l t g r e n z e
{
i f (02)::0 1 {
f al s e ;
l
else {
i f (0 2 ) ::0 ) (
d :: dl ; dl d2 ; d2 :: d ; )
e lse {
M
. .,
· d \ t \ tO \ t \ t O' \ t \ tO · • • «
II Star tObe rp rU fung H :: true ; 0 1 :: Ob I (V, dll ; 0 2 :: Ob I (V, d2 1 ; i f (0 1 ) ::0 1
M ::
. ·,
fa l se ;
J
if {M::::t r u el {
II Bere c hnung do (
d :: dl- ol * (d2 -dl l / (02-0 1 ) ; i f tcer :v . d l> Ol dl :: d ; e l se d2 :: d ,
e n dl ;
44
1 Grundlagen der Programmien mg cou t « c out «
d « " ' t \ t " « Ob(V, d ) « - \ t \ t " ; a b l( v. d ) « "' t \t « Ob le v , d ) « N
e ndl ;
}
1/ Abbruchkriterium while ( f a bs(Ob l( V, d l l > e ); cou t « d « "\ t\ t" « Ob lV, d ) « " ' t \t " ; c out « Ob l(V . d ) « "\ t\ e" « Ob 2( V, d l «
endl ;
}
el se cou t «
·S t a r t we r t e f a l s ch ! " «
e ndl ;
Das Programm bestimmt einen optimale n Durcbm esser mit 3.99313 em. I) ol .. _n
I ~ . 1325 " In" t."ll"h i
•
T "~ t ,,
-71.31111 -1'1. 3289 1 A88'>3 -15 .9896 - 13 . 1'. '1 - 18.\1835 'L846iH - ·}. 499? -l) .28337 5.11i135 - 4.18 438 -),3%8 -2 .72 472 -2 .14959 - 1.65627 - 1 .23228 - 8 . 8 6 72 4 8 - 8 .552 52 6 - 8 .2888 43 - 8. 84U16 34 8 . 15?l111 - 8.019 6 8 16 8.80348'199 8.80 34849 9
,.. J j, . 237 (,!.'SIB
"6.9""7 SiI . 19 4 8 "7. 81'>7 44.4 2'16
4 3.U.S'
4 1. 2554
rl • .,422
42.1 237 411.52'14 39 .914 39.3948 38.9"38 311."'179 38.2567 3"1.98 15 :1'1,'14 c C udI' 1-10 Anwcnden gsbeispiel -. Max jmales v o fumeu
'*
Ma x Vo l umen. cpp
Das Programm bestimmt den Zuschnitt f Or e i n maximale s Qua der-Vo lumen be i vo r g e ge bene r Ma t e r i a l f l a ch e
'/
' i nc l ude ' i nc l ude <ma.th .h> II Vo lumen i n cmA )
doub le Vo l (doub le a, double x l (
re t urn x* (a.-2 * x) * ( a -2 * x);
II 1 . Abl eitung des Volurne ns d ouble Vol l(double a, d o ub l e x ) {
r e t u r n 12 *x *x -8 *a.*x +a *a ;
/1 2 . Ableitung des Volumens double Vo12 (double 4, d ouble x l {
return 2 4 *x -8*a ;
47
1.4 Operatoren und Ausdracke
int mai n ( ) d ouble a, x , e ; bool H; int i ; cout « endl c ,n » a; c out « endl d n » cou t « e n dl c in » c o u t « endl
.."
«
" Ka n t e n l a e n g e
«
" St a r t we r t
«
"Abs c h a l t g r e n z e
«
- x\ t\ t V\ t\ t V '\ t\ t V ' , . «
[em] a = . ;
. ., • ..
Icml x
e ndl ;
I I ge r e c hnunq do [
=
x x -Voll (a, x ) /Vo I2 (a , x l ; cou t « x « - \ t \ t- « Voi la , a l « " \ t \ t· ; cou t « Voll (a, x l « " \ t \ t" « Vo l 2( a, x ) «
e ndl ;
]
II Abbruchkriterium wh i l e ( f a b stVo l l( a , x l ) > e l ; cou t « x « -\ t\ t - « Vol (a , x l « " \ t \ t"; c o ut « Voll (a , x l « -\ t\ t" « Vol2l a, x l « s ys t elll (" Pause " I ;
endl ;
Das Programm bestimmt eine oprimale Hohe von 8.333 em.
8i1d 1-10 Au swertung dcr M axirnurn-A ufg abc
Ub ungon
Suchen Sie weitere lixtremwert-Aufgaben. wie r . it: Ein T richrer soli aus einer BlechKreisscheibe durch herausschneiden eines Kreissektors gefonn t werden ;.Ail welchem Winkel erha h der Trichter da s groBte Fassungsve rmogen?
1 Grundlagen der Programrmerung
1.5 Anwelsungen Neben de n Ausdriicken und wenzuweisungen sind noch einige Ab laufstru kturen in C++ defi niert. Sd eklion du r ch el nraehc Fa uu nter schcld ung Selektio nen dienen zur Fallunt erscheidu ng und sind von ihrer Darstellun g her leicht verstandIich. Der allg emeine f all: TBbl" lIl"
1 - 2~
Einfacbe hll umerschc:idtmg
tru e
logi scher Ausdru ck
Anweisungen 1
false
Anw eisungen 2
In Abbangigkeit eines logischen Ausdru cks werden je nach w ahrbeirsgeban unterschied hche A nweisu ngen ausgefhhrt. 1st der Wahrheitswert des Iogisc ben Ausdru cks true; werde n die An weisungen I durchgefllhrt. Hei false di e Anwei sungen2. Die Anweisungsblock e werden durch die Separatoren ( ~) und (}) geklammert: Syntax : Selektion durch eiufache Falfunters cbeidung
,
if ( logischer Aus druck l Anwei s un gen l ; J e l se Anwe i sungen2 ;
Besteht der Anwei sungsblock nur eus einer Anweisu ng, da nn konnen d ie Sepnrutcr en entfallen. Der eI.\·e-Te il kann eben nil Is er ufallen. wen n nur Anweisunge n unter ' rile ausgefiihrt werden. In Anweisungsb locken konnen weitere Fallunterscheidunge n stehen. Man spricht da nn von verschac htetu ngen. CUd f l -Ll Anwc ndungsbcispicl - Satz des Heron 1* Heron . cpp Dies e s Pro gramm berec hne t den F l a c h e n inha l t e i nes bel i ebi g e n Dreiec k s n a ch dem Sa t z v on Hero n Of
'includ e < i ost r e am. h> ' in clud e <ma t h. h>
1.5 Anweisungen
49
int main (I I II Dekl arationen double a , b, c, $, f ; II Ei ng aben CQu t « "Se i t e a cin » 1I. ; cou t « "Se i t e b c in » b ; CQut « "Se i t e c = ";
= "; = ";
cin
>:>
c;
II Aus wertung un d AU$911.be s = 11I. +b +c) /2;
,
i f la<s && h<s & & ccs}
f = s q r t (s * (s - a ) * (s -bl * Is -ell; cout « *Flaeche « f « ' \ n';
=-
)
e lse {
CQu t «
- Ei ngabef e h l e r !" «
' \ n';
s ys t em I" Pa use - ' ;
Sele ktion du rch mch rfa che Fa uu nterschc ldu ng
o n sind mehrfache Fallu nterscheidungen ge fragt. die eine komptexe verschachrelu ng von einfachen Fallu merscheidungen erfordern. Zur Vereinfachnng wurde die swh ch-Anweisung
eingefl ihrt: T ab t'lIl' 1-25 Struktur emcr switch-Anwcisung
Ausdruc k Wert_ I : Anweisungen 1 W, rt 2: Anweisu ngen_2
Wert 3: Anweisun gen 3 usw. bis
wen
n: Anweisungenn
Sonst: Anwe isungen nH Syntax: Switch-Anweis ung swi tch I A usdruckj {
c ase !"e r el: An""Ed s un g en l ;
50
1 Grondlagen der Programmierung
case h'ert 2 : Anwe i s un gen 2 ; case [,rert], Anwe i s ungen 3 ; case f1er t N, ArlI\'e i s ung enN; de fau l t : An we i s un g s b l o ckN+ l ; )
Codt 1-12 Anwendungsbeispicl - Volumenberechnung von finitcn Elcrncmcn / * Vo l wnen.cpp
.,
Di e 5e Swi tch - Anwe i s ung berec hnet d as Volumen e ines Zy l inders oder einer Re chteckp l a t t e . je n a c h Inhalt v on Fo ~
. inc l ude 'include <math. h>
l n t mai n () cha r
I
Form ;
l ong a ,b , c ,Vol ;
cout « cin »
"Fo rm ; " ; Fo rm ;
swi t ch ( Fo rm) [
case ' Z' : ' " Zylinder " ' cou t « - Dur c hmes s e r c l o >:> a ; cou t « "Ho ehe " " , c In » bi Vo l=a "a "3. 1 4159 / 4 *b; cou t « ·Volumen " • «
=
break ;
0
,
Vol;
c a s e 'R ' : ' " Rechteckplatte * f c out « "Laenge ", cln » a ; cou t « " Br el t e e l n » b, eou t « " Hoe h e " cin » c ; Vol =a *b *c; cou t « "Volume n "« Vol; b reak; de fa u l t: So ns t cou t « "Fal s che Eingabe!";
= ",
'*
*'
s ys tem (" Pa use" );
Die hrea k-Anweisung verbinden die AusfU hrung nacbfolgender Anweisungen und kann auch er ufallen. Ebenso die dtt cl/llt-A nweisung. Erganzen Sie die Funktion.
1.5 Anweisungen
51
It er ation mit fest er AII,I~ahl " on Wi ed crholungen lteran cnen sind wiederhc fungen von Anweisungen in Abhangig keit von logischen Ausd riicken. hier els Bedmgungen bezeic hne r. Solange die Bedingu ng den Wahrhe itswer1 true besitzt. werde n d ie Anweisungen wiederholt ausgefbhrt.
Die jce-Anweisung ist eine Iteration mit einer Iesren Anza hl von Wied erholu ngen . oft aueh als Schleife n bezeichner. Die Laufvaria ble begin nt mit einem Startwert und wird dann urn eine Schrittweite so lange verandert. bis eine Bedin gun g erreicht ist. T .bl"lIl" 1-26 Iteration mil Ieststcbcnde r Anza hl Wiederbolungen
for {Laufvariablev Startwert; Bedingung; Schrittweite)
I
Anweisu nge n
Sy ntax : Iteration f or
( Lau f va r i a b l e : Startwert ; Bedingung; S chrittweite )
{
Anwei sungen ;
Auch bier kennen bei einer Anweisung die Separa toren ent fatlen. ClIdl' 1-13 Anwcrnl ungshcispicl - Numerische Integration: Das besummte Integral als Fllicht.'fIinhalt /.
Ite rati o n_F I~ cheninhalt .cpp
bestimmte In t egr al als Fl ~cheninhalt: Die Fu nktio n bestimmt den Fl a c h e n i nha l t in n Sch r i t t e n zwis c he n der Pa r a bel y: f (x ):x ' x und de r x-Achse im In t e r vall l i nt ma i n ( ) ( int L n : do uble x , dx , Us:O, Os:O; bo0 1 Stop; cou t « " Iterationen : cin » n; dx: 1 1 (doub l e) n : x:1.0; for
( i: l; i< :n ; ++i )
{
Us :Us +x *x *dx ;
x s.xe dx ,
Os:Os +x ' x ' dx ;
";
52
1 Grondla gen der Prog rammie rung
cout « cou t «
· Un te rsumme = " « Us ; ·O bersumme « Os;
=.
s ys t em(· Pa u s e - ) ;
:\l il hinre icbender An....ahl von heran onen nahern sic h die Summen an. Besti mmen Sic: zusa tzhc h eine Surnme aus den Mitt elwerten , AuBer der Su mmation von Iiniten Rechrecken. kcnnen auch Trapezsegmente summ ien werden. Sc hreiben Sic die jeweiligen Vers ionen .
It er ati on mit voranste hender Be-dingung Die wbne-Anwei sung fiihrt Anwe isungen so lange durcb. wie eine vora nstehende Bedi ngu ng
erfiilll ist. T lIbl'lIl' 1-17 Iteration mit vo ran stchendcr Bedingun g
while (Iogischer Ausdruck)
I
Anweisungen
Syntax : Iteration mit Stanbed ingu ng
,
while (logischer Aus dr uc k l Anwei s ungen ;
Eben falls konnen bel einer Anweisu ng auch hier die Sepa rato ren entfallen. Dadc rch. dess d ie Bedingung am An fang der Anweisung stehr. muss es nicht zur A usfiihrung der Anweis ung en kcrn men, Irn Oegensarz zur t1o-while-Anwe isung, die nach folgend beschrieben wird. CIldl' ! · 14 Anwcnd uugsbcispic l - Nntlstellcnbestimrnung nach d..'r Hiscktionsmcthod c
/ . Null s t e l l e_Bis ek t i on. cpp Di e Funk tion bestimmt e ine Null ste l l e de r math emati s chen Funktion F (x ) =x·x - 7=O na ch der Bi s e k tionsmethode mit den St artwerten x l =2 und x2 =4 ' /
linclude linc l ude <mat h. h> II zu unter s u chende Funktion doubl e f (double x l
,
r e t urn x ·x -7 ;
1.5 Anweisun gen
53
int main () ( i n t i ::O; double xl ::2 , x2::4 ; double yl , y2 ; double x , y ; wh i l e Il x2- x ll > 0.000 1) {
i ::i +l; x ::xl+ (x 2-xl l / 2 ; y =f (xl ; i f (y II ZU untersuchende Funktion d ouble f (do ub l e x t {
return s q r t(3 +s q r t( xll; i nt main ()
(
int i=O ;
double xr • x2;2 ; doub l e y L, y2 ; do I
xt exz ; i:::1 +1 ;
x2 =£ lxl J ; while «( x 2 - x l)
cou t « cou t «
;>
0 .0000 1) ;
-xl ,xl::: «xl « I • « x2 « - lterat i onen " -c ' \n ';
'\ n';
i «
system I " Pa use*l ;
return 0 ;
Ir b ungcn
Probieren Sic: das verfabren mit anderen Funktionen, Gib t es irnrner eine Losung? break und continue Die Anwendung de r break-Anwe isnng ..vurde bereits in den Fallunre rscheldungen gezeigt. lhre Anwendung isl auc h bei den Schleifen sinnvoll, wen n kein besse res Resulta t dur ch weitere Durchlaufe zu erwarten ist. Mit der conunue -Anweisung wird so fort d ie nachste Schleife eingeteiter. Auch darmt kann Rechenzeit gespa rt werde n. C ede 1-16 An wcndengsbci spicl - Schlcifcn konstruktion mit con tinue und break
1* Nullstellen_Vergleichend.cpp Die Fun k t i on bestimmt aIle Nullstellen der mathernatischen Fun k tion F lx l =x* x - 7 =0 im Intervall von - 100 bis 1 00
1.5 Anweisungen
./
55
du rc h vergleichende Au s wertung
' i nc l ud e ' i nclud e <mat h. h > II Zu u nter suchende Fun ktion double f (doub1e x l I
r e t u rn x ·x- 7 ;
int main () ( int i, ii , i 2 ; double xu. x l. x 2:: -100 ; double yl. y2: double x , y, II erster Funktionswert mit Vorzeich e n
y2::f (x2) ;
i2::1 ; i f ly 2
II s t r e am 10 II s t r e am 10 mit Tab II Pseudozu fall s zahlen
u sin g namespace s t d;
II Anzahl Zahlen 'define MaxAnz 50
typedef int IntArrayIMaxAnz) ; II Zufallszahlen generieren v oid Zufall I IntArray Zahlen i n t Anz l ( sra nd( timeI NULL)); IIGe ne r a t or I n i t i a l i s i e rung f or (int i : 0 ; i c( 1.0. - 1 ) ; cou t «
" Koml. Za h l c :
- «
c «
e nd l ;
II Hu l t i p l i k a t i o n ein e r k omplexen Za h l II mit d em r eel l en Wer t p i c 4 - a t an ll ) ;
-=
cou t «
rc - pi
:
- «
c «
e nd l ;
s ys tem(- Pa use-) ;
Die nachfolgende Tabelle zeigt wicbuge Funktionen, die mit kompt exen Darentypen mog fich sind. T llob l'lh.' 1-31 wicbrigc t'unktioncn filr kom plexe Daten typen
Abkurzung en: T = Typ floa t, double oder long double
mathematische Beschreibu ng
C = complex-cT> T reultconst C& x)
Realteil von x (= x.rea lm
T imegtc cn st C& x)
lmagjnbrteil von x (= x.imagO)
T abstconsr C& x]
Betrag von x
T argfco nst C& x]
Phasenwinkel von x in rad
T nor mtconst C& x)
Betregsquac rer von x
C conj(const C& x)
zu x konj ugien -komplexe Zahl
C costco nsr C& x)
cos x
C cosbtco nsr C& x)
cosh x
C exptconst C& x)
,A,
C logtconst C& x)
In ,
C log lO(conSl C& x}
log_1O x
C powt consr C& x, int y)
' ''y
74
1 Grundlagen der Programrme rung
C po w t consr C& x. const T& y )
xoy
C powtconst T& x. const C& y)
x' y
C powtconst C& x, const C& y )
x' y
C stm consr C& x}
S in
C sinh(consl C& x}
sinh x
C sqrnconst C& x]
- Quadretwurzel aus x
C tant const C& x}
tan x
C tanh( consl C&
xl
x
tanh x
C fabstconst C& x}
Betrag von x als komplexe Zahl
C acostconst C& x}
acos x
C acos h(const C& x]
acosh x
C asin(const C& x)
asm x
C asinh(co nst C& x]
as inh x
C ata n(co nst C& xl
alan x
C atanh(consl C&
xl
atanh x
ZUf prektischen Anwendung betrachten wir einen Reibenscbwingkreis mit R. C und L nach Bild 1-34 und berechnen die Frequenz-Ubertragungsfunkrion z in Abhfingigkeit von der Frequenz
f.
z = -U, ( 2 .
U
I
7[.
f )= -U." (m) = U
R
(1 .45)
. 1 R + J(- + wL ) mC
I
V ,( f)
..
L
R
lIild 1_.\4 Reihcn schwmgkreis
U,{ f)
J
C
1.7 Zeige r auf'D aientypen
75
Cnd l.' 1-22 Anwcndungsbeispicl - Rcchncn mit komplcx cn Zahlcn 1* Reihen s chwingkrei s . cpp Anwendung komplexer Zahlen am Beispi el d es Frequenzgangs eines Reihens chwingkrei ses ./
' i n c l u d e <s t d io. h> 'include < iost r e am. h > 'include <math .h> ' include using n amespace s td; int ma i n I } (
d ouble x . y . f . Omega. R. C. L ; dou ble u 1 8 0 . 0 /M_PI ; FILE *puffer ; puffer = f open l ~ C: \ \Temp \ \Frequenz .dat ~ .
=
"w - l;
c o ut « - \ nWide rs t a n d [Ohm) = "; c i n » R; cou t « ~ \ nKapa zi t ae t [Nano-Farad) = "; c i n » C; c o ut « - \ n I n d u kt i v i t a e t IMikro-Henry) = ". cin » L; cou t «
endl «
~ \n f[ H z ) \ t log( f) \ t Be t r a g( z3)\ t log( Be t ragl z3)1\ t Phas e( z 3)\n \n";
f or (f =IO ;f
Die Bjbhorhek definiert string im Narnespace std. so dass flir d ie korrekte Ansprache std ::string verwendet werden muss. Oder aber es erfolgt ein Imparl des kompletten Namespaces minds using-Anwe isung.
1.8 Zeic henketten
79
Syntax: Definition des Standard-Namensraums
I [usi ng]
nam espace s td ;
Einen kleinen Oberblick liefert die nechfolgend e Tab elle. Darin sind Funktionen rur Kopieren. vergtelchen. Anhlingen und Langenbesu mmung enth ahen. T ah dl c 1-33 SlTing ·f unkt ioncn Anweisung
Beschreibung
strcpy(ZielString. Qu ellString);
Kopiert QuellString in dl..' tl/JeIString.
stmc:py(b d String, QuellString..n];
ersctzt die crsen n 7.....jchcn \'00 lJelSlring dun:h die ers ten 0 zeicben von Qu.:-IIString. Die ubrigen zeicben blcibe.'tl unveraodert.
strcat(lJeIString.Que IIString) ;
Ocr QlId lStrin g wird an den ZidSlr ing ange hangt .
slmnp(ZieIString.Que IlStringl;
Verglejcht ZielString mit Quell Stri ng lexikalisch. Stehl ZielString vor Q uellString im Lexikon, win! das Ergebnis negativ, bd Gleichbcit 0 und scns t positiv .
strlen($lri ngl ;
Liefcrt die U nge von String . Das Ende l eiehen \0 ' wird nicbt milgetAhll.
In C ++ wird das Ende cines Siring d urch das Sonderzeichen "' 0' gekennzeichnet. Die obig cn Funkuonen sctzcn ' \0' sc1hstsllindig lind verwahen das Ende eine s Strings bis Lll diescm I..... icben unabhangig \'011 d\'f dckla ril'f1l::n Lange.
Aile Funktionen in string.h linden sich in der Bescbr eibung des verwe ndeten Com pilers. Nachfolgend wird das zuvo r benutzte Demoprogramm auf die Anwendung von Strings umgestellt. Cod e 1· 24 Anwendungsbcispiel -Addition von Zcichcnkcttcn: string-Version
1* Die Fu nktion k opiert zwe i zeichenkettenlitera le in zwei St r i n gs und f Qg t diese z u einem St r i n g aueenenen "/ ' i n c l u d e II Dekla rationen der S tr ing- Fu nkti on e n ' i n c lud e <string.h> II Definition der Strings c h a r s l (1 0 1 . s 2 [ 1 0 1 ; mai n ( ) {
bool S top; s t r e py 5 t rcp y s c rca t e o ut « ein »
(s l. "S t r i n g - -) ; (5 2. "Verkettung " ) ; (a i • 52 ); s l; S t op;
80
1 Grundla gen der Programrmerung
Die Zuweisung an die Strings wird mit der Funktion string- co py [strcpy} dur chgeflihrt. Diese Funktion kopien Byte fliT Byte "om zwe ite n Argum ent ..urn ersten Argume nt. bis sic: au f ein Null-Byte s1081.
:\1 il strcpy (sl , ..Zeichen-"]; werden die neun Bytes ,Z',' e',' i' ,'c',' h' ,' e' ,' n ' :-,:\O' nach 51 kopiert. In de r nacbsten Ze ile werden di e Bytes .Verkenung'' nach 52 kopi ert. Doc h bier gibt es ein Problem, den n ,.Verkenung" hal 10 Bucbstaben, es werden also mit dem Null-Byte 11 Byles kopiert, cines mehr als dafur reservi ert wurde. Dennoch wird der Vorgang ausgefiihrt. Zum v erkeuen von Zeic henkenen dient die Hibljotheksfun kuon sne er. Sie zweite n Argument s an den Inhall des ersten .
h1\n~>1
den lnhalt des
A" wendungsbdspiel: widerst ands-Farbcodc Urn das Arbe iten mil Zeichenkenen zu verdeu rlichen. ben utzen wir ein Anwendungsbeispiel aus der Elektrotechnik . Der Wert emes Widerstandes lasse sich an se iner Farbgebung ebles en.
I . Ring 2. Ring 3. Ring 4. Ring
8 ild 1-_\1I Farbkcnnu ng emcs elektrisc hen Widcrstands Tabt'lIt' 1-34 Wido.:notands -Farbcodc
Furbc
Schwar z
0
2. Ring 2. Z iITer
0
3. Ring Zahl dc r Na llen
4. Rin g Tclcra nz
0
I
Bra un
I
I
I
Rill
2
2
2
Orange
3
3
3
Gd b
4
GrOn
s
,
,
Hlau
6
6
6
4
4
Viol ell
J
J
J
Grau
s
s
s
wein
9
9
9
Gold
-
Silber Dbne CtJd~ 1 - 2 ~
1. Ring 1. ZitTer
Die Funktion bestimmt den Farbco d e
2
0,5
-
-
-
XO.I
,
X O.QI
10
Anwcndungsbeispiel -. Farbcode \'011 widcrsr anden
I '" FarbCode . c p p
in %
20
1.8
81
Z~i c hen kelll:n
>/
e i nes Wi d e rs t a n dwe r t e s ve re i n f ach t o h n e To ler anzangabe
' i n c l ud e < ios t r e am. h> ' in clu d e <s t r i n g. h > II Deklara tio nen d er St r i n 9 - Funk t ion e n main () (
c h a r Ohm ( 1 J, COde; i nt i: O, Max , Null en: O; cou t « "Wide rs t a ndswe r t c i n » Ohm;
[Ohm] :
-.
Max : strlen (Ohm) ; cout « '\n' « ·Wi d e rs t a n d s f a r ben : f or ( i=O; i lin c l u d e < s tri ng. h> II De kl a r a t i o n e n d e r St r i ng - Fu n k t ion e n
main (J {
i nt i , j, x , Lo esun g e n , Kr iterien ; II L5 sungen cou t « - Anz a h l Loesungen c i n » Loesunge n; s td;;s t ri ng Lo e sung [Lo esun g e n]; c o u t « *Besch re i ben Si e d ie Loes ung e n : \ n * ;
= .;
83
1.8 Zeichenketten f o r (i=O, i
/
Symmelri.:a.:hso:
BUd 2-10 Mcmbranausschnitt
Durch Anwe ndu ng des Ope rators ergeben sic h nach folgende Differenzen. Verbes serung der z eilenwerte (von Schritt n nach n tl ): j =O. i: 3 :
.
.
.
.
-u , 0' n+ II . 4 u J 01 0+1)_14 01 rt+- 1buJ _11n)+UJ I(n)
-.
daraus folgt: 4u.l .0(rt+-1l- u4.0 (0"'\I = 2 uJ .I(0)+ I weil U2.0(llTl b I. j =O. i:4: -1l3,OlO+1)-t4u 4.0(0+ILu5.d o+ lbu4._1(01-tU4,1'0)
daraus folgt: -Ul ,O(Il+1I-t4u 4.0(0+I)=O weil U5.0ln+l bo. j = l . i: 2 : -u 1.1(0+I) • 4u 2, I(n+IL u 3.1(n+1)=U2.0ln4 u2,2(0)
daraus folgt: 4 Ul . l, n+1L U3. 1,0+l)=U 2.2(n)-t2 wei! uI .JllH )=U2.0lob I .
je l , i: 3 : -U2.I(n+ 1)14 U3.1(0. 1L14. llo +119IJ .o(0)+U3.210)
daraus folgt : -U2. I(n+Il -t4 u3.l , 0+II=UJ.o,01 wei l U4.1,0- 1bu 3,2(°bo.
100
2 Prozedu rale Progrummierung
j- z. i=2: -u 1.2, n. ' )+4u 2.2(0+ ' t u 3.2(11"""1b Ul. l (Il)+u V (n)
daraus folgt: -U2, 1' 0· 1) +4 U2.2(0+ I bu 2, 1In)
weil UJ .2,n- 1bu z} nb O und UI.2,n- 1bu 2, 1(n- 11(sy m.).
Verbesserung der Spa ftenwe ne
(Vorl
Schritt n+1 nach n+2):
j: 2.j= 1: . U2.01n-2)...4u 2,1(n-2LuU ,o-2bul .rln-l l +uJ.I(n-1 1
daraus folgt: 4 U2,I,n- 2)_UU (o- 2bu3.1(0-1}-0-2 we il uu ru l.I = I.
j:2.j=2: -u 2. 1(n- 21. 4 u2.2'0- 2).u2.3'0- 2bu l.in- H.-- u U ' n- l)
daraus folgt: -U2. 1(0- ;n +4 u 2.2(0- 2bu , 1In- II 2
we il u2J =UJ.2=O und " l.2=U2.1(sym.).
i=3. j =O: -u 3,- 1' 0'"21+4uJ.O' n- 2)_u 3. 1t e- 2bu z ,o, n- I)+14.0' 0- 1)
daraus folgt:
4u3,0' 0-21.2u3.1' 0- 2)= U4.0' n- 1)+ I weil U2.o= lu nd \13._I=u 3,1 (sym .).
i: 3, j =l : - 11.1.0(0+2) +4uJ, I(0" 2L u3,2(0"2l=U Z. l (n- l )+U 4,1(n-I\
daraus folgl: -U.l ,U1n+:!l+4 u.l , ](n"'2)"'U2. I(n...n we il1l 3.2"' U4.1"'O.
· 1l4._1(n'"2)+4 U4.o'n+2L u4, ](n+2)",u3.O( n"'])+U5.o' ll"' l) daraus folg t: 4 U4.0(1l"'2bu3,O(n...])
wei ! U4.1"'U5.0'='O un d 14 ._1"'U4.1 (sym.).
DUTCh Umstetlu ng ergeben sjch di e 10 lterationsgfeichungen: u
In+1) = ..!.. (2u (n ) + 1) 4.0 IS 3.1
2.2 Punktionen u
101
(n+1) - 4u ( n l 4.0
3.0
U (n+ ll = ...!... ( U., , (D) + 4 U., .,(n1 + 11 3.1 15 -.-.-
u, (n+2) = ...!... (4 u , In+1l + U (0 +1) + 2)
_.2
U 2.1
15
(nH) _ -
4
_.I
3.1
( n+ll (D+!l u 2.2 - u2.1
(nHI - I (4 (n+!) + (DH ) + 1) - 14 u Z.I u4 .0
U 3.1
(0+2) _ .. In +21 (0+11 - u 3.1 -u 2,1
U 3.0
~ U) .O(D+I)
U4.0(n +2) =
T ah fl lt 2-1 Suu ktogremm - Differenzcnapprc ximanon
Eingahe Startwe rte 101 114.0( 0 ) = 0 ; 113.0 (0 ) = 0; /1) .1 = 0; 112.1(0) = 0 ; 11 2. 2 101 = 0
n ue reuonsschriue (n + l) = - 1 ( 2 u (n l + 1) U4,0 15 a.r (n +1) .. (n+1) = U4.O Ul ,U Ul l ,
(n+n
I (nl 4 (n ) = - ( u22 + u30 +11 15 ' ,
II (n+]) - 4 u (nH I U (n) J.I - 3.0 1.1 Ul ,l U
(n+ ll
=
I (
4"
( n +2 ) = ~ ( 4U
2.1
15
( HI)
Ul,1
+
(11 ) U2.1
(o+]) + u
2.1
\ 11 +11 + 2 ) 3.1
\ n+2 1 .. (0+1) (0+1) - U2.1 U2,1 = U2,2
102
2 Prozedu rale Prograrnrnierun g
(0 +21 _
u J.!
-
U
=
( 0+ 2) 3.0
U
4 .0
~ (4
(0+1)
14
u 2.1
4
(n +2)
Ul.l
(n+21 _ .!. u - 4
3.0
+
(0+11 + 1l
u 4.O
- Ul.1
(n+1I
In+ l l
Das Progranun entba h in der Reihenfolge die lterarionsgleich ungen . F.s ist jedoc h darauf zu ac hten. w elc ber lterationswert in die j e w eilige Gleic hung emgef n. lch habe dies dUTC h die Var ieblenfolge u, v, w geke nnzeic hnet. Erst nac h Beendigung der beiden lterationsschr itte erfo lgt eine Verschiebu ng und ei n neuer Durchlauf kann beginnen. Cod e 2-2 Anwendunflshcispiel Partielle Differentialgleichung - Membrane 1* Mernbrane .cpp 0/
l i nc l ude II I t e r a t i onen fl oat f 4 0 ( fl o a t u31 ) {return 1 /1 5* (2* u 31 +1 ) ; } f l o a t f3 0 ( f loa t v4 0 ) {return 4*v4 0 ; }
f l oa t f l l ( f l oa t u22 . fl oat u3 0 ) (r e t ur n 1 /15 * {u21 +4 *u3 0+2 ) ;} fl oat f 2 1 ( f loa t v31, f l oa t u3 0 ) (return 4 *v 3l -u30 ; ) fl oat f 22 ( floa t v21, fl oat uz t t (re turn 1 / 4 * (v2l +u211 ;) fl oat fl oat fl o at fl oat
g22 g2 1 g31 9 40
( f loa t (float (float (float
v2 l, w22 , v2l, v 30 )
fl oat v 31 ) (r e t urn 1 /1 5* (4* v 21 +v 3 1+2 1; 1 fl oat v21 1 (return 4* w22 - v 2 1 ; ) fl oa t v4 0 ) (re turn 1 /14* (4* v 21 +v4 0+ 1 ) ; ) {r e t u r n 1 /4 *v30;}
int main ( I {
int i, lc; fl oa t da t a [ll ] [11]; fl oat u[5]; fl oa t v[5]; fl oa t w40, w30 ,w3l , w2l , w22; F IL E *puff e r; puffer = f op e n ("C : \ \ Temp\ \ Membr an .dat " , "w") ; II Sta r twe r te f or (i =O; i ()
L•
.I
>u
. -1
I
G ilt er
»u
• - IV
I OV
Kathodc Bild 2-12 Scbematischer Autbau emcr Elektroncnrohre
Brmiueln Sie dur ch die Anwe ndung des Operators die sich darau s erge berden Dilferenzen. Du rch Urnsrelle n und Einsetze n erg ebe n sich dara us ltera uo nsg leic hunge n. In die sen Gleichunge n wird di e AnoJenpannung vorgegeben und nachgeprn tt. ob d ie Gitt erspannung e.'TOlk r null ist.
106
2 Prozedurale Progrummierung
2.3 Param eter Paeam eterubergabe Nemen von Fun ktionsergumemen werden als im auue ren Block einer Funktio n deklariert betrachtet. Beispiel: Parametera bergabe v ol4
I~
t (l nt x l
int x ; IIF EHLER !
~til dem Aufruf einer Funktion werden in der Regel auch Para meter abergeben. Dabei wird ein zusatzhcher Spe icher (Funktionss tack) erzeugt. in den Kopien de r akruellen Parameter angelegt werde n. Nach Ver lassen de r Funktion w ird der Slac k wied er ge lt1schl (Ausnahme stausc he Variable).
Das Ande m einer globalen Var iablen aus eine r Fun ktion beraus wird als Se itene ffekt bez eichnet und kann enter Umstaode n zu verwirrenden Ergebnis sen Ilihren.
1 * Sei tenef fekt.epp
0'
' i n clud e < i ost r eam. h>
int x s Il g l o ba l int main II
1
e xter n i n t fl int yl; x: 9 ; cou t « x =9 ; cout -c
«
endl ;
(f( x} * f( 9ll -c
endl;
( f( 9) *!( x»
s ys tem ( " Pa us e ") ;
int f lint 1
y'
x - =9; r e t u r n y*y +l ;
Dieses Beispielliefert die Ausgabe :
I"
6 72 4
2.3 Parameter
107
Parameter lassen sic h in C++ per value, per pointer Oller pe r reference an Punkno nen ube rgeben. Die Entscheidung. wie ein Parame ter ube rgebe n wird. wird flir j eden einzel nen in der Para mererh ste geiro ffen: Die (Jbergabe als Wert dutch die Nennu ng der Variablen. die Dbergabe als Zeiger dureh den Adr essoperator zur Varia blen od er die Ube rgabe els Reterenz durch de n Referenzoperator zur Variablen.
Ca ll b)' va lue Wird ei n Funktion sparameter als w ert tper value) an eme Funktion ubetgeben. dan n wird eme Kopie der Variab len im Speicher (Slack) engelegt. Innerhal b der Fun ktio n kann der Inhalt der Kopie beliebig veranden werden. Der Programm ierer kann sicher sein. da ss mil Been digung der Funknon der Inhah des Origi nals nicht veran den wur de. COOt 2-& v ertauschung dcr Inhalte zweier inl-Variablen minds coli by }'(llue 1* c a l l ByVa l ue . cpp
0'
'inclu de vo i d swap (int a ,int b ) (
i nt trnp=a ; a=b; b =trnp; i nt mai nl) (
i n t a =l ; int b =9 ; swa pla, b); cout « " a: cout « " b :
« «
a « b «
endl ; e nd l ;
s ystem( "Pause");
Das Progmmm liefer!: [ b"': 19
Die Werle werde n also mcht vertausc ht. Das liegt da ran. dass mil dem Aufruf der Funktion s wap die Werte der v artable n in entsprechend lokale Var iable der Fun ktion kopiert werden. Die Vertausc hung finder nur unter den lokale n Variab len der Punkno n stan. Beim verjessen d er Funktion werden die lokalen Variab len 3 . b und tmp verworfen.
C all by pointer Das im vo rherigen r ail durchaus gewn nscbre Verhalten fllhrt dan n zu Problemen. wenn die Vertau schung auch fiir die rufende Funkt ion gelten 5011. denn die ge rufene Funktion ka nn
10K
2 Prozedurale Progrummierung
hochstens nur einen Ruckgabewert (mind s return) liefem. Die typische Losung ist. dass r ncht die werte an sich, sondem nur deren Adressen an die Funktion abergeben werden. COO t" 2 -~ v ertauschung dc r Inhalte zweicr im-Variablen minds call h)·pointer
, - Ca l l By Po i n t e r . cpp
0'
' inc l u d e v oid s wa pl i n t -a,int Ob I {
int tmp =-a; · a =· b ; - b =tmp ; I ,
int main () int a =l; int b =9 ; s wa p! &a , &bl; « cou t « "4 : cou t « "b: ° «
I,
•
«
b «
endl ; endl ;
s ys t em!" Pause - I ;
Das Prcgr arnrn liefert nun auch das gewu nschte Ergebnis:
Ca ll by refer ence C++ kennr noeh erne weitere Form der Paramererabergabe . die Ilbe rgabe per reference. Dies wird dadurch gekennzeichnet. dass dem Funktionsparameter em & vorangestellt wird. In diesem Zusammenhang ist der Operator nicht mil dem Adressoperator & zu verwechse!n. Das Testbelsplel bekommt dadurch die nachstehende Form. CUdl' 2-6 Vcrtuuschung dcr lnhaltc zwc icr int-vanablcn mmcls call hy ref erence
, - Ca l l By Re f e r e n c e . c p p
0'
' i n c l u d e v oid s wa p( i n t 'a.int 'b l {
I,
int tmp =4 ; a=b ; b:tmp ;
2.3 Parameter
109
int main () {
int a =l; int b =9 ; SWekl a r al ion cn Beve r ein Beze ichner in einem C++ Progra mm be nutzt .....erden karin, muss er dekla riert .....erde n. FUr ein fache Daten typen wurde dies bereirs beschrieben. Erne Dek larano n teilt dem Comp iler mit. auf .....elc he A n von Entil! t sich der Name be ziebt. Beispi ele: Dekla ranonen und ln itialisieru ngen c ha r z ; i n t cou n t = 5 ; c onst d ouble p i 3.1 4159265 ; extern i nt f ehle r ; cons t c ha r - j a h r esze i t l l (~ Fruh l i ng~.~S omme r·.· H e rbs t·
=
=
.· W i n t e r ·) ;
Deklarationen assoziieren nicht nu r einen Typ m it einem Namen, sie definieren auch eine Ent itlit ffir den Namen. aufden sie sich beziehen. Eine Deklaration besteht aus vier Te ilen : Einem op tionalen Spezifizierer, einem Bas istyp. einem Dek larator und einem optionalen lnitialisierer. :-.1it Ausnahme vo n Funktionen und Namensbereichsdefinitionen wird ein Deklaratoe m it ei nem Semiko lon beendet. Beispiel : Deklara tion
Hier ist de r Basistyp char. der Deklarator " Formenl] und der Initialisalor = 1. .. 1. Ein Spezifizierer ist ein Schlilsselwort wie er.....a virtual oder extern. das ein Nic hr-Typ-Aunbu t filr das Deklarierte spez if iziert. Ein Deklarator ist aus eiuem Namen und op uo nale n Dek laratoroperator en zusammenge serzr. Die haufigsten sind in der nachfolgenden Ta belle aufgeHihrt. T llbt'lle 2-3 Dcklaratorcn
Deklarat oroperator
Bezeichnung
Typ
•
Zeiger
Praflx
"c onst
konstanrer Zeiger
Praflx
&
Referent:
Prafix
[]
Feld
Postfix
()
Funktion
Postfix
Die Postfixoperatoren binde n starker als die Pranxope raroren.
Dekta r jcrcn mehr ere r Xa men Es ist megfich, mehrere Namen in einer einzige n Deklarati on zu dek lari eren.
118
2 Prozedurale Progrummie rung
Beispie le: Deklarationen von Variab len
l
i n t x ,y ; c h a r a,b , c ;
GUll igkcibbcrclchc Eine Deklaration fiihn einen Namen in einen Galugkensbereich ein. Der Name kan n so mu in einern bes um rmen Te il des Progrnmms be nutzt werde n. Fur ein en in einer Funktion deklari erten Namen (o ft als lokal er Name bezeic hnet) ersrreckt sich der G altigkeitsbereich vom Punk! der Deklaration bis ru m Ende des Blocks. in dem d ie Deklaration auflrar. Ein Bloc k ist ein von eine m Paar gescbweifter Klammem I } begrenzter Codebereich .
Ein Name wird als global bezeichnet, wenn er auBerhalb einer Funktion. etner Klasse oder eines Namensbe reicbs deli niert vvird. Der Giiltigkeitsbereich eines globalen Namens erstreckt
sich vom Punkl seiner Deklaranon his zum Ende der Derei. in der er deklanert wurde. Die Deklaration eines Name ns in einem Block kann eme Deklararion in einem umsc blieuenden Bloc k ode r einen globa ten Namen verdec ken. Ein Name kann in einem Block so definiert werden, dass er sich auf eine andere Eruitat bezieht. Nach v erlassen des Block s erhah de r Name seine vorberige Bedeutung zurack. C OOt' 2·1 0 Dcmoprogremm - globele und lokale Variable
I - Gl obalLokal .cpp 0/
GUl t i gke i tsber e iche von Variablen
. include int x '" 9 ; vo i d
II
globales x
e()
{
i nt x; x"'l ; c out «
Il loka l e s x verdeckt globales x II Zuwe isung an l okal e s x "x . L '" " « x « e ndl ;
int X ; Ilv e r de c k t ers tes l okal e s x x =2 ; I I Zuwe i s ung a n zwe i tes l okal e s x c ou t « "x .V = " « x « e ndl ; cou t « x= 3; c ou t «
"x. L '" " « x « e ndl ; // Zuwe i s ung an e rs t e s lokales "x.L = " « x « e nd l ;
x
i nt main ( l 1 t ll ;
int - p = &X ; Iln immt die Adresse des glohalen x c out « . p = • « - p « e ndl ; s ys t em!" Pa u s e - ) ;
2.4 Deklararionen und Gultigkeirsberelche x _L x _U x _L
~ ~ ~
x_L p
~
9
~
119
1
2
1
3
DrUcken Sle e m e belie b i ge Til lite • .
•
lJild 2-16 Programm ausga bc globale und lokalc Vari able >
Ein verdeckt g lobaler Name kann durch den Bereichsoperaror (::) sichtbar gemacbt werden. C ode 2-11 Dcmoprogramm - \·erded..1 gjobale Variabl e
I '" Ve rdee:k.tGlobal.epp Ve rdec:k.t qlobale Variable
0'
' i nc l u de i nt x :: 9;
q l obal es x
II
void f lJ (
i nt x::l; Il lo:k.a l e s x c ou t « · x . L : • « X :: x : 2 ; II Zuwe i s un q x= 3 ; II Zuwe i s ung cou t « "x . L :: " « x
verdec:k.t g loba l es x « endl ; an globales x an l okales x « endl ;
int mai n () f (J ;
int * p :: &x ; Ii n i mmt d i e Adres s e des globa len x cou t « "p :: " « *p « e nd l; s ys tem( "Pause " ) ;
x. L x _U
x. L x. L p
~
~ ~
~ ~
9
1 2 1
3
DrUc ken S ie ei ne be l iebige Ta s t e
_
BUd 2-17 Progranunausga be - vcrdcc kt glo balc Va riable
Es ist auch moglich. mit einem einzigen Namen ohne Benutzung des Bereicbs-Operetors (::) zwei verschiedene Obiekte in einem Block anzusprechen.
120
2 Prozedurale Progrummierung
CoM 2-12 vcrsc hicdcnc Objcktc 1* Ve rsch i e de ne .cpp
.,
Vers chiedene Ob j e k t e
' i nclude i ntx =9 ;
globales x:
II
v oid f II {
int y =x ; ttbenu t z t globales x : y=9 cou t « · y. L :: • « X « e n d l ; x=22 ; II Zuwe i s ung an l ok a l e s x y=x; l l benu t z t l okales x : y =22 « x « endl ; c out « · x. L " c out -c · y. L =' • « x « endl ;
int maoin (J (
f n ;
int * p
cou t «
= &>0: ; Il nimmt .p = • « *p
d ie Adre s se des globalen x «
endl ;
s y s t em(· Pau se " ) ;
y. L
x. L y. L p
-
~ ~
~
22
9
22 22
DrUc ke n S 1O' e r ne bel u ,hlg e Ta " t e • • •
Bild 2- IM Pr ogrammausgabe - verschicdcne Dbjck re
xamcusruumc Ein Namensraum (en gl. namespace) is! ein Gttltigkeitsbereich. in dem belie bige Objekte w ie Variablen , Funktionen und andere Strukturen deklarien werden konnen. Aile Bibliorheken der Standard Temp late Librar y (ST L) sind zum Name nsraum s td zusammengefass t und werden dur ch die using-Anweisung Syntax : Definition des Standard-Namensraums
I using
n arne s p a c e s t d;
deklariert, wie berelts in ein igen Beispiele n gezeigt . Ein Namensraum kan n deklari en werden und Obj ekte in ihm werden durch den Bereich s-Operator (::) angesproc hen. Der HereichsOperator wird auch als Sco pe-Ope rator bezeichnet.
2.4 Deklararionen und Gultigkeirsberelche
121
Cod l.' 2-13 Dcmoprogra mm - Narncnsranmc 1* Namensraeume . c pp Zeigt die Wirkung v on Namens r aumen "/
' i n clu d e < ios t r e am. h > II Deklaration v on Namens r aum A namespace A
1
int i = S ; int f l i n t x ) {r e t u r n 2 *x+l ; }
II Deklaratio n v on Namensraum 8 namespace 8
1
=
i nt i 6; i nt f lint x l {r e t u r n 2 *x ;}
i n t main 11 (
cou t c out c o ut c out
« « « «
"Der "Der "Der "Der
We r t We r t We r t We r t
v on v on v on v on
i i f f
in in lJ ) (4 )
A, B,
« «
A; 8; « in A, in B, " « " "
;i « ;i « A;; f B;; f
endl ; endl; ( 3 ) « endl ; (4 ) « endl ;
system l " Pause " ) ;
De r Ue t"t vQn 1 in A : 5 Der Ue t"t v on 1 in B: (, Der Wert VQ n f (l ) In A: 7 De r Wet"t VQ n f (4 ) In B: 8 Drll(: ke n S l e e l ne beliebig e La s t e
WId 2-19 Programmausgabc - Narncnsranmc
Namensrnume kormen auch gesc hachtelt deklarien werden. Co de 2-14 Dcmoprogramm -, gcschachtelrc Nnmcnsraumc 1* Geschachtel t.cpp Gesc hac htelte Narnen sr~ume "/
' i n c l ud e < i o s t r e am . h > IIDek l a r a t i o n de r Namensra e ume namespace A {
• __
122
2 Prozedurale Progrummierung
.
int i
5,
narnespa ce B (i n t
int mai n
1
i ot cou t cou t cou t
i
()
« « «
i • 6;)
,,
" De r We r t von i i n rnai n : " De r We :r- t von « i n A' " De r We r t von i i n B, «
,
system l ·Pause ~ l
.
«
i «
A : :i « A : : 8:: i
endl ; endl ; « endl ;
;
Der Wer t von). J.O _in ; 4 De r \Je r t v on i i n A: 5 Der Wert v on ). J.O B: 6 Drlicken Sle e i ne bel i ebige Ta st e . . •
Hild 2-20 Pregranjmausgabe - gescbachtche Narrensrsume
Die S peichc r"k la ~ ~c a utomat ic Fur lokale Variab le und Funktionsargu mente wild auto matisch Speic herplatz reservien . :\.til jedem Emsneg in cine Funktion od er einen Block l I be ko mmen d iese eigene Kop ien. Will ma n diesen Sac hverhalt ex plixit angebe n. so gibt es dazu das (liberOussige) Schlassetwo n QI/ t o . Beispiel:
II Fo l g e nde Deklarationen haben die gleiche Bedeutung i ot i " 5 ; au t o i n t i = 5;
Aullerhalb ihres Bloc ks sind automatic vereinbarte Variable unsic htbar. Cude 2-1!' Dcmoprogmmm -cautoma tic vcreinbartc Variable
; * Au t omat i c. cpp Au t omat i c vereinbar te Va r i a b le "/
' i nc l ude int main () auto int i = 4 ;
1
int i = 5 ; c out « "Der We r t v on i : " «
c out «
"Der We r t von i: " «
s ys t em!" Pa u s e - ) ;
i «
i «
endl ;
endl;
2.4 Deklararion en und Gultigkeirsbe relche
123
Der Wert von 1: 5 Der Wert von i: 4 Dru l:ken S le e In e be liebig e La s t e
lIild 2-21 Ptogrammausgabe -
O//I,m/ot ic
_
vcrembarte Variable
Die Speic hcrklauc §Ialic 1m Gegensarz zu r Speic berkjasse automatic behalt eme stausche Variable ihren Wert so lange. h is sie eine neue Wenzu.....eisu ng erhalt. Wird eine statische Var iable am Anfang nut definiert und nic ht de klariert. so erh.lilt sic vom Comp iler automausc b des Nullelement des Datent yps. Codt' 2-16 Demopeogramm - slatk' verembane Variable
' " Static . cpp St a t ic vereinbarte Var iable
.,
' include int mai n ( I i nt Swrrne( int. x t . f or lint i=1 ; i using n amespa c e s td; const i n t n= 4; v oid Au s g a be (doubl e al l [nl l {
int L, f • f or (ln t
i =O;i'x
(2.24)
ersetzt. \Vlihlt man tJ.x genugend klein. komm t man der analytischen Losung beliebi g nahe . Der Nachteil w ird aus der Darst ellung eben falls recht deuthch. :\-1il zunebmende n Schritten enue m r sich die numerische Lc sung immer mehr von de r anal ytisc hen. Ein genaueres Verfahren ist z. B. das Runge-Ku lta-Verfahren . Die Betrachtun g des Kra flegleichgewichts an beweglichen Massenpunkten fiihrt unmit telb ar zu einer Differenualgleic hung . Db d ie-s nun ein fache Bewegungsmo delle wie z. B. Rotationen sind ode r komplexere Modell e wie r , B. Scbw ingungssysteme . Der Ande-rung des Bewegungszustandes serzt der Massenp unkt seine trage Masse entgegen
f = -m · a .
(2.25)
Die momentane Beschle unigung a ergibt sich als Differenrialquouent
f1 = dv =v' . dt
(2.26)
so dass di e ersre Anwendung des Euler-Cauc hy-Ve rfahrens die wahren d tier Zeiteinheit dt au flretende Ge scbwindigkeitsande rung dv liefert
F
\' = - - t.
(2.27)
In
Fur d ie momeruane Gesc hwmdig ken gi lt weiterhin der Differentialquotient
v = ds = s ' dt
(2 .28)
2.5 Zeiger auf Funktionen
135
so dass die zweite Anwendung des Euler-Cauchy-Verfahrens den wahrend der Zeiteinheit dl zurnckgelegren Weg ds annahernd beschreibt
s = v · t.
(2.29)
Die rnomenrane Geschwind igkeit wird dabei aus Einfachheitsgnlnden rur die Berechnung durch die Anfangsgescbwindigkeit des berrachteten Zeitmtervafls ersetzt. Als kc nkretes Beispiel soli nachfolgend eine mecbanische Schwingung dienen. Umer einer mechanischen Schwmgung versret n man die periodtsche Bewegung emer Masse um eme Miltellage. Den einfachsten Fall bildet ejn Feder-Masse-System. Bei der Bewegung finder ein standiger beergieeusrauscb zwischen potentieller und kinetischer Energie stan. Die potentielle Energiedifferenx wird auch a ls Federenergie bezeic hnet. Die bei der Bewegung umgesetzte Wermeenergie dUTCh innere Reibcng in der Feder soli unberacksicbugt bleiben. wirken auf ein schwingendes System keine li.uBeren Krafte, bezeichnet man den Bewegungsvorgang als freie Scbwingung. andemfa lls als erzwungene Schwingung.
Hi1d 2-29 Freic gedamp ttc Scbwing ung
Die bei der reaten Schwingung stets auftretende widersr endskratt. Bewegung im Medium und Reibungskrafl (Stoke s' sche Reibung, im Gegensatz zur Coulom b' schen oder Newton' schen Reibung), etc.. soil in erster Naherung als geschwindigkeitsproportional angesehen werden. Bei der Betrachtung einer freien gednmpften Schwingung wirkt zum Zeitpunkt I an der Masse die Federkrafl (2.30)
mit der Federkonstante f. Ftlr die Dampfungskraft folgt unter Einfubrung der Dampfungskonstante n dai s MaB flir d ie Damp fungsintensnar r~
= 2 · m· d ·s
(2.31)
Nach dem d 'Alembertschen Prinxip folgt
m -s = - f ' 5- 2' m -d -s .
(2.32)
13.
2 Prozedurale Programmierung
Umgestellt dv r - = - - s - 2 ·d · \l dl
12.33)
m
Nach dem Euler -Cauchy-Verfabren ersetzt man den in d er G leichu ng (2.33 ) entbanenen Different ialq uoti enten durch einen Di lTerenzenq uotienten .6. v
- { ~ !> + 2dVrl .
(2.34)
fill hinreichend kle ine Differenzen III be kornrnr man so eine engenaherte Losu ng 6 \'. Ta bl"ile 2-9 SlnJL.logra mm - Simulation einer freien gedampfte n Scbwingung
Emgabe m, f d. SO. Vo. I(). dt •
~
Solange I < t.:
!iv-, = { .!..s m ' + -"dv. -1
}t.
v. = v._1 +.6.v,
.
as, = v . · J-I 5 , = S;_I
+& ,
t , = 1._1 + 6.t
A usg abe s.. Vi. Ii Cod e 2-20 Anwc ndungsbcispicl Dctermin istische Simulation - Freic gcdampftc Schwingung
'* Das Freie Schwi ngung . cpp Pr og r amm s i mu l i e r t
den Bewe gu ng s verla u f e iner freie n ged~ f t en Sc hwi ngung
"/
. i nc l ude u s i ng narne s pace s t d ; int mai n () 1
dou b l e m, f. d, d ouble s. v, t , d t , d s , dv , t e;
FI LE *p uff e r ; p uf f er = f op e n ( "C : \ \ Temp \ \ Schwingun g . d at - , - w- ) ;
II Eingaben c ou t « "Masse m [kg ) = "; c i n » m; c ou t « "Fe de r ko n s t a n t e f [ kg / s"2j cin » f ;
.;
2.5 Zeig er auf Funktionen c o ut « cin » cou t « cin » c o ut « cin » cou t « cin » cou t « c in » cou t « cin »
137
= ";
"D~pfung skonstante d il ls ) d; "Aus ga n gspos i t ion s O [m) = "; s, "Aus g a n gsg eschwi n d i g k e i t v O [m/ sl v; "Aus g a n gs z e i t t [51 t ; "Sc h r i.t t we i.t e dt LeJ .; dt ; " End ze i t te I s) te;
=~;
= .;
= •.
II Analyse do 1 d v = -( f / m-s+2 - d - v) - d t; v = v+dv ; d s = v-dt ; s s +ds; t t+dt; c o u t « t « v « s « endl ; II Ausgabe in eine Datei
= =
fprintf (puffer. ~'4 .1e \t\4 .1e \t\4.1e\n · .
t ,
v, sl :
I while ( t < t el ; f clo se (puffer ) : s ys t em(" Pa use") ;
Die nachfolgenden Beispie lsdaten d ienen zur Uberprufung des korrekten Programm ablaufs. l1ils s e I'l [kg 1 ~ S8 Federkon s t an t e f [kg / s ~ 21 ~ 88 Dih"pfung skon stilnt e d Lt zs I ~ 8.4 Aus g an g spo sition s 8 [I'll ~ - S Aus g angsge schwindigkeit u8 rA/ S] Aus g iln g s zeit t Ls I ~ 8 S c h r i tt we i t e dt Ls 1 ~ 8 .1 End z eit ee Ls I ~ 10
BUd 2-30 Hcispicldatcn ciner frcicn gcdampftcn Schwingung
Bild 2-3 1 \'-1 Diagramm der Beispiejdaten
a
138
2 Prozedurale Programmierun g
I."" .
,-~ t---~--------- ........ J . -- ~
- .
... ..... , ~
..,
......- +-
, --
. _~
11 · / -= = = = ~
... _ _
d
./-
Kild 2·]2 s-t Diagramm oc r Beispid dalcn
[l b ungen Ersetzen Sie die Bestimmung der inkrementellen weganderung durch emen Funkno nsaufru f etwa in der form : double ( * f SI
(dou b l e, d ouble, double, d ouble , d ouble ) ;
II f r e i e gedAmpfte Sch wi n qung d ouble fFGS (d o ubl e L d oubl e m, d ouble s , d ouble d . d ouble v i return { f / m*s +2 *d *v ); II Ana l y s e fS do
=
f FG S ;
1
dv: - f S lf,m,s, d,v ) *dt; v = v +dv ;
ds = v *dt; s = a -cs . t
'" t +dt; t
« v « s « endI ; II Aus ga be in e ine Datei fprintf (puff er , "M.le \ t% 4. 1e \ t%4. 1e \ n " , c • v , 5); l-__~)~wh i l e ( t< te); c out «
Dadur ch sind Sit' in J eT Lege. unterschiedliche Schwingungsformen fur einen Berechnungsablauf zu wahlen. So is! die Annahme eine r Iinearen Federkenn linie nicht imrner ausreichend ge nau. In Ff = f' 5( I+ C'5
2)
(2.35)
uberlage rt eine kcbische Parabel die lineare Federkennlinie. Die Dlimpfungskran 15sst sich auch als New ton' scbe Reibung. also dem Q uadrat der Geschwindig keit proportio nal ansetzen:
,
F =c ' sgn( \I) ' \l2 Schwingungen kcnn en auch dUTCh rotierende Massen erzeugt werden.
(2 .36)
2.5 Zeiger auf'Fun ktionen
139
f
ni l r M
,
m, rot r ~+_l.-
d m
BUd 2-33 Er"wlIn1!cne SchwingWig dUTCh eine rotierende Masse
Die im Abstand r auBerha lb des Drehpc nktes mit dec Win ke jge schwindigkeit (Il rot jeren de Mas se rot hal in Schwingu ngsric hiung den Ffiehkraftanteil
F. = mr ' r · (I)l . 5in((,)· t]
(2.37)
Der Ansatz gesrahe t sich wie zuvor mit m s = - f · s - 2 · ( m + m.} -d - v - m l . r . (Ill · sin((I) · r]. wobei m d ie av
~tasse
={ :
(2 .38)
m r bei nhaltet. Es folgt we iter
s + 2dv - : ; rol: sin(Cl)I)ft.
(2 .39)
Diese Gleichu ng ist Hir ein e konstante Wmkelgeschwindigke u ausgeleg t. Anso nsren muss der Algorithmus ein e zusa tzhc he G leichung fI) = flt) bestimrnen. Ein weiterer An wendungsfal l isr die erzw ungene Sc hwingu ng mil rotierend er und osxilfierender Masse , wie sie in Hild 2-34 dargestellt is t. Als Ansatz betrac hten wir da rin ein en idealis ierlen Schub kurbelt rieb . Die vorhandenen Massenkrs tte fhr rotierende und os zillierende Massen werde n auc h als Massen krafte erster und zweiter Ordnung bezeic hne r. l hr Anteil in Schwingungsebene betragt fllr die Massen kraft erster Ord nu ng ang enahert Fl = ml · r. ml. cos('m' t )
(2.40 )
und Hir d ie Massenk raft zwe uer Ordnung FII = mj ·r ·Cij"" ·- cOS·' ((I) · t)
1
(2.41)
140
2 Prozedu rale Prograrnrnierung
(j)/
d
lI ild 1-).1 Er,lwUQ1!'-'TIe Sc h\loingung d urcb rotierende lIDdos zillierend e Massen
Die Dilfe renualgleichung der Bewe gung lautet
(
'(
"
ms.. = - f ' 5 + 2· m ·d ' v - ml -r ' f1) - cos(w t )- , cos· (Cr)' t]
))
(2.42)
Aus d ieser lenet sic h wied er d ie nachfolgende Gescbwindigkeitsand erun g ab
.1\1 = - (
£
s + 2dv- :: ",,2 (cos(mt)- f cos2 «(1)1»))..11
( 2.43)
Untersuchen Sie zum Schluss noch den fa ll, da ss d ie Federmasse mit beracksic bug t wird, Se tzen Sie aile die se Schwingu ngsfonn en als Funktionen ein und schaffen Sie eine Aus wahlmegl ichkeit.
2.0 Callb ack-Funktionen
141
2.6 Callback- Funktionen Eine Callback-Fimkrion nen m man eine Fun ktion, die eine r anderen Funktion als Parameter nbergebe n wird, und von dies er dann aufgerufen wird . Das er laubt es, Funkuonen atlg ernein zu definieren und erst beim Aufrufen de r Fun krion durch Anga be der Ca llback-fu nklion d ie Handlungsweise gen au zu besnmmen. Hauf'ig wird auch die als Ca llbac k benutzte Funkuon nicht fest de finiert. sonde m wird als so beze jchnere anonyme Funk tion zur Laufzeit definiert. Hier ein kurzes Beispiel rUT die Verweedung von Callback-Funktionen. Em Integer-Feld so li auf unterschiedliche Weise sorti ert werden. Dazu mussen zwei Werle in eme r Funktion rrge ndwie miteinand er verg bcben werde n. Beispiel; Ein Feld mil n Elememen soli ur uersc hied lich sortiert werde n int all = {O, 11 , 2 3 . 9 , 34 , 5 ,7. 2 8, 12, 9, 13 , 15} ; Fnr di e So nierung muss ein Vergleich zw ischen zwe i Felde lemente n durchgeftrhrt werden. Beispiel: Allgemeine Fonn einer Vergjeichsfunkti on
I Ve r g l
( i n t: 6[iJ , int: 6[jJ I
Diese wird in einer Sortierfunktio n. quasi als Platzhalt er, eingesetzt. Beispiel: Soru erfu nknon void Sort_a (CompFunc Vergl ) { int: rn, t:; int Anz ; Anz = s i zeof (a l / s i zeof( i n tl ; f or ( i nt i=O ; i
endl ;
s y s t em I " Pa use-) ;
Beispiel: Das Programm liefert diese Ausgabe auf auf au f au f auf auf auf auf
dem dem dem d em d em d em dem dem
S t ac k: S t ac k: S t ac k: S t ac k: S t ac k: S t ack: S t ack: S t ack:
8 7 6 5 4 3 2 1
A n\," c nd u n g:~bci~p icl :
Devja tlon sm om ent - Spannung dUTC h ni ehkrafte
Bei rotierenden Scheiben gjeicher Dicke wird on mil einer gleichmliBig tiber den ganzen Ouerschnitt verteihen Spannung gerecbnet. Ob d ies falsch iSI. werden wir nach folgend unrersuchen. Hiehkra fte bewirken in einer Scheibe Spannungen in tangentialer und radia ter Richtung.
•
BUd 3-2 Flichkra flspam umge n in cincr rorierendcn Sche ibe
3.1 :vIod ule
155
D ie umfangreiche Ableitung der Spannungsfonneln mochte ich mir an dieser Stelle ersparen und gleic h die Formeln fUr eine n beliebig en Rad ius ne rmen. Die Ta ng entia lspa nnung is!
0, =
'[
(
,
,
,
')
c -r--
(3+ v) r; +1;- + -"',+ 9. 8 1-10" · 8 r- (1)-
P
,
][] N
- (l+ 3v)-r- - -, mm
(3 . 1)
(3. 2 )
Darin s ind p d ie Dic hte mil kg/mm ! und v die Pois sonza hl des Mate rials. COOl' 3-& OcUanalion der Klasse Schei be
1* Sch e i be.cc Dieses Modulelement dek lariert die Schn i t ts t e l l e n ( I n t e r f a c e) einer r otierenden Sch e i be ./
'include - Sc h e i be . hd ouble sc heibe;;Si~ T ( d o ubl e , d ouble, d ouble , d ouble ) ; d ouble sch e i be; ; S i ~ R (doubl e, d ouble , d ouble , d ouble );
Cude 3-5 Dd inilinn der Klasse Schei be 1* s c h e i be. h Dieses Module lemen t (Header ) defi niert die I mplement i erun g s s c h n i t t s t e l l e
./
' i f n d e f SCHEI BE_H ' d e f i n e SCHEI BE_H namespace sch e i be {
do uble p ::O .0078S; do uble v =O. 3; do uble aI, a2, a 3, a 4, a s , a6 ; d ouble SigmaT (dou b l e w, double ra, double ri, d ouble r l {
al :: a - v . a2 :: ra - ra +ri -ri; a3 :;: ra -ra -ri -ri ; a4 l +3 -v ; as :: p /9 81*w*w/8 ; a6:: a s* ( al - ( a2 +a 3 /r / r l -a4 *r *r l ; return a 6 ;
156
3 Modulure Programrruerung
doub l e SigmaR (doubl e w, d oubl e c a , double r i , double r )
1
a l ::: a -v .
42 :: r a*ra+ri *ri ; 43 r a* r a* r i* r i ; 44 p /9 81 *w·w/ S*al ; 46 :: 44 * (a 2 - a 3/ r/ r - r *rl ; return at>;
.endi f
/ * Schei be. cpp
Dieses Programm bestLmmt d i e Sp a nnungsv e r l Au f e in einer r otierenden Sche i be du rch Pl i e hk r &f t e "/
. i nc l ude . inc l ude · Sc he i be . c e · int mai n ( )
1
d ouble w :: 20 9; d ouble r '
d ouble ra :: 2 0 ; d o uble r i :: 0. 5; FILE · p u f f er ; pu f fer = f open ( " C: \ \Ternp \ \Scheibe.da t ", ·w ");
f o r (r=O . 5 ; r< 20 . 1 ; r= r +O. Il 1
f p rin t f (pu f f er , " ' 2 . lf \ t %3 . lf \ t %3 . lf \ n " , r-, sche i b e : :S igmaT(w , ra, ri, r) , sch e i b e : : S igmaR(w , r a , ri , r ) );
s ys tem ( " Paus e " ) ;
Das Programm schreibt die Spannungsdaten in eine Textdatei. Diese wird enschlieuend Excel geladen lind d ie Daten werden als Diagramm (Hild 3-3) dargesrellt.
In
Db ungen
Berechnen Sie aus der radialen und tangentialen Spannung eine Vergleichsspannnng und bestimrnen Sie den Maximat wen mit dem zugehc rigen Radius. Beurteilen Sie durc h Variation welchen Einnu.ss die Radien auf den Sper mungsvertacf haben.
3.1
157
~ odu l e
'" '" .~ ~
.. ~
s t r u c t GeoFo rm
I,
std : : string Name ; s t d:: s t r i ng Bes chreibung ; t l oa t U1ntang ; fl oat Inha lt ;
s t ruc t Krei s
)
,
Geo Form Krei s Form; fl oat Radius ; fl oat Pi ;
int main (I Kreis Krei sl ; Kreisl .Pi : 3 .l4l5926 ; Kreisl .Radius:2 0 ; Kreisl .Krei sForm.Name: "Kre is · ; c out « cou t « c out «
Krei sl .Krei sForm .Name « endl ; · I nha l t : • « Kreisl.Radius *Kreisl _Radius *Krei sl . Pi ; endl ;
Ij ber den ersten Zugriffsoperator wird auf d ie Variable KreisFonn zugegriffen. die Bestandteil des Datentyps Kreis ist. Nachde m Kreisl-orm ihrerseits eine Sttuk tur ist, wird uber einen zweiten Zug riffsope rato r au f Name zugegegriffen. der als Bestandteil innerhalb der Struktur GeoFor m definiert isl. Beachten Sie. dass die Verwen dung yon ben utzerdefln ierten Datentypen wie Strukturen voraussetzt. dass vor dem Anlegen der Variab le der Dat entyp m i l .~truct deli niert isl.
Pseuduzufallsza hlen A uf Rechenanlagen lassen sich Pseudozu fallsza hlen miuels Hardware durch lineare Schieberegister mit Ruckfohru ng oder durch Softwareprozeduren erzeugen, Jede gllngige Programmiersprache besitzt Prozeduren zu de ren Erzeugung. Ais Pseudozufallszahlen werde n sie ZUT Unterscheid ung zu echren Zufallsv:.ahlen bezeichnet. Pseudozufallsza hlen besitze n trotz ihrer Zufallserzeugu ng eine Eigenscbaft. d ie als Gesetz der grollen Zahl bek annt iSI. Erzeugt man hinreichend viele Pseudozufallsza hlen auf einem meisl vorgegebe nen lntervell. da nn befinde t sie sich don g leich verteilt. D3S heilll. egal in wie vie le Teile man das lrnervallteilt, es befindet sich immer d ie g leiche Anza hl von Pseudozufalls...a hlen m jedem Teihnrervall.
3.2 Strukruren
161
A nwcnd ungsbcls plcl: Ftach enbcstlmmung - vtcntc C arlo :\Ict hodc D ie G leichverteilung der Pseudozufallszah len nutzt man in viele n Bereichen, in denen sich Verhaltn isse besnm men lassen . Dieses Verfahren w ird als Monte-Carlo-Methode bezeichnet. Sie wird von der numerischen Integration bis hin zur probabihsuschen Simulation verwe ndet. Es iSI der Fllicheninhalt des dargestellt en Blecht eils gesucht. Dafur gibt es zwar eine Forme l. doch lasst sich der Inhalt auch mit Pse udozu tallsza hlen besum men.
I' • __ ;'--_~C-_---,\
6;1
- . -1-- - ---,- - - -1-----"x
BUd .1-1 Fli che cines B1echteils
Der nachfolgend dargesrellre Algorilhmus erzeugt zu falls bedingt Punkte innerhalb des Kreises. Liegt ein Punkt in der Flliche des Hlechteils . sprichr man von einem sogenannten Treffer. Geht man von einer Gleichven eilung aus. dann entspricht das Verhliltnis von Trelfer zur Gesa mrpunktza hl dem Verhllitnis von Blechteilfl ache zur Kreisflache. Taht'lle J·2 Strukrogramm - Monte-Carlo-Methode Eingabe der Anzahl Punkte n Randomize z= ,,~)
m=O A= !60* 160 i= !( l)n x=Rand(. 80.-+ 80) y= Rand(· 80," 80) lsi Sqr(x* x +y*y) 'include lnt mai n I ) (
d ouble x, y , 2 . AX, AB;
l nt n , m, Ma x ;
c ou t « "Anza h l Punkte :: ein » Max; n:O; m:O; s rand(ti me(NULL»
M .
; IIGenerato r I ni ti alisierung
do {
II RAND MAX Ma x~ malwe r t e ine r Pseudozufallszahl x - 80 +r a n d() * 1 6 0/ RAND_ MAX ; y = -80 +r a n d() * 1 60/RAND_ MAX ; z = sqrt {x ·x +y ·y }; i f ( zO
Nein J.
Ja
Repararurwa hrscbeinliehkeit z2""Rand()
1st eine Maschine rep arierr? 72< =Y
Nein
Ja
w-w- I
J.
Ausgabe r, w
Das nachfolgende Programm nutzt ein e Datenstrukr ur . urn Maschinen m il unterschiedlic hen Ausfatl- und Repara turw ahrs cheinlic bkeiten als Mod ell ZlI nutzen. Sie sagen aus. m it we lcher Wahrsch einhchkeit (0 ~ 0 %; 1 ~ 100 % ) das Ereignis im Zeitintervall auf'triu. DeTZustand der Wan eschla nge wird in ein e temporare Datei gesc hrieben. so class ein e Grafi k hinterher eine bessere Aussage ermoglichr. Code 3·9 Anwcndungsbcispict Prc bubilistischc Simulation - wa ncschlangc 1* Wa r t esch l a nge .cpp
Da s Programm s i mu l i e r t eine Ma s chi nenwa rt un g
'inc l ude 'inc l ude 'inc l ude f include
<s t r i ng>
s t r uc t Ma s c h i ne
3.2 Suukruren
)
,
165
s t d : :s t r i n g Name ; s t d: :s t r i n g ne s c . II Beschreibung fl oat aw ; /I Aus fallwahrschei nlichkeit fl oat rw; /I Reparaturwahrs c hei nli chkei t int ws; /I Wa r t e s c h l a n g e (O=n e i n / l =j a l
II Be legung d e r S t ruk t u r d a t e n v oid Daten (Masch i ne Pro ll )
int i ; f or li=0; i< 10; i ++) Pro li ].ws Pro I O) ProI O) ProI O] ProI O]
.Name .Des c .aw = .rw =
= "Masch i n e l"; = " Dr e hban k A" ; 0. 1; 0. 18;
Pro Pro Pro Pro
ll] ll] ll ] ll ]
. Name . Des c .aw = .rw =
= "Masch i n e2" ; = " Dr e hban k S " ; 0.2 1; 0.23;
Pro[ 2] Pro[ 21 Pro [21 Pro [21
.Name .Des c .aw = .rw =
= "Masc h i n e3"; = " Dr e hba n k C"; 0. 17; 0. 19;
0;
Pro[3 1. Name = "Masch i n e 4"; Pro [ 31 .Desc = "Bo h rmasch i n e A" ; Pro [ 31 .aw = 0 .14 ; Pro[ 3) .rw = 0 .1 4 ; Pro[4) Pro[ 4] Pr o[ 4] Pr o[ 4]
. Name .pes c . 4W = .rw =
= "Masch i n e S"; = " Boh rmasch i n e B" ; 0 . 19 ; 0 . 16 ;
Prof S ] ProfS] ProfS] Pr o [ S ]
. Name . nesc .aw = . rw =
= "Maschine6"; = "Hobelb an k A"; 0.1 8; 0.21;
Pr o [ 6 ] .Name Prol6] .ne s c Pro l6] .4W = Pro(6].rw =
= "Maschine7"; = "Hobelban k S"; 0 .20 ; 0 .19 ;
Pr o [ 7 ] Pr o [ 7 ] Pro[ 7] Pro[ 7]
= " Masc h i n eS" ; = " Fraesmasc hine A"' 0. 2; 0.16;
. Name . Des c . aw = .rw =
Pro [81 .Narne = "Mas c h i n e 9";
1••
3 Modulare Programrruerung Pr o IS ] . Desc " " Fr a e s ma sch i n e B"· Pro[ 8j . 4W '" 0 . 1; Pro [ 8] .rw" 0 . 1;
Pr o(9) .Name:: - Masch i ne lO·; Pr o(9) .Des c:: " Fr a e sma sch i n e C· · Pro(9) . Il W '" 0. 11; Pro(9) . n.' :: 0 .09;
II Aus gabe der St r ukt u r da t e n void Aus gabe IHasch ine Pro l] ) {
int i ;
f or l i=0; i< 10; i ++1 (
cou t « cou t « cou t. « cout « cou t « cou t « cou t « cou t « cou t «
i «
.,
"- t e Mas chine: • « N4IIle :
Pro li) . Name «
endl;
.,
e nd l ; Bes chreibung : Prolil .Des c « endl ;
..
Ausfallwahr : Proli) . a w « endl ; Reparaturwahr : Prol i l·rw Max )
1
Max = z :
for
( i= O; i F(a(l. 2)-e(i. l)
J,
Nein
F(a(i. l n =-F(a(i.2)-e(i. l )
./.
L""O
v.,..o i = I ( I)Max Schlupr SL =- F(a(i.2))-S(a(i. I))-e( i,)) lst SL ,
\ n~) ;
\ t \ s \ t %3 . 3f \ t %3 . 3 f \ n " , Knoten [i ] . Tae t ig-ke i t, Knoten [i ] . Ere i gn i s , Kn ote n l i ) . Dau e r , Knoten [i ] .Var ian z );
pri nt f ( ~ ' s
Uh ungen
Erwenem Sie die Ausgabe urn die Zeiten. Erstellen Sie em Programm, das mil beliebigen Daten arbeiter. Erweitem Sie die Strukrur durcb einen Zeiger. urn den kritischen Pfad zu dokumenueren. ohne jed esmal dafur eine Auswenung stan en zu mussen. Erstellen Sie eine Ausgabe mind s dieses Zeigers.
3.5 Verkettete Listen
189
3.5 Verkett ete Listen Werden mehrere H ememe eines Typs gebreucht. denkt man automatisch an ein r eid. Wenn es aber vor der ersren Speicberanforderung schwer moghch ist. die maxima le Anzahl der Elemenre abzuschatzen. sind verkenete Listen eine gute Losung . Wird ein neues Datenelement benotigt, wird es erzeugt und in die Lisle eingefllgt. Wird ein Element nic ht mehr benongt. wird es gelo scht . Wie viele Elemente in der Lisle sind. ist nur dUTCh den verrugbaren Speicher beschrankt. Del Zugri lT auf die Elemente an einer tesumrraen Posino nsnu mrner ist auerdmgs aufwandiger als in elnem r eid. Dal en u nd Zei ger Die Basis einer ver keueten Liste ist eine Struktur , die ein erseit s die eige r ulic ben Daten und anderersens einen Zeiger enlhlUI. urn auf das nachste Element der Liste zu verweisen. Beispiel ; Struktur eines Listenelemems s t ruc t Li stenKnoten
I I,
int data; Li stenKn oten *n e x t ;
:Se};1
Etwas verbhl ffend ist die Verwendung des Typs Listenxnoren innerhalb der De ktarano n des Typs Listenk noren. Dem Compiler muss an dieser Stelle das gen aue Aussehen des Typs Listenk not en noch nic ht be kennt sein, da hier lediglich ein Zeiger darauf defimert wird . Ein Ze ige r iSI aber immer gleic h groll, ganz g leic h. auf was er zeigt . ru r den Iltlchtigen Beo bacb ter is r es vielleicht irritierend. dass in der Struktur ein Zeiger ist. der schembar auf sich selbs t zeigt. Wie aber schon der Name next andeutet. verweist der Zeiger nicht auf den eigenen v erbund. sondem auf den nacbsren. der alle rdings vom gleichen Typ sein wird. Eine ve rkeue te Lisle sie ht also etwa so aus:
Anker
1 nex t
23
-~
next
12
r-.
next 35
-'--
ne xt
41
Kild 3- IJ Schema cincr vcrkcuctcn Lisle
A nke r Die Variab le Anker lst ein Zeiger auf den Typ Listenx noten und bildet die Basis flir den Zugriff auf d ie verkeuere Liste vom Programm aus. O~r den A nker erreicht man den ersten Listenknoren . Don enlhlilt das Element next den verweis auf den nlichsten Listenknoren. So kann sicb das Programm durch die Liste hangeln. bis next einmal 0 isl. Damit wird cas Ende der Liste angezeigt. lsi d ie gesarrae lisle leer. muss d ie Variable Anker 0 eruhalten.
190
3 Modulare Programrruerung
Xeues Ell'mc nl
Ein neuer Listenknoten wird durch Aufru f von IIt'W erzeugt Debet muss darauf geac htet werden, dass der Zeiger next gleich korrekt gesetzt wird. Wenn nicht so fort der Nachfolger eingehangt werden kann, muss der Zeiger auf null gesetzt werden. Codt .1-17 Dcmoprogramm - v crkenctc l isle
' " Verkette teLl s te .cpp Zun4 chst wi r d e ine verkettete Liste e r stel lt und diese dann umgekehrt wieder ausgegeben "/
. i nc l ude u sing namespace std; s t ruc t Li stenKnoten int data ; ListenKnoten "ne xt ;
II Da ten II Ze ige r au f den Nachfolger
ListenKnoten "Anke r ; 0; II Anfang der Liste int main e I
1
i nt Inhalt ;
Li s t enKno t e n "node , · o ld ;
1/ Erstelle Li s t e mit We r t e n
do
1
COlit « - Za h l eingeben (O=En de )" « cin » I nha l t ;
end l;
i f ( I n h al t)
1
II Neue s El ement fur Li s tenKno ten *node = no de - >da t a Inh alt ; node->next Anker ; Anker = node ;
= =
d ie List e er zeugen: n ew ListenKnote n; I I Besetze die Date n II H~nge die b i s h erige Li s t e an II Se tze den Anfang spunk t hie r he r
)
while (Inhalt); I I Au s ga be der Li ste i n umgekehr t e r Rei hen f o lge I l und LOs che n de r ausgegebenen Elemente
while (Anke r)
1
II ungle ich Nu l l ! Die Liste i st ni ch t leerl
cou t « Anker ->data « endl; o l d = Anke r ; II sicherung zum sp~ te r en LOs chen Anke r Anke r - >ne x t ; II n~chstes El eme n t nac h vo r z i ehen delete o l d; II LOschung des ausgegebenen Elements
=
3.5 Verkettete Listen
I
191
s ys t em (" Pause " ) ;
1
~l i l verkeuete n Listen lassen sich die Flexibelsten Losungen fUr die Ab lage von Daten erzeugen. Dalen konnen an einem Ende der Lisle einge hangt und am anderen Ende entfemt werden. Es ergib! sich ein Puffer . Wenn das lerzre Element einer Liste auf das erste zeigt, ergibt sich e ine Ringstruktur.
D b ungen
Geben sie die Dalen in del Reibenfolge der Eingaben aus. Erweit em Sie das Progzramm urn die M"Oglichkeit. Elemente in die Liste einzufugen und zu entfemen.
Anwcnd ung..bchplcl: Der Am etsenal gortth mus - .\1asch incn bd l'glm g Bionik Die Bionik ist ein Facbgebiet. das d ie Fachgebiete Biologie und Tec hnik einsch lielJl. Es befasst sich mil in der Natur zu findender Lcs uagen. Strukturen und Prinzip ien und wie wen sich diese rur die Tec hnik umseven lassen. Die Natur bietet eine Fulle von Opumallosungen. von denen das nacbfolgende Beispiel nur einen klei nen Einb lick wiedergeben kann . A mebenalgorlth mu s
Der Amei senalgorithmus wurde in der Tat den Ameisen abgeschaut. Es war der italie nische wissenschenler Marco Dorigo. der 1991 erstmals diesen Algonthrnu s einsetzte. Die Ameis en errlchten zw ischen ihrem Ameisenhaufen und ei ner Futterquelle stets direkt e Strat len. Doch wie mechen sie das. wenn sic schtechr sehen kc nnen und jeder Grashalm fllr sic ein fast unube rwindba res Hinde rnis ist? Dafilr hal ihnen d ie Natur eine wunderbare Einrichnrng gegebe n. Ameisen besitze n am Hinlerleib eine Druse, mit der sie den Locksto lT Pheromon produzieren konnen. Nachfolg ende Ameisen orientieren sich an die sem Stoff und rotgen mil hoher wabrscbemlic bkeu dem am starksten markienen wegen. Doch wie komml es dabei in der Regel zu den kurzesten machbaren wegen? Ameisen-
haulcn Hind... rnis
,
Iallgerer Weg
Full...rqud le
kurzerer Weg
I--====="C ,_0-- - ::>
Bild 3-14 Karzesrc mac hbare Wegc dc r Amcisen
192
3 Mod ulare Programrruerung
Beu achten wir a ls einfaches Modell einen Am eisenhaufen und eine Puuerquelle . Zw ischen beide n Iieg! nun ein Hindem is. das di e Am eisen zwi ngt. einen Umweg zu nehmen. Filr ein e Gruppe vo n A meisen. di e die Fuuerqu elle zu m ersren Mal besucht. ergebe n sich zwei Moglichkeiren: links oder rechts urn das Hmdernis herum. Wlihrend ihres Weges sondern die Arneisen einen Sexuallockstoff also ein Phero mon abo Da abe r noch kein Pheromon vorhegt isl anzune hmen. dass sic h die Gruppe teilt. Die erste Gruppe nimmt den ku rzeren Weg (I) und erreicht die Funerque lle zuerst. Sie wlihlt als Ruckweg wieder de n kurzeren Weg. da ste nun vom eigenen Pheromon des Hinwegs auch zurack geleit et wird, D ie zweite Gruppe (2) mit dem langeren Weg kommt danach auch zur Funerquelle und nimmt nun. da der kurzere weg bereits doppelt mit dem Pheromon de r ers ren Gruppe gekennzeichnet ist als der tangere (nUT einmal dUTCh Gruppe 2), nun eben falls diesen Rackweg. So kommt es zu einer erneuten Vers tarkung der Wegkennzeichnung. Fur aile nachfolgenden Ame isen ist der Weg vorgegebe n und wird im mer star ker gekennzeic hner. Es emste bt eine Ameisenstrage. Sie seben. eine einfache aber sehr wuksame Methode der Natur. Die Natur regen di eses System aber noc h weiter . W ind. Regen. Waldtiere und andere Ein fh j sse sorgen dafllr, dass nUT die aktuellen Wege gekennzeichnet blejben . Ein wei terer Srcrfaktcr liegt dann. da ss Amei sen slch durch aus auch emme t den Iangeren weg au ssucbe n konnen. bzw. ande re Wege suchen. :\1oglich erw eise linden Sie so elnen noch ka rze ten weg bzw. es wird verhindert. dass ein w eg zu dom inan t wird und das Finden besserer Losu ngen verhinden. Hier w irkt ein Mechanism us, den wir bei den genetisc ben Algo nt hme n au ch kennen und der dort als Mutation bezeic bnet wird. A ile diese Mech anismen andern j edoch nichrs am Grundprinzip. Die Frage isl nun. wie dieses Prinzip im Compu ter nachge bildet werde n kan n. Eine PseudoAmeise ve rhalt sich ebe nso wie ihr naturhc hes Vorb ild und mac ht ihre Enlsc heidung abha ngig vo n der Pheromon-Au spragung alter moghchen Losungen. Das klassische Mod ell isl de r Weg eines Hande lsreisenden, der nachein nnder verschiedene One besucht. Umgesetzt fl lr unsere Pseudoameise wird di ~ Sllirlee des Pheromo ns dUTC h eine Zahl ge kennze ic hn~l. d ie in eine r Entfemu ngs malrix aile M: oglichkeiten beinha hel. :\i ii dieser :\1alrix kann d ie Pseudoam eise eine Auswah llrefTen. T llhl"lIt 3-11 Ik ispicl cincr
I'h~'romo n -M atr i x
0",
A
B
C
D
E
A
-
0.2
0.5
0.4
0.5
B
0.2
-
0.3
0.5
0.•
C
0.2
0.5
-
0,4
D
0,3
0,4
0.3
-
0••
E
0.5
0.3
0.2
0,4
0••
-
Die Auswahl wah rschei nlichkeit w ird auf
~ asc h inen bel e~'Ung
ein.
\Iasch in l"nbd cgung In einem Prcd uktionsbetrieb werden Iunf Produ kte aufdrei Maschin en in gfeicber Reihenfolge ~1 2. ~Ij ) in Stunden je Produkt sind PI(S. 3. 8). P2(S. 3. 4). P3(12. 4. 2). P4 (4. 2. 7) und Ps(8. 2 .9 ).
produziert, Die Belegung der Maschinen ( ~11 .
Mit Hilfe des Amei senalgorirhmcs stellt sich die Losung wie fotgt dar . T ab~ lI~
3- 13 Struktc gramm - Maschinenbelegungsoptirnierung mil oem Ameiscnalgmilhmus
Hingahe g = Anza hl Gru ppen n = Anzahl Pseudoa meisen einer Gruppe p = Anzahl Prod ukte m = Anza hl Maschinen i= I ( l) m
je l tl j n Beurteilungsvektor-Produ kte setzen k=I ( I ) p y(k. n =k y(k.2)= 1 k= I( I) p
q=O Berucksicbtigung der Pheromonanteile in Ylk.2) Bestimmung der wabrscheinlic hkensverteilu ng
3.5 Verkettete Listen
195 Erzeugung ein er Zufallsza hl
lsi die Konstellation ro lassig1
J,
Nein
Speic herung der Konstellation
q= 1
J.
So lange q~ Beslimmung der Durchlaufzeit fUr die gefun dene Konstellalion Beuneilung aller Konstelta no nen einer Gruppe dadurch. dass nur die minimalslen Werre in einer Pheromon-Mamx eingerragen we rden . Losungsausgabe
Die Reahsieru ngs mogtic bkeiten sind in C ++ vielfaltig . Das nachfolgende Programm zeigt eine Struknrr fUr d ie Maschm endaten und einen Zeiger fUr den optima len Prozessablaa f C lIdl' 3-11' A nwendu ngsbcispic l A mciscnalgcr jthm us - Maschine nbele gung
1* lUnei sen . cpp
Bestimmung ei ner op t ima l e n Ma s c h i ne nbel e gu ng mit Hi l f e des Ame i sen-Algor ithmus
"/
' ' ' ' ' '
i nc l ud e i nc l ud e i nc l ud e i nc l ude i nc l ude i nc l ude
<mat h. h> <stdlib. h> <st r ing. h >
u s ing name s pa c e std; int p =5, m=3; II An ~ ahl Pr odu k te ; Mas c hine n int M[S] [31; II Ma s chine nstunden-Matrix II Bei s pieldaten v oi d Da t en ( 1 1 M[ O! [ 0] 5· ~
M[ OI [ 1 ] M[ OI [2 ] M[lI I O] M[lIIlJ M[ 1 1 12 J
•
3· 8, 5, 3, 4,
19.
3 Modulare Programrruerung M[2 ] [OJ M[2] M 12] M(3) M( 3) M( 3) M(4) M(4) M(4J
[1] [2]
10j (l)
12 ;
= 4; =2= 4; 2,
7,
(2) (0)
a,
( :.!J
= !:I;
(l) = 2-
int main () (
int i, j . k , 1 . r . v ; int a, b; int g= 100; int n =500; i nt z l n] , yip ) (2 ). f lp ) . u Imj , s t n j i n t q , s uo Min ; fl oat w, x. ; int Folge . PM (l OOO) ( 3 ) . pi= O;
•
s r and ( t i meI NULL)); II Zu f a l l s ge ne r a t or Initiali sierung Daten ( ) ; f or ( i=O; i u s ing name s pa c e std; v oi d Date n
(J;
i nt main (J {
double double double int i , double double
Ar [1 00] [8] ; II Array mi t l OOx12 El eme nte n e rzeugen x la, yla , xln, yI n , dxl , dyl; x2a, y 24 , x2n , y2 n. dx2. dy2 ; f , ml , m2 , m3; a , X; 114 , 124 , 13a , 14 4 , l 5a ;
20K
3 \1odulare Programmienmg double lIn, 12 n, 13n, 14 n , 15n; double g124 , g1 2n, g3 4a, g3 4n; s r a nd( t i me( NULLII ; II Zu f a 11s ge ne r a tor I n i t i a 1i s i e rung
,
f or ( i =O; i -__'--..
gCllo:ri~he
_
Programme
Korr1ung von Datcnstrukrureu uno.l Zugri ITsfwlktinnc"
Kapsclung dcr imcrnen Var iab le" VOl Ve rJin de runge n von "a"Ben"
Bltd 4- 1 Die vortcilc dcr 0 0 1'
G r u ndid,·c Die Grundidee d er Objekton emierung ist es, Daten (Variable n] und :\1ethoden(Funktionen) moghchst eng in einem Obj ekt zusa mmenzufassen und nach auBen hin zu kapseln. so dass die Objekt-Daren durch Methoden fremder Objekte nicht manipulieren werden konnen. Obj ekte
4.1
D~r
Wcog zum Objekt
213
praseruieren nac h au uen Scbnittstellen (Interfaces) . die da rab er bes ummen. wie andere Objekte mit ihnen wec hselwi rken konnen. Zeiger auf Obje kte konnen dazu filhren. dass bei der Auswah l eines kon kreten Obj ekts seine Klasse nicht o rfensichuic h ist. Trotzd em werden Nechrichten an so selekue rte Objekte korrekt der latslkhlichen Klasse zugeordnet, da die Zuordnung erst zur Laufzeit aufg e1&t wird. Dieses verbatten w ird ets Polymorphismes [auch : spate Bmd ung oder dynam ische Bindu ng) beze ichnet. Neu defm ierte und erzeugte O bjek te konn e n ein e Spezilllisierung ber.. its e xisuerender Obj ekt e sei n. Sie ko nnen des vo rnandene Verhalt en ube rnehme n und erw eitern. Dies muss damn nicht neu implementiert werden. Dies wird als v ererbung bezeicbnet und dadurch erreichr. dass Obiekre zu Klassen und zu Hierarchien vo n Klassen grupp iert werde n. die ihre Ge mei nsamkeiten im Verhalten ausdrucken . Eme Progra mmierung mit Obj ekten. die keine vererbung kennt. nenm rnan zu r Unters cheidung oft Objektbasierte Programmierung.
So wie die Tec bmken der prozeduralen Programmierung durch Verfa hren wie die struktu rierte Prog ramm ierung ve rfeinert wurden, so gibt es inzwischen auc h verfemerungen der OOP durch M ethod en wie Entwurfsmu ster [eng].: design patterns). Des ign by Co ntract und gra fische ~1 o de llierungssprachen wie U ~tL. Eine n immer wic bngeren Stellenwert nimmt d ie funktio nale bzw . aspektor jentiert e Programmierun g ein. be i dem A spe kte vo n Eigensc haflen und Abha ngtgkeiten bes chriebe n werden . An\\ endungsb ehplf."l: St ru kture n und :'ofeth oden - Flaehensehwerpunkt Auch werm d ie Grundlagen ZUT Definition und Nutzung vo n Objekten erst fclge n, so kann diese kleme preknsche Einfiihrung nicht schaden. AuBerdem die m sie hervort agend zu m Experimentieren. Das nachfcl gende Programm erstellt 10 zufa llsbed ingte Rec htecke und speichen sie in einer Strukuir. Codl." ... (
De mllr~Ta lllm
- zufallsbedjngte Rcchtccke
1* Re chtecke_1 . cpp Ca s Pr ogramm ers te 1 1t 1 0 z ufall s bed ingte Re ch t e cke "/
f i n c lud e f i n c l u d e s t r uc t Re chte ck (
d o uble 1· d ouble b;
II LAnge II Brei te
int mai n ( ) i nt i; d ouble x ; Rech tec k r [l Oj ; srand (time (NULLI I ; II Zu f a l l s g e n e r a t o r Ini tia l i s i eru n g
2 14
4 Objektonentierte Programrmerung
f or l i=O; i< lO; i ++1 I II Erzeugung eine r Zu fall szahl im I n t e rva l l
(0, 1)
1/ und d e r e n Scal ier u n g au f die Summe der H~ufigkeiten x = doub l e ( r a n d () / double( RAND_ MAXll ;
rli l .1 '" x* 200 ; x = doubl e ( r a n d(J I d o u b l e ( RAND_ MAX) I ; »ur. » :: x*r [i ] .1 ; eou t « -1 « rl i] . 1 « * \ tb " • « r [i ]. b « endl ;
=
I
s ys t em (- Pause- );
Ein megliches Ergebnis sehen
WiT
im nachfolgenden Bild.
a. "'''!62O; aa . ]1>1'> 16 3 . 8 6 117.771
11' .I'.>s I Si .He
I
.,., .4112 17t..l]{' Ib.88H
h
b b h
b b b
b b
1.9b939
17. H'H 6'1.S_ l lJ'/ .278 SS . 4 4'\ '4
1S3 .983 n.8H2
l lH .2r.1 4 .H 117
7'1.891 .)~
US4 .4 7 18 1 . 7 1 B
lJild .&·3 Umfa ng und t'llid lC zufallsbcdingter k ec htecke
Die Suu ktur wurde erweitert. urn au f die berec hneten Daren zugzreife n zu kOnnen. Die Berechnung ist immer mil der lnitielisierung einer Strukrur gekoppelt. Eine so1c he Kopp lung gestauer eine Klasse. Sie enthalt n icht n UT die Eigenschaflen. sondern auch die Methoden. C ode -1-3 Dcmop rog ramm - Auswe rtung zufallsb cdingtcr Rcc htcc kc mil Mcthode n
/ - Re chte cke _ 3 . c p p Das Programm ers tell t 1 0 z ufall s beding t e Re chtecke und ber e c hnet ihr en umf ang u nd i h re Flache
';
' in c l u d e ' inc l u d e c lass Re cht e ck {
publ i c : // Attribute d ouble 1 ;
2 16
4 ObjeklOrientiet1e Programmierung
d ouble b ; d ouble U; d ouble A ; 1/ Methoden Rechteck (dou b l e Ii , d ouble bi ), l (li ) , b (bi ) (
u
.
2 · ( l +b) ; l ·b ; cou t « "! • « ! « -\ t b • « b « - \ tU • « U « -\ t A • « A « endl ; A
•
I, int main () (
int i ; d ouble x , Ii , bi ; sr~nd (time INULL I I ;
f or ( i=O; i< lO; i ++1 (
x = d ouble (rand ( J /double (RAND_MAX I I ; H = x·2 00 ; x = doub l e( r a n dl)/doubl e( RAND_ MAX)) ;
bi = x ·H ; Rechteck r i
(I i, b i ) ;
I
s y s t em ( - Pa use-);
1~1.Yn
1111. SY.J Y7.2117b 5b.IH) Jb.k I
•• ••• ••• •
12b.11~
se . S19
8y .n15 9.n11~
12.7?1 b.1I1817 IS1.9b1 9J.8In 127 .IIJ 1114._ 87. '1291 ~J.1 I1Y7 178.h1l7 8) .2'1 '17 D~ii.82 2'-'116.'6 J
•• ••
urns.
r ..... .
Erwcucn e Auswert ung zufallsbe dmgtcr Rechtecke
[I bun gen
Nach del' Durcha rbeitung des Kepirels Objektorientiene Programmierung lassen sich mit diesem Programm weuere Cbunge-n durchfljhren. Zunachst einrnal sollre die Eingabe von Daten verallgemeinen werden. Dann konnen zusatzliche Klassen Kreis und Dreiec k eingefahrt werden . y
•
•
x
Bild 4-7 Gco me tri schc Formcn im Koordinarensystem
Aile diese Formen habe n die gleichen Eigenschaften bezflglich eines Koord inatenursprungs, namh ch ihre Abstande X s und Ys. lis b ietet sich daher an. eine Klasse Porm en zu erstellen und diese als Ober klasse Z1.1 beuacbten. Wie dies geht wird nach folg end beschrtebe n.
220
4 Objektonentierte Programrmerung
4.2 Obj ekt e und Klassen In diesem Kapite l erweuern wir den Datentyp srmct. Zu den selbstdefinierten Variablen defi nieren W iT auf Ihnen ope rierende Funktionen und erhalten so Objekte. Die Variablen (auch Datenelememe ode r Attribute) stellen die Eigenscha uen des Objekts dar. Die Fa.higkeilen werden als Metboden. Memberfimktionen oder Elemerutunknon en bezeichnet. ~ i t dieser Konstruktion erlaube n Objekte die Nachbildung rea ler Strukturen in der Programmierung . \\'ohld efln ier th eh
In der lnformauk ist ein Obje kt e in wohldefini erter Begriff Zur Wohldel'iniertheit von Obje kten gebort : •
dass sic: einen Lebenszyklus haben. Objekte werden wahrend der Programmlaufzeit erzeugt . genutzt und dann wiede r vernic htet (spatestens rom Programme-ode). dass sie eine Oberflache (auch Schniusrelle oder Interface gena nnt] besitzen. Die Schnit tstelle legt fest. wie das Obje kt mit seiner Umgebung kornmuni zieren kann, also auf welchen Daten es operien . dass sie ein Innenleben besitzen. Wie das Obje kt die Daten nutzt. ble ibt in der Regel dem Berrachter verborgen. Ledig fich die abe das Interface ..vereffenrlic hten'' Dalen sind dem Nutzer zuganglich, Man spricht von Kapselung. Diese s Prinzip kennen wir bereus von der Black box. aus der prozeduralen Programmierung . Auch dart gibt es Inputs und Outpots. Die verarbeuung gescbieht in der ..schwarzen Schac hter',
•
•
Der Bauplan, nach dem Objekte entsrehen, wird als Klasse bezeic hnet. S) n IU : K lass ," in C++ c l ass Kla s senname private :
Var i ab l en un d Funkti onen innerhalb d er Klasse bekannt ;
p ublic :
Variablen und Funk t ion en v on auBen zugangli ch ; J,
Als Objekte betrachten wir ebe ne Kreise. Allen geme insam iSI ihr Atmbut Radius. Ihr Baupla n sie hr also wie folgl aus : Clld l' 4 -~ Die Bcispiclklassc Kreis
1* File : Kr e i s .h * 1 c l ass Kr e i s (
p rivate, fl oat Radius; Ilp r i v a t e Va r i a b l e public , v oid s e t Ra d ius (floa t ) ; IIDek l a r a t ion eine r Sch r e i bme t hode f l o a t getRadiu s (); IIDek l a r a t ion e i ne r Le semeth ode
4.2 Objekte und Klassen
221
Den Klassennamen beruuzt man in der Regel irnmer in der Einza hl. Die Prafixe set und get werden von mir standa rdmllBig genutzt, urn die lnformationsrichtung enzug eben.
Zu griffsebenen AuBerdem gilt die Regel , dass j ede Klasse nur so viele Details Ilber ihre Wirkungswei se .vero ffentlichen'' sollte. wie zur ErfiilJung ihrer Aufgabe unbed ingt nong isr. Jede Klasse hal dam verschie dene Zugriffsebenen. Klessenelemente (Eigenscbaften und MethoJen ) konnen sich im pn varen Bere ich l,prn'are:), im OfTenllich Bereich v m hlic:) ode r im geschucren Bereich (proreered:) befinden. Lem ere sp ielt nur bei vererbungen eine Rolle. Dazu spa rer mehr. Hier ist auch der einzige Unterschied zw ischen einer class- oder struc t-Deklaration. Bei einer Klasse sind ohne Anga ben aile Eigen schaften und Method en privet. wllhrend bei einem suuct aile Eigenschaften und Methoden offenthc h sind . Durch di e Angaben "public:'· und ..priva te:" werden nachfolg ende Angaben offe ntlich oder bleiben verboegen. In unserem Beispie l isl d ie Variable Radius nur fllr eine Nutzung innerh alb der Klasse dekla riert, wahrend die Funktionen setRadius und getRadius dur cb die Angabe public offemlic h zugangfich sind
Exte me ;\Ielh oden und Kapsefung Klassendefinitionen werden im Sinne der Wiederverwendbark eit in eigene Header-Dateien (Name.h) gese tzt und dann im Anwendungscod e inkludiert. Es hal sich a ls sinnvol l erwiesen . de r Header -Darei den gleic hen Namen zu geben wie de r in ihr definienen Klasse. Inner halb der Klassendefimtion werden die Methoden nur de klanen (aiehe eben Kreis.h) Die Definition en der Merhoden erfolgen dann in einer gerrennren Oue llcode- Datei. d ie ebe nfalls sinnvo ller weise den Name n de r Klasse erhan . deren Met hoden in ihr definiert werden mil der Extension .cc anste lle von .h. Man nimmt hier . CC, urn sich berehs optisc h vom nblichen Anwend ungscode mil .cpp zu unrerscheiden . In der Anwendung wird da nn zuerst d ie Header-Dater mit de r Klassendefinition eingebu nde n und dan ach folgen d ie entsprechenden Methoden-Defmirionen. Dabe i ist Foigendes zu beachten: •
Innerhalb der Klasse wird di e Meth ode nur deklariert. Die Deklaration erfolgt in de r gleichen A rt und We ise wie bei Funktionen.
•
Hei der Definition der Method e aufterhalb de r Klasse ist es er forderfich. den zugehorigen Ktassennamen mit anzugeben. Dam wird nach dem Returntyp und vor dem Nan-en der Methode der enrsprec hende Klassenname gefolgt vom Scope -Ope rato r (::) angeg ebe n.
CudI.' 4-6 Mcthod cn dcr Hcispiclkla ssc Kreis
/ * Fil e : Kr e i s . c c * /
v oid Krei s : :setRadius (f loa t r ) Rad i us = r ; fl oat Kreis"ge t Rad i us ( I {
222
I}
4 Objektonentierte Programrmerung
return Radi us ;
Da bei der Defin ition der Methode auBerhalb der Klasse der Klassenna me mil angegeben werden muss, kcnnen versc hiedene Klassen ohne weueres Methoden mit gleichem Namen besuzen. Der Compiler kann die Definition der ~ ethoden d UTCh die A ngabe des Klassennamens immer eindeut ig zuo rdnen. Diese Auft eilung hal noch einen .....eiteren Vorteil. So li eine Klasse we ne rgeben werden. so reicht es aus. die Header-Datei (Name. h) und die nberseizre ~l ethode n· Dal ei (Nal11e.obj) weiter zu gebe n. Der Anwender der Klasse muss be i ihrer Verwendung lediglich die Header-Darer einbinden und zu seinem Projekt noch die erusprechende .vume.obj Datei daz u linken. So bleibt der Quellcode im v erborgenen .
Das nachfolgende Anwend ungsbeispiel erzeugt zwei Objekte Kreis l und Kreis2 mit den Rad ien 29 und 32 und gibt anschlieBend den Radius " om ersren Objekt aus: COOt 4-' Dcmoprogra mm - Nutzun}!der Klasse Kreis
1*
~ il e :
Kre i s . cpp * 1
' i nclude ' i nclude *Kr e i s . h " 'include - Kr e i s . cc"
,
i nt mai n ( I II Deklarat i onen
fl oat Kreis radi us;
/I Objek te r zeugung un d Va riabl ende k l a r a tion
Krei s Kreisl , Krei s 2 ;
as ge setz t Krei sl . s etRadius (2 9) ; /I Attribut Radi us v orn Obj e k t Kreis2 au f 32 gesetzt Krei s 2. setRadi us (32) ; /I Attr ibut Radi us v orn Ob j e k t Kreisl au f
Krei sradius =Kr e is l . ge t Ra d i u s() ; cou t « Kre i sradius « endl;
Il i e s en eine s Att ribut s
s ys tem( " Pa use"} ;
Jedes Objekt einer Klasse besitzt seine eigene Kopie alte r Ktassen variablen. Man spricht davon, dass ein Objekt die lnstanzierung einer Klasse ist. Der Zugriff auf die Attribute erfolgt uber offentlic he Methoden . Beispiel : Direkte Zuweisung an ein Element ist nur bei l'uhlic-deklarierten Klassenvariablen ertaubt
I Kreisl . Ra di u s
= 29 ;
4.2 Objekte und Klassen
223
Kon st ruktor In C++ werden die Objekte be i der Erzeugung initia lisiert. Die Klasse stellt dazu eine besondere Methode bereu . den Konstruktor. Der Konstruktor existiert Iilr aile Klassentypen (union. struct. class). Er hal den Namen der Klasse und besitzt keinen Ruckgabewe n . Wird der Ke nstruktor explizit nicbt angegeben. erzeugt der Compiler einen Standard-Konstruktor. Datenelemente ohne explixite Konstruktoren sind undefi niert. Beu achten wir dam unser Beispiel und era anzen WiT unsere zwei moglichen Konstruktor en.
~l ethodendek l arat i on
dUTCh d ie
C od e 4-8 Die Klasse Kreis mil Konstruktoren
1* Fi l e : Krei s _l . h *1 c l ass Krei s [
private : f l oa t Rad i u s ; Ilp r i va t e Va r i abl e p ublic : Kr ei s ( J ; II St a nd a r dkon s t r u k to r ohne Parameter Kre i s lfloat : 2 9 J ; Il al l gemei ne r Ko nstruktor vo id setRadi us ( f loa tJ ; f l oat get Radi us {J ;
Auch Illr Merhoden gill genauso wie ffu nonn ale Funktionen des Prinzip der Uberladung. wonach sie sich bei gteichem Namen dUTCh ihren Rnckgeb eryp oder Param eter (in Typ und Anzahl] unterscheiden Cod e 4-9 Dcmoprogr amm - Obc rladL'JI von Mcth odcn
1* Fi l e : Kre i s _ l . c c *1 Kr eis : : Kr e i s ( f l o a t r ) I
Rad i us )
=r ;
v oid Kr ei s : : s etRadi u s ( f loat r )
I
Ra di us = r ; )
f l o a t Kr e i s : :ge t Radi u s ( ) (
re t u r n Rad ius ;
COOl' 4-10 Dcmoprogramm - Nutzung dcr Klasse Kreis Version 2
1* File : Kr e i s . c pp *1 ' i nc l ud e
224
4 Obj eklOrientiet1e Programm ierung
linclude "Kr e is_ I . h" l i nc l ude "Krei s_I. cc "
,
i nt main I ) II Deklarationen f l oa t Krei sradius ;
Krei s Kre:l.Sl t 2 !:1) ; Kreis Krei s 2 (32 ) ; Krei sra dius =Kr e is l . ge t Ra d i u s(); cou t « Krei sradius « endl ;
Il i e s en eines Attribut s
Betrachten wir nun einige Dreiecke im Kooedmatensystem y
Dreie ck2
1
-3
1
2
3
4
5 x
Dre ieck3
'--::L .2
Kild 4-1' Drcicc kc im Koordinatcnsystcm
Jedes dieser Dreiecke hat eine beliebige Fonn und Lege. Allen ge memsam is!, dass sie mit drei Punkten in der Eben e Iestgelegt. also aile ve rn gleic hen Objek ttyp Dreieck sind. Durnil konnen wir wiede r einen Konstruktio nsp lan der Klasse Dre ieck anlegen. Dies wo llen wir zuerst in gra fische r Fonn lun. Die nac hfolgende Dars tellung einer Klasse lehnt sich an d ie Konventionen der ..Universal Modellin g Langua ge" (kurz: U:V1L) an.
4.2 Objekte und Klassen
225 D~ei eck
N"me
xr. VI
»a. V2 x3, V3
"" ' i n c l u d e " Dr e i eck_ 9 . h " ' i n c l u d e " Dr e i eck_ 9 . c c " int ma i n () {
II Dek1 a rati o ne n c h a r Be z(2 0 1 ; II Obj e k t e v om Typ c l a s s Dreieck defi nieren s t rc p y ( Be z , "Dre i eck 1") ;
cou t « «
"E s e x is t i eren " « " Ob jek t(e)\ n " ;
Dreieck: : Co u n t
Drei e c k Dreiec kl ( Be z , 1 . 0 , 1 . 0 , 5.0, 2.0, 2 .0, 3.0 ); c out « " Es exi s t i e r e n « Dreiec k ; : Cou n t « ' Obj e k t( e )\ n " ; Drei e ck Dreiec k2 t ae z • 2. 0 , 4. 0 , 1 . 0 , 3. 0, 1. 0 , 2. 0 ) ; cou t « " Es e x is t ieren « Dr eieck : :Cou n t « " Obj e k t Ie) \ n " ; c ou t « « c ou t «
" Es exi s tie r e n " « " Ob j e k t l e ) \ n";
" Es exist ieren • «
Dre i eck : ; Co u n t
Dreie c k : : Count
254
4 Objektonentierte Programrmerung «
• Obj e k t (e ) \ n";
s ys tem ( " Pa use" );
~~
b h
e . ,s t l e re n 8 ObJekt (e )
.,> I '" ----- - - - - - - - - - - --- -------Defi n iti on der Kl a s s e Form ----- - - - - - - - - - - -- - -------- "' I c l ass Form (
II Eigen s c haften
private: s t d : : st ring Name; fl oat xP os , yP os; fl oat Flaeche, Umfang; II Me t hode n pu b lic : II Kon s tr uk t or Fo rm (s t d : : stri ng N, f l oa t x , floa t y) (
Narne :: N" x Pos x; y Pos :: y ; Flaec he :: 0; Utnfang :: 0; )
II Bewegung
v oid Move ( f loa t dx , f l oat dy )
4.4 Klassenh ierarchie und v ererbung
XPo s y Po s
I
259
= xPo s +dx ; = yPo s +dy ;
II Darstellung (h i e r: Text ) v oid Draw () {
}
,
cou t cou t cou t c out cou t
« « « « «
·Ob j e k t : " « N~e « endl ; "X • « x Po s « encu • « yPos « endl ; "y • « Flaeche « end1 ; "A • « lJmfang « end1; "U •
1* - ------- - - - - - - - - - - - - - - - - - - - -
Definition der main-Funktion
-- - - - - - - - - - - - - - - - - - - - - - - - - - - * 1
i n t lIlain () {
IIDe k 1a r a t i o n e n boo1 s top ; IIOb j e k t erzeugen Fo rm Kreis (· K r e is~, I , 2 ) ; Krei s .Draw n . Krei s .Move ( 2, 1 ) ; Krei s .Draw u . cin » s top; r e t u rn 0;
. .
,
Ob je kt: Kr e i s
2
.,
=
n IJ
=
" IiJ
.,
=
)
, " "
Obje kt: Kre i s
IJ • IiJ D.. Ucke n S i e ei n e be l i eb ige Ta s t e • . •
8i1d ~-I X Progr unuuausgubc dcr Eingabewcrte
w enn wir nun zur Modellie rung konkreter geometrtscher O bjektklassen ubergeben. dann kennen aube rdem enrsprechende spezifische Eigenschafte n und Fahigkeiten zu den in Fonn schon vorhandenen hinzukommen. Betrachten wir d ie Klasse Kreis alte r Kreise. Jeder Kreis ist durch einen Mittelpunkt und einen Radius festge legt. Wenn wir Kreis von Fonn ableite n. dann konnen wir Rlr die Spe icherung der Mittelp unkt-Koordmaten die schon vorhandenen Felder .r und y benurzen. Fur d en Rad ius mnssen wir jedoc h eine neue Eigenschaft einrichten. Und auberde m mussen die abstrakten M e thoden des Vorgangenyps Form implementiert werden . Wir erhahe n damit also zum Beispiel das folgende Klassendi agrarnm:
260
4 Objekt onentiert e Prog ramrmerung
Kreis - Radius: Iloat
+ Kreis (N ~'I( .y.r) - Dra....O
Bild "' 19 Kla ssendiagramm Kreis
Beachten Sic. dass dieses Diagramm nur d ie Anderungen gegennber der vorganger-Klas se ent hall! Urn zu vers teben . wie Kreis-Objekte gebaul sind. muss man das Diagramm von Form binzuziehen. Die Tatsache. dass Krei s von Form abge leitet isr, w jrd dUTCh einen Pfe il da rge-
stellr:
Fonn - Name: string
Kreis
- x Pos : float
- yPos: float
• Rad ius : floa t
- l1a cchc : float
-Umfang: float
+ Kreis (~ .l( .y,r) + Drawt)
+ Form (:'i ,x ,y)
+ Move (d\(,dy)
+ Draw 0
m id 4-20 Klasscndiagr amm Kreis erbt von Form
Der Pfeil wi rd dab ei .vom Ki nd zum Ell er" gezeic hnet; er kann dami t gelese n werden als .,erbt von" : Kreis erbt seine Strukturen von Form. In UML wi rd die Bed eutun g dieses Pfei ls soga r kurz mit " ist do" engegeben. was allerdin gs nich t im Sinne ein er ldentuat gemeint iSI. sonde rn els ln klusio n. namlic h als .Jst eine spez ielle Art von": ein Kreis-Obj ekt ist also ein e spezjelle Art von Form-Objekt. Wenn w ir nu n die Klasse Kreis erga nzt haben. we rde n w ir feststelle n. class auf die Eigen sch aflen der Basis-Kla sse Fonn nicht zugegriffe n werden kann . Dies Iiegt an der Zugriffsmethode private , die nur innerh alb einer Klasse gilt und nic ht ve rerbt wird. Erst wenn wir private d utc h protected ersetzen. habe n wi r den gewunsc hten Zug rifTinn erha lb der vererbung und die Kapset ung nach auuen . 1m Klassendi agramm ist dies bereits richtig dargestell t.
COOt4-42 Demoprogramm -
Nul LllIl~
dcr Klassen Kreis und Fonn
4.4 Klassenhieran:hie und Vererbung
1* Krei sU ndForm. c p p
Die Nutzung de r Kl a s s e n Kreis un d Fo rm
' i n c l u d e < ios t r e am. h > ' i n c l u d e <s t r i n g. h >
1* - - - - - - - ------ - - - - - - - - - - --Detinition der Klasse
~orm
-------- - - - - - - - - - - - - - - - -- - *1
c l ass Fo rm
I
I I Eigenschaften protected : s t d: :st r i ng Name ; f l o a t xPo s . y Po s ; f l oa t Fl a ech e . Umfang; II Methoden public : II Ko nstruktor ~orm (s t d , :s t ri n g N. fl oat x , f l o a t y l
I
Name N; x Po s x; yPo s = v ,
=
~la eche 0; UJnfa ng ,., 0;
)
II Bewe gung v o i d Move ( f loa t dx . fl o a t dy )
XPos = x Pos +dx ; yPo s+d y ; yPo s }
II Vi rtual Fu n ctio n vi rtual v o id Dr aw ( I { } }
,
1* -- --- - - - - - - - - - - - - - - - - - - - - - -
Def inition d e r Klas s e Kre is
---- - - - - ------ - - - - - - - - - -- -- *1
c lass Kr ei s
: p u blic Fo rm
I
prote cted : fl o a t Rad ius; publi c: I I Kons truktor Kr e i s (s t d : :s t r i n g N. f l o a t x . f l o a t y. f l o a t r ) Fo rm IN . x .y ) Ra d i u s ,., r ; r * r * 3 . 14 15 9; F1 aeche UJnfang 2 * r * 3 . 1 41 59 ; }
= =
II Da rste l lung (h i e r: Text )
261
262
4 Objektonentierte Programrmerung
void Draw I c out cou t c ou t cou t c out cou t
« « « « « «
"
"Ob j e k t : « "x • « "y • « "r • "A • « « "U •
.
« Name « end! ; endl; xPo s « yPos « endl;
Ra dius « endl; Flaeche « endl; 1Jmfang « e ndl ;
'" ---------------------------J,
Defi niti on der main- Funktion
- -- - - - ------ - - - - - - - - - - - ----- * /
i nt main I) {
IIDekl a r a t i one n bool s top ; IIOb j e k t erzeugen Kreis Tes t (" Kr e is" , 1.0 . 2. 0 . 3. 0 1; Test-Dra w (); Test .Move ( - I.
-1) ;
Test .Draw (I;
c i n » s top; return 0-
.
,
Obj", k t '
v
a
,",
,",
I( ..., i ~
.. 0 3 A ' 28 .2743 U • 1 8. 849 5 Obj .. kt: K.... is
Fl II
2 8. 2 7 4 3 1 8. 8195
Uild 4-2 1 Ausgabc dcr bcrccbnctcn Werle
WiTerganzen tins Kla ssendia gramm urn die Klassen Linie oiler Strecken, die Klasse Rechteck und die Klasse Dreieck. Einen speziellen Fall der Vererbun g stellr die Konstruktion der Klasse aller Punkte dar. Die Klasse Form enrhalt namlich schon aile Eigenschaflen. die wir benotige n. urn einen geom etrischen Punkt vollstandig zu beschreiben. Damit braucht eine yon Form abgeleitete Klasse Punk, keine zus1itzlichen eigenen Eigenschaften; sle muss lediglich die absuaklen Methoden von Form implemenueren. Wenn wir nun a ile bisher mode llierten Klassen zusammenfassen. erhalten wit die fclgende Hierarchic:
4.4 Klassenhi erarchie und v ererbung
263 Fom - Name: string - x. Pos: floa t - ypos, floa r - Flaeche: floa t
Kreis
-Umfang: float
- Radius: floa t + Kreis IN.ll,YJ)
- - D + Form (N .x..y) + \ IO\-e (dx.dy) + & aM· 0
I
Punkt
+Punkl(N..\.y) +013\',0
- Drawt}
Rechreck
Dreieck
illa.enge: float ..Breite: Ooat +Rechteck(N.x.y .Lb) +013"'0
#Seite_a: float ilSeite_b: float #Scite e: float +Dreieck{N.ll.y.ah.cj +Draw(}
linie lI'la.enge; fIoal +l inie(N.lI.y.l) +DrawO
Hild .& -22 Bauplan Klassen
Imptemenuc rn ng Mil diesem Klassendiagzramm haben wir sozusagen den Bauplan [ilr die Klassen. d ie nnsere geomerrischen Objekte darstellen sollen. Nun mussen wir noch den Schriu zum lauffa higen Programm zurnc klegen. Mil Blick auf cine Proje ktierung definieren wir die Klassen in eigen e Header-Dateien und b inden diese dann millets inchid e-Direkti ve ein.
Form.h
Hilll .& -2.1 Header-Dareien des Projckts
264
4 Objektonentierte Programrmerung
C oM 4-4.\ Definition dcr Klasse Form
I '" Fo rrn .h Definit i on der Klas se Fo rm
.,
' i fnde f _ FORM ' d e fin e _ FORM
c l ass Form {
II Ei gens chaften protected :
s t d : :st ring Name ; f l oa t xP os , yP os; f l oat Flaeche . Umfang ; II Methoden public : II Konst.ruktor Form (s t.d: : string N. f l oa t x , fl o a t y J { Name N; xPo s x; y Po s = v , Flaec h e '" 0;
umfang } II Bewegung
= 0;
v oid Move ( f loa t dx , fl oat dy ) {
XPOS
yPos
= xPo s +dx ; = yPo s +dy ;
}
I I Virtua l Func t i on
I,
v i rtua l vo i d Dr aw (J { }
' endif
Code 444 Dcfininon dcr Klassc Kreis / '" Kr e i s . h
"'
Def i ni t i on de r Kl a s se Kreis
' i nc l ude "Fo rm.h "
. H o d e f _ KRE IS
' d efin e
KR EI S
c l ass Kre i s : public Form {
protected: f l o a t Radius ; public : II Ko nstruktor
4.4 Klassenhierarchie und v ererbung Kr ei s (s t d: :s t r i n g N, f l oat x , f l o a t y , fl o at r ) Form (N, x, y) Radius :: r ; F l a e c h e :: r * r * 3 .1 41 59 ; Umfa ng :: 2 * r * 3 .1 41 59 ; )
// Darstellung (h i e r: Text ) v oid Draw () (
cou t cout cou t cou t cout cout )
« « « « « «
"Obj e k t: " « Name « endl ; " x :: « x Pos« endl ; "y :: «yPo s « e n dl ; " r :: «Radius« e n d l ; - A :: « Fl a ech e« e n d l ; · U :: «Umf ang« endl;
,
fendif Code .. ~~ Definition 4.'1" Klasse Rechreck
/ - Re chteck .h Def init i o n de r Kl a s se Rech t eck
"'
' i n c l u d e " Form. h" ' i f n d e f _R ECHTECK ' d e f i n e _ RECHTECK
c l ass Rechteck : p u b li c Form {
p r otected : f l o at Laen ge ; f l oat Breite ; pub l i c : II Ko n s t r u k t o r Re c hteck (s t d::s t r i n g N , float x , fl oat y , f l o a t 1, f l o a t b) Form (N, x,y) La enge :: 1; Brei t e :: b ; Flaeche :: 1 * b; Um f ang :: 2 * ( 1 + b ) ;
J // Dars te11ung (h i e r: Tex t ) v o i d Dr aw () {
c out cou t cou t cou t cou t
« « « « «
" Ob jekt : " « N=e « e ndl; "x • « x Po s « endl ; « y Po s « e ndl ; "y • « Laenge « e ndl ; "1 • « Brei t e « e ndl ; "b •
265
4 Objektonentierte Programrmerung
266 cou t « cou t «
"A " "U "
« «
Flaeche «
Umfang «
endl;
endl ;
};
'andif Cod e 4-46 Definilion dcr Klassc Drcicck 1* Dreieck .h
Definiti on der Kla s se Dreieck
"/ 'include <ma t h. h>
'include - Form . h Hind ef _ DREI ECK I define _ DREI ECK
c lass Dr eieck : public Form (
protected : fl o at Se i t e _a; f Lce t. Seite _ b; fl oat Se i t e_c ; public : II Konstruktor Drei eck (s t d: : s t r i n g fl oat c I
N,
fl oat
x,
fl oat y ,
Form ( N , x , y)
fl oat s : 5
= l a +b +cl /2;
Se l t e_a Se i t e_b
Se i te_c
• • •
"b·
c,
Flaeche " s q r t(s * (s - a) * ( s - bl *( s-c)) ; Umfang = a +b+c; }
II Darstell ung (hier: Te xt) void Draw () (
cou t cou t cou t cou t cou t cou t cou t cou t
"
t endif
« « « « « « « «
"Objekt: " « Na me « endl; « xPos «« endl; "x • "y • « yPos « endl; « Se i t e _ a « endl ; • « Se i t e _b « endl; "b • « Se i t e - c « endl; "c • « Flaeche « endl; "A • · u • « Urnfang « endl ;
".
fl oat
a.
fl o at
b,
4.4 Klassenhi erarchie und v ererbung Cndl.' 4· 47 Definition dcr Klasse Linic
1* Linie.h Definition der Klasse Li n i e "/
'include <ma t h. h > 'inc lude "Fo rm. h" Hfndef _LI NI E .define _LI NI E c l a ss Linie : public Form [
protected: fl oat xL yl ; public : II Konstruktor Linie (st d::s t ri ng N, fl oat x . f l oa t y . fl oat dx . fl oat dy ) Form (N, x, y ) xl = dx ; yl = dy ; Flaeche 0; umfang s q r t( dx *dx +dy*dy);
= =
I II Darstellung (h i e r: Text ) v oid Draw () {
cou t cou t cou t c out c out c out c out
« «
« « « « «
"Obj e kt: " « Name « e nd l ; "x « x Po s « endl; "y = " « yPos « endl; "x l = " « x l « endl; "y l « yl « endl; "A « Flaeche« e nd l ; "U « Umfang « end l ;
="
=" = ="
i. f e nd if C udc 4·.11'1 Definition dcr Ktassc Punkt
1* Punk t . h De finition der Klasse Punk t "/
' i n c l u de " Fo rm . h " 'Hndef . de fi ne class Punkt : pub lic Form
267
26R
4 ObjeklOrientiet1e Programmierung
public : II Konstruktor Punkt (s t d : : s t r i n g N, fl oat x , float y ) Form ( N, x, y)
J
F l a ech e " 0 ; Urnfa ng " 0 ;
II Darstellung t h i e r : Text )
v oid Draw () (
cou t cou t cou t c out cou t )
« « « « «
~Obj ek t :
"x "y
"A "U
,
• • • •
« « « «
" «
N_ « endl ; xPos « endl ; yPos « e ndl ; F l aec h e « e ndl ; Urnfang « endl;
' e n d if C od t 4-'9 Demo progra mm zu den Klas sen
'* "'
Formen . cpp Ve rwa l t u ng aller Formen-Klassen
'include ' include . inc lud e ' includ e . inc l u d e ' i n clud e ' in clu d e ' inc l u d e
< ios t r e am . h > <s t r i n g > " Fo rm . h ~
" Kr e is . h" Rech t eck . h~ " D r e i eck . h ~ " L i n i e . h~
" Pu n k t . h-
int main ( ) IIDek l a r a t i o n e n bool sto p; I IObjekte e r ze u gen Kreis Tes t1 (" Kreis" . 1 , 2 . 3) ; Te s t1 . Dra w (); Rec htec k Te s t 2 (" Rec hteck". 2 , 1, S, 6); Test2.Draw ( ); Dreiec k Te s t 3 (" Dr e i e c k " , 3 . 3 . 3. 4 , S); Test3.Draw ( ); Li n i e Te s t4 (" Linie ", 3, 1 , 6, 4 ) ; Test 4 .D raw () ; Punk t Te s t S ("Punkt ", 2, 2); Test S .Draw () ; s ys t em (- Pa use");
4.4 Klassenhi erarchie und v ererbung
269
,•
Ohj ek t : k .. eb
•
a
,v
A 28.2743 18 . 8 4 '1'> Ob j" k t: Rr cht "",k
·1 U
,,• , , • '" " , ,,, ,s
b j "kt '
·
D..., i " ",k
,
,"
b j e k t : L i n i"
y
••
~
1
s
• • ·, •, • yl
• 4
.
~ 7.21 11 hje kt: P" nk t
y
~
'
2
O..uc k" n S i" "i n" hrlie b i g" T" st "
Bild ..-2-1 Ausgabe des Programmbcispie ls
:\Iehrfache vererbung Die An der Vererbung, d ie Sie bisher kennen gelemr haben . wiirde man in der Biologic als ungesc hlec hrliche Fortp flanzun g bezeic hnen : Jed e Klasse hat hoch stens ein Elternte il. na mhc h d ie Klasse. von der sie abgeteiter ist. Eben so wie ein Kind Eige nschaflen der Mutte r und des Vaters erben kann, isl es in C++ erIaubt. dass eine Klasse von mehreren - sogar bel iebig viele n - Klassen abgele ue t wird. Bei rneh rfacher Vererbu ng musse n bei de r Deklaratio n eine r Klasse mehrere Basis klassen engegebe n werden. Dabei werden d ie einzelnen Basisklasse n durch Komma ta ge trennt. vor der Init ialisierung el nes Objek ts werden die Konstrukroren alle r Bas isk lassen in der Reihenfolge aufgerufen. in der sie bei de r Klassendefinition engegeben wurde n. Dahei konnen auch Initia lisienmgsli sten verwendet werden, in denen di e einzelnen Konstruk tor-Aufrufe durch Kom mata getrennt werden. Ein ein faches Beispiel: So il eine Klasse Darsletlung von de n Klassen Kreis und Pos ition eb geleit et we rden. sie bt des so aus: c las s Oa r stel lung : p ub l i c Kr ei s , p u b l i c po s i t i on {
Es folgt em einfaches (und damit prax isfemes) Beisp iel. Eine Darsteltung hat einen Kre is und eme Position. die in zwei getrenn ten Basisklassen beschrieben werden.
270 C oM
4 Objektonentierte Programrmerung 4 ·~
Darstcllung cines Krciscs auf dcm Bildschirm
1* Darstellung. cpp
.,
Das Programm g i b t aioen Kre is auf ei nem imagin~ren Bildschirm a us
' inc l u de II Klas se Kreis -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -c f ass Krei s
protected:
int r Oo public : II Kon struktor v on Kreis Krei s ( i n t r l
"
r O :: r ;
II Darstellung v on Kreis v oid get Krei s I' (
cou t « cou t « cou to «
- e i ne n Krei s \n " ; -mi t dem Radius r endl ;
• «
r O;
II Klasse po s ition c l a s s po s it i o n
p r otected : i n t x O. y O; public : II Konstruk tor v on pos it ion po s i t i on (int x, int y ) (
xO yO
x; y;
}
II Gehe zur Pos i tion
vo id get Posi tion () {
cou t « c out « cou t «
"an de r posi tion \n " ; "x :: " « x O « " \t y e ndl;
" «
y O;
I I Kl a s s e Darstellung ---------------- - - - - - - - - - - - ----- c lass Darstellung: publ ic Kreis. p ublic Position (
public: / / Konstruktor
4.4 Klassenhierarchie und v ererbung
271
Darstellung t i n t r , i nt x , i n t y ): Krei s (r) , Position (x, y )
II Da.rstellung
v oid Ze i chne () {
}
,
c ou t « "Ze i chn e\n " ; get Posi t i on (); get Kr e i s ();
II Nu tz ung der Klas sen - --- - - - - - - - -- - - - - - - - - - - - - - - - - - - -
i n t main ( ) { Da.r s tellung 0 123 , 35 , 13 1 ; D.Z e i chne n . s ys t em(- Pa use- j;
\ 'i rt ll d l e Basi\kla \ \ cn
Ein Prob lem be i mebr facher Vererbung ist die .jnzuchr', Wenn eine Klasse von me hreren Basisk lassen abgeleitet wird. die wiederum eine gemelnsame Basi sklasse baben. gibt es d ie Hlerneme d ieser ge meinsamen Basis klasse rnehrfac h. Das fUhrt zu Mehrdeutigkeiten und erboh tem Speic herbedarf Beispiel : lnzucht
c l ass Hutter : p ublic Ahn ( " , J ; c l ass Va te r : p ub l i c Ahn ( , " J ; c l a ss Kind : p ub l i c Va t e r , public Mutter
{"
,J ;
In die se rn Beisp iel hat j edes Obj ekt der Klasse Kind d ie aus der Klasse AIm geerbren Elem en te doppeh. Urn das zu verm eide n. lassr sich di e Basisklasse als virtuelle Basisklasse deklarieren : Be ispiel : Virtue lle Basis klasse
c l a s s Mutter : v irtual public Ahn { J; c l ass Vater : virtual public Abn { J; c l ass Ki nd : public Vater, public Mu t t e r { ... J ;
---- - -
__
Hier wur de A/III zu elner virtu elle n Basis klasse und gibt seine Elerneme nur einmal an Kind weiter.
272
4 Objektonentierte Programrmerung
4.5 Virtu elle funktion en 1m vorangegangenen Kapitel haben wir in der Basisklasse die Methode Draw durch das Schlusselwon virtual als eine vinuelle Funktion ausgewiesen. Eine vi rtue-lie Funktion ist eine Merhoden funkuon. die in einer Basisk lassse de finiert wird. urn dann in einer oder mebrerer abgeleiteter Klassen neu definiert zu werden. Die vererbu ng ei ner virtuellen Funktion ermOglicht die Neudef mition der Funkrion. Diese Flihigkeit iIIustriert die Idee aus lkr O bj ektorient ierten Programrmerung: Eine Scbninsrelle. mehrere Methoden. Bei der Neudefinit ion wird das Wort virtual nicht mehr benot igt.
Das Schlnsselwo n \';T1l1aJ bewi rkt, dass d er Compiler d ie Funktion in einer Tabe lle der virtuellen Funktionen einua gn und er verxichtet auf das A bsetze n emes Funktionsaufrufs. Staud essen wird zum Code gesprungen. der mit dem Typ des Zeigers, wodurch die Funktion aufgerufen wurde, in der Tabe lle abereinstim mr. Es ist wicbtig J:U verstehen. dass virtuelle Funktionen nur uber Zeige r aufrulbar sind. In unserem Beispiel muss die ~fet hode Bewege nicht vinuel l definiert werden. da cine verschiebung eines Objekts im Kooedmatensys tem fUr aile Objekte gleich ist. Die ~let hode Draw isl jedoch Illr je des Objek l anders. Bei genau er Betrachnmg lassen sich Lwei wene re vinuelle Methoden definieren. die Berechnung von Hac he und Umfang. F~
-Name: string -xpos: float -ypos: float -Flaeche: float -Umrang: float + Fonn (~ ,x.y)
- Movct dx.dy) +Ca lc_A() +Clllc_U() +D I"(rn'()
Kild
4·2 ~
Cude
4 - ~1
Erweitcrung dcr Hasisklassc um virtucllc Mctbodcn
Definition dcr Basisklassc
1* Ba si s .h Definiti on der Klasse Fo rm Of
Hf n d ef _ FORM f d e f i n e _ FORM
,
clas s Form II Ei g e ns c h a f t e n
4.5 Virtuelle Funktionen
273
protected : s t d: ; string N4me; fl oat xPo s, yPo s ; fl oat Flaeche , Umfan9; II Methoden public : II Konstruktor Fo~ ( s t d:: s t r i n g N, t l o a t x . tlo a t y J {
Name
N;
xPo s X; yPo s = y ; II Bewe9Uflg v oid Move ( f loa t dx . fl oat dy l {
XPo s = xPos +dx ; yPo s yPo s +dy ;
=
II Virtual virtual virtual virtual )
,
Functions v oid Draw (I { J fl oat Ca lC_ A (I { fl oat Ca lc_ U (I {
l e n d if
Ub ungl' n
Die weitere Ausarbeitung uberlasse ich dem Leser . der rom allgemeinen versundnis diese Obung durchfbhren sollte. Allerdin gs ist diese And erung wenig sinn voll. da WiT darmt die Kapselu ng aufge ben war den. Frtlhe und spa te Bindun g
Eine sc hnnweise Zerlegung eines Problems in Te ilprob leme ist in der Programmie rung nichrs Neues. Was die Sache hier al1erdings interessant macht. ist die Tatsache. dass wir eine Methode Hir eine Klasse formuhe rt haben , die auf Hilfs methoden zug reift, d ie erst in den Unterklassen deflniert werden konnen. Man spricht hier von po lymo rphen (vielgestaltigen) Methoden, weil hinter einer Bezeichnung je nach Klasse versc hiedene Methoden stecken. Ahnliches haben wir auc h in den Klassen Kreis. Rechteck, Dreieck. etc. Die Methoden Calc_A und Catc_ U sind fllr diese Klassen unterschiedlic h. Dagege n stimmt der Text der Methode Move in allen uberein . Wenn wir jetzt von der textlichen Darstel1ung einmal abweic hen und uns vorstelten. wir hau en eine gn alisc he Darstellung. dann rnnsste auch diese Methode anders aussehen. Jedes geometrische Objekt karin bewegt werden. indem es zunac hst gelcscbt und dann mit neuen Koord inaten wiede r geze i~n wird. Es bietet sich an. zu den Klassen in der Oberklasse Fonn die Methode Move wie Iolgt abzuan dem .
274
4 Obj ektonent iert e Programrmerung
CoM 4-52 Erweitcrung dcr Methode Move II Bewegung v oi d Move
( f l o a t dx . f l oat dy l
Delete (J
;
xPo s = xPo s+dx ; yPo s = yPo s +dy ;
Dr aw l ) ;
Der Haken daran ist nur , dass der Compiler hier strei kt. weil er in Form : : ~o\·e die Method en De lete und Draw gar nicht kennt. Dbjektorien tie rte Spra chen hie-len emen Ausweg aus diesel Situation . C ++ iSI eine rypstren ge Sprache und der Compiler muss bei jedem Objekt wissen , von welchem Typ es ist, urn die pas senden Merhoden einzusetzen . Bei einer Anweisung wie Beisp iel: Metbodenaufruf
I Obj e k t .nrew .
priifl der Compiler den Typ der Variablen Objekl und setzt dann die ~l elh ode Draw 80s der en rsprechenden Klasse ein. Das nen nt man fruhe Bindung (oder auc h statisc be Bindu ng). Von spa rer B indung (oder dynamischer Bindung) spric ht man dann , wenn der Typ eines Objekts noe h nicht vom Compiler erkannt werden Kann oso ndem erst zur Laufzeit des Progt amms.
Spare Bmdu ng ereffnet eine rseits neue :\loglichk eilen. ande rerseus mus s sie mil einem verlusr an Effizien z erkau ft werden. Deshalb kan n in C++ zw ischen Iru her und spa rer Bindu ng gewiihh werde n. T rotz Typstre nge gilt: Einer Variab len vo m Typ Zeiger auf eine Klasse darf man einen Zeiger auf eine abgeleitete Klasse zuweise n. Ruft man uber diese n Zeiger eine Methode auf so muss im Fall de r fruhen Bindung der Co mpiler entscheiden. aus we lcher Klesse er die Methode nehmen soli. Dabei mus s er sic h nach dem Typ de r Zeigervariablen rich ren. Bei spa. ter Bmdung wird zu r Lau fzeit der aktuelle Typ des Obj ek ts. au f da s de r Zeiger zeigt. zugrunde ge legt. Spate Bindu ng wird in C ++ dur ch virtuelle Funktionen realisiert. Dutch des Schlusselwort virtual vo r der Dektereuon wird dem Co mp iler mitgeteih. dass er spa te Bindung verwenden soll. Tec hnisch wird dies dadurch realislen. dass j edes Obje kt der Klasse xusntxlich eine n Zeiger auf elne Ta belle enrhalt. d ie zu jed er virtue lien Funktion die zum Ohj ekt gehe rende Version angibt. lsi eine Funktion einmal als virtuel l erklart. ist sie automansc h in j eder abge leite ten Klasse wiede r vin uell. Zum besseren v erstandnis sollte man das Schlusselwon virtual bei j eder Neudefi nition in einer abgeleiteten Klasse wiederholen. obwohl C++ das freisleill. In unserem Forme n-Prog ramm werden in der Basisklasse Form die ge mei nsamen Eigenschaflen der konkreten Klassen (Kreis. Rechteck. Dreieck.. . .) definierr. Es hal keinen Sinn. Ohj ekte der Basis klasse selbst zu defin leren. denn eine allgeme ine Fonn kar mwed er ge zeig t noch geloscht werde n. Man spricht in so lchen Hillen von einer abs lraklen Basisklasse. In C++ kann ma n bei virtuellen Fun ktionen in einer Basisk lasse aur eine Implemenlierung ve rzichten. indem man ;; 0 hint er d ie Funktions deklaration schreihl. Eine solehe Funk tion heiBt dann rein virtue ll (pure virtual). Eine Klasse mil mindestens einer rein virtuellen Funktion ist eine abslra kte Basisklasse. Die Definition von Obj ekten einer so lchen Klasse be trachtet der Compiler als Fehler.
4.5 Virtue lle Fun ktio nen
275
In der folg ende n Ver s ion des Figuren- Programms werden im Hauptprogramm j e em Kreis und ein Rechteck definien . Beispiel: Ze iger fUr die aktue lle Form
I Fi gu r
- ak t uell eFi gur ;
Einem Zei ger kann wahlweise d ie Adresse de s Kreises oder des Rechtecks zu ee wiese n werden. Beisp iel: Auswah l
I aktuelleFigur -> zeige ( I;
Die Wirkung der Anweisung kann deshalb ers t zu r Laufzeit ermittelt werden. Bever wir da s Programm schreiben. erstellen wir vorher noch ein Klas sendiagramm Es Ieistet bei der spa teren Programmierung gu te Dienste.
Pigur
Pun kt " x Pos: lm It y Po s: int
- Figur [ x. y) + k igo.'(l
- Punkl [x. y)
+ Loesch,-,() + Bc \\' e~e()
-T
Ze ige ( ); do
,
c o u t « - \n \ nMenue: [R ]echteck I K] r e is c i n » c ; II auf Taste ndruck wa r t en cout « endl ; switch ( t o upp e r (e l l
( B] ewege
[ El n de ";
(
case ' E ', b r e a k ; c a s e ' R ':
a k tue l l e Figur->Loesche 11; a k t uel l e Fi gur = &R ; a k t u elle Figur ->Ze i ge {J ; b r ea k ; } case ' !C':
akt uelleFigur- >Loes che (I ; akt uel leFigur = &K ; a k tuelle Fi gur- >Ze ige (I ; b r e a k; c a se ' B' : II Bewegung cou t « - Bewe gung : (L ]ink s c i n » c; s witch ( toupp e r (el)
l R] ech ts
[Ol ben
[U]nten " ;
(
case case c ase c ase
' L' : aktuelleFigur->Bewege ' R' , a ktuelleFigur->Bewege '0' : aktuelleFigur->Bewege ' U' , a ktuelleFigur ->Bewege
I while (toupper (c)
!=
( - 1 0, 01; break ; ( 10, 0) ; break; (C , 1 0 ) ; break ; (0 , -10 ) ; b reak ;
'E');
Ubllng ( rbe n ragen Sie d ie Klassen in einzelne Module und binden Sie sie mil ttinclude ein. Erganzen Sie dieses Programm mil einern ec hten Grafiksyslem.
Die po lymerphe Lisle Eine typische Anwendung der spaten Hindung sind polymorphe Listen. Ein CAD-Programm zum Beispiel muss eine vielza hl verschiede ner Obj ekte speichem. Hierro definiert man eine abs trakte Basisklasse mit virt uellen Funktionen. von der aile bencrigen Objekuype n abgeleitet
4.5 Virtue lle Funktionen
279
werden konnen. A Il~ Objekte konnen dann in einer Liste von Zeigem au f die Basisklasse verwa llet werde n. Eine BildschinnaufTrischung besteht dann ein fach darin. da ss rur aile Elemente der Liste die virtuelt e Method e zum z eictmen aufgeru fen wird.
A" ul'nd ungsbdspiel: Ktasscn hier archlc - Blcgctra ger Bisher habe ich zum Vers tandnis aller lngenieurbereic be als Beispiel geo metrische Forme n gewlililt. Nacbfolgend so li als Praxisb eisp iel d ie Berechn ung vo n Biegei ragem Iolgen. Dabei beginnen wi r mit dem ~ia le ri a l . Material +
~tal:-Jame :
char
+ EModul: double + QuerZah I: double
+ SModul 0
Bild .. -27 Oil' Klas."C Material
Die se Klasse hat auuer dem Namen noc h das Etastizi taumodut und die Qllerkufltraktiol/.fzahl IPoissonzahh als Allribute. Oil' ~I ethode SM(J(lul bestimmt das Schub modu l des Materials. Damit erg ibt sicb de r nach folgende Code . Code .. - ~ Oil' Klass.: Materia l / * Ma t e r i a l.h Def i nitio n d e r Attr i bute z u r Kl a s s e Mate ri al
"f class Mat e r i a l {
pub l i c , c h a r MatName [ 20 1; d o ub l e EModul; / * Elast iz itaetsmodul i n kN /mmA 2* / / * Querkontrakt i onszahl * / d ouble Quer Za hl;
/ * Sch u bmod u l * / do ub l e SModu l J,
() ;
Code 4-:':' Oil' Method e tier Klassc Material / * Mate rial. c c De finit i o n d e r Me t h o den z u r Kl a s s e Mate ri a l "f
280
4 Obj ektonentierte Programrmerung
1 * sch ubmodu l * 1 d ouble Ma t e r i a l : : SModul
I)
(
r e t ur n EModul / (2 * ll +Que rZahl ) l;
Ein einfecbes Progremmbe ispiel demonsmerr die Nutzu ng der Klasse Material. Code .t.!'6 Dieses Dcmoorogramm instanziert drei Objekte dcr KJas."C Material.
1* Material .epp Oieses Programm erzeugt eine Klasse Material und i n stanziert mehrere We r k s to f f e "/ ' i n c l u d e < ios t r e am. h> ' i n c l u d e - Ma t e r i a l. h" ' i n c l u d e - Ma t e r i a l.cc" int mai n (I (
II Deklarationen Material St, Cu , AI ; II Instan z i e r u n g e n s t rcp y( S t. Ha.t Name, -St a h l-) ; S t . EHodu l " 21 0 ; S t. Qu e r Za hl " 0 .3; st r cpyl Cu. MatNarne, Cu.EModul " 12 0 ; Cu .QuerZahl " 0. 3 3;
~ Kupfe r -);
s trcpy (Al.MatName , "Alumini um" ); Al. EMo d u l " 7 0; AI . Qu erZa h l " 0.33; II Au s g a be c o u t « "Berech n ung : " -c end l; cou t « St. MatName « " - " « "S Modul " « S t .SMod u l (} « endl; c out « Cu . Ma t Na me « " - " « " SMod u l " « Cu . SMo d u l() « e n d l; c o ut « Al .MatName « " - " « " SMo d u l " « Al.SModu l( ) « e n d l ; sys tem ( " Pause ") ;
4.5 Virtue lle Fun ktio nen
281
8erechnllng; S t a h l - S I'tOd ll l = 80 .7692 k N/AA A2 Kupf .. r - S l'to dli l - 45 .1128 k N/""" A2 AlliAiniliA - Sl'to dli l - 26 .3 158 kN/AA A2 Druck e n S i .... ine bell.ebige Ta >:t .. . . .
lJild 4-21' Die Ausgabc des Dcr noprogramms Material
1m nacbste n Sc hritt fnbren wir d ie Klasse de r Trager ein. Urn die Auribute und Merhoden des Materials nutzen zu koone-nowerden sie vererb r. Traeger
Material
+'r.\ame: char + Breite: double + Hec he: double + Lacnge: double
+ Matx ame: char + EModul: double + Qu erZahl: double + SModul ()
+ HMomcntO
BUd .. -29 Die Klasse Tracge... erta von der Klasse Material
Diese Klasse hat a uuer dem Namen noc h die Ouerschmnsmeee und die La nge des Tragers. :vIit dern Qu erschniu berec hnet sich das Flacberuraghe lrs mome nr. lias die Meth ode FT ~1 besti mrnt. Damit erw eite rt sich der Cod e wi e fotgt. Code 4-S7 Die Klasse Traeger
/ . Traeger. h Definition d e r Klasse Tra e ger
"'
class Trae ger
pu blic Mat eria l
{
p ub lic , / . Attr i bute . / char TNarne [201; double Bre i t e ; double Hoehe; double La e nge ; / . Met h oden . / double FTMome n t }
,
/ * Quers chni tt sbrei t e in mm* / / * Que r s c hni t t s hoe he in mm* / / * Tr a e ge r l a e nge in mm· / (l ;
Code ... ~ Die Method cn der Klassc Traeger
/ . Tr e eqe r , c c Met hoden der Klasse Traeger
/ . Fl a ch entr a ghei t smome n t in
cm~ 4
./
282
4 Objektonentierte Programmierung
"/ 1 * FI~ chentr4ghe itsmoment * 1 d ouble Traeger::FTMoment I) (
d ouble FTM ; FTM = Breite*Hoehe *Hoehe *Hoehe ; FTM FTM / l ~ /l u u u u ; return FTM ;
=
Auch hier wone n wir mit einem kleinen Demoprogramm die Korrektheit oer Deflnitionen nberprafen.
1* Tr a eger.cpp Di eses Programm erzeugt eine Klasse Traeger und instanziert mehrere Obj e k t e "/
. i nc l ude .include 'include 'include 'include int mai n
"Ma t e r i a l . h " "Ma t e r i a l . cc " "T r a ege r . h"T r a ege r .cc"
(I
(
II Deklarat i onen Traeger Tl , T2 , T3 ; II I n stan zierungen strcpy(Tl.TName , " Qu e r t r a e g e r" l ; T l.Breite :: 2 0; T1 .Ho ehe = 6 0; T l .La eng e = 12 0 0 ; s t rcp yl T1 . Ma t Na me , "S t a h l ") ; Tl.EMo dul = 210; Tl.QuerZahl :: 0 .3;
s t r c p y (T2 . TNa me , "Stuet zt raeg e r"); T2. 8 reite = 30; T2.Hoehe = 80; T2. Laenge = 22 0 0; s t rc p y (T2 . Ma t Name, " Kup f e r ") ; T2.EModul :: 12 0; T2 .QuerZahl :: 0. 3 3; s t rcp y( T3 . TName , "La e n gs t r a e g e r "l; T3 .Breite =22; T3 .H oehe :: 7 6; T3 . Laenge = 18 0 0 ; strcpy (T 3 .HatName , - Al umi n i um-) ;
4.5 Virtue lle Funklionen
283
T3 . EModul = 70 ; T3 .Q u e r Za h l = 0 .33; / / Aus gabe cout « " Berechnung: " « endl ; cout « "Traeger = " « Tl. TNarne « endl ; cout « "\tMaterial « Tl .MatName « endl ; cou t « " \ tS c h u b -Mo d u l = " « Tl . SModul () « " kN / nun" 2 " « endl; cout « " \ t FTMorne n t = " « Tl .FTMornent() « " =" 4" « end! ; cou t « "Traeger = " « T2 . TNarne « endl; cout « "\tMaterial = " « T2 .MatNarne « endl; cout « "\tSchub-Modul = " « T2 . SModul ( ) « " kN / rnm" 2 " « e ndl ; cou t « " \ t FTMorne n t = " « T2 .FTMornent() « " =" 4" « endl ; cout « "Tr a e g e r = " « T3 . TNarne « endl; cou t « "\tMaterial = " « T3 . MatNarne « endl; cout « "\tSchub-Modul = " « T3 . SModul ( ) « " kN/rnm"2 " « e ndl ; cout « "\t FTMornent « T3 .FTMoment( ) « " =" 4 " « e ndl ; sys tern ( "Pause" ) ;
="
="
B.. .... c hmmg: Tr a e g e r ~ Que r tra e g e r Ma t eria l = Sta h l Schub- Modul ~ 80 .7&92 kH/AA"2 FTMoAent = 3& cn"4 Tr a eg e r ~ Stuet ztrae ger Ma t eria l = Hupf er Sc hub- Modul ~ 4 5 .11 2 8 kH/AA"2 FTMoAent = 1 28 c A" 4 Tr a ege r ~ La e ng s t r a eg el' Ma teria l = Al un i ni uA Schu b - Mo du l ~ 2&.3158 kH/AA"2 FTMoAent = 80.4789 c n "4 nriicken S i e e i ne beliebig e Ta s t e . _ .
Hild 4-30 Die Ausgabc des Dcmop rogramms Traeger
A ls weirerer Schritt folg t nun die Einfiihn mg der Klasse Last/all. Narurlich soli auch diese Klasse die Attribute und Methoden de r ande ren Klassen erben . Doch zuvor mussen wir wieder ein wenig Mathematik berreiben. Den angenommenen Last fall zeigt Bild 4-3 1. Dabe i handel! es sich um einen einseitig eingespannten Trager. mit einer Streckenlast fiber die ganze Lange (z. B. Eigengew icht) und einer Punktlast am Ende.
F Q = q ·1 M (x l (
-, x
Hild 4-3 1 Einscitig cin gcsp anntcr Trager mit Pnnkt- un d Strcckcnlast
q(1- x)
2&4
4 Objektonentiert e Programrmerung
Das Biegemoment an der Stelle x bestimmt sich nach Darstellung aus
(4.4)
( 1-' ) M ( x ) = F(1- x) + Q(I - x ):
\ 2
DUTch Einsetzen in die allgemeine Gleichung der elastischen Lime , M (x } y =---
(4.5)
EI
ergibt sich y' =
- -!..(F(I- x) + ~ (1 - X)!). EI
(4 .6)
2
Eine Integration fiihn auf di e G jeichung der Balkenn eigung
, I(
F1
q lq ,
y =- Flx - -x + -q h, ,,- - Ix + -x +c E1 2 2 26 -
)
(4.7)
mit der Randbedingung y'( x = 0) = 0 folgt cl = O. Eine noch malige Integration fiihrt auf die G leicb ung der Durchbiegung
y=- -
1(F F)+-q 1 x - Ix - -x t
1
EI 2
6
4
1
- -q Ix) +q- , 4 +c
6
24
mil der Ranobed ingung y(x = 0) = 0 folgt auch ci
)
(H)
2
=0 .
Fur unseren Algorithmu s erha lten wir die beiden G leicbungen (4.9) und
(4.iO)
in denen die Lau fvariable x n U T im Quotienten auf'tritt. Nun sind wir auc h in der Lege unsere Klasse Lastfall zu deflnieren.
Lit._lrall t Hczcichnung t Punkllao;l
t Strcc kcnlast t .\1umenl(1.7.) t Durchbiegungt f.z)
Traeger
.\1alcrial
t TNarne : c har
f--.-o
t Breite : double t lloe he: double t Laen ge: double t
}:T~fomen1()
Sli d ....32 Die Klassc Lastfall erbt von den andcrcn Klassen.
f--.-o
.\ 1aIName: c har t E.\1od ul: duuble t Qu erZilhl: double
t
t S.\1od ul
o
4.5 Virtue lle Funktionen
285
Dies e Ktasse Lastfall hat euuer der Bezeic hnung die Punktlast und d ie Sueckenlasr. Die Me thoden ste llen die Auswertun gen dar. Cod e ~ -60 P ic Klasse Last fall
1* La 5 tf all.h De f i n i tion der Kl a s se Lastfall "/ c l ass La 5tf all
public Tra eger
I
public : 1* At t r i b u t e *1 c h a r Bezeichnung (2 0) ; 1* bel astende Ei n %e lkraf t in kN *1 d ouble Punktla5t ; d ouble St r eck e n l as t; 1* g esamte S t rec kenla st in kN *1
1* Meth oden *1 }
,
d ouble Mome n t (doubl e I . d oubl e %1 ; d ouble Durchbiequng (doubl e I . d oubl e %1 ;
Cud I.' " -61 P ie ML'1. hotlen do..... Klasse Lastfall
1* La5t fall. c c Me t h oden d e r Klas se La s t f all "/ /" F'u nkti on : Moment Bi egemoment in kNm an d er St e l l e x Ou t p u t: I ; F I ~che n t r~ghei tsmomen t i n crn A 4 I nput : % ; Qu o t ien t v o n x II "/ d ouble Las t fa l l:: Momen t
I
d o uble d ouble d ouble do uble
F Q E L
, , ,
(double I . d o ub le %)
Punktlast ; / " Ein%elkraft in kN St r eck e n l a s t ; / " gesamte S t r ecke n l a s t i n kN EModul ; / " Elastizit~t smodul in kN /nun" 2 Laenge; / " Trager lange in mm
"/ "/ "/
"/
r eturn L / 2 * (1 -z ) * (2 *F'+Q* (1 -z } } /IOOO; /" F'unkt i o n : Durchbieg u n g Out p u t : Dur c hbiegung in mm an der S t elle x I ; F I ~ chen tr ~ ghei tsmoment in cm " 4 Input : % ; Qu o t i ent v on x II "/ d ouble La stf all : : Durc hbiegung (d oubl e I . d ouble %)
I
d ouble F' d o uble Q
Pu n ktlas t ; 1* Einzelkraft i n kN S t r eck e n l as t; 1* gesamte St r eck e n l as t in kN
"/ "/
4 Objektonentierte Programrmerung
2' 6
1* Elastizitatsmodul i n kN/mmA2 1* Tragerlange in mm
d ouble E " EModul; d ouble L " Laenge ;
double xl ,x2 ,x3.x4 ;
"'"'
xl " 3 * Z * 2- 2 * 2 * 2;
x2 6*2*2 -4*2*2*2+2*Z*2*2 ; x) 4*F*xl+Q*x2 ; x4 " L"L*L*x3 / (24*E*t *1 0000 ): return x4 ;
Das nacbfolgende Programm bestimmt Durchbiegung und :\Iomenle n\'er lau f rur einen spez iellen Lastfall. Cod e .&-62 Bestimmung von Durchbiegung und Momentenverlauf flrr emcn Hcispiel-Lastfall
'* Demop rog r amm zur Klas se Last fall w stfall .cpp
"'
'include 'include "Ma t e r i a l . h" .include "Ma t e r i a l . c e · .include "Traege r . h" 'include "Tr a ege r .ce· 'include "Last f a l l. h" 'include "Las t f a l l .cc·
,
i nt main () II Oeklarationen
double x , Z , t , d , Hi Lastfall Ll ;
FILE · p u f f e r ;
puffer
= f open (" C: \ \Temp \ \ Biegung.dat " , "w");
II Instanzierungen
s t rcpy( L1 . TNarne, "Que r t r a e g e r " ) ; L1.Breite = 20; L1.Hoehe 12 0 ; L1.Laenge 1200; s t r c py lL1 .Ma t Narne , "Stahl"}; L1 .EModu l = 210; L1 . Que r Zah l = 0 . 3 ; L1 . Punk t l a s t = 1.4; L1. St reckenlast = 0 . 6;
= =
I I Ausgabe cou t « cou t « cou t « cou t «
"Berec hnu ng : " « endl; "Tr a ege r = " « Ll .TName « endl ; "\ t Ma t e r i a l = " « Ll .Mat Name « endl ; -\ tSchub- Modu l = " « Ll . SModu l {) « • kN /mm A 2 " « 1 = L1 .FTMornent ( ) ; cou t « - \ t FTMorne n t « I « " cmA 4- « endl ;
=-
endl ;
4.5 Virtue lle Fun ktio nen c cuc «
287
endl ;
f or ( x:O ; x< : Ll. La e n g e ; x : x +lO) (
z x /Ll .Laenge ; Ll .Durchbiegung (I ,z ) ; d H : Ll .Homent (I ,z l ; cou t « ·x :: • « X « "\ t d :
•
«
d «
"\ tH ::
- «
H «
endl; fprintf (p u ff e r .
" %6 . Of\ t %2 . 4f \t%3. 3 f\ n- , x, d ,H ) ;
}
fprintf (p u ff e r, "\n "); s ys t em(" Pa use") ;
Das Ergebnis lasst sich in Listenform und grafi sch darstellen.
, •.s
e.s
+----c
Hild 4·.1.1 Des Ergcbei s des Tcstbc ispie!s
Uhu ngc n Erstellen Sie llir den gleic hen Lastfall weitere Beis piele. Erstellen Sie danach ande re Lastfalle
wie r, B. flir einen beidseiug aurliege nden Trager und berechnen Sie zuslHzlich d ie Spannunge n.
288
4 Objektonentierte Programmierung
4.6 St rea ms Das Konzept In C++ ist ein Strom (e ngl. stream) eine Folge von Bytes. d ie \'o n einer Quelle zu einem lid transporti ert werden. wir sprecben auch von Darensrrom . Operator » Zid DDD ... DD D ll~~
Quellc
Bytes
BUd 4.34 Ein Stream
Streams benougen vom Konzept her weder ein Gerar noch eme Daiei. da sie im Spe icher verwalter werden. Die Untersc beidung, welc hes das l id des Stroms ist. wird durch die Klasse des verwe ndeten Obje ktes festgelegt. Die benorigten Benutzerschninstellen beli nden sich in den entsprechenden Headerfi les. Aile ~1 0gl ichkeiten dec I!O- Bibliotheken vorzusrellen. wurde den Rahmen dieses S uches nbersreigen. Ich konzentriere mich auf d ie Details. d ie fllr das allgemeine Arbeiten mit Strea ms wicbng sind. In fast allen Progra mmbeispid en wurden bereits Standardkana le filr die Em- und Ausgabe verwender. In diesem Kapitel wird deren Struknrr erla urerr. ios bao;c ba._ic sos-o-
.4
basic isrream-c-
I basic
jostreame>~
~ bas ic_os lrcam
bas ic itstreamc>
I-
WI
basic tsrreamc>
ba., ic filebu t
nasic orstrca m-c> basic istrin stream-c> basic srn nestreum-c-
basic stringbufc>
ba sic o srnn ustrcam -c-
basic- streambufe>
Bild 4-] 5 Hierarchic dc r fund amc ntalcn Stream-Klassen
Die Basisklasse ;OJ_ba.H> definiert die Eigenschaften alter Strearnklasse n. d ie unabhllngig vom Zeichentyp sind. Es hand elt sich dabe i im Wesemlic hen urn Komponemen und Funkuonen fU r Format- und Status-Flags.
4.0 Streams
289
Das Klassen-Templa te hCl.~ ic_i(J.~< > wird entsprechend dem Klassendiagramm in Bild 4-35 von ios_ha.'·e abgeleitet und definiert die generellen Eigenscha flen aller Strearnktessen. die vom Zejchentyp abhangig sind. Dazu gehort auch die Definition der Puffer. die von den Streams verwender werden. Ein solcher Puffer ist ein Objekt eine r von der Klasse ba.~ic_strellln hl~f< > abgeleiteten Klasse. Sie dient zum eigentlichen Einlesen und Ausgeben der einzelnen Zeichen. Die anderen Stream-Klassen sind ffu die Formatierung der Daten zustandig. Die Klassen-Templates I/(nic_istream und basicostreom c > definieren Dbjekte, die zum Einlesen und Ausgeben verwendet werden. Die meisrens verwenderen Klassen istream und ostream sind die dazugeborigen lnstanzierungen fUr den Datentyp char. Sie wurden vielfach in den Anwendung sbei spielen ein gesetzt. Des Klas sen -Template haficjo.ftream definien Objek te . die sowoh l zum Einlesen als auch zum Ausgeben verwendet werden .
Filr den Zugriff auf Strings und Dateie n we rden zusatzlicbe Klassen definiert, die in den nachfotgenden Kapiteln besc hrieben we rden . Die nachfotgende Tabe lle zeigt d ie globalen Objekte der beschriebenen Klassen . T ab tll r 4-2 Globale Objekte dcr Standard 1'0
Symbol
Datentyp
Standard -
"n
lsrream
Eingabekanal {Tastatur]
Fu r d ie Eingabe steht mil dem Operator (») da s Penda nt ro m Ausgabe-Op era ror zu r Verfb-
gung.
Beispiel: Eingabe eines lntegerwert es l i n t i; ein » i ;
Es ge lten die gleiche n Aussagen wie scho n rUT den Ausgabe-Operator: Der Eingabe-Operetor ist filr aile C e-e-Standard -Datemypen defi niert bzw. ube rleden. Zude m kann er auch auf eigene Datentypen durch Ijberladen acsgeweitet werden.
Streamzusta nd e Wir wolten uns nun ein wenig au sflthrhc her mil dem Stream -Konzep t ausemandersetzen, insbesondere mil de r Fehlerbehandlung. wenn etwa eine A usgabeenweis ung [aus we lcben Grund auch imme r) nicht korrekt durchgefu hrt werde n konrue. Hierzu wird der Begri ff des zusrandes eine s Streams eingefilhrt. Jeder Strea m {istrea m, os tream, [stream ...) kann sich gtu ndi..aLd ich in versc hiede nen Zusllinden befi nden. Er karin sich in einem fehlerfreien . ode r abe r in einem fehlerha ften Zusl and befinden. Letzterer wird noch nach der Art der Fehlerhaffigkeu und die Auswirk ungen auf den Fo rtlauf des Progr amme untersc hieden. Beispiel: Dieser Code nbe rprn ft. ob die Eing abe er folgreich war if (ein »
xl
(
II Einl e s en hat geklappt
Auf den ersten Blick isl kein eswegs klar . wie so die ser Ausdru ck auch tatsdchlich da s tester, was man erwartet. Der Ausdruck cin » x liefert namlic h keinen boclschen Wert, sonde rn, damit ein verkene ter Au fruf moghch ist, zunac hst wieder c ht, Es muss dem nach so etwas wie eine imphz ite Typumwandlung staugefunden habe n, Oe nau gen crnmen w ird getester. c b sich der cin in einem fehlerfreien Zust an d befindet. Tllhdll' 4 ~ Zugriffs flmktionen auf Stream-Flags Funkuon
Bede utung
int ios::fail (void)
Ausfllhrungs fehler
int iosceott void)
Dateiende erreicht
int ioscbedtvcid )
Datenveriusl oder Fehle r
int ios.tgoodtvoid)
kein Fehler
lnt ioschard feih void )
Hardwarefehler, sys te mab hangig
292
4 Objektonentiert e Programrmerung
Treten beim Einlesen oder Ausgeben Fehler auf, dan n wird ein Flag in eine m Statuswort im ios -Teil des Stream s ge setzt . Erst mit Losch ung des Statusworts ist ein weiteres Einlesen oder Ausgeben mogfich. Die Ab frage der Flags er folgt durch Zugr iffsfu nktionen. Wie im vorangegangenen Beispiel gezeigt . karin man gut ab fragen. ob slch ein Str eam im Normalzustand befindet. So ist auch .•!" und die vorhandene Ty pumwa nd lung vo n void" in bu nu tzbar.
Be-isflid e:
E in ~ l l
von Zug rilTsfunktionen
i nt i o s : : operato r
!
(J
can s t
{
r e tu rn f a i l (l ;
i o s : : oper a t or v oid * {I cons t {
r e t urn fail (I? (vo i d * I 0: (vo i d *) ( - 1) ;
'Ian ipul at oren Die Angabe des Eingabe- und Ausgabe formats erfo lgt nicht meh r in der Art cines Forma tstrings wie in C bel prinu und sca nf Ma n verwe nder dazu Methoden (Memberfcnktionen) del' Strea m-Klasse n. kurz Stream-:\Ianpulatoren . Dabei hande lt es sich urn Objekt e. d ie in den Stream emgebaur werde n und eine Anderung des inrernen Zustands eines Stream bewirken. Das in einigen Beispielen benutzt e emil schreibt eb enfalls ern Zeilene nde und ist dem umstandlichen ..In" vorzuz leben. da es gleichzemg auch aile Dalen im Puffer au sgibt. T ahelte 4-!, Manipulatorcn
Manipulator
Bedeutung
d'" h"
dezimale Au sgabe vo n Integer-Typen (de fau lt)
OCI
okta!e A usgabe von Integer-Typen
flush
Schrei ben aller gep ufTerten Zeichen
end!
Zeilenumbruch & flush
w,
hexadezimale Ausga be von lnteger-Typen
Whuespaces cbe rtesen (fu r Eingab e)
setw (int n)
Ausgabebr ene au f n Zeichen serzen
setprecis ion (int)
Nachkommastellen fllr f lieLlkomma -Ty pe n sev en
setlill (int)
Fullzeiche n einstelle n
setios fla gs (lon g)
los-Flags serzen
Resenosrlags (long)
los-Ha gs loschen
4.0 Streams
293
Beispiel: Ausgabe der Daten aus dem Puffer ohne Zei lenvorschub
I cou t . fl ush'); Ilode r cou t «
f l us h
Letztlich gibt der Manipulalor em Il ein '\0' aus und k en den Ausgabepu ffer ('\0' beendet auch einen String). Beispiel.Weuere Man ipulator!'n cout « x ; cou t. end 1(); cou t « y ; c i n. e a t wh i t el); c in » x ;
II Zeilenumbruch II FUhrende Leerzeichen Uberlesen
Hier wurden die verschiedenen Operarionen als separate Anwei sungen gesc hne ben. Dies ist natilrlich rn6g:lich. minden aber die Ijberslchtlichkeit im Programmcode, da einzetne logiscbe Verbindungen zwischen den einzelnen Operationen nicht mehr unmitte lbar zu erkennen sind. Man kann daher endl bzw . etuwhite auc h direkt in die Ein- oder Ausgabeanweisung schreiben. Beispiel: Ausgabe als pipe
I cou t
«
x «
e ndl «
y;
Beispiel: Ausgabeurnwandlung cou t « «
setfill ( ' _' ) « setprec isi on (7 1 « s e t w(20l 3 .1 4159265 358979 32 38 4626 43 « e nd l ;
3.1415926 ( II fiihrende Unterstriche).
Liefert als Ausgabe Beispiel: Zahlemumwandlung int i: 33 ; s t d : : c out « s t d : : c out «
i « " : (" « std : : he x « i; "1 _ 16 : (" « s t d : : oc t « i «
"l 8\ n" c'
_
Liefert als Ausgabe Illr i:::33: 33 = (21L 16 = (4 1L8 . EI('mcntru nklioncn dcr Ausga bc In der Klasse ostream existieren Elementfunktionen zur A usgabe von Zeichen. Syn tax: Di e Elementfunktion put 0
I ost r e am& p u t
(c ha r cj .
gibt den ubergebenen Parameter c als nachstes Ze icben aus und liefert als Return-Wen seinen Zustand zurtick. Dies is! die Bestatigung. ob das Scbreiben erfolgreic h war.
294
4 Objektonentierte Programrmerung
Syn13X: Die Elemmtfunktion write 0
1 os t r e am& wr ite (ch a r " Ze ichen fo lge. i n t Anz a hl ) ; gibl die Anza hl Ze ichen der Zeichenfolge aus.
Scl bsfddi niel1e ' l an ip ulalorl'n In C ++ steht es jedem Program mierer frei. zusatz hcbe Funktionen nach obiger Art und damit zusarztiche Mampularor en ( m il oder ohne Parameter) zu r Verfiigung zu stellen. Beispiel: Eigene Manjpulatoren i s t r e am& ignoreLine (i s t r e am& s t rm ) {
c ha r c ; /.
./
Sch l e i f e: sol a nge Zeichen einlesen. wie ein Zeichen gelesen werden kann ultd dieses n i cht Newl i n e i s t
while (s t rm. g e t( c) && c != ' \ n'J ( ; II s t rm f Ur Ve r k e t t ung zu ruckl iefem r e t urn s t rm; )
Bisher haben WiT hauptsachli ch un formaue rte Ausgaben berrachtet, da es uns bis her nur auf d ie :\lOglich keil einer Ausgabe an sich angekommen ist. Haufig ist es j edoc h so, fH ;n-----;H ~lIlHI..
9 fl oat wT[ 4] , wD[3]; fl oat Minimum (f loa t a , fl oat b ) ; void Fu z zyTemper a t u r (f l oa t T ) ; void Fu z zy Drue c ke (i n t i ) ; void Au s gabe ( f loa t E l11] [ 1111;
298
4 Objektonentierte Programrmerung
i nt mai n () ( II Dek la ra t ionen int i, f • k , 7. ; fl o at M14 ] [6 1 . v [ S ] ;
fl oat T. u , u l , u2 , SV; flo at a . b. E [l1 ] [ 111;
FILE ·puffer ;
= f o pen ( - C : \ \Temp\ \ Fuzzy . dat " , "w" ) ;
pu f f er
II aber a I le Tempera t ur en z = 0;
f or IT=600; T--------- [::::i~§!:=
Hild " -0 Einbindung der String-Strearn-Klac..en in die Hierarchic der Stream-Klassen
Ana log zu de n funda mentalen Stream-Klas sen ist istringstream die Klasse fU r einen Stringeingebestream. ostringstreom die Klasse rur eine n Sm ngausgebesueam und smngstrecm ist di e Klasse flir einen Stringein- und -ausgabestream. Vnd auch hier gtbt es eine Puffer-Klasse. Das Einles en und Acsgebe n ist vergteic hbar zu SSCOIij'O und spril/¢) in C. Beim Iorma tierten Einl esen aus eine m String mit Hilfe der Kresse istringstream kann man /.. B. leicht einen Siring mit whitespaces in einz elne w c rter zerlegen ode r nach Tokens trennen. Strings in andere Dateruypen umwandeln. wie z. B. eine Zahl im String in einen int-Wert. Auch die Umwand lung vo n Zeilen eine r Tex tda tei oder von Dbe rgabe paramerem an l1Ioin O sind moglich und vietes andere mehr. Das formatl erre Ausgeben mehrer er Ausdm cke mit Hilfe der Klasse ostringstream (ggf. von verschied enen Datentypen) in eine n String sind moglich. Sie erlaubt ein elega ntes Zusa mmensetzen von Strings zu Me ldungen. Wamungen. Ausgaben . etc.
Ar bcue n mit islrlngs lrl'a m Ein String-Eingab estream ist ein Inputst ream . der seine Daten aus ei nern Siring bezle ht. Ern C· String des Daienryps .x har '" .. bzw. .,const char > ... aber auch ein C++-Obje kt der Klasse string kann zur lnitialisierung eines isrrillg.ftream-Objek tes herangezo gen werde n. Cede "-6-' Dcmoprogramm - Einlescn aus cincm String
1* Ei n l e s en . c p p Demoprogramm zei~t das Ein l e s e n v o n Daten a us einem Str ing ./
302
4 Objektonentiert e Programrmerung
l i nc l ude f i nc l ude <sst ream> f i nc l ude <s t r i ng> usi n~ name s pa c e s t d; i nt llIai n ( ) {
s t r i n g Ze1 1e C-Dreieck
j
4
~ . ,;
c h a r Name [ 2 0 j ;
i nt a . b . c; II St r i ng bu f f e r f Ullen
istringstream sinf Ze i l e);
II Wer t e. get r e nn t durch Leer zeichen s i n » Name » a » b » c; 1/ Au s g a be
cou t cout cou t cou t
«
"NllI!le':
« « «
·Se i t e
• b
"se rce ·Sei t e c
«
• • •
N_ «
« « «
• b
« « c «
emU ; endl ; endl ; endl ;
s ys tem ( • s euse - ) ;
...,: Dr e H,ek It .. a ' ] IO It" b= 4 I! .t !! c - S Dru cke n S I" ,,In ,, bel , eb,ye T" st .. . . . I!
m id 4---14 Ausgabc d...'S Demoprogramms Einlcscn
A ile vo n cin bekannten Metho den rom Einl esen konnen auch fur istringstream -Objekte angewand! werden. Mil der Klassenmethode str ing sfr(l'OiJ) erhalt man ein string-Objekt zurtlck mit dem vom ismngstream-Obj ekt verwalteten Eingubestring, mit de r Klassenmethode m id str tstring .1') setzt man einen neuen zugeh6rigen Bmgabesrnng fhr das Obje kt und ve rgisst gg f. den allen.
Arbci lc lI mil oslrings trl'3m Ein Srnn g-Ausgabestre am ist ein Ourpurstream. de r seine Date n an eine m String weite rgibt . Ein CH -Obj ekt der Klasse ostringstream verwaltet dab ei einen (autornatisch dynamisch wac hsende n) String. der d ie Ausgaben aufnimmt . Eine Puffernbersc hreitung kann daher nicht
auftreten. C ode 4-65 Dcmoprogr emm - Ausgabc auf cincn String
I '" Aus geben . cpp Demop r ooramm ze i g t das Ausgeben v on Daten in einen St ri ng
4.7 Ein- und Ausgabe von Strings
303
"/ ' in c l ude ' in c l ud e <ss t ream> ' in clu d e <str i ng> us ing namespace s td; int mai n() I int i :z: S. j =3; s t ri n9 s; os t ri ngstream sou t; s out « i « • p lus· « j « • ergib t s :I: s out.str(); cout « · Ze i l e : • « s « e n dl ;
• «
i +j «
end l ;
s ystefll(· Pause - ) ;
Ze i I e e ...
D..u tk"n
p lu ~
S,,,
3 " 1"91b t 8
" . n" be l ,,, b ,g,, T.. ~t" .
..
BUd 4-15 Aus gabe des Dcrnoprogra mrns Ausgcbcn
Ein os tringstream-Objekt kan n d urchaus mebrere Zeilen verwanen. d. h. gegen d ie verwend ung des Manipulators emil gibt es nichts einzuwenden. Aile von COli ' bekannren Methoden zur Au sgabe konnen auch fllr os tringsu eam-Obj ekte enge wandt we rde n. Dabe i sotne man zur Beendigun g der Ausgabe au f de n Stringstream den Ma nipulator e//(II au frufen, urn den intern abgespeicherten Siring zu bee nden. :'vI it der Klassen methode string smvoidt erhalt man ein stnn g-Obj ekt zuriick mil dem vcm ostringse eam-Obje kt verwaheten Ausgabestring. Dadurch wird j edoch d ie automatische dynarnische Speicherverwaltung fiir den String beende t. so dass man keine weiteren Ausgabe n au f das ostringstrea m-Objekt veranlassen kan n. Mit der Klassenmethode vo id .f lr ( l·tr i ll g .1) setzt man einen neuen zugehorigen Ausgabestring flrr das Obj ekt und vergisst ggf. den allen.
A nwe nd ungsbelsplcl: wlrtschaftfichc Bcrcchnun gcn - Optima Ie Losg ronc Aus dem Bere ich der Produktion giht es aus Kostensicbt folgende Uberlegungen. Wird der Verkauf eines Produktes x mit der Menge m pro Jahr eingeschstzt. so kor mte man dtese Menge auf einmal produzieren. Zwar fallen dann die Rustkosten nur einmal an. dafbr gib t es aber Lagerkosten. Ebenso mussen Material und Lehn e vorfinanziert werden. Es fallen also Hankzinse n an. Mit kleiner werdende n Losgro ben werden zwar die Legerkosten und Bank zinsen weniger, da fh r wer den aber d ie Rustkosten hoher. Der Verlau f der Rustkosten uber der Losgrobe ist der eine r Hyperbel. wahrend Lagerkosten und Kapitalbindung in Fonn einer Geraden verlaufen. Addiert man beide Kurven zu den Gesamtkosten so zeigt sich. dass diese an einer Stelle ein Minim um annehmen. Man spricht hier von einem Optimum und bezeichnet die zuge horige Losgroue als opu male LosgrlUk .
304
4 Obj ektonentiert e Prog ramrmerung
Sind X( je.; die vo raussi chtliche Gesamtsnt ckzahl pro Jahr und KR die Rustkosren in EuroiLos so ergeben sich die Ge samtrastkosten filr jed e Losgrofle x aus der Form e!
..
,- -"'0x.._ K
G -
(4. 11)
-..., lJild 4-U> Grafische Erm in lung der optimal e lospOlk:
Sind KH die Hersretlk osten ohne Ra stante il pm Stuck und zFI de r Zin ssatz filr Bankzins in [%/Jahr] und z,- der Zins satz flir l agerkosten ebenfalls in [o/J Jah r). so wer den damn di e Gesamtla gerkosten - ' K 7.B + 7.1 GJ LH'""""iOO"
T
(4 . 12)
Die Gesa mtkosten pro Jahr sind da mit G =G ~
(4 .13)
+ GL
Und da raus wiede rum die Gesamtkosten pro Stuck G Ci s =--
(4. 14)
"' On
~ il einer Aufte ilung von z. B. x(ieJ IOO werden die Kosten schnuweis e be rechnet und so rechnerisch und grafisc h di e opurnale Losgrobe erm ittelt.
Das Progra m soli lias Ergebn is formatiert als Siring ausgeben. Talll'llc 4-7 Suuktogramm Bcstimmung dcr optimalen LosgroBe -c
Eingabe der Rustkosten KR. Herstellkosten KH. Jahresbedarr x(ie,. Bankzinssatz zB und Lagerztnssatz zl.
.&:c
=:C(;100" .< • :c =0 sotonge :x S :CGt'S
G
R
=
x("",.
'include < iaman i p> ' in clude <ss t r e~ 'include <s t ring> u sing namespace s t d; int mai n ( ) (
string i nt i ; d ouble d ouble d ouble
Eingabe ; Kr, Kh, xj , Bz , Lz ; iMi n =O, KMin =O; x , dx, Kgr , Kgl, Kg , Kg s ;
FILE · p u f f e r ; puffer = f open ( "C: \ \ Temp\ \ Lo s g r o e s s e .dat " , "w " ) ; os t r i n gs t r e am s out;
ccu t « c in » c c ut « cin » c ou t « cin » cou t « cin » c out « cin »
"Ruestkosten [E uro/Auft rag]: ";
xr .
"He r s t e l l k o s t e n [Euro/Stuec k]: "; Kh ; "Voraus sichtlicher Jahresbedar f [Stueck /Jahr]: " ; xj; " Ba n k :zi nssa t z [t }: "; B:z; " Zi nssa t z fue r Lagerung ( %) : " ; Lz ;
dx = xj /l OO; f or ( x= dx; x 8 1> 1.3
""
'" ,no '" ,,''"""
'"
1 4SI .6 1 1 4 llif. . 2S 131>3 .1> 4 1323. .. 3 128" .71 12 58 121f. .22 11 84. 21 1 153.8'> 11 2 '> 111'97.56 IIJ71. 43 IIMI> ... I 182 2 . 7 3
...". ...." '" ".
92:e .7 95 9 . 4 98 9 . 1 1 ll89 .8 liIl 9 .'> IAr. 9. 2 1 11'9 8 .9 1128 . 1> 1158 .3 11 8 8 12 17 .7 12 47 . 4 12 77 .1 1 3". 8 I lJ6.5 1 31>b. 2
...
,
9·18 .2b l 9 5 7.44 7 937 .5 9 18 .367
' "M
..
139'> .~
142S .1> 145S .3 148S 151 4 .7 1544.4 1 574.1 11>11 3. 8 Ib lJ.S 1f. 63. 2 11.92: . 9 1722 . 6 1?S 2. 3
'" ,'" '"
". ". ". ". ". ". ". '" '" ". ,
. 3'>3 . 38 5 "~ ,
8ll .H3 818 .182 8 93 .5'l1 789. 4 7 4 77S .81>2 7'62 .712
,~
..
rvaa
"" 5 .8"
737 . 78S
n
'"
1 811 . 7 1 8 4 1.4 1 8 71 .1 1989. 8 1 93 9 . 5
'l14. 2 81> 7113 .1 2 '>
r.5 11
2 6~8 .85
2 6 39. 62 258'1 .8 25 42 .5 25 82 .'1 7 2 468 . S7 2 438.74 2 41J . 82 23'1 1 2372 .3 1 23S I>.1>5 2 l43.74 211J.33 2325.21 2319.2 2 315 .12 2 H2 .81 2 312 .15 2313 231S . 2 b 23 18 .83 2323 .61 2329.53 2336 . S 234 4 . 4 6 23'>3 .3S 23b3. 1 23?l .I>'1 238'> 2397 . 9S 2 4 99.78 2 423 .16 2 437.13 24 51. 1> 8 2 46 b . 'n 2 482 .37 2 498. 4 b 251S. 8 1 2532 25 49. 4 251>7.21 2585 .39 2 1>1IJ. '13 2 622 .8 1
vva .a
17311.77 11.66. 1.7 11.87 . 1 4 1 5 5 i. n
'"M
3 11 H . 6 2'13 2. 72 28 44 2 %6. 56
1> 92. 3~
j
.1IHb
2 .'1l2n
2.8 4 4 2. %6 56 2 . 698 85 2. 639 62 2 .58'18 2 .5 425 2.5 82 '1" 2. 4b8!'1 2 . 438'14 2. 413 112 2.391
2.rnJl
2.35" " 2.34rl 4 2 .3HH 2 .3252 . 2.3 192 2.11'>12 2.1128 1 2 .H21'> 2.H3 a . H'>2 1> a . H883 a . 12 3bl 2 .329'>3 2 .3365 2.34 4 41. 2.3'>H'> 2. 31>J1 2.3731>7 2 .385 2 .3'1'''''' 2. 4!t9·18 2. 42 H6 2 . 4371J 2 . 45168 2 . 4"77 2. 48237 2. 498 46 2."15 111 2. !,J2 2 .5 49 4 2 .S6721 2.58 "39 2 . 6 113'13 2 . 1>228 1
lIild " ~ K D ie Ergcbnisdaten des Testbcis picls
. ., \
.~
---
/"
/"
'V"
/"
~
' 00
e
,
......-
•
'00
."
. 00
IIUd " ~9 Die Ergcbnisdatcn des Testbcispicl s in grafischer f orm
Uhu ng s\'orsc h lllg - O pti ma lc Bcst cllm cngc Ein at mticbes Problem wie d ie Bestimmung der optimalen Losgrone isr d ie Bestimmung der optimalen Besrellmenge. Auch bei die sem Problem gibt es gege nlauf ige Kosrenemwickl ungen.
30K
4 Objektonent ien e Programrmerung
Zu den bestellfixen Kosten zahlen d ie Kosten, d ie bei der Angebotseinholung und -prufung anfa llen. Urn d iese megfichst klein zu halten, wa rden grofe Bestellm engen sinnvoll sein. Andererseits werden demit die schon beschnebenen Lagerhaltu ngs- und Bankzinsen heb er. Auch hier gill es bestellfixe Kosten und Lagerhahungskosten so zu wahlen. dass diese ein Minimum werde n Die so gewonnene Menge ist die optimale Bestel lmenge. In der Literatur linden Sie die Form eln und Algorithmen.
Gesaml5tfJddwsten
SbJdaahl It i ld .a.. ~
S'OCKKostcn in Abhblgip;eil von der Besteumcnge
Eme weirere. oft angewa ndte Berec bnung, ist die Break-Even-Analyse. Diese ~1 elhod e ermitten die Absa rzmenge. bei der d ie Umsatzerlose die flxen und variablen Kosten decken. Die Break-Even-Methode zeigt die Wirkung von Umsatz- und Kosrenanderun gen auf den Gewinn.
Gesa mtkosten
variabll! ""::::~.L_...l.~_""=-
~
FilCkosten
StUdaa hl
Kild 4· !'1 Kosten und Erlelsc in A bhn ngig kcit von dc r Bcstcllmcngc
Es gib t den mengenmnaigen B· E·P:
- L J'lxkoslcll Dcc kungsbc urag je Steck
' I":\'cn-I'01l11 = rca,,"
(4.15)
und den wenmauigen B· E-P:
.'
L Fi",koslc n Dcc kungsqco te I je Suck
Break-Even -Point = - -
(4 . 16)
4.7 Ein- und Ausgabe von Strings
309
Darin ist der Deckungsbeitrag j e Stuck der Verkaufspreis je SHick - variable Kosten und d ie Deckungsquote j e StUc k der Deckungsbeitr ag j e Stuc k I v erkaufspreis j e SHick. Erstellen Sie ein entsprecbendes Programm (j b u n g!i\·o ~ch l ag - Chi-Qua drat
Die statistische Methode des Chi-Quad rats prufi die Kornpatibiluat zwischen beobachteten und erwarteten bzw . rbeoretiscb en Haufi gkeit en . Betra chten wir dazu den uns allen bekennren Zufallsgenerator. den Warfel. Wenn wir btl-mal ....-arfetn. dann erw arten wir dass j eder Wert der 6 Placben IO-ma l erscheint. Das tatsachli che Ergebnis difTeriert naiurhch von der Theone. ~i t tets Chi-Qua dra nest konnen wir die Feststellu ng treffen. ob das becbechrere und lias erwanete Resultar so we it auseinander liegen . dass der Wiirfel als schlec ht anzu sehen ist. Chi-Quadra t ist wie folgt definien : (4.17) Darin ist 0 die beob act nete und E die erwarte te Hsufigkeir. Statistiker haben ennitte lt unter we lchem Wert Chi-Quadrat liege n muss. damit mil eine r 95o/rr-igen w ah rschemhchken d ie Ergebnisse ubere instimmen. Die Forme l lasst sich noch mit der umstritten en Yares-Korre kmr abandem in (4.18)
Schreiben Sie ein Programm, lias mit d ieser Forme! (mil und ohne Yates ] den C bi-Quadratwen bestimmt und testen Sie das Progra mm m it Beispieldat en.
310
4 Obj ektonentiert e Prog ramrmerung
4.8 St rea ms und Dateien Eine wenere Anwendc ngsm oghchke it fUr Streams sind Dateien. Etwa. urn Daten zu sichem bzw . urn sic rur ei n andere s Programm od er eine ander e Punkuon verfljgbar zu mec hen. Eben so wird man oft die be notigren Daten nic ht nber die Tastatur ei ngeben . sondem aus einer ext ernen Darei einlesen wo llen. In C++ steben bierfur vordefinie rte Klassen zur Verfii gun g. Urn d iese Klassen ruTdie Dateieinbzw . -ausgabe benutzen zu konnen . muss ein e zusatzliche Dekl aratio nsd arei ein gebu nden werden.
[
u sing n amespace s t d;
,
i n t mai n ( I
o f s t r e am Fi l e Name ;
,
Fil eN~ . open
(-c: / temp / t e s t . dn t"';
i f (I Fi l e Name)
II Fehlerbehandlung
Die jf-Abfrage kann sowohl bei Tex t- wie auc h bet Binardat eien eingesetzt werden, nac hdem cine Darei m il eine m Strea m-Objekt ..-erbunden wurde.
Verbindung mit Dal d 16\en Nac bdem di e Bearbeit ung der Date i abgeschloss en i SI. mus s die Verbind ung des Streams ZUT Datei auc h wied er autgeboben werde n. Hierbei gibt es eben falls zwei ve rschiede ne Verfahren. 1m ers ten Fall wild die Verbindung ZUT Datei ein fach durch den Aufruf deT
~l elhod e
au fgeho-
ben.
Beispiel : Aulheben ein er Dateiv·erbind ung
I v oid
o f stream : : c losell;
Das Stream -Obj ekt besteht da nach weiter und kann min els opell( ...) erne weue re Darei mil de m gleic ben Stream-Obj ekt ve rbinden. Be ispiel : Em eute Verbindu ng zu eine r Datei nach eine r Au lhebun g . inc l u d e < fs t r e am> using names pace s t d ; i n t main ( ) {
o f s tream FileName; Fi leName .open ("C :/ t e mp/ t est . d a tnl ; Fi l eName . c l o s e ( } ; II St r eam erneu t mit e i ne r Da te i v erbind en Fi leName. open { . . . ) ;
Die zwe ite ~ 6gl ichk eit besteht darin, lias Siream-Objekt einfach zu 'zersteren', Wird ein Stream-Objekt (wi e im nachfolgenden Beispiel) innerhalb eine s Bloc ks definiert , so kann zu nachst d ie Dater bei der Defi nition des Stream-Objekts mil dies em verbunden werde n. Wird am Blockende lias Stream-Objek t dann ungultig (ze rslOr1). so wird autornat isch die Verbindung zur Datei aufge hobe n.
4.8 Streams und Dateien
3 15
Beispiel: Aufbebung einer Verbindung durch Zer stcrung ' i n c l u d e < fs t r eam> u s ing n amespace s t d; int mai n ( ) {
II Blockbeginn o f stream FileName(
·c: /temp/test.dat~ J ;
II Blockende . St r e am-Ob j e k t wi r d gelOs chtl
Scbret ben in erne T n ld at ei Das Schreiben in eine Textdatei erfolgt prinzipiell gleich wie die Ausgabe auf di e Standardeusgabe mil CO I/t . Anstelle des Stream-Obj ekts COld Sieh l hier dann ledig fich der Name des Dateistream-Objekrs. Vnd aile 1:1.I schreibenden Dalen werden durch den Operator < in den Stre am nbe rtragen. Beirn Schreiben von Daten ist zu beachten, dass d iese durch ein Trennzeichen (Leerze ichen. Zeilen vorsch ub o. A.) voneina nder getrennt sind. da sie sonst nachher nicht mehr eingelesen werden kcnnen. Dadurc h. dass sow obt COld wie auch ofttream d ie gleiche Bas iskjasse ba.fic_O.flTeam bes itzen. stehen fur die Date iausgabe auch die gleichen Marupulatoren. wie ,,_B. hex. 5et" 1...) oder setp r ed.fioll(... ). :lUI verfugung. Beispiel: Schreib en in eine Textdate i l i n c l u d e < fs t r e am> u sing namespace s t d; int 5 1 = 10 . 5 2 = 2 0; i nt ma i n ( ) {
o f s t r e am Fi leName; Fil eName . o pen ( "c : / temp /te5t.dat - j; II We n n St r e am o h n e Fehle r mit Datei v erbunde n i f ( Fil eName) {
II Daten 5ch r e i ben 51 « ' 5etw(S) « II Da t e i 5ch l ie55en
Fil eName « Fil eName «
52 «
endl;
FileName. clo5e();
Seh rcl beu in elne Hiniird at d Sellen numerische Dalen binar in einer Datei abgelegt werden. so rnussen beim verbinden de r Datei mit den Stream-O bjekt d ie Modi ios.so nt I ios--b inary angeben werden. Ferner sollt e da mn gerlach! we rden. dass Binardateien nicht fllr den Datenaustausch zwischen unterschiedli chen Plauform en benutzt werde n dar fen. Dies gilt soger aueh Hir Programme die au f der gleichen Plattform laufen. ebe r mit unterschied lichen Compilem erstellt wur den.
316
4 Objektonent ierte Programrmerung
Beispiel: Methode zum Schreiben eines einzelnen Byles data
1 o s t r e am& put (c h a r da t .. l ; Selle n Dalen die aus mebreren Byles besteben (short. long usw.) in einer binaren Datei abgelegt werden. so wild hier fbr d ie Method e "Tire eingese tzt. Be ispiel : Me thode rom Schreiben mehrerer Bytes ost r e am& wr ite (cons t c ha r *pBuffe r . s t reamsize bytes } ;
pBI!ffer is! ein const char-Zeiger auf den Beginn des Datenblocks. der in die Datei geschrieben werden soli und bytes gibt d ie Anzah l der zu sc hreibend en Bytes an. Da die Methode einen consr cbar -Zeiger erwartei. muss in der Regel eine Typkonvertierung vorgenornmen werden . wenn numerische Daten abges peicbert werden (s iehe Beispiel) . Ohn e Typkonvertierun g erfolgt vom Comp iler eine Fehlermddung. Beispiel : Methode rum Schrei ben nume rischer Daten l i nclude using name space std ; i n t sl = 1 0, 52 = 20 ; i nt main ( I
,
o f s t r e am Fi l eName ;
FileName. open ( ~ c :/ t emp/ t e s t _ da t · . i os ; ; ou t lio s : : b ina ry ) ; II Wenn St r e am ohn e Fe h l e r mit Datei verbunden if ( F i l eName)
,
II Dat e n schr e i ben Fi l eName .wr ite (reinterpret_ cast (&sl ) , s i zeo f(s l)) ; FileName.wr i te( r e i n t e rpr e t _cast (& s2), s i zeo f(s 2)) ; II Oa t ei s c h l i e s s e n F i l eName . cl o s e () ;
In dem Beispiel erfolgt nur eme Typkonvertierun g in char" und nich r in COII.~' char" , Ein char" kann nberall anstelle eines cons ! cha r" nbergeben werde n, abe r r ucht urngekehrt! Das COliS ! char " bei der Signatur der Methode write sagt nur aus, dass die Methode den lnhah des abe rgebe nden Puffers nic ht verandert. Beim Schreiben von Dalen in Binardateien konnen die Daten unmiuelbar hintereinander geschriebe n werden . d. h. es sind keine Trennzeichen wie bet einer Textdatei notwend ig. Eingabl' strl,'am .(}bjl,'kl dcflm er cn Ein Eingabestream -Objekt wird mil folgender Anweisung definiert :
S)T1t3X: Eingabestream-Objekt
I if stre arn F i l eName ;
4.8 Streams und Dateien
3 17
itstream isl wiede r der Stream. der flir die Dateieingabe zustandig ist und f ileName ist de r (beliebige} Name des Stream-Objekts. Das so deflniert e Strearn-Obiekt fileN ame besitzt aber ebenfalls noch keine Zuo rdnu ng zu irgendeiner Datei.
Yer blndung mil Dat cl hersrenen Nach dem das Stream-Objekt ersrellt ist, kann es m il eine r Darer verbu nden wer den. Beispiel: Verbinden mit einer Datei
v o id istream : :open(con s t c ha r · p FName , i os: : openmode mode=ios : : i n); Der erste Param eter pFName ist der char-Zeiger au f den Namen der III o lTnenden Datei und der zweite Parameter mod e gibt an, wie d ie Datei zu olTnen ist. Er kann hier eine smnvolle Kombina tion aus folge nde n Werten sein : T a brllr ~ -9 Modi z urn Orrnen von Daieien ~f odu s
Bedeutung
10 S::IO
O n nen einer Datei zu m Lesen
ios::bin ary
Offnen einer binaren Datei
Beim Au fruf der ~1 ethode kann auch der zweit e Para meter weggelassen werde n: in diesem Fall wird die Darei rur die Eingabe im Textmodus geoffne t. Auch hier bestet ud ie :\toglichk eil. einen Eingabesueam gleich bei seiner Definition mit eine r Darei III verbinden . Beisp iel: Defi nition eines Eingabestreams m il Datei- verbmdung
ifstr eam myFile (c ons t c h a r · p FName,
i o s : : ope nmode mode
Sehen w ir uns beide :\1ogl ichkeiten nun anha nd eines ein fachen Beispiels an. 1. :\t oglichkei l Bingabe stream-Date i off nen
' i nc l ude < fs tream> us i ng name s pac e s t d; i n t ma in ( ) {
i f s t r e am File Name; Fi l e Name . open (" C: / t emp/ t e s t . da t "l ; i f ( ! File Name ) II Fe h l e r beha nd l u ng
2. :\toglichkeit Eingabestrearn-Datei offnen
I
' i nc l ud e u sin9 n amespa c e s t d ;
= i os::in );
318
4 Obj ektonentiert e Programrmerung
l n t mai n { I (
i f stream Fi leName ( "c :/ t e mp/ t e s t . d a t - ,
i o s : :in lios " binary) ;
i f (! F ileName l II Fehlerbehandlung
1m erste n Fall wird zunachst lias Strearn-Obj ekt defi niert und dann durch open mit einer Dater "munden. 1m zweiten Fa ll wi rd das Strea m-Obj ekt be i seiner Definiti on gleich mil einer Datei verbunden. 1m Beispiel wird die Datei im Btnarmodus geo ffne t. Zu beachten ist. da ss hier au ch der Mod us ;(J.~: :;" exphzit angegeben werden muss. Und auch da s ()jTnen einer Datei zu m Lesen kann natarlic h schief gehen . E. u sin g n ame s p a c e std; i nt s i , 52; i nt mai n ( ) (
i f stre am Fi l eName , Fi l e Name . op e n ("c ,/ t e mp/ t e s t . d a t II Hi e r Fe h l e r abfangen ! II Da t e n lese n File Name » 51 » s2 , II Datei 5chlie55e n File Name. c l o s e ( } ;
U
)
;
Dadurch, dass sowchl em 31s auch itstream die gleiche Basisklasse ha.fieJ\·rream besitzen, srehen Iltr die Daieie ingabe auch d ie gleic hen Manip ulatoren. wie v, B . hex od er oc t. zur Verfllgung. Lcscn 3US etncr Hinardald Selle n numer ische Daten au s einer Binardatei au sgelesen werde n. so mtlssen beim Verbi nden der Datei mil den Stream-O bj ekt di e Mod i ios.rin I ios::billory angebe n werden .
3 19
4.8 Stre am s und Da teien Bei spiel: Lesen eine s ein zelnen Bytes
I istream&
ge t lc h a r & da ta ) ;
Des gelesene Byte wi rd in der variablen data abgelegt . Zu beachten iSI. dass nach dem DatenIyp char der Op era tor & steht. Dies isl hier nic ht der Adressoperaror . sondem der Re rerenzoperarer . Das Prog ramm nbergibr berm Aufruf dieser Meihode die einzulesende Variable 'ganz nnrma l' :m di t' \-' t'lhOfIe, lll..n 7 . R Fil..N:lme ft'l(dm rV :IT);. Beisp iel: Aus tesen mebrerer Byles (s hort. long. etc.) is t ream& read (c ha r
~ p Buff e r .
str eamsi2e bytes ) ;
pBI{Ut'r ist ein char-Z eige r auf den Be gum des Darenblocks, in dern di e aus der Dare! ausgele-
senen Dalen abgelegt werden und bytes gibt die Anzahl der zu lesend en Bytes an. Da die Methode wiede rum eine n cber-Zeiger erwarte t. muss in der Regel erne Typkoevertie rung ve rwendet werden. wenn numerisch e Daten em zulesen sind. Beispiel: Einles en numeri sche r Daten ' inc l u d e us i ng n ames p a c e s t d; i o t a t , s 2; i nt main I ) {
i f st ream FileName ; FileN ame . open l - c: / t emp / t e s t . da t-, i o s::in l i o s : :bina ry } ; II Hier Fehler a b fangen ! II Daten l e s en F i l eName . r e a d ( r ei nt erpret _ca st < char~> (& sl l . s i 2eofls l » ; F i l eName . r e a d ( r e int erpret _ca st < char~ > (& s 2 1 . s i 2eofls2 » ; II Da te i s c h l iessen FileName . clo s e l ) ;
G leich7.eitiges Sc h rei he n und LeSCh Und auc h di es is! moglic b: Einen Da teistream zum g leicbzeit igen Lesen und Schreiben otfnen. Hierzu wird ein Stream -Objekt vom Ty p fs tream benorig t. Be ispiel: De Jinilion eines rstream-Obj ekt s [ f s t r e a m ( con s t c he r e pF."N ~a~m~.,,-,,-,i~n~t~m~o~d~.,,-,}C'C·
--.J
pFNlIme ist der Zeiger au f den Datemamen und mode gibt de n Modus an. in dem die Da tei geoff net werde n so li. Fttr den Mod us kann cine sinnvolle Kombinatio n der in der Tabulle 4-9 angegebenen werte ein gesetzt ....-erden: 'lahelle -1 -10 Modi ro m Orrncn
\' 011
Dateien zum gleichzeitigcn Lescn und Schrcibcn
Mod e
Bedeutung
rosr.m
Otfuen zu m Lesen
ios::out
Offnen ro m Schreibe n
320
4 Objektonentierte Programrmerung
ios.rbinary
Olfnen einer binaren Datei
ios::app
Neue Dalen werden immer an die Dater angehlingl.
ios::ate
Neue Daten werden an die Darer angehangt.
iost.tn mc
Bisheriger Dateiinhalt wird verworfen.
Zu beachten ist, dass der mode- Para meter hier immer angegebe n werden muss. w enn die Datei nur mil Lesezugriff ge6ffne t wird, muss sic: narurlich exisrieren. Der Umersc hied zwischen ios ::upp und ;O.f:: Ure wu rde scbon beim Ausgabesueam erfautert. Soli eine Datei zum Lesen und Schreiben geoffnet werden. d ie noch nicht existiert. so muss del :\.IOOe ios .stmnc mit angeben werden. Selbsrverstandlich konnen dann rom Beginn nur Dalen geschrieben werden. Aile dre i Streams (ofs tream, ifstream und ! ftreum ) besuzen eigentlich noch einen weiteren Parame ter, der den gleichzeiugen Zugriff auf eine Datei von mehreren Streams aus kontrolliert. Dieser Parame ter ist aber mehr rur fongeschnuene Dareioperauonen und wird deshalb hier nicht weiter betrachtet. So n~ l ig{'
Dasclop er atl onen
w enn Daten aus einer Datei eingelesen werden . muss sich auch feststellen lassen. ob aile Daten einget esen wurden und ob das Ende der Datei erre icht wurde. Auch dazu gibl es eine ~1 e thode. Beispiel: Methode zur Bestimmung. ob das Dateiende erreichr iSI
I bool
basic ios : : e o f O
Beispiel: Diese Methode liefert den Wert true. wenn das Dateiende erreicht ist if s t r e am FileName( · c: /temp /tes t .da t ") ; II Einlesen a us Da t e i FileName » da t a » . .. ; II PrU f e n , ob Dat eie nde noch n ich t erre i c h t if ( IFi l e Name , e o f ( » {
II Daten a us Datei a uswerten
Zu beachten iSI. dass weitere Einleseversuche danach zwar in der Regel mch t zu einem Programm absrurx fllhren. jedoch unguhige Dalen liefem. Demit e(~r aber das Erreichen des Dateiendes signalisieren kann. muss vorher ein Einleseversuch stauge funden haben. Die Dateistreams bieten noch d ie Moglichkeit , minds seek-Memberfunktionen d ie 'Dateizeiger' explizit zu beeintlusse n. Umlciten d er Sta nda rd-Ka nale Es besteht in C++ die- ~1 og l i c hk ei t . die Srandard-Kanale cin, emit , cerr oder clog
steuen .n mzuleuen''.
pro~'Tammge
4.8 Streams und Dateien
32 1
So kcnnen z. R aile Ausgaben start auf cout in eine Datei umgeleitet werden. Der Grund flir diese ~lOglie h k e i l der Zuweisung. die in den bisber genannten Stream-Klassen nicht vorbanden war. hegt daran. dass die vier eben genanruen Standard-Kanale in Wirklichkeit gar keme Objekre der Klassen os tream und istrea m sind. sondem Objekte der ebgeleheten Klassen istream _withassign und o.flream_withassign. Beispiel: Umleilung in eine Datei o f~ t r eam
datei ( "Umleitung.dat - , ios"app ) ;
cou t :: datei ; II cou t wi r d in die geof fnete Datei umgeleitet cou t « " Te x t a usg a be" ; II S t r i ng wird in Datei geschrieben
Man sothe jedoch beachren. dass das Objekt Darer als lckal es Objekt am Blockende automatisch geschlossen wird, Hal man [wie im Beispiel) c OllI umgeleitet. so wird mil dem Objekt Datei aueh cOll I geschlossen! Folgfich kann anschlieBend auf cout nicht mehr geschrieben werden. Oa dies im Allgemeinen nicht erwu nscbt sein dame. sollte man tbevor man die Umleitung vornim mn das aile Objekt in einer globalen Variablen zwischenzuspeichem. Beispiel: Alles Objekt sichem os t re~w i t hass i gn
s a v ecou t;
s a veCou t =cou t; cou t :: s e v eccu t .
II Umleiten und Ausgabe in eine Datei II cou t r e s taurieren
Nachdem aile Ausgaben in die umgeleuete Darei vorgenommen wurden, kann dann der Standardausgabekanal zuntckgesetzt werden.
322
5 Generische Programmierung 5. t Das Grundprinzip Generlscb (von 1a1. Genus. das Gesc hlecht oder die Genung beueffend) besc hreibt den Grad der Allgemc:ingultigkeil einer Lc sung. Je univers elle r eme Losung verwen dbar ist. urn so geneTischer is! sie. In der obje ktorien tierten Programmierung spiel! dieser Ansatz eine wichrige Rolle. Einzelne Funktionen und Klassen werden mog lichsi allgemein beschneben, so dass sie fur unterschiedhc be Datentypen nutzbar sind. Einige Programmiersprac hen unlerstiilzen dies d urch das Konzept Generischer Typen bzw . Temp lates. Ein generisches Modell muss in einer konkreten Anwendung immer an die spezl fiscben Gegebenheiren angepass t werden. so wie die generischen vorgehensrrodetle Wasser fall- ode r Spiralmode ll an ein konkreres Proje kt. Diese Anpassung wird im Bereich des SoftwareEngineering auch Tay loring genann r. Das Z iel der gene rischen Programmierung ist es, die Algoritbmen so wen wie roogtich von den Datenstrukturen, mil denen sie arbeiten, zu rrennen. Es werden ledighch bes timmre Anforderungen an die Typen gestellt. Ein gules und lmmer wieder gem geno mmenes Beispiel fUr unsere Betrachrung isl die Maximumfunktion, d ie flir Lwei gegebene Werl e a. b desselben Typs den grOBeren Wert max(a .b) zurtickgibt. Als Anforderungen flir diese Funkt ion gehen. dass a und b desselben Typs mileinander vergleicbbar sind. der Ausdruck a < b wohl definiert iSI und eine Ordn ung bescbreibt .
In klassischen Progra mmiersprachen wiirde man bier fur jeden Dareruyp eine Funkuo n programmie ren, die fl lr jeden Typ getrennl das GJeiche lui. Beispiel: HerkOmmliche Maxim umfun ktionen [ilr int- und Iloet-Detentypen i n t maxi nt(int a , int b l ( (a < b l return bi else return a '
if
fl o a t max f l oat(float a, float b) (
i f (a < b) return bi el se return 8i
Hierbei falh auf, dass der Code an sich immer derse1be ist und slch nur die Type n unterscbeiden. Diese Wiederholung lassr sich bekanntennallen mit Makros umgehen.
5.1 Oas Grundprinzip
323
Beispiel: Die Maximurnflmktion als Makro
I.define
MAX'"
b)
« .) v oid s wa p ( X& 4 , X& b ) x t emp = a ; 4 = b; b = temp ;
II temp mit a ini tialisiert
t empl ate
v oid sor t
I T (&a) [v@ctor] )
(
f or lint i =O; Lcvect o r , ++i ) f o r lint j=i +1; j -cv e c t.or , ++j ) i f (a l j ] > al i] ) s wa p (al i], alj] ); i nt main () int i; int v 1 112 ] = {3, 9 , 4 , 2 , 8 , 8 , 1 , 7 ,5 ,ll ,lO ,6} ; fl o at v 2 16 ] = {0 . 4, 3.1, 5 . 4 , 6 .7, 0. 4, 0. 42}; s o rt (v1 ); sort (v 2 ); cou t « "v 1 : " « @ndl ; f o r (i=0;i< 12;i ++ ) c ou t « vl[ i] « endl ; cou t « "v 2 : " « e ndl; f o r (i= 0 ;i beze i c hne t d ie Klas s e II z u der der Kons truk to r S t ack g e hort template< i n t si ze, c l a s s Elem> Stack<size , El em> : : Stack (I ' index ( -l l
u
II Einf Ug en
t emp l a t e v o i d S tack<si ze , El em> : : p u s h I Elem e l (
if ( i n d e x < s i z e ) (
index + : 1; space{index] : e ;
I I Entf ernen
temp la te< i n t s i ze, c lass Ele m> v o id Stac k<s ize, Elem> : : p o p ( El e m &e ) { i f (inde x >: 0) (
e : space (in d e x) ; ind ex - : 1;
II Au sgabe
temp late v oi d St ac k<si z e , Elem>: : out ( ) (
i nt cou t cou t for
i ; « " I nde x : " « index « « "Stack : " ; (i:O;i Palamerga l>c [2.3) 106 Pol ymorplte l.lste [4.5) 278 Pos lfix [ ! ,41 3 ! Pr.ifix [ 1,4 )3 1 Prap rwc. "Or (l.l ) 2
Input eigener TYJlCD[4.6] 294 int[ I.J]20 iostrcam.h [1.4) 39 i.lling,;IUam [4.7] 301 hCTal io n mil fester AnT.ahl Win Wiale'Ibolungen [ ' 5] 51 hfI [4.3 J 247 time.h 11.4] 39 Token [ 1,2J II Tool sll .l ]1 Top- Down -Design (2, 1] 87 T ran,lalor [ 1.1) 2 Typ moJifizier-cr[ 1.3123
U Cberladrn " 011 FWlktionen 12.2]95 D lll2. l ]lUl t;mleilt'rl