madamasterclass.com

📔 Exercices - Langages et programmation[série n°3️⃣]

Exercices corrigés sur les langages et programmation en python - Poo

Exercice 1 :

Définir une classe \(Fraction\) pour représenter un nombre rationnel. Cette classe possède deux attributs, \(num\) et \(denom\), qui sont des entiers et désignent respectivement le numérateur et le dénominateur. On demande que le dénominateur soit plus particulièrement un entier strictement positif.
   • Écrire le constructeur de cette classe. Le constructeur doit lever une \(ValueError\) si le dénominateur fourni n'est pas strictement positif.
   • Ajouter une méthode \(\_\_str\_\_\) qui renvoie une chaîne de caractères de la forme "12 / 35", ou simplement de la forme "12" lorsque le dénominateur vaut 1.
   • Ajouter des méthodes \(\_\_eq\_\_\) et \(\_\_1t\_\_\) qui reçoivent une deuxième fraction en argument et renvoient \(True\) si la première fraction représente respectivement un nombre égal ou un nombre strictement inférieur à la deuxième fraction.
   • Ajouter des méthodes \(\_\_add\_\_\) et \(\_\_mul\_\_\) qui reçoivent une deuxième fraction en argument et renvoient une nouvelle fraction représentant respectivement la somme et le produit des deux fractions.
   • Tester ces opérations.

Bonus 🎁 : s'assurer que les fractions sont toujours sous forme réduite.

class Fraction:
def __init__(self, num, denom):
if denom <= 0:
raise ValueError("Le dénominateur doit être un entier strictement positif.")
self.num = num
self.denom = denom
self._reduce()

def _gcd(self, a, b):
while b:
a, b = b, a % b
return a

def _reduce(self):
# Réduire la fraction en utilisant le PGCD
common_divisor = self._gcd(self.num, self.denom)
self.num //= common_divisor
self.denom //= common_divisor

def __str__(self):
if self.denom == 1:
return str(self.num)
else:
return f"{self.num} / {self.denom}"

def __eq__(self, other):
return self.num == other.num and self.denom == other.denom

def __lt__(self, other):
return self.num * other.denom < self.denom * other.num

def __add__(self, other):
new_num = self.num * other.denom + other.num * self.denom
new_denom = self.denom * other.denom
return Fraction(new_num, new_denom)

def __mul__(self, other):
new_num = self.num * other.num
new_denom = self.denom * other.denom
return Fraction(new_num, new_denom)

# Tests
f1 = Fraction(3, 4)
f2 = Fraction(2, 3)
f3 = Fraction(6, 8) # Cela devrait être réduit à 3/4

print(f"f1: {f1}") # 3 / 4
print(f"f2: {f2}") # 2 / 3
print(f"f3: {f3}") # 3 / 4

print(f"f1 == f2: {f1 == f2}") # False
print(f"f1 == f3: {f1 == f3}") # True

print(f"f1 < f2: {f1 < f2}") # False
print(f"f2 < f1: {f2 < f1}") # True

f4 = f1 + f2
print(f"f1 + f2: {f4}") # 17 / 12

f5 = f1 * f2
print(f"f1 * f2: {f5}") # 1 / 2

Exercice 2 :

Définir une classe \(Intervalle\) représentant des intervalles de nombres. Cette classe possède deux attributs \(a\) et \(b\) représentant respectivement l'extrémité inférieure et l'extrémité supérieure de l'intervalle. Les deux extrémités sont considérées comme incluses dans l'intervalle. Tout intervalle avec \(b < a\) représente l'intervalle vide.
   • Écrire le constructeur de la classe \(Intervalle\) et une méthode est_vide renvoyant \(True\) si l'objet représente l'intervalle vide et \(False\) sinon.
   • Ajouter des méthodes \( \_\_len\_\_ \) renvoyant la longueur de l'intervalle (l'intervalle vide a une longueur 0) et \(\_\_contains\_\_\) testant l'appartenance d'un élément \(x\) à l'intervalle.
   • Ajouter une méthode \(\_\_eq\_\_\) permettant de tester l'égalité de deux intervalles avec \(==\) et une méthode \(\_\_le\_\_\) permettant de tester l'inclusion d'un intervalle dans un autre avec \(<=\).
   ⚠️ Attention: toutes les représentations de l'intervalle vide doivent être considérées égales, et incluses dans tout intervalle.
   • Ajouter des méthodes intersection et union calculant respectivement l'intersection de deux intervalles et le plus petit intervalle contenant l'union de deux intervalles (l'intersection est bien toujours un intervalle, alors que l'union ne l'est pas forcément). Ces deux fonctions doivent renvoyer un nouvel intervalle sans modifier leurs paramètres.
   • Tester ces méthodes.

class Intervalle:
def __init__(self, a, b):
self.a = a
self.b = b

def est_vide(self):
return self.b < self.a

def __len__(self):
return max(0, self.b - self.a + 1)

def __contains__(self, x):
return self.a <= x <= self.b

def __eq__(self, other):
if self.est_vide() and other.est_vide():
return True
return self.a == other.a and self.b == other.b

def __le__(self, other):
if self.est_vide():
return True
if other.est_vide():
return False
return other.a <= self.a and self.b <= other.b

def intersection(self, other):
if self.est_vide() or other.est_vide():
return Intervalle(0, -1) # Représente un intervalle vide
new_a = max(self.a, other.a)
new_b = min(self.b, other.b)
if new_a > new_b:
return Intervalle(0, -1) # Représente un intervalle vide
return Intervalle(new_a, new_b)

def union(self, other):
if self.est_vide():
return Intervalle(other.a, other.b)
if other.est_vide():
return Intervalle(self.a, self.b)
new_a = min(self.a, other.a)
new_b = max(self.b, other.b)
return Intervalle(new_a, new_b)

def __str__(self):
if self.est_vide():
return "Intervalle vide"
return f"[{self.a}, {self.b}]"

# Tests
i1 = Intervalle(1, 5)
i2 = Intervalle(3, 7)
i3 = Intervalle(6, 2) # Intervalle vide

print(f"i1: {i1}") # [1, 5]
print(f"i2: {i2}") # [3, 7]
print(f"i3: {i3}") # Intervalle vide

print(f"i1 est vide: {i1.est_vide()}") # False
print(f"i3 est vide: {i3.est_vide()}") # True

print(f"Longueur de i1: {len(i1)}") # 5
print(f"Longueur de i3: {len(i3)}") # 0

print(f"3 est dans i1: {3 in i1}") # True
print(f"8 est dans i2: {8 in i2}") # False

print(f"i1 == i2: {i1 == i2}") # False
print(f"i3 == Intervalle(5, 3): {i3 == Intervalle(5, 3)}") # True

print(f"i1 <= i2: {i1 <= i2}") # False
print(f"i3 <= i1: {i3 <= i1}") # True

i4 = i1.intersection(i2)
print(f"i1 ∩ i2: {i4}") # [3, 5]

i5 = i1.union(i2)
print(f"i1 ∪ i2: {i5}") # [1, 7]

i6 = i3.intersection(i1)
print(f"i3 ∩ i1: {i6}") # Intervalle vide

i7 = i3.union(i1)
print(f"i3 ∪ i1: {i7}") # [1, 5]

Exercice 3 :

Définir une classe \(Angle\) pour représenter un angle en degrés. Cette classe contient un unique attribut, \(angle\), qui est un entier. On demande que, quoiqu'il arrive, l'égalité \(0 ≤ angle < 360\) reste vérifiée.
   • Écrire le constructeur de cette classe.
   • Ajouter une méthode \(\_\_str\_\_\) qui renvoie une chaîne de caractères de la forme "60 degrés". Observer son effet en construisant un objet de la classe \(Angle\) puis en l'affichant avec \(print\).
   • Ajouter une méthode \(ajoute\) qui reçoit un autre angle en argument (un objet de la classe \(Angle)\) et l'ajoute au champ \(angle\) de l'objet. Attention à ce que la valeur d'angle reste bien dans le bon intervalle.
   • Ajouter deux méthodes \(cos\) et \(sin\) pour calculer respectivement le cosinus et le sinus de l'angle. On utilisera pour cela les fonctions \(cos\) et \(sin\) de la bibliothèque \(math\).
   ⚠️ Attention: il faut convertir l'angle en radians (en le multipliant par \(\pi/180\)) avant d'appeler les fonctions \(cos\) et \(sin\).
   • Tester les méthodes \(ajoute\), \(cos\) et \(sin\).

import math

class Angle:
def __init__(self, angle):
self.angle = angle % 360

def __str__(self):
return f"{self.angle} degrés"

def ajoute(self, other):
self.angle = (self.angle + other.angle) % 360

def cos(self):
radians = self.angle * math.pi / 180
return math.cos(radians)

def sin(self):
radians = self.angle * math.pi / 180
return math.sin(radians)

# Tests
a1 = Angle(60)
a2 = Angle(300)

print(f"a1: {a1}") # 60 degrés
print(f"a2: {a2}") # 300 degrés

# Test de la méthode ajoute
a1.ajoute(a2)
print(f"a1 + a2: {a1}") # 0 degrés (60 + 300 = 360, qui est réduit à 0)

# Test des méthodes cos et sin
a3 = Angle(90)
print(f"cos(90°): {a3.cos()}") # Devrait être proche de 0
print(f"sin(90°): {a3.sin()}") # Devrait être proche de 1

a4 = Angle(180)
print(f"cos(180°): {a4.cos()}") # Devrait être proche de -1
print(f"sin(180°): {a4.sin()}") # Devrait être proche de 0

Exercice 4 :

Définir une classe \(Date\) pour représenter une date, avec trois attributs \(jour\), \(mois\) et \(annee\).
   • Écrire son constructeur.
   • Ajouter une méthode \(\_\_str\_\_\) qui renvoie une chaîne de caractères de la forme "8 mai 1945". On pourra se servir d'un attribut de classe qui est un tableau donnant les noms des douze mois de l'année. Tester en construisant des objets de la classe \(Date\) puis en les affichant avec \(print\).
   • Ajouter une méthode \(\_\_1t\_\_\) qui permet de déterminer si une date \(d1\) est antérieure à une date \(d2\) en écrivant \(d1 < d2\). La tester.

class Date:
mois_noms = ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"]

def __init__(self, jour, mois, annee):
self.jour = jour
self.mois = mois
self.annee = annee

def __str__(self):
return f"{self.jour} {Date.mois_noms[self.mois - 1]} {self.annee}"

def __lt__(self, other):
if self.annee != other.annee:
return self.annee < other.annee
if self.mois != other.mois:
return self.mois < other.mois
return self.jour < other.jour

# Tests
d1 = Date(8, 5, 1945)
d2 = Date(1, 1, 2000)
d3 = Date(15, 8, 1945)

print(d1) # 8 mai 1945
print(d2) # 1 janvier 2000
print(d3) # 15 août 1945

# Test de la méthode __lt__
print(d1 < d2) # True
print(d2 < d1) # False
print(d1 < d3) # True
print(d3 < d1) # False
Exercice 5 :

Créer en Python une classe appelée \(Temps\), qui a des membres de type \(int\) tels que heures, minutes et secondes.(rendez-les private)
   • Un constructeur doit initialiser ces données à 0
   • Un autre constructeur devrait l’initialiser à des valeurs fixes.
   • Une fonction \(membre\) devrait l’afficher, au format \(17h\:59\:min\:59\:s\).
   • Une autre fonction pour renvoyer les données de chaque membre nommez-les getters, \(getMin\) et \(getSec\)
   • Une fonction \(membre\) doit ajouter deux objets de type \(Temps\) passé en arguments.

class Temps:
def __init__(self, heures=0, minutes=0, secondes=0):
self.__heures = heures
self.__minutes = minutes
self.__secondes = secondes

def __str__(self):
return f"{self.__heures}h:{self.__minutes}min:{self.__secondes}s"

def getHeures(self):
return self.__heures

def getMinutes(self):
return self.__minutes

def getSecondes(self):
return self.__secondes

def ajouter(self, autre):
secondes = self.__secondes + autre.getSecondes()
minutes = self.__minutes + autre.getMinutes() + secondes // 60
heures = self.__heures + autre.getHeures() + minutes // 60
return Temps(heures % 24, minutes % 60, secondes % 60)

def afficher(self):
print(self.__str__())

# Tests
t1 = Temps()
t2 = Temps(10, 59, 30)
t3 = Temps(5, 30, 45)

# Affichage des objets
t1.afficher() # 0h:0min:0s
t2.afficher() # 10h:59min:30s
t3.afficher() # 5h:30min:45s

# Utilisation des getters
print(t2.getHeures()) # 10
print(t2.getMinutes()) # 59
print(t2.getSecondes()) # 30

# Addition de deux objets Temps
t4 = t2.ajouter(t3)
t4.afficher() # 16h:30min:15s

Exercice 6 :

En s'inspirant de l'exercice 5, écrire une fonction récursive \(nombre\_de\_bits\_1(n)\) qui prend un entier positif ou nul et renvoie le nombre de bits valant \(1\) dans la représentation binaire de \(n\). Par exemple, \(nombre\_de\_bits\_1 (255)\) doit renvoyer \(8\).

def nombre_de_bits_1(n):
if n == 0:
return 0
else:
return (n % 2) + nombre_de_bits_1(n // 2)

# Tests
print(nombre_de_bits_1(0)) # 0
print(nombre_de_bits_1(1)) # 1
print(nombre_de_bits_1(2)) # 1
print(nombre_de_bits_1(3)) # 2
print(nombre_de_bits_1(255)) # 8
print(nombre_de_bits_1(1023)) # 10
print(nombre_de_bits_1(1024)) # 1

Exercice 7 :

1. Créez une classe \(Calcul\) avec un constructeur par défaut (sans paramètres) permettant d'effectuer différents calculs sur les nombres entiers.

2. Dans la classe \(Calcul\), créez une méthode \Factorielle()\ qui calcule la factorielle d'un entier donné. Testez cette méthode en instanciant la classe \(Calcul\).

3. Créez dans la classe \(Calcul\) une méthode \(Somme()\) qui calcule la somme des \(n\) premiers entiers : \(1 + 2 + 3 + ... + n\). Testez cette méthode.

4. Ajoutez une méthode \(estPremier()\) à la classe \(Calcul\) qui détermine si un entier donné est premier. Testez cette méthode.

5. Ajoutez une méthode \(estPremiersEntre()\) à la classe \(Calcul\) qui vérifie si deux nombres entiers sont premiers entre eux. Testez cette méthode.

6. Créez une méthode \(tableMultiplication()\) dans la classe \(Calcul\) qui affiche la table de multiplication d'un entier donné. Ajoutez également une méthode \(afficherTablesMultiplication()\) qui affiche les tables de multiplication des entiers de 1 à 9.

7. Ajoutez deux méthodes à la classe \(Calcul\) :
   • \(listeDiviseurs()\) qui renvoie une liste de tous les diviseurs d'un entier donné.
   • \(listeDiviseursPremiers()\) qui renvoie une liste des diviseurs premiers d'un entier donné.

class Calcul:
def __init__(self):
pass

def factorielle(self, n):
if n == 0 or n == 1:
return 1
else:
return n * self.factorielle(n - 1)

def somme(self, n):
return n * (n + 1) // 2

def est_premier(self, n):
if n <= 1:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True

def est_premiers_entre(self, a, b):
def gcd(x, y):
while y != 0:
(x, y) = (y, x % y)
return x
return gcd(a, b) == 1

def table_multiplication(self, n):
for i in range(1, 11):
print(f"{n} x {i} = {n * i}")

def afficher_tables_multiplication(self):
for i in range(1, 10):
self.table_multiplication(i)
print() # Ligne vide entre les tables

def liste_diviseurs(self, n):
diviseurs = []
for i in range(1, n + 1):
if n % i == 0:
diviseurs.append(i)
return diviseurs

def liste_diviseurs_premiers(self, n):
diviseurs = self.liste_diviseurs(n)
diviseurs_premiers = [d for d in diviseurs if self.est_premier(d)]
return diviseurs_premiers

# Instanciation de la classe Calcul
calcul = Calcul()

# Tests
print("Factorielle de 5:", calcul.factorielle(5)) # 120
print("Somme des 5 premiers entiers:", calcul.somme(5)) # 15
print("7 est-il premier?", calcul.est_premier(7)) # True
print("4 et 9 sont-ils premiers entre eux?", calcul.est_premiers_entre(4, 9)) # True
print("Table de multiplication de 3:")
calcul.table_multiplication(3)
print("Tables de multiplication de 1 à 9:")
calcul.afficher_tables_multiplication()
print("Diviseurs de 28:", calcul.liste_diviseurs(28)) # [1, 2, 4, 7, 14, 28]
print("Diviseurs premiers de 28:", calcul.liste_diviseurs_premiers(28)) # [2, 7]

Exercice 8 :

1. Créez une classe \(myString\) qui permet d'utiliser les méthodes \(append()\) et \(pop()\) sur les chaînes de caractères, comme sur les listes.
2. Implémentez le constructeur de la classe \(myString\) qui prend une chaîne de caractères en paramètre et l'attribue à une propriété \(self.data\).
3. Implémentez la méthode \(append()\) qui prend une chaîne de caractères en paramètre et la concatène à \(self.data\), puis renvoie la nouvelle chaîne résultante.
4. Implémentez la méthode \(pop()\) qui prend un index en paramètre, supprime le caractère à cet index de \(self.data\), et renvoie la nouvelle chaîne résultante.

class myString:
def __init__(self, data):
self.data = data

def append(self, string):
self.data += string
return self.data

def pop(self, index):
if index < 0 or index >= len(self.data):
raise IndexError("Index out of range")
self.data = self.data[:index] + self.data[index + 1:]
return self.data

# Tests
s = myString("Hello")

print("Initial data:", s.data) # "Hello"

# Test de append
print("After append(' World'):", s.append(" World")) # "Hello World"

# Test de pop
print("After pop(5):", s.pop(5)) # "HelloWorld" (remove the space)

# Test d'un pop avec index invalide
try:
print(s.pop(100)) # Devrait lever une exception IndexError
except IndexError as e:
print(e) # Affiche l'exception

Exercice 9 :

1. Créez une classe \(Geometry\) avec un constructeur par défaut (sans paramètres).

2. Ajoutez une méthode \(distance()\) à la classe \(Geometry\) qui calcule la distance entre deux points \(A = (a_1, a_2)\) et \(B = (b_1, b_2)\). La formule de la distance 📏 entre deux points \((x_1, y_1)\) et \((x_2, y_2)\) est : \(\sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}\).

3. Ajoutez une méthode \(milieu()\) à la classe \(Geometry\) qui calcule les coordonnées du milieu d'un segment défini par deux points \(A = (a_1, a_2)\) et \(B = (b_1, b_2)\). Les coordonnées du milieu sont : \(((a_1 + b_1) / 2, (a_2 + b_2) / 2)\).

4. Ajoutez une méthode \(perimètreTriangle()\) à la classe \(Geometry\) qui calcule le périmètre d'un triangle défini par trois points \(A = (a_1, a_2)\), \(B = (b_1, b_2)\) et \(C = (c_1, c_2)\). Le périmètre est la somme des longueurs des trois côtés, calculées à l'aide de la méthode \(distance()\).

5. Ajoutez une méthode \(estIsocele()\) à la classe \(Geometry\) qui détermine si un triangle 📐 défini par trois points \(A = (a_1, a_2)\), \(B = (b_1, b_2)\) et \(C = (c_1, c_2)\) est isocèle. Un triangle est isocèle s'il a au moins deux côtés de même longueur. Vous pouvez utiliser la méthode \(distance()\) pour calculer les longueurs des côtés.

import math

class Geometry:
def __init__(self):
pass

def distance(self, A, B):
a1, a2 = A
b1, b2 = B
return math.sqrt((b1 - a1)**2 + (b2 - a2)**2)

def milieu(self, A, B):
a1, a2 = A
b1, b2 = B
return ((a1 + b1) / 2, (a2 + b2) / 2)

def perimetreTriangle(self, A, B, C):
AB = self.distance(A, B)
BC = self.distance(B, C)
CA = self.distance(C, A)
return AB + BC + CA

def estIsocele(self, A, B, C):
AB = self.distance(A, B)
BC = self.distance(B, C)
CA = self.distance(C, A)
return AB == BC or BC == CA or CA == AB

# Tests
geom = Geometry()

# Points
A = (0, 0)
B = (3, 4)
C = (6, 0)

# Test de distance
print("Distance entre A et B:", geom.distance(A, B)) # 5.0

# Test de milieu
print("Milieu du segment AB:", geom.milieu(A, B)) # (1.5, 2.0)

# Test de périmètre du triangle
print("Périmètre du triangle ABC:", geom.perimetreTriangle(A, B, C)) # 12.0

# Test d'isocele
print("Le triangle ABC est-il isocèle?", geom.estIsocele(A, B, C)) # True

Exercice 10 :

Créer la classe \(Article\) caractérisée par les attributs suivants :

   • Référence
   • Désignation
   • Prix Hors Taxe (PrixHT)
   • Taux de TVA (TauxTVA)

Ces attributs doivent être accessibles uniquement via des accesseurs (méthodes \(get\) et \(set\)) en lecture/écriture, implémentés à l'aide de propriétés.

Ajouter les constructeurs suivants :

1. Un constructeur par défaut
2. Un constructeur initialisant tous les attributs
3. Un constructeur permettant de renseigner la référence et la désignation lors de l'instanciation
4. Un constructeur de copie

Implémenter la méthode \(CalculerPrixTTC()\) qui calcule le prix TTC d'un article selon la formule suivante :
\[PrixTTC = PrixHT + (PrixHT * TauxTVA / 100)\]
Ajouter la méthode \(AfficherArticle()\) qui affiche les informations de l'article.

Créer un programme de test où il faut :

1. Créer des objets \(Article\) en utilisant les différents constructeurs
2. Calculer et afficher le prix TTC de chaque article

Remarque : Le taux de TVA est en fait commun à tous les articles. Pour éviter toute redondance de cet attribut, vous devriez le déclarer comme un attribut partagé (static) au niveau de la classe \(Article\) et non comme un attribut spécifique des objets instanciés. Proposer une solution et tester de nouveau.

class Article:
# Attribut partagé pour le taux de TVA
tauxTVA = 20 # Valeur par défaut, peut être modifiée globalement pour tous les articles

def __init__(self, reference=None, designation=None, prixHT=0.0):
self._reference = reference
self._designation = designation
self._prixHT = prixHT

@property
def reference(self):
return self._reference

@reference.setter
def reference(self, value):
self._reference = value

@property
def designation(self):
return self._designation

@designation.setter
def designation(self, value):
self._designation = value

@property
def prixHT(self):
return self._prixHT

@prixHT.setter
def prixHT(self, value):
self._prixHT = value

@classmethod
def set_tauxTVA(cls, taux):
cls.tauxTVA = taux

@classmethod
def get_tauxTVA(cls):
return cls.tauxTVA

def calculerPrixTTC(self):
return self._prixHT + (self._prixHT * self.tauxTVA / 100)

def afficherArticle(self):
print(f"Référence: {self._reference}")
print(f"Désignation: {self._designation}")
print(f"Prix HT: {self._prixHT:.2f}")
print(f"Prix TTC: {self.calculerPrixTTC():.2f}")

# Constructeur de copie
def __copy__(self):
return Article(self._reference, self._designation, self._prixHT)

# Tests
# Création d'articles avec différents constructeurs
article1 = Article() # Constructeur par défaut
article2 = Article("123", "Article A", 100.0) # Constructeur avec tous les attributs
article3 = Article("456", "Article B") # Constructeur avec référence et désignation

# Modification des attributs via les accesseurs
article1.reference = "789"
article1.designation = "Article C"
article1.prixHT = 150.0

# Affichage des articles
print("Article 1:")
article1.afficherArticle()
print()

print("Article 2:")
article2.afficherArticle()
print()

print("Article 3:")
article3.afficherArticle()
print()

# Test du constructeur de copie
article4 = article2.__copy__()
print("Article 4 (copie de l'article 2):")
article4.afficherArticle()

# Modifier le taux de TVA et vérifier la mise à jour
Article.set_tauxTVA(25)
print("\nAprès modification du taux de TVA à 25%")
print("Article 1:")
article1.afficherArticle()
print()

print("Article 2:")
article2.afficherArticle()
print()

print("Article 3:")
article3.afficherArticle()
print()

print("Article 4:")
article4.afficherArticle()

Forum(s) associé(s)

Mathématiques Magiques : Dévoilez les Mystères des Nombres

08 Apr, 2016

Les mathématiques ont souvent la réputation d'être une discipline austère et difficile, mais ...

Read more.

Voyage à Travers les Suites Numériques : Découvertes et Applications

27 Jan, 2014

Plongez dans l'univers fascinant des suites numériques, où chaque terme révèle des patterns surprenants et des applications pratiques dans les mathématiques et au-delà.

Read more.

Fonctions en Action : Comprendre et Explorer les Relations Mathématiques

30 Feb, 2015

Découvrez comment les fonctions tissent des liens entre les nombres et les concepts, transformant des idées abstraites en outils puissants pour résoudre des problèmes du quotidien.

Read more.
Page: