Föreläsning 5: Metoder och enkel inmatning Eva Blomqvist [email protected] Department of Computer and Information Science (IDA) Linköpings universitet Sweden November 3, 2013 1 Innehåll n n n Repetition: listor och mängder Enkel inmatning - att hämta data från användaren Metoder q Abstraktion och återanvändning av kod Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 2 Klasser för listor och mängder Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 3 Listor och mängder - motivering och definitioner (forts.) n n n Lista = en ordnad mängd med objekt (upprepning är ok) Mängd = inte ordnad, element förekommer bara en gång Listor och mängder finns som klasser i Javas stadardbibliotek q Exempel: ArrayList (java.util.ArrayList) n n n q Listklass som internt representerar listan som en array, men där storleken uppdateras efter behov Skapas genom följande uttryck (exempel med heltalselement): ArrayList<Integer> tallista = new ArrayList();! Finns metoder såsom "add" som lägger till ett element sist i listan, "get" som hämtar elementet på en viss position osv. Exempel: HashSet (java.util.HashSet) n n n Mängdklass som internt representerar mängden som en hashtabell Skapas genom följande uttryck (exempel med heltalselement): HashSet<Integer> talmangd = new HashSet();! Metoden "add" lägger till ett element om det inte redan finns Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 4 Vad är "Integer" - varför inte int? n Varje primitiv datatyp i Java har en motsvarande "wrapper"-klass q n n Varje "wrapper"-klass innehåller en mängd bra-att-ha metoder för att hantera värden av den primitiva datatypen Exempel: Integer q n Dvs Integer för int, Double för double osv... parseInt(String s) - metod för att göra om en textsträng, t ex "1024" till heltalet 1024 ArrayList och HashSet är exempel på klasser som kräver en typ-parameter, dvs när vi skapar en ny lista/ mängd ska vi ange typen av element den ska innehålla q Typen kan inte vara en primitiv typ, utan vi måste använda "wrapper"-klasserna Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 5 ArrayList - Exempel med for-each loop class ListaForEach { public static void main (String[] args) { java.util.ArrayList<Integer> tal = new java.util.ArrayList<Integer>(); for (int i = 1; i <= 10 ; i++) tal.add(i); for (int j : tal){ System.out.println("Talet är: " + j); } } } n OBS: typen på elementen måste vara en klass i Javas standardbibliotek q Vi återkommer till "wrapperklasser" lite senare, men ni måste skriva Integer istället för bara int när ni skapar en ArrayList Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 6 ArrayList - Exempel med iterator och while-loop class ListaIterator { public static void main (String[] args) { java.util.ArrayList<Integer> tal = new java.util.ArrayList<Integer> (); for (int i = 1; i <= 10 ; i++) tal.add(i); java.util.Iterator<Integer> taliterator = tal.iterator(); while (taliterator.hasNext()){ System.out.println("Talet är: " + taliterator.next()); } } } n En iterator har två viktiga metoder: hasNext() - returnerar ett booleskt värde, sant om det finns ett nästa element, och next() som returnerar nästa element Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 7 ArrayList - tips inför labben n För att lösa labbuppgiften behöver ni förmodligen mer information än såhär om klassen ArrayList och kanske fler exempel... q q ...en viktig del i den här kursen är att lära sig att läsa Javadoc för Javas standardbibliotek - börja alltid där! Behöver ni fler exempel: Googla! n n Väldigt få programmerare idag använder sig av läroböcker för att slå upp exempel, eftersom språken ändrar sig så fort - en lärobok blir gammal på bara ett par år! Vi vill att ni ska lära er att hitta aktuella exempel genom att googla eftersom det är så man oftast gör i "verkligheten" Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 8 Inmatning Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 9 Tillföra nya data n Initiera variabler med kända värden q q n Men... oftast vill vi inte ha ett program som är låst till ett visst värde q n int tal = 4; uppdatering: tal = tal + 2; Exempel: ta ut pengar från bankkonto - kunden vill bestämma summan som ska tas ut! Inte alltid samma! Standardinmatning q q q Konsolfönster/terminalfönster för in- och utmatning Utmatning: System.out.... Finns även: System.in.... Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 10 Tangentbordsinmatning n Programmet stannar vid en viss punkt i exekveringen och väntar på data q n Användaren skriver in data via tangentbordet q n Bör skriva ut en uppmaning åt användaren att ange indata Avslutas med return - programmet hämtar data Inmatningsbuffert q q q Plats i minnet mellan användaren och programmet inmatningskö Kan korrigeras innan man tryckt på retur Programmet hämtar ett eller flera värden från bufferten n n q Om inte alla värden hämtas ligger dessa kvar och kan användas nästa gång programmet vill ha en inmatning (istället för att vänta på användarens inmatning) Även "retur" är ett tecken och lagras i bufferten Kontrollera och agera om det är ett olämpligt värde Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 11 Buffertexempel n Uttag från bankkonto: q q q q q q q q q n Mata in kontonummer: ! 123456789 <retur>! Bufferten: 123456789 <retur>! Programmet läser in kontonumret Bufferten: <retur>! Programmet vill nu fråga användaren efter uttagsbelopp Mata in uttagsbelopp: ! Det finns redan tecken i bufferten, så programmet väntar inte utan kör vidare! Programmet läser in <retur> som uttagsbelopp - FEL! Vi måste se till att bufferten rensas innan vi går vidare så att vi kan läsa in nästa värde korrekt q OBS! Med klassen Scanner undviker vi detta problem! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 12 Funktioner för inmatning i Javas standardbibliotek n Inmatning av teckensträngar och primitiva värden: Scanner (java.util.Scanner)! q Skapa en Scanner: java.util.Scanner q q q in = new java.util.Scanner(System.in); Läsa in ett heltal: int tal = in.nextInt(); Väntar på att användaren ska mata in ett heltal och trycka på return, då hämtas heltalet och lagras i "tal"-variabeln Läsa in ett decimaltal: double tal = in.nextDouble(); Väntar på att användaren ska mata in ett decimaltal och trycka på return, då hämtas heltalet och lagras i "tal"variabeln Läsa in en textsträng (en rad): String rad = in.nextLine();! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 13 Uttag - läsa in uttagsbelopp class Uttag { public static void main (String[] args) { double saldo = 200.0; java.util.Scanner in = new java.util.Scanner(System.in); double uttag = in.nextDouble(); saldo = saldo - uttag; System.out.println("Nytt saldo är: " + saldo); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 14 Uttag - läsa in uttagsbelopp (med uppmaning) class Uttag2 { public static void main (String[] args) { double saldo = 200.0; java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange uttagsbelopp: "); double uttag = in.nextDouble(); saldo = saldo - uttag; System.out.println("Nytt saldo är: " + saldo); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 15 Läsa in en rad text class TextIn { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Skriv ditt namn: "); String namn = in.nextLine(); System.out.println("Ditt namn är: " + namn); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 16 Bra att veta: andra metoder för inläsning n Fördel med en Scanner: hanterar bufferten som vi förväntar oss (kastar bort <return>-tecken), vi behöver normal inte bekymra oss om att rensa den mellan inläsningar. n Det finns mängder med andra metoder för att läsa in text och andra värden från standardinmatningsenheten Ni behöver inte dessa för labbarna! n q Men, om ni är intresserade, eller behöver dem för projektet: n n System.in.read() OBS! rensar inte bufferten från styrtecken! till och från fil kommer vi till senare: paketet java.io Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 17 Metoder Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 18 Metod - vad är det? n n En procedur (ett antal steg) som vi bryter ut och ger ett eget namn - ett namngivet stycke kod Varför? q q Abstraktion: gör programmet mer överskådligt - vi behöver inte veta hur något utförs i detalj när vi ser huvudflödet i programmet (t ex i main-metoden) Mindre och mer återanvändbar kod: om samma sak ska göras på flera olika ställen i programmet skapar man en metod för att bara behöva skriva koden en gång, istället för på varje ställe den ska utföras n Men... upprepning var inte det en loop? Upprepning ett antal gånger på raken -> loop Upprepning av samma sak fast från olika ställen i programmets kod -> metod Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 19 Metod - varför: abstraktion n Anta att jag skriver ett program för att göra uttag på ett bankkonto som kräver följande steg: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Be användaren mata in kontonummer Användaren matar in kontonummer Be användaren mata in upptagsbelopp Användaren matar in uttagsbelopp Hämta saldo för det givna kontonumret Om saldot är mindre än uttagsbeloppet skriv ut felmeddelande och avsluta programmet Annars, minska saldot med uttagsbeloppet Be användaren mata in en orsak/kommentar till uttaget Användaren matar in en orsak/kommentar Spara det nya saldot och kommentaren Visa det nya saldot på skärmen Avsluta programmet Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 20 Metod - varför: abstraktion n n För att göra proceduren mer överskådlig kan jag skriva den i mer abstrakta termer, dvs utelämna en del av de detaljerade stegen och istället sammanfatta dem som ett steg... T ex såhär: 1. 2. 3. 4. 5. n n Hämta kontonummer och uttagsbelopp Hämta saldo för det givna kontonumret Om saldot är mindre än uttagsbeloppet skriv ut felmeddelande och avsluta programmet Annars, beräkna och visa nytt saldo samt en kommentar Avsluta programmet Den här beskrivningen är mer abstrakt, dvs vi talar inte om vilka detaljerade steg vi faktiskt måste göra för att "hämta kontonummer och uttagsbelopp" Punkterna ovan kan i ett Java-program representeras av ett antal olika metoder - innehållet i metoderna beskriver sedan vilka steg vi faktiskt måste göra! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 21 Metoder - behöver vi använda dem? n n Försök att alltid abstrahera era program så mycket det går - antingen top-down (enklast) eller bottom-up! Metoder från början (top-down): q n När ni ska skapa lite längre program, med många delsteg, börja med att skapa en övergripande struktur i mainmetoden m h a ett antal "tomma" metoder som ni sedan efter hand fyller på med kod. Metoder för att "förkorta" långa kodstycken (bottom-up): q Känns main-metoden lång och "rörig", så att ni knappt själva har koll på vad den gör längre? Fundera över vilka som är "huvudstegen" i programmet och skapa metoder för dessa, klipp sedan ut kodstycken ur main-metoden och lägg i de nya metoderna istället! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 22 Metod - varför: upprepning av kod class Uppmaning { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); System.out.print("Skriv ett heltal: "); int tal = in.nextInt(); tal = tal + 3; System.out.print("Skriv ett heltal: "); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 23 Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 24 Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 25 in java.util.Scanner Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 26 in java.util.Scanner Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 27 in java.util.Scanner Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 28 in java.util.Scanner Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 29 in java.util.Scanner Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 30 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 31 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = 7; tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 32 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 33 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = 7 + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 34 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 35 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 36 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 37 in java.util.Scanner tal int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 38 in java.util.Scanner tal int tal2 int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = 2; tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: 2 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 39 in java.util.Scanner tal int tal2 int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: 2 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 40 in java.util.Scanner tal int tal2 int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = 10 * 2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: 2 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 41 in java.util.Scanner tal int tal2 int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = 10 * 2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: 2 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 42 in java.util.Scanner tal int tal2 int Metod - uppmaningen som metod class UppmaningMetod { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); uppmana(); int tal = in.nextInt(); tal = tal + 3; uppmana(); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana() { System.out.print("Skriv ett heltal: "); } } evabl45> Skriv ett heltal: 7 evabl45> Skriv ett heltal: 2 evabl45> Resultat: 20 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 43 in java.util.Scanner tal int tal2 int Metod med parameter class UppmaningMetodParam { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 44 Metod med parameter in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 45 Metod med parameter "Skriv ett heltal:" in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 46 maning String Metod med parameter "Skriv ett heltal:" in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 47 maning String Metod med parameter "Skriv ett heltal:" in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana("Skriv ett heltal:"); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 48 maning String Metod med parameter "Skriv ett heltal:" in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana("Skriv ett heltal:"); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 49 maning String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana("Skriv ett heltal: "); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett heltal: ") { System.out.print(s); } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 50 maning String "Skriv ett heltal: " s String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana("Skriv ett heltal: "); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 51 maning String "Skriv ett heltal: " s String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana("Skriv ett heltal: "); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 52 maning String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 53 maning String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 54 maning String Metod med parameter "Skriv ett heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 55 maning String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 56 maning String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 57 maning String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana("Skriv ett nytt heltal: "); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 58 maning String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana("Skriv ett nytt heltal: "); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 59 maning String "Skriv ett nytt heltal: " s String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana("Skriv ett nytt heltal: "); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 evabl45> Skriv ett nytt heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 60 maning String "Skriv ett nytt heltal: " s String Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 evabl45> Skriv ett nytt heltal: Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 61 maning String tal2 int Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 evabl45> Skriv ett nytt heltal: 4 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 62 maning String tal2 int Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 evabl45> Skriv ett nytt heltal: 4 evabl45> Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 63 maning String tal2 int Metod med parameter "Skriv ett nytt heltal: " in class UppmaningMetodParam { java.util.Scanner public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = tal + 3; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; int System.out.println("Resultat: " + tal); } public static void uppmana(String s = "Skriv ett nytt heltal: " ) { System.out.print(s); } } evabl45> Skriv ett heltal: 3 evabl45> Skriv ett nytt heltal: 4 evabl45> Resultat: 24 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 64 maning String tal2 int Två metoder och returvärde class UppmaningMetodRetur { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; uppmana(maning); int tal2 = in.nextInt(); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; return summan; } } November 3, 2013 65 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 66 66 maning String 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 67 67 maning String 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 68 68 maning String 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i = 3) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 69 69 maning String i int 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) summan { System.out.print(s); } int public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 70 70 maning String i int 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) summan { System.out.print(s); } int public static int plustre(int i) { int summan = 3 + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 71 71 maning String i int 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) summan { System.out.print(s); } int public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 72 72 maning String i int 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) summan { System.out.print(s); } int public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return 6; } } November 3, 2013 73 73 maning String i int 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(3); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return 6; } } November 3, 2013 74 74 maning String 3 Två metoder och returvärde "Skriv ett heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = 6; maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return 6; } } November 3, 2013 75 75 maning String 3 Två metoder och returvärde "Skriv ett nytt heltal: " class UppmaningMetodRetur in { public static void main (String[] args) java.util.Scanner { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; uppmana(maning); int tal = in.nextInt(); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; tal uppmana(maning); int tal2 = in.nextInt(); int tal = tal * tal2; System.out.println("Resultat: " + tal); } public static void uppmana(String s) { System.out.print(s); } public static int plustre(int i) { int summan = i + 3; evabl45> Skriv ett heltal: return summan; } } November 3, 2013 76 76 maning String 3 Två parametrar och returvärden class UppmaningMetodRetur2 { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; int tal = lasin(maning, in); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; int tal2 = lasin(maning, in); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static int lasin(String s, java.util.Scanner in) { System.out.print(s); int tal = in.nextInt(); return tal; } public static int plustre(int i) { int summan = i + 3; return summan; } } November 3, 2013 77 Två parametrar och returvärden class UppmaningMetodRetur3 { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; int tal = lasin(maning, in); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; int tal2 = lasin(maning, in); tal = tal * tal2; System.out.println("Resultat: " + tal); } public static int lasin(String s, java.util.Scanner in) { System.out.print(s); return in.nextInt(); } public static int plustre(int i) { return i + 3; } } November 3, 2013 78 Metoddeklaration - sammanfattning n n Deklarationen kallas även ibland för "header" Deklarationen innehåller ett antal delar, ta t ex metoddeklarationen från förra bilden: public static int plustre(int i) {}! q q q q q public static - betyder att metoden kan kommas åt från andra klasser och att det är en klassmetod (vi återkommer till detta i del 2 - just nu kan ni deklarera alla metoder som public static) int - är returtypen för metoden, d v s vår exempelmetod returnerar ett värde av typen int. Om en metod inte returnerar något värde skriver vi "void" istället för returtyp, jämför t ex med main-metoden. plustre - är metodens namn som vi använder för att anropa den, dvs när vi vill använda koden som metoden innehåller () - innehåller en lista på parametrar, dvs indata som metoden måste förses med för at fungera. Varje parameter anges först med en typ, t ex int i vårt exempel, och sedan ett namn som värdet har inne i metoden, i vårt fall bokstaven i. Om metoden inte behöver några indata lämnas parentesen tom. {} - omsluter metodens kropp, dvs koden som körs när metoden anropas. Allt före { räknas till metoddeklarationen, eller "headern"! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 79 Metod som anropar en annan metod class UppmaningFlerMetoder { public static void main (String[] args) { System.out.println("Resultat: " + hamtatal()); } public static int hamtatal() { java.util.Scanner in = new java.util.Scanner(System.in); String maning = "Skriv ett heltal: "; int tal = lasin(maning, in); tal = plustre(tal); maning = "Skriv ett nytt heltal: "; int tal2 = lasin(maning, in); tal = tal * tal2; return tal; } public static int lasin(String s, java.util.Scanner in) { System.out.print(s); return in.nextInt(); } public static int plustre(int i) { return i + 3; } } November 3, 2013 80 Lokala variabler n En variabel som skapas i en metod är inte tillgänglig för andra metoder - den är "lokal" i den metoden q n När en metod avslutas försvinner alla variabler som fanns inne i metoden alla värden "kastas" En parametervariabel som lagrar ett inskickat värde kan inte påverka värdet på en variabel i den anropande metoden inifrån metoden q Namnet på parametern gäller bara inne i metodens egen kropp class PaverkaVariabel { public static void main (String[] args) { int i = 10; plustre(i); System.out.println("Siffran: " + i); //skriver ut "Siffran: 10" } public static void plustre(int i) { i = i + 3; } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 81 Globala variabler - konstant n En variabel som deklareras utanför klassens metoder blir "global" -den kan kommas åt av alla dess metoder q n För att bli tillgänglig i static metoder (t ex i main-metoden) måste även variabeln vara deklarerad som static (vi återkommer till detta i del 2 - just nu kan ni deklarera alla globala variabler som public static)! Undvik globala variabler så långt det är möjligt! q Undantag: variabler som inte ska ändras - global konstant! class Cirkel { public static final double PI = 3.14; public static void main (String[] args) { double r = 10; double om = omkrets(r); System.out.println("Omkrets: " + om); } public static double omkrets(double radie) { return 2 * radie * PI; } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 82 Metoden "main" - ett specialfall class Cirkel { public static final double PI = 3.14; public static void main (String[] args) { double r = 10; double om = omkrets(r); System.out.println("Omkrets: " + om); } public static double omkrets(double radie) { return 2 * radie * PI; } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 83 Att skicka in parametrar till ett program class Namn { public static void main (String[] args) { if (args.length > 0) System.out.println("Du skrev: " + args[0]); } } n n Inifrån Eclipse: kompilera klassen, välj "Run Configurations...", skriv ett namn under fliken "Arguments" i fältet "Program arguments" Från ett terminalfönster: kör klassen med kommandot "java Namn <textsträng>" där du ersätter <textsträng> med ett namn Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 84 Vad är överlagring? n Anta att vi vill ha en metod "max" som returnerar det största värdet av två ELLER tre tal - ibland vill vi skicka in två tal ibland 3 q q Går detta att lösa? Om vi deklarerar följande metod måste vi alltid ge den två tal som indata: public static int max (int i1, int i2) { ... }! q Kan vi skriva en annan variant av metoden som istället tar tre tal som indata? Såhär: public static int max (int i1, int i2, int i3) { ... }! q Kan dessa metoder finnas samtidigt i vår klass? Hur kan vi skilja dem åt? n n Genom deras signatur = namn + parameterlista max (int i1, int i2) respektive max (int i1, int i2, int i3) ! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 85 Vad är överlagring? n Överlagring är alltså när vi har flera metoder med samma namn men olika signatur! q n Rätt metod-kropp väljs utifrån den signatur som passar in Jämför med metoder i klassen String q Det finns åtta olika metoder som heter valueOf() i klassen String, det som skiljer dem åt är vilken typ av parameter som krävs som indata Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 86 Exempel class Overlagring { public static void main (String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); System.out.print("Skriv ett heltal: "); int tal = in.nextInt(); tal = plustre(tal); System.out.print("Skriv ett decimaltal: "); double tal2 = in.nextDouble(); tal2 = plustre(tal2); System.out.println("Resultat: " + tal + " " + tal2); } public static int plustre(int i) { return i + 3; } public static double plustre(double d) { return d + 3; } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 87 Rekursion - en metod som anropar sig själv n Rekursion - metod för problemlösning där en metod anropar sig själv tills en viss situation uppstår q q "Basfallet" = situationen när vi inte längre ska anropa metoden Rekursivt anrop = metoden anropar sig själv Exempel - summera alla tal mellan ett givet tal (n) och 1 public static int sum (int n) { int result; // hjälpvariabel för resultatet if (n == 1) // basfallet result = 1; else result = n + sum(n-1); //rekursivt anrop return result; } n Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 88 Rekursion - en metod som anropar sig själv Exempel: vad händer med n=3? public static int sum (int n) { int result; // hjälpvariabel för resultatet if (n == 1) // basfallet result = 1; else result = n + sum(n-1); //rekursivt anrop return result; } n n n n n n n n vi anropar sum(3)... n != 1, vi kör "else"-alternativet: result = 3 + sum(2) vi inväntar resultatet av sum(2) sum(2): n!=1, vi kör "else"-alternativet: result = 2 + sum(1) vi inväntar resultatet av sum(1) sum(1): n == 1, basfallet! - result =1; return 1; vi backar utåt i våra rekursiva anrop, i sum(2): result = 2 + 1; return 3; vi backar igen, i sum(3): result = 3 + 3; return 6; -> vi är klara! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 89 Att jobba med metoder Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 90 Abstrakt till konkret - att utgå från metoder n En förenklad variant av exemplet i början: 1. 2. 3. 4. 5. n Hämta kontonummer och uttagsbelopp från användaren Hämta saldo för det givna kontonumret Om saldot är mindre än uttagsbeloppet skriv ut felmeddelande och avsluta programmet Annars, beräkna och visa nytt saldo Avsluta programmet Låt oss skapa programmet, och utgå från metoder... Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 91 Abstrakt till konkret - att utgå från metoder n Vi skapar en ny klass i Eclipse som vi kallar Uttag3, och Eclipse genererar automatiskt en tom main-metod åt oss: public class Uttag3 { public static void main(String[] args) { // TODO Auto-generated method stub } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 92 Abstrakt till konkret - att utgå från metoder n Vad ska programmet göra? Låt oss börja med huvudstegen i vår punktlista, och lägga till dem som metoder! q q För varje steg lägger vi till en eller flera metodanrop i mainmetoden För varje sådan metod skapar vi en metoddeklaration, samt en kropp som än så länge bara innehåller ett påhittat returvärde - på så vis kan vi redan nu kompilera och köra programmet, även fast det ännu inte gör alla de steg vi vill att det ska göra! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 93 Abstrakt till konkret - att utgå från metoder public class Uttag3 { public static void main(String[] args) { int accNo = getAccountNumber(); double amount = getWithdrawalAmount(); double balance = getCurrentBalance(accNo); if (balance < amount) System.out.println("Too large amount!"); else showNewBalance(amount, balance); } public static int getAccountNumber() { return 0; } public static double getWithdrawalAmount() { return 0.0; } public static double getCurrentBalance(int number) { return 0.0; } public static void showNewBalance(double amount, double balance) { } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 94 Abstrakt till konkret - att utgå från metoder n Från och med nu kommer vi inte lägga till någon mer kod i vår main-metod utan bara i de övriga metodkropparna q n Nästa steg är att börja skriva koden för var och en av metoderna... q n main-metoden får en väldigt enkel och begriplig struktur Att vi bara behöver koncentrera oss på en uppgift i taget gör att det blir färre fel i koden och det är enklare att komma på en bra lösning för varje deluppgift för sig Låt oss börja med den första metoden... q getAccountNumber() ska fråga användaren efter ett kontonummer och returnera det numret Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 95 Abstrakt till konkret - att utgå från metoder public static } November 3, 2013 int getAccountNumber() { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange kontonummer: "); int number = in.nextInt(); return number; 96 Abstrakt till konkret - att utgå från metoder n Nästa metod ska läsa in ett uttagsbelopp från användaren... public static } double getWithdrawalAmount() { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange uttagsbelopp: "); double amount = in.nextDouble(); return amount; Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 97 Abstrakt till konkret - att utgå från metoder n Nu ska vi hämta aktuellt saldo för angivet kontonummer... q Vi skulle t ex kunna koppla upp oss mot en databas med kontoinformation och hämta saldot därifrån, men i vårt exempel nöjer vi oss med ett påhittat testvärde, låt oss säga 200.0 kr public static double getCurrentBalance(int number) { return 200.0; } n Vi går vidare till den sista metoden, som ska beräkna och visa det nya saldot för användaren... public static void showNewBalance(double amount, double balance) { double newBalance = balance - amount; System.out.println("Nytt saldo: " + newBalance); } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 98 public class Uttag3 { public static void main(String[] args) { int accNo = getAccountNumber(); double amount = getWithdrawalAmount(); double balance = getCurrentBalance(accNo); if (balance < amount) System.out.println("Too large amount!"); else showNewBalance(amount, balance); } public static int getAccountNumber() { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange kontonummer: "); int number = in.nextInt(); return number; } public static double getWithdrawalAmount() { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange uttagsbelopp: "); double amount = in.nextDouble(); return amount; } public static double getCurrentBalance(int number) { return 200.0; } public static void showNewBalance(double amount, double balance) { double newBalance = balance - amount; System.out.println("Nytt saldo: " + newBalance); } } November 3, 2013 99 Abstrakt till konkret - att utgå från metoder n Fördelar med att utgår från metoder q q q q Enkelt att få överblick över main-metoden redan från början main-metoden "växer" inte och fortsätter vara begriplig Vi har ett körbart (och testbart) program redan efter att ha skrivit några rader kod Vi kan fokusera på en uppgift i taget när vi sedan skriver kroppen för de olika metoderna Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 100 Konkret till abstrakt - "bryta ut" metoder n Det kan hända att man inte tänker sig för och börjar skriva all sin kod i main-metoden, men snart upptäcker att den blir alldeles för stor q q q n Tumregel i kursen: får inte hela din main-metod plats på skärmen samtidigt - då är den definitivt för stor! Helst bör main-metoden bara innehålla 10-20 rader kod... "Bryt ut" delar av koden, d v s skapa metoder och klipp ut delar av din kod som läggs i metoder istället Mer jobb, mer kod att skriva om, än om du planerar för metoder från första början! På labbarna: om handledarna tycker att din main-metod (eller någon annan metod) är för stor kommer de uppmana er att skapa fler metoder istället! - komplettering Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 101 Konkret till abstrakt - "bryta ut" metoder public class Uttag4 { public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Ange kontonummer: "); int accNo = in.nextInt(); System.out.println("Ange uttagsbelopp: "); double amount = in.nextDouble(); double balance = 200.0; if (balance < amount) System.out.println("Too large amount!"); else { double newBalance = balance - amount; System.out.println("Nytt saldo: " + newBalance); } } } Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 102 Konkret till abstrakt - "bryta ut" metoder public class Uttag4 { public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); int account = getAccountNumber(in); double newbalance = getNewBalance(account, in); if (newbalance < 0) System.out.println("Too large amount!"); else System.out.println("Nytt saldo: " + newbalance); } public static int getAccountNumber(java.util.Scanner in){ System.out.println("Ange kontonummer: "); int accNo = in.nextInt(); return accNo; } public static double getNewBalance(int accNo, java.util.Scanner in){ System.out.println("Ange uttagsbelopp: "); double amount = in.nextDouble(); double balance = getCurrentBalance(accNo); return balance - amount; } public static double getCurrentBalance(int accNo){ return 200.0; } } November 3, 2013 103 Sammanfattning n Inmatning av data via terminalfönstret - ett sätt för användaren att ge indata till programmet q q n Använd klassen java.util.Scanner och dess metoder nextInt(), nextDouble() och nextLine() Finns alternativ - läs gärna om dessa i Javadoc för standardbiblioteket eller Googla, men se upp: alla klasser hanterar inte bufferten lika bra, dvs ni kan få problem med inläsning av "skräptecken" Metoder - ett sätt att abstrahera och återanvända kod q q q q I metoddeklarationen anger vi (förutom public static) returtyp, namn på metoden och dess parametrar I metodkroppen skriver vi den kod som ska köras när metoden anropas Metoder kan anropas inifrån andra metoder, på så vis skapas en struktur av mer och mer detaljerade instruktioner Använd metoder - main-metoden ska helst inte vara större än 10-20 rader kod för uppgifterna i den här kursen! Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 104 Nästa gång n n Undantag Andra sätt att läsa in och mata ut data q Läsa och skriva från/till fil Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 105 Department of Computer and Information Science (IDA) Linköpings universitet, Sweden November 3, 2013 106