consolidate all repos to one for archive

This commit is contained in:
2025-01-28 13:46:42 +01:00
commit a6610fbc7a
5350 changed files with 2705721 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
#include "Date.h"
std::ostream &operator<<(std::ostream &out, const Date &date) {
return out << date.toString();
}
Date::Date(unsigned int day, unsigned int month, unsigned int year) : day(day), month(month), year(year) {}
std::string Date::toString() const {
return std::to_string(day) + ", " + std::to_string(month) + ", " + std::to_string(year);
}
bool Date::operator==(const Date &other) const {
return this->year == other.year && this->month == other.month && this->day == other.day;
}
Date& Date::operator++() {
day++;
if (months[month - 1] < day) {
month++;
day = 1;
}
if (month == 13) {
year++;
month = 1;
}
return *this;
}
Date Date::operator++(int dummy) {
Date tmp(day, month, year);
day++;
if (months[month - 1] < day) {
month++;
day = 1;
}
if (month == 13) {
year++;
month = 1;
}
return tmp;
}
Date Date::operator+(int days) {
Date tmp(day,month,year);
tmp.day += days;
// while (months[tmp.month - 1] < tmp.day){
// tmp.day = tmp.day - months[tmp.month-1];
// tmp.month++;
// if (tmp.month == 13) {
// tmp.year++;
// tmp.month = 1;
// }
// }
for(int i = 0; i<days ; i++){
tmp++;
}
return tmp;
}

View File

@@ -0,0 +1,30 @@
#ifndef NALOGA0201_DATE_H
#define NALOGA0201_DATE_H
#include <string>
class Date {
friend std::ostream &operator<<(std::ostream &out, const Date &date);
private:
unsigned int day, month, year;
int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
public:
Date() = default;
Date(unsigned int day, unsigned int month, unsigned int year);
~Date() = default;
std::string toString() const;
bool operator==(const Date &other) const;
Date& operator++();//prefix ++a
Date operator++(int dummy);//postfix a++
Date operator+(int day);
};
#endif //NALOGA0201_DATE_H

View File

@@ -0,0 +1,38 @@
Do sedaj smo vedno uporabljali tako imenovane raw kazalce, za katere smo morali poskrbeti sami. Od standarda C++11 naprej obstajajo smart pointers (pametni kazalci). Prednost pametnih kazalcev je na primer ta, da se destruktor kliče samodejno in tako ne rabimo sami skrbeti za brisanje objektov. Torej, da ne rabimo sami skrbeti za upravljanje pomnilnika, nam pri tem pomagajo pametni kazalci.
V sklopu te naloge boste s pomočjo znanja šablon razredov in prekrivanja operatorjev implementirali svoj pametni kazalec. Glavna naloga razreda bo, da bo vseboval kazalec na poljuben objekt in le-tega izbrisal, ko se bo klical destruktor.
Naloga ima naslednje zahteve:
Ustvarite šablono razreda SmartPointer, ki naj vsebuje kazalec na poljuben objekt in ta isti objekt izbriše takrat, ko se bo klical destruktor tega razreda. Implementirajte nastavitveni konstruktor in destruktor.
Da se bo pametni kazalec lahko obnašal enako, kot se obnaša raw kazalec, morate prekriti operatorja * in ->.
Pri prekrivanju operatorja * morate dereferencirati kazalec na objekt in ga vrniti.
Pri prekrivanju operatorja -> pa morate samo vrniti kazalec na objekt.
Spodnji izsek kode je primer implementacije pametnega kazalca za razred Date, vključno s prekritim operatorjem *. Vaša naloga je, da ga spremenite v šablono razreda in implementirate ostale zahteve (prekrijte preostali operator, konstruktor in destruktor).
Primer glavnega programa (uporaba vašega pametnega kazalca) poglejte v neobvezni nalogi 9.2.
#include "Date.h"
class SmartPointer {
private:
Date* pData;
public:
// ...
Date& operator*() {
return *pData;
}
// ...
};
Vzemite razred Date iz prejšnjih nalog in ga dopolnite z naslednjimi zahtevami.
V razredu Date zapišite prijateljsko funkcijo za prekrivanje operatorja << (friend std::ostream& operator<<(std::ostream &out, const Date &date)).
Prekrijte še operator ==, ki primerja dva objekta razreda Date in vrnemo true oz. falsa glede na to, če sta datuma ista oz. različna (bool operator==(const Date& other)).
V razredu Date prekrijte še prefiksni in postfiksni operator ++, ki poveča dan za 1. Pri tem pazite, da ne prekoračite števila mesecev (int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};). Prototipa obeh prekritih operatorjev v razredu Date:
Date& operator++();
Date operator++(int dummy);
Demonstrirajte uporabo prijateljske funkcije in vseh prekritih operatorjev v glavnem programu! Pokažite vsaj en primer uporabe svojega pametnega kazalca in en primer uporabe kazalca shared_ptr iz standarda C++11. (https://en.cppreference.com/w/cpp/memory/shared_ptr)

View File

@@ -0,0 +1,27 @@
#ifndef NALOGA0901_SMARTPOINTER_H
#define NALOGA0901_SMARTPOINTER_H
template<typename T>
class SmartPointer {
private:
T *pointer;
public:
SmartPointer() = default;
SmartPointer(T *pDate) : pointer(pDate) {}
~SmartPointer() {
delete pointer;
}
T &operator*() {
return *pointer;
}
T *operator->() {
return pointer;
}
};
#endif //NALOGA0901_SMARTPOINTER_H

View File

@@ -0,0 +1,49 @@
#include <iostream>
#include <memory>
#include "SmartPointer.h"
#include "Date.h"
int main() {
std::cout << "Hello, World!\n\n";
Date a(27, 2, 3);
Date b(30, 12, 3);
Date g(1,1,1);
if (a == b)
std::cout << "isto\n";
else
std::cout << "razlicno\n";
std::cout << "----mesec-----------------------------------------------------\n";
std::cout << "a: " << a << "\n";
std::cout << "a: " << a++ << "\n";
std::cout << "a: " << a << "\n";
std::cout << "a: " << ++a << "\n";
std::cout << "a: " << a << "\n";
std::cout << "----leto-----------------------------------------------------\n";
std::cout << "b: " << b << "\n";
std::cout << "b: " << ++b << "\n";
std::cout << "b: " << ++b << "\n";
std::cout << "b: " << b << "\n\n";
g = b + 500;
std::cout << "b: " << b << "\n";
std::cout << "g: " << g << "\n";
std::cout << "----smart pointer-----------------------------------------------------\n";
SmartPointer<Date> c = new Date(1, 2, 3);
std::cout << *c << "\n";
std::cout << ++*c << "\n";
std::cout << (*c)++ << "\n";
std::cout << c->toString() << "\n\n";
std::cout << "----sharedt pointer-----------------------------------------------------\n";
std::shared_ptr<Date> e = std::make_shared<Date>(4,5,6);
std::shared_ptr<Date> f = e;
std::cout << *e << "\n";
(*e)++;
std::cout << *f;
return 0;
}