Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve

Like dokumenter
Metoder med parametre, løkker og arrayer

Løkker og lister. Løse problemer med programmering. INF1001, uke3 Geir Kjetil Sandve

Hvordan løse problemer med programmering?

Løse reelle problemer

Løse reelle problemer

Feilmeldinger, brukerinput og kontrollflyt

Håndtere mange verdier

Løse reelle problemer

Input og beslutninger

Programmering Høst 2017

Variabler, input og beslutninger

INF uke 2. Inputt, beslutninger, kontrollflyt og prosedyrer

Løse reelle problemer

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Øvingsforelesning 3 Python (TDT4110)

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Mattespill Nybegynner Python PDF

løsningsforslag-uke5.txt

UNIVERSITETET I OSLO

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Oppsummering fra sist

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF Ekstrainnlevering

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

UNIVERSITETET I OSLO

Med løkke: Læringsmål og pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker/Sløyfer Utgave 3: Kap. 4 Utgave 2: Kap. 5. Mål.

2 Om statiske variable/konstanter og statiske metoder.

Finne ut om en løsning er helt riktig og korrigere ved behov

Forelesning inf Java 4

Øvingsforelesning 5 Python (TDT4110)

IN uke 1. Komme i gang med programmering

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Øvingsforelesning 5 Python (TDT4110)

INF1000 : Forelesning 4

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

INF1000 (Uke 4) Mer om forgreninger, While-løkker

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

UNIVERSITETET I OSLO

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

Feilmeldinger, kontrollflyt og void-metoder

Oppgaver uke 1: Løsningsforslag

1. Rullende navn, s 3 2. Smilefjes, s 5 3. Skritteller, s 7 4. Orakel, s 9 5. Stein, saks og papir, s Kompass, s 14

IN uke 1. Komme i gang med programmering

Læringsmål og pensum. Intro løkker. Mål Lære om begrepet løkker Lære om bruk av while-løkke Lære om bruk av for-løkke Pensum. Kapittel 4.

Forelesning inf Java 5

Forelesning inf Java 5

Leksjon 3. Kontrollstrukturer

Oblig4 - forklaringer. Arne og Ole Christian

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

TDT4110 Informasjonsteknologi grunnkurs: Tema: Løkker. - 3rd edition: Kapittel 4. Professor Alf Inge Wang

Leksjon 3. Kontrollstrukturer

IN uke 2. Presis forståelse av programmering

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Ukeoppgaver INF1000: 12. feb 16. feb

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

UNIVERSITETET I OSLO

Velkommen til INF2100

Finne ut om en løsning er helt riktig og korrigere ved behov

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

MAT1030 Diskret Matematikk

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Eksempel: Body Mass Index (BMI)

INF1000 Uke 3. Innlesning fra terminal. Uttrykk og presedens. Oversikt. Litt repetisjon Blokker og forgreininger

INF 4130 Oppgavesett 3, 20/ m/løsningsforslag

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

Øvingsforelesning 1 Python (TDT4110)

Enkle generiske klasser i Java

INF1000: Forelesning 7

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

UNIVERSITETET I OSLO

Repetisjon Novice Videregående Python PDF

Dagens tema: 12 gode råd for en kompilatorskriver

Innlesing fra fil og metoder med returverdier

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

MAT1030 Plenumsregning 1

For å sjekke at Python virker som det skal begynner vi med å lage et kjempeenkelt program. Vi vil bare skrive en enkel hilsen på skjermen.

Øvingsforelesning i Matlab TDT4105

INF1010 våren januar. Objektorientering i Java

2 Om statiske variable/konstanter og statiske metoder.

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

UNIVERSITETET I OSLO

lage og bruke funksjoner som tar argumenter lage og bruke funksjoner med returverdier forklare forskjellen mellom globale og lokale variabler

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF Uke 10. Ukesoppgaver oktober 2012

MAT-INF 1100: Obligatorisk oppgave 1

Oppgave 1 Hva tror du følgende program skriver ut til terminalen? Diskuter med gruppen.

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

IN uke 2. Presis forståelse av programmering

Blokker og metoder INF1000 (Uke 6) Metoder

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

Transkript:

Løkker og arrayer Løse problemer med programmering INF1000, uke3 Geir Kjetil Sandve

Hva vi har lært så langt Variabler og uttrykk Beslutninger Kontrollflyt og feilmeldinger Metoder og parametre

Fokus i dag Repetert kjøring (løkker) Holde på mange verdier (arrayer) Løse problemer vha programmering

Repetert kjøring {u3lokker1.java}: program vi så på også i forrige uke Programmet har to problem: Repetert kode gjør det vanskeligere å ha oversikt og gjøre endringer Koden var fastlåst til å spørre nøyaktig 3 ganger om alder

Repetert kjøring Forrige uke reduserte vi repetisjon ved å flytte kode til en metode Vi trengte fremdeles 3 kall, og låste dermed også til å spørre 3 ganger Denne uka skal vi se på mekanismer for å repetere utførelse, uten å måtte repetere kode eller kall

Et eksempel på repetert kjøring {U3RiktigPlussing.java}

Repetert kjøring (løkke): while Syntaksen er veldig rett frem: while (something) {do1; do2;...} while (tall<100) {System.out.println(tall); tall+=5;} En slags if med tilbakekobling: Nesten som if, bare at man kjører innholdet mange ganger - helt til something ikke lenger er sant

While som en if med tilbakekobling System.out.println("Hva er 4+7?"); innlest = in.nextline(); tall = Integer.parseInt(innlest); while (tall!= 11){ System.out.println("Prov igjen!"); innlest = in.nextline(); tall = Integer.parseInt(innlest); }

While som en if med tilbakekobling System.out.println("Hva er 4+7?"); innlest = in.nextline(); tall = Integer.parseInt(innlest); if (tall!= 11) else while (tall!= 11){ System.out.println("Prov igjen!"); innlest = in.nextline(); tall = Integer.parseInt(innlest); }

Eksempelet vi startet med {u3lokker2.java}: repetert spørring frem til brukeren oppgir negativ alder

Merk den presise rekkefølgen ting blir gjort! while (something) {do1; do2;...} Man sjekker, kjører hele blokka, og går så tilbake til sjekken igjen Sjekk something, do1, do2, sjekk something igjen, do1, do2...

Merk den presise rekkefølgen ting blir gjort! while (something) {do1; do2;...} Det blir altså ikke sjekket noe mellom do1 og do2 Det som sjekkes er oppfylt når man starter å kjøre kodeblokka.. men det kan slutte å være oppfylt underveis i blokka

Finjustering av når noe sjekkes og brukes {u3lokker3.java}: Innlesning av alder lagt sist i løkka, slik at verdi sjekkes like etter innlesning Unngår å skrive alderskommentar etter terminerende input (-1) fra bruker Man må legge en ekstra linje med innlesning før selve løkka begynner Det finnes også en alternativ while-versjon: do-while kan i noen tilfeller være praktisk, men av liten betydning

En liten oppgave Skriv kode (det essensielle) som regner ut summen av tallene fra 1 til 100 (1+2+3...+100) Prøv alene med blyant og papir i 3 minutt Diskutér med nabo i 3 minutt {U3SumTallrekkeVhaWhile.java}

En noe mer kompleks problemstilling Problemstilling: dersom man triller to terninger, hva er sannsynligheten for å få minst 6 i sum? {U3TerningSumVhaWhile.java}

Initialiser-sjekkinkrementer Et vanlig mønster knyttet til løkker: Gi startverdi til variabel (initialiser) Gå i løkke inntil variabelen passerer en gitt verdi Inkrementer variabel i slutten av løkka

Initialiser-sjekkinkrementer: for {U3SumTallrekkeVhaFor.java}

Initialiser-sjekkinkrementer int sum = 0; int tall = 1; intialiser while (tall<=100){ sjekk sum+=tall; tall +=1; inkrementer } System.out.println(sum);

Initialiser-sjekkinkrementer 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);

Initialiser-sjekkinkrementer While int terning1, terning2; int antsuksesser=0; int teller=0; intialiser while (teller<1000){ sjekk teller +=1; inkrementer terning1=sjanse.nextint(6)+1; terning2=sjanse.nextint(6)+1; if (terning1+terning2 >= 6){ antsuksesser += 1; } } System.out.println( antsuksesser/1000.0); For int terning1, terning2; int antsuksesser=0; for (int teller=0;teller<1000; teller+=1){ terning1=sjanse.nextint(6)+1; terning2=sjanse.nextint(6)+1; if (terning1+terning2 >= 6){ antsuksesser += 1; } } System.out.println( antsuksesser/1000.0);

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 bruker man gjerne for oftere enn while

Sjonglere med flere verdier {HoydeGittAlder1.java}

