NSI Sujets 11-20

Identification

Infoforall

Sujets 11-20 de l'épreuve pratique


La NSI comporte deux épreuves en Terminale :

  1. Une épreuve théorique de 3h30 sur table notée sur 12 et comportant un choix de 5 exercices. Après lecture rapide des exercices (30 minutes au maximum), il vous restera 3h pour en réaliser 3, soit environ 1h par exercice. Chaque exercice est noté sur 4.
  2. Une épreuve pratique de 1h et notée sur 8 pendant laquelle vous aurez à programmer et à interagir avec l'examinateur. Il s'agit donc autant d'une épreuve de programmation qu'un oral. Les sujets sont connus à l'avance mais vous tirez le votre au sort juste avant l'épreuve. Chaque sujet comporte deux exercices :
    1. Un exercice de création pure où on vous demande de réaliser une fonction à partir des spécifications fournies (4 points)
    2. Un exercice guidé (4 points)

A l'heure actuelle, la banque de sujets comporte 30 sujets.

1 - Sujet 11

A - Thèmes

  • Convertion binaire par la méthode de la division par deux
  • Tableaux dynamiques (type list de Python avec les méthodes append() et reverse() ici)

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 11 version locale

C - Remarques sur le sujet

  • Version 2021 : l'exemple donné sur l'exercice 1 est faux mais cela se voit rapidement. Voici le bon exemple :
  • >>> conv_bin(9) ([1,0,0,1],4)

D - De l'aide ?

Si vous ne savez plus convertir en binaire avec la méthode de la division par deux, allez voir partie 4, entre la question 4 et la question 5, du premiers cours sur le binaire que vous avez fait en première.

Il suffit donc d'une boucle TANT QUE et on rajoute les restes à la fin d'un tableau dynamique.

Une fois qu'on a fini, il ne reste qu'à inverser les éléments dans le tableau, soit à la main, soit en utilisant la méthode reverse() qui modifie le tableau en place. Attention, cette méthode renvoie donc None.


Le principe du tri à bulles basé sur le maximum consiste à partir de la gauche et d'inverser la case actuelle avec la case à sa droite si la droite à droite est plus petite : de cette façon, on déplace progressivement les grandes valeurs vers la droite.

La plus grande va inévitablement se retrouver tout à droite.

On recommence ensuite en partant de l'indice 0 mais on ne va que jusqu'à l'avant-dernière...

Au bout de deux tours, les deux dernières cases contiennent donc les deux plus grandes valeurs.

L'animation de Wikipédia est assez parlante :

Sorting bubblesort anim
Simpsons contributor, CC BY-SA 3.0 Wikimedia Commons

La version numéro deux qu'on vous demande ensuite consiste à faire l'inverse : on déplace progressivement les minimums vers la gauche.

E - Correction

Evitez de la regarder avant d'avoir fini... : exo1 et exo2

2 - Sujet 12

Sujet traitant d'une partie du programme qui sera vue après mars : la recherche textuelle.

A - Thèmes

  • Recherche de maximum
  • Tableaux statiques (implémentés via le type list de Python)
  • Recherche textuelle

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 12 version locale

C - Remarques sur le sujet

Rien de particulier pour l'exercice 1.

L'exercice 2 n'est pas corrigé pour l'instant.

D - De l'aide ?

La seule difficulté vient du fait qu'il faut penser à mémoriser le maximum et la position du maximum.

Comme l'indice doit correspondre à la première occurrence, il faut faire attention à l'inégalité utilisée.


E - Correction

Evitez de la regarder avant d'avoir fini... : exo1

3 - Sujet 13

A - Thèmes

  • Tri par sélection (du minimum)
  • Tableaux statiques (implémentés via le type list de Python)
  • Algo de base

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 03 version locale

C - Remarques sur le sujet

Le tri par sélection (du minimum) revient à chercher le plus petit élément du tableau [0; fin] et le placer en [0]. Ensuite, on cherche dans un tableau réduit [1; fin] pour y trouver le prochain minimum et le placer en [1]...

Attention : le sujet demande de renvoyer un tableau trié, il faut donc en faire une copie et renvoyer la copie triée.

Fonctions d'interface : on rappelle que les fonctions print() et input() sont les deux fonctions d'interface entre la console et l'utilisateur.

  • print() permet de forcer l'affichage sur la console et
  • input() permet de récupérer ce que l'utilisateur tape (la finalisation de son entrée étant fournie par l'appui sur la touche ENTREE)

