Petit soucis en python

Résolu/Fermé
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 - 8 mars 2019 à 00:58
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 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/drive/folders/1APtXNeneJLbBXIqAfdwI7JMnITzum5Se?usp=drive_open

Merci à l’âme charitable qui m'aidera

5 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 mars 2019 à 10:41
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
2
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
Modifié le 8 mars 2019 à 11:44
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 mars 2019 à 13:38
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
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
8 mars 2019 à 13:38
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
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
8 mars 2019 à 13:43
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 mars 2019 à 13:53
Ton algorithme définit un programme, et non une fonction. Pourquoi veux tu définir une fonction en Python ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 mars 2019 à 14:50
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
1
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
8 mars 2019 à 14:54
d'accord, mais il ne faut pas que je définisse ma liste tHexa d'abord ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 mars 2019 à 14:57
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 est
and
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 avec
input()
et l'indentation est aussi corrigée dans le traitement des choix
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
Modifié le 8 mars 2019 à 15:00
Ah, dans le PDF que j'ai téléchargé, ils me disent que c'est &....par exemple,

c'est déjà un début.....

Mais en soi, en prenant en comptes les erreurs de syntaxes, est-ce que je part sur la bonne voie pour mon code ou je suis à l'ouest ?
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
8 mars 2019 à 15:11
en fait j'ai besoin de savoir centaines chose,

j'arrive pas à traduire ça par ex:

 extraction du dernier caractère hexa s ← extraire(unHexa, unHexa.size()-1, 1)



ou encore ça qui est similaire à la ligne précédente:

unHexa ← extraire(unHexa, 0, unHexa.size()-1)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 8 mars 2019 à 15:21
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 que
and
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
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
15 mars 2019 à 12:33
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
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
Modifié le 15 mars 2019 à 14:21
Bon, j'ai compris mon erreur mais maintenant, j'ai ça:

Traceback (most recent call last):
File "C:/Users/jojol/.PyCharmCE2018.3/config/scratches/scratch.py", line 22, in <module>
unHexa = tHexa[unEntier // 16] + unHexa
TypeError: list indices must be integers or slices, not float
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 mars 2019 à 16:27
le double slash fait une division fournissant un résultat avec des nombres flottants, qui ne peuvent évidemment pas être utilisés comme indices d'une liste.
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
Modifié le 15 mars 2019 à 16:29
Ah, et comment puis-je remédier à cela puisque je désire obtenir un flottant en résultat svp ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 mars 2019 à 17:34
Travailles-tu en Python 3 ?
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
15 mars 2019 à 17:35
oui
0
jojol_8144 Messages postés 132 Date d'inscription vendredi 8 mars 2019 Statut Membre Dernière intervention 5 novembre 2020 3
Modifié le 24 mars 2019 à 15:26
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
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
25 mars 2019 à 13:17
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
durga1234 Messages postés 2 Date d'inscription mardi 19 mars 2019 Statut Membre Dernière intervention 19 mars 2019
19 mars 2019 à 13:53
its nice topic
http://www.javaonexperiance.com/python-tutorials/python-string-tutorials.html
Python Strings
-1
durga1234 Messages postés 2 Date d'inscription mardi 19 mars 2019 Statut Membre Dernière intervention 19 mars 2019
19 mars 2019 à 13:54
<a href="http://www.javaonexperiance.com/python-tutorials/python-string-tutorials.html">Python String</a>
0