Imprimer
Catégorie : Programmation Python - 2nde SNT
Affichages : 6528

A la quête des nombres triangulaires

Présentation des nombres triangulaires

Vous connaissez les nombres triangulaires ? Et bien pas moi, mais sur internet je vois ceci :

et je lis cela :

Le nombre triangulaire de rang n est la somme des nombres entiers de 1 à n.

Source: https://fr.wikipedia.org/.

Analyse

Donc je comprends que si T représente un nombre Triangulaire et si l’indice 2 représente le second nombre triangulaire alors T₂ = 3 car le second nombre triangulaire contient 3 billes.

La logique est donc celle-ci:

Et si je dispose de 15 billes, alors je peux créer les 3 premiers nombres triangulaires:

T₁ = 1
T₂ = 3
T₃ = 6

soit 1+3+6=10 billes et il m’en restera 5 dans mon sac car je n’en aurai pas assez pour construire le nombre triangulaire suivant, à savoir T₄ qui lui a besoin de 10 billes


Sujet de recherche

Créer un programme en python affichant tous les nombres triangulaires que je pourrai construire avec un sac de 1000 billes. En bonus, me dire combien il me restera de billes dans mon sac à la fin. En effet il est fortement probable qu'après avoir construit l'avant dernier nombre triangulaire il ne me reste pas assez de billes pour le triangulaire suivant!

J'ai l'idée d'utiliser un "Tant que ..."

La suite de l'article présente la résolution du problème par essai-erreur. Cette méthode existe ! Wikipedia - Méthode essai-erreur

Conseil:
Pour vous étonner vous-même, je vous conseille de lire cet article étape par étape, de visualiser, de tester le script puis d'essayer de l'améliorer en tenant compte des conseils. Ne passez pas trop vite à l'étape suivante pour voir la solution.

 


Etape 1 – script sans boucle calculant T₁ etT₂

Visualisation mentale

Pour les 2 premiers nombres triangulaires j’ai besoin d’au moins 4 billes dans mon sac.

Visualisation du script

C’est le début qui est dur. Après quelques essais je vous propose ceci:

Script

# initialisation variables
sac=6
b=0
t=0
p=0
# je cree T1
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T2
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)

Console

>>> %Run Triangulaire.py
1 1 5 
2 3 2

Compréhension du script

Je passe sur l’initialisation des variables

Compréhension du shell

Amélioration - Poursuite du questionnement

=> Compléter ce script pour confirmer sa logique en calculant le nombre de billes nécessaires pour le 3ème nombre triangulaire.


Etape 2 – Test du script avec T₃

Evidemment cela ne marche pas ! Enfin si mais j’ai un problème de sac ! Pour preuve le script du dessous fonctionne mais les résultats du shell pour la dernière ligne posent problème.

Script

# initialisation variables
sac=6
b=0
t=0
p=0
# je cree T1
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T2
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)
# je cree T3
p=p+1
t=t+p
sac=sac-t
print(p,t,sac)

Console

>>> %Run Triangulaire.py
1 1 5
2 3 2
3 6 -4

Compréhension du script

Amélioration du script

=> Créer une boucle Tant que j'ai des billes et réduisez le nombre de lignes de votre script!


Etape 3 – Création de la boucle bornée

Voici ma proposition, le tant que teste le contenu de mon sac. Il s'insère au dessus du code répétitif et le contenu devant être dans la boucle est indenté. Tant que = while correspond à une boucle non-bornée.

Script

# initialisation variables
sac=6
b=0
t=0
p=0
# je cree la boucle
while sac >=0:
    p=p+1
    t=t+p
    sac=sac-t
    print(p,t,sac)

 Console

>>> %Run Triangulaire.py
1 1 5
2 3 2
3 6 -4

Compréhension du script

Amélioration du script

 => Calculer en fin de boucle le nombre de billes pour le prochain triangulaire et servez-vous en comme limite dans la boucle.


Etape 4 – Vers la solution

