In105 Programmering i Java de første skritt



Like dokumenter
2 Om statiske variable/konstanter og statiske metoder.

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

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

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

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Forelesning inf Java 4

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

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

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

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

UNIVERSITETET I OSLO

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

Oversikt. Uke 2, INF 1000, 30 aug Variable, tilordninger og uttrykk. Repetisjon: Java programmering

2 Om statiske variable/konstanter og statiske metoder.

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

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

Programmeringsspråket C

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

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

Forelesning inf Java 5

Forelesning inf Java 5

Kapittel 1 En oversikt over C-språket

Blokker og metoder INF1000 (Uke 6) Metoder

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

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

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

Velkommen til. INF våren 2016

INF Uke 10. Ukesoppgaver oktober 2012

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

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

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

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

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Feilmeldinger, brukerinput og kontrollflyt

INF1000: Forelesning 4. Mer om arrayer Metoder

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter denne uken! Klart for første oblig

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

Enkle generiske klasser i Java

INF1000: Forelesning 7. Konstruktører Static

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; }

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

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

I dag skal vi se på. INF 1000 (uke 2) Variabler, tilordninger og uttrykk. Gruppene starter i dag! Klart for første oblig

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

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

TDT4100 Objektorientert programmering

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

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

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

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

INF1000: Forelesning 7

Del 1 En oversikt over C-programmering

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

Programmering Høst 2017

UNIVERSITETET I OSLO

Løse reelle problemer

INF1000 (Uke 6) Mer om metoder, tekster

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

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

INF1000 Metoder. Marit Nybakken 16. februar 2004

Kapittel 1. Datamaskiner og programmeringsspråk. 1.1 Programmering

IN1010 våren januar. Objektorientering i Java

INF1000 : Forelesning 3

Oversikt. Hva er programmering & Java forkurset til INF1000. Hva er en datamaskin. Arne Maus Inst for Informatikk Univ. i Oslo

Metoder med parametre, løkker og arrayer

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

INF1000 : Forelesning 1 (del 2)

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

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

Grunnkurs i objektorientert programmering Hjelpehefte for studenter som tar INF101,

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

Seminaroppgaver IN1010, uke 2

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Hva er en metode. Hva skjer når vi kaller en metode

INF1010 våren januar. Objektorientering i Java

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

Repetisjon INF 1000 våren 2006

Kapittel 1: Datamaskiner og programmeringsspråk

Java-kurs. Andreas Knudsen Nils Grimsmo 9th October 2003

Programmering i C++ Løsningsforslag Eksamen høsten 2005

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Jentetreff INF1000 Debugging i Java

Oblig 4Hybelhus litt mer tips enn i oppgaven

INF1000 Behandling av tekster

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

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

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

UNIVERSITETET I OSLO

Eksempel: Body Mass Index (BMI)

INF1000 (Uke 6) Mer om metoder, tekster

Inf1000 uke 5 18.sept. 2007

UNIVERSITETET I OSLO

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

INF 1000 høsten 2011 Uke 3 6. september

Transkript:

In105 Programmering i Java de første skritt IN105-javabasics-1

