\thumb

%%%

\begin{qcm}{Savoir traduire un programme}{5} % titre , temps
\enlargethispage*{3em}
Pour chacune des questions suivantes, quatre propositions sont faites, mais une seule est correcte. Laquelle ?

\begin{questions}
\item \begin{listing}[language=fortran]{En Fortran}{06-01-01.f}\end{listing}

\Par

Ce programme :

\begin{tabularx}{\linewidth}{@{}Zl@{~}X@{}}
\choix & convertit une température réelle exprimée en degrés Fahrenheit en degrés Celsius; \\
\choix & convertit une température réelle exprimée en degrés Celsius en Fahrenheit;\\
\choix & convertit une température entière exprimée en degrés Fahrenheit en degrés Celsius;\\
\choix & convertit une température entière exprimée en degrés Celsius en Fahrenheit.
\end{tabularx}

\item\resetchoix \begin{listing}[language=java]{En Java}{06-01-02.jnlp}\end{listing}

\Par

Ce programme:

\begin{tabularx}{\linewidth}{@{}Zl@{~}X@{}}
\choix & affiche l'antécédent de 4 par la fonction $x\mapsto3x+5$;\\
\choix & affiche l'image de 4 par la fonction $x\mapsto3x+5$;\\
\choix & affiche les antécédents de tous les entiers de l'intervalle $[4~;10]$ par la fonction $x\mapsto3x+5$;\\
\choix & affiche les images de tous les entiers de l'intervalle $[4~;10]$ par la fonction $x\mapsto3x+5$.
\end{tabularx}
\end{questions}
\end{qcm}

\begin{corrige}
\begin{questions}
\item Réponse \choix[c]. La variable \texttt{degreesfahrenheit} est \textit{a priori} lue, et le programme retourne la variable \texttt{degreescelsius}.

\item Réponse \choix[d]. La boucle \og while \fg{} montre que les instructions suivantes sont répétées tant que $x\leqslant10$ et dans la boucle, on voit que $x$ reçoit la valeur $x+1$ à chaque fois; donc les valeurs prises par $x$ sont : 4, 5, 6, 7, 8, 9 et 10. De plus, dans cette boucle, $y=3x+5$ donc $y$ représente l'image de $x$ par la fonction $x\mapsto3x+5$. Le programme affiche donc bien les images de toutes les valeurs entières de $x$ dans l'intervalle $[4~;10]$.
\end{questions}
\end{corrige}

%%%

\begin{vf}{Rédaction de programmes}{5} % titre , temps
\NathanLiveVideo[\PictoVideo\ Retrouvez le corrigé de cet exercice en vidéo.]{rédaction de programmes}{https://media.prepamath.fr/IL1NSIch04exVF}

\qrset{height=1.1cm,version=5}\rput(-1,0.2){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch04exVF}}}
\vspace*{-20pt}

\begin{listing}[language=C]{En C}{06-02.c}\end{listing}

\Par

Ce programme est-il correctement écrit?
\end{vf}

\begin{corrige}
\qrset{height=1.1cm,version=5}\rput(-1,-0.4){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch04exVF}}}
On peut remarquer que les variables $x$ et $y$ sont déclarées avec le type \og double \fg. Or, $y$ prend la valeur \texttt{convert(x)}, qui est une fonction de type \og int \fg; il y a donc ici une confusion de types.

Pour que le programme fonctionne, il faudrait déclarer la fonction ainsi : \og \texttt{double convert(x)} \fg.
\end{corrige}

\sectionnn{Interpréter un langage}

%%% 

\begin{exo}{Programme PHP}{Lycée Camille Claudel, Blois}{1}{10} 
\begin{listing}[language=php]{En PHP}{06-04.php}\end{listing}

\Par

Que fait ce programme?
\end{exo}

\begin{corrige}
La 1\iere{} ligne du programme affecte une valeur à une variable texte; d'après le nom donné à la variable, il s'agit du chemin vers une image, donc d'un répertoire dans lequel se trouve une image.

La seconde ligne définit un tableau (\og array \fg) de 4 valeurs.

Ensuite, l'instruction \texttt{foreach} ressemble à \og for \fg{} : il s'agit alors d'une boucle. Son argument (\texttt{\$arr as \$value}) fait référence au tableau précédemment défini. On peut donc traduire cela par le fait que l'on va parcourir ce tableau et que chaque valeur sera désignée par la variable \texttt{\$value}.

L'instruction \texttt{echo} signifie que l'on affiche quelque chose. La suite ressemble à du HTML et la balise \texttt{<img src='...'>} nous dit que l'on affiche une image, donc le nom est le répertoire suivi de la valeur sur laquelle on est. Concrètement, le code HTML engendré par le programme PHP est :

\Par

