Lista 8
Transkrypt
Lista 8
Lista 8 Jeżeli w treści zadania nie podano inaczej — proszę używać strumieni plikowych (nie zapisywać danych do plików przez przekierowanie standardowych wyjść). Napisy można obsługiwać w dowolny sposób (tj. zarówno przez char* jak i string). Wszystkie funkcje w ramach danego zestawu powinny być zapisane w jednym pliku źródłowym oraz powinny umożliwić podanie argumentów (pliku wejściowego/wyjściowego), jako parametry uruchomienia programu. Proszę przeczytać treść wszystkich zadań przed implementacją któregokolwiek z nich. Jeżeli w treści zadania nie podano listy argumentów, nazwy funkcji i/lub typu zwracanego, to dany fragment sygnatury jest dowolny. Dozwolona jest implementacja dodatkowych funkcji. Zestaw I Zadanie 1. Zaimplementować i zaprojektować następujące jednostki danych: • SPiwo, struktura z polami: wysokosc, promien_podstawy i marka; • SKarton, struktura z polami: piwa (tablica obiektów typu SPiwo), ile_piw i kod (jako liczba całkowita). W dalszych obliczeniach proszę przyjąć, że jednostką wysokości i promienia podstawy jest centymetr. Zakładamy, że każdy obiekt SPiwo reprezentuje walec wypełniony odpowiednim piwem. Zadanie 2. Napisać funkcję wczytaj_piwa, która zwraca dynamicznie utworzoną (wewnątrz funkcji) tablicę obiektów typu SPiwo. Argumentami tej funkcji są strumień wejściowy (istream) oraz rozmiar – zmiana tego ostatniego powinna być widoczna w programie po wywołaniu funkcji. Zakładamy, że w pierwszym wierszu strumienia znajduje się liczba piw. Kolejne wiersze to wysokość, promień podstawy i marka. Na przykład plik postaci: 3 20 3.5 Klasyczne 22 3.0 Niepasteryzowane 21 3.65 Jasno-ciemne reprezentuje trzy piwa: Klasyczne o wysokości 20 cm i promieniu 3.5 cm, Niepasteryzowane o wysokości 22 cm i promieniu 3.0 cm oraz Jasno-ciemne o wysokości 21 cm i promieniu 3.65 cm. Zadanie 3. Zaimplementować funkcję pakuj_karton, która przyjmuje jako argumenty: • obiekt typu SKarton (będzie on modyfikowany wewnątrz funkcji, zmiana ma być widoczna na zewnątrz); • tablica (jako wskaźnik) obiektów typu SPiwo; • rozmiar tablicy rozmiar. 1 W funkcji tej należy zainicjalizować argument typu SKarton odpowiednimi danymi, tak aby były wypełnione pola piwa i ile_piw. Pole kod powinno zostać wypełnione: • wartością stałą lub • kolejną wartością całkowitą, tak aby każdy kolejny karton otrzymywał kod o jeden większy od poprzedniego, zaczynając od 1. Można wykorzystać zmienną globalną lub zmienną statyczną. Zadanie 4. Napisać funkcję, która wypisze na dany strumień wyjściowy informacje na temat obiektu typu SKarton, w tym: • kod kartonu; • listę wszystkich piw w kartonie. Zadanie 5. Zaimplementować funkcję, która dla danego obiektu typu SPiwo zwróci objętość danego piwa. Zadanie 6. Zaimplementować funkcję (lub funkcje), które w danym obiekcie typu SKarton posortują piwa według: • wysokości; • promienia podstawy; • objętości piwa. Sortowanie powinno odbywać się na oryginalnej tablicy obiektów typu SPiwo (bez kopiowania, z pominięciem stabilności sortowania itp.). Zadanie 7. Zaimplementować funkcję, która zapisze obiekt typu SKarton do strumienia wyjściowego (typu ostream). Format zapisu powinien być taki sam jak w zadaniu 2. Zadanie 8. Zaimplementować funkcję daj_wysokosc_kartonu, która dla danego obiektu typu SKarton zwróci jego wysokość. Załóżmy, że wysokość jest równa wysokości „najwyższego” piwa w kartonie. Zadanie 9. Zaimplementować funkcję daj_objetosc_kartonu, która dla danego obiektu typu SKarton zwróci sumę objętości wszystkich piw w kartonie (załóżmy milcząco, że opakowania są wykonane z gumy). Zadanie 10. Samodzielnie napisać kod testujący (program), który będzie wykorzystywać: • wczytywanie i zapis obiektu typu SKarton z/do pliku/standardowego wejścia/wyjścia; • wypisanie na ekran informacji o kartonie; • sortowanie i zapis posortowanego obiektu SKarton do pliku; • wypisanie na ekran wysokości i objętości kartonu; 2 Zestaw II Zadanie 1. Zaimplementować i zaprojektować następujące jednostki danych: • SMieszkanie, struktura z polami:numer, powierzchnia, wysokosc; • SPietro, struktura z polami: mieszkania (tablica obiektów typu SMieszkanie), ile_mieszkan i nr_pietra. • SBlok, struktura z polami: pietra (tablica obiektów typu SPietro), ile_pieter i numer. Zadanie 2. Zaimplementować i zaprojektować funkcje: • wczytaj i zapisz, umożliwiające odpowiednio wczytanie i zapisanie danych o obiekcie typu SBlok z/do strumienia (pliku lub cout/cin). Format zapisu jest dowolny, ale każdy obiekt typu SBlok musi posiadać informacje o numerze, liczbie pięter i opis każdego piętra. Podobnie z każdym piętrem: wymagana jest informacja o numerze piętra, liczbie mieszkań i opis każdego mieszkania na piętrze. • wysokosc_pietra, która dla danego piętra obliczy wysokość piętra. Założono, że jest to największa wysokość z mieszkań na danym piętrze; • wysokosc_bloku, która dla danego bloku policzy jego wysokość. Założono, że jest to suma wysokości wszystkich pięter (pod wysokością piętra rozumiemy wynik działania funkcji wysokosc_pietra); Zadanie 3. Napisać funkcję powierzchnia_calkowita, która obliczy sumę powierzchni wszystkich mieszkań w całym bloku. Zestaw III W tym zestawie należy działać na następująco zadeklarowanych strukturach: struct SWagon { unsigned ile_wolnych; double dlugosc; unsigned klasa; }; struct SPociag { unsigned ile_wagonow; SWagon* wagony; }; Zakładamy że wagony ponumerowane są od numeru 1, tj. dla danego obiektu typu SPociag wartość wagony[0] oznacza wagon numer 1, wagony[1] wagon numer 2 itd. Zadanie 1. Zaimplementować funkcje, które będą wczytywać i zapisywać (do dowolnych strumieni) dane na temat pociągu, zgodnie z poniższym formatem: 3 [ile_wagonow] [wolnych w pierwszym wagonie] [dlugosc] [klasa] [wolnych w drugim wagonie] [dlugosc] [klasa] ... powtorzone ile_wagonow razy. Na przykład następujący plik: 3 60 17 1 80 17.5 2 75 17.5 2 reprezentuje pociąg z trzema wagonami: pierwszy wagon pierwszej klasy, z 60 miejscami wolnymi i mającym 17 metrów długości; drugi wagon drugiej klasy, mający 80 miejsc wolnych i długości 17,5 metra oraz trzeci wagon, drugiej klasy, mający 75 wolnych miejsc i 17,5 metra długości. Zadanie 2. Zaimplementować funkcję pierwsze_wolne, która jako argumenty przyjmuje obiekt typu SPociag i klasę wagonu. Funkcja ta ma zwracać numer pierwszego wagonu z wolnymi miejscami klasy zgodnej z klasą podaną jako argument. Jeżeli nie istnieje wagon, który ma wolne miejsca (danej klasy) należy zwrócić 0. Zadanie 3. Zaimplementować funkcję rezerwuj_pierwsze_wolne, która jako argumenty przyjmuje obiekt typu SPociag i klasę wagonu. Jeżeli jest możliwa rezerwacja biletu danej klasy (są wolne miejsca), to w pierwszym wolnym wagonie należy zmniejszyć wartość zmiennej ile_wolnych i zwrócić true. W przeciwnym wypadku (nie ma wolnych miejsc) należy zwrócić false. Zadanie 4. Zaimplementować funkcję ile_wolnych_miejsc, która jako argumenty przyjmuje obiekt typu SPociag i klasę wagonu. Funkcja ta zwraca liczbę wolnych miejsc danej klasy we wszystkich wagonach danego pociągu. Zadanie 5. Zaimplementować funkcję dlugosc_pociagu, która oblicza sumę długości lokomotywy i wszystkich wagonów danego pociągu. Założono, że lokomotywa ma 10 metrów długości. Zadanie 6.∗ Zaimplementować strukturę SWagon jako prostą listę wiązaną, tj. każdy obiekt typu SWagon posiada wskaźnik nastepny_wagon na kolejny wagon w danym pociągu. Wtedy zmienna wagony w obiekcie typu SPociag wskazuje na pierwszy wagon danego pociągu. Dozwolone są wszelkie modyfikacje poprawiające wydajność (np. wskaźnik na ostatni wagon w pociągu). Przystosować wszystkie powyższe funkcje do działania na zmodyfikowanych strukturach. Wymagana będzie także implementacja trzech dodatkowych funkcji, odnoszących się do obiektu typu SPociag: • ile_wagonow, zwracająca liczbę wagonów (nawet jeżeli istnieje odpowiednie pole w strukturze SPociag); • dodaj_wagon, dodający wagon podany jako argument do listy wagonów; • daj_wagon, zwracający wskaźnik na wagon o danym numerze. 4 Zestaw IV Do tego zestawu dołączono plik źródłowy szablon.cpp. Jest to szablon proponowanego rozwiązania tego zadania. Zadanie 1. Zaimplementować i zaprojektować następujące jednostki danych: • ETyp, typ wyliczeniowy z wartościami: PIES, KOT, CHOMIK i KROLIK; • SZwierzatko, struktura z polami: imie, wiek i typ (typ zwierzątka, wartość typu ETyp); • SZwierzyniec, struktura z polami: nazwa_zwierzynca, zwierzatka (wskaźnik do dynamicznej tablicy obiektów typu SZwierzatko) i rozmiar (liczba zwierzątek w zwierzyńcu). Zadanie 2. Napisać funkcję inicjalizuj_zwierze, która inicjalizuje dane zwierzątko (wartościami podanymi jako argumenty funkcji). Zadanie 3. Napisać funkcję wypisz_zwierzyniec, która wypisze do danego strumienia wszystkie informacje o danym obiekcie typu SZwierzyniec. Przykład działania takiej funkcji (z wykorzystaniem strumienia cout) przedstawiono w zadaniu. Zadanie 4. Napisać zestaw funkcji (nazwy i nagłówki dowolne), które odpowiedzą na pytania: • ile w danym zwierzyńcu jest piesków/kotków/chomików/królików? • jakie jest najstarsze, a jakie najmłodsze zwierzątko? • jakie jest najstarsze zwierzątko danego typu? • jaki jest średni wiek zwierzątek? Implementację można uprościć przez wprowadzenie funkcji orzekającej (predykatu) i funkcji przyjmującej wskaźnik na funkcję (na podobnej zasadzie jak zestaw 1. z listy 3). Zadanie 5. Napisać funkcję kopiuj_zwierzyniec, która zwraca obiekt typu SZwierzyniec, będący wynikiem (głębokiego) kopiowania informacji z danego zwierzyńca. Głębokie kopiowanie oznacza konieczność skopiowania każdego obiektu typu SZwierzatko, obiekt po obiekcie. Zadanie 6. Napisać funkcję daj_glosy, która dla każdego zwierzątka spowoduje wypisanie (do danego strumienia) charakterystycznego dla danego typu odgłosu. Psy będą szczekać ("Hau"), chomiki piszczeć ("Pisk"), a króliki rzucać wyrażeniem "Co jest, doktorku?". Koty zasadniczo wydają odgłos "Miau" z pewnym wyjątkiem: jeżeli dany kot ma na imię "Behemot", to powinien wyrazić się następująco1 : Nie wiadomo, dlaczego wszyscy mowia do kotow "ty", choc jako zywo zaden kot nigdy z nikim nie pil bruderszaftu. Zadanie 7. W ramach testów (w funkcji main) należy napisać kod, który: 1 Michaił Bułhakow Mistrz i Małgorzata 5 • utworzy zwierzyniec, którego dane podano poniżej: Nazwa Imie: Imie: Imie: zbioru zwierzatek: Zoo Malgosi Azor, wiek: 5, typ: piesek Behemot, wiek: 1500, typ: kotek Bugs, wiek: 9, typ: krolik • wypisze wszystkie zwierzęta na standardowe wyjście i do pliku podanego jako pierwszy argument z linii wywołania programu; • skopiuje dany zwierzyniec, a następnie skasuje tablicę zwierząt źródłowego zwierzyńca, na przykład w poniższy sposób: SZwierzyniec nowe_zoo_malgosi = kopiuj_zwierzyniec(zoo_malgosi); delete[] zoo_malgosi.zwierzatka; • wypisze odgłosy dla skopiowanego zwierzyńca. Na przykład takie wywołanie funkcji daj_glosy: daj_glosy(cout,nowe_zoo_malgosi); może spowodować wyświetlenie na ekranie poniższego ciągu znaków: Glosy dochodzace z Zoo Malgosi: Azor drze sie tak: Hau Behemot drze sie tak: Nie wiadomo, dlaczego wszyscy mowia do kotow "ty", choc jako zywo zaden kot nigdy z nikim nie pil bruderszaftu. Bugs drze sie tak: Co jest, doktorku? • wypisze na ekran dane o najmłodszym kocie i średnim wieku wszystkich zwierząt; • ... Zestaw V Zadanie 1. Zaprojektować i zaimplementować strukturę opisującą wielokąt poprzez dynamiczną tablicę punktów. Ponadto zaprojektować, zaimplementować oraz przetestować funkcje realizujące następujące operacje: • inicjowanie wielokąta elementami tablicy punktów, • inicjowanie wielokąta wartościami losowymi, • usuwanie z pamięci wielokąta (tablicy punktów), • wypisywanie na ekranie zawartości wielokąta (liczba wierzchołków, ich współrzędne, długości boków oraz obwód), • obliczanie obwodu wielokąta (bez sprawdzania poprawności wielokąta). 6 Ponadto zaprojektować, zaimplementować i przetestować dodatkowe funkcje realizujące: • inicjowanie wielokąta wartościami współrzędnych wierzchołków pobranymi z pliku, • zapisywanie do pliku zawartości wielokąta (liczba wierzchołków, ich współrzędne, długości boków oraz obwód), • wypisującą Punkt na zadany strumień, • wypisującą Wielokat na zadany strumień (liczba wierzchołków, ich współrzędne, długości boków oraz obwód). Przykładowy plik wejściowy: 3 0 0 1 0 1 1 Zdefiniowane funkcje przetestować przykładowym ciągiem instrukcji: //... SPunkt t[] = {{1.0, 2.0}, {-1.0, 3.0}, {0.0, -2.0}, {3.0, 0.0}}; SWielokat wielo, wielo_l; ini_wielo(wielo, t, t + 4); wypisz_wielo(wielo); std::cout << "Obwod = " << obwod(wielo) << "\n"; ini_wielo_los(wielo_l, 5); //wielokat z 5 losowymi wierzcholkami wypisz_wielo(wielo_l); std::cout << "Obwod = " << obwod(wielo_l) << "\n"; del_wielo(wielo); del_wielo(wielo_l); czytaj_z_pliku(argv[1], wielo); zapisz_do_pliku(argv[2], wielo); del_wielo(wielo); //... Zestaw VI Zadanie 1. Zaprojektować i zaimplementować strukturę opisującą obiektyw, z polami reprezentującymi jego nazwę, przesłonę oraz ogniskową. Zaprojektować i zaimplementować strukturę opisującą aparat, pozwalającą przechować dowolną liczbę obiektywów. Dla powyższych struktur zdefiniować następujące funkcje: • funkcję inicjalizującą aparat danymi wczytanymi z pliku(wczytaj ), 7 • funkcję pozwalającą wysłać na zadany strumień wszystkie obiektywy podanego aparatu (wypisz ), według wzoru nazwa_aparatu ilosc rodzaj_obiektywu f/przeslona : ogniskowa_mm rodzaj_obiektywu f/przeslona : ogniskowa_mm ... np. CANON 4 makro 2.8 65 teleobiektyw 2.8 400 staloogniskowy 1.4 50 specjalny 2.8 90 • funkcję zwracającą liczbę obiektywów o ogniskowej większej niż 50 mm (zlicz ), • funkcję zwalniającą przydzielone zasoby (usun). Zdefiniowane funkcje przetestować podanym poniżej ciągiem instrukcji: //... SAparat aparat; if(wczytaj(argv[1], aparat)){ wypisz(cout, aparat); cout << zlicz(aparat); ofstream plik(argv[2]); if(!plik) cerr << "Zapis zakonczony bledem"; else wypisz(plik, aparat); usun(aparat); } //... Zestaw VII Zadanie 1. Zaprojektować oraz zaimplementować strukturę Wektor pozwalającą przechowywać w pamięci dowolną liczbę liczb zmiennoprzecinkowych podwójnej precyzji. Dla powyższej struktury zdefiniować następujące funkcje: 8 • tworzącą wektor (utworz), • drukującą wszystkie elementy wektora (wydrukuj), • sumującą dwa wektory (suma), • wyznaczającą iloczyn skalarny dwóch wektorów (iloczyn), • zapisującą wektor do pliku (zapisz). Rozwiązanie przetestować poniższym kodem: double t[] = {4.1,5.3,2.6,3.4,2.1,1.9,8.4,3.2,3.7,6.5}; Wektor a = utworz(t, t+6); Wektor b = utworz(t+3, t+9); drukuj(a); drukuj(b); Wektor c = suma(a, b); drukuj(c); double il = iloczyn(a, b); cout << il << endl; zapisz(c, "c.txt"); Zestaw VIII Zadanie 1. Zaprojektować oraz zaimplementować strukturę Trapez opisującą figurę geometryczną na płaszczyźnie, z polami reprezentującymi długości jej podstaw i wysokość. Zaprojektować i zaimplementować strukturę Zbiór pozwalającą przechować dowolną liczbę trapezów. Dla powyższych struktur zdefiniować następujące funkcje: • wyświetlającą na standardowym wyjściu pola składowe trapezu (drukuj ), • tworzącą zbiór trapezów (utworz ), • wyświetlającą na standardowym wyjściu wszystkie trapezy należące do zbioru (wydrukuj ), • obliczającą pole trapezu (pole) • orzekającą, dwuargumentową, zwracającą wartość logiczną informującą, który trapez ma większe pole (wg pola), • sortującą narastająco trapezy w zbiorze, według zadanego kryterium (sortuj ), • zapisującą do pliku, z wykorzystaniem funkcji (drukuj ), zawartość zbioru przed i po sortowaniu (zapisz ), nazwa pliku wyjściowego powinna być podana jako parametr wywołania programu. Rozwiązanie przetestować podanym poniżej ciągiem instrukcji: 9 Trapez t[] = {{4.1,5.3,2.7},{2.6,3.4,4.3},{2.1,1.9,5.1}, {8.4,3.2,2.6},{3.7,6.3,7.1},{6.8,7.9,8.9}}; drukuj(t[1], std::cout); Zbior zb = utworz(t, t+6); wydrukuj(zb); zapisz(zb, argv[1]); sortuj(zb, wg_pola); wydrukuj(zb); zapisz(zb, argv[1]); 10