Finne verdien vi trenger direkte int hoydeaar0 = 50; int hoydeaar1 = 76; int hoydeaar2 = 87; int hoydeaar3 = 96; System.out.println("Hvilken alder vil du vite om"); innlest = in.nextline(); alder = Integer.parseInt(innlest); if (alder==0){ System.out.println(hoydeAar0); } else if (alder==1){ System.out.println(hoydeAar1); } else if (alder==2){ System.out.println(hoydeAar2);

Finne verdien vi trenger direkte int hoydeaar0 = 50; int hoydeaar1 = 76; int hoydeaar2 = 87; int hoydeaar3 = 96; System.out.println("Hvilken alder vil du vite om"); innlest = in.nextline(); alder = Integer.parseInt(innlest); if (alder==0){ System.out.println(hoydeAaralder); } else if (alder==1){ System.out.println(hoydeAar1); } else if (alder==2){ System.out.println(hoydeAar2);

Vi kan slå opp verdien vi trenger direkte! Det vi ønsket: hoydeaaralder Syntaks i java: hoydeaar[alder]; Og før dette må vi definere hoydeaar som en array: int[] hoydeaar = {50, 76, 87, 96};

Håndtere høydene i en array {HoydeGittAlder2.java}

Array Definere array:

Definere array: Array int[] hoydeaar = {50, 76, 87, 96}; 0 1 2 3 50 76 87 96

Definere array: int[] hoydeaar = {50, 76, 87, 96}; int[] hoydeaar = new int[4]; Array 0 1 2 3 0 0 0 0

Definere array: int[] hoydeaar = {50, 76, 87, 96}; int[] hoydeaar = new int[4]; Sette en enkeltverdi: hoydeaar[0] = 5; Array 0 1 2 3 5 0 0 0

Definere array: int[] hoydeaar = {50, 76, 87, 96}; int[] hoydeaar = new int[4]; Sette en enkeltverdi: hoydeaar[0] = 5; hoydeaar[2] = 8; Array 0 1 2 3 5 0 8 0

Definere array: int[] hoydeaar = {50, 76, 87, 96}; int[] hoydeaar = new int[4]; Sette en enkeltverdi: hoydeaar[0] = 5; hoydeaar[2] = 8; Bruke enkeltverdi Array System.out.println(hoydeAar[0]); 0 1 2 3 5 0 8 0

Definere array: int[] hoydeaar = {50, 76, 87, 96}; int[] hoydeaar = new int[4]; Sette en enkeltverdi: hoydeaar[0] = 5; hoydeaar[2] = 8; Bruke enkeltverdi Array System.out.println(hoydeAar[0]); 5 0 1 2 3 5 0 8 0

Array - merk Størrelsen på en array kan bestemmes av en annen variabel int hvormangehoyder = Integer.parseInt(in.nextLine()); int[] hoydeaar = new int[hvormangehoyder]; Alle verdier må være samme type, men man kan bestemme hvilken String[] hoydeaar = {"uhyre liten", "bitteliten", "liten"} En tom array fylles med default-verdier int[] hoydeaar = new int[4]; er samme som: int[] hoydeaar = {0,0,0,0}

Array og løkker Array og løkker opptrer ofte sammen - hvorfor tror du det er slik? Filosofer i tre minutt - eventuelt diskuter med nabo Noen forslag: Arrayer tillater en løkke å operere på mange verdier - typisk én verdi for hver gjennomkjøring av løkka Løkker kan oppsummere innholdet i en array - regne ut sum av verdiene, finne minste verdi osv.

Et typisk eksempel {U3SumAvArray.java}

Et ekte problem (på en travel morgen) Problemstilling: Jeg har en kopp hvor det ligger 4 løse kontaktlinser, 2 for venstre øye og 2 for høyre øye Av ren latskap grabber jeg to vilkårlige linser fra koppen (av de 4) og håper at jeg har grabbet et for venstre og et for høyre (ellers må jeg lete videre). Hva er sannsynligheten for at jeg fikk en for hvert øye? {U3_SimuleringLinser1.java- U3_SimuleringLinser4.java}

Oppsummering Løkker gjør at kodelinjer kan kjøres flere ganger F.eks. gjøre lignende type utregning på ulike verdier Arrayer gjør det mulig å jobbe med mange verdier Kan slå opp direkte på verdien i en bestemt posisjon Løkker og arrayer jobber godt sammen Kan generere og oppsummere store mengder verdier Dere har nå verktøykassen for å løse skikkelige problemstillinger!