Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.

Lignende præsentationer


Præsentationer af emnet: "GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder."— Præsentationens transcript:

1 GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder 9.15. www.itu.dk/courses/GP/E2005 Martin Lillholm

2 GP5, Martin Lillholm 2 Obligatorisk opgave Var opgaven til forrige onsdag 1.For nem 2.For svær 3.Tilpas – skulle bruge noget tid og tanker på den, men så var den også til at løse/forstå. Er der nogen, der ikke har afleveret fordi den slet ikke var til at få hul på?

3 GP5, Martin Lillholm 3 Sidste gang Afviklingsrækkefølge igen (flow of control) Boolske (logiske) udtryk Sammenligningsoperatorer og logiske operatorer (Relational and logical operators) Betingede sætninger og sammenligning af data –if og switch sætninger Løkkekonstruktioner –for, do, while konstruktioner Programblokke (block statements) Grafik med løkker og betingede sætninger

4 GP5, Martin Lillholm 4 Denne gang Tabeller (arrays) Tabeller med mere end en dimension Tabeller med objekter Kommandolinieargumenter Klassen ArrayList Indlæsning fra tekstfil

5 GP5, Martin Lillholm 5 Tabeller – motivation (1) Opgaven lyder: Indlæs tre tal og beregn deres gennemsnit.

6 GP5, Martin Lillholm 6 Tabeller – motivation (2) Opgaven lyder: Indlæs hundrede tal og beregn deres gennemsnit.

7 GP5, Martin Lillholm 7 Tabeller (arrays) En tabel er en liste af værdier 0 1 2 3 4 5 6 7 8 9 79 87 94 82 67 98 87 81 74 91 En tabel med N elementer har første indeks 0 og sidste indeks N-1 scores Hele tabellen har et navn Hver værdi har et heltals indeks Tabellen her er en tabel af heltal med 10 elementer og indeks fra 0 til 9

8 GP5, Martin Lillholm 8 Tabeller En given værdi refereres ved tabelnavnet efterfulgt af et indeks (et aritmetisk (heltals) udtryk) i [] ’er Altså giver scores[2] 94; værdien på tredie plads i tabellen scores[2] fungerer fuldstændig som enhver anden heltals ( int ) variabel: scores[2] = 89; int first = 2; scores[first] = scores[first] + 2; mean = (scores[0] + scores[1])/2; System.out.println ("Top = " + scores[5]);

9 GP5, Martin Lillholm 9 Tabeller En tabel gemmer altså flere værdier af samme type Typen kan er enten en primitiv type eller en klasse type (fuldstændig ligesom en almindelig variabel) Vi kan altså have tabeller af heltal ( int ), decimaltal ( double ) eller tabeller af strenge ( String ) eller eksempelvis personer ( Person ), hvis sidstenævnte er en veldefineret klasse I praksis er tabeller objekter og en tabelvariablen er altså i sig selv kun en reference De faktiske tabeller der refereres af en tabel variabel skal altså instantieres som alle andre objekter scores 79 87 94 82 67 98 87 81 74 91

10 GP5, Martin Lillholm 10 Erklæring af tabeller Tabeller Erklæres som: type[] identifier; Eksempler: int[] scores; boolean[] flags; String[] names; Altså angiver vi ingen størrelse i erklæringen, men kun at der er tale om en tabel af en bestemt type Alternativ syntaks: type identifier[]; altså: int scores[];

11 GP5, Martin Lillholm 11 Instantiering af tabeller Som for alle andre objekter med kommandoen new Her angives størrelsen af den faktiske instans En instans kan ikke ændre størrelse, men En tabel variabel kan sættes til at referere en ny instans med en anden størrelse float[] prices = new float[500]; boolean[] flags; flags = new boolean[20]; char[] codes = new char[1750]; codes = new char[2000];

12 GP5, Martin Lillholm 12 Tabeller – motivation (3) Opgaven lyder: Indlæs hundrede tal og beregn deres gennemsnit.

