for-satsen Fält for-satsen Föreläsning 8 (OH-bilder 7) for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende:

Relevanta dokument
Föreläsning 7. for-satsen Fält

I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 7. Fält Klassen String

Objektorienterad programmering

Fält och klassen String

Föreläsning 6. Fält. Fält Klassen String. Fält

Iteration while-satsen

Föreläsning 3. Iteration while-satsen

Föreläsning 7. Föreläsning 7. Fält Klassen String. Fält Klassen String. Fält. I ett program hantera man ofta samlingar av objekt av samma typ.

Föreläsning 7. Föreläsning 7

Föreläsning 8. Klassen String Mer om fält Klassen ArrayList

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Föreläsning 3-4 Innehåll

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Objektorienterad programmering

Mer om klasser och objekt

Institutionen för TENTAMEN CTH VT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Föreläsnings 9 - Exceptions, I/O

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

TDDC77 Objektorienterad Programmering

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Instuderingsfrågor, del D

Föreläsning 6: Metoder och fält (arrays)

JAVAUTVECKLING LEKTION 4

Mer om grafiska komponenter. Händelsestyrda program

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 2, vecka 8: Repetition

Enkla variabler kontra referensvariabel

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning REPETITION & EXTENTA

Testning av program. Verklig modell för programutveckling

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Typkonvertering. Java versus C

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Lösningsförslag: Instuderingsfrågor, del A

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Objektorienterad programmering i Java

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Institutionen för TENTAMEN CTH HT-14 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Att skriva till och läsa från terminalfönstret

Klassen String Mer om fält Något om inläsning

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Föreläsning 9-10 Innehåll

Den som bara har en hammare tror att alla problem är spikar

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Föreläsningsmaterial (Logik, if-satsen & iteration)

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Programmering för språkteknologer II, HT2011. Rum

Objektorienterad programmering D2

Föreläsning 6. Top-Down Design Parameteröverföring

OOP Objekt-orienterad programmering

Lösningsförslag: Instuderingsfrågor, del D

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

DAT043 Objektorienterad Programmering

JAVAUTVECKLING LEKTION 8

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Institutionen för TENTAMEN CTH HT-15 Datavetenskap TDA540. Tentamen för TDA540 Objektorienterad programmering

Tentamen ID1004 Objektorienterad programmering April 7, 2015

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

TDIU01 - Programmering i C++, grundkurs

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

OOP Objekt-orienterad programmering

Grundläggande programmering med C# 7,5 högskolepoäng

Tentamen , Introduktion till Java, dtaa98, dtea53

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Objektorienterad programmering Föreläsning 9. Copyright Mahmud Al Hakim Agenda (halvdag)

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Del A (obligatorisk för alla)

Lösningsförslag till tentamen

Föreläsning 1 & 2 INTRODUKTION

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

Tvådimensionella fält

TENTAMEN OOP

Föreläsning 5-6 Innehåll

Transkript:

for-satsen for-sats är en styrsats för iterationer. for-sats har följande generella utseende: TDA143 I1 Programmerade system Föreläsning 8 (OH-bilder 7) for-satsen for ( initiering; villkor; ändring) sats; for-satsen är ekvivalient med följande while-sats: initiering; while (villor) { sats; ändring; for-satsen är en villkorsloop, men använd for-satsen endast vid räkneloopar!!! Christer Carlsson 1 2 for-satsen Exempel for (int i = 1; i <= ; i = i + 1) System.out.println(i); Ger utskriften: 1 2 3 4 Skriv ett program som visar hur kapitalet på ett bankonto växer då räntan beräknas och läggs till kapitalet en gång per år. Rimlighetskontroll av indata skall göras. for (char c = a ; c <= d ; c = (char) (c + 1)) System.out.println(c); Ger utskriften: a b c d for (double x = 0.; x < 0.8; x = x + 0.1) System.out.println(x); Ger utskriften: 0. 0.6 0.7 0.7999999999999999 3 4

Analys: Indata: Startår, slutår, startkapital samt ränta. Utdata: En tabell över kapitalets tillväxer från startår till och med slutår. Exempel: En programkörning har följande utseende Design: Algoritm: Ge starår och slutår:199 1998 Ge startkapital: 1000 Ge räntesats i procent: 8.2 År Kapital 199 1000.00 1996 1082.0 1997 1171.81 1998 1268.48 1. Läs startår 2. Läs slutår 3. Läs kapital 4. Läs räntesats. Skriv rubriker 6. Upprepa från startår till slutår 6.1. Skriv årtal och kapital vid årets ingång 6.2. Beräkna årets ränta och lägg denna till kapital Diskussion: Vid inläsningen måste det gälla att startår är mindre än slutår samt att kapital och räntesats är större än noll. Datarepresentation: startår och slutår är av datatypen int. kapital och räntesats är av datatypen double. Implementation: import java.text.*; public class Kapital { public static void main(string[] arg) { int startar, slutar; double kapital, rantesats; String indata, utdata; NumberFormat r = NumberFormat.getInstance(); r.setmaximumfractiondigits(2); indata = JOptionPane.showInputDialog("Ange startår:"); startar = Integer.parseInt(indata); indata = JOptionPane.showInputDialog("Ange slutår: "); slutar = Integer.parseInt(indata); if (slutar > startar) "Slutår måste vara större än startår!!"); indata = JOptionPane.showInputDialog("Ge startkapital: "); kapital = Double.parseDouble(indata); if (kapital > 0) "Kapitalet måste vara positivt!!"); indata = JOptionPane.showInputDialog("Ange räntesats:"); rantesats = Double.parseDouble(indata); if (rantesats > 0) "Räntesatsen måste vara positivt!!"); utdata = " År Kapital\n"; for (int ar = startar; ar <= slutar; ar = ar + 1) { utdata = utdata + ar + " " + r.format(kapital) + "\n"; kapital = kapital * (1 + rantesats/100); utdata); // main // Kapital 6 I ett program hantera man ofta samlingar av objekt av samma typ. Ett fält är en numrerad samling av objekt, där varje delobjekt är av samma datatyp och delobjekten selekteras med index. int [] tal = new int[]; tal 0 0 0 0 0 tal[0] tal[1] tal[2] tal[3] tal[4] Indexeringen sker alltid från 0. Oinitierade heltal får värdet 0. Sådana samlingar vill man vanlingtvis kunna gruppera ihop till en sammanhängade struktur. För detta ändamål tillhandahåller Java språkkonstruktioner för att hantera fält. Varje enskilt element i ett fält kan handhas indviduellt via sitt index: tal[0] = 1; tal[1] = ; tal[2] = 6; tal[3] = 4; tal[4] = 3; tal 1 6 4 3 tal[0] tal[1] tal[2] tal[3] tal[4] 7 8

Istället för att skapa ett fält med new kan fältet skapas genom att initiera värden till fälet vid deklarationen. Antalet värden bestämmer då fältets storlek. int[] list ={1,, 6, 3, 4; Längden av ett fält fås av instansvariabeln length int nrofelements = list.length; kan skapas av godtycklig typ. double [] numbers = new double[20]; String[] namn = {"Adam", "Beda", "Cesar", "David", "Erik", "Fabian"; Punkt[] punkter= new Punkt[]; Klassen Punkt är definierad enligt: public class Punkt { private int x, y; public Punkt(int x, int y) { this.x = x; this.y = x;... //fler metoder Punkt[] punkter = new Punkt[]; punkter[1] = new Punkt(, 8); punkter 8 9 10 Klassen java.util.arrays Tilldelning ger ingen kopia, utan en referens till samma fält! int[] listone ={1,, 6, 3, 4; int[] listtwo = listone; I klassen java.util.arrays finns ett antal klassmetoder som är användbara när man arbetar med fält equal(f1, f2) ger true om fälten f1 och f2 är lika långa och motsvarande komponenter är lika, annars fås false listone 1 6 3 4 fill(f, v) sätter alla komponenter i fältet f till värdet v listtwo fill(f, i1, i2, v) sätter komponenterna i1 till i2-1 i fältet f till värdet v Satsen listtwo[1] = 1; resulterar således i att även elementet listone[1] får värdet 1! listone listtwo 1 1 6 3 4 sort(f) sort(f, i1, i2) binarysearch(f, k) tostring(f) sorterar fältet f i stigande ordning sorterar komponenterna i1 till i2-1 i fältet f i stigande ordning söker efter komponenten k i fältet f. Ger index för k om k finns i fältet f, annars fås ett värde < 0. Obs fältet måste vara sorterat! returnerar en strängrepresentation av fältet f Ytterligare ett antal metoder finns! 11 12

Användning av metoder i java.util.arrays Exempel: Att sortera ett fält... int[] list ={, 4, 3, 8, 1, 9, 6, 7, 2; Arrays.sort(list); Nu innehåller fältet list elementen 1, 2, 3, 4,, 6, 7, 8, 9 Exempel: Att lokalisera ett element i ett sorterat fält... int[] list ={, 4, 3, 8, 1, 9, 6, 7, 2; Arrays.sort(list); //sortera fältet int index = Arrays.binarySearch(list, 9); if (index >= 0) System.out.println("Talet 9 finns i index" + index); System.out.println("Talet 9 finns INTE i fältet!"); Att genomlöpa ett fält. För att genomlöpa ett fält används normalt en forloop int[] list = new int[20];... for ( i < list.length; i = i + 1) { // gör de bearbetningar av elementen // som skall göras Exempel: Summera talen i fältet list int sum = 0; for ( i < list.length; i = i + 1) sum = sum + list[i]; 13 14 Att söka i ett osorterat fält. Att söka i ett osorterat fält. Ett första försök: Använd en for-sats En bättre lösning:använd en while-sats och en boolsk flagga int [] list;.... "Ange talet som söks:"); int index = 0; // måste initieras for ( i < list.length; i = i + 1) { if (talet == list[i]) { index = i; if (funnen) "Talet finns i index " + index); "Talet finns INTE!"); int [] list;.... "Ange talet som söks:"); //har inte hittat det vi söker int index = 0, i = 0; while (i < list.length &&! funnen) { if (talet == list[i]) { //hittar det vi söker index = i; if (funnen) "Talet finns i index " + index); "Talet finns INTE!"); När vi funnit vad vi söker fortsätter sökningen ändock till slutet av listan! Onödigt! Sluta när vi hittat vad vi söker! 1 16

Att söka i ett osorterat fält. En svårbegriplig och därmed en dålig lösning: int [] list;.... "Ange talet som söks:"); int index; for (index = 0; index < list.length && talet!= list[index]; index++) ; if (index!= list.length) "Talet finns i index " + index); "Talet finns INTE!"); Exempel: En indatasekvens består av maximalt 100 osorterade positiva heltal. I indatasekvensen kan samma tal förekomma flera gånger. Skriv ett program som lagrar indatasekvensen i en lista på så sätt att alla dubbletter är borttagna, d v s endast första förekomsten av varje unikt tal skall lagras i listan. Inmatningen görs med användning av dialogrutor och datasekvensen avslutas att trycka på Cancel-knappen. Dessvärre ser man denna typ av lösningar i många läroböcker!!! 17 18 Analys: Indata: En sekvens av maximalt 100 positiva heltal. Utdata: Den inlästa sekvensen med alla dubletter borttagna. Exempel: Indatasekvensen 1 4 1 2 4 12 3 2 4 1 ger utskriften 1 4 2 12 3 Design: Diskussion: För att veta om ett tal har förekommit i indatasekvensen tidigare måste vi lagra den första förekomsten av talen i ett fält som vi kan kalla listan. När ett tal läses kontrollerar vi om talet redan finns i fältet listan. Om talet inte finns skall det lagras i listan. Algoritm: 1. antalelement = 0; 2. while (fler tal att läsa) 2.1. Läs talet 2.2. Kontrollera om talet finns i listan 2.3. if (talet inte finns i listan ) 2.3.1. 2.3.2. antalelement = antalelement+1; 3. Skriv ut listan Datarepresentation: talet är av datatypen int. listan är av datatypen int[100]. antalelement är av datatypen int. Implementation: public class EjDubletter1 { "Ange nästa tal i serien (avsluta med Cancel): "); if (indata == ) for ( i < antalelement; i = i +1) utdata); // main //EjDubletter1 19 20

Implementation: Användning av Scanner public class EjDubletter2 { "Ange indataserien: "); if (indata!= ) { //if //while for ( i < antalelement; i = i +1) utdata); "Ingen indata gavs!"); // main //EjDubletter2 Alternativ implementation (Uppdelning i underprogram): public class EjDubletter3 { public static int[] readlista() { "Ange indataserien: "); if (indata!= ) { //while //if int[] nylista = new int[antalelement]; // i fältet som returneras skall for ( i < antalelement; i = i +1) // alla element vara "ifyllda", nylista[i] = listan[i]; // dvs antalet element i fältet skall return nylista; // överensstämma med fältets längd // readlista public static void writelista(int[] listan) { if (listan.length == 0) "Listan är tom"); { for ( i < listan.length; i = i +1) utdata); // writelista int [] lista = readlista(); writelista(lista); // main //EjDubletter3 21 22 Alternativ implementation 2: (använder arraycopy) public class EjDubletter4 { public static int[] readlista() { "Ange indataserien: "); if (indata!= ) { //while //if int[] nylista = new int[antalelement]; System.arraycopy(listan, 0, nylista, 0, antalelement); return nylista; // readlista public static void writelista(int[] listan) { if (listan.length == 0) "Listan är tom"); { for ( i < listan.length; i = i +1) utdata); // writelista int [] lista = readlista(); writelista(lista); // main VAD HÄNDER OM VI FÖRSÖKER LÄSA IN MER ÄN 100 ELEMENT TILL FÄLTET?? ETT FEL UPPSTÅR OCH EEKVERINGEN AV PROGRAMMET AVBRYTS MED EN FELUTSKRIFT!! Vi försöker referera till ett index som ligger utanför fältets gränser och en exception av typen ArrayIndexOutOfBounds. Vi kan skydda oss mot denna situation genom defensiv programmering! Note: Java har en speciell konstruktion (try - catch) med vilken man kan fånga upp exceptions och åtgärda det fel som uppstått på ett eller annat sätt. Exceptions behandlas dock i denna kurs. //EjDubletter4 23 24

Implementation: Defensiv programmering): public class EjDubletter { public static int[] readlista() { "Ange indataserien: "); if (!funnen) if (antalelement < MAX) { return ; //while int[] nylista = new int[antalelement]; System.arraycopy(listan, 0, nylista, 0, antalelement); return nylista; // readlista public static void writelista(int[] listan) { for ( i < listan.length; i = i +1) utdata); // writelista int [] lista = readlista(); if (lista == ) "Alla tal ryms ej"); writelista(lista); // main //EjDubletter Parallella fält. Två fält kallas för parallella fält om den data som finns i motsvarande index i de båda fälten är logiskt relaterade till varandra på något sätt. Exempel Antag att vi har en golftävling med deltagare. Vi kan lagra deltagarnas namnen i en fält, deltagarnas startnummer i ett annat fält och deltagarnas resultat i ett tredje fält: String[] namn = new String[]; int[] startnr = new int[]; int[] score = new int[]; namn "Kalle" "Anna" "Stina" "Åsa" "Sven" startnr 4 2 1 3 score 74 67 73 70 68 Är dessa fält parallella gäller att varje index k i fältet namn är releterat till index k i fälten startnr och score, dvs "Stina" hade startnummer 2 och gick banan på 73 slag. Obs: I just detta exempel hade det givitvis varit bättre att skapat en klass med instansvariablerna namn, startnr samt score och istället använt ett enda fält med objekt av denna klass. 2 26 Parametrar till main. Parametrar till main. Metoden main har en parameterlista som utgörs av ett fält av strängar: public static void main(string[] args) Detta innebär att man kan ge indata till main-metoden via parameterlistan. Betrakta main-metoden i klassen Demo nedan. Vad main gör är att skriva ut de strängar som finns i dess parameter args. Argumenten till main-metoden ges när exekveringen av programmet startas. Startas exekveringen från kommando-fönstret skriver man alltså java Demo Anna Beda Doris Sker exekveringen från jgrasp skapar man ett kommandorad i vilket argumenten ges, genom att trycka på "Run Arguments" i menyn "Run". public class Demo { for ( i < args.length; i = i + 1) System.out.println("Argument " + i + " = " + args[i]); //main //Demo Innehåller parametern args strängarna "Anna", "Beda" och "Doris" blir utskriften Argument 0 = Anna Argument 1 = Beda Argument 2 = Doris 27 28