Untitled

mail@pastecode.io avatar
unknown
plain_text
3 years ago
3.7 kB
17
Indexable
Never
#include <iostream>
using namespace std;

int x = 0;
int brojac = 0;

struct Datum
{
	int dan, mjesec, godina;
	bool Validiraj(); //provjera je li datum validan (moguć)
	void Unos(); //unos svih obilježja objekta
	void Ispis(); //ispis svih obilježja objekta

};


bool Datum::Validiraj()
{
	int min = 1, max = 31;

	if (godina < 1981 || godina>2003)
		return false;
	if (mjesec < 1 || mjesec>12)
		return false;

	if (mjesec == 2)
	{
		if ((godina % 4 == 0 || godina%400==0) && (godina % 100 != 0))
			max = 29;
		else max = 28;
	}
	else
		if ((mjesec == 4 || mjesec == 6 || mjesec == 9 || mjesec == 11))
			max = 30;
		else max = 31;

	if (dan >= min && dan <= max)
		return true;

	return false;
}

void Datum::Unos()
{
	cout << "\nUnesite dan >> ", cin >> dan;
	cout << "Unesite mjesec >> ", cin >> mjesec;
	cout << "Unesite godinu >> ", cin >> godina;
}

void Datum::Ispis()
{
	//cout << "Dan je >> ", cout << dan;
	//cout << "Mjesec je >> ", cout << mjesec;
	//cout << "Godina je >> ", cout << godina;

	cout << dan << "." << mjesec << "." << godina << ".";
}

struct Student
{
	int IB;
	char ImePrezime[20];
	Datum datumRodjenja;
};

void Unos(Student* niz, int max)
{ /*funkcija treba omogućiti incijalizaciju vrijednosti svih obilježja svih objekata koji se nalaze u nizu */
	
	for (int i = 0; i < max; i++)
	{
		cout << "\t == UNOS == " << endl;
		cout << "\nUnesite broj indexa za " << ++x << ". studenta >>> ", cin >> (*(niz+i)).IB;
		cin.ignore();
		cout << "\nUnesite ime i prezime " << x << ". studenta >>> ", cin.getline((niz + i)->ImePrezime, 20);
		cout << "Unesite datum rodjenja " << x << "studenta >>> ", (niz + i)->datumRodjenja.Unos();
				
	}
}

void IspisPogresnih(Student* niz, int max)
{
	for (int i = 0; i < max; i++)
	{
		cout << "\n";
		cout << "\nBroj Indexa :" << (niz+i)->IB;
		cout << "\nIme i prezime :" << (niz + i)->ImePrezime;
		cout << "\nDatum rodjenja "; (niz + i)->datumRodjenja.Ispis();
		cout << "\n";
	}
}

Student* GetStudentSGreškom(Student* niz, int max)
{

	/*funkcija treba vratiti pokazivač na niz unutar kojeg su pohranjeni (izdvojeni )samo 	oni objekti  (tipa student) kojima je pogrešno evidentiran datum rođenja; 
	Validan datum rođenja podrazumijeva:
	1. mjeseci:januar, mart, maj, juli, august, oktobar i decembar imaju 31. dan
	2. mjesec februar ima 28 odnosno 29 dana ovisno o tome je li godina prijestupna ili nije
	3. mjeseci koji nisu obuhvaćeni pod 1. i 2. imaju 30 dana
	4. Student ne smije biti mlađi od 18 niti stariji od 27 godina;
	*/
	
	// prebrojavanje "defektivnih" datuma
	for (int i = 0; i < max; i++)
	{
		if (((niz + i)->datumRodjenja.Validiraj()) != true)
			brojac++;
	}
	
	Student* nizPogresnih = new Student[brojac];

	int j = 0;

	for (int i = 0; i < max; i++)
	{
		if (((niz + i)->datumRodjenja.Validiraj()) != true)
		{
			*(nizPogresnih + j) = *(niz + i);
			j++;
		}
	}

	return nizPogresnih;

}

void main()

{
	/*
	omogućiti korisniku da odredi broj studenta
	omogućiti incijalizaciju obilježja za sve studente
	ispisati sve podatke o studentima kojima je datum rođenja pogrešno evidentiran
	*/

	int brStudenata;
	cout << "Koliko zelite unijeti studenata? >>> ", cin >> brStudenata;

	Student* nizStudenata = new Student[brStudenata];
	Unos(nizStudenata, brStudenata);

	Student* Pointer = GetStudentSGreškom(nizStudenata, brStudenata);
	cout << "\t == ISPIS POGRESNIH ==" << endl;
	IspisPogresnih(Pointer, brojac);

	delete[]nizStudenata;
	nizStudenata = nullptr;

	delete (Pointer);
	Pointer = nullptr;
	

}