#include <iostream>
#include <string>
#include <fstream>
//#include <algorithm>
#include <unordered_set>
#include "osoba.h"
#include "bazadanych.h"
int Osoba::counter=0;
int BazaDanych::counter=0;
int main()
{
Osoba o1;
cout << "---- 1 ----" << endl;
cout << o1 << endl;
Osoba o2("Jan", "Kowalski", 11111111111);
cout << "---- 2 ----" << endl;
cout << o2 << endl;
cout << "---- 3 ----" << endl;
cout << boolalpha << (o1 == o2) << endl;
BazaDanych db1(0);
cout << "---- 4 ----" << endl;
cout << db1;
db1 = db1 + o2;
cout << "---- 5 ----" << endl;
cout << db1;
ifstream plik_we("zadanie7.txt");
if (!plik_we)
{
cout << "---- 6 ----" << endl;
} else {
while (plik_we >> o2)
{
db1 = db1 + o2;
} plik_we.close();
}
cout << "---- 7 ----" << endl;
cout << db1;
{
BazaDanych db2(db1);
cout << "---- 8 ----" << endl;
cout << db2;
}
cout << "---- 9 ----" << endl;
cout << db1;
BazaDanych db3;
db3 = db1 + db1;
cout << "---- 10 ----" << endl;
cout << db3;
std::cout<<"\nbaza bezpowtorek\n"<<std::endl;
// https://stackoverflow.com/questions/38554083/how-can-i-use-a-c-unordered-set-for-a-custom-class
auto hash = [](const Osoba& o){ return std::hash<std::string>()(o.getimie()); };
auto equal = [](const Osoba& o1, const Osoba& o2){ return o1 == o2;};
std::unordered_set<Osoba, decltype(hash),decltype(equal)> unset(100, hash, equal);
unset.insert(db3.beg(),db3.end());
for(const auto & x:unset) cout<<x;
cout<<endl;
/*
for(int i=0; i<db3.liczbaOsob(); ++i)
{
cout << db3[i] << endl;
}
/*
cout << "---- 11 ----" << endl;
db1 = db1 - o1;
cout << "---- 12 ----" << endl;
cout << db1;
cout << "---- 13 ----" << endl;
cout << db3;
cout << "---- 14 ----" << endl;
*/
;
return 0;
}
#ifndef OSOBA_H_
#define OSOBA_H_
#include <iomanip>
using namespace std;
class Osoba {
private: std::string imie_;
std::string nazwisko_;
long long int pesel_;
void mssg(std::string message, int counter) {
std::cout << message << counter << std::endl;
}
public: static int counter;
// konstruktor parametryczny i konstruktor domyslny
Osoba(string imie = "Imie", string nazwisko = "Nazwisko", long long int pesel = 0): imie_(imie),
nazwisko_(nazwisko),
pesel_(pesel) {
//mssg("konst counter=",counter++);
}
~Osoba() {
//mssg("dest counter=",--counter);
}
std::string getimie() const {
return imie_;
}
std::string getnazwisko() const {
return nazwisko_;
}
long long int getpesel() const {
return pesel_;
}
// operator <<
friend ostream & operator << (ostream & os,
const Osoba & o);
// operator >>
friend istream & operator >> (istream & os, Osoba & o);
// operator ==
friend bool operator == (const Osoba & a,
const Osoba & b);
};
ostream & operator << (ostream & os,
const Osoba & o) {
os << o.imie_ << " " << o.nazwisko_ << " " << std::setfill('0') << std::setw(11) << o.pesel_ << endl;
return os;
}
istream & operator >> (istream & is, Osoba & o) {
is >> o.imie_ >> o.nazwisko_ >> o.pesel_;
return is;
}
bool operator == (const Osoba & a,
const Osoba & b) {
return (a.pesel_ == b.pesel_ && a.imie_ == b.imie_ &&
a.nazwisko_ == b.nazwisko_);
}
#endif
#ifndef BAZADANYCH_H_
#define BAZADANYCH_H_
#include <algorithm>
class BazaDanych {
private:
int liczbaOsob_ = 0;
Osoba * osoby_ = nullptr;
void mssg(std::string message, int counter) {
std::cout << message << counter << std::endl;}
public: static int counter;
// konstruktor domyslny
BazaDanych(int liczbaOsob = 0): liczbaOsob_(liczbaOsob) {
if (liczbaOsob > 0) osoby_ = new Osoba[liczbaOsob];
//mssg("BD konst counter=", counter++);
}
// konstruktor kopiujacy
BazaDanych(BazaDanych & b) {
liczbaOsob_ = b.liczbaOsob_;
osoby_ = new Osoba[liczbaOsob_];
std::copy(b.osoby_, b.osoby_ + liczbaOsob_, osoby_);
//mssg("BD konst counter=", counter++);
}
// destruktor
~BazaDanych() {
if (osoby_) {
delete[] osoby_;
osoby_ = nullptr;
}
//mssg("BD dest counter=", counter--);
};
//operator przypisania kupujacego
BazaDanych & operator = (const BazaDanych & bb) {
if (this != & bb) {
delete[] osoby_;
liczbaOsob_ = bb.liczbaOsob_;
osoby_ = new Osoba[liczbaOsob_];
std::copy(bb.osoby_, bb.osoby_ + liczbaOsob_, osoby_);
}
return * this;
}
// operator dodajacy osobe do bazy danych
BazaDanych & operator + (const Osoba & o) {
Osoba * temp = new Osoba[liczbaOsob_ + 1];
std::copy(osoby_, osoby_ + liczbaOsob_, temp);
temp[liczbaOsob_] = o;
delete[] osoby_;
osoby_ = temp;
liczbaOsob_++;
return * this;
}
Osoba * beg ()const {return osoby_;}
Osoba * end ()const {return osoby_+liczbaOsob_;}
friend BazaDanych operator + (const BazaDanych & b1,
const BazaDanych & b2);
friend ostream & operator << (ostream & os,
const BazaDanych & b);
};
ostream & operator << (ostream & os,
const BazaDanych & b) {
for (int i = 0; i < b.liczbaOsob_; ++i) {
os << b.osoby_[i];
}
return os;
}
//operator + dodajacy dwie bazy
BazaDanych operator + (const BazaDanych & b1,
const BazaDanych & b2) {
BazaDanych temp(b1.liczbaOsob_ + b2.liczbaOsob_);
std::copy(b1.osoby_, b1.osoby_ + b1.liczbaOsob_, temp.osoby_);
std::copy(b2.osoby_, b2.osoby_ + b2.liczbaOsob_, temp.osoby_ + b1.liczbaOsob_);
return temp;
}
#endif
Jakub Nowak 71821412314
Anna Kowalska 24030712324
Zygmunt Wiśniewski 48282712334
Dorota Wójcik 01493012344
Dorota Kamińska 01493078944
Patryk Kowalczyk 08712212354
Zuzanna Kamińska 77312712364
Katarzyna Lewandowska 80633112384