2017-05-03 6 views
0

L'exercice dans le premier chapitre du Vol 1 de L'art de la programmation par ordinateur de Donald Knuth - A à faire avec les moyennes des étapes restantes en utilisant l'algorithme gcd d'Euclid. Mon code renvoie le GCD parfaitement et a été testé pour le faire. Je ne peux pas l'obtenir pour retourner les étapes restantes et mon deuxième test marqué échec test avec un commentaire dans le code ne parvient pas à obtenir les étapes restantes correctes, et retournera seulement 1 pour gcdRemainerSteps sur le gcdTestObject.Test d'un compteur pour un exercice d'introduction à TAOCP Knuth

require 'minitest/autorun' 


class GCDTest < Minitest::Test 
    def test_euclid_gcd 
    gcdTestObject=GCD.new(20,5) 
    assert gcdTestObject.euclidGcd==5 
     assert gcdTestObject.gcdRemainderSteps==1 

    end 

    def test_euclid_two 
     gcdTestObject=GCD.new(13,8) 
     assert gcdTestObject.euclidGcd==1 
    #Failing TEST Passes on 1 not on 5 
    assert gcdTestObject.gcdRemainderSteps==5 
    end 
end 



class GCD 
    attr_accessor :m,:n 
    def initialize(m,n) 
     @m=m 
     @n=n 
    end 

    def euclidGcd 
     r= @m % @n 
     until r==0 
      @[email protected] 
      @n=r 
      r= @m % @n 
     end 
     return @n 
    end 

    def gcdRemainderSteps 
     [email protected] % @n 
     counter=1 
     until r==0 
      counter+=1 
      @[email protected] 
      @n=r 
      [email protected] % @n 

     end 
     return counter 
    end 
end 

Un deuxième morceau de code que je l'ai écrit pour tester le comptage dans un programme jusqu'à ce que fonctionne splendidement Il a passé tous les tests parfaitement.

Et cela renvoie le compteur à 100 comme prévu et le test sont dans le vert.

#until_loop_test.rb 
require 'minitest/autorun' 


class Until_test < Minitest::Test 

    def test_till_100_steps 
     myUntilTestObject=UntilTester.new 

     assert myUntilTestObject.untilLoopCount==100 

    end 
end 


class UntilTester 

    def untilLoopCount 
     x=0 
     counter=0 
     until x==100 
      x+=1 
      counter+=1 
     end 
     return counter 
    end 
end 

Répondre

1

Peut-être que les méthodes de GCD ne devraient pas modifier ses membres. gcdRemainderSteps() est appelée uniquement après que euclidGcd() a modifié les variables de membre.

J'ai fait ce changement, et le test passe:

def euclidGcd 
    m = @m 
    n = @n 
    r = m % n 
    until r==0 
     m = n 
     n = r 
     r = m % n 
    end 
    return n 
end 

résultats des tests:

# Running: 

.. 

Finished in 0.001809s, 1105.5202 runs/s, 2211.0405 assertions/s. 

2 runs, 4 assertions, 0 failures, 0 errors, 0 skips 
+0

Merci J'utilisais les variables d'instance. Et euclidGcd a détruit l'intégrité des variables d'instance. Je réinitialise les variables d'instance à de nouveaux noms et le test est passé. Merci pour votre aide monsieur! –

+0

De rien. Vous devriez utiliser le lien "ajouter un commentaire" ci-dessous ma réponse au lieu d'utiliser le "réponse" vide. Sinon, le site présente votre commentaire comme une réponse alternative aux autres visiteurs. - Jim U il y a 9 mins –