#!/usr/bin/env python3 import random import io from fpdf import FPDF def generer_nombre(): """Génère un nombre naturel entre 1 et 9""" return random.randint(1, 9) def evaluer_expression(expr): """Évalue une expression mathématique en remplaçant × par *""" try: # Remplacer × par * pour l'évaluation expr_eval = expr.replace('×', '*') return eval(expr_eval) except: return -1 # En cas d'erreur, considérer comme négatif def generer_expression(): """Génère une expression aléatoire respectant les contraintes""" # On choisit aléatoirement un type d'expression (avec ou sans parenthèses) # On vérifie que le résultat est positif expressions_positives = [ lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()}", lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}", lambda: f"({generer_nombre()} + {generer_nombre()}) × ({generer_nombre()} + {generer_nombre()})", lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()} + {generer_nombre()}", lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()} + {generer_nombre()}", lambda: f"{generer_nombre()} × {generer_nombre()} + {generer_nombre()} - {generer_nombre()} × {generer_nombre()}", lambda: f"({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}", lambda: f"{generer_nombre()} + {generer_nombre()} × ({generer_nombre()} + {generer_nombre()}) - {generer_nombre()}", lambda: f"({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} × {generer_nombre()} - {generer_nombre()}", lambda: f"{generer_nombre()} × ({generer_nombre()} + {generer_nombre()}) + {generer_nombre()} - {generer_nombre()}", lambda: f"{generer_nombre()} + {generer_nombre()} × {generer_nombre()} - {generer_nombre()} × {generer_nombre()} + {generer_nombre()}", lambda: f"({generer_nombre()} + {generer_nombre()}) × {generer_nombre()} - {generer_nombre()} + {generer_nombre()} - {generer_nombre()}", ] # Essayer jusqu'à ce qu'on obtienne une expression avec résultat positif while True: choix = random.choice(expressions_positives) expr = choix() resultat = evaluer_expression(expr) if resultat >= 0: return expr def generer_feuille_exercices(n_exercices=20): """Génère une feuille d'exercices en format 2 colonnes""" expressions = [generer_expression() for _ in range(n_exercices)] # Format 2 colonnes : on affiche par paires output = "" for i in range(0, n_exercices, 2): expr1 = f"{i+1}. {expressions[i]}" expr2 = f"{i+2}. {expressions[i+1]}" if i+1 < len(expressions) else "" # Alignement pour deux colonnes output += f"{expr1:<36} {expr2}\n" + " " * 36 + " \n" * 3 return output def generer_pdf_exercices_en_memoire(n_exercices=20): """Génère une feuille d'exercices au format PDF en mémoire""" pdf = FPDF() pdf.add_page() pdf.set_font("Helvetica", size=12) # Titre pdf.cell(200, 10, text="Feuille d'exercices d'opérations", new_x="LMARGIN", new_y="NEXT", align='C') pdf.ln(10) # Contenu en 2 colonnes expressions = [generer_expression() for _ in range(n_exercices)] for i in range(0, n_exercices, 2): # Colonne 1 expr1 = f"{i+1}. {expressions[i]}" pdf.cell(90, 10, text=expr1, border=0, align='L') # Colonne 2 if i+1 < len(expressions): expr2 = f"{i+2}. {expressions[i+1]}" pdf.cell(90, 10, text=expr2, border=0, align='L') pdf.ln(10) # Espacement supplémentaire - ajout de deux lignes vides supplémentaires pdf.ln(15) # Retourner les données PDF en mémoire return pdf.output() def generer_pdf_exercices(n_exercices=20, output_file="exercices.pdf"): """Génère une feuille d'exercices au format PDF""" pdf_data = generer_pdf_exercices_en_memoire(n_exercices) # Sauvegarde du PDF with open(output_file, "wb") as f: f.write(pdf_data) return output_file