Le script du dessous est presque logique! Sauf que Python est un langage interprété ligne par ligne (Pour plus d'info voir ici) donc il va mettre 6 dans sac - 0 dans b puis t puis p - prendre la valeur de sac (donc 6) et se demander si cette valeur est supérieure ou égale à bpc et bpc est une variable qu'il ne connaît pas puisqu'elle n'est calculée que tout en bas!!!

Script

# initialisation variables
sac=6
b=0
t=0
p=0
# je cree la boucle
while sac >=bpc:
    p=p+1
    t=t+p
    sac=sac-t
    print(p,t,sac)
    bpc=t+p+1

Console

>>> %Run Triangulaire.py
Traceback (most recent call last):
  File "C:\Users\Pierre\Downloads\Triangulaire.py", line 7, in <module>
    while sac >=bpc:
NameError: name 'bpc' is not defined

Compréhension du script et du problème

Script corrigé et déclaration d'un sac de 21 billes

# initialisation variables
sac=21
b=0
t=0
p=0
bpc=0
# je cree la boucle
while sac >=bpc:
    p=p+1
    t=t+p
    sac=sac-t
    print(p,t,sac)
    bpc=t+p+1

Console

>>> %Run Triangulaire.py
1 1 20
2 3 17
3 6 11
4 10 1

Amélioration du script

=> Modifier l'affichage pour qu'il devienne compréhensible en ajouter un peu de texte et en profiter pour permettre à l'utilisateur de saisir la valeur de son sac (car tout le monde ne possède pas 1000 billes ;). 


Amélioration de l’affichage

Fin de la recherche. La vie est belle.

Avec 1000 billes, vous pouvez construire 17 nombres triangulaires et dans votre sac il vous restera 31 billes à la fin car vous en aurez utilisé 969 !!!

Vous noterez la présence d'une nouvelle variable: u afin de pouvoir compter les billes consommées ;)

Script

# initialisation variables
sac=int(input("Saisir le nombre de billes dans votre sac? "))
b=0
t=0
p=0
bpc=0
u=0
# je cree la boucle
while sac >=bpc:
    p=p+1
    t=t+p
    u=u+t
    sac=sac-t
    print("n°=",p,"Nbre triangulaire=",t,"Billes restantes=",sac,"Billes consommées=",u)
    bpc=t+p+1

Console, avec un sac de 1000 billes

>>> %Run Triangulaire.py
Saisir le nombre de billes dans votre sac? 1000
n°= 1 Nbre triangulaire= 1 Billes restantes= 999 Billes consommées= 1
n°= 2 Nbre triangulaire= 3 Billes restantes= 996 Billes consommées= 4
n°= 3 Nbre triangulaire= 6 Billes restantes= 990 Billes consommées= 10
n°= 4 Nbre triangulaire= 10 Billes restantes= 980 Billes consommées= 20
n°= 5 Nbre triangulaire= 15 Billes restantes= 965 Billes consommées= 35
n°= 6 Nbre triangulaire= 21 Billes restantes= 944 Billes consommées= 56
n°= 7 Nbre triangulaire= 28 Billes restantes= 916 Billes consommées= 84
n°= 8 Nbre triangulaire= 36 Billes restantes= 880 Billes consommées= 120
n°= 9 Nbre triangulaire= 45 Billes restantes= 835 Billes consommées= 165
n°= 10 Nbre triangulaire= 55 Billes restantes= 780 Billes consommées= 220
n°= 11 Nbre triangulaire= 66 Billes restantes= 714 Billes consommées= 286
n°= 12 Nbre triangulaire= 78 Billes restantes= 636 Billes consommées= 364
n°= 13 Nbre triangulaire= 91 Billes restantes= 545 Billes consommées= 455
n°= 14 Nbre triangulaire= 105 Billes restantes= 440 Billes consommées= 560
n°= 15 Nbre triangulaire= 120 Billes restantes= 320 Billes consommées= 680
n°= 16 Nbre triangulaire= 136 Billes restantes= 184 Billes consommées= 816
n°= 17 Nbre triangulaire= 153 Billes restantes= 31 Billes consommées= 969

 

Comme je suis curieux et pour aller plus loin:

Vous avez remarquez, les nombres triangulaires semblent être impair-impair puis pair-pair... bizarre, bizarre comme c'est bizarre ;) 

Saisir le nombre de billes dans votre sac? 1000
n°= 1 Nbre triangulaire= 1 (impair)
n°= 2 Nbre triangulaire= 3 (impair)
n°= 3 Nbre triangulaire= 6 (pair)
n°= 4 Nbre triangulaire= 10 (pair)
...

 Et si votre curiosité est insatiable et/ou si vous aimez regarder le vol des oiseaux alors faites un saut ici: http://www.recreomath.qc.ca/dict_triangulaire_nombre.htm

 

Pièce(s) jointe(s)
Download this file (Nombre triangulaire.odt)Nombre triangulaire.odt[ ]81 kB