Advertisement
Guest User

pz7

a guest
Dec 18th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.80 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <stdexcept>
  4.  
  5. using namespace std;
  6. //Bazna
  7. template<typename TK, typename TV>
  8. class Mapa{
  9. public:
  10. Mapa(){};
  11. virtual ~Mapa(){};
  12. virtual TV operator[](TK kljuc) const =0;
  13. virtual TV &operator[](TK kljuc) =0;
  14. virtual int brojElemenata() const =0;
  15. virtual void obrisi() =0;
  16. virtual void obrisi(const TK &kljuc) =0;
  17. };
  18.  
  19. //Niz Mapa
  20. template<typename TK, typename TV>
  21. class NizMapa : public Mapa<TK, TV>{
  22. private:
  23. std::pair<TK, TV> *nizM;
  24. int kap;
  25. int br_elem;
  26. public:
  27. NizMapa();
  28. ~NizMapa();
  29. NizMapa(const NizMapa &m);
  30. NizMapa& operator =(const NizMapa &novi);
  31. TV operator[](TK kljuc) const override;
  32. TV &operator[](TK kljuc) override;
  33. int brojElemenata() const override {
  34. return br_elem;
  35. }
  36. int kapacitetMape() const{
  37. return kap;
  38. }
  39. void obrisi() override;
  40. void obrisi(const TK &kljuc) override;
  41. void ispisi() const{
  42. for(int i(0);i<br_elem;i++)
  43. std::cout<<nizM[i].first<<","<<nizM[i].second<<" "<<std::endl;;
  44. }
  45.  
  46. };
  47. template<typename TK, typename TV>
  48. NizMapa<TK, TV>::NizMapa(const NizMapa &m){
  49. br_elem =0;
  50. kap = m.kapacitetMape();
  51. nizM = new std::pair<TK, TV>[kap];
  52. for(int i(0);i<m.brojElemenata();i++)
  53. nizM[i] = m.nizM[i];
  54. br_elem = m.brojElemenata();
  55. }
  56. template<typename TK, typename TV>
  57. NizMapa<TK, TV>& NizMapa<TK, TV>::operator =(const NizMapa<TK, TV> &m){
  58. if(this!=&m){
  59. delete[] nizM;
  60. br_elem=0;
  61. kap = m.kapacitetMape();
  62. nizM = new std::pair<TK, TV>[kap];
  63. for(int i(0);i<m.brojElemenata();i++) {
  64. nizM[i] = m.nizM[i];
  65. }
  66. br_elem = m.brojElemenata();
  67. }
  68. return *this;
  69. }
  70.  
  71. template<typename TK, typename TV>
  72. NizMapa<TK, TV>::NizMapa(){
  73. kap=100;
  74. br_elem =0;
  75. nizM = new std::pair<TK, TV>[kap];
  76. }
  77. template<typename TK, typename TV>
  78. NizMapa<TK, TV>::~NizMapa(){
  79. br_elem = 0;
  80. kap=0;
  81. delete[] nizM;
  82. }
  83. //constantna verzija
  84. template<typename TK, typename TV>
  85. TV NizMapa<TK, TV>::operator[](TK kljuc) const{
  86. for(int i(0);i<kap;i++){
  87. if(kljuc == nizM[i].first){
  88. return nizM[i].second;
  89. }
  90. }
  91. return TV();
  92. }
  93. //non-const verzija
  94. template<typename TK, typename TV>
  95. TV &NizMapa<TK, TV>::operator[](TK kljuc){
  96. for(int i(0);i<br_elem;i++){
  97. if(nizM[i].first == kljuc)
  98. return nizM[i].second;
  99. }
  100. if(brojElemenata() == kapacitetMape()){
  101. std::pair<TK, TV> *pom;
  102. pom = new std::pair<TK, TV>[2*kap];
  103. kap=2*kap;
  104. for(int i(0);i<br_elem;i++)
  105. pom[i]=nizM[i];
  106. delete[] nizM;
  107. nizM=pom;
  108. }
  109. std::pair<TK, TV> temp(kljuc, TV());
  110. nizM[br_elem] = temp;
  111. br_elem++;
  112. return nizM[br_elem-1].second;
  113. }
  114. template<typename TK, typename TV>
  115. void NizMapa<TK, TV>::obrisi(){
  116. delete[] nizM;
  117. br_elem =0;
  118. nizM = new std::pair<TK, TV>[100];
  119. kap=100;
  120. }
  121. template<typename TK, typename TV>
  122. void NizMapa<TK, TV>::obrisi(const TK &kljuc){
  123. for(int i(0);i<br_elem;i++)
  124. if(nizM[i].first == kljuc){
  125. std::pair<TK, TV> temp(nizM[br_elem-1].first, nizM[br_elem-1].second);
  126. nizM[br_elem-1].first = nizM[i].first; nizM[br_elem-1].second=nizM[i].second;
  127. nizM[i].first = temp.first; nizM[i].second = temp.second;
  128. br_elem--;
  129. return;
  130. }
  131. throw std::domain_error("Ne postoji odgovarajuci kljuc");
  132. }
  133.  
  134.  
  135. //Unit testovi
  136. bool testPovecanjeKapaciteta() {
  137. bool flag1(false), flag2(false);
  138. NizMapa<int, int> a;
  139. int i(0);
  140. for(;i<100;i++)
  141. a[i]=i;
  142. if(a.kapacitetMape() == 100) flag1=true;
  143. a[i]=i;
  144. if(a.kapacitetMape()==200) flag2 = true;
  145. if(flag1 == true && flag2 == true ) return true;
  146. return false;
  147. }
  148. bool testConstOperatorUglaste(){
  149. bool flag1(false), flag2(false);
  150. NizMapa<int, int> a;
  151. for(int i(0);i<5;i++)
  152. a[i]=i;
  153. {
  154. const NizMapa<int, int> b(a);
  155. if(b[0]==0 && b[4]==4) flag2 = true;
  156. }
  157. if(a[0]==0 && a[4]==4) flag1 = true;
  158. if(flag1 == true && flag2 == true ) return true;
  159. return false;
  160. }
  161. bool testNonConstOperatoraUglaste(){
  162. bool flag1(false), flag2(false), flag3(false);
  163. NizMapa<int, int> a;
  164. for(int i(0);i<5;i++)
  165. a[i]=i;
  166. if(a[3]==3) flag1=true;
  167. a[3]=10;
  168. if(a[3]==10) flag2 = true;
  169. for(int i(5);i<=100;i++)
  170. a[i]=i;
  171. if(a[100] == 100 && a.kapacitetMape()==200) flag3 = true;
  172. if(flag1==true && flag2==true && flag3==true) return true;
  173. return false;
  174. }
  175. bool testBrisanjeKljuca(){
  176. bool flag1(false), flag2(false);
  177. NizMapa<int, int> a;
  178. for(int i(0);i<5;i++)
  179. a[i]=i;
  180. {
  181. a.obrisi(3);
  182. try{
  183. if(a[3] == 0) flag1=true;
  184. }catch(...){
  185. flag1=false;
  186. }
  187. }
  188. try{
  189. a.obrisi(5);
  190. }catch(std::domain_error izu){
  191. flag2=true;
  192. }
  193. if(flag1 == true and flag2 == true) return true;
  194. return false;
  195. }
  196. bool testObrisiBezParametara(){
  197. NizMapa<int, int> a;
  198. for(int i(0);i<500;i++)
  199. a[i]=i;
  200. a.obrisi();
  201. if(a.kapacitetMape()==100 && a.brojElemenata()==0 && a[0]==0) return true;
  202. return false;
  203. }
  204. bool testFunkcionalnosti(){
  205. bool flag1(false), flag2(false);
  206. NizMapa<int, int> a;
  207. for(int i(0);i<100;i++)
  208. a[i]=i;
  209. {
  210. NizMapa<int, int> b(a);
  211. NizMapa<int, int> c;
  212. c=a;
  213. b[596] = 20;
  214. c[311] = 5;
  215. a.obrisi(0);
  216. if(b[0]==0) flag1 = true;
  217. if(c[0]==0) flag2 = true;
  218. }
  219. if(a[0]==0 && flag1== true && flag2==true) return true;
  220. return false;
  221. }
  222.  
  223. void GlavnaTestFunkcija(){
  224. std::cout<<"Test povecanja kapaciteta: ";
  225. if(testPovecanjeKapaciteta()) std::cout<<"OK"<<std::endl;
  226. else std::cout<<"BAD"<<std::endl;
  227. std::cout<<"Test const operatora []: ";
  228. if(testConstOperatorUglaste()) std::cout<<"OK"<<std::endl;
  229. else std::cout<<"BAD"<<std::endl;
  230. std::cout<<"Test Non const operatora []: ";
  231. if(testNonConstOperatoraUglaste()) std::cout<<"OK"<<std::endl;
  232. else std::cout<<"BAD"<<std::endl;
  233. std::cout<<"Test obrisi kljuc: ";
  234. if(testBrisanjeKljuca()) std::cout<<"OK"<<std::endl;
  235. else std::cout<<"BAD"<<std::endl;
  236. std::cout<<"Test obrisi metoda: ";
  237. if(testObrisiBezParametara()) std::cout<<"OK"<<std::endl;
  238. else std::cout<<"BAD"<<std::endl;
  239. std::cout<<"Test funkcionalnosti: ";
  240. if(testFunkcionalnosti()) std::cout<<"OK"<<std::endl;
  241. else std::cout<<"BAD"<<std::endl;
  242. }
  243.  
  244. int main() {
  245. GlavnaTestFunkcija();
  246. return 0;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement