#include "stdafx.h"
#include
{
double
public:
public:
Zespolona():rzeczywista(0), urojona(0)
//nie trzeba tworzyć konstruktorów kopiującego i przenoszącego, bo nie operujemy
//strukturach dynamicznych, gdzie obie struktury miałyby te same
Zespolona(double r, double u): rzeczywista(r), urojona(u)
double getR() const { return rzeczywista;
double getU() const { return urojona;
void setR(const double r):rzeczywista(r)
void setU(const double u):urojona(u)
friend std::istream& operator >>(std::istream& s, Zespolona&
{
{
s >> z.rzeczywista >> z.urojona;
}
}
bool operator <(const Zespolona& z) const //ten const to tego, że nie zmieniamy
{
{
return rzeczywista*rzeczywista +
< z.rzeczywista*z.rzeczywista + z.urojona*z.urojona;
class Tab
{
protected:
Zespolona*
unsigned int rozmiar;
public:
~Tab()
{
~Tab()
{
//dla tablic dynamicznych wsk, a nie obiektów jak
//for (int i = 0; i < rozmiar;
//
// delete
//delete[]
delete[]
}
}
//operator += dodaje element na koniec
virtual void operator +=(const Zespolona&
{
{
//new Zespolona*[rozmiar + 1]; - dla tablicy
auto nowaTab = new Zespolona[rozmiar +
for (unsigned int i = 0; i < rozmiar;
{
{
nowaTab[i] = tablica[i]; //dla tabWsk: nowaTab[i]= new
//dla tabWsk musimy stworzyć nową tablicę na podstawie tablica[i], i trzeba wyłuskać te
}
}
nowaTab[rozmiar] =
delete[]
tablica =
++rozmiar;
}
++rozmiar;
}
//operator
Tab& operator=(const Tab&
{
{
//zwraca Tab&, żeby można było to
//int a =
//int a = b =
if (this == &t)
return
delete[]
rozmiar = t.rozmiar;
for (unsigned int i = 0; i < rozmiar;
tablica[i] = t.tablica[i];
}
}
//operator
Tab& operator=(Tab&&
{
{
if (this == &t)
return
delete[]
rozmiar = t.rozmiar;
Zespolona operator[](unsigned int i)//const jest do
{
{
if (i >=
{
{
throw
}
}
return
}
class Kolejka: public Tab
{
public:
{
{
auto nowaKolejka = new Zespolona[rozmiar +
int i =
//wyszukiwanie elementu i przepisywanie elementów do
while (i < rozmiar && tablica[i] <
{
{
nowaKolejka[i] =
++i;
}
++i;
}
//wpisanie nowego
nowaKolejka[i] =
++rozmiar;
++i;
++rozmiar;
++i;
//przepisanie reszty
while (i <
{
{
nowaKolejka[i] =
++i;
}
++i;
}
delete[]
tablica =
}
}
friend std::ostream& operator>>(std::ostream& s, Kolejka&
{
{
//for (int i = 0; i < rozmiar; ++i) dla
//
// delete tablica[i]; dla
for (int i = 0; i < rozmiar;
{
{
//tablica[i] = new Zespolona(); dla
s >>
}
}
return
}
}
operator
{
{
double sumaR =
double sumaU =
for (unsigned int i = 0; i < rozmiar;
{
{
sumaR += tablica[i].getR();
return Zespolona(sumaR,
}
}
Zespolona
{
{
auto bufor =
auto nowaTab = new Zespolona[rozmiar -
for (unsigned int i = 1; i < rozmiar;
{
{
nowaTab[i - 1] =
}
}
delete[]
--rozmiar;
--rozmiar;
tablica =
return
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Kolokwium_lista.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include
#include
h>
class Payment
{
double
int
int
int year;
//konstruktor 5-cio
Payment(char *n, double c, int d, int m, int y) : cost(c), day(d), month(m),
{
{
name = new char[strlen(n) +
for (unsigned int i = 0; i <= strlen(n);
name[i] =
}
}
//konstruktor
Payment(const Payment& p) : Payment(p.name, p.cost, p.day, p.month, p.year)
//konstruktor
Payment(Payment&&
{
{
name = p.name;
//operator
Payment& operator=(const Payment&
{
{
if (this == &p) // ten if na początek każdego operatora = (& i &&) kopiującego i
return
cost = p.
day = p.day;
name = new char[strlen(p.name) + 1];
//operator
bool operator<(const Payment& p)
{
{
if (year == p.year)
return month < p.month;
return year < p.year;
//gettery
//gettery
char* getName() const { return name;
double getCost() const { return cost;
int getDay() const { return day;
int getMonth() const { return month;
int getYear() const { return year;
//settery
//settery
void setName(const char* n):name(n)
void setCost(const double c): cost(c)
//itd...
//itd...
//zaprzyjażniony operator
friend std::ostream& operator << (std::ostream& s, const Payment&
{
{
s << p.name << " " << p.cost << " " << p.day << "." << p.month << "." << p.year;
}
};
}
};
struct element
{
element*
Payment
//konstruktor
element(const Payment& other) : next(nullptr), prev(nullptr), p(other) {}
class List
{
protected:
element* tail;
public:
List() : head(nullptr), tail(nullptr)
//destruktor
~List()
{
//destruktor
~List()
{
while
{
{
auto bufor =
head =
delete
}
}
tail =
}
}
//jak operator ma być przeciążony w klasie pochodnej to stosujemy "virtual" w klasie nadrzednej, a w klasie pochodnej "override", bo
//przeciążony operator
virtual void operator+=(const Payment& p) //typy klasowe moga byc bardzo duze i chcemy uniknac ich kopiowania dlatego
{
{
auto newElement = new
if
{
{
auto bufor =
tail =
bufor->next =
tail->prev =
}
else
{
}
else
{
tail = head =
}
}
}
}
//jeśli mamy opertator += napisać to robimy to przed konstruktorem, bo go
//konstruktor
List(const List&
{
{
auto ptr = other.head;
{
{
*this +=
ptr =
}
}
}
}
//zaprzyjaźniony operator strumieniowy
friend std::ostream& operator <<(std::ostream& s, const List&
{
{
auto ptr = l.head;
{
{
s << ptr->p <<
ptr =
}
}
return
}
class Queue: public List
{
public:
//nadpisany operator
void operator+=(const Payment& p)
{
{
auto newElement = new
auto ptr =
while (ptr && p <
{
{
ptr =
}
}
if
{
{
auto bufor =
ptr->prev =
if (ptr == head) head = newElement; //czy to jest
if (bufor) bufor->next =
newElement->prev =
newElement->next =
}
else
{
}
else
{
auto bufor =
tail =
if
{
{
bufor->next =
tail->prev =
return;
}
else
{
return;
}
else
{
head =
}
}
}
}
}
}
//usuwanie listy
{
{
while
{
{
auto bufor =
head =
delete
}
}
tail =
}
}
//operator = przypisania
{
if (this == &q)
return *this;
deleteList();
auto ptr = q.head;
while (ptr)
{
*this += ptr->p;
ptr = ptr->next;
}
return *this;
}
//operatory konwersji zapisuje się: operator TypDoKtoregoKonwertujesz() { funkcja }
operator double()
{
auto ptr = head;
auto sum = 0.0;
while (ptr)
{
sum += (ptr->p).getCost();
ptr = ptr->next;
}
return sum;
}
Payment pop()
{
auto toReturn = head->p;
auto bufor = head;
head = head->next;
if (tail == bufor)
tail = nullptr;
delete bufor;
return toReturn;
}
};
int main()
{
Queue list;
list += Payment("Adam", 50, 4, 12, 1997);
list += Payment("Piotr", 30, 5, 12, 1997);
list += Payment("Tomasz", 80, 4, 8, 1997);
list += Payment("Domek", 25, 14, 1, 1998);
list += Payment("Lipa", 60, 17, 2, 1995);
list += Payment("Lol", 56, 19, 7, 2000);
std::cout << list;
Queue l;
l = list;
std::cout << std::endl << l;
std::cout << std::endl << (double)l;
std::cout << std::endl << l.pop();
std::cout << std::endl <
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
using namespace std;
///////////////////////////////////////////////////////////////////////////////
class task
{
string todo = "empty task";
int date = 0;
public:
task(string, int);
task() = default;
task(const task &) = default;
task & operator=(const task &) = default;
void complete(void);
int operator>(const task &); // porownoje daty
int operator==(const task &); // porownuje cale zadania
friend ostream & operator<<(ostream &, const task &);
friend istream & operator>>(istream &, task &);
};
task::task(string todo, int date) : todo(todo), date(date) {}
void task::complete(void)
{
cout << "\ntask " << todo << " scheduled for " << date << " done successfully!";
}
int task::operator>(const task &rt)
{
return date>rt.date;
}
int task::operator==(const task &rt)
{
return ((todo == rt.todo) && (date == rt.date));
}
ostream & operator<<(ostream &os, const task &rt)
{
os << rt.todo;
os << " ";
os << rt.date;
return os;
};
istream & operator>>(istream &is, task &rt)
{
return is >> rt.todo >> rt.date;
};
struct q_elem
{
task t;
q_elem * next;
q_elem(const task &ctr) :t(ctr), next(nullptr) {};
};
///////////////////////////////////////////////////////////////////////////////
class queue
{
protected:
q_elem *head, /* nullptr dla pustej kolejki */
*tail; /* istotny jesli head != nullptr */
public:
queue() :head(nullptr) {}
virtual queue & operator+=(const task &rq) // virtual!!!
q_elem *qep = new q_elem(rq);
if
tail->next = qep;
else
head = qep;
tail = qep;
return *this;
}
queue(const queue &rq) :head(nullptr)
{
q_elem *qep = rq.head;
while (qep)
{
(*this) += qep->t;
qep = qep->next;
}
}
queue(queue &&rrq) : head(rrq.head), tail(rrq.tail)
{
rrq.head = rrq.tail = nullptr;
}
~queue()
{
while (head)
{
const q_elem * qep = head;
head = head->next;
delete qep;
}
}
void empty() // pozostawia obiekt pusty (head==nullptr)
{
while (head)
{
const q_elem * qep = head;
head = head->next;
delete qep;
}
}
queue & operator=(const queue &rq)
{
if (&rq ==
return *this;
auto ptr
q_elem *qep =
while
{
ptr
qep =
}
}
return *this;
//operatory konwersji zapisuje się: operator TypDoKtoregoKonwertujesz() { funkcja }
operator double()
queue & operator=(queue &&rq)
{
swap(tail, rq.tail);
return *this;
}
int contains(const task & ctr)
{
q_elem *qep = head;
if (qep->t == ctr)
return 1;
else
qep = qep->next;
return 0;
}
friend istream & operator>>(istream &is, queue &rq)
{
task t; // wymaga konstruktora bezargumentowego task()
rq.empty();
while (is >> t)
rq += t;
return is;
}
friend ostream & operator<<(ostream &os, const queue &rq)
{
q_elem *qep = rq.head;
while (qep)
{
ptr
qep =
}
return os;
}
};
///////////////////////////////////////////////////////////////////////////////
class sorted_q :public queue
{
public:
sorted_q & operator+=(const task &rq) // inny typ zwracany - ok tutaj
{
q_elem * const newel = new q_elem(rq);
if ((!head) || (head->t > rq)) // wstaw na pocz�tek
{
newel->next = head;
head = newel;
}
else
{
q_elem * pq = head;
while (pq->next && !(pq->next->t>rq))
pq = pq->next;
newel->next = pq->next;
pq->next = newel;
}
if (!newel->next)
tail = newel;
return
}
{
auto bufor
{
if
tail
qep->t.complete();
qep =
delete bufor;
return toReturn;
}
}
}
using queue::operator=;
// kolejno�� wywo�ywania konstruktor�w powoduje ze poni�sza deklaracja nie jest potrzebna
//
// using queue::queue;
// automatyczne konwersje o kl. bazowej i metody wirtualne powoduj� �e poni�sze nie s� niezb�dne
//
// friend istream & operator>>(istream &is, sorted_q &rq)
// friend ostream & operator<<(ostream &os, const sorted_q &rq)
};
int main()
{
list
sorted_q s1;
q1 +=
list
q1 +=
list
q1 +=
list
q1 +=
list
queue q2 = move(q1);
cout << "q1 " << q1 << endl << "q2 " << q2 << endl;
q1 = move(q2);
cout << "q1 " << q1 << endl << "q2 " << q2 << endl;
q2 = q1;
q1 +=
list
cout << endl << q1;
q1 = q2;
cout << endl << q1;
s1 = q1;
cout << endl << s1;
s1 +=
std::cout
s1 += task("task g", 00000);
cout <<
Queue l;
l = list;
std::cout
s1.complete(q1);
cin >> s1;
cout <<
std::cout
std::cout << std::endl << l.pop();
std::cout << std::endl <
return 0;
}
cout.flush();
}