Commit 0ad9a078 authored by Robert Husák's avatar Robert Husák
Browse files

První verze webu pro ZS 2020/2021

parents
#include <memory>
#include <vector>
#include <iostream>
using namespace std;
template<typename T> class Pole {
public:
class iterator;
Pole(size_t chunk = 100) : chunk_(chunk), size_(0) {}
void push_back(const T& x) { resize(++size_); (*this)[size_ - 1] = x; }
T& operator[] (size_t i) { return hrabe_[i / chunk_][i%chunk_]; }
T& at(size_t i) { check(i); return (*this)[i]; }
iterator begin() { return iterator(*this, 0); }
iterator end() { return iterator(*this, size_); }
private:
void check(size_t i) { if (i >= size_) throw out_of_range("Out of range"); }
void resize(size_t i) {
for (size_t k = hrabe_.size(); k <= i / chunk_; ++k)
hrabe_.push_back(make_unique< T[]>(chunk_));
}
size_t chunk_;
size_t size_;
vector< unique_ptr<T[]>> hrabe_;
};
template <typename T>
class Pole<T>::iterator {
public:
iterator(Pole<T>& pole, size_t i) : pole_(pole), i_(i) {}
T& operator*() { return pole_[i_]; }
bool operator!=(const iterator& other) { return i_ != other.i_; }
iterator& operator++() { i_++; return *this; }
iterator& operator++(int) { iterator it(*this); (*this)++; return it; }
private:
size_t i_;
Pole<T>& pole_;
};
int main() {
Pole<int> p;
p.push_back(42);
p.push_back(43);
p.push_back(44);
cout << p[0] << ' ' << p.at(1) << ' ' << p.at(2) << endl;
for (Pole<int>::iterator it = p.begin(); it != p.end(); ++it) {
cout << *it << ' ';
}
cout << endl;
for (auto n : p) {
cout << n << ' ';
}
return 0;
}
#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <sstream>
using namespace std;
class IntVal;
class StringVal;
class AbstractVal {
public:
virtual ~AbstractVal() {}
virtual void print() = 0;
virtual void copyFrom(AbstractVal& other) = 0;
virtual void copyTo(IntVal& other) = 0;
virtual void copyTo(StringVal& other) = 0;
};
typedef unique_ptr<AbstractVal> valptr;
class IntVal : public AbstractVal {
public:
int x_;
IntVal(int x) : x_(x) {}
void print() override { cout << x_; }
void copyFrom(AbstractVal& other) override { other.copyTo(*this); }
void copyTo(IntVal& other) override;
void copyTo(StringVal& other) override;
};
class StringVal : public AbstractVal {
public:
string x_;
StringVal(string x) : x_(x) {}
void print() override { cout << x_; }
void copyFrom(AbstractVal& other) override { other.copyTo(*this); }
void copyTo(IntVal& other) override;
void copyTo(StringVal& other) override;
};
// Definici metody IntVal::copyTo(StringVal&) bylo potreba presunout az za definici tridy StringVal, aby
// kompilator uz vedel o datove polozce StringVal::x_ (definice ostatnich metod se pro prehlednost presunuly taky)
void IntVal::copyTo(IntVal& other) { other.x_ = this->x_; }
void IntVal::copyTo(StringVal& other) { other.x_ = to_string(this->x_); }
void StringVal::copyTo(IntVal& other) { stringstream ss(this->x_); ss >> other.x_; }
void StringVal::copyTo(StringVal& other) { other.x_ = this->x_; }
int main() {
valptr a(make_unique<IntVal>(123));
valptr b(make_unique<StringVal>("456"));
valptr c(make_unique<IntVal>(789));
a->copyFrom(*b);
a->print();
cout << endl;
b->copyFrom(*c);
b->print();
return 0;
}
\ No newline at end of file
#include <iostream>
#include <vector>
#include <memory>
#include <string>
using namespace std;
class AbstractVal {
public:
virtual ~AbstractVal() {}
virtual void print() = 0;
};
typedef unique_ptr<AbstractVal> valptr;
class IntVal : public AbstractVal {
public:
IntVal(int x) : x_(x) {}
void print() override { cout << x_; }
private:
int x_;
};
class StringVal : public AbstractVal {
public:
StringVal(string x) : x_(x) {}
void print() override { cout << x_; }
private:
string x_;
};
class Seznam {
public:
void add(valptr p) { pole.push_back(move(p)); }
void print() { for (auto&& x : pole) x->print(); }
private:
vector<valptr> pole;
};
int main() {
Seznam s;
s.add(make_unique<IntVal>(123));
s.add(make_unique<StringVal>("456"));
s.print();
}
\ No newline at end of file
#include <iostream>
#include <vector>
#include <memory>
#include <string>
using namespace std;
class AbstractVal;
typedef unique_ptr<AbstractVal> valptr;
class AbstractVal {
public:
virtual ~AbstractVal() {}
virtual void print() = 0;
virtual valptr clone() = 0;
};
class IntVal : public AbstractVal {
public:
IntVal(int x) : x_(x) {}
void print() override { cout << x_; }
valptr clone() override { return make_unique<IntVal>(*this); }
private:
int x_;
};
class StringVal : public AbstractVal {
public:
StringVal(string x) : x_(x) {}
void print() override { cout << x_; }
valptr clone() override { return make_unique<StringVal>(*this); }
private:
string x_;
};
class Seznam {
public:
Seznam() {}
Seznam(const Seznam& s) { clone(s); }
Seznam& operator=(const Seznam& s) {
if (this != &s) {
pole.clear();
clone(s);
}
return *this;
}
void add(valptr p) { pole.push_back(move(p)); }
void print() {
for (auto&& x : pole) {
x->print();
}
}
private:
vector<valptr> pole;
void clone(const Seznam& s) {
for (auto&& x : s.pole) {
pole.push_back(x->clone());
}
}
};
int main() {
Seznam s1, s2;
s1.add(make_unique<IntVal>(123));
s1.add(make_unique<StringVal>("456"));
s2 = s1;
s2.print();
s2 = s2;
s2.print();
}
\ No newline at end of file
#include <iostream>
#include <vector>
#include <memory>
#include <string>
using namespace std;
class AbstractVal;
typedef unique_ptr<AbstractVal> valptr;
class AbstractVal {
public:
virtual ~AbstractVal() {}
virtual void print() = 0;
virtual valptr clone() = 0;
};
template <typename T>
class Val : public AbstractVal {
public:
Val(T x) : x_(x) {}
void print() override { cout << x_; }
valptr clone() override { return make_unique<Val<T>>(*this); }
private:
T x_;
};
class Seznam {
public:
Seznam() {}
Seznam(const Seznam& s) { clone(s); }
Seznam& operator=(const Seznam& s) {
if (this != &s) {
pole.clear();
clone(s);
}
return *this;
}
template <typename T>
void add(T val) {
pole.push_back(make_unique<Val<T>>(val));
}
void print() {
for (auto&& x : pole) {
x->print();
}
}
private:
vector<valptr> pole;
void clone(const Seznam& s) {
for (auto&& x : s.pole) {
pole.push_back(x->clone());
}
}
};
int main() {
Seznam s1, s2;
s1.add<int>(123);
s1.add<string>("456");
s2 = s1;
s2.print();
s2 = s2;
s2.print();
}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head><!-- ščřžýŠČŘŽÝ -->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="Robert Husák" />
<meta name="robots" content="index,follow" />
<title>Stránky Roberta Husáka</title>
</head>
<body>
<h3>1. úkol: Fulltextové vyhledávání - deadline 20.11.2017 23:59</h3>
<p><strong>Základní idea</strong>: Ze souboru načteme databázi článků a z druhého souboru či standardního vstupu seznam dotazů.
Pro každý dotaz zobrazíme na standardním výstupu seznam článků, ve kterých se nacházejí <strong>všechna slova</strong> z dotazu,
včetně úryvku článku obsahující první hledané slovo.</p>
<h4>Vstup</h4>
<ul>
<li>Program očekává 1-2 argumenty: <code>fulltext soubor_clanky [soubor_dotazy]</code></li>
<li>Textový soubor <code>soubor_clanky</code> obsahuje seznam článků, které se mají na začátku programu načíst.
Data každého článku jsou zapsána na 3 po sobě jdoucích řádcích. Osamocený prázdný řádek značí, že seznam článků je u konce.
Ukázku souboru si můžete stáhnout <a href="du1/vstup1_db.txt">zde</a>. V programu můžete předpokládat, že pokud tento vstupní
soubor existuje a je možné z něj číst, je ve správném formátu (tedy např., že soubor obsahuje 3k + 1 odřádkování). Nemusíte se
tedy starat o EOF, konec souboru lze poznat z prázdného řádku. Jednotlivé 3 řádky každého článku obsahují následující údaje:
<ol>
<li><strong>Identifikátor článku</strong>: Posloupnost velkých písmen a čísel o celkové délce maximálně 10. Každý článek má unikátní identifikátor
a články jsou dle tohoto identifikátoru vzestupně seřazeny.</li>
<li><strong>Název článku</strong>: Text dlouhý maximálně 60 znaků, obsahovat může pouze znaky z dolní ASCII znakové sady (0-127) kromě CR a LF.</li>
<li><strong>Text článku</strong>: Text neomezené délky, obsahovat může pouze znaky z dolní ASCII znakové sady (0-127) kromě CR a LF.</li>
</ol>
</li>
<li>Pokud je zadaný argument <code>soubor_dotazy</code>, dotazy se načítají z daného souboru, v opačném případě ze standardního vstupu (konzole).
Každý dotaz je na samostatném řádku, prázdný řádek opět značí ukončení vstupu. Nemusíte tedy ošetřovat EOF. Každý dotaz může opět obsahovat pouze
znaky z dolní ASCII znakové sady (0-127) kromě CR a LF. Ukázku vstupu si můžete stáhnout <a href="du1/vstup1_dotazy.txt">zde</a>.</li>
</ul>
<h4>Zpracování</h4>
<ul>
<li>Definice: <strong>Slovo</strong> je nejdelší (tj. zleva a zprava ohraničená znaky, co toto nesplňují) posloupnost malých a velkých písmen.
Např. v textu <code>Lorem Ipsum dolor42sit amet, consecteurer! Alibiscit elit</code> se nacházejí slova <code>Lorem</code>, <code>Ipsum</code>,
<code>dolor</code>, <code>sit</code>, <code>amet</code>, <code>consecteurer</code>, <code>Alibiscit</code> a <code>elit</code>.
Vzhledem k omezení znakové sady se v žádném slově nemohou vyskytovat písmena s diakritikou.</li>
<li>Všechny články je potřeba načíst a uložit do nějaké datové struktury (kontejneru).</li>
<li>Kromě databáze článků je nutné vytvořit i <strong>invertovaný index</strong>, tedy mapování mezi slovy a dokumenty, ve kterých se vyskytují.
Pro každé slovo (které je alespoň v textu jednoho článku) se zde bude nacházet seznam článků, ve kterých se vyskytuje, vzestupně seřazený
dle identifikátoru článku. Kromě odkazu na článek (ten můžete vyjádřit různě: identifikátorem, pozicí v seznamu, referencí,... v žádném případě
sem však celý článek <strong>nekopírujte</strong>) <em>by měla každá položka obsahovat i pozici prvního výskytu tohoto slova v tomto článku</em>.
Naším cílem je umožnit vyhledávání nezávislé na velikosti písmen, každé slovo by tedy <em>mělo být před uložením do indexu přeměněno do "kanonické" podoby
(t.j. např. všechna písmena malá)</em>.</li>
<li>Každý dotaz se vyhodnocuje následujícím způsobem:
<ol>
<li>Vyčtou se z něj všechna slova. Pokud dotaz neobsahuje žádné slovo (např. <code>1,2,3,...42!</code>), vracíme prázdný výsledek.</li>
<li>Z invertovaného indexu načteme seznamy odkazů na články obsahující slova z dotazu. Pokud se nějaké slovo z dotazu v indexu nenachází, znamená to,
že se nenachází v žádném článku, vracíme tedy prázdný výsledek.</li>
<li>Získali jsme množinu seřazených seznamů a chceme zjistit jejich průnik. Za efektivní řešení se považuje takové, které má časovou složitost O(n),
kde n je součet délek nalezených seznamů. Nabízí se synchronizované procházení všech seznamů najednou - ve chvíli, kdy ve všech seznamech dojdeme ke
stejné hodnotě, předáme příslušný článek na výstup a posuneme se dál. Méně efektivní řešení jsou také přípustná, ale nebude za ně plný počet bodů,
viz část Hodnocení.</li>
</ol>
</li>
</ul>
<h4>Výstup</h4>
<ul>
<li>Ukázku výstupu najdete <a href="du1/vystup1.txt">zde</a>. Vypisujeme výsledky všech dotazů, za seznamem výsledků každého dotazu následuje volná řádka.
Pokud dotaz vrátil prázdný výsledek, vypíšeme řádek <code>No results</code>. V opačném případě vypisujeme každý výsledek následovně:
<ol>
<li>řádek výsledku má podobu <code>[identifikator] nazev</code>.</li>
<li>řádek výsledku <em>by měl obsahovat úryvek textu, který začíná místem 1. výskytu 1. slova zadaného v dotazu, má délku <strong>75 znaků</strong>
(méně, pokud by to přesáhlo konec článku) a je zakončen</em> <code>...</code></li>
</ol>
</li>
</ul>
<h4>Hodnocení</h4>
<ul>
<li>Na odevzdání máte jen jeden pokus, není tedy možné úkol vylepšovat na základě připomínek.</li>
<li>Části zadání výše, které nejsou psané kurzívou, je nutné naprogramovat, abyste z úkolu nějaké body dostali. Tato základní funkčnost bude testována těmito
daty:
<ul>
<li><a href="du1/vstup1_db.txt">Články</a></li>
<li><a href="du1/vstup1_dotazy.txt">Dotazy</a></li>
<li>Očekávaný výstup: <a href="du1/vystup1_cs.txt">rozlišující malá a velká písmena</a> / <a href="du1/vystup1.txt">nerozlišující malá a velká písmena</a></li>
</ul>
</li>
<li>Bodování je následně rozdělené na několik kategorií:
<ul>
<li><strong>Funkcionalita</strong>: za základní verzi, kde se při vyhledávání rozlišuje velikost písmen a nejsou vypisovány úryvky textu, jsou <strong>4 body</strong>.
Za nerozlišování velikosti písmen je další <strong>1 bod</strong> a za výpis úryvků textu další <strong>2 body</strong>.</li>
<li><strong>Stabilita</strong>: Maximálně <strong>3 body</strong>. Program musí ošetřit špatný počet argumentů, neexistující soubory a nesmí spadnout na obskurních dotazech
(jako např. zmíněný <code>1,2,3,...42!</code>). Naopak formáty obou dvou vstupů ověřovat nemusí, může předpokládat, že řádkování je u nich správně.</li>
<li><strong>Efektivita</strong>: Zatím neznáme v C++ příliš mnoho prostředků k zajištění efektivity (zabránění zbytečnému kopírování apod.),
omezíme se tedy pouze na hodnocení jedné konkrétní věci - zjišťování průniku několika seznamů odkazů na články během vyhodnocování dotazů. Za algoritmus, který pracuje
v lineárním čase vůči součtu jejich délek, dostanete <strong>2 body</strong>, za méně efektivní algoritmus 1 nebo žádný bod.</li>
<li><strong>Štábní kultura</strong>: Maximálně <strong>3 body</strong>. Není potřeba tolik řešit zapouzdření tříd (může se hodit mít pomocné třídy s <code>public</code>
datovými položkami), ale kód by měl být přehledný a funkcionalita alespoň rámcově rozdělená. Vlastní vyhledávací "engine", tedy databáze a dotazování nad ní, by měl být umístěn
v samostatné třídě/třídách s vhodně navrženým rozhraním. Příliš dlouhé metody a funkce je lepší rozdělit na samostatné celky. Dále je lepší nekopírovat stejnou logiku na více míst,
ale zabalit ji do funkce/třídy a tu z těchto míst používat (pokud to tam dává smysl).</li>
</ul>
</li>
<li>Za každý započatý týden zpoždění je penále <strong>-5 bodů</strong>.</li>
<li>Při odevzdání úkolu <strong>vždy popište</strong>, zda jste naimplementovali verzi s rozlišováním velikosti písmen nebo bez. Dále stručně popište, jak je logika rozdělená mezi
jednotlivé kusy kódu. Pokud jste udělali nějaké zajímavé optimalizace (efektivity, přehlednosti apod.), napište to také. Pokud uznám, že jsou dostatečně významné a užitečné, mohu vám
za ně odpustit některé jiné prohřešky.</li>
</ul>
<h4>Poznámky</h4>
<ul>
<li>Pokud budete vyvíjet na Linuxu, upravte si konce řádků přiložených testovacích souborů na znak LF (ve Windows je standardně CR LF). Pokud to neuděláte, můžete mít problém se správným
načítáním řádek. O naprogramování v Linuxu mi napište i do komentáře, udejte i konkrétní distribuci, pod kterou jste to kompilovali, kompilátor (většinou GCC) a jeho verzi.</li>
</ul>
</body>
</html>
\ No newline at end of file
ABCD017
2017 'very likely' in top three warmest years on record
Globally, temperatures in 2017 look set to be the third highest on record The year 2017 is "very likely" to be in the top three warmest years on record, according to provisional figures from the World Meteorological Organization. The WMO says it will likely be the hottest year in the absence of the El Nino phenomenon. The scientists argue that the long-term trend of warming driven by human activities continues unabated. They say many of the "extraordinary" weather events seen this year bear the hallmarks of climate change. On the opening day of this year's key UN climate talks, researchers from the WMO have presented their annual State of the Global Climate report. It follows hot on the heels of their greenhouse gases study from last week which found that concentrations of CO2 in the atmosphere were the highest on record. Record surge in atmospheric CO2 in 2016 UN: Emissions gap is 'alarmingly high' What is climate change? While the new study only covers January to September, the WMO says the average global temperature was 1.1C above the pre-industrial figure. This is getting dangerously close to the 1.5 degrees threshold that many island states feel temperatures must be kept under to ensure their survival. The analysis suggests that 2017 is likely to come in 0.47C warmer than the 1981-2010 average. This is slightly down on 2016 when the El Nino weather phenomenon saw temperatures that were 0.56C above the average. According to the WMO, this year vies with 2015 to be the second or third warmest mark yet recorded.
MGB01
Mugabe sacks 'disloyal' Vice-President Mnangagwa
Mr Mnangagwa, 75, displayed "traits of disloyalty", Information Minister Simon Khaya Moyo said. His removal makes it more likely that President Robert Mugabe's wife Grace will follow in her husband's footsteps as leader of Zimbabwe. She had earlier called on her husband to remove his vice-president. "Mr Mnangagwa's conduct in discharge of his duties is inconsistent with the responsibilities," Information Minister Simon Moyo said. "The vice-president has exhibited traits of disloyalty", he added. Mr Mnangagwa, a former intelligence chief, had been a leading candidate to succeed President Mugabe. His sacking means Grace Mugabe is expected to be appointed Vice-President at a special congress of the ruling Zanu-PF party next month.
PLP04
Plastic problem being discussed
There's 8 million tonnes of plastic in the world's oceans so now experts are talking about what to do.
Mugabe
on
on weather
on123weather
weather on
to
to Mugabe
the
The
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
Mugabe's wife Grace will follow in her husband's footsteps as leader of Zim...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
on her husband to remove his vice-president. "Mr Mnangagwa's conduct in dis...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[ABCD017] 2017 'very likely' in top three warmest years on record
weather events seen this year bear the hallmarks of climate change. On the ...
[ABCD017] 2017 'very likely' in top three warmest years on record
to be the third highest on record The year 2017 is "very likely" to be in t...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
to remove his vice-president. "Mr Mnangagwa's conduct in discharge of his d...
[PLP04] Plastic problem being discussed
to do....
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
to remove his vice-president. "Mr Mnangagwa's conduct in discharge of his d...
[ABCD017] 2017 'very likely' in top three warmest years on record
the third highest on record The year 2017 is "very likely" to be in the top...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
the responsibilities," Information Minister Simon Moyo said. "The vice-pres...
[PLP04] Plastic problem being discussed
the world's oceans so now experts are talking about what to do....
[ABCD017] 2017 'very likely' in top three warmest years on record
the third highest on record The year 2017 is "very likely" to be in the top...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
the responsibilities," Information Minister Simon Moyo said. "The vice-pres...
[PLP04] Plastic problem being discussed
the world's oceans so now experts are talking about what to do....
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
Mugabe's wife Grace will follow in her husband's footsteps as leader of Zim...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
on her husband to remove his vice-president. "Mr Mnangagwa's conduct in dis...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[ABCD017] 2017 'very likely' in top three warmest years on record
on record The year 2017 is "very likely" to be in the top three warmest yea...
[ABCD017] 2017 'very likely' in top three warmest years on record
weather events seen this year bear the hallmarks of climate change. On the ...
[ABCD017] 2017 'very likely' in top three warmest years on record
to be the third highest on record The year 2017 is "very likely" to be in t...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
to remove his vice-president. "Mr Mnangagwa's conduct in discharge of his d...
[PLP04] Plastic problem being discussed
to do....
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
to remove his vice-president. "Mr Mnangagwa's conduct in discharge of his d...
[ABCD017] 2017 'very likely' in top three warmest years on record
the third highest on record The year 2017 is "very likely" to be in the top...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
the responsibilities," Information Minister Simon Moyo said. "The vice-pres...
[PLP04] Plastic problem being discussed
the world's oceans so now experts are talking about what to do....
[ABCD017] 2017 'very likely' in top three warmest years on record
The year 2017 is "very likely" to be in the top three warmest years on reco...
[MGB01] Mugabe sacks 'disloyal' Vice-President Mnangagwa
The vice-president has exhibited traits of disloyalty", he added. Mr Mnanga...
LP04] Plastic problem being discussed
the world's oceans so now experts are talking about what to do....
<!DOCTYPE html>
<html>
<head><!-- ščřžýŠČŘŽÝ -->
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="Robert Husák" />
<meta name="robots" content="index,follow" />
<title>Stránky Roberta Husáka</title>
</head>
<body>
<h1>2. úkol: Knihovna pro práci s maticemi - deadline 31.12.2017 23:59</h1>
<h2>Základní idea</h2>
<p>Představme si, že pracujeme na programu, který provádí výpočty na maticích celých
čísel a na základě pozorování jeho chování jsme zjistili, že:</p>
<ul>
<li>Rozměry matice je vhodné mít dané dynamicky.</li>
<li>Často dochází k jejich kopírování, aniž by se obsah výsledné matice změnil.</li>
<li>Hojně se využívají dva specifické typy matic:
<ul>
<li>Skalární násobky jednotkové matice - všechny její prvky obsahují stejné číslo. Tuto matici budeme dále nazývat <em>filled</em>.</li>
<li>Skalární násobky matice jedniček - všechny její prvky na diagonále obsahují stejné číslo, ostatní jsou 0. Tuto matici budeme dále nazývat <em>diagonal</em>.</li>
</ul>
</li>
<li>Často se využívá transpozice matic.</li>
<li>V prostředí, kde program pracuje, potřebujeme optimalizovat využití paměti.</li>
</ul>
<h2>Rozhraní</h2>
<p>Základním objektem programu je třída <code>mat</code>, je možné s ní pracovat pomocí následujících metod:</p>
<ul>
<li>Statická metoda <code>filled(size_t height, size_t width, int value)</code>: vytvoří novou <em>filled</em> matici.</li>
<li>Statická metoda <code>zero(size_t height, size_t width)</code>: vytvoří novou nulovou matici.</li>
<li>Statická metoda <code>diagonal(size_t size, int value)</code>: vytvoří novou <em>diagonal</em> matici (šířku a výšku má pochopitelně stejnou).</li>
<li>Statická metoda <code>identity(size_t size)</code>: vytvoří novou jednotkovou matici.</li>
<li>Konstruktor <code>mat(size_t height, size_t width)</code>: vytvoří novou obecnou matici zadaných rozměrů. Počáteční hodnoty jejích prvků nejsou zadáním specifikovány.</li>
<li>Copy konstruktor a operátor přiřazení: z hlediska uživatele třídy se tváří jako kopírování hodnotou, interně to však bude složitější - viz níže.</li>
<li>Metody <code>size_t height()</code> a <code>size_t width()</code>: vrací výšku resp. šířku matice.</li>
<li>Metoda <code>int get(size_t row, size_t col)</code>: vrací prvek na daném řádku a sloupci, indexuje se od 0.</li>
<li>Metoda <code>void set(size_t row, size_t col, int value)</code>: nastaví prvek na daném řádku a sloupci, indexuje se od 0.</li>
<li>Metoda <code>mat transposition()</code>: vytvoří novou matici, která je transpozicí té aktuální.</li>
<li>Operátory:
<ul>
<li><code>==</code> a <code>!=</code>: vrací <code>true</code>, pokud mají matice stejné rozměry a hodnoty, jinak <code>false</code>.</li>
<li><code>+</code>, <code>-</code> a <code>*</code>: vrací novou matici, která je součtem, rozdílem či násobkem daných dvou matic.</li>
<li><code>+=</code>, <code>-=</code> a <code>*=</code>: přiřadí výsledek příslušné operace do matice na levé straně.</li>
</ul>
</li>
</ul>
<h2>Hodnocení</h2>
<p>Celkový počet bodů za úkol je <strong>25</strong>, přičemž až <strong>20</strong> je možné získat za splnění <em>základního zadání</em>.
Dalších <strong>5</strong> bodů lze získat za splnění jednoho z níže uvedených <em>rozšíření</em></p>
<h3>Základní zadání (20 bodů)</h3>
<ul>
<li>Všechny matice jsou ve skutečnosti uložené na haldě, třída <code>mat</code> umožňuje s nimi pouze jednoduše pracovat, jako by se jednalo o hodnotové typy.</li>
<li>Pokud přiřazujeme jednu instanci třídy <code>mat</code> do jiné, ihned matici neklonujeme, ale zkopírujeme pouze odkaz.</li>
<li>Až ve chvíli, kdy zapisujeme data do instance třídy <code>mat</code>, která sdílí ukazatel na matici s někým jiným, musíme danou matici zkopírovat a změny provést v kopii
(tato sémantika se nazývá copy-on-write).</li>
<li>Pro matice na haldě je potřeba použít běhový polymorfismus - ve <em>filled</em> a <em>diagonal</em> maticích tím značně ušetříme paměť
(stačí si pamatovat jen rozměry a jednu hodnotu pro každou takovou matici).</li>
<li>Operace porovnání, sčítání, odčítání a násobení nemusejí být časově zoptimalizované (tj. klidně prvky projděte jeden po druhém).
Transpozice musí být zvlášť ošetřena alespoň pro <em>filled</em> a <em>diagonal</em> matice.</li>
<li>Dbejte na vhodné rozdělení funkcionality, rozšiřitelnost a čitelnost kódu.</li>
<li>Pokud dojde k neplatné operaci, např. sčítání nekompatibilních matic, přístup k neplatnému poli matice apod. (porovnání nekompatibilních matic se nepočítá,
to vrací <code>false</code>), vyhoďte výjimku pomocí <code>throw std::exception("Nejaka hlaska");</code></li>
<li>Zápis do <em>diagonal</em> či <em>filled</em> matice není považován za chybu. Očekávanou sémantikou je převod takové matice na obecnou a provedení změny na ní.</li>
</ul>