TD D2 : boucles inconditionnelles FOR¶

L'objectif de ce notebook est de revoir assez rapidement la notion de répétitions avec des boucles conditionnelles du type FOR..., ainsi que d'introduire une initiation à la notion de liste que l'on travaillera plus en détail plus tard.

On a déjà vu dans le TD précédent la structure universelle d'une boucle avec l'instruction WHILE. Dans le cas où l'on connait à l'avance le nombre de répétitions, les langages de programmations comme python ont introduit une syntaxe un peu plus courte : la boucle inconditionnelle. Sa structure en python est la suivante :

!!! note Boucle inconditionnelle

for i in iterable :
    bloc d'insctructions

!!!

Précisons un peu la notion d'itérable. Pour faire simple, c'est toute sorte d'objet dont python peut énumérer les composantes. Par exemple, essayer le code suivant:

In [ ]:
# exemples d'itérateurs avec la fonction range(...)

it1 = range(10) # range(10) est un "itérable" constitué des entiers de 0 à 9
it2 = range(3,10) # entiers de 3 à 9
it3 = range(3,10,2) # entiers de 3 à 9 de deux en deux

for i in it1:
    print(i)
    
for i in it2:
    print(i)

for i in it3:
    print(i)

!!! warning Attention

Même si techniquement en python c'est faisable, on s'interdira de modifier la valeur de la variable i à l'intérieur de la boucle. En effet cela nuit gravement à la lisibilité du code, à son debogage ainsi qu'à sa preuve.

!!!

!!! note Comment parcourir une liste ?

Rappel de deux façons pour parcourir une liste l=['pomme', 'raisin', 'kiwi']:

  1. La méthode "classique" utilisable dans la plupart des langages :

    for index in range(len(l)): # len(l) donne la longueur de la liste
        print(l[index])
    # affiche :
    # pomme
    # raisin
    # kiwi
    

    Noter la syntaxe l[index] qui permet d'accéder à l'élément de numéro index stocké dans la liste (avec une numérotation qui commence à 0)

  2. Si l'on n'a besoin que des valeurs (et pas des index):

    for element in l:
        print(element)   
    # affiche :
    # pomme
    # raisin
    # kiwi
    

!!!

Exemple¶

Dans le TDC1, on a écrit un programme qui décidait si une année était bissectile.

In [ ]:
annee = 2024

if (annee%4 == 0 and annee%100 != 0) or (annee%400 == 0) :
    print(f"{annee} est bissectile")
else :
    print(f"{annee} n'est pas bissectile")

Modifier ce programme de telle sorte qu'il détermine le nombre d'années bissectiles entre les années 1000 et 2100 inclues.

In [ ]:
mini = 1000
maxi = 2100

# à compléter

print(f"Il y a {à compléter} années bissectiles entre les années {mini} et {maxi}")

Exercice 1 : calcul d'une somme de nombres¶

Q1. Compléter le script suivant qui doit calculer la somme des 100 premiers entiers non nuls.

In [ ]:
somme = 0
for # ... à compléter ...
In [ ]:
 

Q2. Vous êtes à l'entraînement de fitness, et le coach vous demande de faire une "pyramide de 10 pompes" (c'est à dire 1+2+3+..+9+10+9+8+...+1). Combien de pompes cela représente-t-il au total ? Écrire un petit script qui permet de faire le calcul à votre place (Vous pouvez envisager plusieurs solutions...)

In [ ]:
# Nombre de pompes pour une pyramide de 10

Exercice 2 : calcul de la moyenne d'une liste¶

On tire aléatoirement et de façon uniforme 1000 notes comprises entre 0 et 20. Que pensez-vous de la moyenne de cette série ?

L'objectif de cet exercice est de simuler ce tirage et d'estimer la moyenne.

On rappelle comment obtenir des nombres aléatoires avec python :

from random import randint  # importe la fonction randint(...) depuis le module random
nb = randint(0,20) # nb contient un nombre entier aléatoire entre 0 et 20

Q3. Compléter le script suivant afin de construire une liste notes qui contient 1000 notes entières comprises entre 0 et 20.

In [ ]:
# script qui doit créer la liste 'notes'

from random import randint

# à compléter

Q4. Compléter la cellule suivante de façon à faire afficher la moyenne de la liste notes et confirmer ou pas votre intuition.

In [ ]:
# un script qui calcule la moyenne de la liste 'notes'

# à compléter...

Q5. Est-il facile de calculer la médiane de cette liste ? Si oui comment ? (ne pas hésiter à chercher des commandes dans le mémo ou demander à une IA !)

In [ ]:
# un script qui calcule la médiane de la liste 'notes' précédente

Exercice 3 : itérer sur une chaîne de caratcères¶

On considère pour cet exercice la chaine de caractère alphabet définie ci-dessous :

In [ ]:
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

Q6. Écrire un script qui affiche une lettre sur 2 (c'est à dire A puis C puis E etc...)

In [ ]:
# Une lettre sur deux

# à compléter...

Q7. Écrire un script que écrit les lettres dans l'autre sens (Z puis Y puis X etc...)

In [ ]:
# lettres en sens inverse

# à compléter...

Q8. Un peu plus dur... Écrire un script qui analyse le contenu de la variable mot ci-dessous et qui affiche palindromme si ce mot en est un (c'est à dire qu'il peut se lire à l'endroit ou à l'envers comme kayak)

In [ ]:
# palindromme ?

mot = "ressasser"

# à compléter

Exercice 4 : une drôle de façon de calculer des racines carrées ?!¶

Avez-vous déjà remarqué que $\sqrt{64}=8=6+4-2$ ? Ça marche aussi avec $\sqrt{25}=5=2+5-2$ !

Pensez-vous que cette technique fonctionne pour tous les carrés parfaits compris entre 1 et 99 ?

Essayons de répondre informatiquement à cette question moyennant quelques rappels :

  • Pour obtenir la racine carrée d'un nombre (square root en anglais):
from math import sqrt
print(sqrt(2)) # affiche racine carrée de 2
  • pour déterminer les dizaines et les unités d'un nombre entier entre 0 et 99 :
n = 28 # un exemple
dizaines = n // 10 # division entière de n par 10
unites = n % 10 # reste de la division de n par 10
  • pour tester si un nombre positif est entier on peut utiliser :
a == int(a) # vaut True si a est entier, False sinon

Q9. Écrire un script qui qui construit une liste carres contenant tous les entiers compris entre 1 et 100 qui sont des carrés parfaits.

In [ ]:
from math import sqrt

carres = [] # liste vide qui sera complétée grâce à une boucle

# à compléter

Q10. Écrire un script précédent dans la cellule suivante pour qu'il affiche les carrés parfaits qui vérifient la formule proposée

In [ ]:
# carrés parfaits vérifiant la formule

# à compléter

Q11. Essayer alors de trouver des nombres entre 100 et 999 pour lesquels une technique analogue fonctionnerait pour calculer $\sqrt[3]{\overline{abc}}$ (Tester par exemple si $\sqrt[3]{\overline{abc}}=a+b+c-3\ ?$

Pour obtenir la racine cubique en python on peut faire puissance 1/3 : n**(1/3)

In [ ]: