Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. struct Drzava {
  9.     string naziv;
  10.     string kontinent;
  11.     int brStanovnika;
  12. };
  13.  
  14. struct Grad {
  15.     Drzava drzava;
  16.     string naziv;
  17.     int brStanovnika;
  18. };
  19.  
  20. struct Stanovnik {
  21.     string imePrezime;
  22.     Grad grad;
  23.     int godiste;
  24.     bool zaposlen;
  25.     //unosStanovnika cu staviti ovdje unutar strukture kako smo i radili do sada.
  26.     //Mogla je biti i globalna funkcija koja bi primala referencu na stanovnika, te bi u njega unosila
  27.     //jedina razlika je što se ovdje koristi ono this->, te se poziva sa stanovnik.unosStanovnika()
  28.     //Osim toga, onako kako je on napisao, odnosno da funkcija ne prima ništa a vraća stanovnika može samo unutar strukture (da to ispoštujemo)
  29.     Stanovnik unosStanovnika() {
  30.         //za svakog stanovnika uradi unos
  31.         cout << "Unijeti ime i prezime stanovnika: ";
  32.         //kada bi uradili cin >> this->imePrezime, tada bi procitali iz unosa samo prvu rijec do razmaka. Ako zelimo procitati sve uneseno to radimo sa getline.
  33.         //sjeti se kako smo getline koristili za datoteku, isto se koristi i za cin
  34.         string imePrezime;
  35.         getline(cin, imePrezime);
  36.         this->imePrezime = imePrezime;
  37.        
  38.        
  39.         //prije prvog koristenja getline moramo izvrsiti ciscenje za cin
  40.         cin.ignore(10000, '\n');
  41.         //getline ce procitati do \n i to \n izbaciti nakon toga
  42.        
  43.         cout << "Unesite naziv drzave iz koje je stanovnik: ";
  44.         // I naziv drzave moze imati vise rijeci, pa opet koristimo getline
  45.         string drzava;
  46.         getline(cin, drzava);
  47.         this->grad.drzava.naziv = drzava;
  48.        
  49.         //isto vazi i za kontinent
  50.         cout << "Unesite kontinent drzave: ";
  51.         string kontinent;
  52.         getline(cin, kontinent);
  53.         this->grad.drzava.kontinent = kontinent;
  54.        
  55.         cout << "Unesite broj stanovnika drzave: ";
  56.         cin >> this->grad.drzava.brStanovnika;
  57.         //kada se unosi int, odnosno kada se radi kombinacijom getline i cin za unos
  58.         //nakon unosa inta sa cin >>, karakter \n ostaje u unosu, te ce ga naredni poziv getline funkcije shvatiti kao kraj
  59.         //da se to ne bi desilo, kada se koristi cin i getline zajedno, nakon svakog unosa broja radi se ciscenje
  60.         cin.ignore(10000, '\n'); //ranije smo ovo radili pri unosu stringa - NAJBOLJE JE RADITI UVIJEK
  61.        
  62.         cout << "Unesite naziv grada iz kojeg je stanovnik: ";
  63.         //isto sa getline jer moze imati vise rijeci pa da sve procitamo
  64.         string grad;
  65.         getline(cin, grad);
  66.         this->grad.naziv = grad;
  67.        
  68.         cout << "Unesite broj stanovnika grada: ";
  69.         cin >> this->grad.brStanovnika;
  70.        
  71.         cout << "Unesite godiste stanovnika: ";
  72.         cin >> this->godiste;
  73.        
  74.         //stavit cemo da se unos ponavlja dok se ne unese 0 ili 1, odnosno dok ne bude ispravn
  75.         int zaposlen;
  76.         do {
  77.             cout << "Da li je stanovnik zaposlen:" << endl;
  78.             cout << " 0 = NE" << endl;
  79.             cout << " 1 = DA" << endl;
  80.             cout << "Odabir: ";
  81.             cin >> zaposlen;
  82.         } while (zaposlen < 0 || zaposlen > 1);
  83.         //postavi kada je unos korektan
  84.         this->zaposlen = (bool) zaposlen; //potrebno je uraditi konverziju iz int-a u bool
  85.     }
  86. };
  87.  
  88.  
  89. //ovu funkciju cemo uraditi kao globalnu jer prima stanovnika kako je to zadano prema zadatku
  90. void ispisStanovnika(Stanovnik s) {
  91.     cout << "--------------------------------------------------------------" << endl;
  92.     cout << "Podaci o stanovniku:" << endl;
  93.     cout << "Ime i prezime: " << s.imePrezime << endl;
  94.     cout << "Grad: " << s.grad.naziv << " (" << s.grad.brStanovnika << " stanovnika)" << endl;
  95.     cout << "Drzava: " << s.grad.drzava.naziv << " - " << s.grad.drzava.kontinent << " (" << s.grad.drzava.brStanovnika << " stanovnika)" << endl;
  96.     //paziti ispod da se ne ispisuje godiste nego broj godina koji se dobije sa: 2020(trenutna godina) - godiste
  97.     cout << "Godina: " << 2020 - s.godiste << endl;
  98.     //trebamo ispisati da ili ne za zaposlenje pa provjerimo je li zaposlen
  99.     string zaposlen;
  100.     if (s.zaposlen == true)
  101.         zaposlen = "DA";
  102.     else
  103.         zaposlen = "NE";
  104.     cout << "Zaposlenje: " << zaposlen << endl;
  105.     cout << "--------------------------------------------------------------" << endl;
  106. }
  107.  
  108. //Kako i ova funkcija prima drzavu, mozemo je uraditi globalno
  109. int prirastajStanovnika(Drzava drzava, int n) {
  110.     if (n < 1) {
  111.         return drzava.brStanovnika;
  112.     } else {
  113.         drzava.brStanovnika = drzava.brStanovnika * 1.01; //1%
  114.         prirastajStanovnika(drzava, n - 1); //paziti da se u naredni korak salje n - 1, a ne n
  115.     }
  116. }
  117.  
  118.  
  119. //Funkcija za unos stanovnika koju smo uradili za potrebe prvog zadatka treba da se modifikuje tako da se unosi niz stanovnika
  120. //Kako ova funkcija prima niz stanovnika i njegovu veličinu (prema postavci), možemo je uraditi globalno
  121. //Potrebno je da se u niz stanovnika, koji je dinamicki alociran (new) u main-u, izvrsi unos svakog njegovog elementa (odnosno svakog stanovnika)
  122. //Napomena: niz se u funkciju može primiti sa Stanovnik *stanovnik ili sa Stanovnik stanovnik[] (U postavci je ovako)
  123. void unosStanovnika(Stanovnik *stanovnik, int n) {
  124.     for (int i = 0; i < n; i++) {
  125.        
  126.         //prije prvog koristenja getline moramo izvrsiti ciscenje za cin
  127.         cin.ignore(10000, '\n');
  128.         //getline ce procitati do \n i to \n izbaciti nakon toga
  129.        
  130.         //za svakog stanovnika uradi unos
  131.         cout << "Unijeti ime i prezime stanovnika: ";
  132.         //kada bi uradili cin >> this->imePrezime, tada bi procitali iz unosa samo prvu rijec do razmaka. Ako zelimo procitati sve uneseno to radimo sa getline.
  133.         //sjeti se kako smo getline koristili za datoteku, isto se koristi i za cin
  134.         string imePrezime;
  135.         getline(cin, imePrezime);
  136.         stanovnik[i].imePrezime = imePrezime;
  137.        
  138.         cout << "Unesite naziv drzave iz koje je stanovnik: ";
  139.         // I naziv drzave moze imati vise rijeci, pa opet koristimo getline
  140.         string drzava;
  141.         getline(cin, drzava);
  142.         stanovnik[i].grad.drzava.naziv = drzava;
  143.        
  144.         //isto vazi i za kontinent
  145.         cout << "Unesite kontinent drzave: ";
  146.         string kontinent;
  147.         getline(cin, kontinent);
  148.         stanovnik[i].grad.drzava.kontinent = kontinent;
  149.        
  150.         cout << "Unesite broj stanovnika drzave: ";
  151.         cin >> stanovnik[i].grad.drzava.brStanovnika;
  152.         //kada se unosi int, odnosno kada se radi kombinacijom getline i cin za unos
  153.         //nakon unosa inta sa cin >>, karakter \n ostaje u unosu, te ce ga naredni poziv getline funkcije shvatiti kao kraj
  154.         //da se to ne bi desilo, kada se koristi cin i getline zajedno, nakon svakog unosa broja radi se ciscenje
  155.         cin.ignore(10000, '\n'); //ranije smo ovo radili pri unosu stringa - NAJBOLJE JE RADITI UVIJEK
  156.        
  157.         cout << "Unesite naziv grada iz kojeg je stanovnik: ";
  158.         //isto sa getline jer moze imati vise rijeci pa da sve procitamo
  159.         string grad;
  160.         getline(cin, grad);
  161.         stanovnik[i].grad.naziv = grad;
  162.        
  163.         cout << "Unesite broj stanovnika grada: ";
  164.         cin >> stanovnik[i].grad.brStanovnika;
  165.        
  166.         cout << "Unesite godiste stanovnika: ";
  167.         cin >> stanovnik[i].godiste;
  168.        
  169.         //stavit cemo da se unos ponavlja dok se ne unese 0 ili 1, odnosno dok ne bude ispravn
  170.         int zaposlen;
  171.         do {
  172.             cout << "Da li je stanovnik zaposlen:" << endl;
  173.             cout << " 0 = NE" << endl;
  174.             cout << " 1 = DA" << endl;
  175.             cout << "Odabir: ";
  176.             cin >> zaposlen;
  177.         } while (zaposlen < 0 || zaposlen > 1);
  178.         //postavi kada je unos korektan
  179.         stanovnik[i].zaposlen = (bool) zaposlen; //potrebno je uraditi konverziju iz int-a u bool
  180.     }
  181. }
  182.  
  183.  
  184. //funkcija selidba prima referencu na stanovnika, te stoga mijenja podatke direktno u poslanom stanovniku.
  185. void selidba(Stanovnik &stanovnik) {
  186.     cout << "Promjena podataka za stanovnika: " << stanovnik.imePrezime << endl;
  187.    
  188.     cin.ignore(10000, '\n');
  189.    
  190.     cout << "Unesite naziv drzave u koju je preselio stanovnik: ";
  191.     string drzava;
  192.     getline(cin, drzava);
  193.     stanovnik.grad.drzava.naziv = drzava;
  194.    
  195.     cout << "Unesite kontinent drzave: ";
  196.     string kontinent;
  197.     getline(cin, kontinent);
  198.     stanovnik.grad.drzava.kontinent = kontinent;
  199.    
  200.     cout << "Unesite broj stanovnika drzave: ";
  201.     cin >> stanovnik.grad.drzava.brStanovnika;
  202.     cin.ignore(10000, '\n');
  203.    
  204.     cout << "Unesite naziv grada u koji je preselio stanovnik: ";
  205.     string grad;
  206.     getline(cin, grad);
  207.     stanovnik.grad.naziv = grad;
  208.    
  209.     cout << "Unesite broj stanovnika grada: ";
  210.     cin >> stanovnik.grad.brStanovnika;
  211.     cin.ignore(10000, '\n');
  212. }
  213.  
  214.  
  215. int main() {
  216.     int n;
  217.     cout << "Unesite broj stanovnika za unijeti: ";
  218.     cin >> n;
  219.     //alokacija niza od n stanovnika
  220.     Stanovnik *stanovnici = new Stanovnik[n];
  221.     //poziv funkcije koja radi unos stanovnika jednog po jednog
  222.     //Ovdje radimo unos svih stanovnika i for petlja je u samoj funkciji
  223.     unosStanovnika(stanovnici, n);
  224.     //Ispis svih stanovnika
  225.     //Cim je "svih" znaci da mora for petlja, ali se ona ne nalazi u funkciji, pa je moramo pisati ovdje
  226.     for (int i = 0; i < n; i++) {
  227.         //gledamo sta funkcija ispisStanovnika prima i to joj i saljemo
  228.         //funkcija prima jednog stanovnika pa joj mi u svakoj iteraciji petlje saljemo i-tog
  229.         ispisStanovnika(stanovnici[i]);
  230.     }
  231.     //Kao primjer, izvrsit cemo preseljenje posljednjeg stanovnika u nizu
  232.     selidba(stanovnici[n-1]);
  233.     //Kako bi potvrdili da je uspjesno
  234.     cout << "Korisnik je uspjesno preselio, novi podaci su prikazani u nastavku." << endl;
  235.     ispisStanovnika(stanovnici[n-1]);
  236.    
  237.     //dealokacija alociranog niza
  238.     delete[] stanovnici;
  239.    
  240.     return 0;
  241. }
  242. /*
  243. Iz ovog zadatka, vazno je nauciti razlikovati unos sa getline(cin, linija) i sa samo cin.
  244. Ovi unosi se razlikuju po tome sto getline iz prostora za unos uklanja i \n, ali ga ne smjesta u podatak,
  245. dok samo cin ostavlja to \n u bufferu (prostoru za unos).
  246. Dakle nakon cin je potrebno raditi cin.ignore, dok se nakon getline to ne radi.
  247. Getline služi za unos cijele linije (npr. Bosna i Hercegovina). Da smo koristili samo cin >> drzava, unijeli bi samo Bosna,
  248. dok bi "i Hercegovina" ostalo u bufferu.
  249. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement