Lista 5
Transkrypt
Lista 5
Lista 5 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ów (tj. zarówno przez char* jak i string). Wszystkie funkcje w ramach danego zestawu powinny być zapisane w jednym pliku źródłowym. Proszę przeczytać treść wszystkich zadań przed implementacją któregokolwiek z nich. Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcję pole_prostokatu, która przyjmuje dwa argumenty (dwie liczby rzeczywiste) i zwraca liczbę rzeczywistą. Funkcja powinna zwrócić pole prostokątu o bokach długości równej podanym argumentom. Zadanie 2. Zaprojektować i zaimplementować funkcję pole_prostokatu_zmniejsz, która działa podobnie do funkcji pole_prostokatu. Różnica polega na tym, że po obliczeniu pola (ale przed zwróceniem wyniku działania) obydwa boki powinny zostać dwukrotnie zmniejszone. Zmiana ma być widoczna po wywołaniu funkcji. Kod pomocniczy (testujący) 1: double bokA = 5; double bokB = 8; double pole = pole_prostokatu_zmniejsz(bokA, bokB); cout << pole << endl; //40 cout << bokA << endl; //2.5 cout << bokB << endl; //4 pole cout cout cout = pole_prostokatu_zmniejsz(bokA, bokB); << pole << endl; //10 << bokA << endl; //1.25 << bokB << endl; //2 Zadanie 3. Zaprojektować i zaimplementować strukturę SProstokat, która zawiera dwa pola (dwie zmienne) typu zmiennoprzecinkowego. W przykładach pola te będą zmiennymi o nazwach a i b, ale w implementowanym kodzie ich nazwy mogą być inne. Zadanie 4. Zaprojektować i zaimplementować funkcję wypisz_prostokat, która przyjmuje jako argument zmienną typu SProstokat i nic nie zwraca. Funkcja ta powinna wypisać na standardowe wyjście długości boków prostokąta. Kod pomocniczy (testujący) 2: SProstokat prostokacik; prostokacik.a = 5.0; prostokacik.b = 8; wypisz_prostokat(prostokacik); //5 8 Zadanie 5. 1 Zaprojektować i zaimplementować przeciążoną funkcję pole_prostokatu, która przyjmuje jako argument obiekt typu SProstokat. Funkcja ta powinna pobrać dane z obiektu prostokąta i obliczyć jego pole. Zadanie 6. Zaprojektować i zaimplementować przeciążoną funkcję pole_prostokatu_zmniejsz, która przyjmuje jako argument obiekt typu SProstokat. Funkcja ta powinna pobrać dane z obiektu prostokąta i obliczyć jego pole, dodatkowo zmniejszając jego boki (zmiana ma być widoczna po wyjściu z funkcji). Rozwiązując pozostałe zadania tego zestawu można dodatkowo zaimplementować własne funkcje, które będą dzieliły dany problem (wczytywania plików, obliczania pól) na mniejsze zagadnienia. Zadanie 7. W pliku tekstowym dane_wejsc.txt znajdują się liczby w następującym formacie: n bok_a_prostokata_1 bok_b_prostokata_1 bok_a_prostokata_2 bok_b_prostokata_2 ... bok_a_prostokata_n bok_b_prostokata_n Na przykład plik wejściowy 2 4 5 8 17 reprezentuje dwa prostokąty o wymiarach 4 na 5 oraz 8 na 17. Zaprojektować i zaimplementować funkcję wczytaj_prostokaty, która przyjmuje dwa argumenty: • wejscie typu istream, który reprezentuje strumień wejściowy; • rozmiar typu unsigned, który reprezentuje liczbę prostokątów (musi byc znana po wyjściu z funkcji). Funkcja wczytaj_prostokaty zwraca utworzoną wewnątrz dynamiczną tablicę obiektów typu SProstokat jako wskaźnik. Funkcja ta powinna wczytać prostokąty z pliku wyjściowego, utworzyć tablicę, utworzyć (zainicjować) obiekty typu SProstokat odpowiednimi wartościami i zwrócić wspomnianą tablicę. Zadanie 8. Zaprojektować i zaimplementować funkcję wypisz_pola, która przyjmuje trzy argumenty: • wyjscie typu ostream, który reprezentuje strumień wyjściowy; • prostokaty będący tablicą prostokątów (przekazaną jako wskaźnik); • rozmiar typu unsigned, który reprezentuje rozmiar tablicy prostokaty. Funkcja ta powinna wprowadzać do strumienia wyjściowego obliczone wartości pól z każdego z prostokątów z tablicy. W pierwszym wierszu należy wpisać pole pierwszego prostokąta, w drugim - drugiego itd. aż do pola ostatniego prostokątu z tablicy prostokaty. Kod pomocniczy (testujący) 3, do zadania 7 i 8: 2 unsigned rozmiar = 0; ifstream wejsciowy("dane_wejsc.txt"); //... sprawdzenie strumienia SProstokat* prostokaciki = wczytaj_prostokaty(wejsciowy,rozmiar); wypisz_pola(cout,prostokaciki,rozmiar); Wywołanie powyższego kodu dla podanych w zadaniu 7 danych wejściowych powinno spowodować wypisanie na standardowym wyjściu: 20 136 Wyjaśniając: zostaną wczytane dwa prostokąty, o wymiarach 4 x 5 i 8 x 17. Ich pola są równe 20 oraz 136. Zestaw II W tym zestawie będzie mowa o strukturze SPracownik, który posiada cztery pola: • imie — napis reprezentujący imię; • nazwisko — napis reprezentujący nazwisko; • rok — nieujemna liczba całkowita oznaczająca rok urodzenia; • stanowisko — zaimplementowany w dowolny sposób znacznik oznaczający jedno z trzech stanowisk: programista, szef i piłkarz. Jedna z propozycji — zmienna typu char. Literka ’C’ oznacza programistę, ’F’ - piłkarza a ’B’ - szefa. Zadanie 9. Zaimplementować funkcję inicjalizuj_pracownika, która przyjmuje argumenty: • referencję do obiektu typu SPracownik; • imie, nazwisko, rok i stanowisko, z typami zgodnymi z deklaracją struktury SPracownik i nic nie zwraca. Funkcja ta powinna zainicjować pracownika (przekazanego przez referencję) danymi podanymi jako argumenty wywołania funkcji. Na przykład wywołanie poniższego kodu: SPracownik zenek; inicjalizuj_pracownika(zenek,"Stefan","Burczymucha",1995,’C’); cout << zenek.imie; // Stefan powinno spowodować wypisanie imienia "Stefan". Zadanie 10. W pliku pracownicy.txt znajduje się następująca zawartość: 3 5 Robert Blaszczykowski 1990 F Bill Gejts 1950 C Robert Pacino 1956 B Roman Polanski 1978 F Dzordz Kluny 1985 C Pierwsza linia oznacza liczbę pracowników. Kolejne wiersze zawierają: imię, nazwisko, rok urodzenia i znacznik oznaczający stanowisko. Należy napisać funkcję wczytaj, która wczytuje z pliku listę pracowników i zwraca utworzoną dynamicznie tablicę obiektów typu SPracownik. Po wywołaniu tej funkcji program powinien też posiadać informację o liczbie wczytanych pracowników. Sposób przekazania parametrów i odebrania wyników działania jest dowolny. Zadanie 11. Napisać funkcje, które jako argument przyjmują obiekt typu SPracownik: • czy_kobieta, która zwraca odpowiedź na pytanie: czy dany pracownik jest kobietą (podpowiedź – zwrócić uwagę na ostatnią literę imienia); • czy_szef, czy_pilkarz i czy_programista, zwracające odpowiedź na pytanie: czy dany pracownik jest odpowiednio szefem, piłkarzem czy programistą; • wiek, zwracająca wiek pracownika. Ewentualne pozostałe argumenty funkcji, typy zwracane itp. są dowolne, ale muszą realizować treść zadania. Zadanie 12. Napisać funkcje, które jako argumenty przyjmują tablicę pracowników i jej rozmiar: • ile_kobiet, która zwraca liczbę kobiet z tablicy pracowników; • ilu_szefow, ilu_pilkarzy i ilu_programistow, zwracające odpowiednio liczbę: szefów, piłkarzy i programistów; • srednia_wieku, zwracająca średni wiek pracowników; • najstarszy, zwracająca najstarszego pracownika. Ewentualne pozostałe argumenty funkcji, typy zwracane itp. są dowolne, ale muszą realizować treść zadania. Zadanie 13. Załóżmy, że piłkarz zarabia 200000 złotych, szef złotówkę a programista 200001 złotych za rok pracy. Załóżmy też, że pracownicy pracują w danej firmie nieprzerwanie od 20 roku życia. Zaimplementować funkcję koszty, która zwróci całkowity koszt pensji w danej firmie od roku 1950. Funkcja ta powinna przyjmować jako argumenty tablicę pracowników i jej rozmiar. Zestaw III W tym zestawie rozwiązanie każdego zadania należy zapisać w osobnym pliku źródłowym. Zadanie 14. Zaprojektować i zaimplementować funkcje: 4 • obliczającą punkty przecięcia prostej danej równaniem kierunkowym y = ax + b, z okręgiem danym równaniem (x − a)2 + (y − b)2 = r2 , korzystając z definicji funkcji zadeklarowanych poniżej: – int rozw rown(SRownanie r, SPunkt& x1, SPunkt& x2) – int pkt przec(SProsta& prosta, SOkrag& okrag, SPunkt& x1, SPunkt& x2) – wykorzystującej wcześniej zdefiniowaną funkcję rozwiązującą równanie kwadratowe, (rozw rown) • orzekającą, czy dwie proste są do siebie prostopadłe (bool czy prostopadle(SProsta a, SProsta b)). W celu rozwiązania zadania utworzyć struktury opisujące: • punkt, • prostą, • okrąg, • rówananie kwadratowe. Zdefiniowane funkcje przetestować dla następujących danych wejściowych: SProsta prosta1 = {1.0, 3.0}; SOkrag okrag = {0.0, 1.0, 2.0}; SProsta prosta2 = {-1.0, -33.2}; Zadanie 15. Zaprojektować i zaimplementować strukturę opisującą studenta, z polami reprezentującymi jego imie, nazwisko oraz liczbę i wykaz niezaliczonych kursów. Zaprojektować i zaimplementować strukturę opisującą listę studentow pozwalającą przechować dowolną liczbę studentów, umieszczonych w pliku z danymi wejściowymi. Dla powyższej struktury zdefiniować funkcje: • wczytaj – inicjalizującą listę studentów danymi wczytanymi z pliku i zwracającą wykaz wszystkich studentów utworzony wewnątrz tej funkcji, • wypisz – pozwalającą wyswietlić na standardowym wyjściu pełne informacje o studentach znajdujących się na liście, • usun – zwalniającą zasoby przydzielone na stercie. Zadanie 16. Zaprojektować i zaimplementować strukturę opisującą osobę, z polami reprezentującymi jej numer gadu-gadu, e-mail, rok urodzenia oraz imię. Zaprojektować i zaimplementować strukturę opisującą listę kontaktów o podanej nazwie, pozwalającą przechować dowolną liczbę osób, umieszczonych w pliku z danymi wejściowymi. Dla powyższych struktur zdefiniować funkcje: • wczytaj – inicjalizującą listę kontaktów danymi wczytanymi z pliku, • wypisz – pozwalającą wysłać na zadany (standardowy/plikowy) strumień wszystkie osoby z podanej listy kontaktów, z zachowaniem formatu pliku wejściowego, 5 • wypisz – pozwalającą wysłać na zadany (standardowy/plikowy) strumień dane pojedynczej osoby, z zachowaniem formatu pliku wejściowego, • szukaj – realizującą wyszukanie na liście kontaktów osoby o podanym (z linii wywołania programu) numerze gadu-gadu oraz zwracającą dane tej osoby, które można odczytać na standardowym wyjściu z wykorzystaniem funkcji wypisz • podzial – realizującą zapisanie danych osobowych na dwa różne strumienie plikowe (przekazane do funkcji jako parametry), z podziałem ze względu na płeć (na podstawie ostatniej litery imienia), nazwy plików pobrać z linii wywołania programu, do zapisu danych należy wykorzystać funkcję wypisz • usun – zwalniającą zasoby przydzielone na stercie. 6