Boucle : Pour .. allant de ..
Kamloops
-
kamloops -
kamloops -
Bonjour,
Je débute tout juste dans la programmation en python. Je m'exerce a faire des petits algorithme pour le moment.
J'essaye actuellement de faire une algorithme permettant de passer d'une base à un autre base. Par exemple passer d'un système binaire a un système octal.
En faite ma boucle aurait pour but de faire la somme des termes du nombre fois la base de départ a la puissance i.
i représente chaque numéro de la liste.
En gros voici ce que je voudrais faire :
http://imageshack.us/a/img827/6461/daumequation13676078272.png
Le problème est que quand je fais ça, le résultat est une suite interminable de chiffre (tout dépend le nombre qu'on entre au départ)
Une idée ?
Je débute tout juste dans la programmation en python. Je m'exerce a faire des petits algorithme pour le moment.
J'essaye actuellement de faire une algorithme permettant de passer d'une base à un autre base. Par exemple passer d'un système binaire a un système octal.
N=input("Choisissez la base de départ : ")
c=input("Entrez le nombre à convertir : ")
M=input("Choisissez la base dans quelle base voulez vous convertir "+ c +" : ")
## Le principe est de passer d'une base N quelconque en une base 10 puis de repasser en une base M.
c=list(c)
c=c[::-1] #Inverse la liste
a=len(c) #Détermine la longueur de la liste
i=0
S=0
for i in range(a):
S=c[i]*N**i
print(S)
En faite ma boucle aurait pour but de faire la somme des termes du nombre fois la base de départ a la puissance i.
i représente chaque numéro de la liste.
En gros voici ce que je voudrais faire :
http://imageshack.us/a/img827/6461/daumequation13676078272.png
Le problème est que quand je fais ça, le résultat est une suite interminable de chiffre (tout dépend le nombre qu'on entre au départ)
Une idée ?
A voir également:
- Boucle : Pour .. allant de ..
- Mon pc s'allume et s'éteint en boucle ✓ - Forum Matériel & Système
- Smart tv qui s'allume et s'éteint en boucle - Forum Téléviseurs
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
- Mise à disposition de boucle locale dédiée ✓ - Forum Freebox
- Vlc lecture en boucle ✓ - Forum Lecteurs et supports vidéo
2 réponses
Bonjour,
En exécutant ton code, j'ai surtout des erreurs de type: mélange de nombres et de chaînes de caractères.
Si je reprends ce que tu souhaites faire:
Les données de départ:
- les bases N et M doivent être des nombres: il faut donc convertir le résultat de input avec int()
- c, dans le cas général, doit être une chaîne de caractère (exemple: "01101001")
Pour convertir c en base 10 à partir de sa base N en appliquant ta formule, il ne faut pas prendre c[i] mais la valeur décimale du caractère c[i] dans la base N.
Il faut donc une chaîne de caractère représentant tous les caractères permis dans la base N, ici pour N=16:
chiffres = "0123456789ABCDEF"
et il faut chercher la valeur décimale des caractères en calculant leur indice. Par exemple, chiffres.find("B") donnera la valeur 11 (=indice de "B" dans la chaîne).
Corrigé comme ça, ça marche, mais en Python, il y a plus simple:
- on pourrait faire le calcul sans avoir à inverser l'ordre des caractères, et sans avoir à calculer de puissances
- plus simple encore, quelque soit la base de départ N (de 2 à 36), on peut convertir c en base 10 avec un simple c10 = int(c, N)
Voilà le petit code que je te propose, qui est valable, tant pour N que pour M, pour les bases de 2 à 36. J'ai complété ton code avec la conversion dans la base M:
En exécutant ton code, j'ai surtout des erreurs de type: mélange de nombres et de chaînes de caractères.
Si je reprends ce que tu souhaites faire:
Les données de départ:
- les bases N et M doivent être des nombres: il faut donc convertir le résultat de input avec int()
- c, dans le cas général, doit être une chaîne de caractère (exemple: "01101001")
Pour convertir c en base 10 à partir de sa base N en appliquant ta formule, il ne faut pas prendre c[i] mais la valeur décimale du caractère c[i] dans la base N.
Il faut donc une chaîne de caractère représentant tous les caractères permis dans la base N, ici pour N=16:
chiffres = "0123456789ABCDEF"
et il faut chercher la valeur décimale des caractères en calculant leur indice. Par exemple, chiffres.find("B") donnera la valeur 11 (=indice de "B" dans la chaîne).
Corrigé comme ça, ça marche, mais en Python, il y a plus simple:
- on pourrait faire le calcul sans avoir à inverser l'ordre des caractères, et sans avoir à calculer de puissances
- plus simple encore, quelque soit la base de départ N (de 2 à 36), on peut convertir c en base 10 avec un simple c10 = int(c, N)
Voilà le petit code que je te propose, qui est valable, tant pour N que pour M, pour les bases de 2 à 36. J'ai complété ton code avec la conversion dans la base M:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python 3.2
N = int(input("Choisissez la base de départ : "))
c = input("Entrez le nombre à convertir : ")
M = int(input("Choisissez dans quelle base convertir "+ c +" : "))
# chiffres permis dans les bases de numération de 2 à 36
chiffres = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
# conversion de c en base 10 => c10 (solution alternative: c10 = int(c, N))
c = c[::-1] #Inverse l'ordre des caractères dans la chaîne
c10 = 0
for i in range(len(c)):
c10 += chiffres.find(c[i])*N**i
# conversion de c10 en base M
if c10==0:
result = "0"
else:
result = ""
q = c10
while q!=0:
q, r = divmod(q, M)
result = chiffres[r] + result
# affichage du résultat
print("résultat:", result)