INF3110/4110
Ukeoppgaver uke 36 (3.-5.9.2003)
Oppgave 1 (Oppgave 1.3 fra l?reboka)
---------
Skriv et program som viser hvorfor optimaliseringen som er nevnt i
kapittel 1.5.3 generelt ikke kan gj?res i C.
Kan en slik optimalisering gj?res i Java?
Oppgave 2
---------
Hva er et programmeringsspr?k? Diskuter.
Oppgave 3
---------
I Simula/Java, hva er statisk kjent (dvs kjent under kompileringen)
og hva er dynamisk kjent (dvs kjent f?rst under kj?ringen)?
* skopet til vanlige variable (integer/int, real/float, etc)
* skopet til prosedyrer/metoder
* skopet til pekere
* levetiden til vanlige variable
* levetiden til klasseobjekter
* typen til vanlige variable
* typen til pekere med bruk av qua/typekonvertering(?casting?), for
eksempel P qua C.x / ((C)P).x
* typen til pekere uten bruk av qua/typekonvertering
(Svarene blir de samme i Simula og Java.)
Oppgave 4
---------
I forbindelse med blokker, skop og bindinger blir eksemplene ofte gitt
i det som kalles et ?Algol-lignende spr?k?. Dette spr?ket ser slik ut:
* Hovedprogrammet er en blokk.
* En blokk starter med BEGIN og slutter med END. Den kan inneholde
deklarasjoner og setninger.
* Deklarasjonene er enten av variable eller av prosedyrer (som er
det samme som funksjoner og metoder).
VAR x, y;
PROCEDURE P; BEGIN ... END P;
Siden definisjonen av en prosedyre er en blokk, kan den inneholde
nye deklarasjoner (og setninger, selvf?lgelig).
Prosedyrer kan ha parametre.
* Setninger er indre blokker, tilordning og prosedyrekall; ?vrige
setninger innf?res ved behov.
I det hele tatt er det ikke s? viktig med den konkrete syntaksen; det
er blokkene og bindingene som er det essensielle.
Gitt f?lgende Algol-aktige program:
BEGIN
VAR x, y;
PROCEDURE P;
BEGIN
PROCEDURE Q;
BEGIN
VAR y;
PRINT x;
END Q;
VAR x;
x := 2; y := 3;
CALL Q;
END P;
x := 1;
CALL P;
END
Angi skopet til de to x-ene og y-ene n?r det benyttes skop fra
deklarasjonsstedet. Angi det samme n?r det brukes skop i hele blokken.
Hvilken verdi av x skrives ut i de to tilfellene? Hvilken verdi ville
bli skrevet ut hvis x hadde v?rt bundet dynamisk?
Oppgave 5
---------
Skriv et program i et Algol-aktig spr?k som oppf?rer seg ulikt om det
benyttes forskjellige skopregler. Om det benyttes statisk binding fra
deklarasjonsstedet, skal programmet skrive 1; om det brukes statisk
binding i hele blokken, skal det skrive 2; om det er dynamisk binding,
skal det skrives ut 3.
Oppgave 6
---------
I ML kan vi definere typene
type L = int list;
type LL = int list list; (* alternativt: type LL = L list *)
hvor alts? L er lister av tall, mens LL er lister av lister av tall.
For eksempel er [[1,2],[3,4,5],[]] av typen LL.
1. Lag en funksjon
fun flatut(l:LL):L = ...
som tar en liste av lister av tall som parameter, og flater ut
denne (dvs funksjonsverdien er en utflatet liste av type
L). F.eks. skal flatut([[1,2],[3,4,5],[]]) bli [1,2,3,4,5].
2. Lag en funksjon
fun summer(l:LL):L = ...
som summerer de indre listene i l. F.eks. skal
summer([[1,2],[3,4,5],[]]) bli [3,12,0]. Summen av en tom liste
regnes her som 0.
3. Lag en funksjon
fun sumall(l:LL):int = ...
som finner summen av alle tall i en liste av lister. F.eks. skal
sumall([[1,2],[3,4,5],[]]) bli 15. (Hint: bruk funksjonen fra
forrige punkt.)
4. Lag en funksjon
fun speil(l:LL):LL = ...
som speilvender en liste av lister. Indre lister skal ogs?
speilvendes. F.eks. skal speil([[1,2],[3,4,5],[]]) bli
[[],[5,4,3],[2,1]].
5. Lag en funksjon
fun sorter(l:L):L = ...
som sorterer en liste l (uten indre lister). F.eks. skal
sorter([5,4,3]) bli [3,4,5].
6. Lag en funksjon
fun sorterindre(l:LL):LL = ...
som sorterer de indre listene i en liste av lister l. F.eks. skal
sorterindre([[],[5,4,3],[2,1]]) bli [[],[3,4,5],[1,2]].
Oppgave 7
---------
Skriv en ML-funksjon som setter inn et element sist i en liste.
Oppgave 8
---------
Skriv en ML-funksjon som returnerer det siste elementet i en gitt
liste.
Oppgave 9
---------
Skriv en ML-funksjon
fun plukk(n, l) = ...
som plukker ut de f?rste n elementene fra listen l. For eksempel skal
plukk(3, [2,4,6,8,10]) gi [2,4,6]. Du kan anta at l best?r av minst n
elementer.
Oppgave 10
----------
Skriv en ML-funksjon
fun fjern(n, l) = ...
som fjerner de f?rste n elementene fra listen l. For eksempel skal
fjern(3, [2,4,6,8,10]) gi [8,10]. Du kan anta at l best?r av minst n
elementer.