400 likes | 506 Views
Zadanie V nasledovnom programe pridajte do triedy C funkciu pre výpočet druhej mocniny premennej x a v hlavnom programe túto hodnotu vypíšte. class C { int x; public: void set (int ); int get(); }; void C:: set ( int value){ x = value; }
E N D
Zadanie • V nasledovnom programe pridajte do triedy C funkciu pre výpočet • druhej mocniny premennej x a v hlavnom programe túto hodnotu • vypíšte. • class C { • int x; • public: • void set (int ); • int get(); • }; • void C:: set (int value){ • x = value; • } • int C:: get(){return x;} • Riešenie:
class C { int x; public: void set (int ); int get(); int area(); }; void C:: set (int value){ x = value;} int C:: get(){return x;} int C:: area(){return x*x;} #include <iostream.h> main(){ C c0; c0.set(3); cout << c0.area() << endl; // vypíše 9 return 0;}
2. Pridajte do triedy konštruktor, ktorý inicializuje lokálnu premennú,v hlavnom programe ju vypíšte, zmeňte jej hodnotu a opäť ju vypíšte. class C { int x; public: C(int ); void set (int ); int get(); }; C::C( int value){ x = value; } void C:: set (int value){ x = value; } int C:: get(){return x;}
#include <iostream.h> main(){ C c0(3); cout << c0.get() << endl; // vypíše 3 c0.set(5); cout << c0.get() << endl; // vypíše 5 return 0; } 3. Implementujte triedu na výpočet plochy obdĺžnika a) bez konštruktora b) s konštruktorom V hlavnom programe vypíšte hodnotu plochy.
a) #include <iostream.h> class CRectangle { int x, y; public: void set_values (int, int); int area () {return (x*y);} }; void CRectangle::set_values (int a, int b) { x = a; y = b;} int main () { CRectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); //vypíše area: 12 return 0; }
b) #include <iostream.h> class CRectangle { int x, y; public: CRectangle (int, int); int area () {return (x*y);} }; CRectangle::CRectangle (int a, int b) { x = a; y = b;} int main () { CRectangle rect(3, 4); CRectangle rect1(5, 6); cout << “rect area: " << rect.area()<< endl; // rectarea: 12 cout << “rect1 area: " << rect1.area()<< endl; // rect1 area: 30 return 0; }
c) V triede CRectangle implementujte lokálnu premennú, ktorá bude obsahovať text, tak aby sa v hlavnom programe pri výpise plochy vypísalo text = hodnota plochy. #include <iostream.h> class CRectangle { int x, y; char *text; public: CRectangle (int, int, char *); int area () { cout << text<< “= “; return (x*y);} }; CRectangle::CRectangle (int a, int b, char *s) { x = a; y = b; text = s;} int main () { CRectangle rect(3, 4, “small rect”); cout << rect.area()<< endl;// small rect = 12 return 0;}
d) V hlavnom programe vytvorte smerník na objekt typu CRectangle vytvorte objekt a vypíšte jeho plochu. #include <iostream.h> class CRectangle { int x, y; public: CRectangle (int, int); int area () {return (x*y);} }; CRectangle::CRectangle (int a, int b) { x = a; y = b;} int main () { CRectangle rect(3, 4), *rect_p1, *rect_p2; rect_p1 = new CRectangle(3, 4); rect_p2 = ▭ cout << “rect area: " << rect_p1->area()<< endl; // rectarea: 12 cout << “rect area: " << rect_p2->area()<< endl; // rectarea: 12 delete rect_p1; return 0;}
4) V triede C vytvorte statickú premennú, ktorá určí koľko objektov triedy bolo vytvorených a ktorej hodnota sa po zrušení objektu zníži. Pre kontrolu tlačte jej hodnoty v hlavnom programe. class C{ public: static int m; C(){m++;}; ~C(){m--;}; }; int C::m = 0; main(){ C a; C b[5]; C *c = new C; cout << a.m<< endl; // 7 delete c; cout<< C::m<< endl; // 6 return 0;}
5. Implementujte triedu umožňujúcu tvoriť zreťazený zoznam jej objektov. V hlavnej funkcii vytvorte v cykle zoznam 10 objektov. classBox{ int length, width ; Box *another_box; public: Box(); void set_next_box( Box* ); Box *get_next(); }; Box::Box(){ length = 10; width = 10; another_box = NULL;} void Box::set_next_box(Box *new_box){another_box = new_box} Box* Box::get_next(){return another_box;}
main(){ Box *start = NULL; // ukazuje na začiatok zoznamu Box *temp; // pomocný smerník Box *box_pointer; //použitý na tvorbu nového objektu for( int i =0 ; i<10; i++){ box_pointer = new Box; if (start == NULL){ start = box_pointer; // prvy prvok temp = start;} else temp->set_next_box(box_pointer); temp = box_pointer; } // po ukončení cyklu má posledný v another_box NULL temp = start; do{ temp = temp->get_next(); delete start; start = temp; }while(temp!= NULL); return 0;}
6. Vytvorte triedu obdĺžnik s globálnymi funkciami na zadanie dĺžok strán a výpočtu plochy. Ako friend funkcie definujte prekryté operátory sčítania a súčinu, ktoré pridajú k stranám konštantu resp. násobne zväčšia strany obdĺžnika. #include <iostream.h> class CRectangle { int x, y; public: void set_values (int a, int b) { x = a; y = b;} int area () {return (x*y);} friend CRectangle operator +(int , CRectangle); friend CRectangle operator *(int , CRectangle); }; CRectangle operator +(int a, CRectangle rect){ CRectangle temp; temp.x = a+ rect.x; temp.y = a+ rect.y; return temp;}
CRectangle operator *(int a, CRectangle rect){ CRectangle temp; temp.x = a* rect.x; temp.y = a* rect.y; return temp; } main(){ CRectangle r; CRectangle temp; r.set_values(2,4); cout << r.area() <<endl; // result 8 temp= 3 + r; cout << temp.area() <<endl; // result 35 temp= 3*r; cout << temp.area() <<endl; // result 72 return 0; }
7. Navrhnite triedy pre tvorbu rozvrhu prednášok na VŠ. Program by mal obsahovať nasledovné triedy: class Student, class Teacher, class Course a class Scheduler. Trieda Student by mala obsahovať premennú pre meno. Trieda Teacherby mala obsahovať lokálnu premennú na zadanie mena, lokálnu premennú, ktorá určuje koľko predmetov učiteľ učí a statickú premennú, ktorá určuje pre každého učiteľa hornú hranicu počtu predmetov ktoré môže maximálne učiteľ učiť. Globálna funkcia v tejto triede by mala umožniť testovanie či počet predmetov neprekročil danú hranicu. Trieda Course by mala obsahovať lokálne premenné ako číslo kurzu, čas kedy sa uskutoční a zoznam študentov, ktorý navštevujú kurz. Ako globálna premenná by mal byť objekt typu učiteľ, ktorý daný kurz učí a globálnu funkciu pre jej zadanie. Trieda Scheduler by mala ako lokálnu premennú obsahovať pole ponúkaných kurzov a globálnu funkciu na priradenie učiteľa ku špecifikovanému kurzu.
#include <stdio.h> #include <iostream.h> enum bool {FALSE=0, TRUE=1}; class Teacher { char *name; // name of teacher int courses; static int MaxCourses; public:Teacher(){}; //empty constructor Teacher(char* newName):courses(0){ // constructor name = newName;} bool assign(); //member function void print(){ printf("the teachers name is: %s \n", name);} }; class Student{ char *name; // name of student public: Student(){ cout<< “give student’s name: “; cin >>name;} };
int Teacher:: MaxCourses =3; bool Teacher::assign(){ if(courses < MaxCourses){ // test for teachar’s number of courses++;// courses return TRUE; } else return FALSE; }
class Course { char *number; // course number as string char *time; // time slot as string Student *students; // pointer to students in class public: Course(); //empty constructor Course(char *n, char *t, int s); // constructor with parameters ~Course(){ delete students;}; //destructor Teacher teacher; // teacher for class void assignTeacher(Teacher& t); }; Course(){ number = “unassigned”; time = “T1”;} Course(char *n, char *t, int s){ number = n; time = t; students = new student[s];}
void Course::assignTeacher(Teacher &t){ if (t.assign()) teacher = t; else printf(“more then MaxCourses! \n”);} class Schedule { Course *offerings[10]; // array of courses int offered; // number of courses offered public: Schedule():offered(0){} void assign(Course &c, Teacher &t); // bolo *c, *t }; void Schedule::assign(Course &c, Teacher &t){ if (offered < 10) { offerings[offered++] = &c; c.assignTeacher (t); } else printf("Schedule full ! \n"); }
main(){ Schedule s; //vytvorenie objektu rozvrhu Teacher t1(“John”), t2(“Jack”); // vytvorenie objektov učiteľa Course c1(“No1”, “10.00-12.00”,6); // vytvorenie objektov kurzu Course c2(“No2”, “13.00-14.00”,5); s.assign(c1, t1); // priradenie učiteľa kurzu s. assign(c2, t2); cout << “Teacher of first course:” << endl; c1.teacher.print(); cout << “Teacher of second course:” << endl; c2.teacher.print(); return 0; }
9. Navrhnite program pre riadenie spúšťania závor na železničnom prechode s nasledovnými predpokladmi. Vlak má konštantnú rýchlosť a vo vzdialenosti d1 od prechodu vyšle senzor signál o priblížení sa vlaku k prechodu. Signál je určený pre riad. systém (RS), ktorý dá do 1 časovej jednotky povel na spustenie závor. Závory sa spustia tiež do 1 časovej jednotky. Keď vlak minie prechod ( vzdialenosť d2) vyšle senzor opäť signál RS, že prechod je volný. RS vyšle do 1 časovej jednotky povel na zdvihnutie závor a tie sa do 2 časových jednotiek zdvihnú. Návrh riešenia: Vytvorte triedy Train, Controller a Gate (Vlak, RS, Závory) v stavovo prechodovej reprezentácii (model je konečný automat). Globálny čas simulujte ako celočíselnú premennú, ktorá sa bude v hlavnom programe inkrementovať. Časové ohraničenia na prechody medzi stavmi objektov pre všetky triedy simulujte lokálnymi časovými premennými a implementujte ich v danej triede.
Prechody medzi stavmi sú aktivované takto: pre objekt triedy Train: s0->s1 prejdenou vzdialenosťou d1 s1->s2 2 časovými jednotkami s2->s3 do 5 časových jednotiek s3-> s4=s0 po prejdení vzdialenosti d2 pre objekt triedy Controller: u0->u1 signálom senzora o priblížení sa vlaku u1-> u0 uplynutím 1 časovej jednotky u0-> u2 signálom senzora o minutí prechodu vlakom u2-> u0 uplynutím 1 časovej jednotky pre objekt triedy Gate: t0->t1 povelom RS na sklopenie závor t1-> t2 uplynutím 1 časovej jednotky t2-> t3 povelom RS na zdvihnutie závor t3-> t0 uplynutím 2 časových jednotiek
Stavové diagramy objektov v tvare časových automatov
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 up! x>2 in exit! down! t3 out! s3 s2 t2 y<2 x<5 x<5 raise?, y:=0 controller approach?, z:=0 exit?,z:=0 u2 u1 u0 z<1 z<1 raise! z=1, lower! train||gait||controller
Simulácia dynamiky vývoja stavových diagramov v závislosti na vzniku udalostí a čase
Train-gate example train gate approach!, x:=0 y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 t3 s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 u2 u1 u0 z<1 z<1 z:=1 train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, s1 y:=0 s0 t0 t1 x<5 y<1 y>1 x>2 t3 s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 u2 u1 u0 z<1 z<1 lower! z=1, train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 down! t3 s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 u2 u1 u0 z<1 z<1 z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 in! down! t3 s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 u2 u1 u0 z<1 z<1 z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 in! down! t3 out! s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 u2 u1 u0 z<1 z<1 z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 in! exit! down! t3 out! s3 s2 t2 y<2 x<5 x<5 y:=0 controller approach?, z:=0 z:=0 exit?, u2 u1 u0 z<1 z<1 z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 in! exit! down! t3 out! s3 s2 t2 y<2 x<5 x<5 raise?, y:=0 controller approach?, z:=0 exit?,z:=0 u2 u1 u0 z<1 z<1 raise! z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 x>2 in! exit! up! down! t3 out! s3 s2 t2 y<2 x<5 x<5 raise?, y:=0 controller approach?, z:=0 exit?,z:=0 u2 u1 u0 z<1 z<1 raise! z=1, lower! train||gait||controller
Train-gate example train gate approach!, x:=0 lower?, y:=0 s1 s0 t0 t1 x<5 y<1 y>1 up! x>2 in exit! down! t3 out! s3 s2 t2 y<2 x<5 x<5 raise?, y:=0 controller approach?, z:=0 exit?,z:=0 u2 u1 u0 z<1 z<1 raise! z=1, lower! train||gait||controller
#include <iostream.h> int global_time; int d1,d2; enum train_state{s0,s1,s2,s3,s4}; enum gate_state{t0,t1,t2,t3}; enum contr_state{u0,u1,u2}; class Gate{ gate_state actual_state; //aktuálny stav int control_signal; int clock_y; //lokálna časová premenná public: Gate(gate_state); void lower(){control_signal=1;} //povel na spustenie závor void raise(){control_signal=0;} // povel na zdvihnutie závor void Change_state(); // funkcia na zmenu stavu void print(){cout <<"gate state ="<<actual_state <<endl;} };
class Controller{ int signal; // signal o polohe vlaku contr_state actual_state; // aktuálny stav int clock_z; // lokálny čas public: Controller(contr_state); Gate *g; void approach(){signal=1;}; //funkcie pre nastavenie signalu o polohe vlaku void exit(){signal=0;}; void Change_state(); //funkcia pre zmenu stavu void print(){cout <<"controller state ="<<actual_state <<endl;} }; class Train{ float velocity,distance; //rýchlosť vlaku a prejdená vzdialenosť train_state actual_state; //aktuálny stav int clock_x; // lokálny čas public: Train(train_state, float); void Change_state(); //funkcia pre zmenu stavu Controller *c; train_state get_state(); //funkcia vracajúca aktuálny stav void print(){cout <<"train="<<actual_state <<"\n";} };
Train::Train(train_state init_state, float vel){ actual_state=init_state; distance=0; velocity= vel; clock_x=0; } train_state Train::get_state(){ return actual_state; } Controller::Controller(contr_state init_state){ actual_state=init_state; signal=3; clock_z=0; } Gate::Gate(gate_state init_state){ actual_state= init_state; clock_y= 0; control_signal=3; }
void Train::Change_state(){ distance= velocity*global_time; switch (actual_state){ case s0: clock_x= 0; if(distance==d1){ actual_state=s1; c->approach();}; break; case s1: if(clock_x>2) actual_state=s2; //in break; case s2: if (clock_x<=5) actual_state=s3; //out break; case s3: if(distance>d2){ actual_state=s4; c->exit();} break; } clock_x++; }
void Controller::Change_state(){ switch (actual_state){ case u0: if(signal==1){ clock_z=0; actual_state=u1; signal=3;} else if(signal==0){ clock_z=0; actual_state=u2; signal=3;} break; case u1: if(clock_z==1){ actual_state=u0; g->lower();} break; case u2: if(clock_z==1){ actual_state=u0; g->raise();} break; }clock_z++; }
void Gate::Change_state(){ switch (actual_state){ case t0: clock_y= 0; if(control_signal==1) actual_state=t1; break; case t1: if(clock_y<=1) actual_state=t2; //down break; case t2: if (control_signal==0){ actual_state=t3; clock_y= 0;} break; case t3: if (clock_y>1) actual_state=t0; //up break; } clock_y++; }
void Start(Train *T, Controller *C, Gate *G){ T->Change_state(); T->print(); C->Change_state(); C->print(); G->Change_state(); G->print(); } main(){ d1=200; d2=700; global_time=0; Train tr(s0,100); Controller con(u0); Gate gt(t0); tr.c= &con; con.g= > do{ Start(&tr, &con, >); global_time++; } while (while (global_time<12); return 0; }