You are not logged in.

Computer Science in 1ère

The forum to cure all your computer anxieties

#1 14-Oct-2019 19:07:29

LBruneteau
Member
From: Rezé
Registered: 12-Sep-2019
Posts: 33
Website

Conversions entre les bases

J’ai enfin fini le défi qui demandait de créer une fonction permettant de convertir les nombres entres différentes bases. Je pense qu’il est encore à améliorer, merci d’avance si vous m’aidez à le faire

def versbase10(nb:str,base:int)->int:
    """
    Convertit un nombre dans une base comprise entre 2 et 36 inclus vers la base 10
    versbase10(2F3B,16)
    >>>12091
    """
    nb=str(nb)
    nb=nb.upper() #sert à mettre des majuscules
    try:
        base = int(base) #on essaie de convertir la base en un entier
        assert base>1 # erreur d'assertion si la base est plus petite que 2
        assert base<37 # erreur d'assertion si la base est plus grande que 36
    except ValueError: #si la conversion ne marche pas
        print("La base doit être un nombre")
    except AssertionError: #si il y a une erreur d'assertion
        print("La base doit être comprise entre 2 et 36")
    else: # si il n'y a pas d'erreur
        alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        nombre=[] #liste vide
        for x in range(len(nb)):
            for y in range(len(alphabet)):
                if nb[x]==alphabet[y]:
                    nombre.append(y)
            #on verifie pour chaque caractère à quelle nombre il correspond
            #permet de remplacer les lettres par les nombres correspondants et les place dans la liste
            #
        result = nombre[0]
        if len(nb)==1:
            nombre.append(0)
        for k in range (len(nb)-1):
            result=result*base
            result = result + nombre[k+1]
        return result

def depuisbase10(nb:int,base:int)->str:
    """
    Convertit un nombre en base 10 vers une base comprise entre 2 et 36
    depuisbase10(12091,16)
    >>>"2F3B"
    """
    try:
        nb=int(nb)
        base=int(base)
        assert base>1
        assert base<37
    except ValueError:
        print("Il faut saisir des nombres")
    except AssertionError:
        print("La base doit être comprise entre 2 et 36")
    else:
        alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        result = ""
        while nb!=0:
            reste=nb%base
            nb=int(nb/base)
            result=alphabet[reste]+result
        return result

def conv_base(nombre:str,base_depart:int,base_arrivee:int):
    """
    Convertit un nombre d'une base vers une autre
    conv_base("1101",2,16)
    >>>"D"
    """
    result=versbase10(nombre,base_depart)
    result=depuisbase10(result,base_arrivee)
    return result

Offline

#2 15-Oct-2019 23:59:35

Vader
Administrator
Registered: 05-Oct-2018
Posts: 220

Re: Conversions entre les bases

Louis, ce n'est pas lisible. En s'intéressant de temps en temps à ce qui se passe en classe, vous sauriez que l'on doit mettre le code entre des balises pour utiliser une mise en forme adaptée.
Il serait d'ailleurs  PLUS D'ACTUALITÉ de programmer tout ceci en BASH

Donc, avec la coloration syntaxique cela donne :


def versbase10(nb:str,base:int)->int:
    """
    Convertit un nombre dans une base comprise entre 2 et 36 inclus vers la base 10
    versbase10(2F3B,16)
    >>>12091
    """

    nb=str(nb)
    nb=nb.upper() #sert à mettre des majuscules
    try:
        base = int(base) #on essaie de convertir la base en un entier
        assert base>1 # erreur d'assertion si la base est plus petite que 2
        assert base<37 # erreur d'assertion si la base est plus grande que 36
    except ValueError: #si la conversion ne marche pas
        print("La base doit être un nombre")
    except AssertionError: #si il y a une erreur d'assertion
        print("La base doit être comprise entre 2 et 36")
    else: # si il n'y a pas d'erreur
        alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        nombre=[] #liste vide
        for x in range(len(nb)):
            for y in range(len(alphabet)):
                if nb[x]==alphabet[y]:
                    nombre.append(y)
            #on verifie pour chaque caractère à quelle nombre il correspond
            #permet de remplacer les lettres par les nombres correspondants et les place dans la liste
            #
        result = nombre[0]
        if len(nb)==1:
            nombre.append(0)
        for k in range (len(nb)-1):
            result=result*base
            result = result + nombre[k+1]
        return result

def depuisbase10(nb:int,base:int)->str:
    """
    Convertit un nombre en base 10 vers une base comprise entre 2 et 36
    depuisbase10(12091,16)
    >>>"2F3B"
    """

    try:
        nb=int(nb)
        base=int(base)
        assert base>1
        assert base<37
    except ValueError:
        print("Il faut saisir des nombres")
    except AssertionError:
        print("La base doit être comprise entre 2 et 36")
    else:
        alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        result = ""
        while nb!=0:
            reste=nb%base
            nb=int(nb/base)
            result=alphabet[reste]+result
        return result

def conv_base(nombre:str,base_depart:int,base_arrivee:int):
    """
    Convertit un nombre d'une base vers une autre
    conv_base("1101",2,16)
    >>>"D"
    """

    result=versbase10(nombre,base_depart)
    result=depuisbase10(result,base_arrivee)
    return result
 

Offline

#3 16-Oct-2019 00:03:53

Vader
Administrator
Registered: 05-Oct-2018
Posts: 220

Re: Conversions entre les bases

Il ne faut pas utiliser try except car on n'en a pas parlé. L'usage qui en est fait ici est maladroit. Mieux vaut se contenter d'assert.
De plus, pourquoi passer par la base 10 ?

Offline

#4 16-Oct-2019 00:44:38

Vader
Administrator
Registered: 05-Oct-2018
Posts: 220

Re: Conversions entre les bases

Le principe est cependant bon. Voici une version un peu simplifiée :


def convert(nb, base):
    assert 1 < base < 37 and nb >= 0 and  int(nb) == nb, 'la base doit être entre 2 et 36 et le nb un entier naturel'
    d = [str(k) if k < 10 else chr(55 + k) for k in range(36)]
    n = nb
    res = ''
    while n > 0 :
        res = d[n % base] + res
        n = n // base
    return res
 

et par exemple:


In [26]: convert(0b1001010, 16)
Out[26]: '4A'

In [27]: convert(0o755, 16)
Out[27]: '1ED'

In [28]: convert(0o755, 10)
Out[28]: '493'

In [29]: convert(755, 10)
Out[29]: '755'

In [30]: convert(755, 16)
Out[30]: '2F3'

In [31]: convert(755, 36)
Out[31]: 'KZ'
 


Défi : l'écrire en Bash smile

Offline

Board footer

Powered by FluxBB