Le but ici est de faire un exercice rapide sur 30 minutes mais je vous rappelle que ces deux fonctions ne sont censées être situées que dans des fonctions bien identifiées comme "fonctions d'interface". Ces fonctions d'interface ne sont pas destinées (normalement) à traiter les données mais juste à les afficher et à les recevoir. Mais, en 30 minutes, difficile de demander un programme parfaitement structuré.

D - De l'aide ?

Le tri par sélection consiste à deux étapes fondamentales à faire en boucle sur un tableau de plus en plus petit.

  1. Chercher l'indice de la plus petite valeur du tableau entre la case 0 et la dernière case.
  2. Intervertir alors la case de la valeur maximale avec la case 0.

Il suffit alors de refaire les étapes 1-2 mais sur le tableau [1; fin], puis [2; fin]...

Commencer par créer une fonction qui cherche l'indice le plus petit entre les bornes debut et fin d'un tableau est une bonne chose.

Reste alors à faire une fonction qui intervertit deux cases dont on connait les indices.

Il ne reste alors plus qu'à faire cela sur tout le tableau.

Enfin, comme le sujet parle de renvoyer un tableau, il faudra faire le tri sur une copie du tableau et renvoyer la copie.


Pas grand chose à dire.

Il faut juste vous demander comment doit fonctionner le programme. C'est toute la difficulté du "programme à trou".

E - Correction

Evitez de la regarder avant d'avoir fini... : exo1 et exo2

4 - Sujet 14

A - Thèmes

  • Tableaux statiques (implémentés via le type list de Python) ou
  • Tableaux dynamiques (implémentés via le type list de Python) ou
  • Dictionnaire

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 14 version locale

C - Remarques sur le sujet

Rien de particulier pour l'exerice 1.

D - De l'aide ?

Pas de difficulté particulière. Comment on veut stocker les indices, il est plus facile d'utiliser une boucle FOR avec un range. Le programme est plus facile à réaliser avec un tableau dynamique et des append() mais on peut également le réaliser avec un tableau statique :

  • On crée un tableau temporaire qui a autant de cases que le tableau d'origine (au cas où l'élément se trouve dans toutes les cases)
  • On remplit les cases du tableau temporaire à chaque fois qu'on trouve la valeur
  • On renvoie une dernière copie où on se gère par compréhension que les cases non vides/

On ne récupère que le nom dans la fonction mais le dictionnaire est une variable-globale. On peut donc lire son adresse-référence sans aucun problème. Transmettre le dictionnaire aurait pu être plus adaptable mais là, c'est juste une variable globale.

Vous avez ici un dictionnaire-élèves dont les valeurs associées aux clés sont des dictionnaires-notes.

Les dictionnaires-notes ont des clés correspondant au nom de l'épreuve et dont la valeur associée est un tableau de deux éléments : l'indice 0 est la note et l'indice 1 est le coefficient.

Il faut se souvenir qu'un dictionnaire est un objet et qu'on peut l'explorer avec trois méthodes différentes :

  • La méthode keys() permet d'écrire des boucles où on récupère les clés une à une avec une ligne du type
    for valeur in dictionnaire.keys():
  • La méthode values() permet d'écrire des boucles où on récupère les valeurs associées aux clés une à une avec une ligne du type
    for valeur in dictionnaire.values():
  • La méthode items() permet d'écrire des boucles où on récupère les valeurs des clés et des valeurs via un tuple avec une ligne du type
    for (clé, valeur) in dictionnaire.items():

Pour résoudre ce code à trou, vous devez également savoir qu'on peut gérer les affectations multiples avec un tableau comme avec un tuple. Cela veut dire qu'on peut écrire les affectations suivantes, autant avec un tuple qu'avec un tableau :

>>> (a, b) = (5, 10) >>> a 5 >>> b 10 >>> c, d = (5, 10) >>> c 5 >>> d 10 >>> (e, f) = [5, 10] >>> e 5 >>> f 10

On peut donc simplement placer un tuple à gauche et récupérer ensuite son contenu :

>>> g = [5, 10] >>> g[0] 5 >>> g[1] 10

E - Correction

Evitez de la regarder avant d'avoir fini... : exo1 et exo2

5 - Sujet 15

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 15 version locale

6 - Sujet 16

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 16 version locale

7 - Sujet 17

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 17 version locale

8 - Sujet 18

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 18 version locale

9 - Sujet 19

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 19 version locale

10 - Sujet 20

B - Lien local vers le sujet

En cas de panne du site officiel : SUJET 20 version locale

Article publié le 27 10 2021
Dernière modification : 17 11 2021
Auteur : ows. h.