KLASA UCZEN Napisz deklarację klasy Uczen, w której przechowujemy następujące informacje o uczniu: imię, nazwisko, średnia (pola prywatne), poza tym klasa zawiera metody: konstruktor bezparametrowy (nie robi nic) konstruktor ustalający pola prywatne klasy na podstawie jego parametrów metoda Ustaw ustalająca pola prywatne klasy zgodnie z wartościami jej parametrów oraz metody zwracające wartości poszczególnych pól metoda Wyswietl wyświetlająca na ekranie dane osobowe ucznia metoda logiczna Lepszy, porównująca średnią ucznia na którym wykonujemy metodę ze średnią drugiego ucznia przekazanego jako parametr do funkcji. Zwraca wartość true, gdy obiekt na rzecz którego jest wykonana metoda ma lepszą średnią metoda logiczna Promowany określająca na podstawie średniej czy uczeń jest promowany do następnej klasy. Napisz implementację powyższych metod.
KLASA UCZEN Schemat naszego pliku #include<iostream> using namespace std; class Klasa private: //deklaracja pól i ewentualnych metod prywatnych: //Typ nazwa_pola public: //deklaracja lub definicja metod publicznych klasy i konstruktorów //definicje konstruktorów i metod np.konstruktor //bezparametrowy, który nie robi nic Klasa() ; int main() //wykorzystanie Klasy
KLASA UCZEN Zaczynamy zatem pisać deklarację naszej klasy Uczen. Określmy pola klasy #include<iostream> #include<string> using namespace std; //deklaracja klasy class Uczen private: //pola klasy opisują dane, które zawarte będą w każdym //obiekcie klasy string imie; string nazwisko; float srednia; public: ;
Klasa Uczen - metody Metody definiują zbiór operacji, jakie na tych danych będzie można wykonywać. Deklaracja metody ma postać deklaracji funkcji, tyle że zawarta jest wewnątrz definicji klasy. Tak jak dla zwykłych funkcji, deklaracja może być połączona z definicją. Można też, z podobnym skutkiem, wewnątrz klasy tylko metodę zadeklarować, a zdefiniować ją już poza klasą, w definicji odwołując się do niej poprzez nazwę kwalifikowaną operatorem zakresu klasy (np. Klasa::), bo przecież mogłoby istnieć wiele niezwiązanych ze sobą metod o tej samej nazwie w różnych klasach.
Klasa Uczen Konstruktor w programowaniu obiektowym to specjalna metoda o nazwie zgodnej z nazwą klasy, wywoływana podczas tworzenia jej instancji (obiektów tej klasy). (Jeśli w klasie nie zdefiniujemy konstruktorów to mamy do dyspozycji domyślny(bezparametrowy) konstruktor. Zawsze możemy w main zadeklarować, np. Uczen jankowalski) Dodajmy do naszej klasy konstruktory: public: //konstruktor bezparametrowy nie robi nic- //zdefiniujemy go od razu w klasie Uczen() //konstruktor ustalający pola prywatne klasy na podstawie //jego parametrów Uczen(string aimie, string anazwisko,float asrednia); ;//koniec deklaracji klasy Zaimplementujmy drugi konstruktor poniżej (pomiędzy deklaracją klasy a funkcją main(), lub pod funkcją main())
Klasa Uczen class Uczen...; //implementacja metod klasy Uczen Uczen:: Uczen(string aimie, string anazwisko,float asrednia) //ustawiamy pola naszej klasy zgodnie z parametrami imie = aimie; nazwisko = anazwisko; srednia = asrednia; int main()
Klasa Uczen- metoda Ustaw Dodajemy kolejna metodę w klasie: //metoda Ustaw ustalająca pola prywatne klasy zgodnie //z wartościami jej parametrów void Ustaw(string aimie, string anazwisko,float asrednia); a następnie jej impelmentację poiżej implementacji konstruktorów void Uczen::Ustaw(string aimie, string anazwisko,float asrednia) imie = aimie; nazwisko = anazwisko; srednia = asrednia; //implementacja wygląda tak samo jak zwykłego konstruktora, // ale to jest metoda, ona nie tworzy obiektu
Klasa Uczen metody zwracające pola Napiszemy teraz metody zwracające wartości poszczególnych pól (get) string ZwrocImie() const; string ZwrocNazwisko() const; float ZwrocSrednia() const; IMPLEMENTACJA string Uczen::ZwrocImie() const return imie; string Uczen::ZwrocNazwisko() const return nazwisko; float Uczen::ZwrocSrednia() const return srednia;
Klasa Uczen- metoda Wyswietl W klasie dopisujemy kolejną metodę: //metoda Wyswietl wyświetlająca na ekranie dane osobowe ucznia void Wyswietl() const; //const bo metoda nie zmienia pol klasy,jak wszystkie // poprzednie metody IMPLEMENTACJA Poniżej zamieszczamy implementację: void Uczen::Wyswietl() const cout<<"imie "<<imie<<endl; cout<<"nazwisko "<<nazwisko<<endl; cout<<"srednia "<<srednia<<endl;
Klasa Uczen- Lepszy //metoda logiczna Lepszy, porównująca średnią ucznia //na którym wykonujemy metodę ze średnią drugiego ucznia // przekazanego jako parametr do funkcji. //Zwraca wartość true, gdy obiekt na rzecz którego jest // wykonana metoda ma lepszą średnią bool Lepszy( Uczen u) const; //parametr przekazujemy przez wartość, bo go nie zmieniamy //tylko korzystamy z jego wartości //można w takim przypadku przez stałą referencję (zalecane) //bool Lepszy(const Uczen & u) const; IMPLEMENTACJA: bool Uczen::Lepszy(Uczen u) const return srednia > u.srednia;
Klasa Uczen metoda Promowany //metoda logiczna Promowany określająca na podstawie // średniej czy uczeń jest promowany do następnej klasy bool Promowany() const; IMPLEMENTACJA: bool Uczen::Promowany() const return srednia>=3; Możemy teraz przejść do metody main i stworzyć obiekty naszej klasy
Klasa Uczen f-cja main() int main(int argc, char* argv[]) //tworzymy ucznia przy pomocy konstruktora // bezparametrowego Uczen ucz1; //ustawiamy dane ucznia przy pomocy metody Ustaw ucz1.ustaw("jan", "Kowalski", 4.0); //wyswietlamy kontrolnie dane ucznia ucz1.wyswietl(); //tworzymy drugiego ucznia przy pomocy //konstruktora z paparmetrami Uczen ucz2("pawel", "Nowak", 3.5); ucz2.wyswietl();
Klasa Uczen funkcja main() //porownanie uczniow przy pomocy metody Lepszy if(ucz1.lepszy(ucz2)) cout<<"lepszy uczen to: "<<endl; ucz1.wyswietl(); else cout<<"lepszy uczen to: "<<endl; ucz2.wyswietl();
Klasa Uczen funkcja main() //sprawdzamy uczniow czy sa promowani cout<<"lista uczniow promowanych:"<<endl; if(ucz1.promowany()) ucz1.wyswietl(); if(ucz2.promowany()) ucz2.wyswietl(); system("pause"); return 0;
Funkcje z klasami jako parametry Tak jak robilismy to przy strukturach w naszych programach możemy pisać funkcjie operujące na zmiennych typu klasowego- obiektach. Napiszmy funkcję, która dla przekazanych przez parametry dwóch uczniów zwraca w wyniku nazwisko ucznia o wyzszej średniej, a imię tego ucznia przekazuje przez parametr. Funkcję zapiszemy pomiedzy implementacją metod naszej klasy a funkcja main(): string MaxSrednia(Uczen u1, Uczen u2, string & im) if (u1.zwrocsrednia()> u2.zwrocsrednia()) im = u1.zwrocimie();//nadajemy wartosc parametrowi im return u1.zwrocnazwisko(); else im = u2.zwrocimie();//nadajemy wartosc parametrowi im return u2.zwrocnazwisko();
Funkcje z klasami jako parametry string MaxSrednia(Uczen u1, Uczen u2, string & im) Funkcja ma zwrócić imię i nazwisko, nazwisko jest wynikiem funkcji dlatego funkcja jest typu string, a imię zwracamy przezdodatkowy parametr, dlatego przekazujemy go przez referencje (gdyż wewnatrz funkcji nadamy temu parametrowi wartość, bez & prametr przekazany byłby przez wartość, czyli działalibysmy na kopii) Wewnatrz funkcji nie możemy sięgać do pól klasy (jak to robiliśmy przy strukturach), gdyż są one prywatne. Korzystamy z odpowiednich metod klasy. Odwołujemy się do nich przez. ObiektKlasy.Metoda(lista parametrów); np. u1.zwrocsrednia(); Powyższą funkcję możemy wykorzystać w funkcji main(): string i, n= MaxSrednia(ucz1, ucz2, i); cout<<"uczen o wyzszej sredniej to :" <<i<<" "<<n<<endl;