Zaawansowane CPP/Ćwiczenia 7: Klasy wytycznych: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
 
(Nie pokazano 10 wersji utworzonych przez 2 użytkowników)
Linia 5: Linia 5:
 
programie.
 
programie.
  
W pliku <code><nowiki>word.cpp</nowiki></code>  znajduje się fragment kodu, mogącego przy dużej
+
W pliku [[media:Word.cpp | word.cpp]] znajduje się fragment kodu, mogącego przy dużej
 
dozie dobrej woli być uznanym za zalążek procesora tekstu.
 
dozie dobrej woli być uznanym za zalążek procesora tekstu.
 
Przyjęto w nim założenie, że dokument składa się z akapitów, a każdy
 
Przyjęto w nim założenie, że dokument składa się z akapitów, a każdy
Linia 17: Linia 17:
 
na koniec linii, itd.
 
na koniec linii, itd.
  
'''Zadanie 1 '''
+
{{cwiczenie|1||
Przestudiuj kod w pliku <code><nowiki>word.cpp</nowiki></code> ; przy okazji upewnij się czy
+
 
 +
Przestudiuj kod w pliku [[media:Word.cpp | word.cpp]]; przy okazji upewnij się czy
 
zamieszczony tam algorytm banalnego łamania wierszy jest poprawny
 
zamieszczony tam algorytm banalnego łamania wierszy jest poprawny
 
(sprawdź zwłaszcza przypadki krańcowe i błędy off-by-one).
 
(sprawdź zwłaszcza przypadki krańcowe i błędy off-by-one).
 
Zaimplementuj dodatkową klasę wytycznych z innym algorytmem łamania
 
Zaimplementuj dodatkową klasę wytycznych z innym algorytmem łamania
 
linii, stwórz wewnątrz <code><nowiki>main()</nowiki></code>  taki dokument i go wydrukuj.
 
linii, stwórz wewnątrz <code><nowiki>main()</nowiki></code>  taki dokument i go wydrukuj.
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz plik [[media:Word_rozw.cpp | word_rozw.cpp]].
 +
</div></div>
  
'''Zadanie 2 '''
+
{{cwiczenie|2||
 +
 
Zaimplementuj odpowiedni operator, który pozwoli na przypisanie
 
Zaimplementuj odpowiedni operator, który pozwoli na przypisanie
 
z jednego dokumentu do drugiego.
 
z jednego dokumentu do drugiego.
Pamiętaj że dokumenty zostały skonkretyzowane z innymi wytycznymi,
+
Pamiętaj, że dokumenty zostały skonkretyzowane z innymi wytycznymi,
 
a więc dla kompilatora będą to dwie różne klasy.
 
a więc dla kompilatora będą to dwie różne klasy.
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz plik [[media:Word_rozw.cpp | word_rozw.cpp]].
 +
</div></div>
 +
 +
{{cwiczenie|3||
  
'''Zadanie 3 '''
+
Przeanalizuj przykład zaczynający się od pliku [[media:Glowny.cpp | glowny.cpp]].
Przeanalizuj przykład zaczynający się od pliku <code><nowiki>glowny.cpp</nowiki></code> .
 
 
Zamienia on nazwy zrozumiałe dla człowieka ("czarny", "zielony")
 
Zamienia on nazwy zrozumiałe dla człowieka ("czarny", "zielony")
 
na strukturki ze składowymi RGB, wykorzystując do tego celu fabrykę kolorów.
 
na strukturki ze składowymi RGB, wykorzystując do tego celu fabrykę kolorów.
Linia 40: Linia 51:
 
Zaimplementuj w odrębnym pliku (albo plikach) alternatywną politykę,
 
Zaimplementuj w odrębnym pliku (albo plikach) alternatywną politykę,
 
która zamiast wyjątku zwraca pewien ustalony kolor domyślny.
 
która zamiast wyjątku zwraca pewien ustalony kolor domyślny.
Przerób ją następnie z klasy na szablon klasy, tak aby można było
+
Przerób ją następnie z klasy na szablon klasy tak, aby można było
 
zadawać kolor domyślny jako trzy parametry tego szablonu.
 
zadawać kolor domyślny jako trzy parametry tego szablonu.
 +
}}
 +
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none">
 +
Patrz pliki [[media:Glowny_rozw1.cpp | glowny_rozw1.cpp]] oraz [[media:Glowny_rozw2.cpp | glowny_rozw2.cpp]].
 +
</div></div>

Aktualna wersja na dzień 10:34, 2 paź 2006

Mechanizm wytycznych przydatny jest zwłaszcza podczas implementowania bibliotek. Pozwala definiować klasy, których pewne aspekty zachowania można ustalić (albo zmodyfikować) dopiero w momencie ich użycia w głównym programie.

W pliku word.cpp znajduje się fragment kodu, mogącego przy dużej dozie dobrej woli być uznanym za zalążek procesora tekstu. Przyjęto w nim założenie, że dokument składa się z akapitów, a każdy akapit będzie przechowywany jako jeden długi łańcuch. Aby wyświetlić dokument na ekranie, trzeba połamać akapity na poszczególne wiersze nie przekraczające jego szerokości. Istnieją różne algorytmy dokonujące łamania. Mogą one np. wyrównywać linie do prawej dodając na ich początek odpowiednią liczbę spacji, justować poprzez wstawianie spacji w środek, dbać o zachowanie zasad polskiej typografii poprzez pilnowanie aby spójniki nie trafiały na koniec linii, itd.

Ćwiczenie 1

Przestudiuj kod w pliku word.cpp; przy okazji upewnij się czy zamieszczony tam algorytm banalnego łamania wierszy jest poprawny (sprawdź zwłaszcza przypadki krańcowe i błędy off-by-one). Zaimplementuj dodatkową klasę wytycznych z innym algorytmem łamania linii, stwórz wewnątrz main() taki dokument i go wydrukuj.

Rozwiązanie

Ćwiczenie 2

Zaimplementuj odpowiedni operator, który pozwoli na przypisanie z jednego dokumentu do drugiego. Pamiętaj, że dokumenty zostały skonkretyzowane z innymi wytycznymi, a więc dla kompilatora będą to dwie różne klasy.

Rozwiązanie

Ćwiczenie 3

Przeanalizuj przykład zaczynający się od pliku glowny.cpp. Zamienia on nazwy zrozumiałe dla człowieka ("czarny", "zielony") na strukturki ze składowymi RGB, wykorzystując do tego celu fabrykę kolorów. Domyślną reakcją fabryki na przekazanie nieznanej nazwy koloru powinno być rzucenie wyjątkiem, ale chcemy zachować możliwość zmiany tej defaultowej reakcji; wprowadzono więc klasę wytycznych. Zwróć uwagę na podział tego projektu na poszczególne pliki źródłowe. Zaimplementuj w odrębnym pliku (albo plikach) alternatywną politykę, która zamiast wyjątku zwraca pewien ustalony kolor domyślny. Przerób ją następnie z klasy na szablon klasy tak, aby można było zadawać kolor domyślny jako trzy parametry tego szablonu.

Rozwiązanie