1月1日,2018第一天。练习编程基础。1月3日上午继续。

运行clone的.rb档案。用ruby name.rb


1.输入,处理,输出。 

print "请输入你的"名字",然后按 Enter: "
your_name = gets
puts "hi,#{your_name}"

解释: 

  • print 输出变量在荧屏,不会换行
  • puts 输出变量但会换行。
  • gets 可以从键盘拿到输入的值。得到的是字符串string
  • #{} 在string中插入date.
  • =   是assignment operator 
  • ".."名字".."  告诉程序这个是嵌套的双引号。

3,4. 基本运算

解释:

  • to_i 转换为整数。才能进行运算。还有to_f,to_s
  • float浮点数floating point,四舍五入round,无条件进制ceil, 无条件舍弃floor(文档api https://ruby-doc.org/core-2.4.1/Float.html)
  • integer整数
  • array and Hash
  • string
  • 运算符, % 馀数:整除,返回剩余数。
 

5.6.7.8 控制流程。

 variable = case 条件

when 条件 //只能比较是否绝对相等 ===

end 

原文:case operates by comparing the target (the expression after the keyword case) with each of the comparison expressions after the when keywords. This test is done using comparison === target.    http://ruby-doc.com/docs/ProgrammingRuby/


if 条件

..

elsif  //you can have zero or more elsif clauses and an optional else clause.

..

elsif

..

else

 ..

end 

9.10 方法Method (也叫function)

def method(parameter)

    ... 

    return...

end 

定义Method的时候,默认最后的一行值自动返回,如果是if 。。end语法,⚠️  需要加return

11-15 Loop 

i = 1
while ( i <= 100 )
    if i%7 == 0
        puts i
          end
      i+=1
end

//在while中 ,如果遇到break则中断♻️循环。 

rand(100)  //在100内选一个随机数。 

猜数字游戏:程序会先产生随机数,然后用户开始猜数字。程序会针对猜的数字回答太高、太低或猜中,猜中后程序就会终止。

target = rand(100)
while (true)
  print "请猜一个 0~99 的数字 N,然后按 Enter: "
  n = gets
  if n.to_i < target
    puts "低了,再猜一次"
  elsif n.to_i > target
    puts "太高了,再猜一次"
  else
    puts "恭喜猜中啦! "
    break
  end
end

16-22 Array 

https://ruby-doc.org/core-2.4.1/Array.html#method-i-each 

  • 一个有顺序的容器,用数字当作索引。
  • 索引从 0 开始
  • 原则上里面的元素,数据类型最好都是一样的,例如都存整数,或是都存字符串。
  • array可以嵌套。

array.size 会回传数组长度

array[1] = 999 会更改第二的元素的值

array[99999] 读取一个不存在的值,会回传 nil

array[0] 或 array.first 是数组的第一个元素

array[-1] 或 array.last 是数组的最后一个元素

array.push(999) 或 array << 999 会新增一个元素 999 到数组的最后面

array.unshift(999) 会新增一个元素 999 到数组的最前面

array.delete_at(i) 会删除索引值在 i 的元素

array.sort  return a new array created by sorting self.按顺序排列值。

 

array.uniq  return a new array by removing duplicate values in self.

更多 Ruby 的 Array 方法请参考 Ruby Array API

array = [
[1,2,3],
[4,5,6],
[7,8,9]
]
array[0][0] # 这是 1
array[0][1] # 这是 2

split和join.

str = "ABCDEFG"
str[0] # 得到 "A"
str[1] = "x"
str # 变成 "AxCDEFG"
str.split("") # 用 "" 拆开字符串,得到数组 ["A", "B", "C", "D", "E", "F", "G"]
["x", "y", "z"].join(" ") # 用 " " 串接成字符串,得到 "x y z"

如何走访数组:

用 for 方法 

for i in array

    puts i 

end 

在ruby中习惯用用each

题目 16 (费了30分钟原来原理很简单)

给定一阵列内含数字,输出最大值. 

解决办法:遍历一遍数组,让较大值去和后续的值比较,并更新较大值,直到遍历结束。api有自带的method(max()) 

def find_max(array)
  m = array[0]
  array.each do |i|
    if m <= i              //反过来 就是求最小值 m>=i
      m = i
    end
  end
  return m
end
# 直接用max也行。
arr = [8, 12, 36, 93, 9, 75]
max = find_max(arr)
puts "Max is #{max}" 

20题

20-sortin.rb
# 承上题,请排序并去除重复的数字 # Hint: 可用 arr.sort 排序,和 arr.uniq 去除重复 
def filter_even(arr) 
 even_arr = [] 
 arr.each do |n|
 if n % 2 == 0 
 even_arr.push(n) 
 end 
 end 
 return even_arr.uniq.sort 
end 
arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1] 
puts filter_even(arr).to_s # 应该是 [42, 46, 68, 86]

21 选择排序法selection sort:简单直观的排序算法。 https://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕.

def selection_sort(arr)

  temp = 0
  i = 0
  l = arr.size - 1  //⚠️  注意1前面要有 空格 ,否则会报告❌。
  while i<l
    min = i
    j = i + 1
    while j < arr.size
      if arr[min] > arr[j]
        min = j
      end
      j += 1
    end
    temp = arr[i]
    arr[i] = arr[min]
    arr[min] = temp

    i += 1
//我的理解:temp是一块数据,把arr[min]的数据复制给temp,然后把arr[i]的数据复制给arr[min],现在arr[min]内是新的数据了,最后在把temp内的数据复制给arr[i],这样arr[i]有了原先arr[min]的数据,相当于arr[min]和arr[i]互换里数据。
  end
  return arr
end
arr =  [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]
answer = selection_sort(arr)
puts answer.to_s 
  # 双循环:外面的循环,是按顺序从前向后依次提取值,直到倒数第二个结束。
  # 嵌套的循环,是让外循环提取的值和后续的值进行对比。
  # 所以两个循环的次数都是n-1. 代码 i < arr.size - 1 等同于 j < arr.size

题目 22 

给定一阵列内含数字,请输出 0~9 中不见的数字。例如 arr = [2,2,1,5,8,4],输出 [0,3,6,7,9]

Api里面有 内置的method 减法 “-”   ary - other_ary → new_ary

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]

w 我的做法:双♻️。

def find_missing(arr)
  contrast = [0,1,2,3,4,5,6,7,8,9]
  result = []
  c = 0
  while c < contrast.size       //遍历一遍contrast.
    a = 0
    while a < arr.size             //用嵌套♻️,arr的所有的值依次和contrast传入的值进行对比,如果相同则退                                            //出♻️,如果循环后发现没有相同的,则arr_have是false.
      arr_have = false
      if contrast[c] == arr[a]
        arr_have = true
        break
      end
      a += 1
    end
    if arr_have == false       //如果是false,则把上面contrast传入的值,赋予新数组result.
      result << contrast[c]
    end
    c += 1
  end
  return result
end
answer = find_missing( [2,2,1,5,8,4] )
puts answer.to_s # 应该是 [0,3,6,7,9]


⚠️ :如果使用each ..end语法,可以自动遍历所有值,无需手动设置了。 但要⚠️ 变量作用域的问题。having_arr应该放到第一个循环内开始:
def find_missing(arr)
  contrast = [0,1,2,3,4,5,6,7,8,9]
  result = []
  contrast.each do |c|
    arr_have = false
    
    arr.each do |a|
      if contrast[c] == arr[a]  // ❌的写法,因为arr.each {| item | block } -> arr, 

  // 修改为 c == a

        arr_have = true
        break
      end
    end
    if arr_have == false
      result << c
    end
  end
  return result
end

 附加:arr.each {| item | block } -> arr

Calls block once for each element in arr, passing that element as a parameter.

a = [ "a", "b", "c" ]
a.each {|x| print x, " -- " }
produces:
a -- b -- c --

 如想输出key而不是value,可以用 arr.each_index { |anIndex| block } -> arr

a = [ "a", "b", "c" ]
a.each_index {|x| print x, " -- " }
produces:
0 -- 1 -- 2 --
原文地址:https://www.cnblogs.com/chentianwei/p/8166373.html