2014-09-02 2 views
0

Я совершенно новый и для программирования, и для этого форума. Сегодня я написал свой самый первый сценарий, и он работает до сих пор:Ruby Десятичные фракции

def deltay(y2, y1) 
    #puts "Delta y=#{y2 - y1}" 
    y2 - y1 
end 

def deltax(x2, x1) 
    #puts "Delta x=#{x2- x1}" 
    x2-x1 
end 

def m(vardeltay, vardeltax) 
    #puts "m=#{vardeltay/vardeltax}" 
    vardeltay/vardeltax 
end 

def n(gradient, varx, vary) 
vary-gradient*varx 
end 

#activate the lines 21-25, when n is given. 
#puts "Welcome to my linear function script. Please start with telling me your n:" 

#print "> " ; n=STDIN.gets.to_i 

#puts "So your n is #{n}." 


puts "The first thing I need is your m.Please input your y2 then press RETURN and enter your y1:" 
print "> " ; vary2=STDIN.gets.to_i ; vary1=STDIN.gets.to_i ; deltay(vary2, vary1) 

puts "Now, please input your x2 then press RETURN and enter your x1:" 
print "> " ; varx2=STDIN.gets.to_i ; varx1=STDIN.gets.to_i ; deltax(varx2, varx1) 

puts "\n" 

puts "Your m equals #{m(deltay(vary2, vary1), deltax(varx2, varx1))}" 

varm=m(deltay(vary2, vary1), deltax(varx2, varx1)) 

puts "So, now we need n. Your current equalation looks like this:y=#{varm}m+n" 
puts "Lets insert your point, you gave me earlier : P(#{varx2}, #{vary2})" 
puts "So, that is:" 
puts "#{vary2}=#{varm*varx2}+n \nNow we going to perform |-#{varm*varx2}. And that equals #{n(varm, varx2, vary2)}" ; n=n(varm, varx2, vary2) #{#{vary2-(varm*varx2)}=n" ; n=vary2-(varm*varx2)} 

puts "So this is our equation so far:" 
puts "f(x)=#{varm}x+#{n}" 

puts "Now let's get to y, okay? So I need a value for x:" 
print "> " ; varx=STDIN.gets.to_i ; puts "y=#{varm*varx+n}" 

Проблема заключается в том, если я ввожу отрицательные целые числа (-1)/десятичные дроби (1,2) для y2, y1, x2 или x1 , он не будет работать правильно. Может быть, мой вопрос действительно глуп, но я не нашел ничего, помогающего моей проблеме в сети.

+0

Добро пожаловать в StackOverflow! Пожалуйста, определите, почему этот код работает неправильно. Предоставьте свой ввод, желаемый результат и * неверный * вывод, чтобы лучше понять ваши потребности. В противном случае вопрос будет закрыт как нечеткий или как вне темы. –

+0

Определить «не будет работать правильно». –

+0

Я думал, что прояснил ситуацию. Ну например, когда вы даете ему y2 = 1,2; или y2 = -3. Даже если только одно целое имеет «,» или отрицательно, скрипт не будет работать: [http://puu.sh/biFO9/8ea61c593f.png] Кроме того, я просто заметил, что он не будет работать, когда (x2-x1) > (у2-у1). @Define «не будет работать правильно». Ну, m будет вычисляться ложно, и, следовательно, все выравнивание ошибочно. – Kaiton

ответ

2

Похоже, что есть по крайней мере две проблемы в вашем коде:

  1. Вы разборе чисел с помощью to_i. Этот метод возвращает только целые числа («целое число»), и любая дробная часть обрезается. Вместо этого вы можете использовать to_f. (Или to_d, если вы решите использовать BigDecimal вместо чисел с плавающей запятой)
  2. Похоже, что вы вводите десятичные числа, используя запятую (,) в качестве десятичного разделителя. Вместо этого вы должны использовать точку (.).

PS: Это поможет вам немного убрать код. Смешение вычислений и интерполяции строк делает понимание кода излишне жестким. То же самое для ввода нескольких операторов в одной строке ...

Например, это трудно читать, особенно если у вас нет смарт-подсветка синтаксиса:

puts "Your m equals #{m(deltay(vary2, vary1), deltax(varx2, varx1))}" 

Это лучше:

value_of_m = m(deltay(vary2, vary1), deltax(varx2, varx1)) 
puts "Your m equals #{value_of_m}" 
+0

Спасибо, много, сделал работу. Да, я согласен, это довольно неопрятно, поскольку я сделал это в спешке. Я сделал это, когда вернусь домой, и я получил, как один час, прежде чем мне пришлось снова идти. Также язык изначально является немецким. Я просто не участвую в «смешении вычислений и строчных итерациях», что вы действительно имеете в виду, можете ли вы привести пример, пожалуйста? – Kaiton

+0

Добавлен пример –

Смежные вопросы