zadanie v nasledovnom programe pridajte do triedy c funkciu pre výpočet
DESCRIPTION
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; } - PowerPoint PPT PresentationTRANSCRIPT
1. ZadanieV nasledovnom programe pridajte do triedy C funkciu pre výpočetdruhej 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; // rect area: 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; // rect area: 12 cout << “rect area: " << rect_p2->area()<< endl; // rect area: 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.
class Box{ 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 Teacher by 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 classpublic: 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 offeredpublic: 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
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in
out!
exit!
lower?, y:=0
down!
y>1up!
exit?,z:=0
raise! z=1, lower!
approach?, z:=0
raise?, y:=0
train||gait||controller
train gate
controller
Simulácia dynamiky vývoja stavových diagramov v závislosti
na vzniku udalostí a čase
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!,
x>2
y:=0
y>1
z:=0
approach?,
y:=0
train||gait||controller
train gate
controller
x:=0
z:=1
z:=0
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2
y:=0
y>1
z:=0
z=1,
approach?, z:=0
y:=0
train||gait||controller
train gate
controller
lower!
lower?,
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2
lower?, y:=0
down!
y>1
z:=0
z=1, lower!
approach?, z:=0
y:=0
train||gait||controller
train gate
controller
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
in!
lower?, y:=0
down!
y>1
z:=0
z=1, lower!
approach?, z:=0
y:=0
train||gait||controller
train gate
controller
x>2
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in!
out!
lower?, y:=0
down!
y>1
z:=0
z=1, lower!
approach?, z:=0
y:=0
train||gait||controller
train gate
controller
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in!
out!
exit!
lower?, y:=0
down!
y>1
exit?,
z=1, lower!
approach?, z:=0
y:=0
train||gait||controller
train gate
controllerz:=0
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in!
out!
exit!
lower?, y:=0
down!
y>1
exit?,z:=0
raise! z=1, lower!
approach?, z:=0
raise?,
train||gait||controller
train gate
controllery:=0
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in!
out!
exit!
lower?, y:=0
down!
y>1
exit?,z:=0
raise! z=1, lower!
approach?, z:=0
raise?, y:=0
train||gait||controller
train gate
controller
up!
Train-gate example
s2
t0
t2
u0
s0
x<5
s1
x<5
s3
x<5
u2
z<1
u1
z<1
t1
y<1
t3
y<2
approach!, x:=0
x>2in
out!
exit!
lower?, y:=0
down!
y>1up!
exit?,z:=0
raise! z=1, lower!
approach?, z:=0
raise?, y:=0
train||gait||controller
train gate
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 stavuController *c;train_state get_state(); //funkcia vracajúca aktuálny stavvoid 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; //inbreak;case s2:if (clock_x<=5)actual_state=s3; //outbreak;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; //downbreak;case t2:if (control_signal==0){actual_state=t3;clock_y= 0;}break;case t3:if (clock_y>1)actual_state=t0; //upbreak;}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;}