24.11.2.24011840. Napisati klasu “Liga” koja se oslanja na klasu “Tim” napisanu u prethodnom zadatku. Klasa treba da ima privatne atribute “broj_timova” i “max_br_timova” koji čuvaju redom broj timova odnosno maksimalni dozvoljeni broj timova u ligi (atribut “max_br_timova” treba da bude konstantni atribut), kao i privatni atribut “timovi” koji će služiti za pristup dinamički alociranom nizu od “max_br_timova” elemenata, pri čemu je svaki element niza pokazivač na objekat tipa “Tim”. Interfejs klase treba da izgleda ovako: explicit Liga(int velicina_lige);
~Liga();
void DodajNoviTim(const char ime_tima[]);
void RegistrirajUtakmicu(const char tim1[], const char tim2[],
int rezultat_1, int rezultat_2);
void IspisiTabelu();
Konstruktor treba da izvrši dinamičku alokaciju memorije za prihvatanje onoliko timova koliko je navedeno parametrom, dok destruktor treba da izvrši oslobađanje svih resursa koje je klasa “Liga” alocirala tokom svog rada. Metoda “DodajNoviTim” kreira tim sa navedenim imenom i upisuje ga na prvo slobodno mjesto u ligu (pri tome se naravno broj timova u ligi povećava za jedinicu). Metoda ne smije da dozvoli upis više timova od maksimalno dozvoljenog broja timova. U metodi “RegistrirajUtakmicu” prva dva parametra predstavljaju imena timova koji su odigrali utakmicu, dok su treći i četvrti parametar broj golova koji su dali prvi i drugi tim respektivno. Ova metoda treba da ažurira rezultate u tabeli za oba tima, odnosno da baci izuzetak ukoliko timovi sa navedenim imenima ne postoje u tabeli. Konačno, metoda “IspisiTabelu” treba da ispiše tabelu lige sortiranu u opadajućem poretku po broju bodova. Ukoliko dva tima imaju isti broj poena, tada u tabeli prvo dolazi tim sa većom gol razlikom. Sortiranje vršite pozivom funkcije “sort”, uz pogodno definiranu funkciju kriterija, koju možete izvesti kao privatnu statičku funkciju članicu klase. Ispis treba vršiti pozivom metode “IspisiPodatke” iz klase “Tim”, tako da bi tabela trebala da ima izgled poput sljedećeg:
Čelik 18 11 5 1 34 10 38
Jedinstvo 18 9 4 5 33 20 31
Željezničar 18 9 4 5 25 19 31
Velež 18 8 6 4 23 24 30
Sarajevo 18 8 5 5 32 16 29
itd. Obavezno treba napisati i testni program u kojem ćete demonstrirati sve elemente razvijenih klasa (“Tim” i “Liga”), na manjem broju fiksnih timova (npr. liga od 6 elemenata) i rezultatima utakmica koji se unose sa tastature. Predvidjeti i hvatanje eventualno bačenih izuzetaka

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
#include <cstring>
#include <algorithm>
using namespace std;
//klasa Tim
class Tim{
char ime[20];
int broj_odigranih,broj_pobjeda,
broj_nerijesenih,broj_poraza,
broj_datih,broj_primljenih,broj_poena;
public:
Tim(const char ime[]){
    strcpy(Tim::ime,ime);
    broj_odigranih=broj_pobjeda=0;
    broj_nerijesenih=broj_poraza=0;
    broj_datih=broj_primljenih=broj_poena=0;
    }
void ObradiUtakmicu(int broj_datih, int broj_primljenih);
const char *ImeTima() const{
    return &ime[0];
    }
int BrojPoena() const{
    return broj_poena;
    }
int GolRazlika() const{
    return broj_datih-broj_primljenih;
    }
void IspisiPodatke() const;
};

void Tim::ObradiUtakmicu(int broj_datih, int broj_primljenih){
broj_odigranih++;
if(broj_datih>broj_primljenih){
    broj_pobjeda++;
    broj_poena+=3;
    }
else if(broj_datih<broj_primljenih)
    broj_poraza++;
else{
    broj_nerijesenih++;
    broj_poena+=1;
    }
Tim::broj_datih+=broj_datih;
Tim::broj_primljenih+=broj_primljenih;  
}    
void Tim::IspisiPodatke()const{
cout<<ImeTima();
cout.width(20-int(strlen(ImeTima())));
cout<<broj_odigranih;
cout.width(4);cout<<broj_pobjeda;
cout.width(4);cout<<broj_nerijesenih;
cout.width(4);cout<<broj_poraza;
cout.width(4);cout<<broj_datih;
cout.width(4);cout<<broj_primljenih;
cout.width(4);cout<<BrojPoena();
}
//klasa Liga
class Liga{
int br_timova;
const int max_br_timova;
Tim **timovi;
static bool kriterij(Tim *a,Tim *b);
public:
explicit Liga(int velicina_lige):br_timova(0),
    max_br_timova(velicina_lige),timovi(new Tim*[velicina_lige]){
    for(int i=0;i<max_br_timova;i++)timovi[i]=0;
    }
~Liga(){
	for(int i=0;i<max_br_timova;i++)delete timovi[i];
	delete timovi;
	}
void DodajNoviTim(const char ime_tima[]){    
    if(br_timova==max_br_timova)throw "puna liga";
    else {
    timovi[br_timova++]=new Tim(ime_tima);   
    }
}
void RegistrirajUtakmicu(const char tim1[], const char tim2[], 
    int rezultat_1, int rezultat_2);
void IspisiTabelu();
friend class Tim;      	
};

void Liga::RegistrirajUtakmicu(const char tim1[], const char tim2[], 
            int rezultat_1, int rezultat_2){
    bool t(true),t2(true);
    int j(0),j2(0);
    for(int i=0;i<br_timova;i++)
        if(strcmp(timovi[i]->ImeTima(),tim1)==0){t=false;j=i;break;}
    if(t)throw "error!";
        for(int i=0;i<br_timova;i++)
        if(strcmp(timovi[i]->ImeTima(),tim2)==0){t2=false;j2=i;break;}
    if(t2)throw "error!";    
    timovi[j]->ObradiUtakmicu(rezultat_1,rezultat_2);
    timovi[j2]->ObradiUtakmicu(rezultat_2,rezultat_1);
}
bool Liga::kriterij(Tim *a,Tim *b){
if((a->BrojPoena())>(b->BrojPoena()))return true;
if((a->BrojPoena())==(b->BrojPoena())){
    if((a->GolRazlika())>=(b->GolRazlika()))return true;
   return false;
    }
return false;
}
void Liga::IspisiTabelu(){
    sort(timovi,timovi+br_timova,kriterij);
   cout<<endl;
for(int i=0;i<br_timova;i++){
    timovi[i]->IspisiPodatke();
    cout<<endl;
    }
}
  
int main(){
try{
//Ovdje testirati razvijenu klasu...
}
catch(...){
cout<<"nema memorije!";
}
getch();
return 0;
}   

Ispis na ekranu:

Riješeni zadaci 2    Index