732G11 Linköpings universitet 2011-02-15
1 2 3 4
Extrapass Extrapass håller på att bokas. Blir 3-4 st. och öppet för alla. Mer info på kursmailen när bokningen är klar.
i Java En funktion i Java... public static int f( int x){ return (3 * x + 4); }... Kallas även metoder. Kan ha sidoeffekter. (Kan påverka variabler utanför funktionen, förutom att returnera ett värde.) Kan vara icke-deterministiska. (Samma argument ger inte alltid samma resultat.)
Tydligare kod En metod har alltid ett namn. Ofta är det enklare att förstå vad som händer när man ser namnet än när man ser den kod som faktiskt körs. Namnet kan vara mer allmänt (abstrakt), och underlättar en översiktlig läsning av programmet. Tydlighet... if ( grade >= 3 && grade < 5) { grade ++; }... grade = increasegradebyone ( grade );
Kortare kod Eftersom man kan använda koden igen så behöver man inte upprepa sig så ofta. Arbetsbesparande public static int getinteger ( int min, int max int n; do{ n = in. nextint (); } while ( n < min n > max ); return n; }
Att skapa en metod En metod... // Ökar ett tal med ett public static int increasebyone ( int value ){ int bigvalue = value + 1; return bigvalue ; } public static void main ( String [] args ){ System. out. println ( increasebyone (41)); }...
Parametrar Fungerar som variabler, men de måste tilldelas ett värde när funktionen körs. Man brukar säga att man skickar med värden till tunktionen. Precis som vanliga variabler måste de ha både typ och namn. Efter att metoden är slut glöms parametrar och lokala variabler bort. Primitiva typer kopieras, medan referenstyper (läs Arrayer) delar på samma värde.
Resultatet av att köra en funktion. Kan vara void: (inget resultat genereras). Returvärden Anges med nyckelordet return: ex: return värde; När return körs avslutas funktionen (även om man inte kört färdigt den. För funktioner som inte returnerar något värde kan man fortfarande köra return; för att avsluta funktionen.
Metodanrop En metod anropas genom att skriva funktionsnamnet(parameter1, parameter2,...) Om funktionen returnerar ett värde av rätt typ kan funktionsanropet användas som det värdet: int a = beräkna(3, 7) + 4; Om du vill anropa metoder i andra filer (klasser) måste du ange var de ligger: Klass.metod(...) exempelvis Math.random().
Javakod Rövarspråket String word ; do { word = in. nextline (); for ( int i =0; i< word. length (); i ++){ char letter = word. charat ( i); if ( letter == a letter == e letter == i letter == o letter == u letter == y letter == å letter == ä letter == ö ) { print ( letter ); } else { print ( letter + "o" + letter ); } } while (! word. equals (" quit " ));
Rövarspråket Javakod med metoden isvowel() do{ String word = in. nextline (); for ( int i =0; i< word. length (); i ++){ char letter = word. charat ( i); if ( isvowel ( letter )) { print ( letter ); } else { print ( letter + "o" + letter ); } } while (! word. equals (" quit " ));
Rövarspråket Metoden isvowel() static boolean isvowel ( char letter ) { return letter == a letter == e letter == i letter == o letter == u letter == y letter == å letter == ä letter == ö ; }
Punktnotation class Prog { static String text = " ABCDEF "; } public static void main ( String [] args ) { String text = " 123456 "; System. out. println ( text. charat (5)); System. out. println ( Prog. text. charat (5)); }
I vilken ordning sker det? Evalueringsordning class Prog { static int square ( int a) { return a*a; } static int average ( int a, int b) { return (a+b )/2; } public static void main ( String [] args ) { println ( square (5*4-15)* average (8+2, 2*2)) } }
Evalueringsordning println(square(5*4-15)*average(8+2, 2*2)); println(square(20-15)*average(8+2, 2*2)); println(square(5)*average(8+2, 2*2)); println(25*average(8+2, 2*2)); println(25*average(10, 2*2)); println(25*average(10, 4)); println(25*7); println(175);
Evalueringsordning foo(3*2+3).substring(0, 6).substring(2, 3*(5+3)/6) foo(6+3).substring(0, 6).substring(2, 3*(5+3)/6) foo(9).substring(0, 6).substring(2, 3*(5+3)/6) 012345678.substring(0, 6).substring(2, 3*(5+3)/6) 012345.substring(2, 3*(5+3)/6) 012345.substring(2, 3*8/6) 012345.substring(2, 24/6) 012345.substring(2, 4) 23
En snabbgenomgång av exempelduggan.
Förklara vad kompilator-steget gör. Vilka filer används/skapas av java-kompilatorn (javac) och vad är de olika filerna till för? (2p) a)
Rita även en översiktsbild över kompilerings-/körningsprocessen (1p). b)
Ordna följande datatyper i storleksordning, minst först. (1p) byte long int short a)
Är följande tilldelning giltig? Motivera ditt svar med hjälp av de ingående datatyperna (2p). Tilldelningen float a = 2. 0; b)
Förklara varför följande kod antagligen är felaktig (1p). (funktionen gettext() existerar och.) fel? String s = " Hej "; String t = gettext (); if (s == t) { // Gör något } c)
Skriv kod för att skapa en array (fält) av exakt 300 int. (1p) d)
Skriv kod som avrundar en float-variabel som heter a till närmaste heltal. (1p) e)
Förklara vard nyckelordet break gör generellt. Förklara även varför det nästan alltid används i switch-satser. (1p) a)
Skriv en for-loop som itererar igenom och skriver ut alla float i arrayen (fältet) som heter values. (2p) b)
Förklara tydligt vad ett block är och hur det används (1p). c)
Förklara vad main-metoden är och hur den används (1p). d)
Förklara begreppet överlagring och ge ett praktiskt kodexempel (1p). a)
Måste alla funktioner innehålla satsen return? red ut begreppen och förklara kort och koncist i vilka fall det gäller / inte gäller. (2p) b)
Förklara tydligt de olika delarna i funktionshuvudet (3p). c)
Ett riktigt program Ett betydligt större exempel än vad ni sett tidigare, men gärna ett koncept ni känner igen. Den enda önskningen på områden att repetera har varit tvådimensionella fält, så jag har valt exempel efter det. Alla gillar spel.
En tom spelplan med rutor. Spelarna turas om att sätta ut X och 0 för att markera tagna rutor. Den spelare som först tar 5 rutor i rad (horizontellt, vertikalt eller diagonalt) vinner. Del av luffarschack-spel ----------- X ----------- X 0 0 ----------- X -----------
Spela ett snabbparti luffarschack. Men, ingen får fylla i sina egna drag. Indexera rutorna från 0 till m kolumner och från 0 till n rader. Förklara för motspelaren vilket drag du vill göra genom att ange koordinaterna för rutan du vill ta, ex. (3, 5).
Skriva ut en spelplan till skärmen. Läsa in ett drag, läsa om ifall ogiltigt. Avgöra om ett inläst drag är giltigt. Funktionalitet Automatiskt växla mellan X och 0 under spelets gång. Antal rader/kolumner ska kunna väljas fritt utan att resten av koden påverkas. Avgöra om någon har vunnit. Tydliga textmeddelanden som instruerar användaren vad hon ska göra.
Hur representerar vi spelets data i datorn? Hur representerar vi spelets data när vi skriver ut till skärmen? Kan man återanvända och ha samma representation i de båda fallen? Vad är en bra/dålig representation?
, idé 1 En variabel per ruta: rutar0c0, rutar0c1, rutar0c2... Bra / dåligt? När datorn jobbar med data? När data ska skrivas ut? Hur väljer man vilken variabel man ska tilldela utifrån inmatade koordinater? Hur avgör man vilka rutor som ligger intill varnadra? Hur hanterar man ändrad storlek på spelplanen?
, idé 2 En enda lång textsträng innehållande X, 0, mellanslag och nyrad? Bra / dåligt? När datorn jobbar med data? När data ska skrivas ut? Nu kan vi direkt räkna ut vilken position som ska hämtas utifrån givna koordinater. Men det blir lite klutigt att lägga in nya drag. Hur avgör man vilka rutor som ligger intill varnadra? Hur hanterar man ändrad storlek på spelplanen?
, idé 3 Tvådimensionellt fält av char, innehållande X, 0, mellanslag? Bra / dåligt? När datorn jobbar med data? När data ska skrivas ut? Nu kan vi direkt räkna ut vilken position som ska hämtas utifrån givna koordinater, och ändra värdet utan problem. Hur avgör man vilka rutor som ligger intill varnadra? Hur hanterar man ändrad storlek på spelplanen?
, idé n+1 Det finns många fler sätt att representera spelplanen.
Här valdes char. För/nackdelar? Går att skriva ut som de är! av drag
2D-Arrayer På samma sätt som man kan skapa en array med en dimension (värden på rad) kan man skapa arrayer med två dimensioner (flera rader). Fungerar på precis samma sätt, men man måste använda två set av hakparenteser för att ange de två koordinaterna. Jämför med koordinaterna i luffarschack-spelet tidigare.
Spelet drivs av en sk. spel-loop. en är egentligen två loopar. Den yttre låter användaren spela spelet flera gånger. Den inre repeterar lägg-drag-funktionaliteten inom ett spel. Skissa din egen spel-loop.
Initieraing Den första delen av koden är mest till för att göra inställningar och se till att allt är i ett bra startläge. Här styrs storleken på spelplanen. Här finns även en funktion för att tömma spelplanen.
Skärmutskrift - printgame() Använder nästlade loopar för att iterera över indexen i båda dimensionerna. Bugg: Hitta den!... hur blir det med index > 10?
Läsa in drag - putmove() Hämtar ett drag från användaren (flera gånger om så behövs). Lägger draget på spelplanen. Kontrollerar om draget var ett vinnande drag.
Kontrollera om spelaren vunnit - winningmove() Utgår från den lagda brickan. Den är alltid 1 i rad. Summerar sedan den nyss lagda brickan med alla brickor av samma typ åt två motsatta håll (exempelvis uppåt och nedåt). Om summan blir 5 så har spelaren vunnit. Bygger nästan helt på funktionen countmarkers(row, column, deltarow, deltacolumn).
Räkna brickor - countmarkers() Utgår från den lagda brickan och delta, dvs förändring i x- och y-led. Om punkten p+delta är spelarens bricka så returneras 1 + antalet brickor som följer. Att låta en funktion anropa sig själv kan vara väldigt användbart. Det kallas rekursion.