• 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 --
  • 相关阅读:
    使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?
    ubuntu开发机所需工具,做个记录,不断补充
    c cpp编程用到的系统边角与其拾遗
    几个递进的make file
    可以用命令行控制eclipse断点增加删除、远程调试创建与启动的插件
    Mac 从睡眠恢复后没有声音的问题
    [netty4][netty-handler]netty之idle handler处理
    《将博客搬至CSDN》
    python2与python3中__metacalss__的不同用法
    python3 type和object的关系
  • 原文地址:https://www.cnblogs.com/chentianwei/p/8166373.html
Copyright © 2020-2023  润新知