Petit soucis en python
Résolu[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
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/drive/folders/1APtXNeneJLbBXIqAfdwI7JMnITzum5Se?usp=drive_open
Merci à l’âme charitable qui m'aidera
5 réponses
Une personne cherche à réaliser une conversion base 10 vers base 16 et inversement en Python à partir d'un algorithme théorique, et sollicite des correctifs sur la traduction.
Plusieurs réponses proposent d'utiliser les fonctions intégrées int() et hex() pour obtenir ces conversions en une ligne, et invitent à partager le code précis et un exemple.
D'autres conseils privilégient une approche basée sur l'algorithme, puis une implémentation Python directe sans traduction mot à mot, avec conseils de débogage et un exemple de menu.
Des échanges mentionnent enfin que la conversion peut s'appuyer sur une chaîne hexadécimale préconstruite et sur des opérations modulo et division pour l'opération inverse, avec des notions d'indentation et de tests unitaires.
-
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-
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 -
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 seulprint("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 -
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 -
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 -
-
-
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://forums.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-
-
note que mon exemple de menu ci-dessus corrige un certain nombre d'erreurs et de confusions dans ton code précédent :
- l'opérateur "et" en Python estand
et pas "&"
- une affectation en Python se fait avec=
et une comparaison d'égalité avec==
...
- l'indentation est corrigée dans la boucle pour permettre la répétition de la demande de saisie avecinput()
et l'indentation est aussi corrigée dans le traitement des choix -
-
-
Je pense que ton PDF indique que
&
est un opérateur bit à bit faisant un "et" logique (il sert à altérer des bits de données et non pas ajouter des conditions cumulatives à des comparaisons) et queand
est l'opérateur booléen (il sert dans les comparaisons).
https://www.w3schools.com/python/python_operators.asp
Si ton PDF te dit autre chose, jette le aux orties.
d'accord, mais il ne faut pas que je définisse ma liste tHexa d'abord ?
si tu veux, mais en quoi ta liste tHexa t'est-elle utile pour programmer ton menu et tester son fonctionnement ?
Tu peux la définir après, n'est-ce pas ? Une fois que tu as vérifié que ton menu fonctionne, tu ajoutes la définition de la liste entre la ligne 10 et la ligne 12, ou avant entre la ligne 3 et la ligne 5 si tu veux, afin qu'elle puisse servir au reste du programme, mais pas avant.
Ne rajoute à ton programme que ce qui est nécessaire à ce que tu fais et ce que tu veux tester, sinon tu rajoutes de la complexité et des chances d'erreurs inutilement par rapport à ce que tu cherches déjà mettre au point.
Lorsque tu ajoutes la moindre chose, tu testes tout de suite si tu n'as pas fait d'erreurs de syntaxe et si ton programme continue de faire ce qu'il est sensé faire, ensuite tu ajoutes une autre partie et dès que tu as quelques lignes que tu peux tester, tu le fais, etc.
Jusqu'à ce que ton programme soit terminé et au point.
C'est la méthode que j'essaye de faire entrer dans ta tête et que je t'ai indiquée dès ce post : https://forums.commentcamarche.net/forum/affich-35910791-petit-soucis-en-python#3
-
-
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 -
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 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
its nice topic
http://www.javaonexperiance.com/python-tutorials/python-string-tutorials.html
Python Strings