1. 2 Informatik 3 Praktikum 1.Heizobjekt und Toggles 2.Heizungssteuerungs- Automat 3.Testaufbau...

Preview:

Citation preview

1

2

Informatik 3 Praktikum

1. Heizobjekt und Toggles

2. Heizungssteuerungs-Automat

3. Testaufbau

4. Simulatoren

5. Histogramm

6. Grafikausgabe (Haus)

7. Bezier mit MFC

8. Prozesse

9. Parallele Prog. I

10. Parallele Prog. II

Vorlesung1. Software-Engineering

• Grundlagen• Softwaremodell• Das V-Modell

2. Windows Applikationen

• Windows 32 API • Fensterorientierte

Applikationen

3. Parallele Programme• Prozesse, Threads • Kommunikation

zwischen parallelen Programmen

• Konflikte

3

Grundlagen

• Einführung

• Modularisierung

• Interpretative Implementierung von Automaten

4

Automaten nicht interpretativ (aus IN1)

Implementierung in der Programmstruktur

Aufgabenstellung 1 (z.B. Verkaufsautomat)

Programm für Verkaufs-automat

Eingabe-events Aktionen

Aufgabenstellung 2 (z.B. Dualzahlenkonverter)

Programm für Dualzahlen-automat

Eingabe-events Aktionen

5

Interpretative Implementierung heißt:

• Umsetzung Ablauflogik in Daten(statt in ein Programm)

• Verwendung eines für beliebige Anwendungen benutzbaren Interpreter-Programms, das auf diesen Daten arbeitet

6

Jetzt: Automaten interpretativ

Objekt für Aktionen zu Verkauf Objekt für Aktionen zu Verkauf

Objekt für Eingaben zu Verkauf

Automat unabhängig von Aufgabe

Aufgabenstellung 1 (z.B. Verkaufsautomat)

erzeugt Eingabe-events

Aktionen Automatentabelle f. Verkaufsautomat als Datenstruktur

Objekt für Aktionen zu Verkauf

beschreibt die Transitionen

Objekt für Aktionen zu Verkauf Objekt für Aktionen zu Verkauf

Objekt für Eingaben zu Dualz.konv.

Automat unabhängig von Aufgabe

Aufgabenstellung 2 (z.B. Dualzahlenkonvertierung)

erzeugt Eingabe-events

Aktionen Automatentabelle f. Dualz.konv.als Datenstruktur

Objekt für Aktionen zu Dualz.konv.

beschreibt die Transitionen

7

Beispielautomat: Dualzahlkonvertierer

1 Update1

Update0 0

ZifferLesen Ende Ausgabe

=

8

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

Realisierung:

9

Automatentabelle

struct AutoTabEintr AutoTab[] = {

{ ZiffLesen,Inp0, ZiffLesen,Update0, &ConvObj }, { ZiffLesen,Inp1, ZiffLesen,Update1, &ConvObj }, { ZiffLesen,InpEq, Ende, Output, &IOObj }, { Fehler, Reset, ZiffLesen,ResetAction, &ConvObj }

};

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

// per Konvention: Noop==0 und Fehler== -1

enum Events { Inp1, Inp0, InpEq, Reset };

enum Actions { Noop=0, Update0, Update1, Output, ResetAction };

enum Zustaende { ZiffLesen, Ende, Fehler=-1 };

10

Verwendung der ISA-Relation

class AutoClient {public:

virtual void Action(short sActNr) {};};

class AutoClient {public:

virtual void Action(short sActNr) {};};

class InputOutput: public AutoClient{ ... void Action(short sActNr);};

class InputOutput: public AutoClient{ ... void Action(short sActNr);};

class Converter: public AutoClient { ... void Action(short sActNr);};

class Converter: public AutoClient { ... void Action(short sActNr);};

Is a

Spezi

alis

ieru

ng

11

Verwendung virtueller Funktionen

struct AutoTabEintr {public: short sZausg, sEvent, sZfolge, sAction; AutoClient *pAutoClient; };

struct AutoTabEintr {public: short sZausg, sEvent, sZfolge, sAction; AutoClient *pAutoClient; };

struct AutoTabEintr AutoTab[] = { { ZiffLesen,Inp0, ZiffLesen,Update0, &ConvObj }, { ZiffLesen,Inp1, ZiffLesen,Update1, &ConvObj }, { ZiffLesen,InpEq,Ende, Output, &IOObj }, { Fehler, Reset,ZiffLesen,ResetAction,&ConvObj }};

struct AutoTabEintr AutoTab[] = { { ZiffLesen,Inp0, ZiffLesen,Update0, &ConvObj }, { ZiffLesen,Inp1, ZiffLesen,Update1, &ConvObj }, { ZiffLesen,InpEq,Ende, Output, &IOObj }, { Fehler, Reset,ZiffLesen,ResetAction,&ConvObj }};

...

pTable[i].pAutoClient->Action(pTable[i].sAction);

...

...

pTable[i].pAutoClient->Action(pTable[i].sAction);

...

12

Übersicht

13

IOObj: InputOutput

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

cin>>ch;

switch(ch)

{ case '0': sZust=pAutomat->Event(Inp0); break;

case '1': sZust=pAutomat->Event(Inp1); break;

case '=': sZust=pAutomat->Event(InpEq); break;

default: cout<<"Eingabefehler"; break;

}

if(sZust==Ende) exit(0);

if(sZust==Fehler)

{ cout<<"Falsche Eingabefolge, Reset";

pAutomat->Event(Reset);

}

14

ConvObj: Converter

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

void Converter::Action(short sActNr)

{

switch(sActNr)

{ case Update0: nWert *= 2; break;

case Update1: nWert *= 2; nWert += 1; break;

case ResetAction: nWert = 0; break;

default: break;

}

}

int nWert;

15

IOObj: InputOutput

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

void InputOutput::Action(short sActNr)

{ if(sActNr!=Output)

cout<<"InputOutput: falsche Aktion "<<sActNr;

else

cout<<pConverter->GetResult()<<" (dezimal)\n";

}

16

DualAuto: Automat

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

for(int i=0; i<sAnzTab; i++) if((pTable[i].sZausg==sZustand)&& (pTable[i].sEvent==sEvNo)) { if(pTable[i].sAction != Noop) pTable[i].pAutoClient->Action(pTable[i].sAction); sZustand = pTable[i].sZfolge; return sZustand; } sZustand = Fehler; return sZustand;

17

Gesamtprogramm

ConvObj: Converter

Automat

Automatentabelle

Inp0

Inp1

InpEq

IOObj: InputOutput

IOObj: InputOutput

Update0

Update1

Output

hcpp

cpp

cpp cpp

HauptprogrammMnA2To10.CPP

MsDev alle

cpp

h

Recommended