Aller au contenu

Devoir surveillé 1, 2022

TODO (prof) relire les réponses

Types, conditions, base 2, boucle, circuits combinatoires & expressions booléennes

Durée : 1h

Matériel spécifique autorisé : aucun. Tout appareil de communication interdit.

Consignes générales

Ce sujet comporte 6 exercices indépendants. Chaque exercice est sur 5 points. La note finale est sur 20. Le barême de chaque exercice est donné à titre indicatif, il pourra être changé au moment de la correction.

SEULS LES 4 MEILLEURS EXERCICES SERONT PRIS EN COMPTE

Par conséquent, il vous est conseillé de choisir 4 exercices et de les faire, vous pouvez aborder plus d'exercices, mais seulement les 4 exercices les plus réussis seront comptés dans la note. Vous pouvez traiter les exercices dans l'ordre que vous souhaitez.

Dans les exercices demandant de produire ou de compléter du code, les erreurs de syntaxe mineures, comme par exemple l'oubli d'un :, sont pardonnées si le code reste compréhensible sans ambiguïté.

Le soin de votre copie, et en particulier du code que vous produirez, peut vous apporter un bonus sur la note totale allant jusqu'à un point.

Bien que le soin soit en bonus, vous n'êtes pas dispensés de soigner votre travail pour autant. Une réponse ou du code illisible seront comptés comme faux.

Sauf précision dans une question, il est interdit d'utiliser le mot clé import. Vous n'êtes pas obligé de créer une fonction main et un bloc if main, vous pouvez faire comme si vous écriviez le programme directement dans le fichier.

Vous pouvez répondre directement sur le document. Si vous utilisez des feuilles supplémentaires, pensez bien à préciser clairement le numéro de chaque exercice et de chaque question à laquelle vous répondrez sur les feuilles.

Exercice 1 : base 2 et hexadécimal

Quelques rappels :

puissance de 2 valeur décimale
\(2^0\) 1
\(2^1\) 2
\(2^2\) 4
\(2^3\) 8
\(2^4\) 16
\(2^5\) 32
\(2^6\) 64
\(2^7\) 128
\(2^8\) 256
puissance de 16 valeur décimale
\(16^0\) 1
\(16^1\) 16
\(16^2\) 256
\(16^3\) 4096
Nombre binaire valeur base 16
0001 1
1000 8
1001 9
1100 c
1101 d
1110 e
1111 f

Question 1 (1pt)

Que vaut \(10000110_2\) en base 10 ? Détaillez succintement votre calcul.

Solution

Ici par détaillez succintement, on entends mettre en lumière la décomposition du nombre en base 2 en une somme de puissances de 2.

\[ \begin{align} 10000110_2 &= 1 \times 2^7 + 1 \times 2^2 + 1 \times 2^1\\ &=128 + 4 + 2 \\ &=134 \end{align} \]

Question 2 (1,5pt)

Que vaut \(144_{10}\) en base 2 ? Précisez la méthode utilisée (divisions, soustractions, autre) et ses éventuelles étapes, par exemple sous forme d'un tableau.

Solution 1

Méthode des divisions successives

\(n\) quotient reste
144 72 0
72 36 0
36 18 0
18 9 0
9 4 1
4 2 0
2 1 0
1 0 1

Donc \(144_{10} = 10010000_2\)

Solution 2

Méthode des soustractions successives

\(n\) \(p\) exposant \(n - p\) mémoire
144 128 7 16 7
16 16 4 0 7, 4

Position76543210
Chiffre10010000

Donc \(144_{10} = 10010000_2\)

Solution 3

Même si elle n'était pas au programme, une décomposition en puissances de 2 était acceptée comme réponse.

\[ \begin{align} 144_{10} &= 2^7 + 2^4 &= 10010000_2 \end{align} \]

Question 3 (1pt)

Combien de bits sont nécessaires pour représenter \(125_{10}\) en base 2 ? Expliquez succintement votre raisonnement.

Solution 1

On encadre 125 par des puissances de 2 successives :

\[ 2^6 < 125_{10} < 2^7 \]

Il faut donc 7 bits

Solution 2

On convertis \(125_{10}\) en base 2, on trouve \(1111101_{2}\). Il faut donc 7 bits.

Question 4 (0,5pt)

Que vaut \(111011001001_{2}\) en base 16 ?

Solution

On coupe le nombre en paquets de 4 bits en partant de la droite, et on convertis directement.

\[ 111011001001_2 = ec9_{16} \]

Question 5 (1pt)

Expliquez en une phrase ou deux comment convertir un nombre de la base 10 à la base 16.

?? success "Solution" On convertis d'abord le nombre en base 2, puis de la base 2 à la base 16.

Exercice 2 : expressions booléennes et circuits combinatoires

Question 1 (1pt)

Dressez la table de vérité de l'expression booléenne suivante dans le tableau ci-dessous:

\[ a + b \]

Remarque : son équivalent en Python est :

a or b
\(a\) \(b\) \(a + b\)
0 0
0 1
1 0
1 1
Solution
\(a\) \(b\) \(a + b\)
0 0 0
0 1 1
1 0 1
1 1 1

