Föreläsningsanteckningar OOP-föreläsning 5, måndag 17 september 2007 ==================================================================== Idag ==== 1. Händelsestyrd programmering 2. Kylsystem 3. Simulering 4. Klasser och objekt: klassen VENTIL 5. Konstruktorer och destruktorer 6. Relationer mellan objekt 7. Visual Studio 2005 8. .NET och konstiga pekare med ^ i stället för * 1. Händelsestyrd programmering ============================== Tråkigt program: cout < "Vad heter du? "; cin >> namn; cout << "Hej, " << namn << "!" << endl; Roligare program: händelser används särskilt i GUI-programering callback-funktioner = händelsehanterare händelse = knapptryck, timer som "ringer", data som kommer in via nätet... 2. Kylsystem ============ reaktortank, rörledningar, ventiler (= vattenkranar), pump, avlopp, filter tryck flöde jämför vatten med elektricitet: tryck = spänning, flöde = ström, admittans = admittans 3. Simulering ============= variabler som anger till exempel: trycket på en viss punkt i systemet, flödet genom en viss ventil Vardagliga betydelser av orden "statiskt" och "dynamiskt": "statiskt" = trist och tråkigt "dynamiskt" = rör sig med stor fart tekniska betydelser av orden "statiskt" och "dynamiskt": "statiskt" = vid en enda tidpunkt = man struntar i tiden = saknar tidsdimension "dynamiskt" = varierar med tiden = har en tidsdimension Simulering: ändra något i en punkt (ex: öppna en ventil), och den ändringen påverkar resten av systemet förändringen propageras (= skickas vidare) till andra delar i systemet, steg för steg ex: kran och trädgårdsslang, öppna kranen "dynamik" = hur delarna (t ex trycket i en ledning) ändras med tiden räknas ut med formler utifrån värden på tryck, flöde mm i angränsande delar 4. Klasser och objekt: klassen VENTIL ===================================== VENTIL.h -------- #ifndef VENTIL_H #define VENTIL_H class VENTIL { private: double kagelposition; double admittans; public: void init(double initial_kagelposition, double admittans); void oppna(); void stang(); }; #endif VENTIL.cpp ---------- #include "VENTIL.h" void VENTIL::init(double initial_kagelposition, double admittans) { kagelposition = initial_kagelposition; this->admittans = admittans; } void VENTIL::oppna() { kagelposition = 1.0; } void VENTIL::stang() { kagelposition = 0; } main.cpp -------- #include #include "VENTIL.h" int main() { VENTIL v1; v1.init(0.0, 10.0); v1.oppna(); // Fel: v1.kagelposition = 0; VENTIL* v2p; v2p = new VENTIL; v2p->init(0.0, 10.0); v2p->stang(); // Fel: v2p->kagelposition = 0; } 5. Konstruktorer och destruktorer ================================= VENTIL.h -------- #ifndef VENTIL_H #define VENTIL_H class VENTIL { private: double kagelposition; double admittans; public: VENTIL(double kagelposition, double admittans); ~VENTIL(); void oppna(); void stang(); }; #endif VENTIL.cpp ---------- #include "VENTIL.h" VENTIL::VENTIL(double kagelposition, double admittans) { this->kagelposition = kagelposition; this->admittans = admittans; } VENTIL::~VENTIL() { } void VENTIL::oppna() { kagelposition = 1.0; } void VENTIL::stang() { kagelposition = 0; } main.cpp -------- #include #include "VENTIL.h" int main() { VENTIL* vp; vp = new VENTIL(0.0, 15.0); vp->oppna(); vp->stang(); delete vp; } 6. Relationer mellan objekt =========================== NOD.h ----- #ifndef NOD_H #define NOD_H class NOD { private: bool reglerbar; double tryck; double summaflode; public: NOD(double tryck, bool reglerbar); double get_tryck(); void add_summaflode(double okning); void dynamik(); }; #endif NOD.cpp ------- #include "NOD.h" NOD::NOD(double tryck, bool reglerbar) { this->tryck = tryck; this->reglerbar = reglerbar; summaflode = 0; } double NOD::get_tryck() { return tryck; } void NOD::add_summaflode(double okning) { summaflode += okning; } void NOD::dynamik() { if (reglerbar) { if (summaflode > 0) tryck += 0.1; else if (summaflode < 0) tryck -= 0.1; } summaflode = 0; } NOD.cpp ------- #include "NOD.h" NOD::NOD(double tryck, bool reglerbar) { this->tryck = tryck; this->reglerbar = reglerbar; summaflode = 0; } double NOD::get_tryck() { return tryck; } void NOD::add_summaflode(double okning) { summaflode += okning; } void NOD::dynamik() { if (reglerbar) { if (summaflode > 0) tryck += 0.1; else if (summaflode < 0) tryck -= 0.1; } summaflode = 0; } VENTIL.h -------- #ifndef VENTIL_H #define VENTIL_H #include "NOD.h" class VENTIL { private: double kagelposition; double admittans; double flode; NOD* in; NOD* ut; public: VENTIL(double initial_kagelposition, double admittans, NOD* in, NOD* ut); void dynamik(); void oppna(); void stang(); }; #endif VENTIL.cpp ---------- #include #include "VENTIL.h" VENTIL::VENTIL(double kagelposition, double admittans, NOD* in, NOD* ut) { this->kagelposition = kagelposition; this->admittans = admittans; this->in = in; this->ut = ut; flode = 0; } void VENTIL::oppna() { kagelposition = 1.0; } void VENTIL::stang() { kagelposition = 0; } void VENTIL::dynamik() { double tryckskillnad = in->get_tryck() - ut->get_tryck(); if (tryckskillnad > 0) flode = kagelposition * admittans * sqrt(tryckskillnad); else flode = - kagelposition * admittans * sqrt(-tryckskillnad); in->add_summaflode(-flode); ut->add_summaflode(flode); } main.cpp -------- #include #include "VENTIL.h" int main() { NOD *n1, *n2, *n3; VENTIL *v1, *v2; n1 = new NOD(1.0, true); n2 = new NOD(1.0, true); n3 = new NOD(2.0, false); v1 = new VENTIL(0.0, 10.0, n1, n2); v2 = new VENTIL(1.0, 5.0, n2, n3); while (1) { n1->dynamik(); n2->dynamik(); n3->dynamik(); v1->dynamik(); v2->dynamik(); } delete n1; delete n2; delete n3; delete v1; delete v2; } Makefile -------- CCC = g++ CPPFLAGS += -Wall LDLIBS += -lm ventil: VENTIL.o NOD.o main.o g++ -$(CPPFLAGS) -o ventil VENTIL.o NOD.o main.o $(LDLIBS) 7. Visual Studio 2005 ===================== 8. .NET och konstiga pekare med ^ i stället för * =================================================