Příklad 5
/*
Vytvořte šablonu třídy Matice pro práci s maticí prvků
libovolného typu.
*/
Stdafx.h
#pragma once
#include <limits.h>
#include <iostream>
using namespace std;
stdafx.cpp
// stdafx.cpp : source file that includes just the standard includes
// Program06.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
matice.h
#pragma once
#include "Algoritmy.h"
typedef unsigned long long uint64;
template <class T, class U, U MaxVelikost> class Matice{
private:
T** Pole;
U PocRadku, PocSloupcu;
void Init();
void Alokuj(U PocetRadku,U PocetSloupcu);
public:
Matice(){Init();}
Matice(U pocRadku,U pocSloupcu,T hodnota);
~Matice();
void Vypis() const;
void Nacti();
U MaxNaRadku(U radek)const;
const T& operator()(U radek,U sloupec)const
{return Pole[radek][sloupec];}
T& operator()(U radek,U sloupec){return Pole[radek][sloupec];}
template<class Funkce> void Generuj(U PocRadku,U PocSloupcu,
Funkce Generator,T MaxHodnota);
};
template <class T, class U, U MaxVelikost>
Matice<T, U, MaxVelikost>::Matice(U pocRadku,U pocSloupcu,T hodnota)
{
if (pocRadku > MaxVelikost || pocSloupcu > MaxVelikost
|| pocRadku < 1 || pocSloupcu < 1) {
Init();
}
else {
Alokuj(pocRadku,pocSloupcu);
for (U i=0; i<pocRadku; i++)
{
for (U j=0; j<pocSloupcu; j++)
{
Pole[i][j] = hodnota;
}
}
}
}
template <class T, class U, U MaxVelikost>
void Matice<T, U, MaxVelikost>::Init()
{
Pole=0;
PocRadku=0;
PocSloupcu=0;
}
template <class T, class U, U MaxVelikost>
void Matice<T, U, MaxVelikost>::Vypis() const
{
for (U i=0; i < PocRadku; i++)
{
for (U j=0; j < PocSloupcu; j++)
{
cout<< Pole[i][j]<<'\t';
}
cout<<'\n';
}
}
template <class T, class U, U MaxVelikost>
Matice<T, U, MaxVelikost>::~Matice(){
for(U i=0;i<PocRadku;i++){
delete[]Pole[i];
}
delete[]Pole;
}
template <class T, class U, U MaxVelikost>
void Matice<T, U, MaxVelikost>::Nacti(){
uint64 radky,sloupce;
do{
cout << "Zadej pocet radku matice[2-"
<< static_cast<uint64>(MaxVelikost) <<"]: ";
cin >> radky;
cout << "Zadej pocet sloupcu matice[2-"
<< static_cast<uint64>(MaxVelikost) <<"]: ";
cin >> sloupce;
}while(sloupce>MaxVelikost || sloupce<2 ||
radky>MaxVelikost || radky<2);
this->~Matice();
Alokuj(static_cast<U>(radky),static_cast<U>(sloupce));
for (U i=0;i<PocRadku;i++){
for (U j=0;j<PocSloupcu;j++){
cout << "Zadej prvek[" << i+1 << "," << j+1 <<"]: ";
cin >> Pole[i][j];
}
}
}
template <class T, class U, U MaxVelikost>
void Matice<T, U, MaxVelikost>::Alokuj(U PocetRadku,U PocetSloupcu){
PocRadku=PocetRadku;
PocSloupcu=PocetSloupcu;
Pole = new T*[PocRadku];
for (U i=0; i<PocRadku; i++)
{
Pole[i] = new T[PocSloupcu];
}
}
template <> void Matice<double , int, INT_MAX>::Vypis() const;
template <class T, class U, U MaxVelikost>
U Matice<T, U, MaxVelikost>::MaxNaRadku(U radek)const
{
T* max=MaxPrvek(Pole[radek], Pole[radek]+PocSloupcu);
return static_cast<U>(max-Pole[radek]);
}
template <class T, class U, U MaxVelikost>
template<class Funkce>
void Matice<T, U, MaxVelikost>::Generuj(U PocRadku,U PocSloupcu,
Funkce Generator,T MaxHodnota)
{
this->~Matice();
Alokuj(PocRadku,PocSloupcu);
for (U i=0;i<PocRadku;i++){
for (U j=0;j<PocSloupcu;j++){
Pole[i][j]=Generator(MaxHodnota);
}
}
}
Matice.cpp
#include "stdafx.h"
#include "Matice.h"
template <>void Matice<double , int, INT_MAX>::Vypis() const
{
for (int i = 0; i < PocRadku; i++)
{
for (int j = 0; j < PocSloupcu; j++)
{
printf("%.1lf\t",Pole[i][j]);
}
cout << "\n";
}
}
Algoritmy.h
#pragma once
template <class Iterator> Iterator MaxPrvek(Iterator zacatek,
Iterator konec){
Iterator max=zacatek;
while(zacatek!=konec){
if(*zacatek>*max) max=zacatek;
zacatek++;
}
return max;
}
inline int NahodneCislo(int MaxCislo){
return rand()%(MaxCislo+1);
}
Main…
#include "stdafx.h"
#include "matice.h"
int main()
{
int radek;
int sloupec;
Matice<int,unsigned char, 5> A(3,2,100);
//A.Nacti();
A.Generuj(10,6,NahodneCislo,100);
A.Vypis();
Matice<float,int,5> B(4,5,0.5);
B.Nacti();
B.Vypis();
cout << "Zadej cislo radku pro nalezeni maxima: ";
cin >> radek;
radek--;
sloupec=B.MaxNaRadku(radek);
cout << "Maximum se nachazi ve sloupci: " << sloupec+1 << '\n';
cout << "Hodnota maxima: " << B(radek,sloupec)<< "\n";
Matice<double, int, INT_MAX> C(3,2,1.23);
C.Vypis();
system("pause");
return 0;
}