Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.69 KB | None | 0 0
  1. //zadanie E3_MJ
  2. #include <iostream>
  3. using namespace std;
  4. class Item {
  5. private:
  6. int m_value; // datova hodnota prvku zoznamu
  7. Item *m_next; // vazobny clen prvku zoznamu
  8. public:
  9. /*int value();
  10. void next(Item*);
  11. Item*next();*/
  12. Item(int value, Item *ItemToLinkTo = NULL); // deklaracia parametrickeho konstruktora
  13. int value(); //clen. funk., ktora vrati datovu hodn. prvku zoznamu 'm_value'
  14. void next(Item *link); //clenska funkcia, ktora vlozi do vazobneho clena prvku
  15. //zoznamu 'm_next' ukazovatel 'link'
  16. Item* next(); //clenska funkcia, ktora vrati hodnotu vazobneho clena prvku
  17. //zoznamu 'm_next': čo je ukazovateľ ukazujúci na nasledujúci dátový prvok.
  18. };
  19. class IntList {
  20. private:
  21. void bumb_up();
  22. void bumb_down();
  23. //privatna clenska funkcia, ktora
  24. void bump_up() { ++m_size; } //zvacsi o 1 velkost zoznamu ulozenu v clenskej premennej 'm_size'
  25. void bump_down() { --m_size; } //zmensi o 1 velkost zoznamu ulozenu v clen. premennej 'm_size'
  26. // privatna clenska premenna -
  27. Item *m_front; // ukazovatel na prvy prvok zoznamu
  28. Item *m_end; // ukazovatel na posledny prvok zoznamu
  29. int m_size; // pocet prvkov zoznamu (jeho velkost)
  30.  
  31. public:
  32. // definicia konstruktora s inicializacnym zoznamom
  33. IntList() : m_front(NULL), m_end(NULL), m_size(0) {}
  34. // definicia explicitneho destruktora
  35. ~IntList() {}/*Destruktor je v objektovém programování metoda, která je zavolána při likvidaci instance své třídy v paměti počítače.
  36.  
  37. Při likvidaci instance třídy(objektu) by mělo dojít k uvolnění všech zdrojů, se kterými objekt pracoval.To může programátor zajistit právě pomocí destruktoru.Podobně jako lze pomocí konstruktoru zajistit alokaci prostředků při vytváření objektu.
  38.  
  39. Destruktor nemá návratovou hodnotu a žádné parametry.Nemá - li třída destruktor, překladač vytvoří implicitní destruktor.
  40. // clenska funkcia, ktora vrati ukazovatel na 1. prvok zoznamu*/
  41. Item* front();
  42. void insert_order(int value); // vlozi 1 prvok s hodnotou 'value' do zoznamu USPORIADANE
  43. void display(); // clenska funkcia, ktora zobrazi datove hodnoty prvkov zoznamu na konzolu
  44. int number_of_divisible(int z);//funkcie zisti a vrati počet prvkov zoznamu, ktorých datove časti su delitelne parametrom z
  45. void display_divisible(int x);//funkcie najde a zobrazi na konzolu všetky prvky zoznamu ktorych datove časti su delitlene parametrom x
  46. //tiež zobrazi počet takýchto prvkov ktory zisti zavolani členskej funkcie intList::number of divisibe
  47. void reverse();//funkcia obrati poradie prvkov v linearnom jednosmernom zozname tzn povodne prvy prvok v zozname sa stane posledným
  48. //povodne druhy sa stane predposlednym atd.
  49. };
  50.  
  51.  
  52. int Item::value() { return m_value; } //clen. funk., ktora vrati datovu hodn. prvku zoznamu 'm_value'
  53. void Item::next(Item *link) { this->m_next = link; } //clenska funkcia, ktora vlozi do vazobneho clena prvku
  54. //zoznamu 'm_next' ukazovatel 'link'Putting it all together:
  55. /*1) When we call simple.setID(2), the compiler actually calls setID(&simple, 2).
  56. 2) Inside setID(), the “this” pointer holds the address of object simple.
  57. 3) Any member variables inside setID() are prefixed with “this->”.So when we say m_id = id, the compiler is actually executing this->m_id = id, which in this case updates simple.m_id to id.
  58. Item* Item::next() { return m_next; } //clenska funkcia, ktora vrati hodnotu vazobneho clena prvku
  59. //zoznamu 'm_next'*/
  60. Item* IntList::front() { return m_front; }
  61.  
  62.  
  63. void IntList::insert_order(int value)
  64. {
  65. Item *ptr = new Item(value); //vytvorenie ukazovatela 'ptr' na novy prvok zoznamu s hodnotou
  66. //datoveho clena 'value', ktory vkladame do tohto zoznamu USPORIADANE
  67.  
  68. if (!m_front) //ak je zoznam prazdny,
  69. m_front = m_end = ptr; //tak novy prvok vkladame ako prvy do zoznamu,
  70.  
  71. else //inak hladame vhodne miesto pre vlozenie prvku
  72. {
  73. Item *pred = NULL, *po = m_front;
  74.  
  75. enum { HLADAJ, UKONCI } stav = HLADAJ; // premenna 'stav' je vymenovaneho typu
  76. //zväčší sa dátový počet prvkov o 1
  77.  
  78. while ((stav == HLADAJ) && (po != 0))
  79.  
  80. if (po->value() >= value)
  81. stav = UKONCI; // Vhodne miesto najdene!
  82.  
  83. else // ak sa vhodne miesto pre vlozenie prvku nenaslo, tak sa presuvame dalej v zozname pri
  84. // jeho hladani
  85. {
  86. pred = po; // Ukazovatele "pred" a "po"
  87.  
  88. po = po->next(); // si zapamataju miesto vlozenia.
  89. }
  90. if (pred == NULL) // Vlozenie noveho prvku na zaciatok zoznamu.
  91. {
  92. m_front = ptr;// m_front bude ukazovat nato naco ukazuje ptr
  93. ptr->next(po);//prvok na ktory ukazuje ptr bude ukazovat na m_dalsi prvku na ktory ukazuje po
  94. }
  95. else if (po == NULL) // Vlozenie noveho prvku na koniec zoznamu.
  96. {
  97. m_end->next(ptr);//vlozenie adresy ptr do vazobneho prvku m_next prvku na ktory ukazuje m_end, m_next(m_end ) bude ukazovat nato naco ukazuje prt
  98.  
  99. ptr->next(NULL);//
  100.  
  101. m_end = ptr;//
  102. }
  103. else // Vlozenie noveho prvku medzi prvky zoznamu,
  104. { // na ktore teraz ukazuju ukazovatele 'pred' a 'po'
  105. pred->next(ptr);
  106.  
  107. ptr->next(po);
  108. }
  109. }
  110. bump_up();
  111. }
  112.  
  113.  
  114.  
  115. Item::Item(int value, Item *item) : m_value(value), m_next(NULL)
  116.  
  117. {
  118. /*if (!item) //ak je hodnota vazobn. clena prvku zoznamu (ukazovatela na nasledujuci prvok) == NULL,
  119.  
  120. m_next = NULL; //tak potom inicializujeme instancnu premennu objektu tohto prvku zoznamu,
  121. //ukazovatel na nasledujuci prvok 'm_next', na NULL
  122. else
  123. {
  124. m_next = item->m_next;
  125.  
  126. item->m_next = this;//tu skusime zmenu
  127. }
  128. */
  129. }
  130.  
  131. void IntList::display()
  132. {
  133. cout << " (velkost " << m_size << ") ( ";
  134. Item *ptr = m_front;
  135. while (ptr)
  136. {
  137. cout << ptr->value() << " ";
  138. ptr = ptr->next();
  139. }
  140. cout << ")\n";
  141. };
  142.  
  143. int IntList::number_of_divisible(int z)
  144. {
  145. int pocet = 0;
  146.  
  147. for (Item *ptr = front(); ptr != NULL; ptr = ptr->next())
  148. {
  149. if (ptr->value() % z == 0)
  150. {
  151. pocet++;
  152. }
  153. }
  154. return pocet;
  155. };
  156. void IntList::display_divisible(int x)
  157. {
  158. cout << " (pocet " << number_of_divisible(x) << ") ( ";
  159. for (Item *ptr = front(); ptr != NULL; ptr = ptr->next())
  160. {
  161. if (ptr->value() % x == 0)
  162. {
  163. cout << ptr->value() << " ";
  164. }
  165.  
  166. }
  167. cout << ")";
  168. };
  169. void IntList::reverse()
  170. {
  171. Item *currently = m_front, *previous = NULL, *next = NULL;
  172.  
  173. while (currently != NULL)
  174. {
  175. next = currently->next();//dalsi ukazuje nato naco ukazuje m_next prvka na ktory ukazuje aktualny
  176.  
  177. currently->next(previous);//m_next prvku na ktory ukazuje aktualny bude ukazovat na prvok na ktory ukazuje predchadzajuci
  178.  
  179. previous = currently; //bude ukazovat na prvok na ktory ukazuje aktualny
  180.  
  181. currently = next; //dalsi bude ukazovat na prvok na ktory ukazuje aktualny
  182. }
  183.  
  184. m_front = previous;
  185. };
  186.  
  187. /* main_funktion
  188. ****************************************************/
  189.  
  190. int main()
  191. {
  192. int m;
  193. int d;
  194. int cislo;
  195. int i;
  196. IntList list;
  197. cout << "Vlozte velkost zoznamu ktory chcete vytvarat:\t";
  198. cin >> m;
  199. cout << endl;
  200. cout << "vlozte " << m << " prvkov, ktore budu usporiadane vlozene do zoznamu" << endl;
  201. for (i = 0; i < m; i++)
  202. {
  203. cin >> cislo;
  204. list.insert_order(cislo);
  205. }
  206. cout << "Zoznam = ";
  207. list.display();
  208. cout << endl;
  209. cout << "akym cislom delitelne prvky chcete najst a zobrazit? " << endl;
  210. cout << "(ak chcete skoncit vlozte 0):";
  211. cin >> d;
  212. if (d != 0)
  213. {
  214. cout << "prvky zoznamu delitelne " << d << ":";
  215. list.display_divisible(d);
  216. }
  217.  
  218. while (d != 0)
  219. {
  220. cout << "\nakym cislom delitelne prvky chcete najst a zobrazit? " << endl;
  221. cout << "(ak chcete skoncit vlozte 0):";
  222. cin >> d;
  223. if (d != 0)
  224. {
  225. cout << "prvky zoznamu delitelne " << d << ":";
  226. list.display_divisible(d);
  227. }
  228. }
  229. cout << "\n Reverzovany (otoceny zoznam Z1:)\n";
  230. list.reverse();
  231. list.display();
  232. return 0;
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement