Løse reelle problemer Litt mer om løkker, metoder med returverdier og innlesing fra fil INF1000, uke4 Geir Kjetil Sandve Repetisjon fra forrige uke: while Syntaks: while (condition) do1; do2;... Eksempel: int tall=1; while (tall<100) System.out.println(tall); tall+=5; 1 2 Initialiser-sjekkinkrementer Initialiser-sjekkinkrementer: for Et vanlig mønster knyttet til løkker: Gi startverdi til variabel før selve løkka (initialiser) Gå i løkke inntil variabelen passerer en gitt verdi Inkrementer variabel i slutten av kodeblokka U3SumTallrekkeVhaFor.java 3 4
int sum = 0; int tall = 1; intialiser while (tall<=100) sjekk sum+=tall; tall +=1; inkrementer System.out.println(sum); While int sum = 0; int tall = 1; intialiser while (tall<=100) sjekk sum+=tall; tall +=1; inkrementer System.out.println(sum); int sum = 0; For for (int tall=1; tall<=100; tall+=1) sum+=tall; System.out.println(sum); 5 6 Initialiser-sjekkinkrementer Initialiser-sjekkinkrementer Initialiser-sjekkinkrementer: for Litt mer kompleks syntaks: for (initialization; condition; update) do1; do2;... For-uttrykket inneholder tre helt ulike ting: Initialization: kjøres bare én gang, før selve løkka Condition: sjekkes hver runde før kodeblokka kjøres (tilsvarer uttrykket inni while) Update (inkrementering): kjøres i slutten av løkka (legges til i slutten av kodeblokka) Initialiser-sjekkinkrementer: for for er egentlig ikke mer enn en forkortet skrivemåte Alt man kan gjøre vha for kan man også gjøre vha en tilsvarende while Eneste formål er å forkorte og tydeliggjøre en typisk bruksmåte av (while-) løkker Den typiske bruken er noe som skal repeteres et fastlagt antall ganger I praksis brukes likevel for oftere enn while, fordi denne typiske bruksmåten er så veldig vanlig 7 8
Metoder med returverdi Void-metodene fra uke2: static void minmetode(...)... Metode med returverdi: static DATATYPE minmetode(...)... Eksempler: static int gangmedto(int tall) return tall*2; static String lagvelkomst(string fag, String navn) return "Velkommen til " + fag + " kjaere " + navn; Bruke (kalle) metoder med returverdier: static int gangmedto: int dusin=13; int todusin = gangmedto(dusin); System.out.println(toDusin); //Skriver ut 26 static String lagvelkomst String velkomst = lagvelkomst("inf1000", "Geir"); System.out.println(velkomst); //Skriver ut "Velkommen til inf1000 kjaere Geir" 9 10 Eksempel på forenkling av kode vha metode Forenkle summering av to tall som gjort i uke 1: U4InputSum1.java-U4InputSum2.java Utsett til i morgen, det du ikke trenger gjøre i dag Metoder med returverdi tillater å utsette problemer! Fokuser først på hva som trengs overordnet Deretter gå løs på detaljene Eksempel: int kvm=60; int postnr=0316; int lonn=503 800; pris = regnboligpris(kvm, postnr); makslaan = regnkredittverdighet(lonn); if (makslaan > pris) System.out.println("Yes!"); // Deretter skriv selve metodene.. 11 12
Prøv selv (5 min) (Oppgave hentet fra eksamen 2014) Skriv en metode static int pris (boolean gratis, int alder) Dersom parameteren gratis har verdien true, skal metoden alltid returnere 0. Dersom parameteren gratis har verdien false og verdien av alder er mindre enn 18, skal metoden returnere 100, ellers 200. Altså skal f.eks. kallet pris (true, 10) returnere 0, kallet pris(false,10) returnere 100 og kallet pris(false, 50) returnere 200. 13 En mulig løsning static int pris(boolean gratis, int alder) int svar; if (gratis) svar = 0; else if (alder < 18) svar = 100; else svar = 200; return svar; 14 En annen mulig løsning (returnere inni if) En tredje mulig løsning (bare rene if - ingen else..) static int pris(boolean gratis, int alder) if (gratis) return 0; if (alder < 18) return 100; return 200; 15 static int pris(boolean gratis, int alder) int svar=0; if (gratis) svar = 0; if (!gratis && alder < 18) svar = 100; if (!gratis && alder >= 18) svar = 200; return svar; 16
Innlesing fra fil Å hente data fra filer er gøy! Man kan jobbe på mye større og mer spennende data enn fra tastatur Man slipper å taste det inn hver gang man kjører Noen filer kan imidlertid være krøkkete å lese inn Å lese krøkkete formater er ikke vanskelig, bare langtekkelig I faget unngår vi krøllet, og jobber med filer som er greie å lese inn I reelle situasjoner jobber man uansett ofte med store systemer hvor innlesing er godt tilrettelagt Lese fra fil er nesten som å lese fra tastatur: Helt likt: 1: import java.util.scanner; 2: Scanner minscanner; 5: minscanner.nextline(); 17 18 Lese fra fil er nesten som å lese fra tastatur: Helt likt: 1: import java.util.scanner; 2: Scanner minscanner; 5: minscanner.nextline(); Unikt for tastatur: 3: minscanner = new Scanner(System.in); Lese fra fil er nesten som å lese fra tastatur: Helt likt: 1: import java.util.scanner; 2: Scanner minscanner; 5: minscanner.nextline(); Unikt for tastatur: 3: minscanner = new Scanner(System.in); Unikt for fil: 3: File minfil = new File("mittFilnavn.txt"); 4: minscanner = new Scanner(minFil); 19 20
Exceptions Exceptions (forts) Når man jobber med filer kreves en liten utvidelse av main: public static void main(string[] args) throws Exception... Exceptions er nyttig og viktig, men ikke pensum i INF1000 Er en måte å håndtere at f.eks. programmet ikke finner filen den skal lese Vi nøyer oss med en overfladisk tilnærming: I alle metoder som åpner filer, legg til "throws Exception" bak parantesene etter metodenavnet Dersom en metode bruker (kaller) en annen metode som har "throws Exception" blir den 'smittet' og må selv legge det til. Det er ikke noe problem å legge det til én gang for mye 21 22 Hallo fra fil Data U4LesHalloVerden.java Hvor mange av dere sier at dere studerer data? Da bør vi nesten vite hva ordet "data" betyr! Hva er egentlig "data"? Diskuter med nabo! (2 minutt) Definisjon i bokmålsordboka: data = opplysninger, kjensgjerninger (i motsetning til "datamaskin" - en maskin som behandler data) 23 24
Gjøre noe med ekte data! Oppskriften på et menneske ligger i vårt DNA En lang kjede av millioner av molekyler kalt nukleinsyrer, langs en dobbel heliks Gjøre noe med ekte data! Oppskriften på et menneske ligger i vårt DNA En lang kjede av millioner av molekyler kalt nukleinsyrer, langs en dobbel heliks DNA er imidlertid essensielt bare bygget av fire ulike slike molekyler 25 26 Gjøre noe med ekte data! Gjøre noe med ekte data! Oppskriften på et menneske ligger i vårt DNA En lang kjede av millioner av molekyler kalt nukleinsyrer, langs en dobbel heliks DNA er imidlertid essensielt bare bygget av fire ulike slike molekyler Kan representere hvert molekyl med en bokstav A, C, G eller T Oppskriften på et menneske ligger i vårt DNA En lang kjede av millioner av molekyler kalt nukleinsyrer, langs en dobbel heliks DNA er imidlertid essensielt bare bygget av fire ulike slike molekyler Kan representere hvert molekyl med en bokstav A, C, G eller T Hele arvemateriale er dermed bare en lang tekststreng acggact 27 28
Gjøre noe med ekte data! Et reelt spørsmål (forts) Oppskriften på et menneske ligger i vårt DNA En lang kjede av millioner av molekyler kalt nukleinsyrer, langs en dobbel heliks DNA er imidlertid essensielt bare bygget av fire ulike slike molekyler Kan representere hvert molekyl med en bokstav A, C, G eller T Hele arvemateriale er dermed bare en lang tekststreng acggact I og med at vårt arvemateriale essensielt sett bare er en lang sekvens av 4 molekyler (bokstaver), er det da også like mange av hvert slikt molekyl (bokstav)? La oss skrive et program som teller antallet av hvert molekyl (bokstav) i vårt menneskelige DNA 29 30 Et reelt spørsmål (forts) I og med at vårt arvemateriale essensielt sett bare er en lang sekvens av 4 molekyler (bokstaver), er det da også like mange av hvert slikt molekyl (bokstav)? La oss skrive et program som teller antallet av hvert molekyl (bokstav) i vårt menneskelige DNA Nå kan vi glemme alt om DNA igjen! Alt vi trenger å tenke på er en tekststreng som består av 4 ulike bokstaver, og vi skal telle antallet av hver Ligger som en vanlig tekstfil med 1 bokstav per linje 31 Et reelt spørsmål (forts) Men start aldri med de ekte dataene! Vi får det ikke nødvendigvis til på første forsøk Det er ikke lett å kontrollregne manuelt på milliarder av bokstaver Lite eksempel først Lag en liten tekstfil med ca 10 bokstaver Skriv koden, se at den kompilerer og kjører underveis, og at den gir svaret vi forventer Og husk: bruk alltid equals for å sammenligne tekst U4DnaBokstaver.java 32
Et reelt spørsmål (forts) Stor kjøring Slik vi har programmert og representert dataene vil hele vårt datasett (ditt DNA - på ca 6GB) kjøre ca en halvtime Upraktisk her under forelesing, men absolutt kjørbart Vi teller i stedet gjennom en liten del av det (~50 MB) 10 millioner A og T - 7 millioner C og G Et mer alvorlig eksempel (samt litt mer om filer og tekst, inkludert en forsmak på objekter) 33 34 Problemstilling Fremgangsmåte Du blir bedt om å spytte i en liten flaske og sende den til et sykehus Du får etterpå tilsendt en tekstfil og blir bedt om å sjekke om denne tekstfilen inneholder ordet "TGA" Les inn tekst fra filen til en variabel av type String Sjekk om "TGA" forekommer inni denne strengen 35 36
Litt mer om String En String er mer enn bare teksten den representerer En String-verdi er egentlig et objekt (mer i neste uke!) String har instans-metoder man kan kalle (mer senere) (dette har vi egentlig allerede sett med Scanner sin nextline) Vi gir her en liten forsmak på hva String tilbyr "hallo verden".length() gir lengden (12) "hallo verden".substring(1,3) gir tekst fra pos 1-2 ("al") "hallo verden".indexof("er") gir posisjonen til "er" (7) Et nærmere syn på int length() Dette er altså en metode: Navnet på metoden er "length" Den tar ikke inn parametre Den returnerer en verdi av type int (antallet tegn i en String) Det som skiller denne fra hva vi har lært til nå: Man kaller denne på en String - på en variabel eller utrykk "hallo verden".length(); String tekst = "hallo verden"; tekst.length(); 37 38 Et nærmere syn på String substring(int bi,int ei) Dette er altså en metode: Navnet på metoden er "substring" Den tar inn to parametre: beginindex (bi) og endindex (ei) Den returnerer en verdi av type String I tillegg kalles den altså på en String: Den returnerer en ny String, med teksten fra første indeks (bi) til like før siste indeks (ei) i Stringen den ble kallet på "hallo verden".substring(1,4) returnerer dermed "all" 39 Et nærmere syn på int indexof(string str) Dette er også en metode: Navnet på metoden er "indexof" Den tar inn én parameter: med navn "str" og type "String" Den returnerer en verdi av type int I tillegg kalles den altså på en String: Den søker etter verdien til parameteren str inni teksten til Stringen den ble kalt på og returner første indeks hvor den fant et treff (ellers -1) "hallo verden".indexof("lo") returnerer dermed 3 "hallo verden".indexof("geir") returnerer dermed -1 40
Et program som finner TGA U4FinneTGA1.java Tilbake til det alvorlige Med fila "HappyEnding.txt" fikk vi -1 "TGA" finnes ikke i teksten, og kroppen lager et livsviktig protein LGR4 Med fila "BadEnding.txt" fikk vi 500 "TGA" finnes (fra posisjon 500), proteinet LGR4 ødelegges, og man får stor risiko for benskjørhet, kreft og mere Er eksempelet realistisk? Faktisk! Firmaer har lov å lese teksten til dine gen, men har ikke lov å sjekke om f.eks. "TGA" finnes der 41 Men ikke bekymr: "BadEnding" er heldigvis svært sjelden.. 42 Oppsummering For-løkke er egentlig bare en slags forenklet, typisk versjon av while-løkke Metoder med returverdier er behagelig Tillater å tenke overordnet først, og deretter ordne detaljene Å hente data fra filer er gøy! Kan jobbe med store og reelle data, uten tasting 43