Oblig 3 (INF1000 - H?st 2010)

Gulbrand Gr?s Husleiesystem
M?l: Form?let med denne oppgaven er ? gi trening i ? l?se et st?rre programmeringsproblem ved hjelp av klasser og objekter, kombinert med de andre elementene vi har studert til n? som filbehandling, arrayer, metoder, og brukerinteraksjon via terminal.

Leveringsfrist

Fredag 22. oktober kl. 16.00.  Leveres i dette Innleveringssystemet.  Husk ? velge innleveringsnummer 3.

Leveringskrav

F?r du leverer besvarelsen din kontrollér at den oppfyller f?lgende krav:

  1. Besvarelsen m? benytte objekter av de 3 klassene Utsyn, Hybel, og Student for ? kunne bli godkjent.  Dette betyr at informasjon om en hybel skal lagres i objekter av klassen Hybel, og informasjon om studenter lagres i Student-objekter.
  2. F?r du leverer skal du skrive en kommentar ?verst i programmet der du sier noe om besvarelsen din generelt, f.eks. at du har l?st alle deloppgaver og ekstraoppgaver, eller evt. hvilken deloppgave du ikke ble helt forn?yd med eller mangler litt arbeid.
  3. Hele programmet skal legges i kun én .java-fil, som b?r hete Oblig3.java, og skal inneholde alle klassene i besvarelsen din.  N?r du skal levere b?r du f?rst komprimere den til en .tgz- eller en .zip-fil (Se hint h).  Ikke bruk andre komprimerte filformater.  Hvis du ikke f?r til ? lage .tgz- eller .zip-fil kan du levere den ukomprimerte .java-filen.
  4. Java-n?kkelordet "package" skal ikke brukes.  Dette er for at retter skal kunne kj?re programmet uten ? bygge opp en spesiell mappe-struktur for hver innlevering.

Programmet skal bruke en datafil kalt hybeldata.txt som inneholder informasjon om husleiesystemet.  Denne filen skal du som sagt ikke levere, men du kan anta at den som retter obligen din har f?lgende eksempel-datafilen klar i samme mappe som programmet ditt n?r hun kj?rer det: hybeldata.txt.

Du kan diskutere med andre studenter hvordan dere skal l?se oppgaven, men det er ikke lov ? kopiere noe Java-kode fra dem, selv om du endrer p? koden etterp?; og det er heller ikke lov ? hente programbiter fra andre besvarelser, for eksempel fra Internet.  Hver student skal skrive sitt eget program.  Dette er n?rmere forklart i f?lgende krav til innleverte oppgaver ved Ifi, som du plikter ? ha lest og forst?tt f?r du leverer din besvarelse:

http://www.ifi.uio.no/studier/studentinfo.html#krav.
Alle innleveringer vil bli kontrollert med Joly.  Hvis du 亚博娱乐官网_亚博pt手机客户端登录et mye med andre eller hentet viktig hjelp fra andre kilder enn l?reb?ker, websidene til kurset, eller gruppel?rere og orakler, b?r du nevne de andre kildene i besvarelsen din og hvilke deler av programmet det gjelder, som forklart i lenken ovenfor.

Godkjentsystemet oppdateres manuelt av gruppel?reren din litt p? etterskudd.  Det vil derfor st? "ikke levert" inntil hun krysser av obligen din som godkjent/ikke-godkjent.  Bekreftelsen p? at leveringen gikk i orden f?r du i stedet via mail.  Hvis du fikk en slik mail-bekreftelse og valgte riktig innleveringsnummer (nr. 3 for denne obligen) s? er leveringen i orden.

Oppgave

Gulbrand Gr? har et lite hybelhus kalt Utsyn, med 18 studenthybler som han leier ut til studenter i Utopias hovedstad Uqbar.  Du skal lage et system for ? administrere utleie av hyblene i hybelhuset.  Utsyn har 3 etasjer, nummerert fra 1 til 3.  I hver etasje er det 6 hybler, kalt rom A til F, og et fellesrom.  Hver hybel har et entydig ?hybelnavn? som best?r av etasjenummer og rom-bokstav, f.eks. heter hybelen i rom C i andre etasje "2C".

Nedenfor ser du en illustrasjon av en etasje.  Alle etasjene har samme planl?sning.

[Bilde av en etasje i Hybelhus]

?konomi

Gulbrand Gr? leier ut hyblene i de to f?rste etasjene for 5000 kroner i m?neden, mens husleien for en hybel i toppetasjen er 6000 kroner p? grunn av utsikten.

Gulbrand har begrenset hans egne utgifter som eier av hyblene til 1200 kroner per hybel (A-F) per m?ned, og 1700 kr for fellesarealene i hver etasje, ved ? hyre inn et firma som tar seg av alt vedlikehold og andre l?pende utgifter, inkludert reparasjoner, kommunale avgifter, Internet- og kabel-tv-abonnement i hyblene, og utstyr og str?m til fellesarealer.  Alt dette tar firmaet Vedlikehold A/S seg av, mot at Gulbrand betaler hver m?ned: 1200 kr per hybel (for hyblene A-F i hver etasje, dette betaler han uansett om en hybel har beboer eller ikke), pluss 1700 kr per etasje for fellesarealer.  Beboerne betaler bare husleiene sine for hyblene A?F til Gulbrand, og han tar fra disse inntektene og betaler Vedlikehold A/S for jobben de gj?r.  Str?mregninger for hyblene A-F inng?r ikke i systemet siden disse betales direkte og adskilt av beboerne til str?mselskapene de velger.  Gulbrand har installert egen str?mm?ler i hver hybel for ? slippe ? tenke p? dette.

Datafilen "hybeldata.txt"

N?r programmet starter (og f?r hovedmenyen skrives ut p? skjermen), skal programmet lese datafilen hybeldata.txt.  I denne filen er det lagret blant annet informasjon om hvor lenge systemet har v?rt i drift og navn p? de n?v?rende leietagerne. F?rste linje i filen inneholder fire heltalls-verdier adskilt med semikolon:
int m?ned; int ?r; int totalfortjeneste; int totaltAntallM?neder
Her er "int m?ned" og "int ?r" n?v?rende m?neds- og ?rstall (eller mer presist, m?nedsnummeret og ?rstallet da m?nedskj?ring sist ble utf?rt), hvor m?ned er et tall i omr?det 1 til 12, og ?rstallet er f.eks. 2010.  Det tredje tallet er Gulbrands totale fortjeneste siden systemet ble satt i drift; og det siste tallet angir antall m?neder systemet har v?rt i drift.

Deretter er det 18 linjer, en for hver hybel, med f?lgende format:

int etasje; char bokstav; int saldo; String studentnavn

Eksempel p? fire mulige linjer som kan v?re i begynnelsen av datafilen:

9;2010;1400500;24
1;A;6000;Ole Johan
1;B;12000;Erik Smith
1;C;0;TOM HYBEL
...osv...
For tomme hybler skal studentnavnet lagres i datafilen som TOM HYBEL, med saldo 0.  Du kan anta at alle studenter har unike navn.  (Se hint b under for tips om lesing av datafilen.)  Internt i programmet kan du velge om du representerer tomme hybler med verdien null, eller med det spesielle studentnavnet TOM HYBEL, eller p? en annen m?te.

Alle disse dataene skal holdes oppdatert internt i programmet mens det kj?rer, og skal skrives tilbake til datafilen n?r brukeren utf?rer ordre '0' i hovedmenyen ("Avslutt").  Slik kan Gulbrand starte og avslutte programmet uten ? miste data.

Menyvalgene

Programmet skal v?re menystyrt.  Det skal skrive ut p? skjermen en meny over mulige ordre og be brukeren om ? taste en av disse.  Hvis brukeren taster inn en ulovlig ordre, skal det gis feilmelding.  Programmet skal g? i l?kke og fortsette ? lese og utf?re ordre helt til brukeren taster ordre '0' for ? avslutte.  Bruker skal kunne gi 7 ordre:

  1. Skriv oversikt
  2. Registrer ny leietager
  3. Registrer betaling fra leietager
  4. Registrer frivillig utflytting
  5. M?nedskj?ring av husleie
  6. Kast ut leietagere
  7. Avslutt
Detaljert beskrivelse av ordrene:
  1. Skriv oversikt
    N?r bruker gir denne ordren skal programmet skrive ut en oversikt over alle hyblene, som viser for hver hybel: hybelnavn, leietager-navn, og saldo.  Dersom hybelen er ledig, skal teksten LEDIG skrives ut i stedet for leietager-navn i oversikten, og saldoen skal vises som 0.  Til slutt skal n?v?rende m?ned, ?r, antall m?neder systemet har v?rt i drift, og totalfortjeneste skrives ut p? skjermen.  Eksempel p? hvordan oversikten kan se ut:

    Hybel Leietager               Saldo
    ----- --------------------- -------
    1A    Ole Johan                6000
    1B    Erik Smith              12000
    1C    ( LEDIG )                   0
               ...osv...
    M?ned/?r, og driftstid:  9/2010,  24 mnd. i drift
    Totalfortjeneste:        1400500 kr
    


  2. Registrer ny leietager
    Denne ordren brukes n?r en student ?nsker ? flytte inn og leie en av hyblene.  F?rst skal systemet sjekke om det finnes ledige hybler.  Hvis det ikke er noen ledige hybler skal programmet bare skrive ut en melding om det og returnere til hovedmenyen.

    Hvis det finnes ledige hybler skal hybelnavnene til disse (f.eks 1C, 2B) skrives ut p? skjermen, og s? skal programmet sp?rre hvilken av disse studenten ?nsker ? leie (se hint e under for hvordan slike hybelnavn kan leses fra tastatur).  Bruker skal kunne taste inn ?nsket hybelnavn som 1C, 2B, osv.  Er valgt hybel ledig, skal programmet sp?rre om studentens navn, og registrere innflyttingen.

    Studenten som flytter inn betaler samtidig et depositum p? 10 000 kroner.  Fra dette trekkes det med én gang m?nedsleien for den f?rste m?neden (husk at m?nedsleien er avhengig av etasje).  Det som er til ?vers blir studentens saldo (her kan du lese en definisjon av saldo, ogs? p? engelsk), men det kan forklares som beholdningen i en slags forenklet bankkonto som leietagerne har hos Gulbrand: N?r de betaler inn for husleie legges bel?pet til i saldoen, og ved "m?nedskj?ring" blir husleien trukket fra saldo.  Saldoen vil v?re negativ hvis studenten skylder Gulbrand penger.  Han liker ? gj?re ting enkelt for seg selv, s? han trekker alltid én hel m?nedshusleie ved innflytting, som nevnt ovenfor, uansett hvilken dag i m?neden studenten flyttet inn.

    Programmet skal til slutt skrive ut en beskjed p? skjermen om at innflyttingen ble gjennomf?rt.  Beskjeden skal inneholde hybelnavnet (etasje+bokstav), studentens navn, og gjenv?rende saldo.


  3. Registrer betaling fra leietager
    Programmet skal sp?rre om et hybelnavn (f.eks. 2B), og bel?pet som beboeren i den oppgitte hybelen skal betale.  Hvis hybelen som ble oppgitt ikke hadde beboer skal det skrives en feilmelding.  Hvis det derimot var en beboer der skal bel?pet adderes til studentens saldo og en passende melding skrives p? skjermen.  Saldoen fungerer som en slags konto som studenten har hos Gulbrand, og hver student m? passe p? ? ha nok penger i denne saldoen til ? dekke husleiene hver m?ned.


  4. Registrer frivillig utflytting
    Programmet sp?r om navnet p? studenten som ?nsker ? flytte ut.  Deretter g?r programmet gjennom alle hyblene og ser om det finnes en student med det navnet.  Hvis studenten ikke ble funnet, skal det gis en feilmelding.

    Blir studenten funnet, skal du registrere i systemet at hybelen ikke lenger har beboer (du kan f.eks. angi dette vha. null-peker eller bruke det spesielle navnet "TOM HYBEL", men det du velger m? selvsagt fungere sammen med resten av programmet ditt).

    Studenten blir trukket et gebyr p? 650 kroner for utflyttingen, som du legger til Gulbrands totale fortjeneste, og resten av saldoen f?r studenten tilbake (hvis den var p? mer enn 650 kr).  Skriv ut p? skjerm evt. tilgodebel?p etter ? ha trukket utflyttingsgebyret fra saldoen.  Hvis studenten hadde mindre enn 650 kr. igjen i saldoen antar vi for enkelhets skyld at hun betaler restbel?pet n? samtidig med utflyttingen.  Skriv i s? fall ut det totale restbel?pet hun betalte; dette bel?pet legges til i Gulbrands totalfortjeneste, inkludert utflyttingsgebyret.

    [ Ekstraoppgave 1: Alfabetisk sortering: Hvis du ?nsker det kan du utvide denne ordren til ? vise en liste eller meny med student-navnene sortert alfabetisk, slik at det blir lettere for Gulbrand ? velge den som skal flytte ut. ]

  5. M?nedskj?ring av husleie
    Meningen er at Gulbrand skal utf?re denne ordren f?rste dag i hver m?ned.  N?r ordren velges skal programmet f?rst sp?rre om brukeren virkelig ?nsker ? utf?re m?nedskj?ringen, for m?neden som kommer etter m?neds- og ?rstallet da m?nedskj?ring sist ble utf?rt (f.eks. hvis siste m?nedskj?ring ble utf?rt for m?ned 9 i ?r 2010, kan sp?rsm?let v?re "?nsker du ? utf?re m?nedskj?ring for m?ned 10/2010 (j/n)?").  Svarer brukeren n, returnerer programmet til hovedmenyen.

    Svarer brukeren j, skal m?nedsnummeret (og ved ?rsskiftet ?rstallet ogs?) oppdateres, og det utf?res det m?nedlige regnskapet.  Programmet g?r gjennom alle hyblene: For hver hybel som har beboer trekkes m?nedsleien for hybelen fra studentens saldo og legges til Gulbrands m?nedsfortjeneste hvis det var nok dekning i saldoen.  Gulbrand belaster alts? husleien forskuddsvis, for m?neden som nettopp har begynt.  Hvis noen leietagere ikke hadde nok i saldoen s? trekkes likevel hele husleien fra saldoen, som g?r da i minus, men Gulbrands fortjeneste ?kes bare med det som var p? saldo (han har uansett en god l?sning p? slike tilfeller, og f?r inn resten av fortjenesten som forklart i menyvalg 6). Videre trekkes (Gulbrands) utgifter fra (Gulbrands) m?nedsfortjeneste.  Gulbrands utgifter er kort og godt det han betaler til Vedlikehold A/S for vedlikehold og lignende.  Husk at det er forskjellige utgifter for hybler og fellesarealer, som forklart i avsnittet ?konomi ovenfor.

    Til slutt skal f?lgende skrives til skjerm:

    1. M?ned/?r som m?nedskj?ringen gjelder for; og driftstid i antall m?neder systemet har v?rt i drift, inkludert den nye m?neden.
    2. M?nedens fortjeneste: er Gulbrands inntekter minus utgifter i denne m?nedskj?ringen.  Hvis du ?nsker ? vise andre inntekter fra utflyttinger, innflyttinger, eller lignende siste m?ned, s? skriver du dette ut som en egen post, den vanlige "m?nedens fortjeneste" skal kun vise regnskapet for m?nedskj?ringen forklart ovenfor.
    3. Totalfortjeneste: er Gulbrands nye totalfortjeneste, oppdatert med med denne m?nedens fortjeneste.
    4. Gjennomsnittlig m?nedsfortjeneste regnes ut som (totalfortjeneste / totaltAntallM?neder).


  6. Kast ut leietagere
    Hybelhuset til Gulbrand er veldig popul?rt, med mange studenter som ?nsker ? leie.  For ? ?pne plass for nye leietagere (og sikre inntektene sine) s? har han innf?rt en regel om at leietagere som har kommet s? langt i minus p? saldoen at de skylder mer enn én husleie, blir kastet ut ved hjelp av torpedo n?r denne ordren utf?res.  Kravet til hver enkelt student som kastes ut er det de skylder i husleie pluss et utkastingsgebyr p? 3000 kroner.  Torpedoen og Gulbrand deler dette gebyret likt.  Gulbrands halvdel av gebyret pluss det studenten var i minus p? saldoen legges til totalfortjenesten med én gang n?r dette menyvalget kj?res (siden hjelperen hans alltid greier ? ordne disse sakene raskt), og hybelen registreres som ledig.

    Programmet g?r gjennom alle hyblene og finner studentene med saldo enda lavere enn én m?nedsleie i minus (husk de forskjellige leieprisene!).  For hver av disse studentene skal du kalle f?lgende hjelpemetode: (som du ogs? skal programmere)

    void tilkallTorpedo(int etasje, int rom, int krav) { // ...
    
    Denne metoden skriver hybelnavn (etasje+rom), studentens navn, og pengekravet, b?de til skjerm og til en fil kalt torpedo.txt.  N?r metoden skriver til filen, skal den ikke overskrive det som ligger der, men bare legge til en ny linje p? slutten (se hint f nedenfor).



  7. Avslutt
    Ved utf?relse av denne ordren skal n?dvendige data skrives til hybeldata.txt: m?ned, ?r, totalfortjeneste, antall m?neder i drift, samt leietager og saldo for alle hyblene.  Deretter skal programmet avslutte.


[ Ekstraoppgaver 2 - 5: Hjelpemetoder ]
Her er fire eksempler p? mulige hjelpemetoder som kan v?re nyttige i programmet ditt. Disse har b?de inn- og ut-parametre.  Programmér disse eller andre hjelpemetoder du f?r bruk for og benytt dem i l?sningen din p? de andre deloppgavene.

Hybel sp?rOmHybel(String ledetekst) {
    // x.2) Skriver ut "ledetekst" p? skjermen, leser et hybelnavn fra
    //      tastatur, og returnerer den tilh?rende Hybel-pekeren.
    return null;
}
String finnHybelnavn(int etg, int rom) {
    // x.3) Konverterer etg. og rom til et hybelnavn, f.eks. 0 0 til "1A".
    return null;
}
Student finnBeboer(String hybelnavn) {
    // x.4) Finner og returnerer peker til leietageren som leier hybelen
    //      angitt i inn-parameteren "hybelnavn".
    return null;
}

String stortTallTilString(int tall) {
    // x.5) Lager en tekst med en mer lettlest form av inn-parameteren "tall"
    //      med mellomrom hvert 3. siffer, f.eks. 1400500 skal gi "1 400 500".
    return null;
}


Hint

Disse hint er ment for de som ?nsker litt ekstra-hjelp.  Du trenger ikke lese dette avsnittet for ? l?se obligen.  Det vil ogs? bli lagt ut flere hint i kurs-bloggen, blant annet om hvordan du kan l?se obligen uten bruk av EasyIO.  F?lg ellers med p? "Siste beskjeder" p? kurshjemmesiden, der vil det blant annet komme informasjon om orakelhjelp til denne obligen.

  1. Programstruktur:  Nedenfor ser du et programskjelett du kan bruke som utgangspunkt hvis du ?nsker det.  Du kan utvide det med flere metoder, klasser, osv.  Hvis du synes det er vanskelig ? komme i gang med denne obligen anbefales det ? lese litt teori om klasser og objekter, f.eks. kapittel 8 i l?reboka eller Marit Nybakkens notat "objekter.pdf"; eller l?se ukeoppgaver 6 og 7.
  2. Det st?r i leveringskrav ovenfor at du m? benytte objekter av minst 3 klasser: Utsyn, Hybel og Student.  Det er nok med ett objekt av klassen Utsyn (det representerer hele hybelhuset).  Programmet b?r benytte 18 objekter av klassen Hybel.  Det kan argumenteres for at klassen Student er overfl?dig siden vi bare vet to ting om studentene: saldo og navn. Det er likevel fornuftig ? ha med denne klassen for ? samle disse to verdiene i ett type objekter, og ogs? i tilfelle Gulbrand senere ?nsker ? utvide systemet med mer informasjon om hver student, som f.eks. mobilnummer, innflyttingsm?ned o.l.

    // Skriv en kommentar om besvarelsen din her: ...
    // ...
    import easyIO.*;
    
    class Oblig3 {
        public static void main(String [] args) {
            Utsyn s = new Utsyn();
            s.ordrelokke();
        }
    }
    
    class Student {
        String navn; // studentens navn
        int saldo;   // studentens saldo
    
        // Evt. metoder for ? behandle en Student...
    }
    
    class Hybel {
        Student leietager;  // peker p? et Student-objekt
        int husleie; // 6000 hvis hybelen er i 3. etasje, ellers 5000.
    
        // Evt. metoder for ? behandle en Hybel...
    }
    
    class Utsyn {
        In tast = new In();
        Out skjerm = new Out();
    
        Hybel[][] hybler = new Hybel[3][6];
        // Variabler for ?konomidata kan legges inn her...
    
        // Konstanter:
        final String FILNAVN = "hybeldata.txt";
        final String TOM_HYBEL = "TOM HYBEL";
    
        // Konstrukt?r for klassen Utsyn
        Utsyn() {
    	// Her kan du lese datafilen "hybeldata.txt" og lagre hele innholdet
    	// i datastrukturene dine.  Husk ? opprette Hybel- og Student-objekter.
    	// Eksempel p? innlesing av en saldo, for en gitt "etg" og "rom":
    	//    hybler[etg][rom] = new Hybel();
    	//    hybler[etg][rom].leietager = new Student();
    	//    hybler[etg][rom].leietager.saldo = innfil.inInt(" ;");
        }
    
        void ordrelokke() {
            int ordre = -1;
            while (ordre != 0) {
                // Skriv ut meny:
                skjerm.outln("Meny:");
                skjerm.outln("1. ...");
    
                // Les ordre fra bruker
                skjerm.out("Ordre: ");
                ordre = tast.inInt();
    
                switch(ordre) {
                    case 1: skrivOversikt(); break;
                    case 2: registrerNyLeietager(); break;
                    case 3: registrerBetaling(); break;
                    case 4: // ...
                    // ... Fyll ut resten...
                    default: // Gi feilmelding.
                }
            }
        }
    
        // Metoder for de forskjellige ordrene i ordrelokke()
    
        void skrivOversikt() { /* ... */ }
        void registrerNyLeietager() { /* ... */ }
        void registrerBetaling() { /* ... */ }
    
        // ... Fyll ut med minst 5 metoder til
    }
    

  3. Konstrukt?r:  I klassen Utsyn er det en metode som ikke har det reserverte ordet void eller noe annet foran metodenavnet, og heter det samme som klassen: ?Utsyn()?.  Det er en spesiell type metode kalt en konstrukt?r, som blir utf?rt automatisk n?r man oppretter et objekt av klassen (med new Utsyn()).  Du kan lese mer om konstrukt?rer i avsnitt 8.7 og 8.11 i l?reboken, eller i forelesningsnotatene fra uke 7, eller i Marit Nybakkens notat ?konstrukt?rer.pdf?.
  4. Det anbefales ? starte arbeidet med obligen ved ? programmere konstrukt?ren Utsyn() slik at den leser datafilen.  I begynnelsen b?r du ogs? skrive ut p? skjermen det som du leser inn fra fil, slik at du kan kontrollere at datafilen blir lest riktig, f.eks. i stedet for bare ? si ?int x = fil.inInt(" ;");? kan du bruke:

    int x = fil.inInt(" ;");  System.out.println("x=" + x);
    

  5. null-pekere:  Det ble nevnt i menyvalg 4 ovenfor at du kunne velge om du angir ledige hybler ved hjelp av peker-verdien null eller ved ? bruke det spesielle Student-navnet "TOM HYBEL".  Det f?rste alternativet er vanskeligere ? programmere enn det andre, men gir en mer "objektorientert" l?sning.  Hvis du velger f?rste alternativet s? kan du teste om peker-variabelen leietager faktisk peker p? et eksisterende Student-objekt ved et gitt tidspunkt slik:
    if (leietager != null) {
    ?null? er et reservert ord i Java som angir peker-verdien ?intet objekt?.  if-testen ovenfor sjekker derfor om leietager peker p? noe som helst objekt annet enn ?intet objekt?.  Omvendt kan du ogs? sjekke om en peker ikke peker p? noe objekt, ved hjelp av == null.  For ? sette en peker til ? peke p? null, f.eks. n?r en student flytter ut, kan du skrive:
    leietager = null;

  6. NullPointerException:  N?r man bruker ?prikk-notasjon? p? en peker (f.eks. peker.saldo) m? man passe p? at den ikke inneholder null-verdien, ellers kr?sjer programmet og Java-kj?resystemet gir feilmeldingen NullPointerException.  F.eks, hvis du ?nsker ? f? tak i leietager.navn s? m? du passe p? at leietager peker p? noe annet enn null.  Dette kan ordnes ved ? utf?re f?rste if-testen vist i hint c ovenfor, og bare bruke prikk-notasjon hvis if-testen ga true; eller, en enklere m?te er ? kombinere if-testen med en annen betingelse i en eksisterende if-test ved hjelp av && (og) operatoren.  Pass p? at betingelsen != null st?r f?rst i den sammensatte if-testen, f.eks. slik:
    Student s = hybler[i][j].leietager; // s (og leietager) kan v?re null
    if (s != null && s.navn.equals("Ola")) {
       // Hit kommer vi bare hvis s ikke er null og s.navn er Ola
    }
    
    Flere tips til NullPointerException og andre feilmeldinger kommer i Ukeoppgaver 7.

  7. Hybelnavn:  Ofte skal vi lese eller skrive ut hybelnavn (som 2B, 3E).  De best?r av et tall og en bokstav (uten noe skilletegn imellom), men datastrukturen vi bruker for hybler er en array, som m? indekseres med heltall; derfor m? vi konvertere bokstaven fra char til int.  Det kan gj?res ved hjelp av ?int rom = (int) (bokstav - 'A');?.  I tillegg m? vi finne en m?te ? trekke ut etasjen (2) fra hybelnavnet (2B), n?r det ikke er skilletegn mellom etasje-nummer og rom-bokstav.  Det kan gj?res ved ? lese begge deler som tegn (char) f?rst, og konvertere begge til int, for eksempel slik: (Dette viser hvordan vi kan lese et helt hybelnavn fra tastatur og deretter trekke ut etasje og rom som heltall)
    skjerm.out("Oppgi hybelnavn: ");
    int etg = (int) (tast.inChar(" \n\r") - '1'; // '1' gir [0], '2' gir [1], osv.
    char bokstav = tast.inChar(" \n\r"); // Les rombokstaven
    int rom = (int) (bokstav - 'A'); // 'A' gir [0], 'B' gir [1], osv.
    
    Det som st?r i parenteser etter inChar(...her...) angir tegn som innlesingen skal hoppe over, dvs. skal bare betraktes som skilletegn mellom de ?nskede input-data hvis de blir lest inn.  I koden ovenfor er det angitt at mellomrom (" "), linjeskift (\n), og vognretur (\r) skal betraktes som skilletegn av inChar.  Etter disse setningene vil variabelen rom inneholde verdien 0 hvis brukeren tastet inn en A-hybel (f.eks. 3A), 1 hvis det var en B-hybel, osv.; og etasjenummer vil havne i variabelen etg (fratrukket 1).

    Omvendt kan man konvertere fra int til char, slik:

    char bokstav = (char) ('A' + intVariabel);
    


  8. Append modus  Hver gang metoden tilkallTorpedo(..) blir kalt skal du legge til en ny linje p? slutten av filen torpedo.txt (uten ? overskrive det som allerede var i filen).  Da b?r man ?pne filen i append-modus, som s?rger for nettopp det (utskrift som sendes til filen blir da bare lagt til p? slutten av filen uten ? endre linjene den hadde fra f?r).  Hvis man bruker EasyIO kan dette gj?res ved ? angi en ekstra-parameter ?,true? n?r man ?pner filen:
    Out fil = new Out("torpedo.txt", true);
    
    Husk ? lukke filen n?r du er ferdig med ? skrive til den! (fil.close()).

  9. Eksisterer filen? N?r programmet starter skal du lese inn datafilen hybeldata.txt.  Hvis filen ikke finnes i samme mappe der du kj?rer programmet, kan programmet ditt kr?sje.  Dette kan man unng? ved ? lage datafilen manuelt, eller laste ned eksempel-datafilen, eller du kan skrive programmet slik at det kan teste om filen finnes, og ta h?yde for det hvis ikke.  F?lgende kode kan brukes til denne testen, og krever at man har setningen import java.io.*; ?verst i programmet:
    if (new File("hybeldata.txt").exists()) {
       // Les inn filen
    } else {
       // Filen finnes ikke.  Gi feilmelding eller opprett tomme hybler.
    }
    

  10. .tgz og .zip:  Du kan lage en .tgz-fil som bare inneholder filen Oblig3.java slik p? Linux:
    tar -cvzf Oblig3.tgz Oblig3.java
    Og tilsvarende for ? lage en .zip-fil med bare Oblig3.java p? Linux:
    zip -r Oblig3.zip Oblig3.java

Hvis du har sp?rsm?l, kommmentarer, eller finner feil i oppgaveteksten kan du skrive disse i kurs-bloggen.

Lykke til!