Wyjściowka nr. 3 :]

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Pytania i zadania

Odpowiedzi do zadań i pytań zadanych na kolokwium nr. 3

Zadania dla grupy 1

Start: 2006-12-07 09:40, czas: 20 minut czasu delty.
  1. Wyjaśnij szczegółowo, co oznaczają wszystkie elementy napisu $tab[1].
    Jest to zwykła wartość skalarna, na co wskazuje znak $, tablicy tab o indeksie [1], czyli drugi element tablicy.
  2. Podaj przynajmniej dwa sposoby na utworzenie tablicy 5-elementowej.
    Zakładając, że tworzymy nową tablicę @a, której jeszcze nie było, można zrobić to tak (każdy wiersz to inny, niezależny sposób, a tablica wcześniej nie istniała): @a = (1,2,3,4,5); # wartości to (1,2,3,4,5) oczywiście @a = (10..14); # wartości to (10,11,12,13,14) @a = (1) x 5; # wartości to (1,1,1,1,1) $#a = 4; # wartości to (undef,undef,undef,undef,undef) $a[4] = 1; # wartości to (undef,undef,undef,undef,1) splice(@a,0,5,(1)x5); # wartości to (1,1,1,1,1) $a[$_]=$_ for(0..4); # wartości to (0,1,2,3,4)
  3. Zmienną #$C ustawiono na wartość 2. Ile elementów na tablica @C?
    Nie wiadomo i nie można tego ustalić w oparciu o treść pytania. Sekwencja znaków #$C to poza wnętrzem cytowanego napisu lub słów po prostu komentarz i jako taki, nie ma żadnego działania. Tym samym nie ma wpływu na tablicę @C, gdyby taka istniała. Mimo oczywistej podpuchy, było parę osób, które dały się złapać :)
  4. Wyjaśnij dlaczego wartość zmiennej $a jest taka, jaka jest w wyrażeniu $a = ($b,$c) = (0x2,0b100,010).
    Wartość zmiennej $a wynosi 3, dlatego, że do $a przypisywany jest w kontekście skalarnym wynik przypisania list. Wynik przypisania list jest normalnie listą, a lista nie istnieje w kontekście skalarnym. Zamiast tego, zwracana jest więc liczba elementów. Efektem ubocznym wyrażenia jest przypisanie wartości 2 do zmiennej $b i wartości 4 do zmiennej $c.
  5. Jeszcze raz - pytanie dowolne dotyczące typów danych perla, czyli skalarów, list i tablic. Szansa dla Ciebie!

Zadania dla grupy 2

Start: 2006-12-07 13:10, czas: 20 minut czasu delty.
  1. Wyjaśnij szczegółowo, co oznaczają wszystkie elementy napisu @tab[1].
    Zapis ten oznacza wycinek tablicy, który ma wartość jednoelementowej listy. Znak @ oznacza zmienną wielowartościową, tab to nazwa tablicy, z której pochodzą dane, a [1] to lista indeksów, które pobieramy. Tego typu zapis jest w pewnych sytuacjach równoważny z zapisem $tab[1] i w większości przypadków powinien być stosowany zapis w notacji skalarnej (ten ze znakiem $). Mimo to, tego typu konstrukt jest syntaktycznie poprawny, chociaż powinien być używany tylko wtedy, gdy podajemy więcej niż jeden indeks. Przypadek, w którym zapisujemy $tab[1,2,...,n] nie jest wspierany i sprowadza się do wywołania $tab[n] (z pominięciem wcześniejszych indeksów)
  2. Podaj przynajmniej dwa sposoby na usunięcie wszystkich elementów z tablicy.
    Jeżeli w tablicy @a były jakieś elementy, to każdy z poniższych wierszy spowoduje usunięcie ich wszystkich i w efekcie opróżnienie tablicy. @a = (); $#a = -1; pop @a while @a; shift @a until !@a; splice(@a,0,$#a+1); undef @a;
  3. Zmienną $#C ustawiono na wartość 3. Ile elementów ma tablica @C?
    Tablica ma cztery elementy, i jeżeli wcześniej nie istniała, to wszystkie one mają wartość undef. Zmienna $#C dla tablicy @C przechowuje indeks ostatniego elementu, i zmiana tej wartości automagicznie zmienia także rozmiar tabeli.
  4. Wyjaśnij dlaczego wartość zmiennej @a jest taka, jaka jest w wyrażeniu @a = ($b,$c) = (0x2,0b100,010).
    Wartością tablicy @a jest lista (2,4), która pochodzi z przypisania listy liczb (2,4,8) do listy zmiennych $b i $c. Takie przypisanie znajduje się w kontekście listy, a wartością jest pełna lista wszystkich udanych przypisań. Ponieważ zmienne są tylko dwie, możliwe były tylko dwa przypisania, i te elementy są dalej wartością całego podwyrażenia ($b,$c)=(0x2,0b100,010).
  5. Jeszcze raz - pytanie dowolne dotyczące typów danych perla, czyli skalarów, list i tablic. Szansa dla Ciebie!

Zadania dla grupy 3

