Des puissances de 2 au code Andromède (2)

Correction des exercices Python
vendredi 2 novembre 2012
par  Nathalie CARRIÉ

Correction des exercices Python demandés dans l’article Des puissances de 2 au code Andromède (1).

La correction proposée est évidemment non-exhaustive.

Préliminaire : Les puissances de 2

Écrire les 11 premières puissances de 2.
Il serait judicieux de savoir reconnaître les 11 premières puissance de 2.
1024 = ?

  1. >>>
  2. >>> 2**10
  3. 1024
  4. >>>
  • Écrire un programme qui affiche les puissances de 2 de 20 à 220.
    1. >>>
    2. >>> for i in range(0,21):
    3. ...     print 2**i
    4. ...
    5. 1
    6. 2
    7. 4
    8. 8
    9. 16
    10. 32
    11. 64
    12. 128
    13. 256
    14. 512
    15. 1024
    16. 2048
    17. 4096
    18. 8192
    19. 16384
    20. 32768
    21. 65536
    22. 131072
    23. 262144
    24. 524288
    25. >>>
  • Écrire un programme qui, connaissant une puissance de 2, renvoie l’exposant (pour m = 2n, l’entrée c’est m, la sortie c’est n).
  1.  
  2. # -*- coding: utf-8 -*-
  3.  
  4. m=int(input('Entrez une puissance de 2 inférieure à 2**50 (1125899906842624)\n'))
  5. print(m)
  6. i=0
  7. while (2**i != m):
  8.     i=i+1
  9. print(' '+ str(m) + ' = ' + '2**' +str(i))

Sortie du code :

  1. > python './PuissanceDe2VersExposant.py'
  2. Entrez une puissance de 2 inférieure à 2**50 (1125899906842624)
  3. 2048
  4. 2048
  5.  2048 = 2**11
  6. >

Système binaire

  • écrire un programme qui affiche en binaire les entiers naturels de 1 à 20.
  1.  
  2. for i in range(0,21):
  3.     print(str(i)+' = '+bin(i))
  4.  

Sortie du code :

  1. >>>
  2. 0 = 0b0
  3. 1 = 0b1
  4. 2 = 0b10
  5. 3 = 0b11
  6. 4 = 0b100
  7. 5 = 0b101
  8. 6 = 0b110
  9. 7 = 0b111
  10. 8 = 0b1000
  11. 9 = 0b1001
  12. 10 = 0b1010
  13. 11 = 0b1011
  14. 12 = 0b1100
  15. 13 = 0b1101
  16. 14 = 0b1110
  17. 15 = 0b1111
  18. 16 = 0b10000
  19. 17 = 0b10001
  20. 18 = 0b10010
  21. 19 = 0b10011
  22. 20 = 0b10100
  23. >>>

Décimal vers binaire

  • écrire un programme qui convertit en binaire un entier naturel (sans utiliser la fonction bin()).
    On utilise les restes successifs de la division entière de l’entier par 2.
    1.  
    2. # -*- coding: utf-8 -*-
    3.  
    4. n=input('Entrez un entier naturel non-nul\n')
    5. m=int(n)
    6. s=''
    7. while m > 0:
    8.     s+=str(m%2)
    9.     m=m//2
    10.     print(m,s)
    11. ch=''
    12. for i in range(0, len(s)):
    13.     ch+=s[len(s)-1-i]
    14. print(n, 'en binaire est :',ch)

Résultat du programme avec vérification :

  1. >>>
  2. Entrez un entier naturel non-nul
  3. 576
  4. 288 0
  5. 144 00
  6. 72 000
  7. 36 0000
  8. 18 00000
  9. 9 000000
  10. 4 0000001
  11. 2 00000010
  12. 1 000000100
  13. 0 0000001001
  14. 576 en binaire est : 1001000000
  15. >>> bin(576)
  16. '0b1001000000'
  17. >>>

Un mot sur l’hexadécimal

  • Ecrire un programme qui convertit en hexadécimal un entier naturel.
  1.  
  2. def renverse(s):
  3.     ch=''
  4.     for i in range(0, len(s)):
  5.         ch+=s[len(s)-1-i]
  6.     return ch
  7.  
  8. n=input('Entrez un entier naturel : \n')
  9. m=int(n)
  10. print('n = '+str(n))
  11. s=''
  12. hexa=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  13. while m > 0:
  14.     s+=str(hexa[m%16])
  15.     m=m//16
  16.     print(m,s)
  17.  
  18. print('Résultat : \n'+n+' = '+renverse(s))
  19.  

Résultat du programme avec vérification :

  1. >>>
  2. Entrez un entier naturel :
  3. 127
  4. n = 127
  5. 7 F
  6. 0 F7
  7. Résultat :
  8. 127 = 7F
  9. >>> hex(127)
  10. '0x7f'
  11. >>>
  • Ecrire un programme qui convertit en hexadécimal un nombre en binaire.
  1. # -*- coding: utf-8 -*-
  2.  
  3. def renverse(s):
  4.     ch=''
  5.     for i in range(0, len(s)):
  6.         ch+=s[len(s)-1-i]
  7.     return ch
  8.  
  9. def binaire_vers_entier(b): # b est une chaîne contenant l'entier en binaire
  10.     somme=0
  11.     i=0
  12.     for a in b:
  13.         somme+=int(a)*2**(len(b)-1-i)
  14.         i=i+1
  15.     return somme
  16.  
  17. n=input('Entrez un entier en binaire : (par exemple 1111111) \n')
  18. m=binaire_vers_entier(n)
  19. print('n = '+str(n))
  20. s=''
  21. hexa=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  22. while m > 0:
  23.     s+=str(hexa[m%16])
  24.     m=m//16
  25.     print(m,s)
  26.  
  27. print('Résultat : \n'+n+' = '+renverse(s))

Résultat du programme avec vérification :

  1. >>>
  2. Entrez un entier en binaire : (par exemple 1111111)
  3. 1111111
  4. n = 1111111
  5. 7 F
  6. 0 F7
  7. Résultat :
  8. 1111111 = 7F
  9. >>>

Codage d’un texte

Décoder en français la suite binaire suivante pour connaître le message envoyé du futur dans le film Le code Andromède (The Andromeda Strain, 2008 American science-fiction film),
basé sur une nouvelle de Michael Crichton (1969) (http://en.wikipedia.org/wiki/The_An...).

0110111 0110011 0111001 0110101 0110010 0111000
1000010 1000001 1000011 1001001 1001100 1001100
1010101 1010011 1001001 1001110 1000110 1000101
1010010 1001110 1010101 1010011

Voici le message décodé :

Récapitulatif : Mini-projet de conversion entre entiers, binaires et hexadécimaux

  • Ecrire un programme qui permet de convertir un entier en binaire, un binaire en entier, un entier en hexadécimal, un hexadécimal en entier, un hexadécimal en binaire et un binaire en hexadécimal.
  1. # -*- coding: utf-8 -*-
  2.  
  3. def renverse(s):
  4.     ch=''
  5.     for i in range(0, len(s)):
  6.         ch+=s[len(s)-1-i]
  7.     return ch
  8.  
  9. def entier_vers_binaire(m):
  10.     chbin=''
  11.     while m > 0:
  12.         chbin+=str(m%2)
  13.         m=m//2
  14.     return chbin
  15.  
  16. def binaire_vers_entier(b): # b est une chaîne contenant l'entier en binaire
  17.     somme=0
  18.     i=0
  19.     for a in b:
  20.         somme+=int(a)*2**(len(b)-1-i)
  21.         i=i+1
  22.     return somme
  23.  
  24. def entier_vers_hexadecimal(m):
  25.     s=''
  26.     hexa=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  27.     while m > 0:
  28.         s+=str(hexa[m%16])
  29.         m=m//16
  30.     return s
  31.  
  32. def hexadecimal_vers_entier(h): # h est une chaîne contenant l'entier en hexadécimal
  33.     hexa=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  34.     somme=0
  35.     i=0
  36.     for a in h:
  37.         somme+=hexa.index(a)*16**(len(h)-1-i)
  38.         i=i+1
  39.     return somme
  40.  
  41. def hexadecimal_vers_binaire(h): # h est une chaîne contenant l'entier en hexadécimal
  42.     chb=entier_vers_binaire(hexadecimal_vers_entier(h))
  43.     return chb
  44.  
  45. def binaire_vers_hexadecimal(b): # b est une chaîne contenant l'entier en binaire
  46.     chhex=entier_vers_hexadecimal(binaire_vers_entier(b))
  47.     return chhex
  48.      

Evidemment, ces fonctions jouent le rôle des fonctions Python : int(), bin() et hex().


Commentaires