The_Exile

The_Exile

Not fully understanding the code in the example in "Learn to Program"

So I am not getting similar code to what Chris is when I do the examples he wants us to do, and many of the things he brings up after Chapter 6 seem to be lacking some explanation to create a full understanding so I can fully absorb the concept.

Everything in previous chapters, we would get similar looking stuff. It’s only now that we’ve gotten to branching and looping, and everything afterward that things completely fall apart for me.

Deaf Grandma

My code

puts ''
puts ''

gma = 'Grandma replies: HUH?! SPEAK UP, SONNY!'

year = ''

year_roll = rand(20)

gma_canhear = 'Grandma replies: NO, NOT SINCE ' + year + '!'

if year_roll == 0
	year = '1930'
	elsif year_roll == 1
		year = '1931'
		elsif year_roll == 2
			year = '1932'
			elsif year_roll == 3
				year = '1933'
				elsif year_roll == 4
					year = '1934'
					elsif year_roll == 5
						year = '1935'
						elsif year_roll == 6
							year = '1936'
							elsif year_roll == 7
								year =  '1937'
								elsif year_roll == 8
									year =  '1938'
									elsif year_roll == 9
										year =  '1939'
										elsif year_roll == 10
											year = '1940'
											elsif year_roll == 11
												year =  '1941'
												elsif year_roll == 12
													year = '1942'
													elsif year_roll == 13
														year = '1943'
														elsif year_roll == 14
															year = '1944'
															elsif year_roll == 15
																year = '1945'
																elsif year_roll == 16
																	year = '1946'
																	elsif year_roll == 17
																		year = '1947'
																		elsif year_roll == 18
																			year = '1948'
																			elsif year_roll == 19
																				year = '1949'
																				else year_roll == 20
																					year = '1950'																					
end

gma_canhear = 'Grandma replies: NO, NOT SINCE ' + year + '!' 
#Update gma_canhear variable with year value after the year_roll if branch.

wistg = 'a' 
# what I say to grandma = wistg | This is it's inital value before being updated. If I left it blank it 
# would cause an error. I don't know why.

while wistg != wistg.upcase
	puts 'You say to Grandma...'
	wistg = gets.chomp
	puts ''
		if wistg == wistg.upcase
			puts ''
			puts gma_canhear
			puts ''
			elsif wistg == 'BYE'
				break
				else 	puts gma
						puts ''
			end
end

puts ''
puts ''

Chris’ code

puts 'HEY THERE, SONNY! GIVE GRANDMA A KISS!'
while true
said = gets.chomp
if said == "BYE"
puts 'BYE SWEETIE!'
break
end
if said != said.upcase
puts 'HUH?! SPEAK UP, SONNY!'
else
random_year = 1930 + rand(21)
puts 'NO, NOT SINCE ' + random_year.to_s + '!'
end
end

or

puts 'HEY THERE, SONNY! GIVE GRANDMA A KISS!'
while true
said = gets.chomp
break if said == "BYE"
response = if said != said.upcase
'HUH?! SPEAK UP, SONNY!'
else
"NO, NOT SINCE #{rand(1930..1950)}!"
end
puts response
end
puts 'BYE SWEETIE!'

His code is vastly more compact. I just don’t understand how he was able to do that. I barely understand what he did.

I did what I could, with what I learned form the book up to that point and never in my wildest dreams would I have come up with anything like what he did.

===

Most Liked

AstonJ

AstonJ

Firstly, well done for writing what you did! I wouldn’t worry too much about it being different to what Chris wrote because often programmers will quite write something just to get things working, then they’ll rewrite (refactor) their code to make it better. That could be to make it shorter, or to reorganise or split it up into multiple methods to make it easier to maintain and re-use etc. The thing to note is that this is completely normal - what you end up with is often quite different to your first attempt :smiley:

Ok let’s have a look at Chris’s code:

puts 'HEY THERE, SONNY! GIVE GRANDMA A KISS!'
while true
  users_input = gets.chomp
  if users_input == "BYE"
    puts 'BYE SWEETIE!'
    break
  end
  if users_input != users_input.upcase
    puts 'HUH?! SPEAK UP, SONNY!'
  else
    random_year = 1930 + rand(21)
    puts 'NO, NOT SINCE ' + random_year.to_s + '!'
  end
end

I have changed it very slightly - I changed the name of the said variable, to users_input.

The program starts by printing “HEY THERE, SONNY! GIVE GRANDMA A KISS!” and then waits for user input with the gets.chomp command. By prefixing it with users_input = means the result of it will be bound to the users_input variable - which means you can then use/do something with the result.

Which is exactly what you do with the code below it; if users_input == "BYE" this is what you’ll use to terminate the program, so it needs to be assessed before anything else. If the user’s input is ‘BYE’ the program terminates by first saying “BYE SWEETIE!” then break.