Start: 2006-12-08 11:10, czas: 20 minut czasu delty.
  1. Wyjaśnij szczegółowo, co oznaczają wszystkie elementy napisu (1,2,$a)[2].
    Jest to wycinek listy (1,2,$a) zwracający jej trzeci element, czyli wartość zmiennej $a. Nawias okrągły jest tutaj operatorem tworzącym listę, a nawias kwadratowy iteratorem swobodnego dostępu ustawionym na pozycji 2 (trzeciej), co powoduje zwrócenie wartości umieszczonej na liście w tej pozycji.
  2. Podaj przynajmniej dwa sposoby na skrócenie tablicy dokładnie o połowę.
    Zakładając, że mamy tablicę, która zawiera osiem elementów (przykładowo), skrócenie jej możemy wykonać np. w taki sposób (każda linia to inny, niezależny sposób): @a = @a[0 .. $#a/2]; $#a /= 2; splice(@a,$#a/2+1,$#a+1); Powyższe sposoby obcinają końcową część tablicy. Obcięcie początkowej części można uzyskać tak: shift @a for @a; splice @a,0,$#a/2+1; ... a gdyby zaszła konieczność usunięcia elementów z przeplotem, można zrobić np. tak: splice @a,$i++,1 for @a; ... zakładając, że możemy wykorzystać zmienną $i, która tutaj jest indeksem usuwanego elementu. Przeplot następuje dlatego, że tablica z której usuwamy skraca się, z jednoczesnym wzrostem indeksu. W każdym przypadku w tablicy pozostanie połowa elementów.
  3. W programie utworzono siedmio-elementową tablicę @Y. Następnie wykonano operację $#Y/=2. Ile elementów ma tablica @Y i dlaczego akurat tyle?
    Tablica zawierająca 7 elementów zostanie obcięta do tablicy zawierającej tylko 4 elementy. Ostatni element ma indeks 6 i artymetycznie dzielony jest przez 2, co daje w wyniku 3. Wykonywane jest więc działanie $#Y = 3, co powoduje skrócenie tablicy do 4 elementów.
  4. Wyjaśnij dlaczego wartość zmiennej @a jest taka, jaka jest w wyrażeniu @a = ($b,$c) = (0x2,0b100,010).
    Zostało to wyjaśnione wcześniej.
  5. Jeszcze raz - pytanie dowolne dotyczące typów danych perla, czyli skalarów, list i tablic. Szansa dla Ciebie!

Zadania dla grupy 4

Start: 2006-12-08 15:10, czas: 20 minut czasu delty.
  1. Wyjaśnij szczegółowo, co oznaczają wszystkie elementy napisu @{tab}.
    Jest to zapis oznaczający zmienną tablicową o nazwie tab. Znaki @{ ... } mają także działanie dereferencyjne, ale w tym przypadku jest ono ograniczone tylko do zwykłego cytowania nazwy tablicy. Dlatego zapisu tego używa się w przypadkach, gdy interpolacja wewnątrz napisu nie jest jednoznaczna, np. "@tabulator" i "@{tab}ulator". W pierwszym przypadku perl będzie próbował interpolować w napisie zmienną @tabulator, natomiast w drugim poprawnie zinterpoluje zmienną @tab.
  2. Podaj przynajmniej dwa sposoby na usunięcie elementów z tablicy, czyli na zmniejszenie jej długości.
    Zakładając, że tablica np. @T istnieje, i zawiera sporo elementów, usunąć jeden z nich można tak (każdy wiersz to osobna operacja powodująca usunięcie elementu o indeksie $i): splice @T,$i,1; @T = @T[ 0 .. $i-1, $i+1 .. $#T+1]; # kosztowne czasowo, słuszne dla $i>=0 @T[$i .. $#T] = @T[$i+1 .. $#T+1]; $#T--; # też kosztowne Jeżeli chodzi tylko o usunięcie początkowego elementu, lub końcowego, to z pomocą mogą przyjść operatory shift (usuwa z początku tablicy) i pop (usuwa z końca): pop @T; # usuwa jeden element z końca tablicy shift @T; # usuwa pierwszy element tablicy
  3. W programie utworzono siedmio-elementową tablicę @v. Następnie wykonano operację $#v*=2. Ile elementów ma tablica @v i co można powiedzieć o wartości niektórych z nich?
    Tablica 7-elementowa ma ostatni indeks równy 6 ($#v). Jego podwojenie ustawia go na wartość 12, co powoduje, że tablica ma 13 elementów. Elementy o indeksach 7 do 12 są to wartości niezdefiniowane (undef).
  4. Wyjaśnij dlaczego wartość zmiennej $a jest taka, jaka jest w wyrażeniu $a = ($b,$c) = (0x2,0b100,010).
    Odpowiedź na to pytanie można znaleźć powyżej.
  5. Jeszcze raz - pytanie dowolne dotyczące typów danych perla, czyli skalarów, list i tablic. Szansa dla Ciebie!

Jeżeli na tej stronie znalazłeś błąd, lub znasz lepsze wyjaśnienia zadań, proszę, napisz do mnie na adres manty.

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa - Perl - Kolokwia
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.