Skip to content

NSI - Première - Constructions élémentaires en python

Travail demandé

Partie 1: utiliser des structures répétitives (boucles bornées)

Les boucles bornées sont utilisées pour répéter un certain nombre de fois un ensemble d'instructions.
Vous trouverez dans la partie ressources les différentes formes d'écriture des boucles bornées.

Exercice 1

  • boucle bornée for ... in range(...) :

On dispose d'une grille composée de 5 lignes et 5 colonnes:

pb affichage

Les 5 lignes sont repérées A, B, C, D, E, F.
Les 5 colonnes sont repérées 0, 1, 2, 3, 4.
Vous disposez d'une fonction deplacer(ligne,colonne) qui permet de déplacer le rond rouge dans la case correspondante à la ligne et la colonne passées en arguments.
Exemple : deplacer(A,1) place le rond rouge dans la case ligne = A et colonne = 1
Remarque: ligne = A <=> ligne = 0, A est une variable déclarée A = 0 et écrire deplacer(A,1) <=> deplacer(0,1) , voici le résultat obtenu:

pb affichage

Vous disposez d'un programme python appelée app.py avec la grille ( vous devez télécharger le dossier zip qui contient les codes de cette activité en cliquant ici et le décompresser sur le bureau de l'ordinateur). Demander de l'aide au prof si nécessaire.

Ouvrir le dossier décompressé, puis ouvrir le fichier "app.py" avec l'éditeur python "thonny" et exécuter le programme.

Question

  • Ajouter les deux arguments de "range" dans la zone de saisie du code (partie droite) du fichier app.py pour déplacer le cercle rouge en parcourant les cases A1, A2, A3 et A4.

  • Cliquer sur le bouton Tester pour exécuter votre code.
  • Copier le code complété dans votre compte rendu comme réponse de la question 1.1.

Exercice 2

Ouvrir l'onglet exercice2, vous retrouvez à nouveau la grille et une zone de code avec un nouveau challenge: le rond rouge va devoir faire le tour de la grille.

Question

  • Compléter le code déjà présent puis ajouter les boucles nécessaires pour que le cercle rouge fasse le tour ( parcours: A1, A2, A3, A4, B4, C4, D4, E4, E3, E2, E1, E0, DO, C0, B0 et A0)
    Aide: pour parcourir de la colonne 4 à la colonne 0 en restant sur la même ligne, il faut utiliser une boucle décroissante qui donne à une variable de boucle "i" les valeurs 3, puis 2 puis 1 puis 0, exemple:

    # boucle for avec i de 3 inclus jusqu'à -1 exclu <=> plage [3, 0 ] avec un pas de -1
    for i in range(3,-1,-1)
        print(i)
    
  • Copier le code complété dans votre compte rendu comme réponse de la question 1.2.

Exercice 3

Ouvrir l'onglet exercice3, vous retrouvez à nouveau la grille et une zone de code avec un nouveau challenge: le rond rouge va devoir parcourir toutes les cases de la grille.