If the user’s input isn’t “BYE” then that bit of code is ignored and the program moves on to the next bit of code: if users_input != users_input.upcase and what that’s doing is asking the computer to check whether the user’s input is in capital letters, which is what upcase is used for. The != bit means ‘does not’ so that full line of code is saying: let’s compare the user’s input to what we want it to to be - the user’s input in capitol letters, so for example if the user’s input was “please give me a kiss” and what we wanted was “PLEASE GIVE ME A KISS” then they would not be equal, making the if users_input != users_input.upcase statement true, which would then execute the code in that block, which is puts 'HUH?! SPEAK UP, SONNY!'.

The final part of the code will run if the user’s input is in capital letters, and in that case the program will first create a random year by choosing a random number from 0 to 21 with the rand(21) function and assign that year to the random_year variable, and then print “NO, NOT SINCE” along with the random_year converted to a string with the to_s method (followed by an exclamation mark).

Does that make sense? If so here’s what I recommend you do - change it! Alter the code to do something a little bit different. When you start doing that it will make even more sense!

Btw, I’ve split this into a dedicated thread as it could help someone else stuck on the same exercise :+1:

chrispine

chrispine

Author of Learn to Program

Yes, my book is geared for the beginner, and was specifically intended to be a springboard for the Pickaxe, which was already an excellent book. I was just trying to fill that gap.

And about my omission of parens in method definitions: that was the style 17 years ago when I first started working on this book. I am currently working on the 3rd Edition (I think this sentence is the first time I’ve said so publicly), and it includes parens for method definitions and most method calls (as well as numerous other changes, a totally new chapter, etc).

Margaret

Margaret

Editor at PragProg

So excited to have your new edition coming out, Chris! And thank you for being so generous with your time. I have seen how much you help your readers when they get stuck. It’s so valuable to have that kind of support when learning!

Where Next?

Popular Backend topics Top

Rainer
Is there somewhere a good introduction to rust for experienced programmers (with years of C++/C#/Java experience)? Wanted to give it a t...
New
Kurisu
Hello and happy new year! I would like to buy a Ruby On Rails ebook for learning purpose. What would be the ROR equivalent of “Programm...
New
TwistingTwists
Hello Folks, I am a novice developer from India. Intending to learn Elixir and web apps (phoenix framework). What are things that I MUS...
New
Ookma-Kyi
I am learning Elixir at the moment but am finding it difficult to learn. The issue is there aren’t any good tutorial sites out there when...
New
Fl4m3Ph03n1x
Background I am trying to up my Functional Programming (FP) skills and one of the things that newcomers first learn in FP is the Option T...
New
Fl4m3Ph03n1x
Background I am trying to encode a structure into json format using the Jason library. However, this is not working as expected. Code L...
New
Fl4m3Ph03n1x
Background So, I am playing around with a concept named “NewType” and I am taking inspiration from languages like F# and Scala. My objec...
New
harwind
I received this error for a binary search programme in C, despite the fact that it requested for inputs and produced the right output. Th...
/c
New
Patricia-Mendes13
Hi guys!! I´m studying and got a Full stack course but the course lacked a lot of support and and info to learn as it´s a course after wo...
New
Fl4m3Ph03n1x
Background As I often do, I read books to learn and improve myself. I also enjoy teaching and helping others when I can, so this is somet...
New

Other popular topics Top

Devtalk
Reading something? Working on something? Planning something? Changing jobs even!? If you’re up for sharing, please let us know what you’...
1052 22283 402
New
Rainer
My first contact with Erlang was about 2 years ago when I used RabbitMQ, which is written in Erlang, for my job. This made me curious and...
New
AstonJ
In case anyone else is wondering why Ruby 3 doesn’t show when you do asdf list-all ruby :man_facepalming: do this first: asdf plugin-upd...
New
AstonJ
Continuing the discussion from Thinking about learning Crystal, let’s discuss - I was wondering which languages don’t GC - maybe we can c...
New
PragmaticBookshelf
Author Spotlight Jamis Buck @jamis This month, we have the pleasure of spotlighting author Jamis Buck, who has written Mazes for Prog...
New
PragmaticBookshelf
Develop, deploy, and debug BEAM applications using BEAMOps: a new paradigm that focuses on scalability, fault tolerance, and owning each ...
New
sir.laksmana_wenk
I’m able to do the “artistic” part of game-development; character designing/modeling, music, environment modeling, etc. However, I don’t...
New
AstonJ
If you’re getting errors like this: psql: error: connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or directory ...
New
AstonJ
Curious what kind of results others are getting, I think actually prefer the 7B model to the 32B model, not only is it faster but the qua...
New
PragmaticBookshelf
A concise guide to MySQL 9 database administration, covering fundamental concepts, techniques, and best practices. Neil Smyth MySQL...
New