Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- struct Drzava {
- string naziv;
- string kontinent;
- int brStanovnika;
- };
- struct Grad {
- Drzava drzava;
- string naziv;
- int brStanovnika;
- };
- struct Stanovnik {
- string imePrezime;
- Grad grad;
- int godiste;
- bool zaposlen;
- //unosStanovnika cu staviti ovdje unutar strukture kako smo i radili do sada.
- //Mogla je biti i globalna funkcija koja bi primala referencu na stanovnika, te bi u njega unosila
- //jedina razlika je što se ovdje koristi ono this->, te se poziva sa stanovnik.unosStanovnika()
- //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)
- Stanovnik unosStanovnika() {
- //za svakog stanovnika uradi unos
- cout << "Unijeti ime i prezime stanovnika: ";
- //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.
- //sjeti se kako smo getline koristili za datoteku, isto se koristi i za cin
- string imePrezime;
- getline(cin, imePrezime);
- this->imePrezime = imePrezime;
- //prije prvog koristenja getline moramo izvrsiti ciscenje za cin
- cin.ignore(10000, '\n');
- //getline ce procitati do \n i to \n izbaciti nakon toga
- cout << "Unesite naziv drzave iz koje je stanovnik: ";
- // I naziv drzave moze imati vise rijeci, pa opet koristimo getline
- string drzava;
- getline(cin, drzava);
- this->grad.drzava.naziv = drzava;
- //isto vazi i za kontinent
- cout << "Unesite kontinent drzave: ";
- string kontinent;
- getline(cin, kontinent);
- this->grad.drzava.kontinent = kontinent;
- cout << "Unesite broj stanovnika drzave: ";
- cin >> this->grad.drzava.brStanovnika;
- //kada se unosi int, odnosno kada se radi kombinacijom getline i cin za unos
- //nakon unosa inta sa cin >>, karakter \n ostaje u unosu, te ce ga naredni poziv getline funkcije shvatiti kao kraj
- //da se to ne bi desilo, kada se koristi cin i getline zajedno, nakon svakog unosa broja radi se ciscenje
- cin.ignore(10000, '\n'); //ranije smo ovo radili pri unosu stringa - NAJBOLJE JE RADITI UVIJEK
- cout << "Unesite naziv grada iz kojeg je stanovnik: ";
- //isto sa getline jer moze imati vise rijeci pa da sve procitamo
- string grad;
- getline(cin, grad);
- this->grad.naziv = grad;
- cout << "Unesite broj stanovnika grada: ";
- cin >> this->grad.brStanovnika;
- cout << "Unesite godiste stanovnika: ";
- cin >> this->godiste;
- //stavit cemo da se unos ponavlja dok se ne unese 0 ili 1, odnosno dok ne bude ispravn
- int zaposlen;
- do {
- cout << "Da li je stanovnik zaposlen:" << endl;
- cout << " 0 = NE" << endl;
- cout << " 1 = DA" << endl;
- cout << "Odabir: ";
- cin >> zaposlen;
- } while (zaposlen < 0 || zaposlen > 1);
- //postavi kada je unos korektan
- this->zaposlen = (bool) zaposlen; //potrebno je uraditi konverziju iz int-a u bool
- }
- };
- //ovu funkciju cemo uraditi kao globalnu jer prima stanovnika kako je to zadano prema zadatku
- void ispisStanovnika(Stanovnik s) {
- cout << "--------------------------------------------------------------" << endl;
- cout << "Podaci o stanovniku:" << endl;
- cout << "Ime i prezime: " << s.imePrezime << endl;
- cout << "Grad: " << s.grad.naziv << " (" << s.grad.brStanovnika << " stanovnika)" << endl;
- cout << "Drzava: " << s.grad.drzava.naziv << " - " << s.grad.drzava.kontinent << " (" << s.grad.drzava.brStanovnika << " stanovnika)" << endl;
- //paziti ispod da se ne ispisuje godiste nego broj godina koji se dobije sa: 2020(trenutna godina) - godiste
- cout << "Godina: " << 2020 - s.godiste << endl;
- //trebamo ispisati da ili ne za zaposlenje pa provjerimo je li zaposlen
- string zaposlen;
- if (s.zaposlen == true)
- zaposlen = "DA";
- else
- zaposlen = "NE";
- cout << "Zaposlenje: " << zaposlen << endl;
- cout << "--------------------------------------------------------------" << endl;
- }
- //Kako i ova funkcija prima drzavu, mozemo je uraditi globalno
- int prirastajStanovnika(Drzava drzava, int n) {
- if (n < 1) {
- return drzava.brStanovnika;
- } else {
- drzava.brStanovnika = drzava.brStanovnika * 1.01; //1%
- prirastajStanovnika(drzava, n - 1); //paziti da se u naredni korak salje n - 1, a ne n
- }
- }
- //Funkcija za unos stanovnika koju smo uradili za potrebe prvog zadatka treba da se modifikuje tako da se unosi niz stanovnika
- //Kako ova funkcija prima niz stanovnika i njegovu veličinu (prema postavci), možemo je uraditi globalno
- //Potrebno je da se u niz stanovnika, koji je dinamicki alociran (new) u main-u, izvrsi unos svakog njegovog elementa (odnosno svakog stanovnika)
- //Napomena: niz se u funkciju može primiti sa Stanovnik *stanovnik ili sa Stanovnik stanovnik[] (U postavci je ovako)
- void unosStanovnika(Stanovnik *stanovnik, int n) {
- for (int i = 0; i < n; i++) {
- //prije prvog koristenja getline moramo izvrsiti ciscenje za cin
- cin.ignore(10000, '\n');
- //getline ce procitati do \n i to \n izbaciti nakon toga
- //za svakog stanovnika uradi unos
- cout << "Unijeti ime i prezime stanovnika: ";
- //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.
- //sjeti se kako smo getline koristili za datoteku, isto se koristi i za cin
- string imePrezime;
- getline(cin, imePrezime);
- stanovnik[i].imePrezime = imePrezime;
- cout << "Unesite naziv drzave iz koje je stanovnik: ";
- // I naziv drzave moze imati vise rijeci, pa opet koristimo getline
- string drzava;
- getline(cin, drzava);
- stanovnik[i].grad.drzava.naziv = drzava;
- //isto vazi i za kontinent
- cout << "Unesite kontinent drzave: ";
- string kontinent;
- getline(cin, kontinent);
- stanovnik[i].grad.drzava.kontinent = kontinent;
- cout << "Unesite broj stanovnika drzave: ";
- cin >> stanovnik[i].grad.drzava.brStanovnika;
- //kada se unosi int, odnosno kada se radi kombinacijom getline i cin za unos
- //nakon unosa inta sa cin >>, karakter \n ostaje u unosu, te ce ga naredni poziv getline funkcije shvatiti kao kraj
- //da se to ne bi desilo, kada se koristi cin i getline zajedno, nakon svakog unosa broja radi se ciscenje
- cin.ignore(10000, '\n'); //ranije smo ovo radili pri unosu stringa - NAJBOLJE JE RADITI UVIJEK
- cout << "Unesite naziv grada iz kojeg je stanovnik: ";
- //isto sa getline jer moze imati vise rijeci pa da sve procitamo
- string grad;
- getline(cin, grad);
- stanovnik[i].grad.naziv = grad;
- cout << "Unesite broj stanovnika grada: ";
- cin >> stanovnik[i].grad.brStanovnika;
- cout << "Unesite godiste stanovnika: ";
- cin >> stanovnik[i].godiste;
- //stavit cemo da se unos ponavlja dok se ne unese 0 ili 1, odnosno dok ne bude ispravn
- int zaposlen;
- do {
- cout << "Da li je stanovnik zaposlen:" << endl;
- cout << " 0 = NE" << endl;
- cout << " 1 = DA" << endl;
- cout << "Odabir: ";
- cin >> zaposlen;
- } while (zaposlen < 0 || zaposlen > 1);
- //postavi kada je unos korektan
- stanovnik[i].zaposlen = (bool) zaposlen; //potrebno je uraditi konverziju iz int-a u bool
- }
- }
- //funkcija selidba prima referencu na stanovnika, te stoga mijenja podatke direktno u poslanom stanovniku.
- void selidba(Stanovnik &stanovnik) {
- cout << "Promjena podataka za stanovnika: " << stanovnik.imePrezime << endl;
- cin.ignore(10000, '\n');
- cout << "Unesite naziv drzave u koju je preselio stanovnik: ";
- string drzava;
- getline(cin, drzava);
- stanovnik.grad.drzava.naziv = drzava;
- cout << "Unesite kontinent drzave: ";
- string kontinent;
- getline(cin, kontinent);
- stanovnik.grad.drzava.kontinent = kontinent;
- cout << "Unesite broj stanovnika drzave: ";
- cin >> stanovnik.grad.drzava.brStanovnika;
- cin.ignore(10000, '\n');
- cout << "Unesite naziv grada u koji je preselio stanovnik: ";
- string grad;
- getline(cin, grad);
- stanovnik.grad.naziv = grad;
- cout << "Unesite broj stanovnika grada: ";
- cin >> stanovnik.grad.brStanovnika;
- cin.ignore(10000, '\n');
- }
- int main() {
- int n;
- cout << "Unesite broj stanovnika za unijeti: ";
- cin >> n;
- //alokacija niza od n stanovnika
- Stanovnik *stanovnici = new Stanovnik[n];
- //poziv funkcije koja radi unos stanovnika jednog po jednog
- //Ovdje radimo unos svih stanovnika i for petlja je u samoj funkciji
- unosStanovnika(stanovnici, n);
- //Ispis svih stanovnika
- //Cim je "svih" znaci da mora for petlja, ali se ona ne nalazi u funkciji, pa je moramo pisati ovdje
- for (int i = 0; i < n; i++) {
- //gledamo sta funkcija ispisStanovnika prima i to joj i saljemo
- //funkcija prima jednog stanovnika pa joj mi u svakoj iteraciji petlje saljemo i-tog
- ispisStanovnika(stanovnici[i]);
- }
- //Kao primjer, izvrsit cemo preseljenje posljednjeg stanovnika u nizu
- selidba(stanovnici[n-1]);
- //Kako bi potvrdili da je uspjesno
- cout << "Korisnik je uspjesno preselio, novi podaci su prikazani u nastavku." << endl;
- ispisStanovnika(stanovnici[n-1]);
- //dealokacija alociranog niza
- delete[] stanovnici;
- return 0;
- }
- /*
- Iz ovog zadatka, vazno je nauciti razlikovati unos sa getline(cin, linija) i sa samo cin.
- Ovi unosi se razlikuju po tome sto getline iz prostora za unos uklanja i \n, ali ga ne smjesta u podatak,
- dok samo cin ostavlja to \n u bufferu (prostoru za unos).
- Dakle nakon cin je potrebno raditi cin.ignore, dok se nakon getline to ne radi.
- Getline služi za unos cijele linije (npr. Bosna i Hercegovina). Da smo koristili samo cin >> drzava, unijeli bi samo Bosna,
- dok bi "i Hercegovina" ostalo u bufferu.
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement