Laboratorium 3

 

2.d Przeorganizować sposób składowania danych w klasie Grupa

class Grupa

{

public:

Student*tab;

int liczba;  // liczba studentów – i niektórych int count;

int rozmiar; // rozmiar tablicy

 

bool zwiekszRozmiarTablicy(int nowyRozmiar);

/// reszta bez zmian !!!!

};

 

Wyzeruj nowe atrybuty w konstruktorze

// liczba, rozmiar i tab mają być zerowane w konstruktorze.

 

Implementacja funkcji, która rozszerza tablicę

 

bool Grupa::zwiekszRozmiarTablicy(int nowyRozmiar)

{

// Student *tmp = new Student[nowyRozmiar];

// jeśli rozmiar !=0 to przepisz zawartość tab do tmp

//  i usuń niepotrzebną tablice za pomocą operatora delete ( delete[] bo tablica)

// ustaw tab = tmp;  rozmiar=nowyRozmiar

}

 

Pierwszy etap

 

Drugi etap

 

 

2e Testujemy i zwiększamy rozmiar przy dodawaniu studentów

W funkcjach

bool add(Student&s)

bool add(const char*imie, const char*nazw, const char*nr)

należy sprawdzić czy liczba==rozmiar – w takim przypadku należy zwiększyć rozmiar tablicy

 

bool Grupa::add(...)

{

if(liczba==rozmiar){

bool ok = zwiekszRozmiarTablicy(rozmiar+10); // zwiększamy o 10

if(!ok) return false;

}

.... // reszta bez zmian

}

 

2.f Dodaj destruktor grupy

Destruktor musi być zaimplementowany, ponieważ klasa alokuje pamięć.

Group::~Group(){

      if(tab!=0)delete []tab;

}

2.f Przetestuj dodając kilku studentów do grupy i wypisując jej zawartość

2.g Zaimplementuj funkcję do odczytu zawartości grupy ze strumienia

void Group::read(istream&is)

{

 

for(;;){  // pętla nieskończona

     if(!is)break;

     Student st;

     // przeczytaj st ze strumienia

     // dodaj st do grupy (ewentualnie sprawdź wcześniej, czy nie ma pustej zawartości

}

}

 

2.g Przetestuj funkcję do odczytu

Wczytaj plik z danymi (grupa.txt) i wypisz zawartość grupy na ekranie

 

2.h. Dodaj funkcję w klasie Student

bool match(const char*key)const;

Funkcja poszukuje tekstu key w imieniu nazwisku i numerze indeksu.

Możesz użyć funkcji strstr()

 

 

2.i Dodaj funkcję w klasie Grupa

bool select(Grupa&wynik, const char*key)

Funkcja dodaje do grupy wynik wszystkich studentów, dla których wywołanie funkcji match(key) zwraca true.

 

2.j Zintegruj program.

1) odczytaj grupę z pliku

2) wprowadź szukany tekst

3) wypisz grupę powstałą w wyniku operacji select na ekranie oraz do pliku

 

void main()

{

Grupa gr;

//odczyt z pliku

Grupa wynik;

gr.select(wynik,”Daniel”);

wynik.write(cout);

 

}

 

 

 

 

Uwagi do wersji z godz. 12.30

 

grupa::grupa(const char *im,const char *naz, const char *nrA){

void grupa::write(ostream&os) const{

 int i;

 for(i=0;i < count; i++){

  os << tab[i].imie << " " << tab[i].nazwisko << " " << tab[i].nrAlb <<

endl;

 }

}

 

przez

void grupa::write(ostream&os) const{

 int i;

 for(i=0;i < count; i++){

tab[i].write(os);

}

}

 

bool grupa::add(const char *im, const char *naz, const char *nrA){

            if(count < SIZE){

                        strcpy(tab[count].imie,im);

                        strcpy(tab[count].nazwisko,naz);

                        strcpy(tab[count].nrAlb,nrA);

                        count++;

            }

            return true;

}

bool grupa::add(student&s){

            if(count < SIZE){

                        strcpy(tab[count].imie,s.imie);

                        strcpy(tab[count].nazwisko,s.nazwisko);

                        strcpy(tab[count].nrAlb,s.nrAlb);

                        count++;

            }

            return true;

}

przez

 

bool grupa::add(const char *im, const char *naz, const char *nrA){

      Student s(im,naz,nrA);

      return add(s);

}

bool grupa::add(student&s){

if(count==SIZE)return false;

tab[count]=s;

count++;

      return true;

}