Feilmeldinger, brukerinput og kontrollflyt

Like dokumenter
Feilmeldinger, kontrollflyt og void-metoder

Feilmeldinger, kontrollflyt og void-metoder

INF uke 2. Inputt, beslutninger, kontrollflyt og prosedyrer

IN uke 2. Presis forståelse av programmering

IN uke 2. Presis forståelse av programmering

Løse reelle problemer

Metoder med parametre, løkker og arrayer

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

Jentetreff INF1000 Debugging i Java

Programmering Høst 2017

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

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

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

Løse reelle problemer

UNIVERSITETET I OSLO

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

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

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

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

UNIVERSITETET I OSLO

Forelesning inf Java 4

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

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

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

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

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

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

Eksempel: Body Mass Index (BMI)

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

Hvordan løse problemer med programmering?

Løsningsforslag ukeoppg. 2: 31. aug - 6. sep (INF Høst 2011)

INF1000: Forelesning 4. Mer om arrayer Metoder

Forelesning inf Java 5

Forelesning inf Java 5

Programmeringsspråket C

UNIVERSITETET I OSLO

INF1000 : Forelesning 3

Innlesing fra fil og metoder med returverdier

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

INF1000 : Forelesning 4

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

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

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

Blokker og metoder INF1000 (Uke 6) Metoder

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

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

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

UNIVERSITETET I OSLO

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

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

INF Uke 10. Ukesoppgaver oktober 2012

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

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

Forelesning inf Java 3

Løse reelle problemer

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

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

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

Input og beslutninger

Løse reelle problemer

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

UNIVERSITETET I OSLO

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

Læringsmål og pensum. if (be): else (not_to_be):

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

Dagens tema Kapittel 8: Objekter og klasser

INF1000: noen avsluttende ord

INF 1010, vår 2005 Løsningsforslag uke 11

UNIVERSITETET I OSLO

Inf1000 uke 5 18.sept. 2007

Introduksjon til objektorientert programmering

Oversikt. Informatikk. INF1000: Grunnkurs i objektorientert programmering. Utenom INF1000 Informasjon & hjelp

Dagens tema. Hva er kompilering? Anta at vi lager dette lille programmet doble.rusc (kalt kildekoden): Hva er kompilering?

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk. - 3rd edition: Kapittel 3. Professor Alf Inge Wang

Variabler, input og beslutninger

Forelesning inf Java 3

INF1010 Sortering. Marit Nybakken 1. mars 2004

Eksempel 1 Eksempel 2 Dramatisering. INF1000 uke 3. Sundvollen 7. september 2015 Dag Langmyhr. INF1000 Sundvollen

Velkommen til. INF våren 2016

UNIVERSITETET I OSLO

INF1000 Metoder. Marit Nybakken 16. februar 2004

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Del 3: Evaluere uttrykk

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

INF1000 oppgaver til uke 38 (17 sep 23 sep)

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Oblig4 - forklaringer. Arne og Ole Christian

Transkript:

Feilmeldinger, brukerinput og kontrollflyt Skjønne hvordan et program presist utføres og forberede seg på håndtering av feil INF1000, uke2 Ragnhild Kobro Runde

Programmeringskrøll Programmet vil ikke kjøre (riktig), og dette viser seg å skyldes detaljer som ikke har å gjøre med noe viktig (dvs hovedideen er riktig). Feil som skyldes at datamaskinen er dum.. Det er riktig at den virkelige utfordringen i programmering er kreativ problemløsning. Men før man kommer til dette, må man få inn den nødvendige presisjonen.

U2Kompileringsfeil1.java Eksempel

I INF1000 Essensen i faget er de underliggende prinsippene. Tekniske triks er uviktig (for nå). Vi har forsøkt å fjerne kilder til krøll der vi kan. Men noe krøll oppstår om man vil eller ikke. Angrep er det beste forsvar.

Strategier for å håndtere krøll Kjenne til ulike feilmeldinger Hvorfor de oppstår. Hvordan de kan rettes. Ha en presis forståelse av hvordan et program utføres (eksekveres). Hvordan uttrykk (høyresiden til =-tegnet) evalueres. Hvordan et program flyter fra linje til linje. Bli kjent med «stammespråket».

FEIL OG FEILMELDINGER

Hva er en programfeil? Kompileringsfeil Kompilatoren finner feil/svakhet. (javac protesterer) Kjøretidsfeil Ugyldig situasjon oppstår under kjøring. (java protesterer) Logisk feil Alt kjører, men resultatet er ikke i tråd med intensjonen (enten man merker det eller ikke).

