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.
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 |
Position | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Chiffre | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
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.
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 :
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.
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:
Remarque : son équivalent en Python est :
\(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 :
Remarque : son équivalent en Python est :
\(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.
Remarque : son équivalent en Python est :
\(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 ?
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
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 :
Exemple trace 2 :
Exemple trace 3 :
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).
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 :
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 :
Solution
Résultat : 5
Type : int
(ou entier)
Question 3 (1pt)
Donnez le type et le résultat de l'opération suivante :
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 :
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 :
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))
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 :
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.
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.
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 ?
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 :
Solution 1
Les codes utilisant d'autres méthodes qu'une boucle while, mais produisant un résultat correct sont aussi acceptés
Solution 2
Les codes utilisant d'autres méthodes qu'une boucle while, mais produisant un résultat correct sont aussi acceptés
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.