Téléverser les fichiers vers "/"

This commit is contained in:
2026-10-13 20:33:39 +02:00
commit b3440d7b60
4 changed files with 307 additions and 0 deletions
+145
View File
@@ -0,0 +1,145 @@
/*
* R5.A.04 - Qualité Algorithmique
* TD Complexité cyclomatique - Partie Java
*
* Pour chaque méthode, calculez la complexité cyclomatique M.
*/
import java.util.ArrayList;
import java.util.List;
public class Bibliotheque {
static class Livre {
String titre, auteur, genre;
int annee;
boolean emprunte, reserve, abime;
Livre(String titre, String auteur, String genre, int annee) {
this.titre = titre;
this.auteur = auteur;
this.genre = genre;
this.annee = annee;
}
}
static class Adherent {
String nom;
boolean etudiant, cotisationAJour;
int nbEmprunts, joursDeRetardCumules;
Adherent(String nom, boolean etudiant) {
this.nom = nom;
this.etudiant = etudiant;
this.cotisationAJour = true;
}
}
private final List<Livre> livres = new ArrayList<>();
/* Exercice J1 */
public int nombreDeLivres() {
return livres.size();
}
/* Exercice J2 */
public boolean estDisponible(Livre livre) {
return !livre.emprunte && !livre.reserve && !livre.abime;
}
/* Exercice J3 */
public String peutEmprunter(Adherent a, Livre l) {
if (!a.cotisationAJour)
return "Cotisation à renouveler";
if (a.joursDeRetardCumules > 30)
return "Trop de retards";
int maxEmprunts = a.etudiant ? 8 : 5;
if (a.nbEmprunts >= maxEmprunts)
return "Nombre maximum d'emprunts atteint";
if (l.emprunte)
return "Livre déjà emprunté";
else if (l.reserve && !a.etudiant)
return "Livre réservé";
else if (l.abime)
return "Livre en réparation";
return "OK";
}
/* Exercice J4 */
public double calculerPenalite(int joursRetard, Adherent a, int nbLivres) {
if (joursRetard <= 0 || nbLivres <= 0)
return 0;
double tarif;
if (joursRetard <= 7)
tarif = 0.20;
else if (joursRetard <= 30)
tarif = 0.50;
else
tarif = 1.00;
double penalite = 0;
for (int i = 0; i < nbLivres; i++) {
penalite += joursRetard * tarif;
if (i >= 2)
penalite += 1.0;
}
if (a.etudiant)
penalite *= 0.5;
return penalite > 50 ? 50 : penalite;
}
/* Exercice J5 */
public List<Livre> rechercher(String motCle, String genre, int anneeMin, boolean disponiblesSeulement) {
List<Livre> resultats = new ArrayList<>();
for (Livre l : livres) {
if (genre != null && !l.genre.equals(genre))
continue;
if (l.annee < anneeMin)
continue;
if (disponiblesSeulement && !estDisponible(l))
continue;
if (motCle == null || motCle.isEmpty()) {
resultats.add(l);
} else {
String m = motCle.toLowerCase();
if (l.titre.toLowerCase().contains(m) || l.auteur.toLowerCase().contains(m))
resultats.add(l);
}
}
return resultats;
}
/* Exercice J6 */
public int importer(List<String> lignes) {
int importes = 0;
for (String ligne : lignes) {
if (ligne.isBlank() || ligne.startsWith("#"))
continue;
String[] champs = ligne.split(";");
if (champs.length != 4) {
System.err.println("Ligne ignorée : " + ligne);
continue;
}
try {
int annee = Integer.parseInt(champs[3].trim());
if (annee > 0 && annee <= 2026) {
livres.add(new Livre(champs[0], champs[1], champs[2], annee));
importes++;
}
} catch (NumberFormatException e) {
System.err.println("Année invalide : " + champs[3]);
}
}
return importes;
}
public static void main(String[] args) {
Bibliotheque b = new Bibliotheque();
b.importer(List.of("# titre;auteur;genre;annee",
"Le Petit Prince;Saint-Exupéry;conte;1943",
"Dune;Herbert;SF;1965",
"Fondation;Asimov;SF;abc"));
Adherent a = new Adherent("Maxime", true);
System.out.println(b.nombreDeLivres() + " " + b.rechercher("dune", "SF", 1900, true).size()
+ " " + b.peutEmprunter(a, b.livres.get(0)) + " " + b.calculerPenalite(10, a, 3));
}
}
Binary file not shown.
+91
View File
@@ -0,0 +1,91 @@
/*
* R5.A.04 - Qualité Algorithmique
* TD Complexité cyclomatique - Partie C
*
* Pour chaque fonction, calculez la complexité cyclomatique M.
*/
#include <stdio.h>
/* Exercice C1 */
int carre(int x)
{
return x * x;
}
/* Exercice C2 */
int moyenne(const int *t, int n)
{
int somme = 0;
for (int i = 0; i < n; i++)
somme += t[i];
return n > 0 ? somme / n : 0;
}
/* Exercice C3 */
int est_bissextile(int annee)
{
return (annee % 4 == 0 && annee % 100 != 0) || annee % 400 == 0;
}
/* Exercice C4 */
const char *nom_jour(int jour)
{
switch (jour) {
case 1: return "lundi";
case 2: return "mardi";
case 3: return "mercredi";
case 4: return "jeudi";
case 5: return "vendredi";
case 6: return "samedi";
case 7: return "dimanche";
default: return "inconnu";
}
}
/* Exercice C5 */
int compter_mots(const char *texte)
{
int mots = 0;
int dans_mot = 0;
int i = 0;
while (texte[i] != '\0') {
char c = texte[i];
int separateur = (c == ' ' || c == '\t' || c == '\n' || c == ',' || c == '.');
if (separateur) {
dans_mot = 0;
} else if (!dans_mot) {
dans_mot = 1;
mots++;
}
i++;
}
return mots;
}
/* Exercice C6 */
int date_valide(int jour, int mois, int annee)
{
int max;
if (annee < 1 || mois < 1 || mois > 12 || jour < 1)
return 0;
if (mois == 2) {
if (est_bissextile(annee))
max = 29;
else
max = 28;
} else if (mois == 4 || mois == 6 || mois == 9 || mois == 11) {
max = 30;
} else {
max = 31;
}
return jour <= max;
}
int main(void)
{
int t[] = {12, 15, 9, 18};
printf("%d %d %d %s %d %d\n", carre(4), moyenne(t, 4), est_bissextile(2024),
nom_jour(3), date_valide(29, 2, 2023), compter_mots("Bonjour, le monde."));
return 0;
}
+71
View File
@@ -0,0 +1,71 @@
"""
R5.A.04 - Qualité Algorithmique
TD Complexité cyclomatique - Partie Python
Pour chaque fonction, calculez la complexité cyclomatique M.
"""
# Exercice P1
def celsius_vers_fahrenheit(celsius):
return celsius * 9 / 5 + 32
# Exercice P2
def signe(x):
if x > 0:
return 1
elif x < 0:
return -1
return 0
# Exercice P3
def notes_valides(notes):
return [n for n in notes if 0 <= n <= 20]
# Exercice P4
def mention(moyenne):
mentions = {16: "Très bien", 14: "Bien", 12: "Assez bien", 10: "Passable"}
for seuil, libelle in mentions.items():
if moyenne >= seuil:
return libelle
return "Ajourné"
# Exercice P5
def analyser_mot_de_passe(mdp, login=None):
problemes = []
if len(mdp) < 12:
problemes.append("trop court")
majuscule = minuscule = chiffre = special = False
for c in mdp:
if c.isupper():
majuscule = True
elif c.islower():
minuscule = True
elif c.isdigit():
chiffre = True
else:
special = True
if not (majuscule and minuscule):
problemes.append("mélanger majuscules et minuscules")
if not chiffre:
problemes.append("ajouter un chiffre")
if not special:
problemes.append("ajouter un caractère spécial")
if login and login.lower() in mdp.lower():
problemes.append("ne pas contenir le login")
for i in range(len(mdp) - 2):
if mdp[i] == mdp[i + 1] == mdp[i + 2]:
problemes.append("éviter 3 caractères identiques")
break
if not problemes:
return "fort", []
return ("moyen" if len(problemes) <= 2 else "faible"), problemes
if __name__ == "__main__":
print(celsius_vers_fahrenheit(20), signe(-3), notes_valides([12, 25, -1, 8]),
mention(13.5), analyser_mot_de_passe("Motdepasse123!", "maxime"))