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