Podstawy Programowania dr Elżbieta Gawrońska gawronska@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 1 / 18
Plan wykładu 1 Typ wyliczeniowy 2 Struktury jako składniki innych struktur 3 Zmienne typu strukturalnego jako argumenty funkcji 4 Przykład wykorzystania struktur i tablicy struktur Funkcja główna Definicje typów strukturalnych Definicja funkcji operujących na strukturach dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 2 / 18
Typ wyliczeniowy Typ wyliczeniowy enum DniTygodnia {Pn, Wt, Sr, Cz, Pt, Sb, N}; cout << Sb << endl; // 5 lub enum DniTygodnia {Pn = 1, Wt, Sr, Cz, Pt, Sb, N}; cout << Sb << endl; // 6 dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 3 / 18
Struktury jako składniki innych struktur Odwołanie do składnika struktury I składnikiem struktury może być także zmienna typu strukturalnego struct SSilnik{ float pojemnosc; int mom_obrotowy; }; struct SAuto{ int l_drzwi, rok_prod; char nazwa[64]; SSilnik silnik; }; dla zmiennej typu SAuto odwołanie do pojemności silnika: dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 4 / 18
Struktury jako składniki innych struktur Odwołanie do składnika struktury II SAuto nissan; nissan.silnik.pojemosc = 1.6; wprowadzając dodatkowo strukturę opisującą silnik SSilnik tworzy się możliwość wykorzystania zmiennych tego typu w innych strukturach, nie tylko w SAuto, np.: struct SSamolot{ int l_miejsc, l_silnikow; float ladownosc; SSilnik silnik; }; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 5 / 18
Struktury jako składniki innych struktur Odwołanie do składnika struktury III struct SMotocykl{ int masa, rozm_kol; float osiagi; SSilnik * silnik; }; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 6 / 18
Zmienne typu strukturalnego jako argumenty funkcji Przesyłanie zmiennych typu strukturalnego do funkcji I podobnie jak zwykłe zmienne, zmienne typu strukturalnego można przesłać do funkcji na trzy sposoby: przez wartość (funkcja tworzy kopię parametru aktualnego UWAGA!): void fun(sauto auto); przez wskaźnik (funkcja ma dostęp do oryginalnego parametru aktualnego): void fun_w(sauto * auto); przez referencję (funkcja ma dostęp do oryginalnego parametru aktualnego): void fun_r(sauto & auto); tworzenie kopii zmiennych typu strukturalnego o dużym rozmiarze w funkcjach, może powodować znaczny spadek wydajności programu przy wielokrotnym wywoływaniu takich funkcji stosuje się wtedy przesłanie zmiennych typu strukturalnego do funkcji poprzez referencję dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 7 / 18
Zmienne typu strukturalnego jako argumenty funkcji Przesyłanie zmiennych typu strukturalnego do funkcji II funkcja odbierająca zmienną przez referencję ma dostęp do oryginału (parametru aktualnego) i może go modyfikować aby zablokować możliwość modyfikacji parametru aktualnego należy w funkcji odebrać go poprzez referencję do stałej: void fun_r(const SAuto & auto); dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 8 / 18
Treść zadania Zaprojektować i zaimplementować funkcje: inicjalizujące wartościami początkowymi składowe struktury opisującej silnik, auto i komis samochodowy wyświetaljące zawartość struktury SSilnik, SAuto i SKomis W celu rozwiązania zadania utworzyć struktury opisujące: SSilnik poprzez jego pojemność, moc i rodzaj, SAuto poprzez napęd, rok produkcji, model, kolor i silnik, SKomis poprzez liczbę samochodów, adres i spis samochodów. Zdefiniowane funkcje przetestować podanym poniżej ciągiem instrukcji (funkcja main) dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 9 / 18
Funkcja główna Definicja funkcji main SSilnik sil1 = stworz_silnik ( 1. 6, 114, benzyna ) ; SSilnik sil2 = stworz_silnik ( 1. 4, 100, benzyna ) ; SSilnik sil3 = stworz_silnik ( 2. 0, 140, benzyna ) ; SSilnik sil4 = stworz_silnik ( 2. 5, 125, diesel ) ; SSilnik sil5 = stworz_silnik ( 3. 0, 158, diesel ) ; SAuto samtab = new SAuto [ 6 ] ; samtab [ 0 ] = stworz_auto ( dwa_kola, 2001, Almera, "zielony", sil2 ) ; samtab [ 1 ] = stworz_auto ( dwa_kola, 2006, Qashqai, "czerwony", sil1 ) ; samtab [ 2 ] = stworz_auto ( dwa_kola, 2003, Primera, "srebrny", sil3 ) ; samtab [ 3 ] = stworz_auto ( cztery_kola, 2000, Terrano, "czarny", sil4 ) ; samtab [ 4 ] = stworz_auto ( cztery_kola, 2004, Patrol, "czarny", sil5 ) ; SKomis kom = stworz_komis ( 5, "Czestochowa, al.wp 42", samtab ) ; pokaz_komis ( kom ) ; delete [ ] samtab ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 10 / 18
Definicje typów strukturalnych Definicja nowego typu (1) wyliczeniowego enum r_silnika {diesel, benzyna } ; enum r_modelu {Qashqai, Almera, Primera, Terrano, Patrol } ; enum r_napedu {dwa_kola, cztery_kola } ; strukturalnego opisującego silnik struct SSilnik { float pojemnosc ; int moc ; r_silnika rodzaj ; } ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 11 / 18
Definicje typów strukturalnych Definicja nowego typu strukturalnego (2) opisującego auto struct SAuto { r_napedu naped ; int rok_prod ; r_modelu model ; string kolor ; SSilnik silnik ; } ; opisującego komis samochodowy struct SKomis { int l_egz ; string adres ; SAuto samochod ; } ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 12 / 18
Definicja funkcji operujących na strukturach Definicja funkcji tworzącej silnik inicjalizującej wartościami początkowymi składowe struktury SSilnik SSilnik stworz_silnik ( float poj, int m, r_silnika rodz ) { SSilnik silnik = {poj, m, rodz } ; / l u b t a k : S S i l n i k s i l n i k ; s i l n i k. pojemnosc = p o j ; s i l n i k. moc = m; s i l n i k. r o d z a j = r odz ; / return silnik ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 13 / 18
Definicja funkcji operujących na strukturach Definicja funkcji tworzącej auto inicjalizującej wartościami początkowymi składowe struktury SAuto SAuto stworz_auto ( r_napedu nap, int rok, r_modelu mod, string kol, const SSilnik& silnik ) { SAuto samochod = {nap, rok, mod, kol, silnik } ; / l u b t a k : SAuto samochod ; samochod. naped = nap ; samochod. rok_prod = rok ; samochod. model = mod ; samochod. k o l o r = k o l ; samochod. s i l n i k = s i l n i k ; / return samochod ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 14 / 18
Definicja funkcji operujących na strukturach Definicja funkcji tworzącej komis inicjalizującej wartościami początkowymi składowe struktury SKomis SKomis stworz_komis ( int l_egz, string adr, SAuto samochod ) { SKomis komis = {l_egz, adr, samochod } ; / l u b t a k : komis. l _e g z = l _e g z ; komis. a d r e s = adr ; komis. samochod = samochod ; / return komis ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 15 / 18
Definicja funkcji operujących na strukturach Definicja funkcji wyświetlającej silnik pokazującej wartości składowych struktury SSilnik void pokaz_silnik ( const SSilnik & silnik ) { cout << "\ tpojemnosc : " <<silnik. pojemnosc ; cout << "\tmoc: " << silnik. moc ; cout << "\trodzaj: " << silnik. rodzaj << endl ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 16 / 18
Definicja funkcji operujących na strukturach Definicja funkcji wyświetlającej auto pokazującej wartości składowych struktury SAuto void pokaz_auto ( const SAuto & samochod ) { cout << "Naped: " << samochod. naped ; cout << "\trok prod.: " << samochod. rok_prod ; cout << "\tmodel: " << samochod. model ; pokaz_silnik ( samochod. silnik ) ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 17 / 18
Definicja funkcji operujących na strukturach Definicja funkcji wyświetlającej komis pokazującej wartości składowych struktury SKomis void pokaz_komis ( const SKomis & komis ) { cout << "Liczba egzemplarzy : " << komis. l_egz ; cout << "\tadres: " << komis. adres << endl ; for ( int i = 0 ; i < komis. l_egz ; ++i ) / / p o k a z _ a u t o ( ( komis. samochod+ i ) ) ; pokaz_auto ( komis. samochod [ i ] ) ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 11 18 / 18