Question 2 (1pt)

Dressez la table de vérité de l'expression booléenne suivante dans le tableau ci dessous :

\[ a \cdot b \]

Remarque : son équivalent en Python est :

a and b
\(a\) \(b\) \(a \cdot b\)
0 0
0 1
1 0
1 1
Solution
\(a\) \(b\) \(a \cdot b\)
0 0 0
0 1 0
1 0 0
1 1 1

Question 3 (2pt)

Dressez la table de vérité de l'expression booléenne suivante dans le tableau ci-dessous.

\[ a \cdot (b + c) \]

Remarque : son équivalent en Python est :

a and (b or c)
\(a\) \(b\) \(c\) \(a \cdot (b + c)\)
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Solution
\(a\) \(b\) \(c\) \(a \cdot (b + c)\)
0 0 0 0
0 0 1 0
0 1 0 0
0 1 1 0
1 0 0 0
1 0 1 1
1 1 0 1
1 1 1 1

Question 4 (1pt)

Proposez un circuit combinatoire qui implante l'expression vue à la question 3 à l'aide de portes AND et OR.

Solution

TODO completer ici

Exercice 3 : constructions conditionnelles : if, else, elif

Question 1 (1pt)

Qu'affiche le programme suivant ?

a = 19
if a < 19:
    print("Bonjour !")
if a >= 19:
    print("Bonsoir !")
Solution

Le programme affiche :

Bonsoir !

Question 2 (1pt)

Proposez une amélioration du code de la question 1 en utilisant un else. Expliquez votre choix succintement.

Solution
a = 19
if a < 19:
    print("Bonjour !")
else:
    print("Bonsoir !")

Les deux if étaient utilisés pour tester des conditions liées. Utiliser un else à la place du second if permet d'exprimer ce lien. Celà allège aussi le code, ce qui le rends plus facile à lire.

Question 3 (3pt)

Ecrivez un programme qui :

  • Demande l'heure à l'utilisateur sous forme d'un nombre entier.
  • Si l'utilisateur donne une heure inférieure où égale à 18, le programme affiche Bonjour !
  • Si l'utilisateur donne une heure supérieure où égale à 20 et inférieure strictement à 24, le programme affiche Bonsoir !
  • Si l'utilisateur donne une heure strictement comprise entre 18 et 20, ou supérieure à 24, le programme affiche Bonjoir !

Exemple trace 1 :

Quelle heure est il ? : 18
Bonjour ! 

Exemple trace 2 :

Quelle heure est il ? : 20
Bonsoir ! 

Exemple trace 3 :

Quelle heure est il ? : 19
Bonjoir ! 
Solution

Il fallait utiliser un if...elif...else la moitié des points portait sur l'utilisation de ce type de structure, et l'autre motité concernait la correction du programme (est-ce que le programme marche).

h = int(input("Quelle heure est il ? : "))
if h < 18 
    print("Bonjour !")
elif 20 <= 24:
    print("Bonsoir !")
else:
    print("Bonjoir !")

Exercice 4 : types et opérations

Dans cet exercice, certaines opérations peuvent générer des erreurs. Quand il vous est demandé de dire quel est le type ou le résultat d'une opération, si l'opération génère une erreur, il vous est demandé de préciser que l'opération génère une erreur au lieu de donner le résultat, et d'expliquer succintement pourquoi.

Question 1 (1pt)

Pour chaque variable a, b, c, et d dans le code suivant, donnez le type de la valeur qu'elle contient à la fin de l'exécution du code :

a = 1
b = 1.0
c = True
d = "1"
e = int("1")
variable type
a
b
c
d
e
Solution 1

Un mix des solutions 1 et 2 était accepté

variable type
a int
b float
c bool
d str
e int
Solution 2

Un mix des solutions 1 et 2 était accepté

variable type
a entier
b réel (ou flottant)
c booléen
d chaîne (de caractère)
e entier

Question 2 (1pt)

Donnez le type et le résultat de l'opération suivante :

10 // 2
Solution

Résultat : 5

Type : int (ou entier)

Question 3 (1pt)

Donnez le type et le résultat de l'opération suivante :

10 / 2
Solution

Résultat : 5.0

Type : float (ou réel)

Question 4 (1pt)

Donnez le type et le résultat de l'opération suivante :

"10.0" * "2"
Solution

Cette opération génère une erreur, pace que l'opérateur ne permet pas de multiplier deux str (chaînes) entre elles.

Question 5 (1pt)

Donnez le type et le résultat de l'opération suivante :

"1" * 5
Solution

Résultat : 11111

Type : str (ou chaîne)

Exercice 5 : fonctions en Python

Question 1 (1pt)

Qu'affiche le programme suivant ?

def fonction(a):
    a = a + 1
    print("a dans fonction vaut " + str(a))

a = 0 
fonction(a)
print("a en dehors de fonction vaut " + str(a))
Solution

Le programme suivant affiche :

a dans fonction vaut 1
a en dehors de fonction vaut 0