Vanlige kompileringsfeil - noen eksempler U2Kompileringsfeil2.java - U2Kompileringsfeil7.java

Vanlige kjøretidsfeil - noen eksempler U2Kjoretidsfeil1.java - U2Kjoretidsfeil2.java

Logiske feil - noen eksempler U2LogiskFeil1.java - U2LogiskFeil2.java

Vær obs på følgefeil Ved kompileringsfeil Første feilmelding er typisk den opprinnelige. I tillegg får man ofte mange etterfølgende feil, fordi kompilatoren kommer av sporet. Ved kjøretidsfeil En ugyldig tilstand kan skyldes en feil tidligere i koden enn der den merkes. Ved logiske feil Man kan få uønsket oppførsel ett sted, fordi man ikke tok høyde for bestemte utfall et annet sted.

Bli kjent med programmeringsfeil Bruk tid på å fremprovosere flest mulig feil, og legg de bak øret (eller noter dem ned)! Senker frustrasjonsnivået betraktelig når feil oppstår. Feilretting går mye raskere når man gjenkjenner feilmelding og hva den kan skyldes. Det er mye å lære av å se hva som ikke fungerer.

INNLESING FRA TASTATUR

Slipp brukeren til! De fleste program tar jevnlig en eller annen input fra brukeren. Dette gir også mye mer dynamikk i programmene enn det vi har sett på til nå.

Enkel input fra brukeren U2Input.java

Input av tall fra brukeren U2InputSum.java

KONTROLLFLYT

Hvordan et program presist utføres Hvordan (i hvilken rekkefølge) utføres operasjoner helt detaljert på én enkelt linje Hvordan flyter (helt presist) et program fra linje til linje

Hva skjer innad på en linje? alder = 6; alder = alder + 3;

Videre om evaluering av uttrykk Visse operasjoner gjøres alltid før andre F.eks. alltid multiplikasjon før addisjon. Sammenlign: alder = 5 * 3 + 18 alder = 18 + 5 * 3 Blir tydeligere med parenteser, bruk det! alder = (5 * 3) + 18

Videre om evaluering av uttrykk (forts.) For noen formål må man uansett ha parenteser alder = (3+2) * 3 + 18 Nesting av parenteser er definitivt lovlig alder = ((3+2) * 3) + 18 I praksis er det ikke tall man putter inn på slik måte, men variabler: alder = ((bachelor+master) * antallfagfelt) + barndom

En liten oppgave om variable og uttrykk (fra eksamen 2014)

Boolske uttrykk Kan teste flere ting i samme uttrykk. && betyr "og" - altså må begge deler være sant if (alder>=3 && alder<6) { System.out.println("liten"); Man kan også sjekke enten eller med if (alder<18 alder>66) { System.out.println("Halv pris");

Boolske uttrykk (forts) Uttrykk kan naturligvis inneholde ulike variabler if (alder > 80 dagertiltermin < 60) { System.out.println("Vil du sitte?"); Uttrykkene kan være nestede if ((dag == 17 && maaned == 5) (dag == 29 && maaned == 8)) { System.out.println("Gratulerer med dagen!");

Boolske verdier Vi har tidligere i kurset lært to typer verdier: Typen int som representerer hele tall. Typen String som representerer tekst. boolean er en tredje type verdi Typen boolean representerer noe som er sant eller ikke sant. Den har altså kun to mulige verdier: true og false.

Boolske variable Boolske verdier kan holdes på av variabler (på samme måte som for tall og tekst) betalerhalvpris = alder<18 alder>66 ;

Boolske variable Boolske verdier kan holdes på av variabler (på samme måte som for tall og tekst) Slike variable er av typen boolean boolean betalerhalvpris; betalerhalvpris = alder<18 alder>66 ;

Boolske variable Boolske verdier kan holdes på av variabler (på samme måte som for tall og tekst) Slike variable er av typen boolean En boolsk variabel kan brukes alle steder hvor man kan bruke en boolsk verdi boolean betalerhalvpris; betalerhalvpris = alder<18 alder>66 ; if (betalerhalvpris) {...

KONTROLLFLYT

Hvordan et program flyter fra linje til linje Dette er temmelig enkelt for det vi har lært frem til nå (endrer seg snart..) Hovedregel: Gjør ferdig en linje, deretter gå til linjen nedenfor Ved en if-setning (uten else) Dersom det som testes er sant: gå til første linje i blokken ellers: hopp over blokken

Hvordan et program flyter fra linje til linje Ved en if-else-setning Dersom det som testes er sant: gå til første linje i blokken etter if ellers: gå til første linje i blokken etter else

Etterlign kjøring, med blyant og papir Gjør manuelt det samme som datamaskinen ville gjort, linje for linje Kan gjøres i hodet, men enklere på papir (print ut koden og bruk blyant) Vær presis - her er hver detalj viktig

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if (lengde==bredde){ omkrets = 4*lengde; else { omkrets = (2*lengde) + (2*bredde); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 ==bredde){ omkrets = 4*lengde; else { omkrets = (2*lengde) + (2*bredde); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = (2*lengde) + (2*bredde); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = (2* 7 ) + (2*bredde); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = ( 14 ) + (2*bredde); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = ( 14 ) + (2* 4 ); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = ( 14 ) + ( 8 ); System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = 22 ; System.out.println("Omkrets: " + omkrets) ;

Følge et program, linje for linje public class u2omkrets{ public static void main(string[] args) { int lengde=7; int bredde=4; int omkrets; if ( 7 == 4 ){ omkrets = 4*lengde; else { omkrets = 22 ; System.out.println("Omkrets: " + 22 ) ;

METODER

Vi trenger mer struktur! Vi har frem til nå skrevet programmer linje for linje nedover under "static void main" Realistiske program er imidlertid ofte tusener eller millioner av linjer! Ingen kan ha oversikt over en flat liste på mange tusen (eller millioner) av linjer Et første nivå av strukturering er metode: en navngitt blokk med kodelinjer, som kan kalles og tilpasses

Ulike versjoner av metoder Metoder kommer i ulike versjoner, av gradvis økende kompleksitet Vi vil introdusere de involverte aspektene stegvis Først i dag: Statisk void-metode uten parametre Neste uke: Statisk void-metode med parametre Om tre uker: Statisk metode med returverdi Litt senere i høst: Instans-metode (OO)

Hvordan kan en metode se ut public static void mittmetodenavn(){ kodelinje1; kodelinje2;... For å kjøre alle kodelinjene i metoden (kalle metoden): mittmetodenavn();

Eksempel på metode: kodeblokk public class u2voidmetodeutenparameter1{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); System.out.println("Da var jeg ferdig!"); public static void main(string[] args) { gibeskjed();

Eksempel på metode: navn public class u2voidmetodeutenparameter1{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); System.out.println("Da var jeg ferdig!"); public static void main(string[] args) { gibeskjed();

Eksempel på metode: kall public class u2voidmetodeutenparameter1{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); System.out.println("Da var jeg ferdig!"); public static void main(string[] args) { gibeskjed();

Eksempel på metode: ramme rundt kallet public class u2voidmetodeutenparameter1{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); System.out.println("Da var jeg ferdig!"); public static void main(string[] args) { gibeskjed();

Eksempel på metode: ramme rundt hele koden public class u2voidmetodeutenparameter1{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); System.out.println("Da var jeg ferdig!"); public static void main(string[] args) { gibeskjed();

Kontrollflyt og metoder public class u2voidmetodeutenparameter{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); static void kallvidere(){ System.out.println("Her kommer det"); gibeskjed(); System.out.println("Og en gang til"); gibeskjed(); System.out.println("Det var ikke mye"); public static void main(string[] args) { System.out.println("Hei, jeg vil si deg noe"); kallvidere(); System.out.println("Fikk du det likevel med deg?");

Kontrollflyt og metoder public class u2voidmetodeutenparameter{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); static void kallvidere(){ System.out.println("Her kommer det"); gibeskjed(); System.out.println("Og en gang til"); gibeskjed(); System.out.println("Det var ikke mye"); public static void main(string[] args) { System.out.println("Hei, jeg vil si deg noe"); kallvidere(); System.out.println("Fikk du det likevel med deg?");

Kontrollflyt og metoder public class u2voidmetodeutenparameter{ static void gibeskjed(){ System.out.println("Jeg sier dette bare en gang!"); static void kallvidere(){ System.out.println("Her kommer det"); gibeskjed(); System.out.println("Og en gang til"); gibeskjed(); System.out.println("Det var ikke mye"); public static void main(string[] args) { System.out.println("Hei, jeg vil si deg noe"); kallvidere(); System.out.println("Fikk du det likevel med deg?");

Oppsummering Feil kan fanges opp ved kompilering, ved kjøring, eller bare gi uønsket resultat Å kjenne til vanlige feilmeldinger senker frustrasjon når feil uunngåelig oppstår Programkode kjøres på en presist definert måte innad i en linje, og fra linje til linje Å «leke datamaskin» med blyant og papir er nyttig! Metoder strukturerer kode og unngår redundans Kan tilpasses med parametre tema neste uke, sammen med arrayer og løkker.