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