13 GP5, Martin Lillholm 13 En initialiseringsliste kan benyttes samtidig med erklæring (ligesom vi kan initialisere almindelige variable) Værdierne i listen skrives i {} ’er og adskilles af kommaer I praksis bliver bliver tabellen både erklæret og instantieret (man ”sparer” altså den implicitte new kommando; tabellens størrelse svarer til antallet af elementer i listen) Eksempler (for simple typer): Det er kun ved initialisering konstantlister kan bruges til at tildele værdier til tabeller (Hvorfor?) Initialisering int[] units = {147, 323, 89, 933, 540,269, 97, 114}; char[] letterGrades = {'A', 'B', 'C', 'D', ’F'};

14 GP5, Martin Lillholm 14 Eksempel på brug af tabeller ”Almindeligt” brug Iterator – benyttes når alle elementer vil tilgåes fra laveste til højeste indeks L&L side 373.

15 GP5, Martin Lillholm 15 Tabellers indeks En tabel har altid en fast størrelse når først den er instantieret Indekset benyttes til at tilgå et specifikt element (en variabel) i tabellen Går fra 0 til N-1 (hvor N er tabellens størrelse) ArrayIndexOutOfBoundsException undtagelsen (exception) kastes (throw), hvis man forsøger at benytte et indeks uden for disse grænser – mere om undtagelser senere i kurset Fænomenet kaldes grænsekontrol (bounds checking) double[] codes = new double[100] for (int index=0; index <= 100; index++) codes[index] = index*50 + epsilon; off-by-one

16 GP5, Martin Lillholm 16 Tabellers indeks Enhver tabel har en offentlig ( public ) konstant length, der indeholder tabellens størrelse Den tilgåes gennem tabelnavnet: scores.length Bemærk at length er tabellens størrelse og ikke sidste tilladte indeks – sidste lovlige indeks er altså length-1

17 GP5, Martin Lillholm 17 Eksempel

18 GP5, Martin Lillholm 18 Eksempel

19 GP5, Martin Lillholm 19 Tabeller som parametre En tabel kan på lige fod med andre objekter benyttes som en parameter Som for andre objekter er det referencen og ikke selve tabellen, der kopiers til den formelle parameter (den formelle og den aktuelle parameter refererer altså samme ”fysiske” tabel – i modsætning til primitive typer) Altså: Hvis man ændrer indholdet af en tabel (givet som parameter) i en metode ændres indholdet også udenfor metoden Enkelte tabelelementer kan også benyttes som parametre: System.out.println (score[3]);

20 GP5, Martin Lillholm 20 Tabeller med objekter Elementer i en tabel kan være objekt-referencer Den følgende erklæring allokerer plads til 5 referencer til objekter af typen String: String[] words = new String[5]; Men den allokerer ikke de fem strengobjekter, men indeholder derimod 5 referencer Altså skal hvert objekt i et en med objekter instantieres separat.

21 GP5, Martin Lillholm 21 Tabeller med objekter Vi erklærer følgende tabel: String[] words = new String[5]; words - - - - - System.out.println (words[1]) ville på nuværende tidpunkt resulterer i en NullPointerException “friendship” words - - “loyalty” “honor” Efter instantiering af words[0]..words[2]

22 GP5, Martin Lillholm 22 Leg med tabeller … i BlueJ Udskriv en tabel Find minimum/maksimum Sum af en tabels elementer Tabeller som argumenter Tabeller med objekter … hvis tiden tillader Find et element … hvis tiden tillader Sortering … hvis tiden tillader

23 GP5, Martin Lillholm 23 Strengkonstanter (string literals) igen Husk at strengobjekter kan dannes ved brug af strengkonstanter (implicit kald af new ) Altså kan man initialisere tabeller af strenge med eksempelvis: String[] verbs = {"play", "work", "eat", "sleep"}; String[] verbs = {new String(“play“), …} String[] verbs = new String[4]; verbs[0] = “play”; verbs[1] = “work”; …

24 GP5, Martin Lillholm 24 Tabeller med objekter – eksempler GradeRange og Grade side 384-386 i BlueJ Tunes, CDCollection og CD side 387-392 i BlueJ

25 GP5, Martin Lillholm 25 Kommandolinieargumenter Benyttes til at give data fra kommandolinien til et program (Eksempelvis kommandoen cd Java, javac MyClass.java ) Selvom java programmer kaldes gennem JVM ( java ) kan de også modtage kommandolinieargumenter main metodens signatur indikerer at main ”tager” en tabel af strenge ( String ) som parameter Eksempelvis vil følgende give en tabel med strengene en test på plads 0 og 1 i tabellen (normalt args ): java MyClass en test

26 GP5, Martin Lillholm 26 Kommandolinieargumenter Bemærk at kommandolinieargumenterne er en tabel af strenge – også selvom man skriver tal Konvertering kan være nødvendig Som med al anden I/O rige fejlmuligheder... Eksempel i BlueJ hvis tiden tillader det

27 GP5, Martin Lillholm 27 To-dimensionelle tabeller En ”almindelig” tabel indeholde en liste af værdier eller objekt-referencer En to-dimensionel tabel er faktisk en tabel af tabeller en dimension to dimensioner

28 GP5, Martin Lillholm 28 To-dimensionelle tabeller En to-dimensionel tabel erklæres ved at angive hver dimension for sig: int[][] scores = new int[12][50]; Et element tilgåes ved at angive to indeks (heltals udtryk) value = scores[3][6]; Eksempler: TwoDArray side 399 i L&L SodaSurvey side 400 i L&L

29 GP5, Martin Lillholm 29 Fler-dimensionelle tabeller Vi kan tænke på en tabel med 3 dimensioner som en kube af værdier eller objektreferencer: String[][][] nameCube = new String[10][10][10]; Mere end 3 dimensioner kan være svært at forestille sig, men intet forhindrer os i at benytte det alligevel: String[][][][] inventory = new String[2][5][10][20]; int wareHouse = 1; int storageRoom = 4; int section = 6; shelve = 16; inventory[wareHouse][storageRoom][section][shelve] = ”boots”; Hver dimension kan have forskellige størrelser

30 GP5, Martin Lillholm 30 Dynamiske tabeller – ArrayList klassen ArrayList klassen er en del java.util pakken Som tabeller kan den benyttes til at gemme en liste af værdier eller referencer og hver værdi kan tilgåes vha. et indeks Man kan ikke bruge []- syntaksen til ArrayList I stedet benyttes metoderne add(...) og get() Til gengæld er ArrayList tabeller dynamiske; dvs. de udvides og indskrænkes med antallet af elementer, der indsættes eller tages ud. Man angiver således ikke nogen størrelse fra starten: ArrayList scores = new ArrayList();

31 GP5, Martin Lillholm 31 Dynamiske tabeller – ArrayList klassen Elementer indsættes i ”halen”, hvis der ikke angives eksplicit indeks Hvis der indsættes på en allerede optaget indeks rykkes indholdet fra og med det indeks en plads frem (”mod højre”). Det nye element indsættes og listen er blevet en længere Tilsvarende bliver listen en kortere hvis metoden remove(...) benyttes Husk at add og remove ”midt i listen” påvirker de resterende elementers indeks I sin originale form gemmer ArrayList altid objekter af typen Object … mere om det senere i kurset Brug indtil videre udgaven, hvor man eksplicit angiver type: ArrayList reunion = new ArrayList ;

32 GP5, Martin Lillholm 32 Dynamiske tabeller – ArrayList klassen ArrayList er oftest langsommere end en tilsvarende ”almindelig” tabel. Hvorfor ? Benyt altid tabeller, hvis det er muligt; specielt i tilfælde, hvor man kan bestemme pladsbehovet Benyt ArrayList, hvis pladsbehovet ikke kendes på forhånd Eksempel: Beatles side 405 i L&L

33 GP5, Martin Lillholm 33 Indlæsning af tekstfiler med Scanner klassen Vi har tidligere set Scanner klassen brugt til at læse input fra ”standard input” via System.in Kan også benyttes til at indlæse fra en tekstfil: Scanner scanStudents = new Scanner (new File (”BMI.txt”)); Et eksempel på en normal ”standard” for data i tekstfiler er komma-separerede felter: Karen Blixen, 162, 65 Martin Andersen Nexø, 180, 80 Herman Bang, 175, 75 scanStudents.useDelimiter("\\s*[\\n,]\\s*"); Definerer en passende feltadskiller.

34 GP5, Martin Lillholm 34 Indlæsning af tekstfiler med Scanner klassen Eksempelvis kan en linie fra filen nedenfor indlæses som: name = scanStudents.next(); height = scanStudents.nextInt(); weight = scanStudents.nextInt(); Karen Blixen, 162, 65 Martin Andersen Nexø, 180, 80 Herman Bang, 175, 75 Et helt andet eksempel: URLDissector side 240 i L&L


Download ppt "GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder."

Lignende præsentationer


Annoncer fra Google