IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Programmation Python pour les scientifiques - Premiers programmes -

Cours avec exercices corrigés


précédentsommairesuivant

VIII. Corrigés des exercices

VIII-A. Valeur absolue d'un nombre, sans utiliser la fonction intégrée abs() : Solution

 
Sélectionnez
# Fonction valeur absolue 
def abs2(x) : 
    if x>=0 : 
        return x # résultat retourné lorsque x est positif 
    else : 
        return -x # résultat retourné lorsque x est négatif

L'exécution donne :

 
Sélectionnez
>>> abs2(-1) 
1 
>>> abs2(3.5) 
3.5 
>>> abs2(0) 
0

L'exécution de abs2(x) avec x de type ni int, ni float produira une erreur…

VIII-B. Calcul de factorielle, sans utiliser le module math : Solution

 
Sélectionnez
# Fonction factorielle 
def fact(x) : 
    x=int(x)
    result = 1 
    while (x>1) : 
        result=result*x 
        x=x-1 
    return result

L'exécution donne :

 
Sélectionnez
>>> fact(0) 
0 
>>> fact(3) 
6 
>>> fact(4) 
24 
>>> fact(5) 
120

fact(x) avec x négatif ou de type non int produira un résultat absurde…

VIII-C. Partie entière d'un nombre, sans utiliser le module math : Solution

 
Sélectionnez
# Fonction partie entière E() 
def E(x) : 
    if (x == int(x)) :
        return x 
    elif (x>=0) :
        return int(x) 
    else :
        return -E(-x)-1

L'exécution donne :

 
Sélectionnez
>>> E(3.14) 
3 
>>> E(-3.14) 
-4 
>>> E(0) 
0

Il est sans doute là aussi plus efficace d'utiliser la fonction floor() du module math.

VIII-D. Écriture d'un nombre en base 16 : Solution

 
Sélectionnez
a = input ('saisissez un nombre ') 
resultat = '' 
while a>0 : 
    b = a%16 
    if b < 10 : b = str(b) 
    elif b == 10 : b = 'A' 
    elif b == 11 : b = 'B' 
    elif b == 12 : b = 'C' 
    elif b == 13 : b = 'D' 
    elif b == 14 : b = 'E' 
    elif b == 15 : b = 'F' 
    resultat = b + resultat 
    a=a//16 
resultat = '0x' + resultat 
print resultat

L'exécution donne :

 
Sélectionnez
saisissez un nombre 15*16**2+16*13+9 
0xFD9

Bien entendu, on réinvente la roue à titre d'exercice, et la fonction intégrée hex() fera le boulot de manière plus efficace.

VIII-E. PGCD : algorithme d'Euclide : Solution

Preuve : tout d'abord lorsque r = 0, a est un multiple de b et donc pgcd(a,b) = b. Lorsque r > 0. Puisque
kitxmlcodeinlinelatexdvp\exists q \in\mathbb{N},\ a = qb + rfinkitxmlcodeinlinelatexdvp,

tout diviseur de b et de r est aussi diviseur de a (ainsi que de b). De même r = a − qb et donc tout diviseur de a et de b est aussi diviseur de r (ainsi que de b). Ainsi a, b et b, r ont mêmes diviseurs communs ; en particulier : pgcd(a,b) = pgcd(b,r).
L'algorithme se termine : la valeur de b est un entier naturel qui diminue strictement à chaque itération de la boucle tandis que le reste r est un entier naturel strictement inférieur à b, ainsi il y aura au plus b passages dans la boucle avant que le critère d'arrêt r = 0 ne soit satisfait. D'après ce qui précède la valeur retournée est pgcd(a,b).

Solution :

 
Sélectionnez
# Algorithme d'Euclide pour le pgcd 
def pgcd(a,b) :  
   while a%b != 0 : 
      a, b = b, a%b 
   return b

L'exécution donne :

 
Sélectionnez
>>> pgcd(120,36) 
12 
>>> pgcd(2,3) 
1

Si au départ a < b la division euclidienne de a par b aura pour reste a (et quotient 0) et après la première itération de la boucle while les valeurs de a et b auront été échangées, il est donc inutile de traiter séparément le cas a<b.

