Advertisement
EnsarMeskovic

[PRII] StudentiPredmeti - sort/binarySearch

Jun 25th, 2016
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. typedef char tekst[30];
  5.  
  6. struct Datum {
  7.     int *_dan, *_mjesec, *_godina;
  8.     bool neispravanDatum() {
  9.         int brDana[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  10.         if (*_godina % 4 == 0 && *_godina % 100 != 0 && *_godina % 400 == 0)
  11.             brDana[1]++;
  12.         if (*_godina < 1 ||*_mjesec < 1 || *_mjesec > 12 || *_dan < 1 || *_dan > brDana[*_mjesec-1])
  13.             return false;
  14.         else return true;
  15.     }
  16.     void unosDatuma() {
  17.         _dan = new int(0);
  18.         _mjesec = new int(0);
  19.         _godina = new int(0);
  20.         do {
  21.             cout << "Unesite datum (dd/mm/gggg) : ";
  22.             cin >> *_dan >> *_mjesec >> *_godina;
  23.             cin.ignore();
  24.         } while (neispravanDatum() == false);
  25.     }
  26.     void ispisDatuma() {
  27.         cout << "Datum : " << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  28.     }
  29.     void dealloc() {
  30.         delete _dan;
  31.         _dan = nullptr;
  32.         delete _mjesec;
  33.         _mjesec = nullptr;
  34.         delete _godina;
  35.         _godina = nullptr;
  36.     }
  37. };
  38. struct PolozeniPredmeti {
  39.     char * _naziv;
  40.     Datum _datumPolaganja;
  41.     int _ocjena;
  42.     char * _nastavnik;
  43.     void unosPredmeta() {
  44.         tekst naziv, nastavnik;
  45.         cout << "Unesite naziv Polozenog Predmeta : ";
  46.         cin.getline(naziv, 29);
  47.         _naziv = new char[strlen(naziv)+1];
  48.         strcpy_s(_naziv, strlen(naziv)+1, naziv);
  49.         _datumPolaganja.unosDatuma();
  50.         cout << "Unesite ocjenu za Predmet : ";
  51.         cin >> _ocjena;
  52.         cin.ignore();
  53.         cout << "Unesite Ime i Prezime Nastavnika : ";
  54.         cin.getline(nastavnik, 29);
  55.         _nastavnik = new char[strlen(nastavnik)+1];
  56.         strcpy_s(_nastavnik, strlen(nastavnik)+1, nastavnik);
  57.     }
  58.     void ispisPredmeta() {
  59.         cout << "Naziv Predmeta : " << _naziv << endl;
  60.         _datumPolaganja.ispisDatuma();
  61.         cout << "Ocjena : " << _ocjena << endl;
  62.         cout << "Nastavnik : " << _nastavnik << endl;
  63.     }
  64.     void dealloc() {
  65.         delete[] _naziv;
  66.         _naziv = nullptr;
  67.         delete[] _nastavnik;
  68.         _nastavnik = nullptr;
  69.         _datumPolaganja.dealloc();
  70.     }
  71. };
  72. struct Student {
  73.     int _indeks;
  74.     char * _imePrezime;
  75.     Datum _datumRodjenja;
  76.     PolozeniPredmeti * _predmeti;
  77.     int _brojPolozenih;
  78.     void unosStudenta() {
  79.         tekst ime;
  80.         cout << "Unesite Ime i Prezime Studenta : ";
  81.         cin.getline(ime, 29);
  82.         _imePrezime = new char[strlen(ime)+1];
  83.         strcpy_s(_imePrezime, strlen(ime)+1, ime);
  84.         cout << "Unesite broj indexa Studenta : ";
  85.         cin >> _indeks;
  86.         cin.ignore();
  87.         _datumRodjenja.unosDatuma();
  88.         _predmeti = new PolozeniPredmeti[10];
  89.         _brojPolozenih = 0;
  90.     }
  91.     void ispis() {
  92.         cout << "Ime i Prezime Studenta : " << _imePrezime << endl;
  93.         cout << "Broj Indeksa : " << _indeks << endl;
  94.         _datumRodjenja.ispisDatuma();
  95.         cout << "Broj Polozenih Predmeta : " << _brojPolozenih << endl;
  96.     }
  97.     void dealloc() {
  98.         delete[] _imePrezime;
  99.         _imePrezime = nullptr;
  100.         for (int i = 0; i < _brojPolozenih; i++)
  101.             _predmeti[i].dealloc();
  102.         delete[] _predmeti;
  103.         _predmeti = nullptr;
  104.     }
  105.     void DodajPolozeni() {
  106.         _predmeti[_brojPolozenih++].unosPredmeta();
  107.         if (_brojPolozenih == 10)
  108.             cout << "Student je polozio sve predmete !" << endl;
  109.     }
  110.     void GetPredmetiUPeriod() {
  111.         bool pronadjen = false;
  112.         int dan1, dan2, mjesec1, mjesec2, godina1, godina2;
  113.         int brDana[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  114.         do {
  115.             cout << "Unesite pocetni datum : ";
  116.             cin >> dan1 >> mjesec1 >> godina1;
  117.             cin.ignore();
  118.             cout << "Unesite krajnji datum : ";
  119.             cin >> dan2 >> mjesec2 >> godina2;
  120.             cin.ignore();
  121.         } while (godina2 < godina1 || (godina2 == godina1 && mjesec2 < mjesec1) || (godina2==godina1 && mjesec2 == mjesec1 && dan2 < dan1));
  122.         cout << endl;
  123.         if (godina1 % 4 == 0 && godina1 % 100 != 0 && godina1 % 400 == 0)
  124.             brDana[1]++;
  125.         do {
  126.             if (dan1 == brDana[mjesec1-1]) {
  127.                 mjesec1++;
  128.                 dan1 = 1;
  129.             }
  130.             if (mjesec1 == 13) {
  131.                 dan1 = 1;
  132.                 mjesec1 = 1;
  133.                 godina1++;
  134.                 if (godina1 % 4 == 0 && godina1 % 100 != 0 && godina1 % 400 == 0)
  135.                     brDana[1] = 29;
  136.                 else
  137.                     brDana[1] = 28;
  138.             }
  139.             if (godina1 == godina2 && mjesec1 == mjesec2 && dan1 == dan2)
  140.                 pronadjen = true;
  141.             for (int i = 0; i < _brojPolozenih; i++)
  142.                 if (*_predmeti[i]._datumPolaganja._godina == godina1 && *_predmeti[i]._datumPolaganja._mjesec == mjesec1 && *_predmeti[i]._datumPolaganja._dan == dan1) {
  143.                     _predmeti[i].ispisPredmeta();
  144.                     cout << endl;
  145.                 }
  146.             dan1++;
  147.         } while (pronadjen == false);
  148.     }
  149.     void sortNaziv() {
  150.         int brojac; // kontrolna prolaza
  151.         for (int e = 0; e < _brojPolozenih; e++) {
  152.             brojac = 0;
  153.             for (int i = 1; i < _brojPolozenih; i++) {
  154.                 for (int j = 0; j < strlen(_predmeti[i]._naziv) + 1; j++) {
  155.                     if (_predmeti[i]._naziv[j] < _predmeti[i - 1]._naziv[j]) {
  156.                         brojac++;
  157.                         swap(_predmeti[i], _predmeti[i - 1]);
  158.                         j = strlen(_predmeti[i]._naziv) + 1;
  159.                     } else if (_predmeti[i]._naziv[j] > _predmeti[i - 1]._naziv[j])
  160.                         j = strlen(_predmeti[i]._naziv) + 1;
  161.                 }
  162.             }
  163.             if (brojac == 0) // ako nakon prolaza kroz niz nije doslo do zamjene mjesta - zavrsi petlju
  164.                 e = _brojPolozenih;
  165.         }
  166.     }
  167.     PolozeniPredmeti *BinarnaPretraga(char *naziv) {
  168.         int prvi = 0, zadnji = _brojPolozenih, srednji = 0;
  169.         bool pronadjen = false;
  170.         while (pronadjen == false && prvi <= zadnji) {
  171.             srednji = (prvi + zadnji) / 2;
  172.             if (strcmp(naziv, _predmeti[srednji]._naziv) < 0)
  173.                 zadnji = srednji - 1;
  174.             else if (strcmp(naziv, _predmeti[srednji]._naziv) == 0)
  175.                 pronadjen = true;
  176.             else if (strcmp(naziv, _predmeti[srednji]._naziv) > 0)
  177.                 prvi = srednji + 1;
  178.         }
  179.         if (pronadjen)
  180.             return &_predmeti[srednji];
  181.         else return nullptr;
  182.     }
  183. };
  184. void main() {
  185.     Student *pokemon = new Student;
  186.     char znak;
  187.     pokemon->unosStudenta();
  188.     system("cls");
  189.     do {
  190.         do {
  191.             cout << "Da li zelite dodati Polozeni Predmet ? [D/N] : ";
  192.             cin >> znak;
  193.             znak = toupper(znak);
  194.             cin.ignore();
  195.         } while (znak != 'D' && znak != 'N');
  196.         if (znak == 'D') pokemon->DodajPolozeni();
  197.     } while (znak == 'D' && pokemon->_brojPolozenih < 10);
  198.     system("pause>0");
  199.     system("cls");
  200.     pokemon->GetPredmetiUPeriod();
  201.     cout << "\n";
  202.     pokemon->ispis();
  203.     cout << "\n";
  204.     pokemon->sortNaziv();
  205.     cout << "..:: SORT ::... \n\n";
  206.     for (int i = 0; i < pokemon->_brojPolozenih; i++) {
  207.         pokemon->_predmeti[i].ispisPredmeta();
  208.         cout << endl;
  209.     }
  210.     tekst pretraga;
  211.     cout << "\nUnesite naziv predmeta koji pretrazujete : ";
  212.     cin.getline(pretraga, 29);
  213.     if (pokemon->BinarnaPretraga(pretraga) == nullptr)
  214.         cout << "\nGreska! Ne postoji slican predmet u Bazi podataka!" << endl;
  215.     else {
  216.         cout << "\nPredmet pronadjen!\n\n";
  217.         pokemon->BinarnaPretraga(pretraga)->ispisPredmeta();
  218.     }
  219.     pokemon->dealloc();
  220.     delete pokemon;
  221.     pokemon = nullptr;
  222.  
  223.     system("pause>0");
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement