プログラミング入門 - Rubyを使って - 6. 制御構造 の 練習問題解答例

http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=06

練習問題1

"99本のビールが壁に..." 遠足などでよく歌われる古典的な童謡の歌詞、"99 Bottles of Beer on the Wall" を出力するプログラムを書いてみましょう。

# http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=06
# example 1

i = 99
bottle = 'Bottles'

while i > 0
	puts i.to_s + ' ' + bottle + ' of beer on the wall'
	puts i.to_s + ' ' + bottle + ' of beer'
	puts 'Take one down and pass it around'
	i = i - 1
	if i > 1
		bottle = 'Bottles'
	else
		bottle = 'Bottle'
	end
	puts i.to_s + ' ' + bottle + ' of beer on the wall'
	puts
end

練習問題2

耳の遠いおばあちゃんのプログラムを書いてみましょう。おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り (つまり、全部大文字でタイプしない限り)、は?! もっと大きな声で話しておくれ、坊や!と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて (少なくとも聞いた気がして)、いやー、1938年以来ないねー!と大声で返事をします。プログラムにちょっと真実味 を持たせるため、 1930年から1950年のランダムな数字で毎回違う年を叫ぶようにしましょう。あなたはBYEと叫ぶまでおばあちゃんとの会話から逃れられません。

# http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=06
# example 2

talk = ''
while (talk != 'BYE')
	if (talk == talk.upcase and talk != '')
		puts 'いやー、' + (1930 + rand(21)).to_s + '年以来ないねー!'
	else
		puts 'は?! もっと大きな声で話しておくれ、坊や! '
	end
	talk = gets.chomp
end
puts 'また来ておくれ、坊や! '

練習問題3

上で作った、「耳の遠いおばあちゃんのプログラム」を拡張しましょう。おばあちゃんはあなたに行って欲しくないのです。あなたがBYEと叫んでもおばあちゃんは聞こえないふりをします。 BYEを3回連続で 叫ばないといけないように変更してみてください。 BYEと3回叫んでも連続していない限り、おばあちゃんとの会話は続くようになっているかプログラムをテストして確認してみましょう。

# http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=06
# example 3

talk = ''
bye = 0
while (bye < 3)
	if (talk == talk.upcase and talk != '')
		puts 'いやー、' + (1930 + rand(21)).to_s + '年以来ないねー!'
	else
		puts 'は?! もっと大きな声で話しておくれ、坊や! '
	end
	talk = gets.chomp
	if talk == 'BYE'
		bye = bye + 1
	else
		bye = 0
	end
end
puts 'また来ておくれ、坊や! '

練習問題4

うるう年。 開始の年と終わりの年を聞いて、その間にあるすべてのうるう年を (もし開始や終了の年がうるう年だったらそれも含めて)表示するプログラムを書きましょう。うるう年は(1984年とか2004年のように)4で割り切れる数の年です。ただし、100で割り切れる年はうるう年ではなくて (たとえば1800年や1900年)、さらに、それは 400で割り切れない限り です。(つまり、1600年や2000年はうるう年です。)

# http://www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=06
# example 4
year = startyear
flag = 0 # フラグ立てないとだめなのかなぁ?

puts '訊ねた年の間にあるうるう年を表示します。'
puts '開始の年を入力してください。'
startyear = gets.chomp.to_i
puts '終わりの年を入力してください。'
endyear = gets.chomp.to_i

while year <= endyear
	if year % 400 == 0 # 400で割り切れると必ずうるう年になる
		flag = 1
	else
		if year % 100 != 0 # 100で割り切れるとうるう年じゃない
			if year % 4 == 0 # 4で割り切れ100で割り切れないとうるう年
				flag = 1
			else
				flag = 0
			end
		else
			flag = 0
		end
	end
	if flag == 1
		puts year.to_s + '年はうるう年です。'
	end
	year = year + 1
end