Aller au contenu

Problème – Évaluation ergonomique d'une chaise

Développer un programme Python qui évalue l’ergonomie d’une chaise en comparant les dimensions de la chaise aux mesures corporelles de l’utilisateur. Le programme utilise des données anthropométriques réelles issues de la base ANSUR (Anthropometric Survey of U.S. Army Personnel), référencée dans le guide KODAK (Ergonomic Design for People at Work).


Ce programme utilise deux fonctions intégrées de Python que tu n’as peut-être pas encore vues :

La fonction abs() retourne la valeur absolue d’un nombre (toujours positive).

>>> abs(5.3)
5.3
>>> abs(-5.3)
5.3
>>> abs(37.0 - 40.0)
3.0

C’est très utile pour calculer un écart entre deux mesures sans se soucier du signe.

La fonction round() arrondit un nombre à un certain nombre de décimales.

>>> round(3.14159, 2)
3.14
>>> round(36.875, 1)
36.9
>>> round(42.5)
42

Le deuxième argument indique le nombre de décimales souhaitées. Sans deuxième argument, Python arrondit à l’entier.


L’anthropométrie est la science qui mesure les dimensions du corps humain. En ergonomie, ces mesures servent à concevoir du mobilier, des équipements et des espaces de travail adaptés à la population.

Un percentile indique la position d’une mesure dans une population. Par exemple, si ta hauteur poplitée est au 50e percentile féminin, cela signifie que 50 % des femmes ont une hauteur poplitée inférieure ou égale à la tienne.

En ergonomie, on utilise couramment trois percentiles :

PercentileSignificationUtilisation
5ePetite stature — 95 % de la population est plus grandeHauteurs minimales (ex. : hauteur du siège)
50eStature moyenneValeur de référence
95eGrande stature — seulement 5 % de la population est plus grandeLargeurs et dégagements maximaux

Voici les mesures corporelles utilisées dans ce travail et leur lien avec les dimensions d’une chaise :

Mesure corporelleDescriptionDimension de la chaise
Hauteur poplitéeDistance du sol au creux du genou (assis)→ Hauteur du siège
Longueur fesse-poplitéDistance des fesses au creux du genou→ Profondeur du siège
Largeur des hanchesLargeur maximale des hanches (assis)→ Largeur du siège

Voici les données anthropométriques de référence utilisées dans ce TP. Toutes les mesures sont en centimètres.

Femmes :

Mesure5e percentile50e percentile95e percentile
Hauteur poplitée35.138.942.9
Longueur fesse-poplité44.048.152.8
Largeur des hanches30.834.238.2

Hommes :

Mesure5e percentile50e percentile95e percentile
Hauteur poplitée39.543.347.6
Longueur fesse-poplité45.850.054.6
Largeur des hanches31.034.137.7

Écris un programme ergonomie.py qui :

  1. Demande le sexe de l’utilisateur (F ou H)
  2. Demande sa hauteur poplitée en centimètres
  3. Classe cette mesure dans une catégorie de percentile : petit (≤ 5e), moyen (entre 5e et 95e) ou grand (≥ 95e)
  4. Affiche la catégorie et la hauteur de siège recommandée

Formule de la hauteur de siège recommandée :

hauteur_siege = hauteur_poplitee - 2.0

On soustrait 2 cm pour tenir compte de l’épaisseur de la chaussure et assurer un léger dégagement sous la cuisse.

Sexe (F/H) : F
Hauteur poplitée (cm) : 38.5
=== ANALYSE ===
Catégorie : moyenne (entre le 5e et le 95e percentile féminin)
Hauteur de siège recommandée : 36.5 cm
💡 Voir un indice

Utilise des variables pour stocker les seuils de percentiles selon le sexe, puis compare la mesure :

# 1. Récupérer les données (sexe, hauteur poplitée) requises.
# => Demander à l'utilisateur avec la fonction input()
# => N'oublie pas de convertir la hauteur en float!
# 2. Fixer la valeur des seuils (5e percentile et 95e percentile)
# selon le sexe ('F' ou 'H')
# => Utilise un if/elif pour choisir les bons seuils
# 3. Classifier la mesure en comparant la hauteur poplitée à chaque seuil.
# => Si <= seuil_p5 : petite stature
# => Si >= seuil_p95 : grande stature
# => Sinon : moyenne
# 4. Calculer la hauteur recommandée pour le siège en utilisant la formule.
# => N'oublie pas d'arrondir avec la fonction round()
# 5. Afficher le résultat de l'analyse
# -> Catégorie : ...
# -> Hauteur de siège recommandée : ...
🔑 Voir la solution complète
sexe = input("Sexe (F/H) : ")
poplitee = float(input("Hauteur poplitée (cm) : "))
# Seuils selon le sexe
if sexe == "F":
seuil_p5 = 35.1
seuil_p95 = 42.9
genre = "féminin"
elif sexe == "H":
seuil_p5 = 39.5
seuil_p95 = 47.6
genre = "masculin"
# Classification
if poplitee <= seuil_p5:
categorie = "petite stature (inférieure ou égale au 5e percentile " + genre + ")"
elif poplitee >= seuil_p95:
categorie = "grande stature (supérieure ou égale au 95e percentile " + genre + ")"
else:
categorie = "moyenne (entre le 5e et le 95e percentile " + genre + ")"
# Hauteur de siège recommandée
hauteur_siege = round(poplitee - 2.0, 1)
print()
print("=== ANALYSE ===")
print("Catégorie :", categorie)
print("Hauteur de siège recommandée :", hauteur_siege, "cm")

Modifie ton programme pour valider les entrées :

  • Le sexe doit être F ou H, sinon afficher une erreur
  • La hauteur poplitée doit être entre 25.0 et 60.0 cm (plage physiologiquement réaliste), sinon afficher une erreur
Sexe (F/H) : X
Erreur : sexe invalide. Entrez F ou H.
💡 Voir un indice

Valide le sexe d’abord, puis la mesure :

# 1. Récupérer le sexe
# 2. Valider le sexe
# => Si ce n'est ni 'F' ni 'H', afficher une erreur et arrêter là
# => Sinon, poursuivre le programme
# 3. Récupérer la hauteur poplitée
# 4. Valider la hauteur poplitée
# => Si elle est en dehors de la plage [25.0, 60.0], afficher une erreur
# => Sinon, continuer avec le code de la partie 1
🔑 Voir la solution complète
# ergonomie.py – Partie 2
sexe = input("Sexe (F/H) : ")
if sexe != "F" and sexe != "H":
print("Erreur : sexe invalide. Entrez F ou H.")
else:
poplitee = float(input("Hauteur poplitée (cm) : "))
if poplitee < 25.0 or poplitee > 60.0:
print("Erreur : la hauteur poplitée doit être entre 25.0 et 60.0 cm.")
else:
# Seuils selon le sexe
if sexe == "F":
seuil_p5 = 35.1
seuil_p95 = 42.9
genre = "féminin"
elif sexe == "H":
seuil_p5 = 39.5
seuil_p95 = 47.6
genre = "masculin"
# Classification
if poplitee <= seuil_p5:
categorie = "petite stature (inférieure ou égale au 5e percentile " + genre + ")"
elif poplitee >= seuil_p95:
categorie = "grande stature (supérieure ou égale au 95e percentile " + genre + ")"
else:
categorie = "moyenne (entre le 5e et le 95e percentile " + genre + ")"
# Hauteur de siège recommandée
hauteur_siege = round(poplitee - 2.0, 1)
print()
print("=== ANALYSE ===")
print("Catégorie :", categorie)
print("Hauteur de siège recommandée :", hauteur_siege, "cm")

Modifie ton programme pour demander les trois mesures corporelles et calculer les trois dimensions recommandées de la chaise.

  1. Demander le sexe
  2. Demander la hauteur poplitée, la longueur fesse-poplité et la largeur des hanches
  3. Valider chaque mesure (plages réalistes)
  4. Classifier chaque mesure en percentile
  5. Calculer et afficher les dimensions recommandées de la chaise

Formules :

Dimension de la chaiseFormuleExplication
Hauteur du siègepoplitée - 2.0Dégagement sous la cuisse
Profondeur du siègefesse_poplite - 5.0Éviter la pression derrière le genou
Largeur du siègehanches + 5.0Espace latéral de confort

Plages de validation :

MesureMinimumMaximum
Hauteur poplitée25.0 cm60.0 cm
Longueur fesse-poplité35.0 cm65.0 cm
Largeur des hanches25.0 cm50.0 cm
Sexe (F/H) : F
Hauteur poplitée (cm) : 37.0
Longueur fesse-poplité (cm) : 46.5
Largeur des hanches (cm) : 36.0
=== ANALYSE ANTHROPOMÉTRIQUE ===
Hauteur poplitée : 37.0 cm — moyenne
Longueur fesse-poplité : 46.5 cm — moyenne
Largeur des hanches : 36.0 cm — grande stature
=== DIMENSIONS RECOMMANDÉES ===
Hauteur du siège : 35.0 cm
Profondeur du siège : 41.5 cm
Largeur du siège : 41.0 cm
💡 Voir un indice

Réutilise la même logique de classification pour chaque mesure, avec les seuils correspondants :

# 1. Récupérer les données : sexe + 3 mesures corporelles
# => Hauteur poplitée, longueur fesse-poplité, largeur des hanches
# => Convertir chaque mesure en float
# 2. Valider chaque mesure (plages réalistes)
# => Utilise une variable "erreur" qui reste vide si tout est correct
# => Si une mesure est hors limites, on met le message d'erreur dedans
# => Astuce : utilise if/elif pour ne signaler que la première erreur
# 3. Si aucune erreur, fixer les seuils pour LES TROIS mesures selon le sexe
# => Chaque mesure a son propre couple (5e percentile, 95e percentile)
# => C'est la même logique que la partie 1, répétée 3 fois
# 4. Classifier CHAQUE mesure en comparant aux seuils correspondants
# => Même principe : <= p5, >= p95, ou moyenne
# 5. Calculer les 3 dimensions recommandées avec les formules
# => round() pour arrondir
# 6. Afficher l'analyse complète
# -> Chaque mesure avec sa catégorie
# -> Chaque dimension recommandée
🔑 Voir la solution complète
# ergonomie.py – Partie 3
sexe = input("Sexe (F/H) : ")
if sexe != "F" and sexe != "H":
print("Erreur : sexe invalide. Entrez F ou H.")
else:
poplitee = float(input("Hauteur poplitée (cm) : "))
fesse_poplite = float(input("Longueur fesse-poplité (cm) : "))
hanches = float(input("Largeur des hanches (cm) : "))
# Validation des mesures
erreur = ""
if poplitee < 25.0 or poplitee > 60.0:
erreur = "Erreur : hauteur poplitée hors limites (25.0 à 60.0 cm)."
elif fesse_poplite < 35.0 or fesse_poplite > 65.0:
erreur = "Erreur : longueur fesse-poplité hors limites (35.0 à 65.0 cm)."
elif hanches < 25.0 or hanches > 50.0:
erreur = "Erreur : largeur des hanches hors limites (25.0 à 50.0 cm)."
if erreur != "":
print(erreur)
else:
# Seuils selon le sexe
if sexe == "F":
pop_p5 = 35.1
pop_p95 = 42.9
fp_p5 = 44.0
fp_p95 = 52.8
h_p5 = 30.8
h_p95 = 38.2
elif sexe == "H":
pop_p5 = 39.5
pop_p95 = 47.6
fp_p5 = 45.8
fp_p95 = 54.6
h_p5 = 31.0
h_p95 = 37.7
# Classification — hauteur poplitée
if poplitee <= pop_p5:
cat_pop = "petite stature"
elif poplitee >= pop_p95:
cat_pop = "grande stature"
else:
cat_pop = "moyenne"
# Classification — longueur fesse-poplité
if fesse_poplite <= fp_p5:
cat_fp = "petite stature"
elif fesse_poplite >= fp_p95:
cat_fp = "grande stature"
else:
cat_fp = "moyenne"
# Classification — largeur des hanches
if hanches <= h_p5:
cat_h = "petite stature"
elif hanches >= h_p95:
cat_h = "grande stature"
else:
cat_h = "moyenne"
# Dimensions recommandées
hauteur_siege = round(poplitee - 2.0, 1)
profondeur_siege = round(fesse_poplite - 5.0, 1)
largeur_siege = round(hanches + 5.0, 1)
# Affichage
print()
print("=== ANALYSE ANTHROPOMÉTRIQUE ===")
print()
print("Hauteur poplitée :", poplitee, "cm —", cat_pop)
print("Longueur fesse-poplité :", fesse_poplite, "cm —", cat_fp)
print("Largeur des hanches :", hanches, "cm —", cat_h)
print()
print("=== DIMENSIONS RECOMMANDÉES ===")
print()
print("Hauteur du siège :", hauteur_siege, "cm")
print("Profondeur du siège :", profondeur_siege, "cm")
print("Largeur du siège :", largeur_siege, "cm")

