Advertisement
Guest User

Untitled

a guest
Jan 19th, 2018
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.56 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. using namespace std;
  5.  
  6. char *crt = "\n-------------------------------------------\n";
  7. enum stringFormat { DDMMGG, DDMMGGGG, DDMMGGSSMM, DDMMGGGGSSMM };
  8. enum prikazPoruka { SVE_PORUKE, SAKRIJ_POBRISANE, PRIKAZI_SAMO_POBRISANE };
  9. vector<string> nedozvoljeneRijeci;
  10. /*
  11. DDMMGG - 29.8.17
  12. DDMMGGGG - 29.8.2017
  13. DDMMGGGGSSMM - 29.8.2017 10:15
  14. */
  15.  
  16. template<class T1, class T2>
  17. class Kolekcija {
  18. T1 * _elementi1;
  19. T2 * _elementi2;
  20. int * _trenutno;
  21. public:
  22. Kolekcija()
  23. {
  24. _elementi1 = nullptr;
  25. _elementi2 = nullptr;
  26. _trenutno = new int(0);
  27. }
  28.  
  29. Kolekcija & operator=(Kolekcija<T1, T2> & orig)
  30. {
  31. if (this != &orig)
  32. {
  33. delete[]_elementi1;
  34. delete[]_elementi2;
  35.  
  36. _elementi1 = new T1[*orig._trenutno];
  37. _elementi2 = new T2[*orig._trenutno];
  38. *_trenutno = *orig._trenutno;
  39.  
  40. for (int i = 0; i < *_trenutno; i++)
  41. {
  42. _elementi1[i] = orig._elementi1[i];
  43. _elementi2[i] = orig._elementi2[i];
  44. }
  45. }
  46. return *this;
  47. }
  48. Kolekcija(Kolekcija&k){
  49. _trenutno = new int(*k._trenutno);
  50. _elementi1 = new T1[*_trenutno];
  51. _elementi2 = new T2[*_trenutno];
  52. for (int i = 0; i < *_trenutno; i++){
  53. _elementi1[i] = k._elementi1[i];
  54. _elementi2[i] = k._elementi2[i];
  55. }
  56. }
  57. bool AddElement(T1 elem1, T2 elem2)
  58. {
  59. T1 * temp1 = new T1[*_trenutno + 1];
  60. T2 * temp2 = new T2[*_trenutno + 1];
  61.  
  62. for (int i = 0; i < *_trenutno; i++) {
  63. temp1[i] = _elementi1[i];
  64. temp2[i] = _elementi2[i];
  65. }
  66.  
  67. delete[] _elementi1;
  68. delete[] _elementi2;
  69.  
  70. _elementi1 = temp1;
  71. _elementi2 = temp2;
  72.  
  73. _elementi1[*_trenutno] = elem1;
  74. _elementi2[*_trenutno] = elem2;
  75. (*_trenutno)++;
  76. return true;
  77. }
  78. ~Kolekcija()
  79. {
  80. delete[]_elementi1; _elementi1 = nullptr;
  81. delete[]_elementi2; _elementi2 = nullptr;
  82. delete _trenutno; _trenutno = nullptr;
  83. }
  84.  
  85. T1 * getElementi1Pok() { return _elementi1; }
  86. T2 * getElementi2Pok() { return _elementi2; }
  87. T1 & getElement1(int lokacija) { return _elementi1[lokacija]; }
  88. T2 & getElement2(int lokacija) { return _elementi2[lokacija]; }
  89. int getTrenutno() { return *_trenutno; }
  90. T1&operator[](int lokacija){
  91. if (lokacija >= 0 && lokacija < *_trenutno)
  92. return _elementi1[lokacija];
  93.  
  94. }
  95. friend ostream & operator<<(ostream & COUT, Kolekcija<T1, T2> & obj)
  96. {
  97. for (size_t i = 0; i < *obj._trenutno; i++)
  98. {
  99. COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  100. }
  101. return COUT;
  102. }
  103. };
  104. class DatumVrijeme {
  105. int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  106. public:
  107. DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  108. _dan = new int(dan);
  109. _mjesec = new int(mjesec);
  110. _godina = new int(godina);
  111. _sati = new int(sati);
  112. _minuti = new int(minuti);
  113. }
  114. DatumVrijeme(const DatumVrijeme&d){
  115. _dan = new int(*d._dan);
  116. _mjesec = new int(*d._mjesec);
  117. _godina = new int(*d._godina);
  118. _sati = new int(*d._sati);
  119. _minuti = new int(*d._minuti);
  120. }
  121. DatumVrijeme&operator=(const DatumVrijeme&d){
  122. if (this == &d)
  123. return*this;
  124. delete _dan; _dan = nullptr;
  125. delete _mjesec; _mjesec = nullptr;
  126. delete _godina; _godina = nullptr;
  127. delete _sati; _sati = nullptr;
  128. delete _minuti; _minuti = nullptr;
  129. _dan = new int(*d._dan);
  130. _mjesec = new int(*d._mjesec);
  131. _godina = new int(*d._godina);
  132. _sati = new int(*d._sati);
  133. _minuti = new int(*d._minuti);
  134. }
  135. ~DatumVrijeme() {
  136. delete _dan; _dan = nullptr;
  137. delete _mjesec; _mjesec = nullptr;
  138. delete _godina; _godina = nullptr;
  139. delete _sati; _sati = nullptr;
  140. delete _minuti; _minuti = nullptr;
  141. }
  142. string ToString(stringFormat formatDatuma){
  143. if (formatDatuma == DDMMGG){
  144. int pomocna = (*_godina) % 100;
  145. string format = to_string(*_dan) + "." + to_string(*_mjesec) + "." + to_string(pomocna);
  146. return format;
  147. }
  148. else if (formatDatuma == DDMMGGGG){
  149. string format = to_string(*_dan) + "." + to_string(*_mjesec) + "." + to_string(*_godina);
  150. return format;
  151. }
  152. else if (formatDatuma == DDMMGGGGSSMM){
  153. string format = to_string(*_dan) + "." + to_string(*_mjesec) + "." + to_string(*_godina) + " " + to_string(*_sati) + ":" + to_string(*_minuti);
  154. return format;
  155. }
  156.  
  157. }
  158. int oduzmi(DatumVrijeme d1){
  159. int minute1 = *_sati * 60;
  160. int minute2 = *d1._sati * 60;
  161. minute1 += *_minuti;
  162. minute2 += *d1._minuti;
  163. return minute1 - minute2;
  164. }
  165. friend ostream & operator<< (ostream & COUT, DatumVrijeme & obj) {
  166. COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  167. return COUT;
  168. }
  169. };
  170. class Poruka {
  171. string _posiljalac;
  172. string _primalac;
  173. string _sadrzaj;
  174. DatumVrijeme _vrijeme;
  175. public:
  176. Poruka(){}
  177. Poruka(string posiljalac, string primalac, string sadrzaj, DatumVrijeme vrijeme) :_vrijeme(vrijeme)
  178. {
  179. _posiljalac = posiljalac;
  180. _primalac = primalac;
  181. _sadrzaj = sadrzaj;
  182. }
  183. friend ostream & operator<< (ostream & COUT, Poruka & obj) {
  184. COUT << "(" << obj._vrijeme << ") " << obj._posiljalac << " -> ";
  185. COUT << obj._sadrzaj;
  186. return COUT;
  187. }
  188. string getPrimalac() { return _primalac; }
  189. string getPosiljalac() { return _posiljalac; }
  190. string getSadrzaj() { return _sadrzaj; }
  191. DatumVrijeme getVrijeme(){
  192. return _vrijeme;
  193. }
  194. };
  195. class Komunikacija {
  196. string _naslov;
  197. int _ocjena; //ocjena komunikacije 1 - 5 se automatski izracunava
  198. Kolekcija<Poruka, bool> _poruke;//bool se odnosi na podatak da li je poruka pobrisana tj. nece biti vidljiva u prikazu ukoliko se drugacije ne navede
  199. public:
  200. Komunikacija(){}
  201. Komunikacija(string naslov) {
  202. _naslov = naslov;
  203. _ocjena = -1;
  204. }
  205. Komunikacija(Komunikacija&k){
  206. _naslov = k._naslov;
  207. _ocjena = k._ocjena;
  208. for (int i = 0; i < k._poruke.getTrenutno(); i++){
  209. _poruke.AddElement(k._poruke.getElement1(i), k._poruke.getElement2(i));
  210. }
  211. }
  212. Komunikacija&operator=(Komunikacija&k){
  213. if (this == &k)
  214. return *this;
  215. _naslov = k._naslov;
  216. _ocjena = k._ocjena;
  217. for (int i = 0; i < k._poruke.getTrenutno(); i++){
  218. _poruke.AddElement(k._poruke.getElement1(i), k._poruke.getElement2(i));
  219. }
  220. return *this;
  221. }
  222. friend ostream & operator<< (ostream & COUT, Komunikacija & obj) {
  223. COUT << "(" << obj._ocjena << ") " << obj._naslov << " -> ";
  224. for (size_t i = 0; i < obj._poruke.getTrenutno(); i++)
  225. {
  226. COUT << obj._poruke[i] << endl;
  227. }
  228. return COUT;
  229. }
  230. Kolekcija<Poruka, bool> * getPoruke() { return &_poruke; }
  231. int getOcjena() { return _ocjena; }
  232. void setOcjena(int ocjena){
  233. _ocjena = ocjena;
  234. }
  235. string getNaslov() { return _naslov; }
  236. };
  237.  
  238. class Korisnik {
  239. string _korisnickoIme;
  240. char * _imePrezime;
  241. //char * - se odnosi na naziv predmeta ili tema gdje æe se èuvati kompletna komunikacija sa nastavnim osobljem ili korisnikom na odreðenom predmetu/temi
  242. Kolekcija<char *, Komunikacija> _komunikacija;
  243. public:
  244. Korisnik(char * korisnickoIme, char * imePrezime)
  245. {
  246. int vel = strlen(imePrezime) + 1;
  247. _imePrezime = new char[vel];
  248. strcpy_s(_imePrezime, vel, imePrezime);
  249. _korisnickoIme = korisnickoIme;
  250. }
  251. Korisnik(Korisnik & original) :_komunikacija(original._komunikacija)
  252. {
  253. int vel = strlen(original._imePrezime) + 1;
  254. _imePrezime = new char[vel];
  255. strcpy_s(_imePrezime, vel, original._imePrezime);
  256. _korisnickoIme = original._korisnickoIme;
  257. }
  258. Korisnik&operator=(Korisnik&k){
  259. int vel = strlen(k._imePrezime) + 1;
  260. _imePrezime = new char[vel];
  261. strcpy_s(_imePrezime, vel, k._imePrezime);
  262. _korisnickoIme = k._korisnickoIme;
  263. for (int i = 0; i < k._komunikacija.getTrenutno(); i++){
  264. _komunikacija.AddElement(k._komunikacija.getElement1(i), k._komunikacija.getElement2(i));
  265. }
  266. }
  267.  
  268. ~Korisnik()
  269. {
  270. delete[] _imePrezime; _imePrezime = nullptr;
  271. }
  272. friend ostream & operator<< (ostream &COUT, Korisnik &obj)
  273. {
  274. COUT << obj._imePrezime << endl << obj._komunikacija << endl;
  275. return COUT;
  276. }
  277. Kolekcija<char*, Komunikacija> * GetKomunikacija() { return &_komunikacija; }
  278. string getKorisnickoIme() { return _korisnickoIme; }
  279. void PrikaziKomunikacijuPoNaslovu(string naziv, prikazPoruka prikaz){
  280. if (prikaz == SVE_PORUKE)
  281. {
  282. for (int i = 0; i < _komunikacija.getTrenutno(); i++){
  283. for (int j = 0; j < _komunikacija.getElement2(i).getPoruke()->getTrenutno(); j++){
  284.  
  285. if (_komunikacija.getElement2(i).getPoruke()->getElement2(j) == false){
  286. cout << crt << endl;
  287. cout << _komunikacija.getElement2(i).getPoruke()->getElement1(j) << endl;
  288. }
  289. else{
  290. cout << crt << endl;
  291. cout << _komunikacija.getElement2(i).getPoruke()->getElement1(j) << endl;
  292. }
  293. }
  294. }
  295. }
  296. else if (prikaz == SAKRIJ_POBRISANE){
  297. for (int i = 0; i < _komunikacija.getTrenutno(); i++){
  298. for (int j = 0; j < _komunikacija.getElement2(i).getPoruke()->getTrenutno(); j++){
  299.  
  300. if (_komunikacija.getElement2(i).getPoruke()->getElement2(j) == false){
  301. cout << "Neobrisane: " << endl;
  302. cout << crt << endl;
  303. cout << _komunikacija.getElement2(i).getPoruke()->getElement1(j) << endl;
  304. }
  305. }
  306. }
  307. }
  308.  
  309. else{
  310. for (int i = 0; i < _komunikacija.getTrenutno(); i++){
  311. for (int j = 0; j < _komunikacija.getElement2(i).getPoruke()->getTrenutno(); j++){
  312.  
  313. if (_komunikacija.getElement2(i).getPoruke()->getElement2(j) == true){
  314. cout << "Obrisane: " << endl;
  315. cout << crt << endl;
  316. cout << _komunikacija.getElement2(i).getPoruke()->getElement1(j) << endl;
  317. }
  318. }
  319. }
  320. }
  321.  
  322. }
  323. int PrikaziKomunikacijuSaKorisnikom(char*ime){
  324. /*funkcija prikazuje sve poruke sa korisnikom cije korisnicko ime je definisano parametrom, te vraca ukupan broj (razmijenjenih poruka sa tim korisnikom)*/
  325. int brojac = 0;
  326. for (int i = 0; i < _komunikacija.getTrenutno(); i++){
  327. for (int j = 0; j < _komunikacija.getElement2(i).getPoruke()->getTrenutno(); j++){
  328. if (strcmp(_komunikacija.getElement2(i).getPoruke()->getElement1(j).getPosiljalac().c_str(), ime) == 0)
  329. brojac++;
  330. else if (strcmp(_komunikacija.getElement2(i).getPoruke()->getElement1(j).getPrimalac().c_str(), ime) == 0)
  331. brojac++;
  332. }
  333. }
  334. return brojac;
  335. }
  336. void OcijeniKomunikaciju(char*nazivPredmeta){
  337. /*formira ocjenu na nivou komunikacije na nacin da izracunava prosjecno vrijeme odgovora drugog ucesnika izrazeno u minutama i to prema sljedecoj skali
  338. prosjek > 20 minuta = ocjena 1
  339. prosjek > 15 minuta = ocjena 2
  340. prosjek > 10 minuta = ocjena 3
  341. prosjek > 5 minuta = ocjena 4
  342. prosjek <=5 minuta = ocjena 5
  343. */
  344. for (int i = 0; i < _komunikacija.getTrenutno(); i++){
  345. if (strcmp(_komunikacija.getElement1(i), nazivPredmeta) == 0){
  346. for (int j = 0; j < _komunikacija.getElement2(i).getPoruke()->getTrenutno() - 1; j++){
  347. if (_komunikacija.getElement2(i).getPoruke()->getElement1(j+1).getVrijeme().oduzmi(_komunikacija.getElement2(i).getPoruke()->getElement1(j ).getVrijeme()) >= 20)
  348. {
  349. cout << "Ocjena je 1 " << endl;
  350. _komunikacija.getElement2(i).setOcjena(1);
  351. }
  352. else if (_komunikacija.getElement2(i).getPoruke()->getElement1(j+1).getVrijeme().oduzmi(_komunikacija.getElement2(i).getPoruke()->getElement1(j ).getVrijeme()) >= 15){
  353. cout << "Ocjena je 2 " << endl;
  354. _komunikacija.getElement2(i).setOcjena(2);
  355. }
  356. else if (_komunikacija.getElement2(i).getPoruke()->getElement1(j+1).getVrijeme().oduzmi(_komunikacija.getElement2(i).getPoruke()->getElement1(j ).getVrijeme()) >= 10){
  357. cout << "Ocjena je 3 " << endl;
  358. _komunikacija.getElement2(i).setOcjena(3);
  359. }
  360. else if (_komunikacija.getElement2(i).getPoruke()->getElement1(j+1).getVrijeme().oduzmi(_komunikacija.getElement2(i).getPoruke()->getElement1(j ).getVrijeme()) > 5){
  361. cout << "Ocjena je 4 " << endl;
  362. _komunikacija.getElement2(i).setOcjena(4);
  363. }
  364. else if (_komunikacija.getElement2(i).getPoruke()->getElement1(j+1).getVrijeme().oduzmi(_komunikacija.getElement2(i).getPoruke()->getElement1(j ).getVrijeme()) <= 5){
  365. cout << "Ocjena je 5 " << endl;
  366. _komunikacija.getElement2(i).setOcjena(5);
  367. }
  368.  
  369.  
  370. }
  371. }
  372. }}
  373. };
  374. void PosaljiPoruku(Korisnik*k[],int max,char* naslov,string korisnickoIme1,string korisnickoIme2,string sadrzaj,DatumVrijeme datum){
  375. /*
  376. sve poruke se cuvaju u komunikaciji posiljaoca i primaoca tako da u svakom momentu oba ucesnika u komunikaciji posjeduju kompletnu historiju poruka.
  377. poruke se grupisu na osnovu naslova, pa ce poruke pod naslovom "Sastanak" izmedju dva korisnika sadrzavati sve poruke koje su razmijenjene na tu temu
  378. u slucaju da posiljalac ili primalac ne postoje funkcija treba baciti izuzetak sa odgovarajucom porukom. takodjer, koristeci regex sve poruke koje sadrze
  379. neku od zabranjenih rijeci trebaju biti oznacene kao obrisane
  380. */
  381. bool pronadjen1 = false;
  382. bool pronadjen2 = false;
  383. bool poslano = false;
  384. bool pronadjen = false;
  385. for (int i = 0; i < max; i++){
  386. if (k[i]->getKorisnickoIme().c_str() == korisnickoIme1)
  387. pronadjen1 = true;
  388. if (k[i]->getKorisnickoIme().c_str() == korisnickoIme2)
  389. pronadjen2 = true;
  390. }
  391.  
  392. if (pronadjen1 && pronadjen2){
  393. for (int i = 0; i < max; i++){
  394. pronadjen = false;
  395. if (k[i]->getKorisnickoIme().c_str() == korisnickoIme1 || k[i]->getKorisnickoIme().c_str() == korisnickoIme2){
  396. for (int j = 0; j < k[i]->GetKomunikacija()->getTrenutno(); j++){
  397. if (naslov == k[i]->GetKomunikacija()->getElement1(j)){
  398. k[i]->GetKomunikacija()->getElement2(j).getPoruke()->AddElement(Poruka(korisnickoIme1, korisnickoIme2, sadrzaj, datum),poslano);
  399. pronadjen = true;
  400. }
  401. }
  402. if (!pronadjen){
  403. k[i]->GetKomunikacija()->AddElement(naslov, Komunikacija(naslov));
  404. for (int j = 0; j < k[i]->GetKomunikacija()->getTrenutno(); j++){
  405. if (naslov == k[i]->GetKomunikacija()->getElement1(j))
  406. k[i]->GetKomunikacija()->getElement2(j).getPoruke()->AddElement(Poruka(korisnickoIme1, korisnickoIme2, sadrzaj, datum), poslano);
  407. }
  408. }
  409. }
  410. }
  411. }
  412. else{
  413. throw exception("Nema korisnika ");
  414. }
  415. }
  416. void main()
  417. {
  418.  
  419. /****************************************************************************
  420. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  421. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ÆE BITI OZNACENO KAO "RE"
  422. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEÈILO GUBLJENJE URAÐENOG ZADATKA
  423. 4. PROGRAMSKI CODE SE TAKOÐER NALAZI U FAJLU CODE.TXT
  424. 5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIÈNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUÈAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOÆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  425. 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAÈENO.
  426. ****************************************************************************/
  427.  
  428.  
  429. /*rijeèi koje su zabranjene u komunikaciji*/
  430. nedozvoljeneRijeci.push_back("ubiti");
  431. nedozvoljeneRijeci.push_back("mrzim");
  432. nedozvoljeneRijeci.push_back("rat");
  433.  
  434. DatumVrijeme temp,
  435. datum19062017_1015(19, 6, 2017, 10, 15),
  436. datum19062017_1020(19, 6, 2017, 10, 20),
  437. datum19062017_1021(19, 6, 2017, 10, 21),
  438. datum19062017_1030(19, 6, 2017, 10, 30);
  439.  
  440. cout << datum19062017_1015.ToString(DDMMGGGG) << endl;//vraca string: 19.6.2017
  441. cout << datum19062017_1015.ToString(DDMMGGGGSSMM) << endl;//vraca string: 19.6.2017 10:15
  442.  
  443.  
  444. const int max = 3;
  445. Korisnik * korisnici[max];
  446. korisnici[0] = new Korisnik("jasmin", "Jasmin Azemovic");
  447. korisnici[1] = new Korisnik("adel", "Adel Handzic");
  448. korisnici[2] = new Korisnik("denis", "Denis Music");
  449.  
  450.  
  451. PosaljiPoruku(korisnici, max, "Sastanak",
  452. korisnici[0]->getKorisnickoIme(), korisnici[1]->getKorisnickoIme(),
  453. "Danas imamo sastanak u 10h!", datum19062017_1015);
  454.  
  455. PosaljiPoruku(korisnici, max, "Sastanak",
  456. korisnici[1]->getKorisnickoIme(), korisnici[0]->getKorisnickoIme(),
  457. "Naravno, vidimo se u sali za sastanke!", datum19062017_1020);
  458.  
  459. PosaljiPoruku(korisnici, max, "Sastanak",
  460. korisnici[0]->getKorisnickoIme(), korisnici[1]->getKorisnickoIme(),
  461. "Sa sobom ponesi radni materijal!", datum19062017_1021);
  462.  
  463. ///*ispisuje sve poruke koje je korisnik razmijenio pod naslovom definisanim parametrom. ispis komunikacije
  464. //treba biti organizovan po datumu na nacin da se prvo prikaze datum, a nakon toga sve poruke koje su razmijenjene tog datuma.
  465. //Na mjestima pobrisanih poruka prikazati tekst "PORUKA IZBRISANA"
  466. //*/
  467. korisnici[0]->PrikaziKomunikacijuPoNaslovu("Sastanak", SVE_PORUKE);
  468.  
  469. int ukupnoPoruka = korisnici[0]->PrikaziKomunikacijuSaKorisnikom("adel");
  470. cout << "Ukupno razmjenjenih " << ukupnoPoruka << endl;
  471.  
  472. korisnici[0]->OcijeniKomunikaciju("Sastanak");
  473.  
  474. for (size_t i = 0; i < max; i++)
  475. {
  476. delete korisnici[i];
  477. korisnici[i] = nullptr;
  478. }
  479.  
  480. system("PAUSE");
  481. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement