ICC-P Série 7, corrigé exercices 1-2-3 (texte)
Code:
from dataclasses import dataclass
# Exercice 1 (b)
with open("cars.txt", "r", encoding="utf-8") as file:
contents = file.read()
# on split le fichier en lignes, \n est le séparateur
lines = contents.split("\n")
# Exercice 1 (c)
# modélisation d'un type de voiture
@dataclass
class Car:
brand: str
model: str
cylinders: int
weight: float
origin: str
# Exercice 1 (d)
# la liste dans laquelle on va stocker les voitures
cars: list[Car] = []
for line in lines[2:]:
# on split la ligne en colonnes
parts = line.split(";")
# on extrait le nom de la marque: on split avec les
# espaces et on prend le premier élément
model_parts = parts[0].split(" ")
brand = model_parts[0]
# pour le nom du véhicule, on prend le reste et on
# le remet sous forme de chaine de caractères en
# faisant un join avec un espace " "
model = " ".join(model_parts[1:])
# conversion des autres champs en int et float
cylinders = int(parts[2])
weight = float(parts[5])
# on a converti ce qui devait être converti; on
# peut donc maintenant créer la voiture
car = Car(brand, model, cylinders, weight, parts[8])
# on l'ajoute à la liste
cars.append(car)
# affichage de toutes les voitures
for car in cars:
print(car)
# Exercice 2
# on collecte toutes les marques dans un set pour éviter les doublons
brands: set[str] = set()
for car in cars:
brands.add(car.brand)
# on trie le set pour avoir une liste ordonnée, mais comme on
# ne peut pas trier directement un set, qui n'a pas d'ordre,
# on convertit d'abor le set en liste
sorted_brands = sorted(list(brands))
# écriture du fichier de sortie
with open("brands.txt", "w", encoding="utf-8") as file:
# boucle à travers toutes les marques
for brand in sorted_brands:
# on compte les voiture qui sont de cette marque
num = 0
for car in cars:
if car.brand == brand:
num += 1
# on écrit la marque et le nombre suivi d'un retour à la ligne
file.write(f"{brand} ({num})\n")
# Exercice 3 (a)
# on repère les origines dans un set, comme pour les marques
origins: set[str] = set()
for car in cars:
origins.add(car.origin)
for origin in origins:
# pour chaque origine, on collecte les marques dans un set
brands = set()
for car in cars:
if car.origin == origin:
brands.add(car.brand)
# on construit une représentation sous forme de string des
# marques après avoir trié le set converti en liste
brands_str = ", ".join(sorted(list(brands)))
print(f"{origin}: {brands_str}")
# Exercice 3 (b)
# on collecte dans ce dictionnaire, pour chaque clé qui représente
# le nombre de cylindres, la liste des poids des voitures correspondantes
weights_by_cylinder: dict[int, list[float]] = {}
for car in cars:
# si le dictionnaire n'a pas encore de clé pour ce nombre de cylindres,
# on l'ajoute avec initialement une liste vide de poids
if car.cylinders not in weights_by_cylinder:
weights_by_cylinder[car.cylinders] = []
# on ajoute le poids de la voiture à la liste correspondant au
# nombre de cylindres de la voiture
weights_by_cylinder[car.cylinders].append(car.weight)
# on trie les clés du dictionnaire pour avoir une liste ordonnée des
# valeurs des cylindres
sorted_cylinders = sorted(list(weights_by_cylinder.keys()))
for cylinders in sorted_cylinders:
# on récupère la liste des poids correspondant au nombre de cylindres
weights = weights_by_cylinder[cylinders]
# on calcule la moyenne des poids
total = 0.0
for weight in weights:
total += weight
avg_weight = total / len(weights)
# on affiche le nombre de cylindres et la moyenne des poids
print(f"Poids moyen pour {cylinders} cylindres ({len(weights)}): {avg_weight}")
# Exercice 1 (b)
with open("cars.txt", "r", encoding="utf-8") as file:
contents = file.read()
# on split le fichier en lignes, \n est le séparateur
lines = contents.split("\n")
# Exercice 1 (c)
# modélisation d'un type de voiture
@dataclass
class Car:
brand: str
model: str
cylinders: int
weight: float
origin: str
# Exercice 1 (d)
# la liste dans laquelle on va stocker les voitures
cars: list[Car] = []
for line in lines[2:]:
# on split la ligne en colonnes
parts = line.split(";")
# on extrait le nom de la marque: on split avec les
# espaces et on prend le premier élément
model_parts = parts[0].split(" ")
brand = model_parts[0]
# pour le nom du véhicule, on prend le reste et on
# le remet sous forme de chaine de caractères en
# faisant un join avec un espace " "
model = " ".join(model_parts[1:])
# conversion des autres champs en int et float
cylinders = int(parts[2])
weight = float(parts[5])
# on a converti ce qui devait être converti; on
# peut donc maintenant créer la voiture
car = Car(brand, model, cylinders, weight, parts[8])
# on l'ajoute à la liste
cars.append(car)
# affichage de toutes les voitures
for car in cars:
print(car)
# Exercice 2
# on collecte toutes les marques dans un set pour éviter les doublons
brands: set[str] = set()
for car in cars:
brands.add(car.brand)
# on trie le set pour avoir une liste ordonnée, mais comme on
# ne peut pas trier directement un set, qui n'a pas d'ordre,
# on convertit d'abor le set en liste
sorted_brands = sorted(list(brands))
# écriture du fichier de sortie
with open("brands.txt", "w", encoding="utf-8") as file:
# boucle à travers toutes les marques
for brand in sorted_brands:
# on compte les voiture qui sont de cette marque
num = 0
for car in cars:
if car.brand == brand:
num += 1
# on écrit la marque et le nombre suivi d'un retour à la ligne
file.write(f"{brand} ({num})\n")
# Exercice 3 (a)
# on repère les origines dans un set, comme pour les marques
origins: set[str] = set()
for car in cars:
origins.add(car.origin)
for origin in origins:
# pour chaque origine, on collecte les marques dans un set
brands = set()
for car in cars:
if car.origin == origin:
brands.add(car.brand)
# on construit une représentation sous forme de string des
# marques après avoir trié le set converti en liste
brands_str = ", ".join(sorted(list(brands)))
print(f"{origin}: {brands_str}")
# Exercice 3 (b)
# on collecte dans ce dictionnaire, pour chaque clé qui représente
# le nombre de cylindres, la liste des poids des voitures correspondantes
weights_by_cylinder: dict[int, list[float]] = {}
for car in cars:
# si le dictionnaire n'a pas encore de clé pour ce nombre de cylindres,
# on l'ajoute avec initialement une liste vide de poids
if car.cylinders not in weights_by_cylinder:
weights_by_cylinder[car.cylinders] = []
# on ajoute le poids de la voiture à la liste correspondant au
# nombre de cylindres de la voiture
weights_by_cylinder[car.cylinders].append(car.weight)
# on trie les clés du dictionnaire pour avoir une liste ordonnée des
# valeurs des cylindres
sorted_cylinders = sorted(list(weights_by_cylinder.keys()))
for cylinders in sorted_cylinders:
# on récupère la liste des poids correspondant au nombre de cylindres
weights = weights_by_cylinder[cylinders]
# on calcule la moyenne des poids
total = 0.0
for weight in weights:
total += weight
avg_weight = total / len(weights)
# on affiche le nombre de cylindres et la moyenne des poids
print(f"Poids moyen pour {cylinders} cylindres ({len(weights)}): {avg_weight}")
Last modified: Monday, 31 March 2025, 01:56