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:
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:
|
||||||||
|