Inscription / Connexion Nouveau Sujet
Niveau première
Partager :

Python

Posté par
Vale7401
11-12-20 à 17:51

Bonjour
Je débute sur python.
J'ai fait fonctionner ce programme avec les nombres 25 et 15 j'ai trouvé 5.
Avec les nombres 48 et 32 j'ai trouvé 16.
Ce programme affiche donc le PGCD de 2 nombres.
Je ne comprends pas ce que signifie le d=1 de la 2ème ligne.

Python

Posté par
Vale7401
re : Python 11-12-20 à 17:56

Comment modifier le programme pour qu'il demande à l'utilisateur d'entrer deux entiers n et  p differents de 0 et qu'en sortie le programme python affiche la fraction irréductible.
Entrer n
Entrer p
Return (n/a) /(p/a)
Mais je ne sais pas trop programmer en python
Vous pouvez m'aider ?

Posté par
Vale7401
re : Python 11-12-20 à 17:57

Comment modifier le programme pour qu'il demande à l'utilisateur d'entrer deux entiers n et  p differents de 0 et qu'en sortie le programme python affiche la fraction irréductible.
Entrer n
Entrer p
Return (n/a) /(p/a)
Mais je ne sais pas trop programmer en python
Vous pouvez m'aider ?

Posté par
Vale7401
re : Python 11-12-20 à 18:17

