24.11.2.24012030. Proširiti klasu “Liga” razvijenu u zadatku 18.4 sa dvije nove metode “Snimi” i “Obnovi” koje će snimati kompletan sadržaj lige u datoteku pod imenom koje se zadaje kao parametar, kao i obnovu sadržaja lige iz datoteke zadanog imena. Nakon dodavanja te dvije metode, uklopiti klasu “Liga” i njoj pripadnu klasu “Tim” u funkcionalan program, koji korisniku nudi sljedeće opcije:

  1. Kreiranje nove lige
  2. Unos rezultata utakmica
  3. Ispis tabele
  4. Kraj rada
Na početku rada program treba da obnovi sadržaj lige iz datoteke, ukoliko ona postoji, a na završetku rada treba sačuvati sadržaj lige u datoteci, tako da sve ostvarene promjene budu dostupne prilikom sljedećeg pokretanja programa.

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
#include <cstring>
#include <algorithm>
#include <fstream>

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;
Tim(ifstream &ulaz);
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;
friend class Liga;
};

Tim::Tim(ifstream &ulaz){
  ulaz.read((char*)this, sizeof *this);
  if(!ulaz) throw "Nešto nije u redu sa èitanjem!\n";
}
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<<<<<<<<< br_timova; i++) {
        timovi[i] = new Tim(ulaz);
	    ulaz.read((char*)timovi[i], sizeof **timovi);
	  }
  if(!ulaz) throw "Nešto nije u redu sa èitanjem!\n";
}
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;iImeTima(),tim1)==0){t=false;j=i;break;}
    if(t)throw "error!";
        for(int i=0;iImeTima(),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<< br_timova; i++)
	    izlaz.write((char*)timovi[i], sizeof **timovi);
     if(!izlaz) throw "Nešto nije u redu sa upisom!\n";
}
void Liga::Obnovi(const char ime_dat[]){
ifstream ulaz(ime_dat, ios::in | ios::binary);
	  if(!ulaz) throw "Datoteka ne postoji!\n";
	  for(int i = 0; i < br_timova; i++) delete timovi[i];
	  delete[] timovi;
	  ulaz.read((char*)this, sizeof *this);
  timovi = new Tim*[max_br_timova];
  for(int i = 0; i < br_timova; i++) {
    timovi[i] = new Tim("Prvi");//mogao se pozvat i konstruktor od Tim-a
	    ulaz.read((char*)timovi[i], sizeof **timovi);
	  }
     if(!ulaz) throw "Nešto nije u redu sa èitanjem!\n";
}
  
int main(){
try{
//Ovdje testirati metode razvijene klase Liga...
}
catch(const char a[]){
cout<<a;
}
getch();
return 0;
} 

Ispis na ekranu:

Riješeni zadaci 2    Index