Wyjściowka nr. 4 :7
Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowaPytania i zadania
Odpowiedz na zebrane poniżej zadania. Odpowiedzi wyślij mailem do prowadzącego zajęcia, umieszczając w tytule następujące informacje: [kolo 4] [grupa N] Imie Nazwisko
gdzie N jest numerem twojej grupy. Przestrzegaj limitu czasu pisania. Na zrobienie tego kolokwium jest dokładnie 20 minut. Z tego kolokwium możesz otrzymać maksymalnie 5 punktów. Uwaga: niektóre pytania mogą być odrobinę podchwytliwe...
Zadania dla grupy 1
Start: 2007-01-04 09:40, czas: 20 minut czasu delty.- Wyjaśnij czym różni się zapis (1,2,3) od zapisu [1,2,3]. Jakiego typu jest to wartość w typowym dla niej kontekście?
Mamy tu trzyelementową listę (1,2,3), oraz skalar będący referencją do tablicy anonimowej - [1,2,3]. Nie jest to natomiast tablica, jak sądzili niektórzy... To, że można zrobić z niego tablicę przez dereferencję, o niczym nie przesądza. Konstruktorem anonimowej tablicy są nawiasy kwadratowe, podobnie jak konstruktorem listy są nawiasy okrągłe. W kontekście skalarnym pierwsza wartość zostanie skonwertowana do ostatniego elementu listy, natomiast druga wartość pozostanie - tak jak zawsze - skalarem.
- Zbuduj strukturę danych, która jest tablicą tablic i wpisz do niej pięć elementów (licząc na najbardziej zagłębionym poziomie) dwoma sposobami.
Tablica tablic to inaczej tablica, której elementami są referencje do innych tablic. Można taką strukturę utworzyć na wiele sposobów, np.
#definicja bezpośrednia @T = ( [1..5], [6..10], [11..15] ); #definicja z tablic @a = 1..5; @T = ( \@a, \@a, \@a ); #definicja elementów @a = 1..5; $T[0] = \@a; $T[1] = \@a; $T[2] = \@a; #poprzez dereferencję do tablic (automagicznie) @{$T[0]} = 1..5; @{$T[1]} = 6..10; @{$T[2]} = 11..15;
- To zadanie jest w pewien sposób wspólne dla wszystkich grup. Chodzi o podanie zapisu perlowego, który wyłuskuje określoną wartość ze skomplikowanej struktury danych (np. $a[1] daje drugi element tablicy @a). Tutaj chodzi o rzeczywisty przypadek. W pewnym programie obliczającym ruch orbitalny pewnego satelity szpiegowskiego zastosowano poniżej przedstawioną strukturę:
# orbital semi-coord irregular geo-gravitational system $GEO_XYZ = [ { earth => [ { horizontal => { hx => 1, hy => 2, hz => 3, }, }, { vertical => { vx => 4, vy => 5, vz => 6, }, }, { equatorial => { qx => 7, qy => 8, qz => 9, }, }, ], orbiter => { 1 => [ qw(X 10 11 12 13) ], 2 => [ qw(Y 20 21 22 23) ], 3 => [ qw(Z 30 31 32 33) ], }, space => 40, # attidute coord }, 0, -1, # for normalization boundaries ];
Wykorzystaj swoją wiedzę o strukturach wielopoziomowych, i podaj zapis perlowy zmiennej, której wartością jest:- wartość 0
- wartość 22
- wartość 6
- listę 1,2,3
Oto zmienne:
$GEO_XYZ->[1]
$GEO_XYZ->[0]{orbiter}{2}[3]
$GEO_XYZ->[0]{earth}[1]{vertical}{vz}
values %{$GEO_XYZ->[0]{earth}[0]{horizontal}} (kolejność ignorujemy) - Narysuj strukturę, która powstaje w zmiennej $A, po napisaniu:
$A->[1]{1}[1]{1} = 1;
Ta struktura wygląda tak:$A = [ undef, { 1 => [ undef, { 1 => 1 } ] } ];
Wartość undef pojawia się dlatego, że w paru miejscach istnieje odwołanie do elementu nr 1, a element 0 nie został zdefiniowany, więc zostaje utworzony z wartością jak wyżej. Nie jest to "cos" jak pisali jedni, ani "0", jak zgadywali inni. To jest po prostu "undef". - Na wszelki wypadek: pytanie dowolne na typowych zasadach, z tym ograniczeniem, że może ono dotyczyć tylko wielopoziomowych struktur danych w perlu. Powodzenia.
Zadania dla grupy 2
Start: 2007-01-04 13:10, czas: 20 minut czasu delty.- Zbuduj strukturę danych, która jest tablicą asocjacyjną tablic i wpisz do niej pięć elementów (licząc na najbardziej zagłębionym poziomie) dwoma sposobami.
Należy zbudować strukturę, która jest haszem. Klucze w haszu mogą być dowolne, a ich wartościami powinny być referencje do tablic anonimowych. Oto, jak można było zrobić to zadanie:
%hash = ( t1 => [1,2,3,4,5], t2 => [2..6], t4 => [ qw(3 4 5 6 7) ] ); # inny sposób: $hash{aa} = [1..5]; $hash{bb} = [2..6]; $hash{cc} = [3..7]; # jeszcze inny sposób @{$hash{aa}} = 1..5; @{$hash{bb}} = 2..6; @{$hash{cc}} = 3..7; # wykorzystanie tablic @a = 1..5; @b = 2..6; @c = 3..7; %hash = ( a => \@a, be => \@b, ce => \@c );
- Wyjaśnij czym różni się zapis {2,1,4,5} od zapisu [2,1,4,5]. Jakiego typu są to wartości w kontekście skalarnym?
Zapisy różnią się rodzajem nawiasów, i w perlu będą miały osobne, rozbieżne interpretacje. Pierwszy z nich w kontekście skalarnym jest skalarem, zawierającym referencję do anonimowego hasza. Drugi jest skalarem zawierającym referencję do anonimowej tablicy. Oba elementy zawierają w nawiasach listę elementów, jednakże inny typ nawiasów powoduje skonstruowanie innego typu obiektu (raz hasz anonimowy, raz tablica anonimowa). Nie jest to zatem hasz, i nie jest to tablica (jak twierdziło z przekonaniem kilka osób)!
- To zadanie jest w pewien sposób wspólne dla wszystkich grup. Chodzi o podanie zapisu perlowego, który wyłuskuje określoną wartość ze skomplikowanej struktury danych (np. $a[1] daje drugi element tablicy @a). Tutaj chodzi o rzeczywisty przypadek. W pewnym programie obliczającym ruch orbitalny pewnego satelity szpiegowskiego zastosowano poniżej przedstawioną strukturę:
# orbital semi-coord irregular geo-gravitational system $GEO_XYZ = [ { earth => [ { horizontal => { hx => 1, hy => 2, hz => 3, }, }, { vertical => { vx => 4, vy => 5, vz => 6, }, }, { equatorial => { qx => 7, qy => 8, qz => 9, }, }, ], orbiter => { 1 => [ qw(X 10 11 12 13) ], 2 => [ qw(Y 20 21 22 23) ], 3 => [ qw(Z 30 31 32 33) ], }, space => 40, # attidute coord }, 0, -1, # for normalization boundaries ];
Wykorzystaj swoją wiedzę o strukturach wielopoziomowych, i podaj zapis perlowy zmiennej, której wartością jest:- wartość 40
- wartość 33
- wartość 8
- listę 4,5,6
Oto odpowiednie odwołania:
$GEO_XYZ->[0]{space}
$GEO_XYZ->[0]{orbiter}{3}[4]
$GEO_XYZ->[0]{earth}[2]{equatorial}{qy}
values %{ $GEO_XYZ->[0]{earth}[1]{vertical} } (kolejność ignorujemy) - Narysuj strukturę, która powstaje w zmiennej $A, po napisaniu:
$A->{2}{2}[2][2] = 2;
Struktura taka ma postać:$A = { 2 => { 2 => [ undef, undef, [ undef, undef, 2 ] ] } };
- Na wszelki wypadek: pytanie dowolne na typowych zasadach, z tym ograniczeniem, że może ono dotyczyć tylko wielopoziomowych struktur danych w perlu. Powodzenia.
Zadania dla grupy 3
Start: 2007-01-05 11:10, czas: 20 minut czasu delty.- Wyjaśnij czym różni się zapis (1,2,3) od zapisu [1,2,3]. Jakiego typu są to wartości w kontekście listowym?
Wbrew pozorom nie jest to dokładnie takie samo pytanie, jakie zostało zadane w pierwszej grupie. Ten kto liczył na podpowiedź, mógł się łatwo przeliczyć. Pierwszy zapis to oczywiście lista elementów, drugi, to skalar będący referencją do tablicy anonimowej. W kontekście listy wartością pierwszego zapisu jest lista, wartością drugiego zapisu jest lista jednoelementowa. Ten jeden element to nadal referencja do tablicy anonimowej.
- Zbuduj strukturę danych, która jest tablicą asocjacyjną tablic asocjacyjnych i wpisz do niej sześć elementów (licząc na najbardziej zagłębionym poziomie) dwoma sposobami.
Można np. utworzyć taką strukturę:
%hash = ( h1 => { 1..6 }, h2 => { 2..7 }, h3 => { 3..8 } ); #albo: $hash{aa} = { qw(a 1 b 2 c 3) }; $hash{bb} = { qw(z 0 y 1 x 2) }; #albo z innych haszy: %h1 = %h2 = %h3 = (1..6); %hash = ( h1 => \%h1, h2 => \%h2, h3 => \%h3 );
- To zadanie jest w pewien sposób wspólne dla wszystkich grup. Chodzi o podanie zapisu perlowego, który wyłuskuje określoną wartość ze skomplikowanej struktury danych (np. $a[1] daje drugi element tablicy @a). Tutaj chodzi o rzeczywisty przypadek. W pewnym programie obliczającym ruch orbitalny pewnego satelity szpiegowskiego zastosowano poniżej przedstawioną strukturę:
# orbital semi-coord irregular geo-gravitational system $GEO_XYZ = [ { earth => [ { horizontal => { hx => 1, hy => 2, hz => 3, }, }, { vertical => { vx => 4, vy => 5, vz => 6, }, }, { equatorial => { qx => 7, qy => 8, qz => 9, }, }, ], orbiter => { 1 => [ qw(X 10 11 12 13) ], 2 => [ qw(Y 20 21 22 23) ], 3 => [ qw(Z 30 31 32 33) ], }, space => 40, # attidute coord }, 0, -1, # for normalization boundaries ];
Wykorzystaj swoją wiedzę o strukturach wielopoziomowych, i podaj zapis perlowy zmiennej, której wartością jest:- wartość -1
- wartość 'Y'
- wartość 5
- listę 20,21,22
No to wyciągamy wartości:
$GEO_XYZ->[2]
$GEO_XYZ->[0]{orbiter}{2}[0]
$GEO_XYZ->[0]{earth}[1]{vertical}{vy}
@{$GEO_XYZ->[0]{orbiter}{2}}[1..3] - Narysuj strukturę, która powstaje w zmiennej $A, po napisaniu:
$A->[2][2]{2}{2} = 2;
Oto utworzona struktura:$A = [ undef, undef, [ undef, undef, { 2 => { 2 => 2 } } ] ];
- Na wszelki wypadek: pytanie dowolne na typowych zasadach, z tym ograniczeniem, że może ono dotyczyć tylko wielopoziomowych struktur danych w perlu. Powodzenia.
Zadania dla grupy 4
Start: 2007-01-05 15:10, czas: 20 minut czasu delty.- Zbuduj strukturę danych, która jest tablicą tablic asocjacyjnych i wpisz do niej sześć elementów (licząc na najbardziej zagłębionym poziomie) dwoma sposobami.
Tablica tablic asocjacyjnych, inaczej tablica haszy, to taka tablica, której elementami są referencje do haszy anonimowych. Można taką strukturę zbudować na wiele prostych sposobów, np.:
@T = ( { a=>1, b=>2, c=>3 }, { d=>4, e=>5, f=>6 } ); # inny sposób: %h = (1..6); $T[0] = $T[1] = \%h; # jeszcze inny: $T[0] = { 1 .. 6 }; $T[1] = { 2 .. 7 }; #itp.
- Wyjaśnij czym różni się zapis (1,2,3) od zapisu {1,2,3}. Jakiego typu są to wartości w kontekście skalarnym?
Pierwszy zapis to lista 3-elementowa. Drugi to skalar, którego wartością jest referencja do anonimowego hasza. W kontekście skalarnym lista zwróci swój ostatni element, natomiast referencja do hasza anonimowego pozostanie bez zmian.
- To zadanie jest w pewien sposób wspólne dla wszystkich grup. Chodzi o podanie zapisu perlowego, który wyłuskuje określoną wartość ze skomplikowanej struktury danych (np. $a[1] daje drugi element tablicy @a). Tutaj chodzi o rzeczywisty przypadek. W pewnym programie obliczającym ruch orbitalny pewnego satelity szpiegowskiego zastosowano poniżej przedstawioną strukturę:
# orbital semi-coord irregular geo-gravitational system $GEO_XYZ = [ { earth => [ { horizontal => { hx => 1, hy => 2, hz => 3, }, }, { vertical => { vx => 4, vy => 5, vz => 6, }, }, { equatorial => { qx => 7, qy => 8, qz => 9, }, }, ], orbiter => { 1 => [ qw(X 10 11 12 13) ], 2 => [ qw(Y 20 21 22 23) ], 3 => [ qw(Z 30 31 32 33) ], }, space => 40, # attidute coord }, 0, -1, # for normalization boundaries ];
Wykorzystaj swoją wiedzę o strukturach wielopoziomowych, i podaj zapis perlowy zmiennej, której wartością jest:- wartość undef
- wartość 21
- wartość 4
- listę 30,32,33
Zadanie jest ciut podchwytliwe, ponieważ z pozoru nie ma wartości undef nigdzie w danych tablicy. Wystarczy jednak odwołać się do dowolnego, nieistniejącego wcześniej elementu, i gotowe! Fakt, że utworzy to nowy element o wartości undef możemy tutaj pominąć. Oto rozwiązania:
$GEO_XYZ->[0]{bla}
$GEO_XYZ->[0]{orbiter}{2}[2]
$GEO_XYZ->[0]{earth}[1]{vertical}{vx}
@{$GEO_XYZ->[0]{orbiter}{3}}[1,3,4] - Narysuj strukturę, która powstaje w zmiennej $A, po napisaniu:
$A->{4}{3}[2][1] = 0;
Struktura, która powstanie na skutek wykonania takiej instrukcji przypisania, ma postać:$A = { 4 => { 3 => [ undef, undef, [ undef, 0 ] ] } };
I tyle. - Na wszelki wypadek: pytanie dowolne na typowych zasadach, z tym ograniczeniem, że może ono dotyczyć tylko wielopoziomowych struktur danych w perlu. Powodzenia.
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 Informatyki - Strona domowa - Perl - Kolokwia[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.