Lisaxo
Lisaxo

Reputation: 11

Why is my Ruby code not executing as I expect it to?

I'm learning Ruby through the book Learn to Program by Chris Pine. In the book, there's an exercise which says:

Write a Deaf Grandma program. Whatever you say to grandma (whatever you type in), she should respond with HUH?! SPEAK UP, SONNY!, unless you shout it (type in all capitals). If you shout, she can hear you (or at least she thinks so) and yells back, NO, NOT SINCE 1938! To make your program really believable, have grandma shout a different year each time; maybe any year at random between 1930 and 1950. (This part is optional, and would be much easier if you read the section on Ruby's random number generator at the end of the methods chapter.) You can't stop talking to grandma until you shout BYE. Hint: Don't forget about chomp! 'BYE'with an Enter is not the same as 'BYE' without one! Hint 2: Try to think about what parts of your program should happen over and over again. All of those should be in your while loop.

I have written my code and it doesn't work as expected. Basically, when I input information, it follows the order in which the code was written. For example if I input "HELLO" it'll reply "HUH?! SPEAK UP, SONNY! but really it should be writing back "NO, NOT SINCE 1938!".

When I input 'BYE' nothing will come up unless I follow the order in which the code was written in (I hope that makes sense).

I have tried a lot of things, like not using the break (for the loop). I have tried to write it as one long piece of code without any ifs or else's.

Here is the code I have written:

puts 'Go speak to Grandma, she\'s in the kitchen!'
speaking = gets.chomp

if speaking == speaking.downcase 
  puts 'HUH?! SPEAK UP, SONNY!'
  gets.chomp

  while speaking == 'BYE'
  puts 'BYE! COME AGAIN SOON!'
  gets.chomp
  break
  end

else speaking == speaking.upcase
  puts 'NO, NOT SINCE 1983!' 
   gets.chomp

end

I expect when I write HELLO to get the appropriate answer of 'NO, NOT SINCE 1983!'. Also, I expect the conversation to keep going because I have used gets.chomp on all pieces of the code. Sp why is the code stopping?

Upvotes: 1

Views: 66

Answers (1)

Fabio
Fabio

Reputation: 32445

Problem in the code is that if ... else condition not wrapped within loop, so it would no be executed repeatedly.

Hint 2: Try to think about what parts of your program should happen over and over again. All of those should be in your while loop

To make loop works you need wrap all repeatable lines within loop.
In your case loop should break only when input will be BYE

puts 'Go speak to Grandma, she\'s in the kitchen!'
speaking = gets.chomp

until speaking == 'BYE'
  if speaking == speaking.upcase
      puts 'NO, NOT SINCE 1983!'
  else
      puts 'HUH?! SPEAK UP, SONNY!'
  end

  # Get input before next loop
  speaking = gets.chomp
end

puts 'BYE! COME AGAIN SOON!'

You don't need to check for downcase explicitly, only you care about is "does input contains only upper case characters"

Upvotes: 1

Related Questions