Download presentation
Presentation is loading. Please wait.
Published byQuentin Bradford Modified over 9 years ago
2
1 Karel – Chapter 5 Conditionally Executing Instructions Note: Original slides provided by www.apComputerScience.com and modified for Mr. Smith’s AP Computer Science A classwww.apComputerScience.com
3
2 CH5 – Conditional Statements Version 1: if ( ) { } For now: these are method invocations (see next slide) Boolean expressions return true or false
4
3 if statement if ( ) { … } frontIsClear() nextToABeeper() nextToARobot() facingNorth() facingSouth() facingEast() facingWest() anyBeepersInBeeperBag() Robot “predicates” either true or false Let’s check the API to see our options
5
4 Robot Class public class Robot extends UrRobot { public boolean frontIsClear() {…} public boolean nextToABeeper() {…} public boolean nextToARobot() {…} etc… } Now I have a brain! again, you don’t write this class
6
5 Examples from a client program if ( karel.frontIsClear() ) { karel.move(); // no danger of hitting wall } if ( karel.anyBeepersInBeeperBag() ) { karel.putBeeper();// no danger of error } The client has to refer to the object it is acting on
7
6 Examples from an object class if ( frontIsClear() ) { move(); // no danger of hitting wall } if (anyBeepersInBeeperBag() ) { putBeeper();// no danger of error }
8
7 Extending Robot public class SmartBot extends Robot { public boolean beeperIsToLeft() {…} public boolean twoBeepersOrMoreOnCorner() {…} public void faceEast() {…} } Draw the Inheritance Hierarchy
9
8 Creating a boolean method public boolean methodName() { // other instructions could go here if ( ) { return true; } return false; } The method must return either true or false Returns true and ends the method Returns false and ends the method
10
9 public boolean beeperIsToLeft() { turnLeft(); move(); if ( nextToABeeper() ) { turnLeft(); turnLeft(); move(); turnLeft(); return true; } turnLeft(); turnLeft(); move(); turnLeft(); return false; } MUST put world back in initial situation that it was in BEFORE the method was invoked
11
10 SmartBot Create a SmartBot class that extends Robot You write these methods: beeperIsToLeft() ( see previous slide) beeperIsToRight() (this method will return true if at least one beeper is on corner right of robot) twoBeepersOrMoreOnCorner() (this method will return true if at least two beepers are on corner) Note: you may have to nest if statements – look at page 118 in Karel textbook faceEast(), faceNorth(), faceSouth(), faceWest() (these methods will force the robot to turn in the indicated direction) Note: Look at page 112 in Karel textbook Also use the SmartBotTester to test SmartBot and these new methods. You should download and use the world file named smartbotWorld.txt.
12
11 SmartBot rubric TaskAbove StandardStandardBelow Standard beeperIsToLeft() Returns true if at least one beeper is on a corner left of where the robot is facing. Returns false otherwise. Named correctly Returns true or false correctly in all situations Has no side effects Named differently but the name makes sense (-3 pts) Returns true or false correctly in most situations (-5 pts) May have a side effect (-5 pts) Named incorrectly and name does not make sense (-5 pts) Does not return true or false correctly in most situations (-10 pts) Has side effects (-5 pts) twoBeepersOrMoreOnCorner() Returns true if there are at least two beepers on the corner where the robot is standing. Returns false otherwise. Named correctly Returns true or false correctly in all situations Has no side effects Written optimally Named differently but the name makes sense (-3 pts) Returns true or false correctly in most situations (-5 pts) May have a side effect (-5 pts) May not be written optimally, but works (-3 pts) Named incorrectly and name does not make sense (-5 pts) Does not return true or false correctly in most situations (-10 pts) Has side effects (-5 pts) Not written optimally (-5 pts) faceNorth(),faceSouth(), faceEast(), faceWest() Makes the robot face in the specified direction Named correctly Makes the robot face correctly in all situations Has no side effects Named differently but the name makes sense (-3 pts) Makes the robot face correctly in most situations (-5 pts) May have a side effect (-5 pts) Named incorrectly and name does not make sense (-5 pts) Does not make the robot face correctly in most situations (-10 pts) Has side effects (-5 pts) beeperOnLeftAndRight() Returns true if at least one beeper is on a corner to left AND at least one beeper in on corner to right of where the robot is facing. Returns false otherwise. Named correctly Returns true or false correctly in all situations Has no side effects Named differently but the name makes sense (-3 pts) Returns true or false correctly in most situations (-5 pts) May have a side effect (-5 pts) Named incorrectly and name does not make sense (-5 pts) Does not return true or false correctly in most situations (-10 pts) Has side effects (-5 pts) SmartBot turned in on timeSmartBot turned in on assigned date SmartBot turned in late (-8 pts per day late)
13
12 Paying Attention? For the last several slides, we’ve been using a new robot class. By now you’ve probably figured out that our Inheritance Structure looks like this: UrRobot Robot SmartBot What annoying thing (should have) happened to you while coding the last few examples? Yep, you wrote (or wanted to) turnAround() and maybe even turnRight() AGAIN! ANNOYING! Solution(s)? BetterRobot
14
13 What if there is only one statement in the THEN clause? if ( frontIsClear()) { move(); } is the same as ….. if ( frontIsClear()) move(); if ( frontIsClear()) { move(); turnLeft(); } is NOT the same as ….. if ( frontIsClear()) move(); turnLeft();
15
14 Nested IF (IF statement inside an IF statement) if ( frontIsClear()) { move(); if ( nextToABeeper()) { pickBeeper(); } }
16
15 public boolean exactlyOneBeeperOnCorner() { if (nextToABeeper()) { pickBeeper(); if (nextToABeeper()) { putBeeper(); return false; } putBeeper(); return true; } return false; }
17
16 0 Beepers 1 Beeper 2 Beepers public boolean exactlyOneBeeperOnCorner() { if (nextToABeeper()) { pickBeeper(); if (nextToABeeper()) { putBeeper(); return false; } putBeeper(); return true; } return false; } Check the lines of code that would execute for each scenario
18
17 0 Beepers 1 Beeper 2 Beepers public boolean exactlyOneBeeperOnCorner() { if (nextToABeeper()) { pickBeeper(); if (nextToABeeper()) { putBeeper(); return false; } putBeeper(); return true; } return false; } Check the lines of code that would execute for each scenario
19
18 Boolean Operators Java uses same boolean operators as C++ ( &&, ||, !) && means AND || means OR ! means NOT Example: if (! frontIsClear() || facingSouth()) { turnLeft(); } move();
20
19 if (frontIsClear() && nextToABeeper()) frontIsClear() nextToABeeper()true truefalse falsetruefalse if (frontIsClear() || nextToABeeper()) frontIsClear() nextToABeeper()true truefalse falsetruefalse result true false result true false
21
20 IF - ELSE Version 2: if ( ) { } else { }
22
21 IF - ELSE Example: if ( beeperIsToLeft() ) { turnLeft(); move(); pickBeeper(); } else { move(); }
23
22 Practice Using && and || Write this method which could be put in SmartBot /* returns true if there is at least one beeper on both sides of bot, false otherwise */ public boolean beeperOnLeftAndRight() { }
24
23 Create a single followWallRight() method to handle each of these situations. Hint: Before coding, look at the four situations and see what is the same and different for each. Start with the initial situation for each robot. How could you use an if statement to determine if they are in a specific situation? This can be done with an if statement that includes nested if statements. Initial Situation End Situation Look at ex. 9 in the book (pages 132-133)
25
24 IF – ELSE Simplifications simplify: if ( frontIsClear() ) { return true; } else { return false; }
26
25 IF – ELSE Simplifications simplify: if ( frontIsClear() ) { return true; } else { return false; } One option: if ( frontIsClear() ) { return true; } return false; Or even better: return frontIsClear();
27
26 Simplify if ( ! leftIsBlocked() ) { return true; } else { return false; }
28
27 Possible Simplifications if ( ! leftIsBlocked() ) { return true; } else { return false; } One option: if ( leftIsBlocked() ) { return false; } return true; Or even better: return ! leftIsBlocked();
29
28 Simplify – bottom factoring if ( facingSouth() ) { turnLeft(); move(); } else { turnRight(); move(); } if ( facingSouth() ) { turnLeft(); } else { turnRight(); } move(); move();move();move();
30
29 Simplify – top factoring if ( beeperOnLeft() ) { move(); turnLeft(); } else { move(); turnRight(); }
31
30 Top factoring does not work here if ( beeperOnLeft() ) { move(); turnLeft(); } else { move(); turnRight(); } move(); if ( beeperOnLeft() ) { turnLeft(); } else { turnRight(); } Moves to new corner before checking for beeper
32
31 However, top factoring does work here if ( nextToABeeper() ) { turnLeft(); pickBeeper(); } else { turnLeft(); move(); } turnLeft(); if (nextToABeeper() ) { pickBeeper(); } else { move(); } turnLeft() does not affect whether robot is next to a beeper turnLeft();
33
32 Being redundant again and again and again ha ha if ( facingNorth() ) { move(); pickTwoBeepers(); if (facingNorth()) { turnLeft(); } This if statement is redundant
34
33 Here is better code (unless one of the instructions can cause a change in direction) if ( facingNorth() ) { move(); pickTwoBeepers(); if (facingNorth()) { turnLeft(); } if ( facingNorth() ) { move(); pickTwoBeepers(); turnLeft(); }
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.