VIII-F. Écriture d'un menu

L'écriture du menu s'obtient par :

 
Sélectionnez
# Corps du programme
while True :
    print """MENU :
    1 - Calculer le PGCD de deux nombres
    2 - Calculer le PPCM de deux nombres
    3 - Déterminer si un nombre est premier
    4 - Donner la décomposition en facteur premier d'un nombre
    q - Quitter"""
    choix = raw_input("\nVotre choix :")
    # Quitter
    if (choix == 'q' or choix =='Q') :
        break


Une chaîne de caractères placée entre trois guillemets doubles """ """ permet d'inclure les sauts de ligne et les autres guillemets.


Le choix 1 appelle la fonction pgcd() déjà écrite lors de l'exercice précédent (elle doit figurer avant le corps du programme).

 
Sélectionnez
    # choix 1 : pgcd
    elif (choix == '1') :
        print "\nSaisissez 2 entiers "
        entier1 = input()
        entier2 = input()
        print "le pgcd de", entier1, "et", entier2, "est", pgcd(entier1,entier2)

Fonction pgcd() :

 
Sélectionnez
# Algorithme d'Euclide pour le pgcd 
def pgcd(a,b) :  
   while a%b != 0 : 
      a, b = b, a%b 
   return b

Le choix 2 :

 
Sélectionnez
    # choix 2 : ppcm
    elif (choix == '2') :
        print "\nSaisissez 2 entiers "
        entier1 = input()
        entier2 = input()
        print "le ppcm de", entier1, "et", entier2, "est", ppcm(entier1,entier2)

Fonction ppcm() :

 
Sélectionnez
def ppcm(a,b) :
    return (a * b) / pgcd(a,b)

à faire figurer avant le corps du programme. Elle utilise : a.b=pgcd(a, b).ppcm(a, b).

Les deux derniers choix appellent des fonctions premier() et pdecomp(), qu'il reste à écrire :

 
Sélectionnez
    elif (choix == '3') :
        entier = input("Saisissez un entier ")
        if premier(entier) :
            print entier, "est premier"
        else :
            print entier, "n'est pas premier"

    elif (choix == '4') :
        entier = input("Saisissez un entier ")
        print "La décomposition de", entier, "en premiers est", pdecomp(entier)

La fonction premier() prend en argument un entier et retourne un booléen selon si l'argument est un nombre premier ou pas. La fonction pdecomp() prend en argument un entier et retourne une chaîne de caractères donnant la décomposition en nombres premiers de l'argument.

La fonction premier() doit figurer avant le corps du programme :

 
Sélectionnez
from math import sqrt

def premier(a) :
    result = True
    n = 2
    top = sqrt(a)
    while (n <= top) :
        if a % n== 0 :
            return False
        else :
            n += 1
    return True

Elle utilise la fonction sqrt() du module math qu'il s'agit d'importer auparavant.

La fonction pdecomp() doit figurer avant le corps du programme :

 
Sélectionnez
def pdecomp(a) :
    result = ''
    n = 2
    anciena = a
    premier = True
    while (n <= a) :
    if (a % n == 0) :
        premier = False
        if result == '' :
            result = str(n)
        else :
            result = result + '.' + str(n)
        a = a / n
    else :
        n = n + 1
    if premier :
        return str(anciena)
    else :
        return result

Exemple :

 
Sélectionnez
MENU :
    1 - Calculer le PGCD de deux nombres
    2 - Calculer le PPCM de deux nombres
    3 - Déterminer si un nombre est premier
    4 - Donner la décomposition en facteur premier d'un nombre
    q - Quitter
 
Votre choix :4
Saisissez un entier 120
La décomposition de 120 en premiers est 2.2.2.3.5

On peut encore, pour améliorer le programme, gérer des exceptions lorsque l'utilisateur ne saisit pas un entier positif pour lui renvoyer un message d'erreur.

Le programme final (cliquez sur l'icône Image non disponible pour dévoiler le code) :

 
Cacher/Afficher le codeSélectionnez

MPSI1


précédentsommairesuivant

Copyright © 2014 Jean-Philippe PREAUX. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.