Advertisement
amermo

TP - prvi popravni 2014.

Apr 15th, 2015
537
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.28 KB | None | 0 0
  1. /*Rješenje popravnog roka iz TP - prva parcijala*/
  2.  
  3. Zadatak 1:
  4.  
  5. #include <iostream>
  6. #include <vector>
  7.  
  8. std::vector<int> NajmanjaCifraElemenata(std::vector<int> v)
  9. {
  10.     std::vector<int> VektorRezultata; //Pošto trebamo vratiti novi vektor, a ne modifikovati stari, treba nam jedan vektor
  11.     for(unsigned int i(0); i < v.size(); i++)
  12.     {
  13.         //Krećemo se kroz vektor, klasičnom for petljom
  14.         if(v[i] < 0)
  15.             v[i]*=-1; //Rečeno je da elementi mogu biti i negativni, a pošto nam samo treba najmanja cifra, taj minus mora biti ingorisan
  16.         //Da nismo množili sa -1, bukvalno bi uzimao najveću cifru, ali sa predznakom -, jer bi svaku cifru posmatrao kao negativnu,
  17.         //pa bi najmanja cifra bila ona što je najviše negativna(logično)
  18.         int NajmanjaCifra(v[i] % 10);
  19.         while(v[i] > 0)
  20.         {
  21.             //Klasičan algoritam traženja najmanjeg elementa
  22.             //Postavimo zadnju cifru kao referentnu i provjeravamo, da li je ona veća od ostalih
  23.             //ako jeste, onda je nova najmanja ona s kojom smo poredili
  24.             if(NajmanjaCifra > v[i] % 10)
  25.                 NajmanjaCifra = v[i] % 10;
  26.             v[i]/=10;
  27.         }
  28.         VektorRezultata.push_back(NajmanjaCifra); //Nađenu najmanju cifru, ubacujemo u vektor koji ćemo vratiti iz funkcije
  29.     }
  30.     return VektorRezultata;
  31. }
  32.  
  33. int main()
  34. {
  35.     std::vector<int> v1(10);
  36.     for(unsigned int i(0); i < v1.size(); i++)
  37.         std::cin >> v1[i];
  38.     std::vector<int> v2(NajmanjaCifraElemenata(v1));
  39.     for(int &x : v2)
  40.         std::cout << x << " ";
  41.     return 0;
  42. }
  43.  
  44. Zadatak 2:
  45.  
  46. #include <iostream>
  47. #include <vector>
  48. #include <stdexcept>
  49. #include <iomanip>
  50.  
  51. typedef std::vector<std::vector<double>> Matrica; //Pošto je konstrukcija rogobatna onda fino stavimo typedef
  52.  
  53. Matrica KreirajMatricu(int br_redova, int br_kolona) //Funkcija koja vraća matricu sa zadanim brojem redova i kolona
  54. {
  55.     return Matrica(br_redova, std::vector<double>(br_kolona));
  56. }
  57.  
  58. void UnesiMatricu(Matrica &a) //Funkcija za unos matrice
  59.                              //Razlika je samo što smo umjesto proslijeđivanja dimenzija matrice
  60.                             //jednostavno proslijedili referencu, te kreiranu matricu samo modifikovali
  61. {
  62.     for(unsigned int i(0); i < a.size(); i++)
  63.         for(unsigned int j(0); j < a[0].size(); j++)
  64.         {
  65.             std::cout << "Unesite element (" << i + 1 << "," << j + 1 << "): ";
  66.             std::cin >> a[i][j];
  67.         }
  68. }
  69.  
  70. void IspisiMatricu(const Matrica &a) //Funkcija za ispis, sa rangovskom for petljom
  71. {
  72.     std::cout << std::endl;
  73.     for(const auto &i : a)
  74.     {
  75.         for(const auto &j : i)
  76.             std::cout << std::setw(8) << j;
  77.         std::cout << std::endl;
  78.     }
  79. }
  80.  
  81. bool MoguLiSeMnoziti(const Matrica &a, const Matrica &b) //Testiramo da li su matrice saglasne za množenje
  82. {
  83.     return a[0].size() == b.size();
  84. }
  85.  
  86. bool ImaLiFormuMatrice(const Matrica &a) //Testiramo da li parametar ima formu matrice
  87. {
  88.     for(unsigned int i(0); i < a.size(); i++)
  89.         if(a[i].size() != a[0].size())
  90.             return false;
  91.     return true;
  92. }
  93.  
  94. Matrica ProduktMatrica(const Matrica &a, const Matrica &b)
  95. {
  96.     if(!MoguLiSeMnoziti(a, b)) throw std::domain_error("Matrice nisu saglasne za mnozenje!");
  97.     if(!ImaLiFormuMatrice(a) || !ImaLiFormuMatrice(b)) throw std::domain_error("Parametar nema formu matrice!");
  98.     Matrica Produkt(KreirajMatricu(a.size(), b[0].size())); //Kreiramo neku matricu u koju cemo smjestati elemente
  99.     for(unsigned int i(0); i < Produkt.size(); i++)
  100.         for(unsigned int j(0); j < Produkt[i].size(); j++)
  101.         {
  102.             double Suma(0);
  103.             for(unsigned int k(0); k < b.size(); k++)
  104.                 Suma+=a[i][k]*b[k][j];
  105.             Produkt[i][j] = Suma;
  106.         }
  107.     return Produkt;
  108. }
  109.  
  110. int main()
  111. {
  112.     int br_redova, br_kolona;
  113.     std::cout << "Unesite dimenzije matrice A: ";
  114.     std::cin >> br_redova >> br_kolona;
  115.     Matrica A(KreirajMatricu(br_redova, br_kolona));
  116.     UnesiMatricu(A);
  117.     std::cout << "Unesite dimenzije matrice B: ";
  118.     std::cin >> br_redova >> br_kolona;
  119.     Matrica B(KreirajMatricu(br_redova, br_kolona));
  120.     UnesiMatricu(B);
  121.     try
  122.     {
  123.         Matrica C(ProduktMatrica(A, B));
  124.         IspisiMatricu(C);
  125.     }
  126.     catch(std::domain_error izuzetak)
  127.     {
  128.         std::cout << izuzetak.what();
  129.     }
  130.     return 0;
  131. }
  132.  
  133. Zadatak 3:
  134.  
  135. #include <iostream>
  136. #include <vector>
  137.  
  138. template <typename NedefiniraniTip, typename TipFunkcije>
  139. auto Funkcija(NedefiniraniTip x, TipFunkcije f, int n) -> decltype(x) //Jedina caka je prepustiti potpunoj dedukciji
  140.                                                                       //da odredi povratni tip i tip parametara funkcije f
  141.                                                                       //a povratni tip Funkcije se određuje naknadno
  142. {
  143.     auto Rezultat(f(x)); //Ovdje smo uzeli početnu vrijednost i izračunali onu prvu unutrašnju zagradu
  144.     for(int i(1); i < n; i++) //Ovdje nastavljamo ali za jedan put manje jer smo već izračunali početnu vrijednost
  145.         Rezultat = f(Rezultat);
  146.     return Rezultat;
  147. }
  148.  
  149. int main()
  150. {
  151.     int n;
  152.     std::cout << "Unesite n: ";
  153.     std::cin >> n;
  154.     std::cout << Funkcija(10, [](int x) {return 3*x*x-5;}, n); //Testiramo našu funkciju, koristeći lambda funkcije
  155.                                                                //jer nam više ta funkcija nije potrebna nigdje
  156.     return 0;
  157. }
  158.  
  159. Zadatak 6:
  160.  
  161. #include <iostream>
  162. #include <vector>
  163. #include <list>
  164.  
  165. template <typename IterTip1, typename IterTip2>
  166. IterTip2 KumulativnaSuma(IterTip1 Pocetak1, IterTip1 Kraj, IterTip2 Pocetak2) //Deklaracija prototipa kao što je tražena u zadatku
  167. {
  168.     int Counter(1); //Jedan brojač koji će nam pomoći, da saznamo koliko elemenata treba sabrati
  169.     for(auto p(Pocetak1); p != Kraj; p++, Counter++) //Uzmemo drugi iterator/pokazivač da bi kasnije mogli iskoristiti Pocetak1
  170.     {
  171.         auto q(Pocetak1); //Zabilježimo početak
  172.         for(int i(0); i < Counter; i++) //Jedna petlja koja sabira svaki put po element više, krećući od prvog elementa
  173.             *Pocetak2+=*q++; //Smjestimo u iterator/pokazivač sumu elemenata
  174.         Pocetak2++; //Pomjerimo ga na idući element odredišnog bloka
  175.     }
  176.     return Pocetak2;
  177. }
  178. //Ovakvo nešto smo uradili jer npr indeksacije poput v.begin()-counter ili *(pok-2) ne bi radile za liste, jer se one ne mogu indeksirati
  179. int main()
  180. {
  181.     std::list<int> lista {1, 2, 3, 4};
  182.     std::vector<int> v(lista.size());
  183.     KumulativnaSuma(lista.begin(), lista.end(), v.begin());
  184.     for(const auto &x : v)
  185.         std::cout << x << " ";
  186.     return 0;
  187. }
  188.  
  189. Zadatak 7:
  190.  
  191. #include <iostream>
  192. #include <deque>
  193. #include <complex>
  194. #include <algorithm>
  195.  
  196. bool KriterijSortiranja(std::complex<double> z1, std::complex<double> z2)
  197. {
  198.     if(std::abs(z1) < std::abs(z2)) //Ako je z1 po modulu manji od z2, to je pravi poredak
  199.         return true;
  200.     if(std::abs(z1) == std::abs(z2)) //Ili ako su moduli jednaki, onda treba gledati da li je realni dio z1 manji od z2
  201.                                     //Ako je realni dio z1 manji od realnog dijela z2, to je pravi poredak
  202.         return std::real(z1) < std::real(z2);
  203.     return false; //U svakom drugom slučaju poredak nije dobar
  204. }
  205.  
  206. int main()
  207. {
  208.     std::deque<std::complex<double>> d;
  209.     int n;
  210.     std::cout << "Unesite broj elemenata deka: ";
  211.     std::cin >> n;
  212.     for(int i(0); i < n; i++)
  213.     {
  214.         std::complex<double> z;
  215.         std::cin >> z;
  216.         d.push_back(z);
  217.     }
  218.     std::sort(d.begin(), d.end(), KriterijSortiranja);
  219.     for(auto &x : d)
  220.         std::cout << x << " ";
  221.     return 0;
  222. }
  223.  
  224. Zadatak 8:
  225.  
  226. #include <iostream>
  227. #include <string>
  228. #include <vector>
  229. #include <cstring>
  230. #include "TestCurenja.h"
  231.  
  232. template <typename TipElemenata>
  233. TipElemenata **Alociraj(std::vector<std::string> v)
  234. {
  235.     TipElemenata **NizPokazivaca(new TipElemenata*[v.size()]); //Dinamička alokacija niza pokazivača
  236.                                                                //Ako ona ne uspije, baca se bad_alloc
  237.                                                                //koji će biti uhvaćen tek u mainu, curenja neće biti jer nije ni
  238.                                                                //alocirano ništa
  239.     for(unsigned int i(0); i < v.size(); i++) //Postavimo sve pokazivače na nullptr, ukoliko neka od dole alokacija ne uspije
  240.                                               //nullptr nam garantuje da neće biti double delete ako na njega primjenimo delete
  241.         NizPokazivaca[i] = nullptr;
  242.     try
  243.     {
  244.         for(unsigned int i(0); i < v.size(); i++) //Prolazimo kroz niz pokazivača
  245.         {
  246.             NizPokazivaca[i] = new TipElemenata[v[i].length() + 1]; //Svakom pokazivaču dodijelimo novi dinamički alociran niz tipa char
  247.                                                                     //ali veličine koja je jednakak dužini odgovarajućeg stringa + 1 jer se
  248.                                                                     //ovdje ipak radi o null terminiranom stringu, pa moramo imati 1 mjesto više
  249.             std::strcpy(NizPokazivaca[i], v[i].c_str()); //Kopiramo string iz vektora stringova u odgovarajuće mjesto u dinamički alociranom
  250.                                                         //nizu, uz eksplicitnu konverziju tipa string u niz znakova, jer automatska nije podržana
  251.         }
  252.     }
  253.     catch(std::bad_alloc) //Ako neka od ovih alokacija u try bloku nije uspjela, eto nas ovdje
  254.     {
  255.         for(unsigned int i(0); i < v.size(); i++)
  256.             delete[] NizPokazivaca[i]; //Brišemo svaki dinamički alociran niz na koji pokazuju pokazivači
  257.         delete[] NizPokazivaca; //Brišemo sam niz pokazivača
  258.         throw; //Proslijedimo izuzetak dalje, jer nas nije briga ko će ga uhvatiti
  259.     }
  260.     return NizPokazivaca;
  261. }
  262.  
  263. int main()
  264. {
  265.     std::vector<std::string> v {"Test", "ovo", "ispisi"};
  266.     try
  267.     {
  268.         auto p(Alociraj<char>(v));
  269.         for(unsigned int i(0); i < v.size(); i++)
  270.             std::cout << p[i] << " ";
  271.         for(unsigned int i(0); i < v.size(); i++)
  272.             delete[] p[i];
  273.         delete[] p;
  274.     }
  275.     catch(std::bad_alloc)
  276.     {
  277.         std::cout << "Alokacija nije uspjela!";
  278.     }
  279.     return 0;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement