我是编程新手,想了解如何处理这个问题。
我有一个包含10个数学问题的文件,但似乎无法弄清楚如何用每个问题的答案替换下划线。
1. 1 + 3 = __
2. 2 + 2 = __
3. 0 + 9 = __
4. 3 + 4 = __
5. 5 + 2 = __
6. 2 + 5 = __
7. 6 + 4 = __
8. 7 + 1 = __
9. 9 + 9 = __
10. 10 + -1 = __
我可以打开文本文件并从中读取,但似乎无法找到添加它们的方法,并使用正确的答案删除下划线。
这是从文件中读取的代码。
File.open("math1.txt", 'r+') do |file|
file.each_line do |line|
puts line
end
end
答案 0 :(得分:1)
你必须以某种方式从行中提取操作数和运算符。我使用regular expression:
re = /([-]?\d+) ([-+*\/]) ([-]?\d+)/
([-]?\d+)
是第一个捕获组
[-]?
匹配文字字符-
零次或一次\d+
匹配一个数字(0-9)一次或多次([-+*\/])
是第二个捕获组
[-+*\/]
匹配字符-
,+
,*
或/
(必须转义)([-]?\d+)
是第3个捕获组,与第1个相同使用match
的示例:
re.match("1. 1 + 3 = __") #=> #<MatchData "1 + 3" 1:"1" 2:"+" 3:"3">
re.match("7. 6 + 4 = __") #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
re.match("10. 10 + -1") #=> #<MatchData "10 + -1" 1:"10" 2:"+" 3:"-1">
可以从MatchData
:
m = re.match("7. 6 + 4 = __") #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
m[1] #=> "6"
m[2] #=> "+"
m[3] #=> "4"
它们也会在special global variables $1
,$2
和$3
中存储(从左到右):
re.match("7. 6 + 4 = __") #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
$1 #=> "6"
$2 #=> "+"
$3 #=> "4"
请注意,这些仍然是字符串。我们必须通过to_i
将它们转换为整数才能对它们执行操作:
$1.to_i #=> 6
$3.to_i #=> 4
$1.to_i + $3.to_i #=> 10
但我已对+
进行了硬编码。要使方法调用为动态,我们必须使用send
:
6.send("+", 4) #=> 10
$1.to_i.send($2, $3.to_i) #=> 10
最后,我们必须将__
替换为我们的结果。这可以通过sub
:
"7. 6 + 4 = __".sub("__", "10")
#=> "7. 6 + 4 = 10"
就是这样。现在,您必须将这些步骤合并到循环中。
答案 1 :(得分:1)
这将是一个简单的解决方案
out = File.open("out.txt",'w+')
File.open("math1.txt", 'r+') do |file|
file.each_line do |line|
calc = eval(line.split(".")[1].split("=")[0])
out.write(line.sub('__',calc.to_s))
end
end