3.13.2. Activity 2: Running Simplified Magpie Code¶
The College Board activity asks you to enter input using the Scanner
class and record the responses. But, instead you can run this simplified version below and just call the getResponse
method with each string as input as shown in the main
method below.
In this lab, the main method creates a Magpie object called maggie, and calls its methods maggie.getGreeting() and maggie.getResponse(input) where the input can be one of the following strings as input and a response is printed out.
My mother and I talked last night.
I said no!
The weather is nice.
Do you know my brother?
Run the following code and see the responses to these 4 inputs.
Run to see the results. Try changing the input in main.
When different methods are called from the main method, the control flows to these methods and then comes back to main exactly where it was left when the methods finish. Click on the cool Java visualizer Chatbot below to step through the code. Click on the Forward button at the bottom of the code to step through the code to see the flow of control from the main method to the other methods and back.
You can also run a version of the Magpie lab on JuiceMind or replit that uses the Scanner class for input so that you can type in your own input to interact with it.
As you can see the getResponse
method of Magpie2 looks for certain keywords like "mother"
and "brother"
. Why do you think the response to “Do you know my brother?” isn’t “Tell me more about your family.”? Discuss this with partner in pairs and see if you can figure it out.
The response to “The weather is nice.” is one of the random responses. Look at the code to see how the if
statement assigns a value to the response and returns that response.
The method getRandomResponse
generates a random number and uses that to assign the response. Modify the code above to add other random responses.
3.13.2.1. Exercises¶
Alter the code above or in your own IDE (see section below) to do the following. We encourage you to work in pairs.
Have it respond “Tell me more about your pets” when the statement contains the word “dog” or “cat”. For example, a possible statement and response would be:
Statement: I like my cat Mittens.
Response: Tell me more about your pets.
Have it respond favorably when it sees the name of your teacher. Be sure to use appropriate pronouns! For example, a possible statement and response would be:
Statement: Mr. Finkelstein is telling us about robotics.
Response: He sounds like a good teacher.
Have the code check that the statement has at least one character. You can do this by using the
trim
method to remove spaces from the beginning and end, and then checking the length of the trimmed string. If there are no characters, the response should tell the user to enter something. For example, a possible statement and response would be:Statement:
Response: Say something, please.
Add two more noncommittal responses to the possible random responses.
Pick three more keywords, such as “no” and “brother” and edit the
getResponse
method to respond to each of these.What happens when more than one keyword appears in a string? Try the input
My **mother** has a **dog** but **no** cat.
Which response did you get – was it the one about family or the one about pets or the negative one for no? Change the order of your if-else-if statements to make it so that one of the other responses is selected and try running it again.
lab-1b-3: What happens when a keyword is included in another word? Consider statements like “I know all the state capitals” which contains no and “I like vegetables smothered in cheese” which contains mother. Explain the problem with the responses to these statements.
3.13.2.2. Activity 2: Actual Code - (Optional)¶
You can do all of Activity 2 with the actual code using the Scanner class for input instead if you prefer. The Scanner
class is not on the AP CSA exam. You can use JuiceMind or replit online.
Or you can copy and paste in the code from below into any Integrated Development Environment (IDE) like DrJava or JGrasp to run on your computer.
Here is the code for MagpieRunner2.java.
1import java.util.Scanner;
2
3/**
4 * A simple class to run the Magpie class.
5 *
6 * @author Laurie White
7 * @version April 2012
8 */
9public class MagpieRunner2
10{
11
12 /** Create a Magpie, give it user input, and print its replies. */
13 public static void main(String[] args)
14 {
15 Magpie2 maggie = new Magpie2();
16
17 System.out.println(maggie.getGreeting());
18 Scanner in = new Scanner(System.in);
19 String statement = in.nextLine();
20
21 while (!statement.equals("Bye"))
22 {
23 System.out.println(maggie.getResponse(statement));
24 statement = in.nextLine();
25 }
26 }
27}
Here is the code for Magpie2.java.
1public class Magpie2
2{
3 /**
4 * Get a default greeting
5 *
6 * @return a greeting
7 */
8 public String getGreeting()
9 {
10 return "Hello, let's talk.";
11 }
12
13 /**
14 * Gives a response to a user statement
15 *
16 * @param statement the user statement
17 * @return a response based on the rules given
18 */
19 public String getResponse(String statement)
20 {
21 String response = "";
22 if (statement.indexOf("no") >= 0)
23 {
24 response = "Why so negative?";
25 } else if (statement.indexOf("mother") >= 0
26 || statement.indexOf("father") >= 0
27 || statement.indexOf("sister") >= 0
28 || statement.indexOf("brother") >= 0)
29 {
30 response = "Tell me more about your family.";
31 }
32 else
33 {
34 response = getRandomResponse();
35 }
36 return response;
37 }
38
39 /**
40 * Pick a default response to use if nothing else fits.
41 *
42 * @return a non-committal string
43 */
44 private String getRandomResponse()
45 {
46 final int NUMBER_OF_RESPONSES = 4;
47 double r = Math.random();
48 int whichResponse = (int) (r * NUMBER_OF_RESPONSES);
49 String response = "";
50
51 if (whichResponse == 0)
52 {
53 response = "Interesting, tell me more.";
54 }
55 else if (whichResponse == 1)
56 {
57 response = "Hmmm.";
58 }
59 else if (whichResponse == 2)
60 {
61 response = "Do you really think so?";
62 }
63 else if (whichResponse == 3)
64 {
65 response = "You don't say.";
66 }
67
68 return response;
69 }
70}