\documentclass[10pt,aspectratio=169]{beamer}

% --- Thème ---
\usetheme[language=french]{Celestia}

% Avec [allowframebreaks] sur les frames de questions, Beamer ajoute
% par défaut « (1) », « (2) », « (3) »... sur chaque sous-slide. On
% supprime entièrement cette annotation : un template vide pour
% « frametitle continuation ». L'enseignant identifie visuellement la
% continuation par le contenu de la slide. (Les variantes [from second]
% et [roman] interagissent mal avec un titre contenant \textemdash{}
% sous Celestia : elles déclenchent une erreur « Missing $ inserted ».)
\setbeamertemplate{frametitle continuation}{}

\subject{Numérique et sciences informatiques}
\title{Fichiers CSV}
\subtitle{QCM}
\author{Première}
\date{\today}

\begin{document}

\begin{frame}
    \titlepage
\end{frame}

% Q1 - Réponse en A
\begin{frame}[fragile]{Question 1 \textemdash{} Que signifie CSV ?}
    Que signifie l'acronyme \textbf{CSV} ?\medskip
    \begin{itemize}
        \item[\alert<2>{A.}] \alert<2>{Comma Separated Values (valeurs séparées par des virgules)}
        \item[B.] Computer System Variables
        \item[C.] Compressed Storage Vector
        \item[D.] Centered Spreadsheet View
    \end{itemize}
\end{frame}

% Q2 - Réponse en C
\begin{frame}[fragile]{Question 2 \textemdash{} Structure d'un CSV}
    Quelle est la structure de base d'un fichier CSV ?\medskip
    \begin{itemize}
        \item[A.] Un fichier XML structuré par balises
        \item[B.] Un format JSON imbriqué
        \item[\alert<2>{C.}] \alert<2>{Un fichier texte où chaque ligne est un enregistrement et chaque champ est séparé par un délimiteur}
        \item[D.] Un fichier binaire avec en-tête et indexation
    \end{itemize}
\end{frame}

% Q3 - Réponse en C
\begin{frame}[fragile]{Question 3 \textemdash{} Séparateur en France}
    Pourquoi en France utilise-t-on souvent le \textbf{point-virgule}
\texttt{;} comme séparateur dans les fichiers CSV ?\medskip
    \begin{itemize}
        \item[A.] Parce que la norme ISO l'exige
        \item[B.] Parce que les fichiers seraient sinon trop volumineux
        \item[\alert<2>{C.}] \alert<2>{Parce que la virgule est utilisée comme séparateur décimal en français (par exemple \texttt{3,14}), ce qui crée un conflit}
        \item[D.] Parce que le point-virgule est plus rapide à taper
    \end{itemize}
\end{frame}

% Q4 - Réponse en D
\begin{frame}[fragile]{Question 4 \textemdash{} Ligne d'en-tête}
    À quoi sert la \textbf{première ligne} d'un fichier CSV ?\medskip
    \begin{itemize}
        \item[A.] Elle indique la taille du fichier
        \item[B.] Elle contient toujours les données du premier enregistrement
        \item[C.] Elle est obligatoirement vide
        \item[\alert<2>{D.}] \alert<2>{Elle contient les noms des colonnes (en-tête)}
    \end{itemize}
\end{frame}

% Q5 - Réponse en C
\begin{frame}[fragile]{Question 5 \textemdash{} Extension de fichier}
    Quelle est l'extension habituelle d'un fichier CSV ?\medskip
    \begin{itemize}
        \item[A.] .json
        \item[B.] .txt
        \item[\alert<2>{C.}] \alert<2>{.csv}
        \item[D.] .xlsx
    \end{itemize}
\end{frame}

% Q6 - Réponse en C
\begin{frame}[fragile]{Question 6 \textemdash{} Lecture sans le module csv}
    Sans utiliser le module \texttt{csv}, comment peut-on lire
un fichier CSV simple en Python ?\medskip
    \begin{itemize}
        \item[A.] Avec \texttt{os.read()}
        \item[B.] Avec \texttt{print('csv')}
        \item[\alert<2>{C.}] \alert<2>{Avec \texttt{open()} puis \texttt{.split(',')} sur chaque ligne}
        \item[D.] Avec \texttt{import json} et \texttt{json.load()}
    \end{itemize}
\end{frame}

% Q7 - Réponse en A
\begin{frame}[fragile]{Question 7 \textemdash{} Module standard}
    Quel module de la bibliothèque standard de Python
facilite la manipulation des fichiers CSV ?\medskip
    \begin{itemize}
        \item[\alert<2>{A.}] \alert<2>{\texttt{csv}}
        \item[B.] \texttt{pandas}
        \item[C.] \texttt{numpy}
        \item[D.] \texttt{xml.etree}
    \end{itemize}
\end{frame}

% Q8 - Réponse en C
\begin{frame}[fragile]{Question 8 \textemdash{} Encodage recommandé}
    Quel \textbf{encodage} est aujourd'hui recommandé pour les
fichiers CSV ?\medskip
    \begin{itemize}
        \item[A.] ISO-8859-1 uniquement
        \item[B.] Binaire compressé
        \item[\alert<2>{C.}] \alert<2>{UTF-8}
        \item[D.] ASCII pur
    \end{itemize}
\end{frame}

% Q9 - Réponse en D
\begin{frame}[fragile]{Question 9 \textemdash{} Itération avec csv.reader}
    Que renvoie \texttt{csv.reader(f)} lorsqu'on l'utilise dans
une boucle \texttt{for ligne in csv.reader(f):} ?\medskip
    \begin{itemize}
        \item[A.] Un dictionnaire \texttt{\{nom\_colonne: valeur\}}
        \item[B.] Une chaîne de caractères pour chaque ligne
        \item[C.] Un tuple immuable
        \item[\alert<2>{D.}] \alert<2>{Une liste des champs de chaque ligne}
    \end{itemize}
\end{frame}

% Q10 - Réponse en C
\begin{frame}[fragile]{Question 10 \textemdash{} Écrire dans un CSV}
    Quelle fonction du module \texttt{csv} permet d'\textbf{écrire}
dans un fichier CSV ?\medskip
    \begin{itemize}
        \item[A.] \texttt{csv.save()}
        \item[B.] \texttt{csv.put()}
        \item[\alert<2>{C.}] \alert<2>{\texttt{csv.writer()}}
        \item[D.] \texttt{csv.write()}
    \end{itemize}
\end{frame}

% Q11 - Réponse en C
\begin{frame}[fragile]{Question 11 \textemdash{} Différence reader / DictReader}
    Quelle est la différence entre \texttt{csv.reader} et
\texttt{csv.DictReader} ?\medskip
    \begin{itemize}
        \item[A.] \texttt{DictReader} lit plus vite
        \item[B.] \texttt{reader} n'existe pas en Python 3
        \item[\alert<2>{C.}] \alert<2>{\texttt{reader} produit des listes, \texttt{DictReader} produit des dictionnaires indexés par les noms de colonnes (lus depuis l'en-tête)}
        \item[D.] \texttt{DictReader} ignore l'en-tête
    \end{itemize}
\end{frame}

% Q12 - Réponse en A
\begin{frame}[fragile]{Question 12 \textemdash{} Conversion de types}
    Après lecture, on obtient \texttt{ligne = ["Alice", "17"]}.
Comment obtenir un âge utilisable comme nombre ?\medskip
    \begin{itemize}
        \item[\alert<2>{A.}] \alert<2>{\texttt{age = int(ligne[1])}}
        \item[B.] \texttt{age = list(ligne[1])}
        \item[C.] \texttt{age = ligne[1].number()}
        \item[D.] \texttt{age = ligne[1]}
    \end{itemize}
\end{frame}

% Q13 - Réponse en B
\begin{frame}[fragile]{Question 13 \textemdash{} Spécifier le séparateur}
    Comment lire un CSV utilisant le \textbf{point-virgule}
comme séparateur avec le module \texttt{csv} ?\medskip
    \begin{itemize}
        \item[A.] \texttt{csv.reader(f).set\_separator(';')}
        \item[\alert<2>{B.}] \alert<2>{\texttt{csv.reader(f, delimiter=';')}}
        \item[C.] \texttt{csv.reader\_semicolon(f)}
        \item[D.] \texttt{csv.reader(f)} (suffisant, le module détecte tout seul)
    \end{itemize}
\end{frame}

% Q14 - Réponse en D
\begin{frame}[fragile]{Question 14 \textemdash{} Champs contenant le séparateur}
    Comment représente-t-on un champ contenant le
caractère séparateur (par exemple une virgule) dans
un CSV à séparateur virgule ?\medskip
    \begin{itemize}
        \item[A.] On échappe la virgule avec un antislash \texttt{\textbackslash{},}
        \item[B.] On supprime la virgule du champ
        \item[C.] On change le séparateur pour ce champ uniquement
        \item[\alert<2>{D.}] \alert<2>{On entoure le champ de guillemets doubles : \texttt{"Lyon, France"}}
    \end{itemize}
\end{frame}

% Q15 - Réponse en C
\begin{frame}[fragile,allowframebreaks]{Question 15 \textemdash{} Trace de lecture}
    Le fichier \texttt{eleves.csv} contient :
\begin{lstlisting}
nom;age
Alice;17
Bob;16
\end{lstlisting}
Que vaut \texttt{ligne} au premier passage de la boucle
\texttt{for ligne in csv.DictReader(open("eleves.csv"), delimiter=";")} ?\medskip
    \begin{itemize}
        \item[A.] \texttt{['Alice', '17']}
        \item[B.] \texttt{['nom', 'age']}
        \item[C.] \texttt{\{'nom': 'Alice', 'age': '17'\}}
        \item[D.] \texttt{\{'Alice': '17', 'Bob': '16'\}}
    \end{itemize}
\end{frame}

% Q15 - Réponse en C
\begin{frame}[fragile,allowframebreaks]{Question 15 \textemdash{} Trace de lecture}
    Le fichier \texttt{eleves.csv} contient :
\begin{lstlisting}
nom;age
Alice;17
Bob;16
\end{lstlisting}
Que vaut \texttt{ligne} au premier passage de la boucle
\texttt{for ligne in csv.DictReader(open("eleves.csv"), delimiter=";")} ?\medskip
    \begin{itemize}
        \item[A.] \texttt{['Alice', '17']}
        \item[B.] \texttt{['nom', 'age']}
        \item[\alert{C.}] \alert{\texttt{\{'nom': 'Alice', 'age': '17'\}}}
        \item[D.] \texttt{\{'Alice': '17', 'Bob': '16'\}}
    \end{itemize}
\end{frame}

% Q16 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 16 \textemdash{} Filtrer les données}
    Comment afficher seulement les élèves de plus de
16 ans à partir d'un CSV \texttt{nom,age} lu via
\texttt{csv.DictReader} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
for ligne in lecteur:
    print(ligne["nom"]) if ligne["age"] > 16
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
lecteur.filter(age > 16)
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
for ligne in lecteur:
    if ligne["age"] > 16:
        print(ligne["nom"])
\end{lstlisting}

        \item[D.]~\\
\begin{lstlisting}
for ligne in lecteur:
    if int(ligne["age"]) > 16:
        print(ligne["nom"])
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q16 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 16 \textemdash{} Filtrer les données}
    Comment afficher seulement les élèves de plus de
16 ans à partir d'un CSV \texttt{nom,age} lu via
\texttt{csv.DictReader} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
for ligne in lecteur:
    print(ligne["nom"]) if ligne["age"] > 16
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
lecteur.filter(age > 16)
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
for ligne in lecteur:
    if ligne["age"] > 16:
        print(ligne["nom"])
\end{lstlisting}

        \item[\alert{D.}]~\\
\begin{lstlisting}
for ligne in lecteur:
    if int(ligne["age"]) > 16:
        print(ligne["nom"])
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q17 - Réponse en C
\begin{frame}[fragile]{Question 17 \textemdash{} Argument newline=''}
    Pourquoi écrit-on souvent
\texttt{open("data.csv", "w", newline="", encoding="utf-8")}
pour écrire un CSV ?\medskip
    \begin{itemize}
        \item[A.] Pour ajouter une ligne d'en-tête automatiquement
        \item[B.] Pour rendre le fichier illisible par les humains
        \item[\alert<2>{C.}] \alert<2>{Pour éviter d'insérer des lignes vides entre chaque enregistrement sous Windows (problème classique de gestion des fins de ligne)}
        \item[D.] Pour augmenter les performances
    \end{itemize}
\end{frame}

% Q18 - Réponse en D
\begin{frame}[fragile]{Question 18 \textemdash{} Valeurs manquantes}
    Dans un CSV avec \texttt{nom,age,ville} et la ligne
\texttt{Alice,,Lyon}, que vaut \texttt{ligne["age"]} après lecture
par \texttt{csv.DictReader} ?\medskip
    \begin{itemize}
        \item[A.] Le programme lève une exception
        \item[B.] \texttt{0}
        \item[C.] \texttt{None}
        \item[\alert<2>{D.}] \alert<2>{\texttt{''} (chaîne vide)}
    \end{itemize}
\end{frame}

% Q19 - Réponse en A
\begin{frame}[fragile]{Question 19 \textemdash{} Export depuis tableur}
    Quelle situation correspond à un cas d'usage typique
du format CSV ?\medskip
    \begin{itemize}
        \item[\alert<2>{A.}] \alert<2>{Échanger un tableau de notes entre Pronote, un tableur et un script Python}
        \item[B.] Stocker une vidéo HD
        \item[C.] Construire une page web interactive
        \item[D.] Programmer un microcontrôleur
    \end{itemize}
\end{frame}

% Q20 - Réponse en B
\begin{frame}[fragile]{Question 20 \textemdash{} CSV vs JSON}
    Pour stocker une \textbf{liste plate de personnes}
(nom, âge, ville), CSV ou JSON ?\medskip
    \begin{itemize}
        \item[A.] JSON est obligatoire dès qu'on programme
        \item[\alert<2>{B.}] \alert<2>{CSV est le plus adapté car les données sont tabulaires et plates}
        \item[C.] Aucun, il faut une base de données
        \item[D.] XML est toujours le bon choix
    \end{itemize}
\end{frame}

% Q21 - Réponse en C
\begin{frame}[fragile]{Question 21 \textemdash{} Bug d'encodage}
    Un élève lit un CSV créé sous Windows et obtient
\texttt{Café} au lieu de \texttt{Café}. Quelle est la cause la
plus probable ?\medskip
    \begin{itemize}
        \item[A.] Python est trop ancien pour gérer l'UTF-8
        \item[B.] Le fichier est corrompu
        \item[\alert<2>{C.}] \alert<2>{Le fichier est encodé en UTF-8 mais lu comme du Latin-1 (ISO-8859-1)}
        \item[D.] La connexion internet est instable
    \end{itemize}
\end{frame}

% Q22 - Réponse en C
\begin{frame}[fragile]{Question 22 \textemdash{} Parsing à la main}
    Pourquoi \texttt{ligne.split(',')} est-il \textbf{insuffisant}
pour parser correctement la ligne CSV
\texttt{"Doe, John",42,"Lyon, France"} ?\medskip
    \begin{itemize}
        \item[A.] \texttt{split} ne fonctionne que sur des fichiers UTF-8
        \item[B.] \texttt{split} modifie le fichier d'origine
        \item[\alert<2>{C.}] \alert<2>{\texttt{split} ne respecte pas les guillemets et coupe à chaque virgule, donnant 5 champs au lieu de 3}
        \item[D.] \texttt{split} est trop lent
    \end{itemize}
\end{frame}

% Q23 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 23 \textemdash{} Calcul d'une moyenne}
    Le fichier \texttt{notes.csv} contient une colonne \texttt{note}
(entête en première ligne) avec des nombres entiers.
Quel code calcule correctement la \textbf{moyenne} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
moyenne = csv.mean("notes.csv", "note")
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    moyenne = sum(csv.reader(f)) / 2
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    total = 0
    for ligne in csv.DictReader(f):
        total += ligne["note"]
    moyenne = total / len(lignes)
\end{lstlisting}

        \item[D.]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    notes = [int(ligne["note"]) for ligne in csv.DictReader(f)]
moyenne = sum(notes) / len(notes)
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q23 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 23 \textemdash{} Calcul d'une moyenne}
    Le fichier \texttt{notes.csv} contient une colonne \texttt{note}
(entête en première ligne) avec des nombres entiers.
Quel code calcule correctement la \textbf{moyenne} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
moyenne = csv.mean("notes.csv", "note")
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    moyenne = sum(csv.reader(f)) / 2
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    total = 0
    for ligne in csv.DictReader(f):
        total += ligne["note"]
    moyenne = total / len(lignes)
\end{lstlisting}

        \item[\alert{D.}]~\\
\begin{lstlisting}
with open("notes.csv") as f:
    notes = [int(ligne["note"]) for ligne in csv.DictReader(f)]
moyenne = sum(notes) / len(notes)
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q24 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 24 \textemdash{} Écrire avec en-tête}
    Quel code écrit correctement un CSV avec en-tête à
partir d'une liste de tuples
\texttt{donnees = [("Alice", 17), ("Bob", 16)]} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
csv.write("out.csv", donnees)
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
with open("out.csv", "w") as f:
    f.write(donnees)
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
with open("out.csv", "w") as f:
    for nom, age in donnees:
        f.write(nom + "," + age + "\n")
\end{lstlisting}

        \item[D.]~\\
\begin{lstlisting}
with open("out.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["nom", "age"])
    w.writerows(donnees)
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q24 - Réponse en D
\begin{frame}[fragile,allowframebreaks]{Question 24 \textemdash{} Écrire avec en-tête}
    Quel code écrit correctement un CSV avec en-tête à
partir d'une liste de tuples
\texttt{donnees = [("Alice", 17), ("Bob", 16)]} ?\medskip
    \begin{itemize}
        \item[A.]~\\
\begin{lstlisting}
csv.write("out.csv", donnees)
\end{lstlisting}

        \item[B.]~\\
\begin{lstlisting}
with open("out.csv", "w") as f:
    f.write(donnees)
\end{lstlisting}

        \item[C.]~\\
\begin{lstlisting}
with open("out.csv", "w") as f:
    for nom, age in donnees:
        f.write(nom + "," + age + "\n")
\end{lstlisting}

        \item[\alert{D.}]~\\
\begin{lstlisting}
with open("out.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["nom", "age"])
    w.writerows(donnees)
\end{lstlisting}

    \end{itemize}
\end{frame}

% Q25 - Réponse en A
\begin{frame}[fragile]{Question 25 \textemdash{} Limite du CSV}
    Parmi les affirmations suivantes sur le format CSV,
laquelle est \textbf{fausse} ?\medskip
    \begin{itemize}
        \item[\alert<2>{A.}] \alert<2>{CSV impose une typage explicite des colonnes (entier, flottant, date)}
        \item[B.] CSV ne gère pas nativement les structures hiérarchiques (listes imbriquées, dictionnaires)
        \item[C.] CSV est un format texte, lisible avec n'importe quel éditeur
        \item[D.] Le séparateur n'est pas standardisé universellement (virgule, point-virgule, tabulation...)
    \end{itemize}
\end{frame}

\begin{frame}[standout]{}
    Fin de l'évaluation
\end{frame}

\end{document}
