Kolejny projekt przedmiot Programowanie Obiektowe. Zadanie brzmi następująco:
Stworzyć klasę modelującą zbiór elementów np. zbiór
A = { 1, 12, 16, 4, 5, 7, 7, 12, 3}
Umożliwić operacje na obiektach tej klasy, takie jak np.:
- suma zbiorów: suma A i B = { 0, 1, 4, 5, 8, 12, 16 }
- część wspólna: część wspólna A i B = { 5, 16 }
- wyprowadzania na urządzenie zewnętrzne
- wczytywania z urządzenia zewnętrznego.
Oraz inne operacje.
Przetestować podaną klasę.
Przygotowałem następującą klasę. Wiem, że ma ona kilka błędów i mogła by być doskonalsza. Niestety zabrakło mi już czasu na poprawki. Sesja trwa a przedmioty trzeba zaliczać ;)
zbior.h
/* * Grzegorz Bernaś * * OS: Ubuntu Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2006 Grzegorz Bernaś * Version 0.8 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ #ifndef _ZBIOR_H_ #define _ZBIOR_H_ #include <iostream> using namespace std; class zbior { private: /* * int * zbiorLiczb; * zmienna przechowuje zbior liczb w postaci tablicy */ int * zbiorLiczb; int zbiorNElementow; public: /* * zbior(); * tu będzie wywoływana metoda czytajZbior aby pobrać dane z klawiatury */ zbior(); /* * zbior(int z[], int e); * przeciążenie konstruktora dla dodawania */ zbior(int z[], int e); /* * ~zbior(); * destruktor */ ~zbior(); /* * void czytajZbior(); * metoda pobiera dane wpisane przez użytkownika jak elementy zbioru * przykład: 1 [enter], 2 [enter] ... */ void czytajZbior(); /* * ostream &operator<<(const zbior &z); * drukuje na ekran zbiór w postacie A = {1,2} */ friend ostream& operator<< (ostream& wyjscie, const zbior &z); /* * zbior operator*(zbior cwzbr); * drukuje na ekran część wpólną dla dwóch zbiorów * oraz przypisuje A część wspólną z A i B * np. A = A*B */ zbior operator*(const zbior & cwzbr); /* * zbior operator+(zbior zbr); * operator sumowania dwóch zbiorów */ zbior operator+(const zbior & zbr); }; #endif //_ZBIOR_H_
zbior.cpp
/* * Grzegorz Bernaś * * OS: Ubuntu Linux * Powered by Eclipse 3.1.2 * * Copyright (C) 2006 Grzegorz Bernaś * Version 0.8 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL * Zgadula is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. */ #include "zbior.h" #include <iostream> #include <algorithm> using namespace std; zbior::zbior() { cout << "Podaj ilość elementów zbioru: "; cin >> zbiorNElementow; zbiorNElementow; zbiorLiczb = new int [zbiorNElementow] ; czytajZbior(); } zbior::zbior(int z[], int e) { zbiorNElementow = e ; zbiorLiczb = new int [zbiorNElementow] ; for(int i = 0; i <= e-1; i++) { //cout << "DEBUG: zbiorLiczb[" << i << "]: " << z[i] << endl; zbiorLiczb[i] = z[i]; } } zbior::~zbior() { //cout << "DEBUG: destructor call" << endl; //delete [] zbiorLiczb; } void zbior::czytajZbior() { int i = 0; while ( i <= zbiorNElementow-1 ) { cout << "Podaj " << i << " element zbioru: "; cin >> zbiorLiczb[i]; i++; } } ostream& operator<< (ostream& wyjscie, const zbior &z) { wyjscie << "{"; for(int i = 0; i <= z.zbiorNElementow-1; i++) { wyjscie << z.zbiorLiczb[i]; if(i != z.zbiorNElementow-1) wyjscie << ","; } wyjscie << "}" << endl; return wyjscie; } zbior zbior::operator*(const zbior & cwzbr) { //cout << "DEBUG: operator* starts" << endl; int * buffor; int bKeys; // Maksymalna ilość elementów w tablicy int bKey = 0; // Iteracja tablicy wspólnej // Przypisz ile maksymalnie może zająć tablica (tyle ile ma najmniejszy zbiór) if(zbiorNElementow < cwzbr.zbiorNElementow) bKeys = zbiorNElementow; else bKeys = cwzbr.zbiorNElementow; //cout << "DEBUG: bKeys(" << bKeys << ")" << endl; buffor = new int [bKeys]; for (int i = 0; i <= zbiorNElementow-1; i++) { //cout << "DEBUG: operator*; for 1" << endl; for (int j = 0; j <= cwzbr.zbiorNElementow-1; j++) { //cout << "DEBUG: for2" << endl; if(zbiorLiczb[i] == cwzbr.zbiorLiczb[j]) { //cout << "DEBUG: for2 {if}" << endl; buffor[bKey] = zbiorLiczb[i]; bKey++; } } } //cout << "DEBUG: operator* ends" << endl; //cout << "DEBUG: buffor(" << buffor << ") il.elemen("<< bKey-1 << ")" << endl; zbior temp(buffor,bKey); return temp; } zbior zbior::operator+(const zbior & zbr) { //cout << "DEBUG: operator+ starts" << endl; int * buffor; int bKeys; // Maksymalna ilość elementów w tablicy int bKey = 0; // Iteracja tablicy wspólnej // Przypisz ile maksymalnie może zająć tablica bKeys = zbiorNElementow + zbr.zbiorNElementow; //cout << "DEBUG: bKeys(" << bKeys << ")" << endl; buffor = new int [bKeys]; for (int x = 0; x <= zbiorNElementow-1; x++) { buffor[bKey] = zbiorLiczb[x]; bKey++; } for (int i = 0; i <= zbr.zbiorNElementow-1; i++) { //cout << "DEBUG: operator*; for 1" << endl; for (int j = 0; j <= zbiorNElementow-1; j++) { if(zbiorLiczb[j] == zbr.zbiorLiczb[i]) break; else if((zbiorLiczb[j] != zbr.zbiorLiczb[i]) && (j == zbiorNElementow-1)) { buffor[bKey] = zbr.zbiorLiczb[i]; bKey++; } } } //cout << "DEBUG: operator* ends" << endl; //cout << "DEBUG: buffor(" << buffor << ") il.elemen("<< bKey-1 << ")" << endl; zbior temp(buffor,bKey); return temp; } int main() { zbior A; zbior B; cout << endl; cout << "Zbiór A=" << A; cout << "Zbiór B=" << B; cout << endl; zbior C = A*B; cout << "Operacja C = A*B wygenerowała zbiór: " << C ; cout << endl; int liczba = 3; int array[3] = {23,32,11}; zbior D(array,liczba); cout << "Zbiór D=" << D; int liczba2 = 3; int array_2[3] = {11,22,33}; zbior E(array_2,liczba2); cout << "Zbiór E=" << E; cout << endl; D = E * D; cout << "Operacja D = E * D wygenerowała zbiór: " << D; cout << endl; cout << "Zbiór D=" << D; cout << endl; D = E + D; cout << "Operacja D = E + D wygenerowała zbiór: " << D; cout << endl; cout << "//-----\tPodstumowanie\t-----//" << endl; cout << "Zbiór A=" << A; cout << "Zbiór B=" << B; cout << "Zbiór C=" << C; cout << "Zbiór D=" << D; cout << "Zbiór E=" << E; }