diff --git a/01-hello.rb b/01-hello.rb index e0e7bbf..586a8f1 100644 --- a/01-hello.rb +++ b/01-hello.rb @@ -5,4 +5,4 @@ # ... -puts "(请替换成最后的答案)" \ No newline at end of file +puts "hello, " + your_name diff --git a/02-variable.rb b/02-variable.rb index a5a4753..2821710 100644 --- a/02-variable.rb +++ b/02-variable.rb @@ -8,6 +8,5 @@ # ... -puts "a 应该是 2,现在是 #{a}" -puts "b 应该是 1,现在是 #{b}" - +puts "a 应该是 2,现在是 #{b}" +puts "b 应该是 1,现在是 #{a}" diff --git a/03-triangle.rb b/03-triangle.rb index fafec03..e136a56 100644 --- a/03-triangle.rb +++ b/03-triangle.rb @@ -8,4 +8,4 @@ # ..... -puts "直角三角形的面积是: _________" \ No newline at end of file +puts "直角三角形的面积是: #{ a.to_f*b.to_f/2 }" diff --git a/04-pizzas.rb b/04-pizzas.rb index 4c2521f..09c95a5 100644 --- a/04-pizzas.rb +++ b/04-pizzas.rb @@ -1,12 +1,12 @@ # 题目: 输入有多少片比萨饼和多少人,输出每人可以分到几片,以及剩下几片 print "请输入有多少片比萨饼,然后按 Enter: " -pizzas = gets +pizzas = gets.to_i print "请输入有多少人要吃,然后按 Enter: " -people = gets +people = gets.to_i # ..... -puts "每人可分得几片: _________ 片" -puts "还剩下几片: _________ 片" \ No newline at end of file +puts "每人可分得几片: #{(pizzas / people).ceil} 片" +puts "还剩下几片: #{ pizzas % people } 片" diff --git a/05-bmi.rb b/05-bmi.rb index 67efdff..94424e4 100644 --- a/05-bmi.rb +++ b/05-bmi.rb @@ -5,13 +5,25 @@ # 如果 BMI 介于 18.5 ~ 24,显示正常 print "请输入您的体重(公斤),然后按 Enter: " -weight = gets +weight = gets.to_f print "请输入您的身高(厘米),然后按 Enter: " -height = gets +height = gets.to_f / 100 # ..... -puts "您的 BMI 是: _________" +bmi = (weight / (height * height)) +bmis = bmi.to_s +bmi_rounddown = bmis[0, bmis.index('.')+2+1].to_f -puts "您的 BMI 结果是: _________(过轻或正常或过重)" \ No newline at end of file +if bmi < 18.5 + result = "过轻" +elsif bmi >= 24 + result = "过重" +else + result = "正常" +end + +puts "您的 BMI 是: #{bmi_rounddown}" + +puts "您的 BMI 结果是: #{result}" diff --git a/06-interger-positive.rb b/06-interger-positive.rb index a240f5f..4f89d48 100644 --- a/06-interger-positive.rb +++ b/06-interger-positive.rb @@ -2,9 +2,16 @@ print "请输入一个整数,然后按 Enter: " -x = gets +x = gets.to_i -# .... +result = "零" +if x > 0 + result = "正数" +elsif x < 0 + result = "负数" +end -puts "这个数是_____ (正数或零或负数)" -puts "这个数是_____ (偶数或奇数)" \ No newline at end of file +odd = (x % 2 == 0 ? "偶数" : "奇数") + +puts "这个数是 #{result} (正数或零或负数)" +puts "这个数是 #{odd} (偶数或奇数)" diff --git a/07-abcde.rb b/07-abcde.rb index 5d0c8c3..7553f0d 100644 --- a/07-abcde.rb +++ b/07-abcde.rb @@ -9,14 +9,30 @@ # 当 z < 0 输出 "E" print "请输入一个整数x,然后按 Enter: " -x = gets +x = gets.to_i print "请输入一个整数y,然后按 Enter: " -y = gets +y = gets.to_i print "请输入一个整数z,然后按 Enter: " -z = gets +z = gets.to_i # .... -puts "结果是________(A或B或C或D或E)" \ No newline at end of file +if x < 0 + result = "A" +elsif y > 0 + if z > 0 + result = "B" + elsif z < 0 + result = "C" + end +elsif y < 0 + if z > 0 + result = "D" + elsif z < 0 + result = "E" + end +end + +puts "结果是#{result}" diff --git a/08-find-max.rb b/08-find-max.rb index 9e6e643..ed117af 100644 --- a/08-find-max.rb +++ b/08-find-max.rb @@ -1,14 +1,17 @@ # 题目: 使用者输入 x,y,z,请输出三个数中最大的数 print "请输入一个数字x,然后按 Enter: " -x = gets +x = gets.to_i print "请输入一个数字y,然后按 Enter: " -y = gets +y = gets.to_i print "请输入一个数字z,然后按 Enter: " -z = gets +z = gets.to_i # .... -puts "最大的数是 ________(x或y或z)" \ No newline at end of file +result = x > y ? x : y +result = result > z ? result : z + +puts "最大的数是 #{result}" diff --git a/09-function.rb b/09-function.rb index b1f922d..70aa9e9 100644 --- a/09-function.rb +++ b/09-function.rb @@ -1,15 +1,15 @@ # 题目: 输入直角三角形的宽和高,输出三角形的面积 def calculate_area(a, b) - # .... + a * b / 2 end print "请输入直角三角形的高,然后按 Enter: " -a = gets +a = gets.to_f print "请输入直角三角形的底边,然后按 Enter: " -b = gets +b = gets.to_f answer = calculate_area(a,b) -puts "直角三角形的面积是: #{answer}" \ No newline at end of file +puts "直角三角形的面积是: #{answer}" diff --git a/10-function.rb b/10-function.rb index bb450fb..f1a04e5 100644 --- a/10-function.rb +++ b/10-function.rb @@ -1,19 +1,21 @@ # 题目: 使用者输入 x,y,z,请输出三个数中最大的数 def find_max(x, y, z) + result = x > y ? x : y + return result > z ? result : z end print "请输入一个数字x,然后按 Enter: " -x = gets +x = gets.to_f print "请输入一个数字y,然后按 Enter: " -y = gets +y = gets.to_f print "请输入一个数字z,然后按 Enter: " -z = gets +z = gets.to_f # .... answer = find_max(x,y,z) -puts "最大的数是 #{answer}" \ No newline at end of file +puts "最大的数是 #{answer}" diff --git a/11-seven.rb b/11-seven.rb index 26c221d..747cef3 100644 --- a/11-seven.rb +++ b/11-seven.rb @@ -1,9 +1,8 @@ # 题目: 列出 1 到 100 之间,所有 7 的倍数 i = 1 -while ( i <= 100 ) +while i <= 100 - # .... - - i+=1 -end \ No newline at end of file + puts i if i % 7 == 0 + i += 1 +end diff --git a/12-sum-even.rb b/12-sum-even.rb index 73879bb..042b03a 100644 --- a/12-sum-even.rb +++ b/12-sum-even.rb @@ -5,9 +5,10 @@ while ( i <= 100 ) - # .... - + if (i % 2 == 0) + total += i + end i+=1 end -puts total \ No newline at end of file +puts total diff --git a/13-nn.rb b/13-nn.rb index ac0a43b..3ca3d00 100644 --- a/13-nn.rb +++ b/13-nn.rb @@ -1,11 +1,13 @@ # 题目: 输入一个数字 N,输出 N * N 乘法表 print "请输入数字 N,然后按 Enter: " -n = gets - -# while ( ... ) -# while ( ...) -# -# end -# end - +n = gets.to_i +i = 0 +while i <= n + j = 0 + while j <= n + puts "#{i} × #{j} = #{i*j}" + j = j + 1 + end + i = i + 1 +end diff --git a/14-prime.rb b/14-prime.rb index 8cf1692..a65ce29 100644 --- a/14-prime.rb +++ b/14-prime.rb @@ -1,7 +1,14 @@ # 输入一个数字 N,请检查是不是质数 def is_prime(n) -# .... + i = 2 + while i < (n/2).to_i + if n % i == 0 + return false + end + i = i + 1 + end + return true end print "请输入数字 N,然后按 Enter: " diff --git a/15-guess-number.rb b/15-guess-number.rb index 48f9dca..5b81912 100644 --- a/15-guess-number.rb +++ b/15-guess-number.rb @@ -2,16 +2,17 @@ target = rand(100) -while (true) - print "请猜一个 0~99 的数字 N,然后按 Enter: " - n = gets - - #puts "太低了,再猜一次" - #puts "太高了,再猜一次" +loop do + print '请猜一个 0~99 的数字 N,然后按 Enter: ' + n = gets.to_i + if n > target + puts '太高了,再猜一次' + elsif n < target + puts '太低了,再猜一次' + end if n.to_i == target - puts "恭喜猜中啦! " + puts '恭喜猜中啦! ' break end - -end \ No newline at end of file +end diff --git a/16-array-sum.rb b/16-array-sum.rb index 9b4910b..b48e1e7 100644 --- a/16-array-sum.rb +++ b/16-array-sum.rb @@ -1,7 +1,12 @@ # 给定一阵列内含数字,输出最大值 -def find_max(array) - #.... +def find_max(_array) + # _array.max + max = 0 + _array.each do |i| + max = i if max < i + end + max end arr = [8, 12, 36, 53, 9, 75, 3, 71, 59, 88] @@ -9,3 +14,7 @@ def find_max(array) max = find_max(arr) puts "Max is #{max}" # 应该是 88 +arr.each_with_index do |i, j| + puts i + puts j +end diff --git a/17-array-stats.rb b/17-array-stats.rb index 0af81bb..b6e5aae 100644 --- a/17-array-stats.rb +++ b/17-array-stats.rb @@ -1,9 +1,9 @@ # 使用者不断输入数字存进 Array,最后输出总和、平均、最大值、最小值 arr = [] - -while (true) - print "请输入数字,结束请直接按 Enter: " +sum = 0 +loop do + print '请输入数字,结束请直接按 Enter: ' user_input = gets if user_input == "\n" break @@ -14,7 +14,13 @@ puts arr.to_s -puts "总和是 _____" -puts "平均是 _____" -puts "最大值是 _____" -puts "最小值是 _____" \ No newline at end of file +arr.each do |i| + sum += i.to_i +end + +avr = (sum / arr.length).to_f + +puts "总和是 #{sum}" +puts "平均是 #{avr}" +puts "最大值是 #{arr.max}" +puts "最小值是 #{arr.min}" diff --git a/18-square.rb b/18-square.rb index 226e1c1..a325fe7 100644 --- a/18-square.rb +++ b/18-square.rb @@ -2,9 +2,13 @@ arr = [] -print "请输入数字 N,然后按 Enter: " +print '请输入数字 N,然后按 Enter: ' n = gets - +i = 0 # ... - -puts arr.to_s \ No newline at end of file +loop do + break if i >= n.to_i + arr.push(i * i) + i += 1 +end +puts arr.to_s diff --git a/19-filter.rb b/19-filter.rb index ef7e515..3472559 100644 --- a/19-filter.rb +++ b/19-filter.rb @@ -1,9 +1,14 @@ # 给定一阵列内含数字,输出另一个数组只包含偶数 def filter_even(arr) - #... + # ... + evens = [] + arr.each do |i| + odds.push(i) if i.even? + end + evens end -arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] +arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] -puts filter_even(arr).to_s # 应该是 [68, 42, 46, 46, 86] \ No newline at end of file +puts filter_even(arr).to_s # 应该是 [68, 42, 46, 46, 86] diff --git a/20-sorting.rb b/20-sorting.rb index 5f82c08..ee5dc69 100644 --- a/20-sorting.rb +++ b/20-sorting.rb @@ -2,10 +2,14 @@ # Hint: 可用 arr.sort 排序,和 arr.uniq 去除重复 def filter_even(arr) - #... + # ... + evens = [] + arr.each do |i| + evens.push(i) if i.even? + end + evens.sort.uniq end -arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] +arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] - -puts "________" # 应该是 [42, 46, 68, 86] \ No newline at end of file +puts filter_even(arr).to_s # 应该是 [42, 46, 68, 86] diff --git a/21-selection-sort.rb b/21-selection-sort.rb index e5e7eae..c1579b4 100644 --- a/21-selection-sort.rb +++ b/21-selection-sort.rb @@ -2,11 +2,23 @@ # https://zh.wikipedia.org/wiki/选择排序 def selection_sort(arr) - #... + min = 0 + tmp = 0 + j = 0 + for i in 0..(arr.length - 1) + min = i + for j in (i + 1)..(arr.length - 1) + min = j if arr[min] > arr[j] + end + tmp = arr[min] + arr[min] = arr[i] + arr[i] = tmp + end + arr.to_s end arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] answer = selection_sort(arr) -puts answer.to_s # 应该是 [1, 7, 9, 42, 46, 46, 68, 77, 86, 91] \ No newline at end of file +puts answer.to_s # 应该是 [1, 7, 9, 42, 46, 46, 68, 77, 86, 91] diff --git a/22-missing.rb b/22-missing.rb index 6898714..dae6b92 100644 --- a/22-missing.rb +++ b/22-missing.rb @@ -1,9 +1,13 @@ # 给定一阵列内含数字,请输出 0~9 中不见的数字 def find_missing(arr) - # ... + miss = [] + for i in 0..9 + miss.push(i) unless arr.include?(i) + end + miss end -answer = find_missing( [2,2,1,5,8,4] ) +answer = find_missing([2, 2, 1, 5, 8, 4]) puts answer.to_s # 应该是 [0,3,6,7,9] diff --git a/23-hash-max.rb b/23-hash-max.rb index 6fb227e..d145521 100644 --- a/23-hash-max.rb +++ b/23-hash-max.rb @@ -2,18 +2,19 @@ def find_max(hash) # ... + hash.each do |key, value| + return key if value == hash.values.max + end end h = { - "a" => 71, - "b" => 38, - "c" => 21, - "d" => 80, - "e" => 10 + 'a' => 71, + 'b' => 38, + 'c' => 21, + 'd' => 80, + 'e' => 10 } answer = find_max(h) puts "有最大 value 的是 #{answer}" # 应该是 d - - diff --git a/24-hash-even.rb b/24-hash-even.rb index 9da9605..ef8fd05 100644 --- a/24-hash-even.rb +++ b/24-hash-even.rb @@ -1,21 +1,22 @@ # 给定一 Hash,输出 value 是偶数的 keys def find_even_keys(hash) - + evens = [] # ... (请回传一个数组) - + hash.each do |key, value| + evens.push(key) if value.even? + end + evens end h = { - "a" => 71, - "b" => 38, - "c" => 21, - "d" => 80, - "e" => 10 + 'a' => 71, + 'b' => 38, + 'c' => 21, + 'd' => 80, + 'e' => 10 } answer = find_even_keys(h) puts "有偶数 value 的 keys 有 #{answer}" # 应该是数组 [b,d,e] - - diff --git a/25-hash-count.rb b/25-hash-count.rb index 2167335..f549de3 100644 --- a/25-hash-count.rb +++ b/25-hash-count.rb @@ -5,14 +5,18 @@ def count(arr) arr.each do |i| # ... + h[i] = if h.keys.include?(i) + h[i] + 1 + else + 1 + end end - return h # 回传一个 hash + h # 回传一个 hash end -arr = ["a", "d", "d", "c", "b", "c", "c", "c", "d", "d", "e", "e", "e", "d", "a", "c", "e", "a", "d", "e"] +arr = %w(a d d c b c c c d d e e e d a c e a d e) answer = count(arr) puts answer # 答案应该是 {"a"=>3, "d"=>6, "c"=>5, "b"=>1, "e"=>5} - diff --git a/26-hash-filter.rb b/26-hash-filter.rb index 51ade64..e2b1b42 100644 --- a/26-hash-filter.rb +++ b/26-hash-filter.rb @@ -1,20 +1,20 @@ # 给定一个数组包含 Hash,请过滤和排序 arr = [ - { "name" => "Peter", "age" => 30 }, - { "name" => "John", "age" => 15 }, - { "name" => "David", "age" => 45 }, - { "name" => "Steven", "age" => 22 }, - { "name" => "Vincent", "age" => 6 }, + { 'name' => 'Peter', 'age' => 30 }, + { 'name' => 'John', 'age' => 15 }, + { 'name' => 'David', 'age' => 45 }, + { 'name' => 'Steven', 'age' => 22 }, + { 'name' => 'Vincent', 'age' => 6 } ] -# .... +arr.delete_if { |item| item['age'] < 18 }.sort_by! { |h| h['age'] } -puts "所有成年人,并由小到大: _________" +puts "所有成年人,并由小到大: #{arr}" # 答案应该是 -#[ +# [ # { "name" => "Steven", "age" => 22 }, # { "name" => "Peter", "age" => 30 }, # { "name" => "David", "age" => 45 } -#] +# ] diff --git a/27-class.rb b/27-class.rb index 8cec2c9..2f2f27d 100644 --- a/27-class.rb +++ b/27-class.rb @@ -1,16 +1,18 @@ class Person - # ... + attr_accessor :first_name + attr_accessor :last_name + + def greet + puts "Hello, #{@first_name} #{@last_name}" + end end p1 = Person.new -p1.first_name = "Peter" -p1.last_name = "Wang" +p1.first_name = 'Peter' +p1.last_name = 'Wang' p1.greet # 输出 "Hello, Peter Wang" p2 = Person.new -p2.first_name = "William" -p2.last_name = "Zhang" +p2.first_name = 'William' +p2.last_name = 'Zhang' p2.greet # 输出 "Hello, William Zhang" - - - diff --git a/28-word-count.rb b/28-word-count.rb index 2643123..a29b415 100644 --- a/28-word-count.rb +++ b/28-word-count.rb @@ -1,5 +1,15 @@ # 请打开 wordcount.txt,计算每个单字出现的次数 -doc = File.read("wordcount.txt") +doc = File.read('wordcount.txt') +arr = (doc.delete '.,').split(' ') +count = {} +arr.each do |word| + count[word] = if count.keys.include?(word) + count[word] + 1 + else + 1 + end +end +puts count # ... diff --git a/29-todos.rb b/29-todos.rb index 0bddde2..a917d44 100644 --- a/29-todos.rb +++ b/29-todos.rb @@ -1,33 +1,55 @@ # 简易 Todo 代办事项应用 -text = File.read("todos.txt") +def readfile(filename) + todos = [] + text = File.read(filename) + text.each_line do |line| + todos << line.chomp + end + todos +end -todos = [] -text.each_line do |line| - todos << line.chomp +def print_todos(todos) + todos.each_with_index do |todo, index| + puts "#{index}: #{todo}" + end end -todos.each_with_index do |todo, index| - puts "#{index}: #{todo}" +def refresh_file(_filename) + todos = readfile('todos.txt') + print_todos(todos) end -while (true) - print "请输入指令 1. add 2. remove 3. save,然后按 Enter: " +FILE_NAME = 'todos.txt'.freeze + +loop do + refresh_file(FILE_NAME) + + print '请输入指令 1. add 2. remove 3. save,然后按 Enter: ' command = gets.chomp - if command == "add" - print "请输入代办事项: " - # ... - elsif command == "remove" - print "请输入要删除的编号: " + if command == 'add' + print '请输入代办事项: ' + new_item = gets.chomp + File.open('todos.txt', 'a') do |f| + f.puts(new_item) + end + elsif command == 'remove' + print '请输入要删除的编号: ' # ... - elsif command == "save" - puts "存盘离开" - + del_index = gets.chomp.to_i + todos = readfile('todos.txt') + File.open('todos.txt', 'w') do |f| + todos.each_with_index do |line, index| + f.puts(line) unless index == del_index + end + end + elsif command == 'save' + refresh_file(FILE_NAME) + puts '存盘离开' # ... - break; + break else - puts "看不懂,请再输入一次" + puts '看不懂,请再输入一次' end end - diff --git a/todos.txt b/todos.txt index 4757e85..d0ed9b6 100644 --- a/todos.txt +++ b/todos.txt @@ -1,4 +1,7 @@ -Buy book -Go Shopping -Walk -Gogo +first +second +third +forth +fifth +sixth +end