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 W ubiegłym tygodniu klasę definiowaliśmy w osobnym pliku 1)File->New->Other-> Console wizard plik główny zawierający funkcję main() 2)File->New->Unit plik w którym zapisywana jest klasa. Nadaliśmy mu nazwę taką jak klasa która jest w nim zapisana np. punkt.cpp 3) Unit składa się z dwóch plików: -punkt.h w którym zapisujemy deklaracje klasy tj. pola i nagłówki metod -punkt.cpp w którym definiujemy metody klasy Punkt, poprzedzając je nazawą klasy z operatorem zasięgu 4) Zarówno w piku punkt.cpp jak i pliku zawierającym f-cję main musieliśmy napisać #include punkt.h W tym tygodniu deklarację klasy oraz definicje jej metod umieścimy tak jak kiedyś struktury w tym samym pliku w którym znajduje się funkcja main(). Otwórzmy więc File->New->Other-> Console wizard. Zapiszmy plik jako Uczen.cpp, a projekt jako UczenProj.bpr
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:: Klasa() ; int main()
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. Jeśli funkcja (metoda, funkcja statyczna, konstruktor, destruktor) jest definiowana wewnątrz klasy, to domyślnie przyjmuje się dla niej modyfikator inline. Tak więc, jeśli metodę definiujemy wewnątrz klasy, to kompilator będzie próbował ją rozwijać.
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). 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 2 konstruktor poniżej (pomiedzy 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 wyglada tak samo jak zwyklego konstruktora, // ale to jest metoda, ona nie tworzy obiektu
Klasa Uczen metody zwracające pola Napiszemy terazmetody 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;