\begin{tabular}{@{\qquad}>{\ttfamily}l}
<img src='/images/4.png'/>\\
<img src='/images/7.png'/>\\
<img src='/images/19.png'/>\\
<img src='/images/23.png'/>
\end{tabular}

\Par

Ce programme affiche donc 4 images.
\end{corrige}



%%% 

\begin{exo}{Programme en Java}{Lycée Henri Bergson, Angers}{1}{10} 
Que fait ce programme écrit en Java proposé page suivante?
\newpage
\begin{listing}[language=java]{En Java}{06-03.txt}\end{listing}
\end{exo}

\begin{corrige}
Ce programme est composé de deux parties :
\begin{itemize}
\item la première partie est \textit{a priori} la partie principale (le terme \og main \fg{} confirme que c'est le cas). Sont déclarées dans cette partie une table de valeurs\linebreak (12, $-5$, 7, ...) ainsi qu'une variable \texttt{elt} de type \textit{long}. La boucle \og for \fg{} parcourt le tableau de valeurs et teste si \texttt{elt} est égale à la valeur sur laquelle on est, auquel cas la boucle \og for \fg{} est rompue (\og break \fg) et la fonction \texttt{afficher} est appelée (fonction qui est hors de la boucle!);

\item la seconde partie est justement la définition de la fonction \texttt{afficher}, qui prend deux arguments : le premier est un entier de type \texttt{int}, le second un entier de type \texttt{long}. Cette fonction teste si le premier argument (\texttt{rang}) vaut 8 (dernier rang de la table), auquel cas cela signifie que l'argument \texttt{elt} n'est pas dans la table, et un message est affiché. Sinon, l'argument \texttt{elt} est trouvé et un message est affiché.
\end{itemize}
Finalement, ce programme affiche si un élément informé à l'avance est trouvé ou pas dans la table.
\end{corrige}

%%%

\begin{exo}{Programme en C}{Lycée Sophie Germain, Paris}{1}{10} 
\NathanLiveVideo[\PictoVideo\ Retrouvez le corrigé de cet exercice en vidéo.]{programme en C}{https://media.prepamath.fr/IL1NSIch04exProgC}

\qrset{height=1.1cm,version=5}\rput(-1,0.2){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch04exProgC}}}
\vspace*{-10pt}

Qu'affiche le programme ci-dessous, écrit en C?

\begin{listing}[language=C]{En C}{06-05-1.c}\end{listing}

\Par

\textit{(suite du programme page suivante)}


\newpage

\begin{listing}[language=C]{suite du programme en C}{06-05-2.c}\end{listing}
\end{exo}

\begin{corrige}
\qrset{height=1.1cm,version=5}\rput(-1,-0.4){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch04exProgC}}}
Ce programme est composé de 3 parties principales (hors en-tête):
\begin{itemize}
\item \textit{la partie main}, qui va exécuter le programme principal. On y déclare un tableau à 3 valeurs (8,4,6). On appelle ensuite les fonctions \texttt{tri} et \texttt{affiche};

\item \textit{la fonction \texttt{tri}}, qui prend pour arguments un entier $n$ et un tableau de valeurs. Dans cette fonction, on parcourt le tableau et on inverse l'ordre de deux valeurs consécutives si la première est supérieure à la seconde. Ainsi, cette fonction trie dans l'ordre croissant les valeurs du tableau;

\item \textit{la fonction \texttt{affiche}}, qui prend les mêmes arguments que la fonction précédente, et dans laquelle on parcourt le tableau pour en afficher les valeurs une à une.
\end{itemize}
Ce programme affiche donc le tableau de valeurs après avoir trié ces dernières dans l'ordre croissant.

\begin{Remarque}
la présence d'un astérisque après \texttt{int} signifie que la variable \texttt{table} \og pointe \fg{} vers un emplacement en mémoire contenant un entier (\texttt{int}) ou un tableau d'entiers. On appelle cela un \textit{pointeur}.
\end{Remarque}
\newpage
\end{corrige}

