Programmering hh.se/db2004 Föreläsning 2: SuperKarel, Nedbrytning & Styrsatser Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Center for Research on Embedded Systems IDE-sektionen
Att utvidga klasser Man definierar en ny klass public class BeeperPickingKarel extends Karel { klassdefinitionens kropp Vad är det man säger? Här säger klassheadern att BeeperPickingKarel är en utvidgning av standardklassen Karel som importeras från stanford.karel-biblioteket.
Att utvidga klasser Man definierar en ny klass public class BeeperPickingKarel extends Karel { klassdefinitionens kropp Vad är det man menar? Den nya klassen (här BeeperPickingKarel) bygger på allt som den befintliga klassen (här Karel) erbjuder.
Förvirring När en klass definieras med utvidgning kallas den nya klassen för en subklass av moderklassen. I vårt exempel, är BeeperPickingKarel en subklass av Karel. På motsvarande sätt kallas Karel för en superklass till BeeperPickingKarel. En subklass utvidgar sin superklass och kan då lägga till ny funktionalitet till den
Förvirring När en klass definieras med utvidgning kallas den nya klassen för en subklass av moderklassen. I vårt exempel, är BeeperPickingKarel en subklass av Karel. På motsvarande sätt kallas Karel för en superklass till BeeperPickingKarel. En subklass utvidgar sin superklass och kan då lägga till ny funktionalitet till den
Nya metoder Nya beteenden hos objekt introduceras genom att definiera nya metoder Exempel public class SomeTaskKarel extends Karel{ public void run(){ /* Uppdraget! */ private void turnright(){ turnleft();turnleft();turnleft(); private void turnaround(){ turnleft();turnleft();
En förbättrad Karel Metoderna är användbara! Vi vill att många klasser skall kunna använda turnright() och turnaround(). Vi skulle vilja lägga till de i Karel! Men! Vi har inte tillgång till klassen Karel! Lösning! Även om vi hade det, vi bör inte ändra i den efterssom det är många andra som använder Karel och vi kan då förstöra deras program! Definiera en ny klass som erbjuder dessa metoder och som alla andra klasser kan ärva från!
En förbättrad Karel Metoderna är användbara! Vi vill att många klasser skall kunna använda turnright() och turnaround(). Vi skulle vilja lägga till de i Karel! Men! Vi har inte tillgång till klassen Karel! Lösning! Även om vi hade det, vi bör inte ändra i den efterssom det är många andra som använder Karel och vi kan då förstöra deras program! Definiera en ny klass som erbjuder dessa metoder och som alla andra klasser kan ärva från!
En förbättrad Karel Metoderna är användbara! Vi vill att många klasser skall kunna använda turnright() och turnaround(). Vi skulle vilja lägga till de i Karel! Men! Vi har inte tillgång till klassen Karel! Lösning! Även om vi hade det, vi bör inte ändra i den efterssom det är många andra som använder Karel och vi kan då förstöra deras program! Definiera en ny klass som erbjuder dessa metoder och som alla andra klasser kan ärva från!
En förbättrad Karel Metoderna är användbara! Vi vill att många klasser skall kunna använda turnright() och turnaround(). Vi skulle vilja lägga till de i Karel! Men! Vi har inte tillgång till klassen Karel! Lösning! Även om vi hade det, vi bör inte ändra i den efterssom det är många andra som använder Karel och vi kan då förstöra deras program! Definiera en ny klass som erbjuder dessa metoder och som alla andra klasser kan ärva från!
En förbättrad Karel Metoderna är användbara! Vi vill att många klasser skall kunna använda turnright() och turnaround(). Vi skulle vilja lägga till de i Karel! Men! Vi har inte tillgång till klassen Karel! Lösning! Även om vi hade det, vi bör inte ändra i den efterssom det är många andra som använder Karel och vi kan då förstöra deras program! Definiera en ny klass som erbjuder dessa metoder och som alla andra klasser kan ärva från!
En förbättrad Karel /* * The NewImprovedKarel class extends the basic Karel * class so that any subclasses have access to the * turnright and turnaround methods. It does not define * any run method of its own. */ import stanford.karel.*; public class NewImprovedKarel extends Karel { public void turnright() { turnleft();turnleft();turnleft(); public void turnaround() {turnleft();turnleft();
SuperKarel stanford.karel Paketet innehåller redan en klass SuperKarel som erbjuder detta och lite till! Så i fortsättningen kommer vi att utvidga SuperKarel i våra program. Förvirring Karel är en superklass av SuperKarel!
SuperKarel stanford.karel Paketet innehåller redan en klass SuperKarel som erbjuder detta och lite till! Så i fortsättningen kommer vi att utvidga SuperKarel i våra program. Förvirring Karel är en superklass av SuperKarel!
Mera exempel Karel lagar en väg Hur kan man tänka? Till exempel: 1 Flytta till gropen. 2 Fyll gropen genom att lämna en beeper där. 3 Flytta till nästa korsningen. Som programfragment public void run() { move(); fillpothole(); move();
Mera exempel Karel lagar en väg Hur kan man tänka? Till exempel: 1 Flytta till gropen. 2 Fyll gropen genom att lämna en beeper där. 3 Flytta till nästa korsningen. Som programfragment public void run() { move(); fillpothole(); move();
Mera exempel Karel lagar en väg Hur kan man tänka? Till exempel: 1 Flytta till gropen. 2 Fyll gropen genom att lämna en beeper där. 3 Flytta till nästa korsningen. Som programfragment public void run() { move(); fillpothole(); move();
Mera exempel Karel lagar en väg Hur kan man tänka? Till exempel: 1 Flytta till gropen. 2 Fyll gropen genom att lämna en beeper där. 3 Flytta till nästa korsningen. Som programfragment public void run() { move(); fillpothole(); move();
Mera exempel Karel lagar en väg Hur kan man tänka? Till exempel: 1 Flytta till gropen. 2 Fyll gropen genom att lämna en beeper där. 3 Flytta till nästa korsningen. Som programfragment public void run() { move(); fillpothole(); move();
Mera exempel Karel lagar en väg Eller: 1 Klättra ner från hyllan. 2 Lämna en beeper. 3 Klättra upp till hyllan. Som programfragment public void run() { climbdown(); putbeeper(); climbup();
Mera exempel Karel lagar en väg Eller: 1 Klättra ner från hyllan. 2 Lämna en beeper. 3 Klättra upp till hyllan. Som programfragment public void run() { climbdown(); putbeeper(); climbup();
Mera exempel Karel lagar en väg Eller: 1 Klättra ner från hyllan. 2 Lämna en beeper. 3 Klättra upp till hyllan. Som programfragment public void run() { climbdown(); putbeeper(); climbup();
Mera exempel Karel lagar en väg Eller: 1 Klättra ner från hyllan. 2 Lämna en beeper. 3 Klättra upp till hyllan. Som programfragment public void run() { climbdown(); putbeeper(); climbup();
Mera exempel Karel lagar en väg Eller: 1 Klättra ner från hyllan. 2 Lämna en beeper. 3 Klättra upp till hyllan. Som programfragment public void run() { climbdown(); putbeeper(); climbup();
Nedbrytning Vi säger att vi bryter ner problemet i mindre problem som kan också brytas ner till enklare problem... tills vi kommer till problem som kan lösas med enkla kommandon. Det brukar kallas för stepwise refinment (stegviss förfining). I nästa steg definierar man de metoder som inte är baskommandon. Vad skall man tänka på? Varje delproblem bör utföra en begreppsmässig enkel uppgift. Ett gott tecken på om Du har lyckats med att hitta en rimlig uppgift kommer från det namn Du ger din metod. Varje delproblem bör utföra en uppgift som är så allmän som möjligt så att den kan användas i flera sammanhang.
Nedbrytning Vi säger att vi bryter ner problemet i mindre problem som kan också brytas ner till enklare problem... tills vi kommer till problem som kan lösas med enkla kommandon. Det brukar kallas för stepwise refinment (stegviss förfining). I nästa steg definierar man de metoder som inte är baskommandon. Vad skall man tänka på? Varje delproblem bör utföra en begreppsmässig enkel uppgift. Ett gott tecken på om Du har lyckats med att hitta en rimlig uppgift kommer från det namn Du ger din metod. Varje delproblem bör utföra en uppgift som är så allmän som möjligt så att den kan användas i flera sammanhang.
Nedbrytning Vi säger att vi bryter ner problemet i mindre problem som kan också brytas ner till enklare problem... tills vi kommer till problem som kan lösas med enkla kommandon. Det brukar kallas för stepwise refinment (stegviss förfining). I nästa steg definierar man de metoder som inte är baskommandon. Vad skall man tänka på? Varje delproblem bör utföra en begreppsmässig enkel uppgift. Ett gott tecken på om Du har lyckats med att hitta en rimlig uppgift kommer från det namn Du ger din metod. Varje delproblem bör utföra en uppgift som är så allmän som möjligt så att den kan användas i flera sammanhang.
Nedbrytning Vi säger att vi bryter ner problemet i mindre problem som kan också brytas ner till enklare problem... tills vi kommer till problem som kan lösas med enkla kommandon. Det brukar kallas för stepwise refinment (stegviss förfining). I nästa steg definierar man de metoder som inte är baskommandon. Vad skall man tänka på? Varje delproblem bör utföra en begreppsmässig enkel uppgift. Ett gott tecken på om Du har lyckats med att hitta en rimlig uppgift kommer från det namn Du ger din metod. Varje delproblem bör utföra en uppgift som är så allmän som möjligt så att den kan användas i flera sammanhang.
Nedbrytning Vi säger att vi bryter ner problemet i mindre problem som kan också brytas ner till enklare problem... tills vi kommer till problem som kan lösas med enkla kommandon. Det brukar kallas för stepwise refinment (stegviss förfining). I nästa steg definierar man de metoder som inte är baskommandon. Vad skall man tänka på? Varje delproblem bör utföra en begreppsmässig enkel uppgift. Ett gott tecken på om Du har lyckats med att hitta en rimlig uppgift kommer från det namn Du ger din metod. Varje delproblem bör utföra en uppgift som är så allmän som möjligt så att den kan användas i flera sammanhang.
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak ett antal gånger. turnright for-loop turnleft(); turnleft(); turnleft(); by Andy Wahrol for(int i = 0; i < 3 ; i++){ turnleft();
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak ett antal gånger. turnright for-loop turnleft(); turnleft(); turnleft(); by Andy Wahrol for(int i = 0; i < 3 ; i++){ turnleft();
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak ett antal gånger. turnright for-loop turnleft(); turnleft(); turnleft(); by Andy Wahrol for(int i = 0; i < 3 ; i++){ turnleft();
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak medan ett villkor gäller gettonextwall move();move();... så längre det inte finns några murar while-loop while ( frontisclear() ){ move();
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak medan ett villkor gäller gettonextwall move();move();... så längre det inte finns några murar while-loop while ( frontisclear() ){ move();
Nya delar av Karel-språket Upprepningar Man kan vilja instruera Karel att göra samma sak medan ett villkor gäller gettonextwall move();move();... så längre det inte finns några murar while-loop while ( frontisclear() ){ move();
Vilka villkor kan Karel testa? Karel kan känna av omgivningen Mer generella program Karel går runt ett varv i en värld av godtycklig storlek!
Vilka villkor kan Karel testa? Karel kan känna av omgivningen Mer generella program Karel går runt ett varv i en värld av godtycklig storlek!
Algoritmer och kodning Karel skall dubblera antalet beepers i en hög Karel finns intill en hög med beepers och skall dubblera antalet beepers i högen. Karel har gränslös med beepers i säcken. Algoritmen Karel kan inte räkna! Men han skulle kunna lägga ner 2 beepers för varje beeper han plockar. Han kommer att behöva bygga en extra hög och flytta den. Kodfragment private void doublebeepersinpile(){ while(beeperspresent()){ put2beepersnextdoor(); movebackpilenextdoor();
Algoritmer och kodning Karel skall dubblera antalet beepers i en hög Karel finns intill en hög med beepers och skall dubblera antalet beepers i högen. Karel har gränslös med beepers i säcken. Algoritmen Karel kan inte räkna! Men han skulle kunna lägga ner 2 beepers för varje beeper han plockar. Han kommer att behöva bygga en extra hög och flytta den. Kodfragment private void doublebeepersinpile(){ while(beeperspresent()){ put2beepersnextdoor(); movebackpilenextdoor();
Algoritmer och kodning Karel skall dubblera antalet beepers i en hög Karel finns intill en hög med beepers och skall dubblera antalet beepers i högen. Karel har gränslös med beepers i säcken. Algoritmen Karel kan inte räkna! Men han skulle kunna lägga ner 2 beepers för varje beeper han plockar. Han kommer att behöva bygga en extra hög och flytta den. Kodfragment private void doublebeepersinpile(){ while(beeperspresent()){ put2beepersnextdoor(); movebackpilenextdoor();
Mera kodfragment private void put2beepersnextdoor(){ pickbeeper(); move(); putbeeper(); putbeeper(); moveback(); Om koden För klasser och metoder och styrsatser, skriver man kroppen lite indragen i texten så att man kan lätt se strukturen. Kommentarer är viktiga. Ett sätt att kommentera metod definitioner är att beskriva vad de skall åstadkomma men även pre- och post- conditions.
Mera kodfragment private void put2beepersnextdoor(){ pickbeeper(); move(); putbeeper(); putbeeper(); moveback(); Om koden För klasser och metoder och styrsatser, skriver man kroppen lite indragen i texten så att man kan lätt se strukturen. Kommentarer är viktiga. Ett sätt att kommentera metod definitioner är att beskriva vad de skall åstadkomma men även pre- och post- conditions.
Mera kodfragment private void put2beepersnextdoor(){ pickbeeper(); move(); putbeeper(); putbeeper(); moveback(); Om koden För klasser och metoder och styrsatser, skriver man kroppen lite indragen i texten så att man kan lätt se strukturen. Kommentarer är viktiga. Ett sätt att kommentera metod definitioner är att beskriva vad de skall åstadkomma men även pre- och post- conditions.
Mera kodfragment private void put2beepersnextdoor(){ pickbeeper(); move(); putbeeper(); putbeeper(); moveback(); Om koden För klasser och metoder och styrsatser, skriver man kroppen lite indragen i texten så att man kan lätt se strukturen. Kommentarer är viktiga. Ett sätt att kommentera metod definitioner är att beskriva vad de skall åstadkomma men även pre- och post- conditions.
Om koden /* * Precondition: Karel står på en korsning * där det finns minst en beeper. * * Postcondition: Karel står på samma korsning * tittar åt samma håll och det finns en beeper mindre * och det finns 2 beepers mer i korsningen intill. */ private void put2beepersnextdoor(){ pickbeeper(); move(); putbeeper(); putbeeper(); moveback();
Några vanliga fel Infinite loops I vissa tillstånd kan while(frontisclear()){ turnleft(); leda till en oändlig beteende. Det är inte så ovanlig att man skriver while-loopar som i visa situationer inte kommer närmare att villkoret skall sluta gälla!
Några vanliga fel Off-by-one-bug (OBOB) Det är inte så ovanligt heller att man glömmer speciella fall antigen i början av en loop eller i slutet. Till exempel, om Karel skall fylla alla korsningar med en beeper, så är while (frontisclear()){ putbeeper(); move(); while (frontisclear()){ putbeeper(); move(); putbeeper(); inte tillräcklig!
Några vanliga fel Off-by-one-bug (OBOB) Det är inte så ovanligt heller att man glömmer speciella fall antigen i början av en loop eller i slutet. Till exempel, om Karel skall fylla alla korsningar med en beeper, så är while (frontisclear()){ putbeeper(); move(); inte tillräcklig! while (frontisclear()){ putbeeper(); move(); putbeeper();
Några vanliga fel Off-by-one-bug (OBOB) Det är inte så ovanligt heller att man glömmer speciella fall antigen i början av en loop eller i slutet. Till exempel, om Karel skall fylla alla korsningar med en beeper, så är while (frontisclear()){ putbeeper(); move(); inte tillräcklig! while (frontisclear()){ putbeeper(); move(); putbeeper();
Ytterliggare en styrsats Man kan välja att utföra något bara om ett vilkor gäller. removebeeper pickbeeper() om det finns en beeper! if if ( beeperpresent() ) { pickbeeper();
Ytterliggare en styrsats Man kan välja att utföra något bara om ett vilkor gäller. removebeeper pickbeeper() om det finns en beeper! if if ( beeperpresent() ) { pickbeeper();
Ytterliggare en styrsats Man kan välja att utföra något bara om ett vilkor gäller. removebeeper pickbeeper() om det finns en beeper! if if ( beeperpresent() ) { pickbeeper();
Ytterliggare en styrsats Man kan även välja mellan 2 alternativa beteenden beroende på om villkoret gäller eller ej. if-else if ( beeperpresent() ) { pickbeeper(); else { putbeeper();
Ytterliggare en styrsats Man kan även välja mellan 2 alternativa beteenden beroende på om villkoret gäller eller ej. if-else if ( beeperpresent() ) { pickbeeper(); else { putbeeper();
Ytterliggare ett exempel Karel springer 100 meter häck.