Algoritmi un programmana Praktiskie darbi Statiski un dinamiski
Algoritmi un programmēšana Praktiskie darbi Statiski un dinamiski objekti C++ Klases un objekti Python Doc. Dr. Sc. Comp. Edgars Rencis, Latvijas Universitāte, Datorikas fakultāte, 2. -4. decembris, 2020.
Statiski un dinamiski objekti C++
Objektu izmantošanas divi veidi n Līdzīgi masīviem q q n Objektu izmantošana statiskā (tiešā) veidā q q q n statiska izmantošana dinamiska izmantošana viss objekts tiek glabāts statiskajā atmiņā objekts tiek automātiski izveidots deklarācijas brīdī objekts tiek automātiski dzēsts bloka beigās Objektu izmantošana dinamiskā veidā q q q objekts tiek glabāts dinamiskajā atmiņā, norāde uz to – statiskajā atmiņā objekts tiek izveidots ar operatoru new objekts tiek dzēsts ar operatoru delete
Objektu izmantošana statiskā veidā n Objekta deklarācija q n Objekta izveidošana q n nav vajadzīga, tā notiek automātiski deklarēšanas brīdī Darbības ar objektu q q n person p; mainīgais p ir ar tipu person p. age=17; cout << p. get. Name(); Objekta dzēšana q nav vajadzīga, tā notiek automātiski tā bloka beigās, kurā objekts deklarēts
Objektu izmantošana dinamiskā veidā n Objekta deklarācija q n Objekta izveidošana q n p=new person; Darbības ar objektu q q n person * p; mainīgais p ir ar tipu norāde uz person (*p). age=17; p->age=17; cout << (*p). get. Name(); cout << p->get. Name(); Objekta dzēšana q delete p;
Konstruktora un destruktora izsaukšanas brīži n Statiskiem objektiem q konstruktors – objekta deklarācijas (radīšanas) brīdī n q n person p; destruktors – bloka, kurā objekts radīts, beigās Dinamiskiem objektiem q konstruktors – objekta radīšanas (nevis deklarācijas) brīdī n q p=new person; destruktors – objekta likvidēšanas brīdī n delete p;
Uzdevums 1 n n Dota klase "Distance" q class Distance { int m, cm; public: void set. Distance(int a, int b) {m=a; cm=b; } int get. Distance. In. Cm() {return m*100+cm; } }; Izveidot šai klasei divas papildus metodes q print. Distance n q is. Bigger. Than n n izdrukāt savu attālumu sakarīgā izskatā pateikt, vai savs attālums ir lielāks parametrā doto attālumu Galvenajā funkcijā (izmantot tikko uzrakstītās metodes) q lietotājs ievada 10 attālumus (katram atsevišķi metrus un centimetrus) q izdrukāt tos attālumus, kas lielāki par pēdējo ievadīto attālumu
class Distance { int m, cm; public: . . . void print. Distance(); bool is. Bigger. Than(Distance); }; Uzdevums 1 – risinājums void Distance: : print. Distance() { cout << m << " metri, " << cm << " centimetrin"; } bool Distance: : is. Bigger. Than(Distance d) { return get. Distance. In. Cm() > d. get. Distance. In. Cm(); } int main() { Distance dist. Arr[10]; int x, y; for (int i=0; i<10; i++) { cin >> x >> y; dist. Arr[i]. set. Distance(x, y); } cout << "Lielāki par pēdējo ir šādi attālumi: n"; for (int i=0; i<9; i++) if (dist. Arr[i]. is. Bigger. Than(dist. Arr[9])) dist. Arr[i]. print. Distance(); return 0; }
Klases un objekti Python
Klases Python n Python klases aprakstā norāda tikai metodes q lauki (atribūti) tiek veidoti tikai piešķiršanas brīdī n n tātad dažādiem vienas klases objektiem var būt dažādi lauku komplekti Klašu metodēs pirmais parametrs ir objekts, kuram šī metode izsaukta q tātad visām metodēm ir vismaz viens parametrs
Python klases un objekta piemērs class person: def set(self, name, age): self. name = name self. age = age def output(self): print(self. name, self. age) p = person() p. set("Edgars", 38) p. output()
Konstruktors un destruktors n Konstruktora metodes vārds: __init__ q n Destruktora metodes vārds: __del__ q n class person: def __del__(self): print("Deleted: ", self. name, self. age) Konstruktora izsaukšana q n class person: def __init__(self, name, age): self. name = name self. age = age veidojot objektu: p=person("Edgars", 38) Destruktora izsaukšana q q manuāli dzēšot objektu: del p piešķirot objekta mainīgajam citu vērtību: p=None
Uzdevums 2 n Izveidot Python klasi attālumu glabāšanai (metros un centimetros) q q q n attāluma uzstādīšana konstruktorā paziņojums par objekta dzēšanu destruktorā metode, kas atgriež glabāto attālumu centimetros Likt lietotājam ievadīt divus attālumus (katram atsevišķi metrus un centimetrus) un izdrukāt to summu centimetros.
Uzdevums 2 – risinājums class distance: def __init__(self, m, cm): self. m=m self. cm=cm def __del__(self): print("Deleted distance: ", self. m, ", self. cm, " cm") def get. Distance. In. Cm(self): return self. m*100+self. cm m, cm=int(input()), int(input()) a=distance(m, cm) m, cm=int(input()), int(input()) b=distance(m, cm) print(a. get. Distance. In. Cm()+b. get. Distance. In. Cm()) del a, b
Uzdevums 3 n n n Izveidot racionālo skaitļu klasi, kuras objektiem varētu norādīt skaitītāju un saucēju Likt lietotājam ievadīt 10 racionālus skaitļus (tas ir, šo skaitļu skaitītājus un saucējus) un izvadīt uz ekrāna to ievadīto skaitļu, kas lielāki par pirmspēdējo ievadīto skaitli, reizinājumu (kā reālu skaitli). Realizēt risinājumus valodās C++ un Python
Uzdevums 3 – C++ klase n n n class Rac. Number { int skait, sauc; public: void set. Number(int, int); double get. Number(); }; void Rac. Number: : set. Number(int a, int b) { skait=a; sauc=b; } double Rac. Number: : get. Number() { if (sauc==0) return 0; return (double)skait/sauc; }
Uzdevums 3 – C++ galvenā funkcija n int main() { Rac. Number arr[10]; int x, y; double mult=1; for (int i=0; i<10; i++) { cin >> x >> y; arr[i]. set. Number(x, y); } for (int i=0; i<10; i++) if (arr[i]. get. Number()>arr[8]. get. Number()) mult*=arr[i]. get. Number(); cout << "Reizinājums ir " << mult << endl; return 0; }
Uzdevums 3 – Python klase class distance: def __init__(self, skait, sauc): self. skait=skait self. sauc=sauc def get. Number(self): if (self. sauc==0): return 0 return self. skait/self. sauc
Uzdevums 3 – Python pārējā daļa arr=[] for i in range(10): x, y=int(input()), int(input()) d=distance(x, y) arr. append(d) mult=1 target=arr[8]. get. Number() for el in arr: res=el. get. Number() if res>target: mult*=res print(mult)
- Slides: 19