Je propose pour demander à l'utilisateur d'entrer 2 nombres entiers différents de 0:
n=int(input("valeur de n ?")
p=int(input("valeur de p ?")
Juste ?

Posté par
mathafou Moderateur
re : Python 11-12-20 à 18:21

Bonjour,
Le d=1 de la deuxième ligne est une initialisation de d à n'importe quoi de différent de 0 pour pouvoir entrer dans la boucle while

sinon (sans cette ligne) soit il y aurait une erreur "d inconnu" au moment d'exécuter l'instruction while,
soit si d était initialisé par défaut (à 0) on n'exécuterait aucune boucle vu que d serait déja à 0

pour calculer la fraction irréductible égale à n/p il faut calculer le pgcd a
(donc appeler la fonction a=pg_div(n, p))
puis calculer (séparément) n/a et p/a
(Python ou pas)

pour écrire cette fraction (en texte), cette écriture se compose de trois parties distinctes

la valeur du numérateur (le résultat du calcul de n/a)
le TEXTE "/"
la valeur du dénominateur (le résultat du calcul de p/a)

ce que tu as écrit (n/a) / (p/a) va calculer la valeur (décimale) de la fraction !

Posté par
carita
re : Python 11-12-20 à 18:28

bonsoir

Je ne comprends pas ce que signifie le d=1 de la 2ème ligne.
ce programme permet la recherche de PGCD par l'algorithme des soustractions successives.
on réitère tant que l'on ne trouve pas une différence = 0

c'est pour cela que l'on initialise d à 1 (une valeur non nulle), afin de pouvoir rentrer dans la boucle.

fraction irréductible :
d'accord pour tes saisies de n et p.
que vas-tu faire ensuite ?

Posté par
carita
re : Python 11-12-20 à 18:29

bonsoir mathafou, désolée, j'ai oublié de rafraichir la page. :/
je vous laisse poursuivre tranquillement.

Posté par
Vale7401
re : Python 11-12-20 à 19:00

Donc
n=int(input("valeur de n ?"))
p=int(input("valeur de p ?"))
Lignes 1a 9 de l'algorithme de départ
Return n/a"/"p/a

Mieux ?

Posté par
mathafou Moderateur
re : Python 11-12-20 à 19:01

Bonjour carita
Pas de problème ... (et si je quitte, ne te prive pas d'intervenir au besoin sans attendre trop longtemps que je revienne)

Posté par
mathafou Moderateur
re : Python 11-12-20 à 19:20

l'algorithme de départ est une fonction
on ne la recopie pas là où on en a besoin mais on l'appelle.

Return n'est pas destiné à afficher un résultat mais à quitter la fonction, (retourner au programme appelant) en lui renvoyant une valeur

ici au plus propre tu auras deux fonctions

la fonction d'origine pg_div() telle quelle, inchangée

et une autre fonction à créer

def reduire(n,p) :
    ...
    # dans laquelle on appelle, invoque pg_div pour calculer le pgcd
    a=pg_div(n,p)
    ...
    return les deux valeurs réduites
    # ou un texte contenant ces deux valeurs séparées par le "/"


maintenant on peut aussi écrire un programme (et non pas une fonction) qui n'a donc pas de return du tout car ça ne voudrait rien dire :

def pg_div(a,b):
    # telle quelle
    ...
    return a

# et le programme (programme principal)
n=int(input("valeur de n ?"))
p=int(input("valeur de p ?"))
a = pg_div(n,p)
..
print(.., "/", ...) # et non pas return qui n'a aucun sens ici

Posté par
mathafou Moderateur
re : Python 11-12-20 à 22:34

au passage le programme d'origine ne marche pas

exemple d'exécution pas à pas :
>>> pg_div(4,6)
d = 1 != 0
d = a - b = 4 -( 6 ) = -2
d < b ? -2 < 6
a = b = 6
b = d = -2
d = -2 != 0
d = a - b = 6 -( -2 ) = 8
d < b ? 8 > -2
a = d = 8 b reste = -2
d = 8 != 0
d = a - b = 8 -( -2 ) = 10
d < b ? 10 > -2
a = d = 10 b reste = -2
d = 10 != 0
d = a - b = 10 -( -2 ) = 12
d < b ? 12 > -2
a = d = 12 b reste = -2
d = 12 != 0
d = a - b = 12 -( -2 ) = 14
d < b ? 14 > -2
a = d = 14 b reste = -2

etc
donc ça boucle sans fin !

il faut déja corriger le programme d'origine pour qu'il fonctionne quels que soient a et b entiers
que a soit < b ou a > b

une fois corrigé on doit avoir :
>>> pg_div(4,6)
d = 1 != 0
d = |a - b| = |4 - 6| = 2
d < b ? 2 < 6
a = b = 6
b = d = 2
d = 2 != 0
d = |a - b| = |6 - 2| = 4
d < b ? 4 > 2
a = d = 4 b reste = 2
d = 4 != 0
d = |a - b| = |4 - 2| = 2
d < b ? 2 > 2
a = d = 2 b reste = 2
d = 2 != 0
d = |a - b| = |2 - 2| = 0
d < b ? 0 < 2
a = b = 2
b = d = 0
d = 0, fini
2

Posté par
Vale7401
re : Python 12-12-20 à 16:46

A la suite du programme def pg_div (a,b)
def reduire (n,p)
n=int(input("valeur de n ?"))
p=int(input("valeur de p ?"))
a = pg_div(n,p)
n/a"/"p/a

je n'ai pas mélangé les variables?
a est le pgcd alors que dans la première fonction c'est un entier

Posté par
mathafou Moderateur
re : Python 12-12-20 à 18:31

chaque variable est ici "locale" à la fonction qui la définit et l'utilise.

dans la fonction reduire(n, p)
les valeurs de paramètres d'appel n et p sont définis lors de l'appel (de l'utilisation) de la fonction

les demander ensuite par input n'a aucun sens

tu ne sembles pas avoir vraiment compris ce qu'est une fonction
la différence entre la définir (def) et l'utiliser avec des valeurs
(cf un autre exo, c'est pareil)

revenons à la première fonction
quand j'écris dans un module Python (un ensemble de définitions de fonctions et d'autres instructions à exécuter, que l'on peut sauvegarder dans un fichier)

def pg_div(a,b) :    # (les ":" obligatoires, syntaxe)
    d = 1             # (indentation !!! syntaxe)
    ...
    ...
    return # quelque chose
# ici ce n'est plus la fonction (indentation nulle)

et que je lance l'exécution de ce module
rien ne se passe
j'ai juste défini une fonction
aucune de ses instructions n'est exécutée

pour que quelque chose se passe il faut appeler la fonction

ceci se fait soit ensuite dans le module
soit dans la console en ligne de commande
par exemple en tapant
pg_div(14,12)
c'est à ce moment que les variable a et b de la fonction prennent les valeurs 14 et 12 et que les instructions de la fonction sont exécutées :
>>> pg_div(14,12)
2
>>>

et ce autant de fois que je veux (que je tape des "pg_div(2 valeurs)")
avec autant de valeurs que je veux

si je lance dans la console, la valeur retournée (instruction return) par la fonction est affichée
si je l'ai lancé par une instruction dans le module, pg_div(14,12) prendra la valeur 2
à moi de voir ce que j'en fait

par exemple si j'écris
a = pg_div(342,pg_div(436,364))
il va calculer le PGCD des trois nombres 342, 436 et 364 et le mette dans la variable a
le PGCD de 342 et du PGCD de 436 et de 364)

ainsi un module qui contiendrait :
def pg_div(a,b) :
    d = 1 
    ...
    ...
    return #quelque chose
#ici ce n'est plus la fonction (indentation nulle)

a =  pg_div(342,pg_div(436,364)) # appel(s) de la fonction


calculerait de suite ce PGCD et le mettrait dans une variable a "globale" (en dehors des fonctions)

si ensuite dans la console je tape
a
il me donnera la valeur de ce a :
>>>
*** Console de processus distant Réinitialisée ***
(ici j'ai lancé le module qui contient tout ça, il a calculé sans rien dire)
>>> a (je demande la valeur de a)
2
>>>

si je veux qu'il affiche directement ce PGCD, il aurait fallu que que j'écrive dans le module :
print(pg_div(342,pg_div(436,364)))

alors en lançant le module j'aurais :
>>>
*** Console de processus distant Réinitialisée ***
(ici j'ai lancé le module qui contient tout ça, le résultat est l'affichage de :
2
>>>

une fois tout ceci clarifié, discutons maintenant de ton essai

A la suite du programme def pg_div (a,b)     non, de la définition de cette fonction

tu définis une autre fonction, OK
def reduire (n,p) déja il manque les ":"
n=int(input("valeur de n ?")) et l'indentation et de plus c'est inutile (n est un paramètre d'appel)
p=int(input("valeur de p ?")) idem
a = pg_div(n,p)
n/a"/"p/a syntaxe incorrecte et ceci est le calcul de quelque chose dont on ne fait rien !

on ne peut pas "concaténer" aussi simplement deux valeurs numériques et un texte "/"
on ne parlera pas de la façon de le faire, cela dépasse le propos de cet exo

soit on retourne simplement les deux valeurs

    ..
    return n/a, p/a

ce qui pourrait donner quand on appelle la fonction :

>>> reduit(12,14)
(6, 7)
>>>

soit on décide d'afficher du texte par print au lieu de return


    ..
    print (n/a, "/", p/a)


ce qui donnera
>>> reduit(12,14)
6 / 7
>>>

là j'avoue que j'ai triché
en vrai on obtient
>>> reduit(12,14)
6.0 / 7.0
>>>

parce que la division n/a donne un nombre à priori réel (float), "à virgule" et pas un nombre entier
il n'y a que nous qui le savons que c'est un nombre entier, pas Python
il faut le lui dire que c'est un nombre entier :

    ..
    print (int(n/a), "/", int(p/a))


tu peux donc maintenant tout rédiger proprement
et surtout -l'arbitre absolu- faire tourne ça sur Python !

c'était un peu long mais il y avait à dire, et à redire
prend le temps de lire par petit bouts lentement pour assimiler tout ça
c'est des bases de l'utilisation de Python en général



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1675 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !