Funkcje i procedury
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaTrochę zadań na temat funkcji
No więc, dobrze. Teraz będzie kilka zadań dotyczących funkcji. Sami tego chcieliście!
- Pierwsze zadanie jest uświęcone chyba jakąś szczególną tradycją: napisz funkcje do obliczania silni. Zrób dwie wersje - iteracyjną oraz rekurencyjną. Sprawdź, jak wielkie mogą być liczby, które perl będzie umiał obliczyć. Zapoznaj się z modułem Math::BigInt. Czy można wykorzystać go do policzenia większych wartości silni?
- Kolejne klasyczne zadanie: napisz funkcję, liczącą N-ty element ciągu Fibbonaciego. Jeżeli nie pamiętasz co to za ciąg, lepiej się do tego nie przyznawaj :)
- Napisz funkcję ReadFile wczytującą cały plik do zmiennej skalarnej. Taka funkcja może być całkiem przydatna.
- Napisz funkcję obliczającą liczbę magiczną: czyli taką, która pochodzi z sumowania wszystkich cyfr pierwotnej liczby. Funkcję tę możesz wykorzystać w celu wywróżenia sobie oceny końcowej. Podaj jako argument wartość liczbową swojej daty urodzenia i wylicz wynik, dzieląc go modulo przez 4. Do wyniku dodaj 2. W sumie, wszystko jedno co dodasz, ponieważ tego typu wróżenie jest bez sensu. Wiadomo, że ocena końcowa zależna będzie od twojej WIEDZY, a nie daty urodzenia :)
- Jeżeli mowa o datach, to napisz funkcję zwracającą czas systemowy, sformatowany, czyli np. w postaci YYYY-MM-DD lub YY-MM-DD HH:MM:SS. Inne formaty także powinny być możliwe, a sama funkcja powinna być wywołana w sposób następujący:
$data = DateFormat('YYYY-MM-DD'); # data moze być równa: 2006-03-28 $data = DateFormat('hh:mm:dd'); # data moze być równa: 13:25:47
- Jeżeli poprzednie zadania wydały ci się proste, to czas na coś ciut trudniejszego. Wyobraź sobie, że masz dany dowolny plik XML. Nie korzystając z żadnych dodatkowych modułów, napisz funkcję, która wywołana z parametrem będzie dawała jeden wybrany rekord z XMLa. Przykładowo, jeżeli XML zawiera listę tagów w o nazwie "dom", funkcja będzie zwracała je kolejno, aż do ich wyczerpania. Chodzi o działanie podobne do czytania wierszami danych z pliku tekstowego: wiersze czytane są dopóty, dopóki są, i każdy zwracany jest po kolei. Tutaj funkcja ma zwracać nie wiersz z pliku, ale wybrany przez ciebie rekord. Pozostałe dane mają zostać pominięte. :) Dla pewności, oto przykład:
while( my $dane = GetXMLdata("<dom>") ){ # rob cos z danymi, zmienna dane zawiera np. <dom>Jednorodzinny</dom> # ale moze zawierac takze np. <dom><powierzchnia>112m</powierzchnia><cena>2000</cena></dom> }
- Napisz funkcję testującą generator liczb losowych. Funkcja powinna pobierać jeden parametr: liczbę losowań, a jej wynikiem powinna być wartość średnia otrzymana po uśrednieniu wyników losowań. Zaobserwuj jak zmienia się wartość średniej dla cykli losowań od 1 do 10000. Zależność możesz przedstawić na wykresie, jeżeli oczywiście znasz program gnuplot lub inne narzędzie do wizualizacji danych. Oto przykładowy wykres:
- Poczytaj o module Benchmark. Za jego pomocą sprawdź, o ile szybsze jest wykonanie funkcji perla, które odwołują się do argumentów bezpośrednio, przez @_, w stosunku do funkcji, które robią te same zadania, a które korzystają ze zdejmowania argumentów i umieszczania ich w zmiennych. Przykładowo, możesz przetestować czasy działania funkcji poniżej:
sub dodajA { return $_[0] + $_[1] + $_[2]; } sub dodajB { my($a,$b,$c) = @_; return $a + $b + $c; } sub dodajC { my $a = shift; my $b = shift; my $c = shift; return $a + $b + $c; }
Jak można wytłumaczyć różnice pomiędzy czasem wykonania funkcji? Co według ciebie zabiera najwięcej czasu? - Sprawdź działanie modułu Test::Simple, i za jego pomocą określ, CO jest rezultatem działania operacji 1==2 w perlu.
- Napisz swoją własną funkcję szyfrującą dane. Dane mogą być napisem tekstowym, a funkcja może tak skomplikowana jak tylko chcesz. Szyfrowanie musi być odwracalne, to znaczy, że prawdopodobnie będziesz potrzebował drugiej funkcji, która zaszyfrowany tekst odszyfruje - możesz zrobić to także za pomocą jednej i tej samej funkcji. Funkcję szyfrującą możesz następnie wykorzystać, aby za jej pomocą wykonywać różnego rodzaju operacje, np. porozumiewanie się z innymi uczestnikami zajęć w sposób niezrozumiały dla prowadzącego. Możesz także za jej pomocą przesyłać komunikaty na GG, ircu lub w innych mediach. Możesz nawet opanować działanie funkcji pamięciowo i po nabraniu wprawy używać do szyfrowania swojego mózgu online, pisząc notatki z wykładów w postaci zakodowanej. Nie jest to zalecane, ale praktyka wskazuje, że niektórzy ten sposób stosują, powodując, że notatki są nieczytelne :)
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.