Modifie ton programme pour demander aussi les dimensions réelles d’une chaise et évaluer si chaque dimension est adaptée, trop grande ou trop petite par rapport aux recommandations.

  1. Après les mesures corporelles, demander les dimensions de la chaise :
    • Hauteur du siège (cm)
    • Profondeur du siège (cm)
    • Largeur du siège (cm)
  2. Comparer chaque dimension de la chaise à la valeur recommandée
  3. Appliquer une tolérance de ± 2 cm pour considérer la dimension comme adaptée
  4. Afficher un verdict pour chaque dimension et un verdict global

Règles d’évaluation :

  • Si |dimension_chaise - dimension_recommandée| ≤ 2.0 → Adaptée
  • Si dimension_chaise < dimension_recommandée - 2.0 → Trop petite
  • Si dimension_chaise > dimension_recommandée + 2.0 → Trop grande

Verdict global :

  • Si les 3 dimensions sont adaptées → Chaise ergonomique
  • Si 1 ou 2 dimensions sont inadaptées → Chaise partiellement adaptée
  • Si les 3 dimensions sont inadaptées → Chaise non ergonomique
Sexe (F/H) : F
Hauteur poplitée (cm) : 38.9
Longueur fesse-poplité (cm) : 48.1
Largeur des hanches (cm) : 34.2
Hauteur du siège de la chaise (cm) : 37.0
Profondeur du siège de la chaise (cm) : 43.0
Largeur du siège de la chaise (cm) : 40.0
=== ANALYSE ANTHROPOMÉTRIQUE ===
Hauteur poplitée : 38.9 cm — moyenne
Longueur fesse-poplité : 48.1 cm — moyenne
Largeur des hanches : 34.2 cm — moyenne
=== ÉVALUATION DE LA CHAISE ===
Hauteur du siège : 37.0 cm (recommandé : 36.9 cm) → Adaptée
Profondeur du siège : 43.0 cm (recommandé : 43.1 cm) → Adaptée
Largeur du siège : 40.0 cm (recommandé : 39.2 cm) → Adaptée
Verdict : Chaise ergonomique
💡 Voir un indice

Pour calculer l’écart et déterminer le verdict de chaque dimension :

