Laboratorium nr 13
Temat: Przeciążanie operatorów, funkcje i zmienne statyczne. Algorytm sortowania.
1. Koncepcja przeciążania operatorów w C++
W C++ można przeciążać istniejące operatory, to znaczy nadawać im nowe znaczenie dla operacji
wykonywanych częściowo lub w całości na obiektach typu klasa. Aby przeciążyć operator, np. „+”,
definiuje się funkcje o nazwie operator +, przy czym funkcje te muszą być funkcjami składowymi albo
zaprzyjaźnionymi z obiektami, na których działają. W C++ można przeciążać zarówno operatory
jednoargumentowe (np. ++) jak i dwuargumentowe (+). Należy przy tym ograniczyć się do przeciążania
istniejących operatorów, przy zachowaniu odpowiedniej liczby argumentów. Zwykle funkcja operatora
zwraca typ obiektu, na którym działa.
class klasa{
…
public:
klasa operator +();
…
}
Uwaga: do funkcji zaprzyjaźnionych nie jest przesyłany wskaźnik this, dlatego operatory te powinny
być zadeklarowane jako referencyjne. W takim przypadku przekazywany jest sam obiekt, a nie jego
kopia.
2. Funkcje i zmienne statyczne
•
Zmienne Static: dana składowa zadeklarowane w klasie jako static jest dzielone przez
wszystkie obiekty danej klasy. Istnieje nawet wtedy, kiedy nie istnieje żaden obiekt. Domyślną
wartością jest zero. Możliwa jest inicjalizacja jawna na zewnątrz klasy (nawet, jeżeli dana jest
prywatna) przy użyciu operatora zakresu:
private:
static int licznik;
•
Funkcje
Static
: jeżeli jakaś funkcja składowa ma działanie niezależne od obiektów swojej
klasy, można ją zadeklarować z atrybutem static. Funkcja taka może być następnie wywołana bez
wymieniania jakiegokolwiek obiektu, a jedynie poprzedzając jej nazwę nazwą klasy i operatorem
zakresu (::).
3. Algorytmy sortowania
Algorytm sortowania umożliwia uporządkowanie zbioru danych względem pewnych cech, np.
wartości każdego elementu:
●
liczby
●
słowa
Algorytmy sortowania dzieli się zazwyczaj na dwie grupy, tj. stabilne i niestabilne:
●
stabilne, np.:
○
bąbelkowe , tj.
porównywanie dwóch kolejnych elementów i zamiana ich kolejności
○
przez wstawianie
○
itp.
●
niestabilne, np.:
○
przez wybieranie
○
Shella
○
itp.
main.cpp
#include "klasa.h"
int main() {
class lista *baza;
baza=new lista();
baza->dodaj("Krzys","Nowak","1");
baza->dodaj("Grzes","Nowak","2");
baza->dodaj("Filip","Nowak","3");
baza->dodaj("Adam","Nowak","4");
baza->dodaj("Jan","Nowak","5");
baza->wyswietl();
baza->sortuj();
baza->wyswietl();
return 0;
};
klasa.h
#include <iostream>
#include <string.h>
using namespace std;
// klasa rekord
class rekord {
private:
public:
char imie[10];
char nazwisko[25];
char telefon[10];
class rekord *nastepny;
rekord(char *i,char *n,char *t);
rekord();
};
//klasa lista
class lista : public rekord {
private:
class rekord *pierwszy;
public:
void wyswietl();
void dodaj(char *i,char *n,char *t);
void sortuj();
lista(char *i="Imie", char
*n="Nazwisko", char *t="Telefon");
};
klasa.cpp
#include "klasa.h"
rekord::rekord(char *i, char *n, char *t){
strcpy(imie,i);
strcpy(nazwisko,n);
strcpy(telefon,t);
nastepny=NULL;
};
rekord::rekord(){};
void lista::wyswietl(){
class rekord *obiekt=this->pierwszy;
while (obiekt!=NULL) {
cout<<obiekt->imie<<"\t";
cout<<obiekt->nazwisko<<"\t";
cout<<obiekt->telefon<<"\n";
obiekt=obiekt->nastepny;
};
};
void lista::dodaj(char *i,char *n,char *t){
class rekord *obiekt=this->pierwszy;
while (obiekt->nastepny!=NULL) {
obiekt=obiekt->nastepny;
};
obiekt->nastepny=new rekord;
strcpy(obiekt->nastepny->imie,i);
strcpy(obiekt->nastepny->nazwisko,n);
strcpy(obiekt->nastepny->telefon,t);
obiekt->nastepny->nastepny=NULL;
};
void lista::sortuj(){
class rekord *obiekt1,*obiekt2;
char *i, *n, *t;
obiekt1=this->pierwszy->nastepny;
while (obiekt1->nastepny!=NULL){
obiekt2=this->pierwszy->nastepny;
while (obiekt2->nastepny!=NULL) {
if(strcmp((char*)obiekt2->imie,(char*)
obiekt2->nastepny->imie)==1){
i=new char [strlen(obiekt2->imie)+1];
n=new char [strlen(obiekt2->nazwisko)+1];
t=new char [strlen(obiekt2->telefon)+1];
strcpy(i,obiekt2->imie);
strcpy(n,obiekt2->nazwisko);
strcpy(t,obiekt2->telefon);
strcpy(obiekt2->imie,obiekt2->nastepny->
imie);
strcpy(obiekt2->nazwisko,obiekt2->
nastepny->nazwisko);
strcpy(obiekt2->telefon,obiekt2->
nastepny->telefon);
strcpy(obiekt2->nastepny->imie,i);
strcpy(obiekt2->nastepny->nazwisko,n);
strcpy(obiekt2->nastepny->telefon,t);
};
obiekt2=obiekt2->nastepny;
};
obiekt1=obiekt1->nastepny;
};
};
lista::lista(char *i, char *n, char *t) :
rekord(i,n,t){
this->pierwszy=this;
};
4. Zadanie: Zmodyfikuj program bazy danych z poprzednich ćwiczeń tak, aby umożliwiał sortowanie
rekordów po dowolnie wybranym polu oraz w wybranej kolejności, tzn. rosnąco lub malejąco.