class Velkommen { Velkommen.java public static void main ( String [] args ) { new Velkommen ( ); Velkommen ( ) { System.out.println ( "Velkommen til IN105 ); Dette er et program skrevet i programmeringsspråket Java. Når det kjøres, skriver det teksten Velkommen til IN105 på skjermen. Programmet må ligge i en fil med nøyaktig samme navn som klassen, men med tillegget.java (jf. JavaGently s.19-20) IN105-javabasics-2

class Velkommen { Velkommen.java (forts.) public static void main ( String [] args ) { new Velkommen ( ); Velkommen ( ) { System.out.println ("Velkommen til IN105 ); IN105-javabasics-3

Velkommen.java (forts.) class Velkommen { public static void main ( String [] args ) { new Velkommen ( ); Velkommen ( ) { System.out.println ( "Velkommen til IN105 ); Fargekoding brukt i eksemplet o Ord og tegn i blått hører med i Java-språket o Ord i svart er ord som vi eller andre har deklarert i Java o Ord i rødt behandles nøyaktig slik de står Semikolon ; avslutter en setning Krøllparenteser { brukes for å gruppere setninger - IN105-javabasics-4

Kommentarer i programmet class Velkommen{public static void main(string[] args){new Velkommen( );Velkommen(){System.out.println("Velkommen til IN105 ); class Velkommen { /* Velkommen, skrevet av Knut Hegna 24.juli 2000 Skriver velkomsthilsen på skjermen. */ public static void main ( String [] args ) { new Velkommen ( ); // lager velkommen-objekt // slutt på metoden main Velkommen ( ) { System.out.println ( "Velkommen til IN105 ); // slutt på konstruktøren Velkommen // slutt på Velkommenprogrammet IN105-javabasics-5

Hvorfor kommentere? Et program som er forklart, kommentert og har en oversiktlig utforming (layout) er lettere å lese og forstå for deg selv og for andre. Tips: bruk kommenteringsteknikk aktivt i programmeringen IN105-javabasics-6

Utførelse av programmer class Velkommen { public static void main ( String [] args ) { new Velkommen ( ); Velkommen ( ) { System.out.println ( "Velkommen til IN105 ); Hvis vi kjenner programmeringsspråket, kan vi mentalt utføre programmet manuelt slik som vi for eksempel gjør når vi skal overbevise oss selv om at det er riktig Vi kan også la en datamaskin kjøre programmet det må da først oversettes (kompileres) til en form maskinen kan forstå Oversettingen gjøres av et oversetterprogram en kompilator IN105-javabasics-7

Maskinutstyret CPU Her regner maskinen Databuss Her flyttes data og program fram og tilbake Primærlager 0 1 2...... Lokalnett Her lagres program og data under kjøring Disk Her lagres program, oversatte programmer og data permanent (på filer) Institutt for informatikk Gerhard Jens Kaasbøll Skagestein/Knut Hegna IN105-javabasics-8

Kompilering class Vekommen { public static void main (String [ ] args) {... osv // Slutt på klassen Velkommen Velkommen.java gymir 4> javac Velkommen.java Java programtekst i en fil på disken filen må ha samme navn som den første klassen på filen Java-kompilatoren heter javac. Vi må oppgi navnet på filen der programteksten ligger Det kompilerte Java-programmet (kalt Java bytekode) i en annen fil på disken (Ljava/lang/String;)V ([Ljava/lang/String;)V <init> Code LineNumberTable Ljava/io/PrintStream; SourceFile Velkommen Velkommen til IN105 Velkommen.java java/io/printstream java/lang/object java/lang/system main out println Velkommen.class IN105-javabasics-9

Syntaksfeil System.out.println ( "Velkommen til IN105); in105>javac Velkommen.java Velkommen.java:7: String not terminated at end of line. System.out.println( "Velkommen til IN105); ^ Velkommen.java:8: ')' expected. ^ 2 errors in105> Institutt for informatikk Gerhard Jens Kaasbøll Skagestein/Knut Hegna IN105-javabasics-10

Program En datamaskinen er lite intelligent den kan bare utføre noen få typer ordre: o Les inn et tall (fra tastatur) o Skriv ut en tekst (til skjerm, disk, ) o Legg sammen to tall o... For å få gjort det vi vil, ber vi maskinen utføre et antall slike ordre/handlinger (én etter én) Denne rekken av ordre kalles et program Institutt for informatikk Gerhard Jens Kaasbøll Skagestein/Knut Hegna IN105-javabasics-11

Kjøring (programutførelse) (Ljava/lang/String;)V ([Ljava/lang/String;)V <init> Code LineNumberTable Ljava/io/PrintStream; SourceFile Velkommen Velkommen til IN105 Velkommen.java java/io/printstream java/lang/object java/lang/system main out println Velkommen.class gymir 5> java Velkommen Java byte-kode i en fil på disken leses inn i maskinens primærlager. gymir 5> java Velkommen Velkommen til IN105 gymir 6> Resultatet på skjermen IN105-javabasics-12

Program (forts.) Maskinen har allerede en rekke programmer o operativsystem o editor (redigeringsprogram) o oversetter-program (kompilator) o Java virtuell maskin (JVM utfører byte-koden) Nye programmer kan legges inn ved å o kopiere fra andre maskiner o skrive dem i editoren og lagre dem i en fil på disken Institutt for informatikk Gerhard Jens Kaasbøll Skagestein/Knut Hegna IN105-javabasics-13

class Toplussto { To pluss to er fire public static void main (String [ ] args) { new Toplussto(); Toplussto(){ int etheltall; etheltall = 2; System.out.println( etheltall = + etheltall); etheltall = etheltall + 2; Her oppretter vi en variabel kalt etheltall der vi kan lagre hele tall Her settes denne variablen lik 2 + legger her sammen innholdet av variabelen etheltall og tallet 2 System.out.println( Summen av etheltall og 2 er + etheltall); navn: etheltall type: int + skjøter her sammen to tekststrenger //Slutt class Toplussto IN105-javabasics-14

Tilordninger er ikke likninger etheltall = etheltall + 2;???????? Dette er ingen matematisk likning, men et regneuttrykk (etheltall + 2) etterfulgt av en tilordning (etheltall =) På høyre siden av tilordningsoperatoren brukes innholdet av variablen etheltall. Tilordningen ( the assignment ) fører til at verdien av uttrykket på høyre side lagres i variablen på venstre side av tilordningsoperatoren Tilordningsoperatoren = leses gjerne settes lik IN105-javabasics-15

Overlasting av operatorer Mellom to heltall bevirker + en heltallsaddisjon 2 + 2 Mellom to flytende tall bevirker + en flyttallsaddisjon 2.5 + 3.14 Mellom et heltall og et flytende tall bevirker + en flyttallsaddisjon : 2 + 3.14 Mellom to tekststrenger bevirker + en sammenskjøting (konkatenering) Hallo + verden At en operator har ulik virkning avhengig av operandene, kalles overlasting (av operatoren) IN105-javabasics-16

Vekslingsprogrammet Kunden skal ha tilbake x kroner. Hvor mange mynter av hver valør skal kunden få utbetalt, under forutsetning at det skal være færrest mulig mynter? IN105-javabasics-17

Veksling.java (del 1) class Veksling { public static void main(string[ ] args) { new Veksling(); Her oppretter vi en variabel kalt beløp der vi kan lagre hele tall Veksling(){ int beløp; beløp = 78; System.out.print("Vekslepenger " + beløp ); System.out.println( kroner"); Her lagrer vi heltallet 78 i beløp ved hjelp av tilordningsoperatoren = print skriver ut uten linjeskift. println skriver ut med etterfølgende linjeskift. IN105-javabasics-18

Veksling.java (del 2) System.out.println( "20-kroner : " + beløp/20); beløp = beløp%20; Divisjon / mellom heltall gir heltallsdivisjon På høyre siden av = (dvs. i uttrykk) brukes verdien som er lagret i variablen % gir resten etter en divisjon System.out.println( "10-kroner : " + beløp/10); beløp = beløp%10; System.out.println( " 5-kroner : " + beløp/5); beløp = beløp%5; System.out.println( " 1-kroner : " + beløp); // slutt på konstruktøren Veksling //slutt på klassen Veksling IN105-javabasics-19

Veksling.java resultat.>java Veksling Vekslepenger : 78 kroner 20-kroner : 3 10-kroner : 1 5-kroner : 1 1-kroner : 3 > IN105-javabasics-20

Programutvikling Området som programmet skal handle om Programutførelse og test: Tilfredsstiller programmet kravspesifikasjonen? Kompilering og retting av syntaksfeil Kravspesifikasjon: Hva skal programmet gjøre? Analyse: Hva består området av? Utforming: Hvordan skal programmet struktureres? Koding: Skriving av programteksten Java syntaks IN105-javabasics-21

Egenskaper ved et godt program Et program bør inneholde færrest mulig feil være leselig være strukturert være modifiserbart (leselig og strukturert) kunne gjenbrukes være effektivt være robust / tåle feil bruk og at det inneholder feil være veldokumentert Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-22

Et kritisk blikk på programmet Veksling Kravspesifikasjonen: Er den fullstendig? o Hva med 50-ørene? Hva med beløp med 10-ører? Analyse av området o Hva skal skje hvis vi ikke har nok mynter av en gitt valør? Utformingen: Er den god? o Mange gjentagelser i koden o Lite fleksibel, for eksempel mye arbeid hvis vi skal legge inn nye myntslag eller sedler o Tungvint å legge inn vekslebeløpet vi må rekompilere Mye kan tydeligvis forbedres, men først må vi lære mer Java! Kravspesifikasjon Programmet skal regne ut hvor mange mynter av hver valør som skal gis tilbake som vekslepenger. Det skal gis tilbake færrest mulig mynter. IN105-javabasics-23

Verdier og typer En verdi kan være eksempelvis o et heltall (78) o et flytende tall (3.1415) o en tekststreng ( Velkommen til IN105 ) o en logisk (boolesk) verdi (true) o En type er en familie av verdier o int er typen for heltall 3, 4, 13, 2000, 0, -37, o double er typen for flytende tall 2.5, 3.14, 7, 2E3, o String er typen for tekststrenger Velkommen, Java, o boolean er typen for logiske verdier true, false o Legg merke til at String skrives med stor forbokstav, de andre ikke (grunnen skal vi komme tilbake til) For en oversikt over Java typer, se Java Gently 2.4 og 3.2 IN105-javabasics-24

Heltall og desimaltall Datamaskiner håndterer disse på forskjellig måte. Heltall er alltid eksakte, mens desimaltall har en viss nøyaktighet. Desimaltall deklareres med double o Eks: double høyde, volum; Heltall deklareres med int o Eks: int antalltrær, antallfuglereder; IN105-javabasics-25

Java er et sterkt typet språk Variablene må deklareres til å lagre verdier av en bestemt type o eksempelvis int beløp; Kompilatoren kontrollerer o at verdiene som inngår i regnestykker er av riktig type o at typen av uttrykket på høyre side av en tilordning stemmer med typen av variablen på venstre side o eksempelvis vil int beløp; beløp = 3.14 + 0.2; gi syntaksfeil Konvertering ( casting ) av en verdi fra en type til en annen er av og til mulig (detaljer senere) o Implisitt: double ti; ti = 10; o Eksplisitt: int beløp; beløp = (int) 3.14 IN105-javabasics-26

Deklarasjon og tilordning enkle variable Enkle variable kan inneholde én verdi Enkle variable deklareres ved å angi deres type og navn double beløp ; Programmet har nå en variabel som heter beløp og som kan inneholde et desimaltall Variable gis verdi ved tilordning beløp = 78.2 ; navn: beløp 78.2 type: double Deklarasjon og tilordning kan kombineres i én setning: double beløp = 78.2 ; Når en variabel først er deklarert, kan den brukes mange ganger Pr. konvensjon begynner variabelnavn alltid med liten bokstav Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-27

Deklarasjon av konstanter static final type navn = verdi ; Konstanter En konstant er en variabel som ikke kan endres Eksempler static final double moms = 0.23 ; static final double pi = 3.1415 ; static final int maxantall = 100; Hvorfor bruke konstanter? navn: moms 0.23 type: double o Lettere å lese programmet 0.23 kan være hva som helst - moms er mer forklarende o Lettere å endre programmet dersom konstanten skulle endre seg: endre deklarasjonen static final double moms = 0.25 og rekompiler! Se JavaGently side 37 IN105-javabasics-28

Regneuttrykk Tall-variable kan tilordnes resultatet av regneuttrykk beløp = beløp * 1.23 ; Operatorene + - * / % kan brukes mellom variabler og/eller tall Resultatet av beløp % myntverdi blir resten (modulus) når beløp divideres med myntverdi double beløp=1.60, myntverdi = 0.5, resultat=0; resultat = beløp % myntverdi; Hva blir innholdet i variablen resultat? Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-29

Presedenser i regneuttrykk Uttrykk regnes ut som vi er vant til fra matematikken, nemlig med følgende presedenser: 1. Parenteser : a * ( b + c ) 2. Multiplikasjon, divisjon og rest : a + b * c 3. Pluss og minus 4. Fra venstre mot høyre: a + b * c d / e Presedens Presedens = = går går foran, foran, regler regler for for i i hvilken hvilken rekkefølge rekkefølge operasjoner operasjoner skal skal utføres. utføres. Så hva er resultatet av 3 + 2 * (4+6)? IN105-javabasics-30

Betinget utførelse If - setning if (betingelse) setning ; //kan også være en blokk { else setning ; //kan også være en blokk { Jf. JavaGently side 106 Eksempel: Rund av et ørebeløp til nærmeste 50 øre if (ørebeløp < 0.25) ørebeløp=0; else if (ørebeløp < 0.75) ørebeløp=0.50; else ørebeløp=1.0; 0,00 0,50 1,00 0,00 0,25 0,75 1,00 Er det noen smartere måte å gjøre dette på? IN105-javabasics-31

If-setningen Et uttrykk (en påstand) som enten er sant eller usant (resulterer i verdien true eller false) if (betingelse){ setningsblokk ; else { setningsblokk; Utføres hvis betingelsen er sann (true) Utføres hvis betingelsen er usann (false) If-setningsdelen else { setningsblokk ; kan utelates da gjøres ingenting hvis betingelsen er false IN105-javabasics-32

Utforming av betingelser For å kunne uttrykke betingelser må vi kunne framsette påstander, f.eks. sammenlikne verdier. Eksempel: alder > 17 // er alder større enn 17? Mer kompliserte betingelser kan kreve logiske (booleske) operasjoner Eksempel: (alder > 17) & (alder < 67) // er alder større enn 17 og i tillegg mindre enn 67? Se JavaGently side 56-58 IN105-javabasics-33

Sammenlikningsoperatorene Vi kan sammenlikne tall (i uttrykk) med sammenlikningsoperatorene = = lik < mindre enn!= ikke lik >= større enn eller lik > større enn <= mindre enn eller lik Eksempler: int tall = 30, antall = 40; if ( tall == antall ) ( false) int maxantall = 100; if ( antall <= maxantall ) ( true )... if ( tall!= antall ) ( true ) Svarene på disse regnestykkene er sann eller usann (true eller false.) Disse verdiene (sann og usann) kaller vi logiske verdier eller sannhetsverdier. Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-34

Logiske (booleske) operatorer Typen boolean har to verdier: false og true (sann og usann) Logiske binære operatorer: & and (og) or (eller) ^ xor (exclusive or, eksklusiv eller) Logisk unær operator:! not (ikke) La x og y være logiske variable eller logiske uttrykk: Uttrykket x & y har verdien sann bare når både x og y er sann Uttrykket x y har verdien usann bare når både x og y er usann Uttrykket x ^ y har verdien sann bare når enten x eller y er sann Uttrykket!x har verdien den motsatte sannhetsverdi av x Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-35

Eksempel på bruk av logiske variabler class Barnebillett { public static void main (String [ ] args) { new Barnebillet(); Barnebillett(){ boolean barn, pensjonert; int alder = 19; boolean barnetakst; barn = alder <= 17; pensjonert = alder >= 67; barnetakst = barn pensjonert; System.out.println( Alder = + alder); System.out.println( Det er + barnetakst + at du kan reise på barnebillett ); // slutt Barnebillett // slutt class Barnebillett; Skriver: Alder = 19 Det er false at du kan reise på barnebillett Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-36

To logiske operatorer til x && y Samme som & (og), men hvis x er usann, regnes ikke y ut. x y Samme som (eller), men hvis x er sann, regnes ikke y ut. Utregningen av et logisk uttrykk kan av og til gi opphav til et unntak (exception). F.eks. vil en divisjon med 0 gi et unntak. Ved å bruke && og kan vi noen ganger skrive bedre programmer som unngår unntak. Se JavaGently side 58 Mer om unntak senere I kurset! Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-37

Kortsluttende eller - class Barnebillett { public static void main (String [ ] args) {new Barnebillett(); Barnebillett(){ boolean barn, pensjonert; int alder; boolean barnetakst; alder =19; barnetakst = alder <= 17 alder >= 67; System.out.println( Alder = + alder); System.out.println( Det er + barnetakst + at du kan reise på barnebillett ); // slutt Barnebillett // slutt class Barnebillett; Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-38

double ørebeløp; Avrunding til nærmeste 50-øre if (ørebelop < 0.25) ørebeløp = 0; else if(ørebeløp < 0.75) ørebeløp = 0.50; else ørebeløp = 1.00; Opprinnelig versjon double ørebeløp; avrunding; static final double tjuefemøre = 0.25, syttifemøre =0.75; if (ørebelop < tjuefemøre) avrunding=0; if (ørebeløp >= tjuefemøre & ørebeløp < syttifemøre) avrunding = 0.50; if (ørebeløp >= syttifemøre) avrunding = 1.00; Bedre versjon??? IN105-javabasics-39

public class Veksling2 { Veksling2 med øreavrunding public static void main(string[ ] args) { new Veksling2(); double beløp, ørebeløp; int helekroner; if (ørebeløp == 1.0) { ørebeløp = 0; helekroner = helekroner + 1; System.out.println("20-kroner : + helekroner/20); helekroner=helekroner%20; Veksling2(){ beløp = 78.77; System.out.println("Vekslepenger "+ beløp +" kroner"); helekroner = (int) beløp; ørebeløp = beløp - helekroner; if (ørebeløp < 0.25) ørebeløp = 0; else if(ørebeløp < 0.75) ørebeløp = 0.50; else ørebeløp = 1.0; System.out.println("10-kroner : " + helekroner/10); helekroner=helekroner%10; System.out.println(" 5-kroner : " + helekroner/5); helekroner=helekroner%5; System.out.println(" 1-kroner : " + helekroner); System.out.println("rest " + ørebeløp); System.out.println("øreavrunding " + (beløp - ørebeløp - helekroner)); IN105-javabasics-40

Løkker - loops Duellen 1. antallskritt = 0 2. antallskritt == 10? Ja: gå til punkt 4 Nei: øk antallskritt med 1 3. Gå til punkt 2 4. Snu deg 5. Skyt Å gå tur 1. Er vi framme? Nei: ta ett skritt gå tilbake til pkt 1 2. Ta en hvil Å starte i Ludo: 1. Kast terningen 2. Fikk du 6? Nei: kast terningen, gå tilbake til pkt 2 3. Flytt ut en brikke IN105-javabasics-41

Løkker for-setning Enkel for-setning Se JavaGently side 62 for ( start ; kontroll ; oppdatering ) {setningsblokk start oppretter en ny variabel eller gir en gammel variabel en startverdi. Denne variabelen kalles løkkevariablen. kontroll er et logisk uttrykk som beregnes før setningsblokken utføres. Løkkevariabelen inngår nesten alltid her. Er verdien av uttrykket true, skal setningsblokken utføres en gang til. oppdatering oppdaterer (forandrer) løkkevariabelen etter at setningsblokk er utført. setningsblokk kan også være en enkelt setning. // Beregn 1! til 5! (dvs. 1 * 2 * 3 * 4 * 5) int fakultet = 1; for (int i = 1; i <= 5 ; i++ ) { fakultet = fakultet * i ; System.out.println(i +! = + fakultet); IN105-javabasics-42

Løkker while-setning while-setning Se JavaGently side 130 initialiser betingelse; while ( betingelse) {setningsblokk setningsblokken utføres om og om igjen sålenge betingelse er true For å forhindre en uendelig løkke må setningsblokken endre verdier som inngår i betingelsen // finn alle kvadrat-tall som er mindre enn 1000 int i = 1; while ( i * i < 1000 ) { System.out.println ( Kvadratet av +i+ er +i*i); i++; // kan også skrives: i = i + 1; IN105-javabasics-43 IN105-javabasics-40

Løkker - while /* Skriv ut Fibonacci-tallene mindre enn 1000. Et tall i rekken er summen av de to foregående. Vi starter med 0 og 1 og kaller dem forrige og nåværende. */ int forrige=0, nåværende = 1; while ( nåværende < 1000 ) { System.out.println ( nåværende ); int neste = forrige + nåværende; forrige = nåværende; nåværende = neste; IN105-javabasics-44

Veksling3 med while-løkke double beløp, ørebeløp; int helekroner, myntvalør = 20; Veksling3(){ beløp = 78.77; System.out.println("Vekslepenger "+beløp+" kroner"); helekroner = (int) beløp; // øreavrundinger (utelatt her) while (myntvalør >= 1) { System.out.println(myntvalør +"-kroner : "+ helekroner/myntvalør); helekroner = helekroner%myntvalør; myntvalør = myntvalør/2; if (myntvalør == 2) myntvalør = 1 System.out.println("rest " + ørebeløp); IN105-javabasics-45

Løkker do-while-setning do-while-setning Se JavaGently side 131 // initialiser betingelse; do {setningsblokk while ( betingelse); Fungerer som while, bortsett fra at betingelsen sjekkes etter hver utførelse av setningsblokk // Fibonacci-tall med do-while-løkke int forrige = 0, nåværende = 1; do { System.out.println ( nåværende ); int neste = forrige + nåværende; forrige = nåværende; nåværende = neste; while ( nåværende < 1000 ) ; IN105-javabasics-46

Metoder En metode er en navngitt samling Java-setninger som kan aktiviseres fra andre metoder (eller seg selv - ) class Velkommen2 { public static void main ( String [] args) { new Velkommen2 (); metoden main Velkommen2 () { skriv_ut(); metoden skriv_ut void skriv_ut() { System.out.println ( "Velkommen til IN105"); IN105-javabasics-47

Hvorfor bruker vi metoder? Vi unngår duplisering av kode og muliggjør gjenbruk Programmene blir mer forståelige og lettere å endre og rette når separate oppgaver er fordelt på ulike metoder som hver har et beskrivende metodenavn For å lage verktøy (metodebibliotek) Vi har ikke noe annet valg all programkode som gjør noe ligger i en eller annen metode Java har et STORT bibliotek av ferdige metoder IN105-javabasics-48

Metoder med parametre class Velkommen3 { public static void main ( String [] args) { new Velkommen3 (); aktuell parameter Velkommen3 () { skriv_ut( "IN105" ); formell parameter skriv_ut( "Java" ); void skriv_ut(string tekst) { System.out.println ( "Velkommen til " + tekst); kall på metoden println fra Java-biblioteket De aktuelle parametrene i metodekallet er uttrykk (regnestykker) De formelle parametrene er en kommaseparert liste med type og navn de blir lokale variable i metoden En aktuell parameter må ha en verdi av samme type som den tilsvarende formelle parameter den blir startverdi for den formelle parameteren IN105-javabasics-49

Formell parameter endres i metoden class Velkommen5 { public static void main ( String [] args) { new Velkommen5 (); Velkommen5 () { String kurs = "IN105"; skriv_ut( kurs ); System.out.println ( "Kurs = " + kurs ); void skriv_ut(string tekst) { tekst = "Sophus Lies auditorium"; System.out.println ( "Velkommen til " + tekst); Endring av den formelle parameteren i metoden får ikke konsekvenser for den aktuelle parameteren. IN105-javabasics-50

Metoder med returverdi class Toplussto2 { public static void main (String [ ] args) { new Toplussto2 (); Toplussto2 (){ int etheltall = 2; System.out.println("Etheltall = " + etheltall); etheltall = leggtilto(etheltall); System.out.println("Etheltall + 2 er " + etheltall); int leggtilto (int param) { return param + 2; En metode kan returnere en verdi I så fall erstattes void i metodedeklarasjonen med typen som returneres Metoden må inneholde en return-setning som gir selve returverdien IN105-javabasics-51

Veksling4 med metoden veksle Veksling4(){ double beløp=78.77, ørebeløp; int helekroner; System.out.println("Vekslepenger "+beløp+" kroner"); // Utelatt splitt i kr og øre; øreavrunding helekroner = veksle(helekroner, 20); helekroner = veksle(helekroner, 10); helekroner = veksle(helekroner, 5); helekroner = veksle(helekroner, 1); System.out.println("rest " + ørebeløp); int veksle (int kroner, int mynt) { System.out.println(mynt+"-kroner\t: " + kroner/mynt); return kroner%mynt; IN105-javabasics-52

Tabeller (Arrays) En tabell (en array) er en liste av variabler (tabellelementer) av samme type Hver enkelt variabel i listen refereres til ved hjelp av en indeks : liste[indeks] 0 1 2 3 Den første variablen har indeksverdi 0 (Java-spesialitet!) 11 Tabeller har utallige anvendelser ofte mye mer rasjonelt å bruke en tabell enn å gi hver enkelt variabel et eget navn Se JavaGently kap 6.1 IN105-javabasics-53

Etablering av tabeller Etablering av en tabell skjer i tre trinn: 1. Deklarer en variabel som kan inneholde en peker (referanse) til en tabell 2. Opprett en tom tabell og tilordn tabellpekeren til variablen 3. Fyll om ønskelig tabellen med verdier Eksempel etablere en tabell (her med hele tall): int [ ] myntvalører; int kan erstattes med andre typer myntvalører = new int[4]; myntvalører[0]=20; myntvalører[1]=10; myntvalører[2]=5; myntvalører[3]=1; Detaljert gjennomgang på neste foil! IN105-javabasics-54

Eksempel på etablering av tabell Trinn 1 int [ ] myntvalører; navn: myntvalører null type: int[ ] Trinn 2 myntvalører = new int[4]; myntvalører 0 0 0 0 0 1 2 3 Trinn 3 myntvalører[0]=20; myntvalører[1]=10; myntvalører[2]=5; myntvalører[3]=1; myntvalører 20 10 5 1 0 1 2 3 IN105-javabasics-55

Trinn 1 + trinn 2 Trinnene kan slås sammen int [ ] myntvalører = new int[4]; myntvalører[0]=20; myntvalører[1]=10; myntvalører[2]=5; myntvalører[3]=1; Trinn 1 + trinn 2 + trinn 3 int [ ] myntvalører = {20, 10, 5, 1; Array-konstant kan bare brukes i initialisering Merk at det finnes en alternativ syntaks for type [ ] variabelnavn: type variabelnavn [ ]. JavaGently bruker den siste varianten IN105-javabasics-56

Den klassiske programmeringsfeil er å referere til tabellelementer som ikke eksisterer Eksempel: int [ ] myntvalører = {20, 10, 5, 1; int index = 4; mynt; mynt = myntvalører[index]; Java vil i slike tilfeller returnere et unntak ArrayIndexOutOfBoundException (mange andre programmeringsspråk gjør ikke det!) Alle tabeller har en spesiell egenskap length bruk den for å unngå indekseringsfeil: Korrekte indeksverdier er 0,, length-1 int[ ] myntvalører = {20, 10, 5, 1; int myntvalørlengde = myntvalører.length; int index, mynt; if(index < 0 index >= myntvalørlengde) System.out.println( Noe er galt + index) else mynt = myntvalører[index]; IN105-javabasics-57

Tabeller og løkker Tabeller brukes svært ofte i kombinasjon med løkker: int [ ] myntvalører = {20, 10, 5, 1; System.out.println( Myntvalørene er ); for (int i = 0; i < myntvalører.length; i ++) System.out.println(myntvalører[i] + -krone ); Viktig program-mønster! Legg merke til at vi lar indeksen starte på 0 og løpe opp til length-1. Grunnen er at tabellelementene er indeksert fra 0, mens length gir antall elementer. IN105-javabasics-58

Et litt større eksempel class ArrayEx { public static void main(string[ ] args){ new ArrayEx(); tabell ArrayEx(){ int [ ] tabell; tabell = new int [10]; System.out.println("Tallene i tabellen er:"); for (int ind = 0; ind < 10; ind++) { tabell[ind] = (ind + 3) * ind + 17; System.out.println(tabell[ind]); ind 0 1 2 3 4 5 6 7 8 9 System.out.println("I omvendt rekkefølge:"); for (int ind = 9; ind >= 0 ; ind --){ System.out.println(tabell[ind]); Institutt for informatikk Gerhard Stein Gjessing Skagestein/Knut Hegna IN105-javabasics-59

Veksling5 med tabell og for-løkke class Veksling5 { public static void main(string[] args){ new Veksling5(); Veksling5 (){ double beløp = 78.77, ørebeløp; int helekroner; int[ ] myntverdier = {20, 10, 5, 1; // utelatt splitt i kr og øre og øreavrunding for (int i=0; i<myntverdier.length; i++){ System.out.println(myntverdier[i]+"-kroner\t: "+ helekroner/myntverdier[i]); helekroner=helekroner%myntverdier[i]; System.out.println("rest " + ørebeløp); IN105-javabasics-60

Tabeller og metoder Tabeller kan brukes som aktuelle parametre til metoder En tabell kan brukes som returverdi fra metoder nyttig hvis du skal returnere flere verdier av samme type Egentlig er det pekeren (referansen) som overføres dermed blir det enkelt å håndtere tabellens lengde Tabell-lengden defineres av leverandøren og leses av av mottakeren se eksempel på neste foil IN105-javabasics-61

Veksling6 med tabeller som parametre public class Veksling6{ public static void main(string[] args){ new Veksling6(); Veksling6(){ double beløp=78.77, ørebeløp; int helekroner; int[] myntverdier = {20, 10, 5, 1; System.out.println("Vekslepenger "+ beløp + " kroner"); int [ ] kronerogøre = delkronerogøre(beløp); veksle(kronerogøre[0], myntverdier); System.out.println("rest " + kronerogøre[1]/10.0); IN105-javabasics-62

Veksling6 (forts) int[ ] delkronerogøre(double beløp) { int[ ] kronerogøre = new int [2]; int helekroner; double ørebeløp; helekroner = (int) beløp; ørebeløp = beløp - helekroner; if (ørebeløp < 0.25) ørebeløp=0; else if(ørebeløp < 0.75) ørebeløp=0.50; else ørebeløp=1.0; System.out.println("øreavrunding " + (beløp - ørebeløp - helekroner)); if (ørebeløp==1.0){ørebeløp=0; helekroner++; kronerogøre[0] = helekroner; kronerogøre[1] = (int) (10 * ørebeløp); return kronerogøre; void veksle(int helekroner, int[ ] myntverdier) { int mynt; for (int i=0; i<myntverdier.length; i++) { System.out.println(myntverdier[i] + "- kroner \t:" + helekroner/myntverdier[i]); helekroner=helekroner%myntverdier[i]; IN105-javabasics-63

Metoden mains parameter public static void main (String [ ] args) void uttrykker at metoden main ikke returnerer noen verdi String [ ] args er metodens formelle parameter en tabell args med tekststrenger som elementer Metodens aktuelle parameter finner vi på kommandolinjen for kjøring av programmet: >java Klassenavn tekststreng0 tekststreng1. Eksempel: class Hallo { public static void main (String [ ] args) { System.out.println( Hallo, + args[0]); På kommandolinjen: >java Hallo Gerhard IN105-javabasics-64

Konvertering fra tekststrenger Vi kan nå lese parametre fra kommandolinjen, men som oftest må de konverteres fra tekststrenger til den typen vi trenger: o Fra tekststreng til heltall: int n = Integer.parseInt(args[indeks]); o Fra tekststreng til flytende tall: double d = new Double(args[indeks]).doubleValue( ); Dette ser kryptisk ut, men ta det som oppskrifter foreløpig! Vi har heller ikke tatt høyde for at parametre kan mangle eller at feilaktige parametre ikke kan la seg konvertere mer om det siden! IN105-javabasics-65

Veksling7 av beløp fra kommandolinjen public class Veksling7{ public static void main(string[] args){ if ( args.length >= 1){ new Veksling7(new Double(args[0]).doubleValue()); else System.out.println("Beløp mangler!"); Veksling7(double beløp){ double ørebeløp; int helekroner; int[] myntverdier = {20, 10, 5, 1; System.out.println("Vekslepenger "+beløp+ " kroner"); int [ ] kronerogøre = delkronerogøre(beløp); veksle(kronerogøre[0], myntverdier); System.out.println("rest " + kronerogøre[1]/10.0);... IN105-javabasics-66

Bruk av tabeller For å lagre predefinerte data (for eksempel myntvalører) For å lagre mellomresultater For å akkumulere i ulike elementer over tid For å håndtere en samling med data For å kunne overføre en samling med data til og fra metoder Det er ikke alltid nødvendig å bruke tabeller. Når data leses inn i et program kan de ofte skrives ut (for eksempel på fil) med en gang uten å bli mellomlagret i en tabell. Men skal det manipuleres mye med dataene er det hensiktsmessig å ta vare på dem i en tabell. Husk at en tabell ikke kan være av ubegrenset størrelse den ligger i primærlageret og noen megabyte er maksimum. Større mengder data må lagres på fil. Kompliserte datastrukturer på filer kalles databaser (IN114, IN212).. IN105-javabasics-67

Hvor setter jeg egentlig semikolon? Husk: Et uttrykk beregner en verdi Et semikolon etter et uttrykk gjør det om til en setning ved å fjerne verdien Derfor bør verdien først ha vært brukt til noe nyttig: o Tilordnet en variabel o Brukt som aktuell parameter o Inngå i if-else-konstruksjoner Altså: Sett semikolon etter tilordning, metodekall, variabeldeklarasjoner Sett ikke semikolon etter en ikke fullført setning som if, while osv. IN105-javabasics-68

Prosedyreorienterte programmeringsspråk Variabler, uttrykk Setninger, setningsblokker Tilordning (assignment) Kontrollflyt: o Setningssekvenser o Betinget utførelse o Løkker Dette er fellesgodset i alle prosedyreorienterte programmeringsspråk. Men Java er objektorientert! Så vi har bare sett begynnelsen Heng med! Metoder (prosedyrer, subrutiner) og kall av dem Strukturerte variable (tabeller, arrays) IN105-javabasics-69