#!/usr/bin/env python3 """ Correction (partielle) de l'examen du 17/10/2024. Voir cours, exercices et annales pour la partie packaging. """ __author__ = "Yannick Copin " __version__ = "Wed Oct 16 17:08:43 2024" import sys def pgcd(a, b): """ Calcule le PGCD de deux entiers positifs par l'algorithme (original) d'Euclide. >>> pgcd(756, 306) 18 """ while a != b: if a > b: a -= b else: b -= a return a def ppcm(a, b): """ Calcule le PPCM de deux entiers positifs. >>> ppcm(756, 306) 12852 """ return a*b // pgcd(a, b) # Division euclidienne → int def lire2entiers(): """ Lit 2 entiers positifs sur la ligne de commande. Exceptions: * IOError si la ligne de commande ne contient pas (au moins) deux arguments (seuls les deux premiers sont utilisés), * TypeError si (au moins) l’un des deux arguments n’est pas coercible en entier, * ValueError si (au moins) l’un des deux entiers n’est pas strictement positif. """ # print(f"{sys.argv=}") if len(sys.argv[1:]) < 2: raise IOError( f"Pas assez d'arguments sur la ligne de commande ({len(sys.argv[1:])}). " ) else: try: a = int(sys.argv[1]) b = int(sys.argv[2]) except ValueError: raise TypeError( f"Les arguments {sys.argv[1:3]} ne sont pas coercibles en entier." ) if a <= 0 or b <= 0: raise ValueError(f"Les arguments {a=}, {b=} ne sont pas > 0.") return a, b def entree_pgcd(): """ Point d'entrée pour le programme pgcd. Devrait être placé dans __main__.py. """ a, b = lire2entiers() print(pgcd(a, b)) def entree_ppcm(): """ Point d'entrée pour le programme ppcm. Devrait être placé dans __main__.py. """ a, b = lire2entiers() print(ppcm(a, b)) if __name__ == '__main__': a, b = 756, 306 print(f"PGCD({a=}, {b=}) = {pgcd(a, b)}") print(f"PPCM({a=}, {b=}) = {ppcm(a, b)}") # Tests ====================================================================== """ Ces tests sont illustratifs de ce qui est attendu. Ils ne devraient pas être inclus dans le module euclide.py, mais dans un fichier propre. """ import pytest def test_pgcd(): assert pgcd(756, 306) == pgcd(306, 756) == 18 def test_ppcm(): assert ppcm(756, 306) == ppcm(306, 756) == 12852 def test_lire2entiers(monkeypatch): # Force command-line input monkeypatch.setattr(sys, 'argv', ["test", "756", "306"]) assert lire2entiers() == (756, 306) # Use forced input def test_lire2entiers_arg(monkeypatch): "IOError si nb insuffisant d'arguments sur la ligne de commande." with pytest.raises(IOError): monkeypatch.setattr(sys, 'argv', ["test", "756"]) lire2entiers() def test_lire2entiers_int(monkeypatch): "TypeError si arguments non-coercibles en entier." with pytest.raises(TypeError): monkeypatch.setattr(sys, 'argv', ["test", "756", "toto"]) lire2entiers() def test_lire2entiers_pos(monkeypatch): "ValueError si arguments non entiers positifs." with pytest.raises(ValueError): monkeypatch.setattr(sys, 'argv', ["test", "756", "-306"]) lire2entiers()