Menu

Petit soucis en python [Résolu]

Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
- - Dernière réponse : [Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
- 25 mars 2019 à 13:17
Bonjour,

Voila, j'essaie de coder un petit programme qui puisse me permettre de faire un conversion d'une base 10 vers base 16 et vice versa,

J'ai rédigé le programme en langage algorithmique que j'ai testé sur Papier cependant, j'ai des soucis pour le convertir en python,

J'aurais aimé savoir si vous pouviez m'aider en m'apportant un correctif sur la traduction que j'ai faite en python de l'algo s'il vous plait car je butte vraiment et je n'arrive pas à progresser dans mon apprentissage.


Voici le lien du projet, vous trouverez l'algo + ce que j'ai fais en python (PS: je suis une douille en python):

https://drive.google.com/open?id=1APtXNeneJLbBXIqAfdwI7JMnITzum5Se

Merci à l’âme charitable qui m'aidera
Afficher la suite 

Votre réponse

5 réponses

Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919
0
Merci
Salut jojol_8144,

En Python, tu as les fonctions int() et hex() faisant partie du langage qui te permettent de faire ces conversions en une ligne.

# -*- coding: UTF-8 -*-
chaine_base_10 = "1234567"
print("la chaîne", chaine_base_10, "vaut", hex(int(chaine_base_10)), "en hexadécimal")
chaine_base_16 = "0x12d687"
print("la chaîne", chaine_base_16, "vaut", int(chaine_base_16, 16), "en hexadécimal")

donne :

$ python3 35910791.py
la chaîne 1234567 vaut 0x12d687 en hexadécimal
la chaîne 0x12d687 vaut 1234567 en hexadécimal
$

Vois :
https://docs.python.org/3/library/functions.html#int
https://docs.python.org/3/library/functions.html#hex

Lorsque tu postes sur le forum programmation de CCM, poste ton code et les éléments de ton problème sur le forum, décrit précisément quel est ton problème et illustre le avec un exemple de code montrant le comportement anormal selon toi et indique le comportement attendu.

Sinon : on doit aller nous mêmes à la pêche aux informations, sur un autre site, en ne sachant rien de la nature réelle de ton problème que l'on doit deviner. Les membres du forum répondent en fonction de leurs compétentes, de leur temps libre et de leur motivation, bénévolement. Pour espérer avoir une réponse, tu dois comprendre cela et leur faciliter la tâche.

Le forum permet l'affichage du code avec coloration syntaxique, numérotation des lignes et préservation de l'indentation en postant le code avec les balises <code python>.

Pour cela clique sur la flèche basse à gauche de l'icône image et choisis le langage python. Ensuite copie colle ton code à l'intérieur des balises, comme cela :

<code python>
ton code ici
</code>

Dal
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
Bonjour,

Donc voici mon code:


 
from math import pow, log

def convert( unEntier,
             old_base,
             tHexa,
             choix,
             position
             k,
             s,
             new_base):

    tHexa = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
while choix != 'Q' & choix  != 'q':
    print("Conversion base 10 en base 16 ............ 1")
    print("Conversion base 16 en base 10 ............ 1")
    print("Quitter l'application .................... Q")
    print("Votre choix :                               ")
choix = input("hop hop hop, on fait la sa&sie")

if choix = '1':
     print("Entrez un entier naturel = ")
     unEntier = input ("saisie de l'entier à convertir ")
     unHexa = ""
    for unEntier > 0:
        unHexa = tHexa [unEntier / 16] + unHexa
        unEntier = unEntier / 16
    unHexa = input ("valeur hexa =")
    else:
    if choix = '2':
        print("Entrez un hexadécimal = ")
        unHexa = input()
        k = 0
        unEntier = 0
        while unHexa > 0:
            s = ch ((unHexa, unHexa.size()-1, 1)
                    position = 0
                    for s !=  tHexa [position]:
                        position = position + 1
                unEntier = unEntier + position * 16^k
                unHexa = ch (unHexa, 0, unHexa.size()-1)               k = k + 1
             print("valeur décimale = ", unEntier )


je sais qu'il est mauvais, j'aimerais juste un petit correctif de votre part si cela est possible bien sur

merci d'avance
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
Là tu postes ton code (correctement posté, bravo :-), mais tu ne décris toujours pas ton problème.

Le premier problème évident est que ce code ne peut pas être exécuté par Python en raison d'erreurs de syntaxe. Python te signale ces erreurs de syntaxe, que tu devrais déjà corriger une par une en utilisant les indications fournies par Python.

Commence par la première :

$ python 35910791.py
File "35910791.py", line 10
k,
^
SyntaxError: invalid syntax

vois à la ligne 10 ou avant cette ligne ce qui ne serait pas conforme à la syntaxe de Python, et tu verras qu'il manque une virgule dans ta liste de paramètres à la ligne immédiatement au dessus de la ligne 10. Continue jusqu'à ce que ton programme ne comporte plus d'erreurs de syntaxe.

Commence petit :

- ajoute un appel à cette fonction avec des paramètres (j'avoue ne pas comprendre pourquoi tu passes tous ces paramètres à la fonction, vu que tu définis leur valeur dans la fonction..., de quels paramètres ta fonction a-t-elle réellement besoin pour être appelée ?) - si tu n'appelles pas la fonction, elle ne s'exécutera pas (tu ne fais que définir une fonction qui ne s'exécute pas)

- commence avec une fonction sans rien dedans qu'un seul
print("Je suis dans la fonction")
et ne comprenant qu'une liste de paramètres réellement nécessaires à l'appel de la fonction, teste cela, et si cela s'exécute sans erreurs de syntaxe et que cela fonctionne comme tu l'attends, passe à la suite

- ajoute ton menu à la fonction, teste cet ajout, et si cela s'exécute sans erreurs de syntaxe et que cela fonctionne comme tu l'attends, passe à la suite,

- etc.

C'est comme cela que l'on réalise un programme dans n'importe quel langage. Lorsque l'on programme, on n'attend pas d'avoir écrit plusieurs dizaines de lignes avant de tester son programme, surtout lorsque l'on est inexpérimenté.

Fais cela s'il te plaît, et si tu as une erreur de syntaxe ou un bogue à l'exécution que tu ne sais pas corriger, reviens sur le forum en postant ton code modifié dans ce fil de discussion, et en expliquant exactement quelle est l'erreur ou le problème que tu n'arrives pas à corriger ou à résoudre.

Sois vigilant sur l'indentation de ton code. Si tu veux écrire du code qui fait partie de ta fonction, ton code doit rester indenté dans la fonction.

Tu devrais commencer par quelque chose de pas plus compliqué que cela :

# -*- coding: UTF-8 -*-

from math import pow, log

# définition de la fonction (son contenu est délimité par l'indentation)
def convert():
    print("Je suis dans la fonction")

#exécution de la fonction (indenté hors de la fonction, ne fait pas partie de la fonction)
convert()

Ne rajoute des arguments à la fonction que s'ils sont strictement nécessaires à l'appel de la fonction.

Dal
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
Après vérification, il semble que cela ne marche pas, rien ne vas dans mon prog,

j'ai pas vraiment de cours, on se contente de nous dire de chercher par nous même, pour être autonome, j'ai tout un tas d'exercice et je n'ai aucun modèle type de correction,

Je dois attaquer tout un tas d'exos comme ça et je ne connais pas vraiment l'approche à avoir.....

C'est pour ça que j'ai démarré avec la rédac du prog en langage algorithmique....je ne sais pas si c'est une bonne approche du tout...

Serait-il me traduire celui-ci en python s'il vous plait ou mon algo n'est pas bon ? j'ai mis le lien de mon algo dans le premier message,

Cela m'aiderais énormément pour la suite parce-que pour le moment, je patine

je lis en parallèle les liens qui m'ont été fournis en haut, à défaut d'en avoir un en main

Merci à ceux qui prennent le temps de m'expliquer
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
mon algo:

programme conversion

choix : caractère // choix de l'utilisateur dans le menu
unEntier : entier // entier à convertir en hexa
unHexa : chaîne // hexa à convertir en entier
tHexa[0..15] : caractère // vecteur contenant les digits de la base 16
k : entier // pour gérer les puissances
s : chaîne // pour récupérer un digit dans l'hexa
position : entier // pour mémoriser la position du digit dans le vecteur

debut

choix ← 'Z'
// initialisation du vecteur
tHexa ← {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}

// boucle sur le menu

tantque choix <> 'Q' et choix <> 'q'

// affichage du menu
et saisie du choix
............ 1"
afficher
"Conversion
base
10
en
base
16

afficher
"Conversion
base
16
en
base
10
............ 2"
afficher "Quitter l'application .................... Q"
afficher "Votre choix : "

saisir choix

• conversion base 10 en base 16 si choix = '1'

◦ saisie de l'entier à convertir afficher "Entrez un entier naturel = " saisir unEntier

◦ conversion par divisions successives de 16 unHexa ← ""
tantque unEntier > 0

unHexa ← tHexa[unEntier div 16] + unHexa unEntier ← unEntier/16
fintantque
◦ affichage du résultat
afficher "valeur hexa = ", unHexa

sinon

• conversion base 16 en base 10 si choix = '2'
◦ saisie de l'hexa à convertir afficher "Entrez un hexadécimal = " saisir unHexa

◦ conversion par addition des digits multipliés par les poids k ← 0 // pour les puissances

unEntier ← 0

tantque taille(unHexa) > 0
• extraction du dernier caractère hexa s ← extraire(unHexa, unHexa.size()-1, 1)
• recherche de la position du caractère dans le vecteur position ← 0
tantque s <> tHexa[position] position ← position + 1
fintantque
• ajout du digit récupéré multiplié par la puissance de 16 unEntier ← unEntier + position * 16k
• on enlève le dernier caractère

unHexa ← extraire(unHexa, 0, unHexa.size()-1)

82940CTPA01 2/4
k ← k + 1


fintantque
// affichage du résultat

afficher "valeur décimale = ", unEntier

finsi

finsi

fintantque

fin
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
Ton algorithme définit un programme, et non une fonction. Pourquoi veux tu définir une fonction en Python ?
Commenter la réponse de [Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919
0
Merci
J'ai pris la peine de te donner une méthodologie, relis mon message précédent (je pense que tu as posté les messages suivants sans lire la totalité de ce que j'ai écris, car j'ai terminé de modifier mon post à 13:38 et c'est à la même heure que tu postais ton algorithme) :

https://www.commentcamarche.net/forum/affich-35910791-petit-soucis-en-python#3

Commencer par réfléchir à l'algorithme est toujours une bonne chose, mais tu n'as pas nécessairement besoin de le formaliser de façon aussi détaillée, car tu ne dois utiliser ton algorithme que pour inclure dans ton programme Python la logique que l'algorithme implémente au lieu de tenter de traduire ligne par ligne ce que tu as écris en langage algorithmique qui utilise une syntaxe différente.

Si tu n'as pas à définir une fonction, commence directement ton code par le menu :

# -*- coding: UTF-8 -*-

from math import pow, log

choix = ' '
while choix not in ['Q', 'q', '1', '2']:
    print("Conversion base 10 en base 16 ............ 1")
    print("Conversion base 16 en base 10 ............ 2")
    print("Quitter l'application .................... Q")
    choix = input("Votre choix : ")

if choix == 'Q' or choix == 'q':
    print("Adios")
    exit

if choix == '1':
    print("Conversion base 10 en base 16")
    # TODO

if choix == '2':
    print("Conversion base 16 en base 10")
    # TODO


Dal
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
oui, c'est ce que j'ai fais et ça fonctionne merci pour votre aide,

Mais j'arrive pas à traduire les 2 lignes décrites en haut, pourriez-vous m'aider s'il vous plait ?
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
le PDF ne fais mention que de &, aucune allusion à and
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
Mais j'arrive pas à traduire les 2 lignes décrites en haut, pourriez-vous m'aider s'il vous plait ?

Tu ne dois pas traduire ces lignes. Tu dois chercher les fonctionnalités de traitement de chaînes offertes par le langage Python et les utiliser pour faire quelque chose qui produise le même résultat.

https://www.w3schools.com/python/python_strings.asp

le PDF ne fais mention que de &, aucune allusion à and

Je ne sais pas d'où vient ton PDF.

La documentation officielle de Python3 est là : https://docs.python.org/3/index.html
Le tutoriel officiel conçu par la Python Software Foundation est là : https://docs.python.org/3/tutorial/

Celui dont je t'ai donné des liens est très basique et succinct : https://www.w3schools.com/python/default.asp mais au moins il ne comporte pas d'erreurs grossières.

Dal
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
ouais non mais rien ne marche en application sur ce PDF, c'est un pote qui m'a filé ça viens de ses TP de maths

mais pour faire une extraction comme mentionné ci-dessus, c'est bien ch ?

et le symbole ← correspond bien à = ?

Je suis sur les liens fournis, je vais essayer d'évoluer avec cela, c'est plus prudent
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
mais pour faire une extraction comme mentionné ci-dessus, c'est bien ch ?

Je ne connais pas de fonction Python appelée "ch". Il y a, en revanche,
chr()
mais qui ne te sert pas à extraire un caractère d'une chaîne ou plutôt une sous-chaîne à partir d'une autre chaîne (il n'y a pas de type caractère à part entière en Python, un caractère est juste une chaîne ayant une taille d'un caractère).

Pour trouver comment faire, outre https://www.w3schools.com/python/python_strings.asp que je t'ai déjà mentionné et qui est très succinct et simplifié, tu peux voir : https://docs.python.org/3/tutorial/introduction.html#strings

et le symbole ← correspond bien à = ?

Je t'ai déjà rappelé quel était l'opérateur d'affectation en Python.

https://www.commentcamarche.net/forum/affich-35910791-petit-soucis-en-python#9
Commenter la réponse de [Dal]
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
0
Merci
Bonjour,
Je me suis remis sur le script mais j'ai un soucis,

Lorsque je saisie un entier, le programme boucle et me renvois dans le menu au lieux de m'afficher le résultat de la conversion:

# -*- coding: UTF-8 -*-

from math import pow, log

tHexa = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
choix = ' '
while choix not in ['Q', 'q', '1', '2']:
    print("Conversion base 10 en base 16 ............ 1")
    print("Conversion base 16 en base 10 ............ 2")
    print("Quitter l'application .................... Q")
    choix = input("Votre choix : ")

if choix == 'Q' or choix == 'q':
    print("entrez un entier naturel")
    unEntier = int(input("saisie de l'entier à convertir "))
    unHexa = ""
    while unEntier > 0:
        unHexa = tHexa [unEntier // 16] + unHexa
        unEntier = unEntier / 16
print("valeur Hexa ="+ unHexa)

if choix == '1':
    print("Conversion base 10 en base 16")
    # TODO

if choix == '2':
    print("Conversion base 16 en base 10")
    # TODO
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
oui c'est un devoir j'avais précisé que j'avais tout un tas d'exos de ce type à faire (des TP si vous préférez)
je regarde ça
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
J'ai essayé de faire ça:

tHexa = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
print("entrez un entier naturel")
unEntier = int(input("saisie de l'entier à convertir "))
unHexa = ""
print("la chaîne", unEntier, "vaut", hex(int(unEntier)), "en hexadécimal")


et j'obtiens ceci:

entrez un entier naturel
saisie de l'entier à convertir 10
la chaîne 10 vaut 0xa en hexadécimal

Process finished with exit code 0

entrez un entier naturel
saisie de l'entier à convertir 255
la chaîne 255 vaut 0xff en hexadécimal

Process finished with exit code 0



Cela signifie bien que la conversion fonctionne svp ?

et que tout ce que j'ai essayé de faire avec les division est inutile svp ?

EDIT:

En fait si ça fonctionne aussi avec ça:

        unHexa = tHexa[unEntier % 16] + unHexa
            unEntier //= 16
    print("valeur Hexa =" + unHexa)


Merci
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
jojol_8144,

Python permet de convertir très facilement, comme tu le vois et comme je te l'avais montré dès mon premier message (et tu n'as pas besoin de la liste
tHexa
et si tu as déjà convertit la saisie en
int
en ligne 3, tu n'as pas à le refaire en ligne 5).

Un programmeur Python ne se casserait pas la tête à essayer de refaire ce que font déjà les fonctions intégrées au langage. Il utiliserait les fonctions intégrées au langage, qui sont programmées correctement et "fonctionnent" conformément à leur documentation. Si l'objet de l'exercice est de faire un programme comme le ferait un programmeur Python, alors un code utilisant les fonctions
int()
et
hex()
intégrées au langage ne me paraît pas déplacé.

Maintenant, si l'objet de l'exercice est de mettre en oeuvre un algorithme qui fait les conversions, en montrant non seulement que tu sais concevoir un tel algorithme, mais aussi que tu sais utiliser des listes, des boucles, des conditions, des indices de listes, les opérateurs modulo et de division entière, etc., l'objet de l'exercice est différent.

Je ne peux pas répondre à ta place sur la question de savoir si tout ce que tu as essayé de faire avec les divisions est inutile (sur le plan de l'apprentissage, cela ne l'est certainement pas, car cela a dû te faire progresser dans la compréhension de ce langage).

En tout cas, en l'état, ton code précédent https://www.commentcamarche.net/forum/affich-35910791-petit-soucis-en-python#32 ne fait pas ce qu'il est sensé devoir faire car il n'implémente pas correctement l'algorithme qui ferait cette tâche.
jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
-
Merci pour votre patience,

en tout cas cela semble fonctionner correctement avec les 2 version

Je vais pouvoir passer au TP suivant, ouf
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
Bravo !
Commenter la réponse de jojol_8144
Messages postés
25
Date d'inscription
vendredi 8 mars 2019
Dernière intervention
25 mars 2019
0
Merci
reBonjour,

J'aurais aimé savoir comment on déclare une constante en Python car j'ai cru comprendre que cela n'existait pas à proprement parler dans ce langage s'il vous plait

Et est-il possible de déclarer un def pour une procédure ou cela est juste réservé au fonction svp ?

Merci
[Dal]
Messages postés
5003
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
25 mars 2019
919 -
Ce fil de discussion est marqué "résolu".

Si tu as de nouvelles questions, poses les dans un nouveau fil, avec un titre explicite (pas "Petit soucis avec python"), qui renforcera les chances que quelqu'un réponde.
Commenter la réponse de jojol_8144
Messages postés
2
Date d'inscription
mardi 19 mars 2019
Dernière intervention
19 mars 2019
-1
Merci
its nice topic
http://www.javaonexperiance.com/python-tutorials/python-string-tutorials.html
Python Strings
durga1234
Messages postés
2
Date d'inscription
mardi 19 mars 2019
Dernière intervention
19 mars 2019
-
<a href="http://www.javaonexperiance.com/python-tutorials/python-string-tutorials.html">Python String</a>
Commenter la réponse de durga1234