Question 2 (2pt)

Implantez la fonction suivante. Ajoutez des assertions si nécessaire.

def trois_positifs(a, b, c):
    """a, b et c des entiers, c > 1
    retourne True si a + b + c est supérieur à 0, False sinon.
    """
Solution 1

Ceci est la solution attendue de la part d'un lycéen. Une inégalité stricte est aussi acceptée.

def trois_positifs(a, b, c):
    """a, b et c des entiers, c > 1
    retourne True si a + b + c est supérieur à 0, False sinon.
    """
    assert c > 1, "Valeur de c invalide !"

    if a + b + c >= 1:
        return True
    else:
        return False

On pouvait aussi faire plus concis :

def trois_positifs(a, b, c):
    """a, b et c des entiers, c > 1
    retourne True si a + b + c est supérieur à 0, False sinon.
    """
    assert c > 1, "Valeur de c invalide !"

    return a + b + c >= 1
Solution 2

Ceci est une solution plus concise et qui exploite la précondition, mais qui ne peut être exigée d'un lycéen. Comme c est toujours supérieur strictement à 1 (égal a 2 ou plus), si a + b est strictement supérieur à -2, a + b + c est supérieur ou égal à 0. De la même manière un une égalité stricte serait acceptée.

def trois_positifs(a, b, c):
    """a, b et c des entiers, c > 1
    retourne True si a + b + c est supérieur à 0, False sinon.
    """
    assert c > 1, "Valeur de c invalide !"
    # a + b + c >= 0 avec c > 1
    return a + b >= -2

Question 3 (2pt)

Proposez une spécification pour une fonction format_nom qui :

  • prends en entrée un nom et un prénom ne contenant que des lettres et sans espaces
  • retourne une chaine représentant le nom et le prénom mis bout à bout et séparés par un espace, avec le nom écrit tout en majuscules et le prénom commençant par une majuscule

Par exemple, si on lui donne bertoni et felix, la fonction retourne BERTONI Felix.

Il ne vous est pas demandé d'implanter la fonction.

def format_nom(nom, prenom):
Solution

Il fallait plus ou moins recopier la description et l'exemple dans la docstring

def format_nom(nom, prenom):
    """nom, prenom des chaînes ne contenant que des lettres et sans espace

    retourne une chaine représentant le nom et le prénom séparés par un espace, avec le nom écrit tout en majuscules, et le prénom commençant par une majuscule

    Exemple
    format_nom("bertoni", "felix") retourne "BERTONI Felix"
    """
    pass

Exercice 6 : construction itérative : while

Question 1 (1pt)

Qu'affiche le programme suivant ?

i = 0
while i < 10:
    print(i)
    i = i + 1
Solution

La fonction affiche :

0
1
2
3
4
5
6
7
8
9

Question 2 (1,5pt)

Ecrivez un programme qui redemande un mot de passe à l'utilisateur tant que le mot de passe n'est pas Je prefere la SVT, puis affiche Bonjour ! une fois que le bon mot de passe est rentré.

Exemple de trace :

Mot de passe ? 123456
Mot de passe ? azerty
Mot de passe ? Je prefere la SVT
Bonjour !
Solution 1

Les codes utilisant d'autres méthodes qu'une boucle while, mais produisant un résultat correct sont aussi acceptés

mdp = input("Mot de passe ? ")
while mdp != "Je prefere la SVT":
    mdp = input("Mot de passe ? ")
print("Bonjour !")
Solution 2

Les codes utilisant d'autres méthodes qu'une boucle while, mais produisant un résultat correct sont aussi acceptés

mdp = ""
while mdp != "Je prefere la SVT":
    mdp = input("Mot de passe ? ")
print("Bonjour !")

Question 3 (2,5pt)

On veut améliorer notre programme éviter qu'un robot puisse "hacker" le compte, en ajoutant une question de captcha.

Ecrivez un programme qui demande à l'utilisateur si il est un robot tant qu'il répond oui, puis lui demande le mot de passe, et retourne à l'étape du test du robot si l'utilisateur ne réponds pas Je prefere la SVT.

Exemple de trace :

Etes-vous un robot ? oui
Etes-vous un robot ? non
Mot de passe ? 123456
Etes-vous un robot ? oui
Etes-vous un robot ? non
Mot de passe ? azerty
Etes-vous un robot ? non
Mot de passe ? Je prefere la SVT
Bonjour !
Solution 1

Les codes utilisant d'autres méthodes que des boucles while, mais produisant un résultat correct sont aussi acceptés

Cet exercice était relativement difficile, donc la notation était bienveillante.

captcha = input("Etes-vous un robot ? ")
mdp = ""
while mdp != "Je prefere la SVT":
    while captcha != "non":
        captcha = input("Etes-vous un robot ? ")
    mdp = input("Mot de passe ? ")
print("Bonjour !")
Solution 2
mdp = ""
while mdp != "Je prefere la SVT":
    captcha = ""
    while captcha != "non":
        captcha = input("Etes-vous un robot ? ")
    mdp = input("Mot de passe ? ")
print("Bonjour !")