Как сделать квадрат с любым символом, используя рубиновые петли? - PullRequest
0 голосов
/ 19 мая 2019

Я не могу сделать квадрат, используя рубиновые петли. Квадрат должен быть построен с использованием любого символа и любого числа, введенного пользователем. Например, если input_number = 4 и symbol_chosen = &, то все стороны квадрата должны иметь 4 * & на каждой стороне.

Я попробовал простой метод. Я собрал два пользовательских ввода: 1. input_number и 2. symbol_chosen. Затем я создал цикл с вложенным значением symbol_chosen * input_number. Я знаю, что этот код не даст мне 4 стороны квадрата, но я не понимаю, почему я не могу даже получить одну сторону квадрата с этим кодом.

puts "Please insert a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)"
symbol = gets.chomp

puts "Please insert a number"
number = gets.chomp.to_i

loop do
    symbol*number
    break
end

Я хочу знать о любых ошибках в этом коде, которые мешают его работе. Кроме того, я хочу знать, что я должен добавить в этот код, чтобы он образовал четырехсторонний квадрат с любым символом и числом (представляющим длину), используя цикл ruby.

1 Ответ

3 голосов
/ 19 мая 2019

В вашем коде есть три проблемы:

  1. Вы вычисляете symbol*number, но ничего не делаете с результатом. Вы просто игнорируете это. Вы не храните его в переменной, не возвращаете его из блока, не распечатываете или что-либо еще.
  2. Вы сразу breaking из loop, поэтому оно будет выполнено только один раз.
  3. Вы никогда ничего не печатаете.

Есть бесконечные способы решения этой проблемы, вот один:

#!/usr/bin/env ruby

def make_square(number = 3, symbol = '*')
    return '' if number.zero?

    symbol = symbol.dup.freeze

    return symbol if number == 1

    solid_line = (symbol * number)
    middle_line = (symbol + ' ' * (number - 2) + symbol)
    middle_lines = ([middle_line] * (number - 2))

    return [
      solid_line,
      *middle_lines,
      solid_line
    ].join("\n").freeze
end

def print_square(number = 3, symbol = '*')
    puts make_square(number, symbol)
end

def ask_input
    return ask_number, ask_symbol
end

def ask_number
    puts 'Please enter a number'
    read_number
end

def ask_symbol
    puts 'Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)'
    read_symbol
end

def read_number
    Integer(gets).tap do |number|
    raise ArgumentError, "`number` must be non-negative but is #{number}" if number.negative?
    end
end

def read_symbol
    gets.chomp.tap do |symbol|
    raise ArgumentError, "`symbol` must be a single character" if symbol.size > 1
    raise ArgumentError, "`symbol` must be printable and visible" unless /\p{Graph}/ =~ symbol
    end.freeze
end

def main
    number, symbol = ask_input

    puts 'This is the square:'
    puts
    print_square(number, symbol)
end

main

# $ print_square.rb
# Please enter a number
# 0
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# 
#####
# $ print_square.rb
# Please enter a number
# 1
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# █
#####
# $ print_square.rb
# Please enter a number
# 2
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# ██
# ██
#####
# $ print_square.rb
# Please enter a number
# 3
# Please enter a symbol (eg. #, @, $, %, ^, &, *, _, -, +, =)
# █
# This is the square:
# ███
# █ █
# ███
#####
# $ print_square.rb
# Please enter a number
# -1
# ./print_square.rb:41:in `block in read_number': `number` must be non-negative but is -1 (ArgumentError)
#   from ./test.rb:40:in `tap'
#   from ./test.rb:40:in `read_number'
#   from ./test.rb:31:in `ask_number'
#   from ./test.rb:26:in `ask_input'
#   from ./test.rb:53:in `main'
#   from ./test.rb:60:in `<main>'
#####

Это может выглядеть как перебор, но, разделив различные подзадачи, подзадачи и т. Д. На разные методы, мы можем легко протестировать каждую подзадачу в отдельности и отследить ошибку до определенной точки. в нашем коде. Например, если мы подозреваем, что в нашем методе чтения чисел есть ошибка, мы можем вызвать только один этот метод и проверить его результат, вместо того чтобы выполнять всю программу печати квадрата. И наоборот, если мы подозреваем, что в построении нашего квадрата есть ошибка, мы можем просто вызвать метод make_square с разными аргументами без необходимости вводить символ и число снова и снова, например, как это:

8.times(&method(:print_square))
# 
# *
# **
# **
# ***
# * *
# ***
# ****
# *  *
# *  *
# ****
# *****
# *   *
# *   *
# *   *
# *****
# ******
# *    *
# *    *
# *    *
# *    *
# ******
# *******
# *     *
# *     *
# *     *
# *     *
# *     *
# *******
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...