\sectionnn{\'Ecriture de programmes}


% NEW 2025

\begin{exo}{Du Javascript au Python}{Lycée Lycée Henri Alain-Fournier, Bourges}{1}{10}
\enlargethispage*{5em}
Convertir le programme suivant, écrit en Javascript, en Python:

\begin{listing}[language=Javascript]{}{04-JS-python.js}\end{listing}

\end{exo}

\begin{corrige}
Voici le programme Python correspondant au programme écrit en Javascript proposé:

\begin{listing}{}{04-JS-python-corrige.py}\end{listing}
\end{corrige}

%%% 

\newpage

\begin{exo}{Prototyper une fonction}{Lycée Camille Jullian, Bordeaux}{1}{10} 
Dans chacun des cas suivants, prototyper les fonctions demandées. 
\begin{questions}
\item La fonction \texttt{convert} convertit une durée exprimée en minutes en une durée exprimée en heures et minutes. Elle affiche le résultat sous la forme \og ... h ... min \fg.

\item La fonction \texttt{FarToCel} convertit une température en degré Fahrenheit en degré Celsius. Elle renvoie le résultat sous forme de nombre.
\end{questions}
\end{exo}

\begin{corrige}
\begin{questions}
\item La fonction \texttt{convert} admet un argument : un entier (la durée en minutes). Le résultat est un texte. 

\item La fonction \texttt{FarToCel} admet un argument : un nombre réel (un flottant), et renvoie un nombre réel (un flottant).

En C, le prototype sera :


\Par

\qquad\texttt{double FarToCel(double temp);}
\end{questions}
\end{corrige}



%%%

\begin{exo}{Convertisseur de temps}{Lycée Sainte-Anne, Brest}{1}{15} 
\NathanLiveVideo[\PictoVideo\ Retrouvez le corrigé de cet exercice en vidéo.]{convertisseur de temps}{https://media.prepamath.fr/IL1NSIch04exConvertTemps}

\qrset{height=1.1cm,version=5}\rput(-1,0.3){
\psframebox{\qrcode{https://media.prepamath.fr/IL1NSIch04exConvertTemps}}}
\vspace*{-15pt}

\'Ecrire un programme en Python ou en C comprenant:
\begin{itemize}
\item une partie principale qui demande un temps (exprimé en minutes);
\item une fonction \texttt{convert1} qui convertit le temps saisi en temps exprimé en heures et minutes;
\item une fonction \texttt{convert2} qui convertit le temps saisi en temps exprimé en heure décimale (par exemple, 90 minutes est converti en 1,5 heure).
\end{itemize}
\end{exo}

\begin{corrige}
\enlargethispage*{5em}
% lien : 
\qrset{height=1.1cm,version=5}\rput(-1,-0.4){
\psframebox{\qrcode{https://idl-live.prepamath.fr/IL1NSI/04-ConvertTemps-C.c}}}
\vspace*{-16pt}
\begin{listing}[language=C]{En C}{04-ConvertTemps-C-1.c}\end{listing}

\newpage

\begin{listing}[language=C]{suite du programme en C}{04-ConvertTemps-C-2.c}\end{listing}

\Par\Par

\qrset{height=1.1cm,version=5}\rput(-1,-0.4){
\psframebox{\qrcode{https://idl-live.prepamath.fr/IL1NSI/04-ConvertTemps-Python.py}}}
\vspace*{-16pt}
\begin{listing}[language=python]{En Python}{04-ConvertTemps-Python.py}\end{listing}

\end{corrige}

% NEW 2025

\begin{exo}{Conversions de programmes \newexo}{Lycée François Mauriac, Bordeaux}{20}{2}
\enlargethispage*{5em}
\begin{questions}
\item Traduire le programme Fortran suivant vers Python.

\begin{listing}[language=fortran]{}{04-conversions-fortran.f}\end{listing}

\item Traduire le programme PHP suivant vers Python.

\begin{listing}[language=php]{}{04-conversions-php.php}\end{listing}

\newpage

\item Traduire le programme C suivant vers Python.

\begin{listing}[language=C]{}{04-conversions-C.c}\end{listing}

\end{questions}
\end{exo}

\begin{corrige}
\enlargethispage*{5em}
\begin{questions}
\item %Le programme Python correspondant au programme Fortran donné est celui proposé page suivante.

\begin{listing}{De Fortan à Python}{04-conversions-fortran-python.py}\end{listing}

\newpage

\item 
\begin{listing}{De C à Python}{04-conversions-C-python.py}\end{listing}

\item 
\begin{listing}{De PHP à Python}{04-conversions-php-python.py}\end{listing}
\end{questions}
\end{corrige}

\vspace*{-2em}
\sectionnn{Spécifications et tests}

%%% NEW 2025

\begin{exo}{Prototyper une fonction \newexo}{Lycée Richelieu, Versailles}{1}{5} 
Dans chacun des cas suivants, prototyper les fonctions demandées. 
\begin{questions}
\item La fonction \texttt{convert} convertit une durée exprimée en minutes en une durée exprimée en heures et minutes. Elle affiche le résultat sous la forme \og ... h ... min \fg.

\item La fonction \texttt{FarToCel} convertit une température en degré Fahrenheit en degré Celsius. Elle renvoie le résultat sous forme de nombre.
\end{questions}
\end{exo}

\begin{corrige}
\begin{questions}
\item La fonction \texttt{convert} admet un argument : un entier (la durée en minutes). Le résultat est un texte. 

\item La fonction \texttt{FarToCel} admet un argument : un nombre réel (un flottant), et renvoie un nombre réel (un flottant).

En C, le prototype sera :


\Par

\qquad\texttt{double FarToCel(double temp);}
\end{questions}
\end{corrige}



% NEW 2025

\begin{exo}{Documenter une fonction \newexo}{Lycée Jean Macé, Niort}{2}{10} 
\enlargethispage*{\baselineskip}
Voici la définition d'une fonction :
\begin{listing}[language=python]{}{06-docfct.py}\end{listing}
\begin{questions}

\item \'Ecrire une docstring pour cette fonction, en détaillant les pré- et postconditions.

\item Proposer des assertions pour vérifier les préconditions.
\end{questions}
\end{exo}

\begin{corrige}
\enlargethispage*{5em}
\begin{questions}
\item La fonction calcule un produit scalaire (en plus, c'est son nom, cela facilite les choses). Elle admet deux paramètres, \texttt{u} et \texttt{v}. On sait qu'un produit scalaire est une manière de multiplier deux vecteurs entre eux et dont le résultat est un scalaire (c'est-à-dire un nombre). Ici, les vecteurs sont de dimension 2 : $\vec{u}\cdot\vec{v} = u_x\cdot v_x + u_y\cdot v_y$. La ligne 5 utilise clairement des indices (\texttt{0} et \texttt{1}) pour \texttt{u} et \texttt{v}. On peut donc supposer que \texttt{u} et \texttt{v} sont des \textit{tuples}. Voici donc une proposition de docstring :
\begin{listing}[language=python]{}{06-docfct-corr.py}\end{listing}

\newpage

\item On vérifie que \texttt{u} et \texttt{v} sont des tuples, qu'ils sont de dimension 2 et que chacun des nombres qu'ils contiennent sont soit de type \texttt{float} soit de type \texttt{int} :
\begin{listing}[language=python]{}{06-docfct-corr2.py}\end{listing}
\end{questions}
\end{corrige}

% NEW 2025

\begin{exo}{\'Ecrire les assertions et le jeu de test}{Lycée André Theuriet, Civray}{2}{10}
La fonction suivante teste la validité d'une adresse mail :

\qrset{height=1.1cm,version=5}\rput(-1,-0.7){
\psframebox{\qrcode{https://idl-live.prepamath.fr/IL1NSI/06-asstest.py}}}
\vspace*{-10pt}
\begin{listing}[language=python]{}{06-asstest.py}\end{listing}
\begin{questions}
\item \'Ecrire les instructions \texttt{assert} vérifiant les préconditions.

\item \'Ecrire un jeu de test sous la forme d'une suite d'assertions.
\end{questions}
\end{exo}

\begin{corrige}
\begin{questions}
\item Les assertions doivent garantir que \texttt{email} est de type \texttt{str} et que ce n'est pas une chaîne vide :
\begin{listing}[language=python]{}{06-asstest-corr.py}\end{listing}

\item Le jeu de test est une suite d'assertions sur le résultat renvoyé par la fonction. Il faut envisager différents cas d'emails valides ou invalides :
\begin{listing}[language=python]{}{06-asstest-corr2.py}\end{listing}
\end{questions}
\end{corrige}

% NEW 2025 (supprimé par manque de place)

%\begin{exo}{Division euclidienne}{Lycée Augustin Fresnel, Caen}{2}{15}
%On considère la fonction suivante, qui opère une division euclidienne (on se limitera au domaine des nombres entiers positifs).
%\begin{listing}[language=python]{}{06-diveuclid.py}\end{listing}
%\begin{questions}
%\item Lister l'ensemble des préconditions (l'une d'entre elles n'a pas été citée dans les commentaires mais est indispensable d'un point de vue mathématique).
%
%\item \'Ecrire les instructions \texttt{assert} implémentant les tests de ces préconditions.
%
%\item \'Ecrire la postcondition sous forme d'un calcul utilisant \texttt{q}, \texttt{a}, \texttt{b} et \texttt{r}.
%
%\item Implémenter cette postcondition avec une instruction \texttt{assert}. 
%\end{questions}
%\end{exo}
%
%\begin{corrige}
%\begin{questions}
%\item Préconditions : \begin{itemize}
%
%\item \texttt{a} et \texttt{b} sont des entiers positifs ;
%
%\item \texttt{b} est non nul.
%\end{itemize}
%
%\item On insèrera les assertions suivantes au début du code de la fonction :
%\begin{listing}[language=python]{}{06-diveuclid-corr1.py}\end{listing}
%\Par \textit{Remarque :} l'évaluation paresseuse du \texttt{and} fait que la deuxième condition (inégalité) n'est pas évaluée dès lors que \texttt{a} ou \texttt{b} n'est pas un entier.
%
%\item La postcondition est : $$q \times b + r = a$$
%
%\item L'assertion vérifiant la postcondition est :
%\texttt{assert a == q * b + r, "Calcul faux"}
%\end{questions}
%\end{corrige}


\thumb
\AfficheCorrige