# 1. Reprendre tout le code de la partie 3
# (saisie, validation, seuils, classification, dimensions recommandées)
# 2. Après les mesures corporelles, demander les 3 dimensions de la chaise
# => Hauteur, profondeur, largeur du siège
# 3. Pour CHAQUE dimension, calculer l'écart avec abs()
# => ecart = abs(dimension_chaise - dimension_recommandee)
# 4. Pour CHAQUE dimension, déterminer le verdict :
# => Si ecart <= 2.0 : adaptée
# => Sinon, si la chaise est plus petite que la recommandation : trop petite
# => Sinon : trop grande
# 5. Compter le nombre de dimensions inadaptées
# => Utilise un compteur qu'on incrémente à chaque problème détecté
# => problemes = problemes + 1
# 6. Déterminer le verdict global selon le nombre de problèmes
# => 0 problème : ergonomique
# => 3 problèmes : non ergonomique
# => Sinon : partiellement adaptée
# 7. Afficher l'analyse + les verdicts + le verdict global
🔑 Voir la solution complète
# ergonomie.py – Partie 4
sexe = input("Sexe (F/H) : ")
if sexe != "F" and sexe != "H":
print("Erreur : sexe invalide. Entrez F ou H.")
else:
poplitee = float(input("Hauteur poplitée (cm) : "))
fesse_poplite = float(input("Longueur fesse-poplité (cm) : "))
hanches = float(input("Largeur des hanches (cm) : "))
# Validation
erreur = ""
if poplitee < 25.0 or poplitee > 60.0:
erreur = "Erreur : hauteur poplitée hors limites (25.0 à 60.0 cm)."
elif fesse_poplite < 35.0 or fesse_poplite > 65.0:
erreur = "Erreur : longueur fesse-poplité hors limites (35.0 à 65.0 cm)."
elif hanches < 25.0 or hanches > 50.0:
erreur = "Erreur : largeur des hanches hors limites (25.0 à 50.0 cm)."
if erreur != "":
print(erreur)
else:
print()
# Dimensions de la chaise
chaise_h = float(input("Hauteur du siège de la chaise (cm) : "))
chaise_p = float(input("Profondeur du siège de la chaise (cm) : "))
chaise_l = float(input("Largeur du siège de la chaise (cm) : "))
# Seuils selon le sexe
if sexe == "F":
pop_p5 = 35.1
pop_p95 = 42.9
fp_p5 = 44.0
fp_p95 = 52.8
h_p5 = 30.8
h_p95 = 38.2
elif sexe == "H":
pop_p5 = 39.5
pop_p95 = 47.6
fp_p5 = 45.8
fp_p95 = 54.6
h_p5 = 31.0
h_p95 = 37.7
# Classification — hauteur poplitée
if poplitee <= pop_p5:
cat_pop = "petite stature"
elif poplitee >= pop_p95:
cat_pop = "grande stature"
else:
cat_pop = "moyenne"
# Classification — longueur fesse-poplité
if fesse_poplite <= fp_p5:
cat_fp = "petite stature"
elif fesse_poplite >= fp_p95:
cat_fp = "grande stature"
else:
cat_fp = "moyenne"
# Classification — largeur des hanches
if hanches <= h_p5:
cat_h = "petite stature"
elif hanches >= h_p95:
cat_h = "grande stature"
else:
cat_h = "moyenne"
# Dimensions recommandées
rec_hauteur = round(poplitee - 2.0, 1)
rec_profondeur = round(fesse_poplite - 5.0, 1)
rec_largeur = round(hanches + 5.0, 1)
# Écarts (valeur absolue)
ecart_h = abs(chaise_h - rec_hauteur)
ecart_p = abs(chaise_p - rec_profondeur)
ecart_l = abs(chaise_l - rec_largeur)
# Verdicts individuels
problemes = 0
if ecart_h <= 2.0:
verdict_h = "Adaptée"
elif chaise_h < rec_hauteur:
verdict_h = "Trop petite"
problemes = problemes + 1
else:
verdict_h = "Trop grande"
problemes = problemes + 1
if ecart_p <= 2.0:
verdict_p = "Adaptée"
elif chaise_p < rec_profondeur:
verdict_p = "Trop petite"
problemes = problemes + 1
else:
verdict_p = "Trop grande"
problemes = problemes + 1
if ecart_l <= 2.0:
verdict_l = "Adaptée"
elif chaise_l < rec_largeur:
verdict_l = "Trop petite"
problemes = problemes + 1
else:
verdict_l = "Trop grande"
problemes = problemes + 1
# Verdict global
if problemes == 0:
verdict_global = "Chaise ergonomique"
elif problemes == 3:
verdict_global = "Chaise non ergonomique"
else:
verdict_global = "Chaise partiellement adaptée"
# Affichage
print()
print("=== ANALYSE ANTHROPOMÉTRIQUE ===")
print()
print("Hauteur poplitée :", poplitee, "cm —", cat_pop)
print("Longueur fesse-poplité :", fesse_poplite, "cm —", cat_fp)
print("Largeur des hanches :", hanches, "cm —", cat_h)
print()
print("=== ÉVALUATION DE LA CHAISE ===")
print()
print("Hauteur du siège :", chaise_h, "cm (recommandé :",
rec_hauteur, "cm) →", verdict_h)
print("Profondeur du siège :", chaise_p, "cm (recommandé :",
rec_profondeur, "cm) →", verdict_p)
print("Largeur du siège :", chaise_l, "cm (recommandé :",
rec_largeur, "cm) →", verdict_l)
print()
print("Verdict :", verdict_global)

Défi 1 : Ajouter le dossier et les accoudoirs

Ajoute deux mesures supplémentaires et leurs dimensions de chaise :

  • Hauteur des épaules (assis) → hauteur du dossier
  • Hauteur du coude (assis) → hauteur des accoudoirs

Données de référence (cm) :

MesureSexe5e50e95e
Épaules (assis)F50.955.560.4
Épaules (assis)H54.959.864.6
Coude (assis)F17.622.126.4
Coude (assis)H18.423.227.4

Formules : hauteur du dossier = hauteur épaules assis × 0.85, hauteur accoudoirs = hauteur coude assis.

Défi 2 : Score numérique d'ergonomie

Au lieu de catégories textuelles, calcule un score d’ergonomie sur 100 :

  • Chaque dimension vaut un maximum de 33 points
  • Si l’écart est de 0 cm → 33 points
  • Si l’écart est de 2 cm → 20 points
  • Si l’écart est de 5 cm → 10 points
  • Si l’écart dépasse 5 cm → 0 points

Affiche le score final et une appréciation : Excellent (≥ 80), Acceptable (50-79), Insuffisant (< 50).

Réflexion : Comment simplifier ce programme ?

Ce programme répète la même logique de classification et d’évaluation pour chaque mesure. Avec des listes et des boucles, on pourrait stocker les noms, seuils et formules dans des structures de données et les traiter de manière systématique.

On revisitera cet exercice plus tard dans le cours !