Question

  • Compléter le code présent pour que le cercle rouge parcoure toute les cases ( parcours: A1, A2, A3, A4, B4, B3, B2, B1, B0, C0, C1, C2, C3, C4, D4, D3, D2, etc.. jusqu'en E4)
    Aide: lorsque le rond est sur une ligne paire (lignes 0,2 et 4) <=> (lignes A, C et E) il doit aller de la colonne 0 jusqu'à la colonne 4: il faut une boucle croissante qui change de colonne; lorsque le rond est sur une ligne impaire ( lignes 1 et 3) <=> ( lignes B et D) il doit aller de la colonne 4 jusqu'à la colonne 0: il faut une boucle décroissante qui change de colonne. Le code utilise une boucle for i .. qui permet de changer de ligne. La valeur de la variable i permet de savoir à quelle ligne on se trouve. Il suffit de tester la valeur de i pour savoir si c'est une nombre pair ou impair. Si i est pair alors le reste de la division de i par 2 est égal à 0 , en python le reste de la division s'obtient avec l'opérateur modulo % , le reste de la division par 2 se code i%2. Le code à compléter:
# pour chaque ligne ( de i=0 jusqu'à i=4 )
for i in range(5):
    # si i est pair:
    if i.......:
        # parcourir colonnes de gauche à droite ( de j=0 jusqu'à j=4 )
        for j in range(5):
            # déplacer sur le ligne i et colonne j
            déplacer(i, j)
    # sinon 
    else:
        # parcourir colonnes de droite à gauche ( de j=4 jusqu'à j=0 )
        for j in range(..., ..., ...):
            déplacer(i, j)                       
  • Copier le code complété dans votre compte rendu word comme réponse de la question 1.3.

Partie 2: utiliser des structures répétitives (boucle non bornée while)

Un boucle non bornée while répète un ensemble d'instructions tant que (while) les conditions qui lui sont associées sont vraies. On utilise ce genre de boucle quand on ne sait pas à l'avance combien de tours de boucle il faut faire ( exemple: tant que l'utilisateur n'appuie pas sur la touche echap on exécute les instructions en boucle). Ici on va "détourner" le fonctionnement habituel de la boucle tant que parce que l'on saura à l'avance quand la boucle doit s'interrompre ( on va déplacer le rond rouge dans la grille)

Exercice 4

  • Boucle non bornée while:

Le but de cet exercice est le même que l'exercice 1, ouvrir l'onglet exercice 4, le cercle va devoir se déplacer sur la première ligne jusqu'en A4.

Question

  • Compléter la zone de code python proposée pour que le cercle rouge se déplace en parcourant les cases A1, A2, A3 et A4.

    # valeur initiale de la variable i ( condition de boucle)
    i = 1
    # tant que i est inférieur à ....
    while i < ...:
        # déplacer sur le ligne A  et colonne i
        déplacer(A, i)
        # incrémenter i ( augmenter de 1 la valeur de i)
        i=....        
    
  • Remarque: vous devez noter la différence avec la boucle for i in range(...), ici on doit définir la variable i et l'initialiser avec i=1, puis on teste la valeur de i avec while i <... et on incrémente la valeur de i dans la boucle while. Dans une boucle for i in range(...) tout semble géré automatiquement.

Partie 3: gestion des caractères en python

La partie ressources vous rappelle les notions à connaitre pour manipuler des caractères.

Exercice 5

Ouvrir l'onglet exercice 5. Vous disposez d'un code python prêt à l'emploi dans la zone de code (à droite) et une zone d'affichage ( à gauche) où vont s'afficher les résultats. Le bouton Exécuter code permet de tester le programme. Le bouton Effacer la console permet d'effacer les résultats précédents de la console d'afficage si nécessaire.

Question 5.1

  • a.Tester le code présent en saisissant votre nom lors de l'apparition de la boite de dialogue puis expliquer sur votre compte rendu ce que vaut la variable c à chaque itération de la boucle (for c in nom) ainsi qu'à chaque itération de la boucle (for c in range(len(nom))).
    Aide: si vous ne comprenez pas ce que vaut c à chaque itération remplacer dans chaque boucle l'instruction à répéter print(c, end="") par celle-ci: print(c) et tester, vous aurez la valeur de c, à chaque itération, sur chaque ligne de la console.

  • b.Modifier l'instruction print(c, end="") de la boucle for c in range(len(nom)) pour obtenir le même affichage à l'écran qu'avec la première boucle (en utilisant la valeur de variable c produite par range dans le print pour obtenir un caractère).
    Exemple de résultat d'affichage:

pb affichage

  • Copier le code complété dans votre compte rendu comme réponse de la question 5.1b.

Question 5.2

  • Effacer le code précédent sauf la première ligne de code ( voir image ci-dessous), saisir le code qui permettra de n'afficher que les 3 premières lettres du nom que vous allez saisir dans le input ( voir la partie ressources pour la construction de sous-chaines):

  • Copier le code complété dans votre compte rendu comme réponse de la question 5.2

Exemple de résultat attendu:

pb affichage

Les fonctions

Vous allez maintenant analyser et concevoir des fonctions. On conservera l'onglet de l'exercice 5 pour les tests du code. On vous donne le code d'une fonction qui a pour but de décorer le nom saisi dans un input:

# définition de la fonction decore qui prend en argument la variable nom
def decore(nom):
    # création de la variable nouveau
    # assignéé à une chaine vide 
    nouveau = ""
    # pour i dans la plage 0 à nombre de caractères dans nom (exclu)
    for i in range (len(nom)):
        # concaténer le caractère de nom à l'indice i avec une étoile
        # et l'ajouter à l'ancien contenu de nouveau
        nouveau += "*" + nom[i]
    # après la boucle, renvoyer le contenu de nouveau
    return nouveau

# le programme principal qui utilise la fonction:    
lenom = input("Votre nom : ")
# appel de la fonction decore dans le print
print("nom décoré:", decore(lenom) )          

Question 5.3

  • a.Copier-coller le code python dans la zone de code puis le tester.
    Exemple:

    pb affichage

  • b.Modifier le code précédent pour mélanger deux mots.

Exemple d'affichage:

pb affichage

Aide: vous devez utiliser deux arguments pour la fonction decore(mot1, mot2) et il faut deux input pour récupérer la valeur des deux mots. Etant donnée que le mot1 et le mot2 n'ont pas forcément la même longueur, on met le nombre d'itérations dans range de la boucle "for i in range(len(mot1))" basé sur le nombre de caractères du mot1 et on concatène chaque caractère de mot1 et de mot2 ainsi:
mot1[i] + mot2[i%(len(mot2))]
Explication: A chaque itération i, mot1[i] représente le caractère à la position i de mot1, voir exemple plus bas.
l'instruction mot2[i%(len(mot2))] permet également de sélectionner le caractère d'indice i de mot2 mais uniquement s'il existe sinon après avoir atteint le dernier caractère on recommence au premier caractère de mot2, dans l'exemple de l'image ci-dessus mot1 = "Bonjour" ( 7 caractères) et mot2="NSI" (3 caractères); pour l'itération i=3, mot1[3] vaut 'j' et mot2[3] vaudrait "out of range" (il n'existe pas) mais comme on code mot2[i%(len(mot2))] pour i=3 et avec len(mot2) = 3 ( 3 caractères dans NSI) on a mot2[i%(len(mot2))] = mot2[3%3] ( 3%3 demande le reste de la division entière de 3 par 3 ce qui vaut 0) soit mot2[3%3] = mot2[0] = 'N', ainsi mot2[i%(len(mot2))] est équivalent à avoir mot2="NSINSIN" soit 7 caractères comme le mot1 et le mélange peut se faire.

Exercice 6

Dans cette exercice vous allez coder en python le chiffrement appelé code de césar que vous avez déjà rencontré lors de l'activité 2.
On dispose d'un alphabet dont chaque caractère est inscrit dans un tableau assigné à la variable alphabet.
alphabet = ['a','b','c','d','e','é','è','ê','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
il y a len(alphabet) = 29 caractères dans le tableau, les 26 caractères de l'alphabet latin auquel on a ajouté les 3 caractères 'é', 'è' et 'ê'.
- alphabet[0] vaut 'a'.
- alphabet[28] vaut 'z'.
Pour pouvoir réaliser ce codage, il faut connaitre plusieurs concepts:

Concept 1 : le caractère est-il dans le tableau?

  • Si on veut savoir si un caractère est bien dans le tableau, on peut utiliser une structure de test:

                   if caractère in tableau:
    
  • Exemple: on veut savoir si le caractère 'è' est bien dans le tableau alphabet, on peut utiliser la structure de test
    if ... in ... :
    if 'è' in alphabet:
    le test serait évalué True, il y a bien le caractère 'è' dans le tableau alphabet.
    if '?' in alphabet:
    le test serait False, il n'y a pas le caractère '?' dans le tableau alphabet.

Une fois que l'on sait qu'un caractère est dans le tableau, on va chercher sa position (son indice) dans ce tableau. Pour ça on a besoin d'une fonction spéciale qui s'appplique à un objet tableau ( une fonction qui s'applique à un objet s'appelle une méthode )

Concept 2 : à quel emplacement est le caractère dans le tableau ?

  • Si on veut savoir à quel emplacement du tableau est le caractère 'f' (par exemple), on utilise la méthode index(..) qui prend en argument le caractère recherché et qui renvoie sa position dans le tableau.
    On applique une méthode à un objet ainsi: objet.méthode(argument).

Pour l'objet tableau assigné à alphabet, on code alphabet.index('f')
alphabet.index('f') vaut ici 8 ( la méthode index renvoie 8 la position de 'f' dans le tableau alphabet)

Le code de chiffrement doit utiliser le concept 1 suivi du concept 2:

# soit un tableau de caractères
alphabet = ['a','b','c','d','e','é','è','ê','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
# soit un texte à chiffrer
texte = "blablabla"
# pour chaque caractère du texte
for c in texte:
    # si le caractère est dans le tableau
    if c in alphabet:
        # on récupère sa position
        position = alphabet.index(c)

Concept 3 : chiffrer avec une clé de décalage

  • Pour réaliser le chiffrement, on utilise une clé qui représente de combien il faut se décaler dans le tableau pour obtenir le caractère de remplacement à celui que l'on veut chiffrer.

Par exemple, on peut définir la variable cle = 3 ce qui voudrait dire que chaque caractère est remplacé par celui qui est trois emplacements plus loin dans le tableau.

Ainsi un a est remplacé par un d, mais que faire si le caractère à remplacer est le z ? Avec cle = 3, on doit remplacer z par le caractère situé 3 positions au delà de z ce qui n'existe pas

On a le même problème que dans l'exercice précédent où vous mélangiez les deux mots, il faut recommencer au début quand on atteint la fin du tableau. Pour ça on utilisera encore l'opérateur modulo (%).

Pour le caractère représenté par la variable c situé à position dans alphabet avec un décalage contenu dans la variable cle, on doit décaler de :

              alphabet[(position+cle)%29]

Voici l'évolution du code python:

# soit un tableau de caractères
alphabet = ['a','b','c','d','e','é','è','ê','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
# soit un texte à chiffrer
texte = "blablabla"
# la clé de chiffrement ici 3
cle = 3
# pour chaque caractère du texte
for c in texte:
    # si le caractère est dans le tableau
    if c in alphabet:
        # on récupère sa position
        position = alphabet.index(c)
        # on decale de position + cle modulo 29
        nouveau_caractère = alphabet[(position+cle)%29]
    # sinon ( caractère pas dans alphabet)
    else:
        # on ne décale pas
        nouveau_caractère = c

Question:

  • Ouvrir l'onglet 6, vous disposer d'un logiciel de chiffrement/déchiffrement.

Pour chiffrer on utilise la fonction chiffrer(message, cle, alphabet) qui prend 3 arguments: la variable message contient le texte à chiffrer que vous avez saisi dans la zone texte à chiffrer, la variable cle qui contient la valeur du décalage que vous avez saisi dans la zone Clé à gauche (par défaut 3) et la variable alphabet qui contient le tableau de caractères chiffrables décrit précédemment.

  • Compléter la fonction chiffrement pour ajouter chaque caractère de message dans la variable resultat après décalage
    Remarque: vous devez effacer le mot clé pass et le remplacer par votre code ( vous devez vous inspirer de tous les codes vus précédemment)

  • Compléter la fonction dechiffrement qui permet de déchiffrer une texte chiffré associé à la variable message
    Remarque: vous devez effacer le mot clé pass et le remplacer par votre code.