Facebook
From Adam Musiał, 6 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 347
  1. // Tablica_Dynamiczna_kolos_PK.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6.  
  7. class Zespolona
  8. {
  9.         double rzeczywista;
  10.         double urojona;
  11.  
  12. public:
  13.  
  14.         Zespolona():rzeczywista(0), urojona(0) {}
  15.         //nie trzeba tworzyć konstruktorów kopiującego i przenoszącego, bo nie operujemy na
  16.         //strukturach dynamicznych, gdzie obie struktury miałyby te same wskaźnik
  17.         Zespolona(double r, double u): rzeczywista(r), urojona(u) {}
  18.  
  19.         double getR() const { return rzeczywista; }
  20.         double getU() const { return urojona; }
  21.  
  22.         void setR(const double r):rzeczywista(r) {}
  23.         void setU(const double u):urojona(u) {}
  24.        
  25.         friend std::istream& operator >>(std::istream& s, Zespolona& z)
  26.         {
  27.                 s >> z.rzeczywista >> z.urojona;
  28.                 return s;
  29.         }
  30.  
  31.         bool operator <(const Zespolona& z) const //ten const to tego, że nie zmieniamy this
  32.         {
  33.                 return rzeczywista*rzeczywista + urojona*urojona
  34.                         < z.rzeczywista*z.rzeczywista + z.urojona*z.urojona;
  35.         }
  36. };
  37.  
  38. class Tab
  39. {
  40. protected:
  41.         //Zespolona** tablica; dla tablic dynamicznych wsk
  42.         Zespolona* tablica;
  43.         unsigned int rozmiar;
  44. public:
  45.         Tab(): tablica(nullptr), rozmiar(0) {}
  46.         ~Tab()
  47.         {
  48.                 //dla tablic dynamicznych wsk, a nie obiektów jak niżej
  49.                 //for (int i = 0; i < rozmiar; ++i)
  50.                 //      delete tablica[i];
  51.                 //delete[] tablica;
  52.                 delete[] tablica;
  53.         }
  54.        
  55.         //operator += dodaje element na koniec tablicy
  56.         virtual void operator +=(const Zespolona& z)
  57.         {
  58.                 //new Zespolona*[rozmiar + 1]; - dla tablicy wsk
  59.                 auto nowaTab = new Zespolona[rozmiar + 1];
  60.                 for (unsigned int i = 0; i < rozmiar; ++i)
  61.                 {
  62.                         nowaTab[i] = tablica[i]; //dla tabWsk: nowaTab[i]= new Zespolona(*tablica[i]);
  63.                         //dla tabWsk musimy stworzyć nową tablicę na podstawie tablica[i], i trzeba wyłuskać te wartości
  64.                 }
  65.                 nowaTab[rozmiar] = z;
  66.                 delete[] tablica;
  67.                 tablica = nowaTab;
  68.                 ++rozmiar;
  69.         }
  70.        
  71.         //operator przypisania
  72.         Tab& operator=(const Tab& t)
  73.         {
  74.                 //zwraca Tab&, żeby można było to łańcuchować
  75.                 //int a = 5;
  76.                 //int a = b = 5;
  77.                 if (this == &t) //ZAWSZE!!!
  78.                         return *this;
  79.                 delete[] tablica;
  80.                 rozmiar = t.rozmiar;
  81.                 tablica = new Zespolona[rozmiar];
  82.                 for (unsigned int i = 0; i < rozmiar; ++i)
  83.                         tablica[i] = t.tablica[i];
  84.                 return *this;
  85.         }
  86.  
  87.         //operator przenoszenia
  88.         Tab& operator=(Tab&& t)
  89.         {
  90.                 if (this == &t) //ZAWSZE!!!
  91.                         return *this;
  92.  
  93.                 delete[] tablica;
  94.                 rozmiar = t.rozmiar;
  95.                 t.rozmiar = 0;
  96.                 tablica = t.tablica;
  97.                 t.tablica = nullptr;
  98.         }
  99.  
  100.         Zespolona operator[](unsigned int i)//const jest do referencji
  101.         {
  102.                 if (i >= rozmiar)
  103.                 {
  104.                         throw std::exception();
  105.                 }
  106.                 return tablica[i];
  107.         }
  108. };
  109.  
  110. class Kolejka: public Tab
  111. {
  112. public:
  113.         void operator+=(const Zespolona& z) override
  114.         {
  115.                 auto nowaKolejka = new Zespolona[rozmiar + 1];
  116.  
  117.                 int i = 0;
  118.                 //wyszukiwanie elementu i przepisywanie elementów do szukanego
  119.                 while (i < rozmiar && tablica[i] < z)
  120.                 {
  121.                         nowaKolejka[i] = tablica[i];
  122.                         ++i;
  123.                 }
  124.                 //wpisanie nowego elementu
  125.                 nowaKolejka[i] = z;
  126.                 ++rozmiar;
  127.                 ++i;
  128.                 //przepisanie reszty elementów
  129.                 while (i < rozmiar)
  130.                 {
  131.                         nowaKolejka[i] = tablica[i-1];
  132.                         ++i;
  133.                 }
  134.                 delete[] tablica;
  135.                 tablica = nowaKolejka;
  136.         }
  137.  
  138.         friend std::ostream& operator>>(std::ostream& s, Kolejka& k)
  139.         {
  140.                 //for (int i = 0; i < rozmiar; ++i) dla tabWSk
  141.                 //      delete tablica[i]; dla tabWSk
  142.                 for (int i = 0; i < rozmiar; ++i)
  143.                 {
  144.                         //tablica[i] = new Zespolona(); dla tabWSk
  145.                         s >> tablica[i];
  146.                 }
  147.                 return s;
  148.         }
  149.  
  150.         operator Zespolona()
  151.         {
  152.                 double sumaR = 0;
  153.                 double sumaU = 0;
  154.                 for (unsigned int i = 0; i < rozmiar; ++i)
  155.                 {
  156.                         sumaR += tablica[i].getR();
  157.                         sumaU += tablica[i].getU();
  158.                 }
  159.                 return Zespolona(sumaR, sumaU);
  160.         }
  161.  
  162.         Zespolona pop()
  163.         {
  164.                 auto bufor = tablica[0];
  165.                 auto nowaTab = new Zespolona[rozmiar - 1];
  166.                 for (unsigned int i = 1; i < rozmiar; ++i)
  167.                 {
  168.                         nowaTab[i - 1] = tablica[i];
  169.                 }
  170.                 delete[] tablica;
  171.                 --rozmiar;
  172.                 tablica = nowaTab;
  173.                 return bufor;
  174.         }
  175. };
  176.  
  177. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  178.  
  179.   // Kolokwium_lista.cpp : Defines the entry point for the console application.
  180. //
  181.  
  182. #include "stdafx.h"
  183. #include <iostream>
  184. #include <stdlib.h>
  185.  
  186. class Payment
  187. {
  188.         char* name;
  189.         double cost;
  190.         int day;
  191.         int month;
  192.         int year;
  193. public:
  194.  
  195.         //konstruktor 5-cio argumentowy
  196.         Payment(char *n, double c, int d, int m, int y) : cost(c), day(d), month(m), year(y)
  197.         {
  198.                 name = new char[strlen(n) + 1];
  199.                 for (unsigned int i = 0; i <= strlen(n); ++i)
  200.                         name[i] = n[i];
  201.         }
  202.  
  203.         //konstruktor kopiujący
  204.         Payment(const Payment& p) : Payment(p.name, p.cost, p.day, p.month, p.year) {}
  205.  
  206.         //konstruktor przenoszący
  207.         Payment(Payment&& p)
  208.         {
  209.                 name = p.name;
  210.                 day = p.day;
  211.                 month = p.month;
  212.                 year = p.year;
  213.                 cost = p.cost;
  214.                 p.cost = 0;
  215.                 p.day = 0;
  216.                 p.month = 0;
  217.                 p.year = 0;
  218.                 p.name = nullptr;
  219.         }
  220.  
  221.         //operator przypisania
  222.         Payment& operator=(const Payment& p)
  223.         {
  224.                 if (this == &p) // ten if na początek każdego operatora = (& i &&) kopiującego i przenoszącego/przypisującego
  225.                         return *this;
  226.  
  227.                 cost = p.cost;
  228.                 day = p.day;
  229.                 month = p.month;
  230.                 year = p.year;
  231.                 delete[] name;
  232.                 name = new char[strlen(p.name) + 1];
  233.                 for (unsigned int i = 0; i <= strlen(p.name); ++i)
  234.                         name[i] = p.name[i];
  235.         }
  236.  
  237.         //operator porównania
  238.         bool operator<(const Payment& p) const
  239.         {
  240.                 if (year == p.year)
  241.                         if (month == p.month)
  242.                                 return day < p.day;
  243.                         else
  244.                                 return month < p.month;
  245.                 else
  246.                         return year < p.year;
  247.         }
  248.  
  249.         //gettery
  250.         char* getName() const { return name; }
  251.         double getCost() const { return cost; }
  252.         int getDay() const { return day; }
  253.         int getMonth() const { return month; }
  254.         int getYear() const { return year; }
  255.  
  256.         //settery
  257.         void setName(const char* n):name(n) {}
  258.         void setCost(const double c): cost(c) {}
  259.         //itd...
  260.  
  261.         //zaprzyjażniony operator strumieniowy
  262.         friend std::ostream& operator << (std::ostream& s, const Payment& p)
  263.         {
  264.                 s << p.name << " " << p.cost << " " << p.day << "." << p.month << "." << p.year;
  265.                 return s;
  266.         }
  267.  
  268. };
  269.  
  270.  
  271. struct element
  272. {
  273.         element* next;
  274.         element* prev;
  275.         Payment p;
  276.         //konstruktor kopiujący
  277.         element(const Payment& other) : next(nullptr), prev(nullptr), p(other) {}
  278. };
  279.  
  280. class List
  281. {
  282. protected:
  283.         element* head;
  284.         element* tail;
  285. public:
  286.         //konstruktor bezargumentowy
  287.         List() : head(nullptr), tail(nullptr) {}
  288.         //destruktor
  289.         ~List()
  290.         {
  291.                 while (head)
  292.                 {
  293.                         auto bufor = head;
  294.                         head = head->next;
  295.                         delete bufor;
  296.                 }
  297.                 tail = nullptr;
  298.         }
  299.  
  300.         //jak operator ma być przeciążony w klasie pochodnej to stosujemy "virtual" w klasie nadrzednej, a w klasie pochodnej "override", bo nadpisujemy
  301.  
  302.         //przeciążony operator +=
  303.         virtual void operator+=(const Payment& p) //typy klasowe moga byc bardzo duze i chcemy uniknac ich kopiowania dlatego &
  304.         {
  305.                 auto newElement = new element(p);
  306.                 if (tail)
  307.                 {
  308.                         auto bufor = tail;
  309.                         tail = newElement;
  310.                         bufor->next = tail;
  311.                         tail->prev = bufor;
  312.                 }
  313.                 else
  314.                 {
  315.                         tail = head = newElement;
  316.                 }
  317.         }
  318.  
  319.         //jeśli mamy opertator += napisać to robimy to przed konstruktorem, bo go wykorzystujemy
  320.  
  321.         //konstruktor kopiujący
  322.         List(const List& other)
  323.         {
  324.                 auto ptr = other.head;
  325.                 while (ptr)
  326.                 {
  327.                         *this += ptr->p;
  328.                         ptr = ptr->next;
  329.                 }
  330.         }
  331.  
  332.         //zaprzyjaźniony operator strumieniowy <<
  333.         friend std::ostream& operator <<(std::ostream& s, const List& l)
  334.         {
  335.                 auto ptr = l.head;
  336.                 while (ptr)
  337.                 {
  338.                         s << ptr->p << std::endl;
  339.                         ptr = ptr->next;
  340.                 }
  341.                 return s;
  342.         }
  343. };
  344.  
  345. class Queue: public List
  346. {
  347. public:
  348.  
  349.   //nadpisany operator +=
  350.         void operator+=(const Payment& p) override
  351.         {
  352.                 auto newElement = new element(p);
  353.                 auto ptr = head;
  354.                 while (ptr && p < ptr->p)
  355.                 {
  356.                         ptr = ptr->next;
  357.                 }
  358.                 if (ptr)
  359.                 {
  360.                         auto bufor = ptr->prev;
  361.                         ptr->prev = newElement;
  362.                         if (ptr == head) head = newElement; //czy to jest konieczne?
  363.                         if (bufor) bufor->next = newElement;
  364.                         newElement->prev = bufor;
  365.                         newElement->next = ptr;
  366.                 }
  367.                 else
  368.                 {
  369.                         auto bufor = tail;
  370.                         tail = newElement;
  371.                         if (bufor)
  372.                         {
  373.                                 bufor->next = tail;
  374.                                 tail->prev = bufor;
  375.                                 return;
  376.                         }
  377.                         else
  378.                         {
  379.                                 head = tail;
  380.                         }
  381.                 }
  382.         }
  383.  
  384.    //usuwanie listy
  385.         void deleteList()
  386.         {
  387.                 while (head)
  388.                 {
  389.                         auto bufor = head;
  390.                         head = head->next;
  391.                         delete bufor;
  392.                 }
  393.                 tail = nullptr;
  394.         }
  395.  
  396.   //operator = przypisania
  397.         Queue& operator=(const Queue& q)
  398.         {
  399.                 if (this == &q)
  400.                         return *this;
  401.  
  402.                 deleteList();
  403.                 auto ptr = q.head;
  404.                 while (ptr)
  405.                 {
  406.                         *this += ptr->p;
  407.                         ptr = ptr->next;
  408.                 }
  409.                 return *this;
  410.         }
  411.  
  412.  
  413.         //operatory konwersji zapisuje się:  operator TypDoKtoregoKonwertujesz() { funkcja }
  414.         operator double()
  415.         {
  416.                 auto ptr = head;
  417.                 auto sum = 0.0;
  418.                 while (ptr)
  419.                 {
  420.                         sum += (ptr->p).getCost();
  421.                         ptr = ptr->next;
  422.                 }
  423.                 return sum;
  424.         }
  425.  
  426.         Payment pop()
  427.         {
  428.                 auto toReturn = head->p;
  429.                 auto bufor = head;
  430.                 head = head->next;
  431.                 if (tail == bufor)
  432.                         tail = nullptr;
  433.                 delete bufor;
  434.                 return toReturn;
  435.         }
  436. };
  437.  
  438. int main()
  439. {
  440.         Queue list;
  441.         list += Payment("Adam", 50, 4, 12, 1997);
  442.         list += Payment("Piotr", 30, 5, 12, 1997);
  443.         list += Payment("Tomasz", 80, 4, 8, 1997);
  444.         list += Payment("Domek", 25, 14, 1, 1998);
  445.         list += Payment("Lipa", 60, 17, 2, 1995);
  446.         list += Payment("Lol", 56, 19, 7, 2000);
  447.         std::cout << list;
  448.         Queue l;
  449.         l = list;
  450.         std::cout << std::endl << l;
  451.         std::cout << std::endl << (double)l;
  452.         std::cout << std::endl << l.pop();
  453.         std::cout << std::endl <<std::endl << l;
  454.  
  455.     return 0;
  456. }
  457.  
  458.  
  459.  

Replies to Kolokwium PK3 rss

Title Name Language When
Kolokwium PK3 v2 Adam Musiał cpp 6 Years ago.