Ukeoppgaver for uke 5 (30.01.-03.02.)

Her er en pdf-utgave av oppgavene som dere skal løse og som blir gjennomgått på plenumsøvelsen onsdag 1. februar:

ukeoppgaver uke 5

Løsningene på flere av oppgavene kan brukes nokså uendret i oblig 1.

Den viktigste oppgaven fra settet er nøkkeloppgaven. Den er en god kontroll på at du har fått med deg det vesentlige med å lage og løpe igjennom (traversere) en lenket liste. Den gjengis her i en litt annen form:

Lag et fullstendig program LagListe som skal startes fra kommandolinja slik:
Lagliste Per Ali Ane Heidi Ola ....
og som oppretter en lenket liste med personobjekter i samme rekkefølge som de ble skrevet. Sjekk programmet ved å skrive ut navnene i samme rekkefølge som de ble skrevet på kommandolinja.

Print

16 Responses to “Ukeoppgaver for uke 5 (30.01.-03.02.)”

  1. Inthu - January 26, 2012

    Oppgave 4:

    “Lag en klasse LIFOPersoner basert på personliste-klassen…”
    I oppgaven var det beskrevet om klassene Person og Personer. Hvor kommer personliste-klassen inn?
    I følge min tolkning er “personliste” en peker til det første Person-objektet i lista, og den ligger i Personer-klassen (?)

    [Reply]

    Kristian (gruppelærer gr.8) Reply:

    Det er Personer som er ment med “personlisteklassen” her, så din tolkning er helt riktig.

    [Reply]

    Stein Michael Reply:

    Ja, navnevalget er litt uheldig. Bør døpe om Personer til Personliste og personliste (variabelen) til førsteperson.

    [Reply]

  2. Dude - January 26, 2012

    hva er %n og %s i en string?… ble brukt i fellesplenum på onsdag denne uken. prøvde det ut på pcen min for å sjekke, ble bare skrevet ut %n og %s XD anyone? :P

    [Reply]

    Jonny Reply:

    Dette er spesielle symboler du kan gi i det første argumentet til funksjonen printf() (altså ikke print, men printf), som har spesiell betydning for funksjonen. F.eks. betyr %n linjeskift, %s betyr skriv ut en string-verdi, %d betyr skriv ut en heltallsverdi.

    Her er et eksempel på hvordan du kan bruke printf kontra System.out.println():

    int ant = 2;
    String var = “variabler”;
    System.out.println(“Her er ” + ant + ” teite ” + var + “!”);
    System.out.printf(“Her er %d teite %s!%n”, ant, var);

    Du må altså for hvert symbol legge til et argument etter det første argumentet i printf-funksjonen (i samme rekkefølge som symbolene opptrer i teksten i det første argumentet), bortsett fra noen spesielle symboler som %n. Søk etter printf på Wikipedia :-)

    [Reply]

    Kristian (gruppelærer gr.8) Reply:

    Kjempebra forklaring!
    Hvis man vil vite alt som er å vite om printf-formatstrengens syntaks i Java, står det om det i APIet her: http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax

    [Reply]

  3. Espen - January 27, 2012

    Hei,

    har det noen betydning hvordan man strukturer settInn og taUt metoder i FIFO og LIFO lsiter så lenge resultatet er det samme?

    For eksempel i en LIFO-liste:
    - Jeg kan sette inn nye objekter på første plass og ta ut på siste plass, men jeg kan også sette inn objekter på siste plass og ta ut på første plass.

    Finnes det noen retningslinjer for hva man bør gjøre?
    Beklager hvis dere har gått igjennom dette på forelesning, men hadde ikke annledning til å være der.

    [Reply]

    Kristian (gruppelærer gr.8) Reply:

    Det har ikke så mye å si, det viktige er at du setter inn og tar ut på motsatte ender av (FIFO-)listen, for å si det slik.

    Det er forsåvidt ikke noen vesensforskjell på endene, heller, vi bare kaller det begynnelse og ende for å huske hvor vi skal ta/sette inn – det er bare to ender av en liste egentlig, hvilken vi kaller hva har ikke noe å si.

    [Reply]

  4. Espen - January 27, 2012

    Beklager, mente FIFO-liste.

    [Reply]

  5. Thomas Gabrielsen - January 27, 2012

    Hvis listen er tom og man kaller på f.eks. metodene hentPerson( String navn ) eller hentPersonFør( String navn ), vil det da være riktig å returnere null, “kaste” en “NullPointerException” eller “IndexOutOfBoundsException” tilbake? For så videre å fange feilmeldingen (try/catch) der man kaller på metoden? Det kan ikke være riktig å returnere et tomt Person objekt for da sier man jo også at listen inneholder ett element (at lengden på listen == 1). Javas ferdige klasser som LinkedList og Array gjør jo det samme hvis man prøver å kalle på et objekt som ikke er der. For eksempel kaster LinkedLists get() “IndexOutOfBoundsException” tilbake hvis man kaller på et object som ikke er i listen.

    [Reply]

    Jonny Reply:

    Ved LinkedList’s get(int index) sier at du skal hente et element med en bestemt plassering i lista (du bør vite størrelsen på lista når du bruker denne metoden, f.eks. ved at du bruker size()-metoden først), da er det en god løsning å kaste en exception. For de metodene du nevner (hentPerson() og hentPersonFør()) mener jeg det er bedre å returnere null, da disse metodene er av typen “søk-og-finn” og det er helt greit at elementet ikke blir funnet. Et annet spørsmål er hva du bør gjøre hvis argumentet ‘navn’ selv er null… Andre spørsmål man bør tenke på: skal null-elementer tillates i lista? Skal det være mulig å tillate to eller flere like elementer i lista? I så fall, hva skal hentPerson() returnere da? Uansett hva du velger, er det god skikk og dokumentere hva du velger å gjøre i kommentarene for funksjonene dine (kan være lurt å skrive når du returnerer null eller kaster exceptions, og i så fall hvilke typer exceptions).

    [Reply]

    Thomas Gabrielsen Reply:

    Jeg googlet litt mer i går og ser at det er litt uenighet om dette. Det som virker klart er det er bedre å returnere null enn å returnere et objekt som er det andre alternativet i de aktuelle metodene. I Java 6 APIet under NullPointerException står det:

    Thrown when an application attempts to use null in a case where an object is required. These include:

    - Calling the instance method of a null object.
    - Accessing or modifying the field of a null object.
    - Taking the length of null as if it were an array.
    - Accessing or modifying the slots of null as if it were an array.
    - Throwing null as if it were a Throwable value.

    Applications should throw instances of this class to indicate other illegal uses of the null object.
    (http://docs.oracle.com/javase/6/docs/api/java/lang/NullPointerException.html)

    Det virker som Sun mente at man i slike tilfeller bør kaste (throw) en NullPointerException, men som sagt så ser jeg at det er uenighet om dette blant programmerere. Det jeg liker med å kaste en NullPointerException eller alternativt IllegalArgumentException (som kanskje er enda mer riktig i dette tilfellet) er at man kan sende med en forståelig beskjed som et String argument som man kan fange opp og skrive ut på skjermen i en try/catch metode.

    Om navnet er “null” i dette tilfellet er ikke et problem slik jeg har laget metoden fordi jeg sjekker om objektet er null, ikke navnet.

    Grunnen til at jeg spør om dette er fordi jeg lurer på hva som er best praksis, men også angående Oblig 1. Jeg har ikke begynt på selve programkoden på Oblig 1, men jeg vil tro at vi vil komme opp i lignende utfordringer der selv om testprogrammet forventer en tom Array tilbake på f.eks. hentPersoner().

    [Reply]

    Sigmund Hansen Reply:

    Det er ikke naturlig å kaste en NullPointerException her. Derimot er det naturlig å kaste en NullPointerException eller en IllegalArgumentException om parametret (navn) er null.

    Det er naturlig å returnere null om man ikke finner noe som passer.

    hentPersoner tilsvarer toArray, og denne returnerer også en tom rekke (array). Det gjør det enklere å skrive kode som lager rekka, og det gjør det enklere å skrive kode som jobber med rekka etter at man har hentet den ut (du trenger ingen spesiell kode for å håndtere null-pekere).

    Thomas Gabrielsen Reply:

    Hyggelig at folk tar seg tid til å svare i helga! :-)

    I utgangspunktet var det ikke hentPersoner() jeg lurte på. Det var dumt av meg å blande den i forrige post. Jeg ser nå at dette kanskje ikke er aktuelt i Oblig 1 alikevel.

    Metoden jeg lurte på opprinnelig var hentPerson( String navn ) i ukeoppgaven, og lignende tilfeller forøvrig i forbindelse med linkede lister. Hvis man sender inn et navn som ikke eksisterer med hentPerson( String navn ) og man lar denne returnere null så klarer jeg ikke å unngå å få en NullPointException hvis jeg ikke fanger den med en try/catch. Har jeg forstått det riktig hvis jeg returnere null hvis objektet som man søker etter ikke finnes, for så å fange den opp med en try/catch der jeg kaller på metoden?

    Sigmund Hansen Reply:

    Det vanligste er å sjekke om funksjonen returnerte en null-peker, ikke å fange NullPointerExceptions. Man skal egentlig aldri trenge å fange NullPointerExceptions eller andre RuntimeExceptions, for det regnes som programmeringsfeil om disse forekommer. Under finnes et enkelt eksempel på å sjekke om du fikk tilbake en null-peker:

    Person p = personer.hentPerson(navn);
    if (p == null) {
    System.err.printf(“%s finnes ikke i lista.%n”, navn);
    return;
    }

    System.out.printf(“%s har %d e-postadresser.”,
    p.hentNavn(), p.hentEpostadr().length);

  6. Thomas Gabrielsen - January 29, 2012

    Sigmun: Beklager! Det gikk litt fort for seg i går kveld. Jeg ser at du svarer på spørsmålet i første avsnitt av svaret ditt, og det er slik jeg opprinnelig så for meg at det skulle være før jeg begynte å blande inn NullPointerException.

    Igjen, takk for svar!

    [Reply]

Leave a Reply