CentraleSupélec LMF, UMR CNRS 9021
Département informatique Laboratoire Méthodes Formelles
Bât Breguet, 3 rue Joliot-Curie Bât 650 Ada Lovelace, Université Paris Sud
91190 Gif-sur-Yvette, France Rue Noetzlin, 91190 Gif-sur-Yvette, France
TD n°1 SIP

Le sujet SIP-TD01.pdf

Éléments de corrigé

#############
# Exercice 1
#############
print("Hello World!")

# Sous Linux ou MacOS
# La variable d'environnement USER contient le nom de login de l'utilisateur
import os
print("Hello " + os.getenv("USER") + "!")

# os.getuid() rend le numéro (ID) de l'utilisateur
# pwd.getpwuid() rend les informations concernant un utilisateur à partir de son ID. 
# La cinquième entrée (indice 4) contient le nom (real name) de l'utilisateur.
import pwd
print("Hello " + pwd.getpwuid(os.getuid())[4] + "!")

#############
# Exercice 2
#############
prenom = "John"
nom = "Doe"
age = 45
male = True

x = nom + prenom
y = age + male
z = nom + prenom + str(y)

#############
# Exercice 3
#############
# Echanger nom et prenom avec une variable temporaire
# tmp = nom
# nom = prenom
# prenom = tmp

# Echanger nom et prenom avec l'affectation sur les paires
(prenom, nom) = (nom, prenom)

print(prenom, nom)

#############
# Exercice 4
#############
# Madlib
def madlib():
   print("Let's play madlibs!")
   place=input("A place?: ")
   adj=input("An adjective?: ")
   verb=input("A verb?: ")
   animal=input("An animal?: ")
   print("The {} {} {} in {}.".format(adj, animal, verb, place))

#############
# Exercice 5
#############
# Les chaînes de caractères délimitées par trois guillemets simples
# peuvent contenir des passages à la ligne.
def tic_tac_toe():
    print(
        '''***
***
***'''
    )

#############
# Exercice 6
#############
# Jeu sur les conversions entre entiers et chaînes de caractères
# Notez bien la différence entre + appliquée à des entiers et à des chaînes
a = 90
b = "10"
c = "11"
d = 0
print(str(a) + str(int(b) + int(c)) + str(d))

#############
# Exercice 7
#############
def str_form():
    a = int (input("Donner un entier : "))
    n1 = int("{0}".format(a))
    n2 = int("{0}{0}".format(a))
    n3 = int("{0}{0}{0}".format(a))
    print(n1+n2+n3)

#############
# Exercice 8
#############
# Elever 2 à la puissance 38 s'écrit 2**38 en python.

#############
# Exercice 9
#############
def fahrenheit_to_celcius(f):
    return (f - 32) * 5 / 9

#############
# Exercice 10
#############
# L'opérateur ** est associatif à droite, donc 2**2**3 = 2**(2**3) = 2**8 = 256
# L'élévation à une puissance et la division sont prioritaires par rapport à l'addition et la soustraction
# donc la dernière expression est ((x ** 2) ** 3) + 6 - ((z / 4) * 2)
z = 2
z = z ** 2 ** 3
print(z)
x = 4
x = (x ** 2) ** 3 + 6 - z / 4 * 2
print(x)

#############
# Exercice 11
#############
# Voir https://en.wikipedia.org/wiki/Double-precision_floating-point_format
# Cette valeur est trop grande pour être représentable, elle est remplacée par l'infini
print(1.8e308)
# Cette valeur est trop petite pour être représentable, elle est remplacée par 0.0
print(1e-325)

#############
# Exercice 12
#############
import math
p = math.pi
if 22/7 < p :
    print("22/7 is less than π")
else:
    print("22/7 is greater or equal to π")
print("Relative error = " + str(100*math.fabs(22/7 - p)/p) + "%")

#############
# Exercice 13
#############
# Représentation décimale de 25
xxv_dec = str(25)
# Représentation binaire de 25
xxv_bin = bin(25)
# Représentation octale de 25
xxv_oct = oct(25)
# Représentation hexadécimale de 25
xxv_hex = hex(25)
# Affichage des différentes représentations
print("dec: {}, bin: {}, oct: {}, hex: {}".format(xxv_dec, xxv_bin, xxv_oct, xxv_hex))
# Comparaison des différentes valeurs (le 2e argument de int() donne la base dans laquelle est écrit le nombre
print(xxv_dec == int(xxv_bin,2) and xxv_dec == int(xxv_oct, 8) and xxv_dec == int(xxv_hex, 16))

#############
# Exercice 14
#############
# Attention : input() rend une chaîne de caractères. La comparaison de chaînes de caractères
# n'est pas la même chose que la comparaison d'entiers ("123" < "23", alors que 123 > 2), 
# il faut donc convertir les chaînes en entiers avant de faire la comparaison des valeurs saisies.
a = input("Donnez un nombre : ")
b = input("Donnez un nombre : ")
if type(a) is not int :
    print("la valeur saisie est de type {}.".format(type(a)))
    a = int(a)
if type(b) is not int :
    print("la valeur saisie est de type {}.".format(type(b)))
    b = int(b)
if a < b :
    print("Le maximum est {}.".format(b))
else:
    print("Le maximum est {}.".format(a))

#############
# Exercice 15
#############
# Pierre feuille ciseaux = Hi Fu Mi
import random
def Hifumi():
    options = ["Rock", "Paper", "Scissors"]
    while True :
        comp_choice = options[random.randint(0,2)]
        usr_choice = input("Your choice (R/P/S): ")
        usr_choice = usr_choice.upper()[0]
        if not usr_choice in ("R", "P", "S"):
            print("Goodbye!")
            break
        if usr_choice == comp_choice[0] :
            print("Tie")
        elif (comp_choice == "Rock" and usr_choice == "P")\
                or (comp_choice == "Paper" and usr_choice == "S")\
                or (comp_choice == "Scissors" and usr_choice == "R"):
            print("You win! (against " + comp_choice + ")")
        else:
            print("You loose! (against " + comp_choice + ")")

#############
# Exercice 16
#############
sum = 0
for n in range(1, 101) :
    sum += 1/(n*n)
print(sum)

# Nombre d'itérations nécessaires pour approcher π2/6 à 1e-6 près
sum = 0
k = 1
limit = math.pi**2/6
while math.fabs(sum - limit) > 1e-6 :
    sum += 1/(k*k)
    k += 1
print("Nb itérations pour la précision 1e-6 : {}".format(k))

#############
# Exercice 17
#############
# Ce programme affiche tous les entiers i inférieurs à n qui n'ont pas de diviseur compris entre 2 et i-1.
# Il affiche donc les nombres premiers inférieurs à n.
# Attention, le "else" se rapporte au "for", pas au "if". "print(i)" est donc exécuté 
# quand on sort naturellement du "for", pas quand on sort par le "break".
n = int ( input (" Donnez un nombre : "))
for i in range (2, n):
    for j in range (2, i):
        if i % j == 0:
            break
    else:
        print(i)

# Ce programme affiche tous les entiers compris entre 2 et n-1.
# Le "continue" ne sert à rien, la boucle for interne termine toujours normalement,
# donc la clause "else" est toujours exécutée.
n = int ( input (" Donnez un nombre : "))
for i in range (2, n):
    for j in range (2, i):
        if i % j == 0:
            continue
    else:
        print(i)

#############
# Exercice 18
#############
def fizz_buzz(n):
    for i in range(1,n):
        res = ""
        if i % 3 == 0 : # write "Fizz" for multiples of 3
            res = "Fizz"
        if i % 5 == 0 : # add "Buzz" for multiples of 5, so we have FizzBuzz for multiples of 3 and 5
            res += "Buzz"
        if len(res) == 0 : # if res is empty, just write the number
            res = str(i)
        print(res)

#############
# Exercice 19
#############
euler = 0
for i in range(1000) :
    if i % 3 == 0 or i % 5 == 0 :
        euler += i
print("Euler sum : " + str(euler))

#############
# Exercice 20
#############
def armstrong(n, p):
    sum = 0
    num = n
    while num != 0 :
        digit = num % 10
        sum += digit ** p
        num //= 10
    if n == sum :
        print("{} is an Armstrong number of order {}.".format(n, p))

#############
# Exercice 21
#############
# Python challenge 2 : http://www.pythonchallenge.com/pc/def/map.html
# Each alphabetic character is offset by two places: k becomes M, O becomes Q, E becomes G etc.
# We write a generic function that offsets the alphabetic characters of a string by a given offset
def decypher(str, offset):
    res = ''
    for l in str:
        # Look for alphabetic characters
        if (l >= 'a' and l <= 'z') or (l >= 'A' and l <= 'Z'):
            nc = ord(l) + offset     # ord() gives the code of a character
            # Check if we went beyond 'Z' and wrap down to 'A'
            if nc > ord('Z') and nc < ord('a'):
                nc = nc - ord('Z') - 1 + ord('A')
            # Check if we went beyond 'z' and wrap down to 'a'
            if nc > ord('z'):
                nc = nc - ord('z') - 1 + ord('a')
            res+=chr(nc)    # chr() builds a character from a code
        else:
            res += l        # Non alphabetic characters are just appended to the result
    print(res)

# Another version, using the functions of the str class: isalpha(), isupper() etc.
def decypher2(string, offset):
    """
    Decode a string of text by offsetting each alphabetic caracter by offset positions
    Example:
        >>> decypher2("Abc def xyZ!", 2)
        'Cde fgh zaB!'
    """
    res = ''            # Initialize the decoded string
    for l in string:    # Handle each character in turn
        if l.isalpha():   # We decode only letters
            upper = l.isupper()  # Remember if it is an upper case letter
            l = l.lower()        # and take the lowercase version
            nc = ord(l) + offset # Add the offset to the code of the character
            if nc > ord('z'):    # If it went beyond 'z', loop back from 'a'
                nc = nc - ord('z') - 1 + ord('a')
            l = chr(nc)          # Get the character corresponding to the new code
            if upper:       # If we had an uppercase letter, switch back to upper case
                l = l.upper()
        res += l        # Add the decoded (or original) character to the result
    return res