<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Accueil on INF 1220 - Introduction à la programmation</title><link>https://lemire.github.io/inf1220-nexam/</link><description>Recent content in Accueil on INF 1220 - Introduction à la programmation</description><generator>Hugo</generator><language>fr</language><atom:link href="https://lemire.github.io/inf1220-nexam/index.xml" rel="self" type="application/rss+xml"/><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module4/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module4/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous vous invitons maintenant à lire le chapitre &lt;em&gt;Traitement de fichiers&lt;/em&gt; (chapitre 9) du manuel Java pas à pas par Robert Godin et Daniel Lemire. Le chapitre comprend plusieurs exemples et exercices. Vous devez compléter les exercices du manuel.&lt;/p&gt;&#10;&lt;p&gt;Après votre lecture du chapitre, répondez aux questions suivantes.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Expliquez la différence entre un fichier binaire et un fichier texte en Java. À l&amp;rsquo;aide d&amp;rsquo;un exemple de code utilisant les classes FileOutputStream et FileInputStream, montrez comment écrire et lire un entier dans un fichier binaire. Précisez pourquoi il est important de gérer les exceptions dans ce contexte.&lt;/li&gt;&#10;&lt;li&gt;Décrivez le rôle des classes DataInputStream et DataOutputStream dans le traitement de fichiers binaires en Java. Écrivez un programme simple qui utilise ces classes pour écrire un tableau de doubles dans un fichier binaire, puis le relire et l’afficher à l’écran. Expliquez comment ces classes facilitent la gestion des types de données.&lt;/li&gt;&#10;&lt;li&gt;Expliquez comment la classe StreamTokenizer peut être utilisée pour effectuer une analyse lexicale d’un fichier texte. Fournissez un exemple de code qui lit un fichier texte contenant des nombres et des mots, et qui utilise StreamTokenizer pour séparer les nombres des chaînes de caractères, en les affichant séparément. Précisez comment configurer les caractères d’espacement (whitespaceChars) et de citation (quoteChar).&lt;/li&gt;&#10;&lt;li&gt;Décrivez le fonctionnement de la classe JFileChooser pour la sélection de fichiers dans une interface graphique. Écrivez un programme Java qui utilise JFileChooser pour permettre à l’utilisateur de sélectionner un fichier texte, puis affiche son chemin absolu. Expliquez comment cette classe améliore l’expérience utilisateur par rapport à une saisie manuelle du chemin.&lt;/li&gt;&#10;&lt;li&gt;Expliquez ce qu’est un fichier à adressage relatif et en quoi il diffère d’un fichier sériel en Java. À l’aide d’un exemple de code basé sur la classe RandomAccessFile, montrez comment lire et modifier un enregistrement spécifique dans un fichier contenant des objets Plant (comme dans l’exemple du manuel). Décrivez comment la méthode seek et la gestion des numéros d’enregistrement relatif permettent un accès direct aux données.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Plusieurs étudiants trouvent qu&amp;rsquo;il est plus aisé de faire les lectures dans le manuel Java pas à pas après avoir terminé la lecture du module sur notre site web. Vous pouvez choisir quand il vous convient le mieux d&amp;rsquo;utiliser le manuel Java pas à pas.&lt;/p&gt;</description></item><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module5/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module5/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous vous invitons maintenant à lire les chapitres suivants du manuel Java pas à pas par Robert Godin et Daniel Lemire.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chapitre 5. Graphisme 2D et concepts de programmation objet&lt;/li&gt;&#10;&lt;li&gt;Chapitre 6. Introduction à l’animation 2D&lt;/li&gt;&#10;&lt;li&gt;Chapitre 7. Développement de classes : conception objet&lt;/li&gt;&#10;&lt;li&gt;Chapitre 8. Animation 2D et développement d’un jeu simple&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;Dans ce cours, vous n&amp;rsquo;avez pas à maîtriser la programmation de jeux vidéos et la conception d&amp;rsquo;interfaces graphiques. Le tout est utilisé pour illustrer et motiver les notions du cours. On ne vous demandera pas de programmer un jeu vidéo, mais vous devez comprendre les notions de programmation Java illustrées.&lt;/p&gt;</description></item><item><title>L'héritage, les classes abstraites et les interfaces</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module5/activite-5-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module5/activite-5-1/</guid><description>&lt;h1 id="lhéritage-les-classes-abstraites-et-les-interfaces"&gt;&#10; L&amp;rsquo;héritage, les classes abstraites et les interfaces&#10; &lt;a class="anchor" href="#lh%c3%a9ritage-les-classes-abstraites-et-les-interfaces"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;L’héritage, les classes abstraites et les interfaces sont des concepts centraux de la programmation orientée objet en Java. Ils permettent de structurer le code.&#10;En utilisant correctement ces idées, on peut rendre les programmes plus modulaires, évolutifs et faciles à maintenir. Comprendre ces notions est essentiel pour concevoir des applications robustes et flexibles.&lt;/p&gt;&#10;&lt;h2 id="lhéritage"&gt;&#10; L&amp;rsquo;héritage&#10; &lt;a class="anchor" href="#lh%c3%a9ritage"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Après avoir présenté les objets et les classes dans les leçons précédentes, nous abordons ici la notion d&amp;rsquo;héritage. Cette technique, appliquée à la programmation Java, permet de créer de nouvelles classes fondées sur celles qui existent déjà. Lorsque nous héritons d&amp;rsquo;une classe, nous réutilisons ses méthodes et champs, auxquels nous pouvons ajouter de nouveaux champs en vue de l&amp;rsquo;adapter à de nouvelles situations.&lt;/p&gt;</description></item><item><title>Le professeur</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/credits/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/credits/</guid><description>&lt;h1 id="le-professeur"&gt;&#10; Le professeur&#10; &lt;a class="anchor" href="#le-professeur"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Daniel Lemire est professeur d&amp;rsquo;informatique à l&amp;rsquo;Université du Québec (TELUQ). Il est classé dans les 2 % des meilleurs scientifiques (classement Stanford University/Elsevier, 2024). Il fait partie des 1000 programmeurs les plus suivis au monde sur GitHub; GitHub compte plus de 100 millions de développeurs. Il a publié plus de 85 articles de recherche évalués par des pairs. Ses travaux se retrouvent dans de nombreuses bibliothèques standard (.NET, Rust, GCC/glibc++, LLVM/libc, Go, Node.js, etc.) et dans les principaux navigateurs web (Safari, Chrome, etc.). Il est rédacteur de la revue Software : Practice and Experience (Wiley, créée en 1971). En 2020, il a reçu le Prix d&amp;rsquo;excellence 2020 de l&amp;rsquo;Université du Québec pour ses travaux sur l&amp;rsquo;accélération de l&amp;rsquo;analyse JSON. Ses recherches portent notamment sur la programmation haute performance. Il est &lt;a href="https://x.com/lemire"&gt;@lemire sur X&lt;/a&gt; et tient un blog hebdomadaire à l&amp;rsquo;adresse &lt;a href="https://lemire.me/blog"&gt;https://lemire.me/blog&lt;/a&gt;. &lt;a href="https://github.com/lemire"&gt;On peut aussi le trouver sur GitHub&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Les flux de console</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module4/activite-4-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module4/activite-4-1/</guid><description>&lt;h1 id="les-flux-de-console"&gt;&#10; Les flux de console&#10; &lt;a class="anchor" href="#les-flux-de-console"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Les programmes informatiques interagissent souvent avec l&amp;rsquo;utilisateur par le biais de la console, un environnement textuel permettant d&amp;rsquo;afficher des informations et de recueillir des données saisies au clavier. En Java, ces interactions s&amp;rsquo;appuient sur des mécanismes de bas niveau liés au système d&amp;rsquo;exploitation, qui gèrent les flux d&amp;rsquo;entrée et de sortie. Comprendre ces flux est essentiel pour maîtriser les bases de la programmation en console avant de passer à des interfaces plus complexes.&lt;/p&gt;</description></item><item><title>Modèle du cours</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/teluq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/teluq/</guid><description>&lt;h1 id="le-modèle-pédagogique-du-cours"&gt;&#10; Le modèle pédagogique du cours&#10; &lt;a class="anchor" href="#le-mod%c3%a8le-p%c3%a9dagogique-du-cours"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le cours INF 1220 est autoportant. Cela signifie que vous êtes capable, de manière&#10;autonome, de réaliser toutes les activités du cours. Il est important de bien&#10;comprendre ce modèle avant de débuter si vous n&amp;rsquo;êtes pas familier avec les cours&#10;en ligne de ce type.&lt;/p&gt;&#10;&lt;h2 id="le-modèle-de-luniversité-téluq"&gt;&#10; Le modèle de l’Université TÉLUQ&#10; &lt;a class="anchor" href="#le-mod%c3%a8le-de-luniversit%c3%a9-t%c3%a9luq"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;figure&gt;&lt;img src="https://lemire.github.io/inf1220-nexam/comics/modelteluq.jpg"&#10;&#9;&#9;&#9;alt="Le modèle de l&amp;#39;Université TÉLUQ"&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;Plusieurs étudiants inscrits au cours INF 1220 en sont en leur premier cours à l’Université TÉLUQ. À l’Université TÉLUQ, nous offrons un enseignement personnalisé : vous débutez et terminez le cours à une date qui vous convient, vous faites les travaux au sein du cours à votre rythme. Le cours est conçu pour être autoportant : un travail pédagogique substantiel a été fait afin que l’étudiant autonome puisse compléter le cours par lui-même, sans aide. Un professeur ou une personne tutrice est là pour répondre à vos questions lorsque vous êtes devant une impasse après avoir fait les lectures et vos recherches, à tous les moments de votre parcours. Ce modèle diffère de celui des Universités traditionnelles où il y a de rencontres de groupes hebdomadaires et où tous les étudiants cheminent en même temps. Les deux modèles ont des forces et des faiblesses. L’Université TÉLUQ offre plus de flexibilité, mais son modèle exige plus d’autonomie intellectuelle de la part des étudiants.&lt;/p&gt;</description></item><item><title>Le polymorphisme</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module5/activite-5-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module5/activite-5-2/</guid><description>&lt;h1 id="le-polymorphisme"&gt;&#10; Le polymorphisme&#10; &lt;a class="anchor" href="#le-polymorphisme"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le polymorphisme est la capacité d’un même nom de méthode à s’adapter à différents contextes, selon l’objet qui l’utilise. Cela permet de manipuler des objets de différentes classes de façon uniforme, sans se soucier de leur type précis. En Java, la machine virtuelle (JVM) choisit automatiquement la bonne méthode à exécuter selon la classe réelle de l’objet. On distingue trois formes principales de polymorphisme : ad hoc (surcharge), par héritage (redéfinition), et paramétrique (génériques). Chacune permet d’écrire du code plus flexible et réutilisable.&lt;/p&gt;</description></item><item><title>Les flux de données: lecture dans des fichiers et autres</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module4/activite-4-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module4/activite-4-2/</guid><description>&lt;h1 id="les-flux-de-données-lecture-dans-des-fichiers-et-autres"&gt;&#10; Les flux de données: lecture dans des fichiers et autres&#10; &lt;a class="anchor" href="#les-flux-de-donn%c3%a9es-lecture-dans-des-fichiers-et-autres"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Presque tous les programmes que vous écrirez dans votre carrière devront lire ou écrire des données qui survivent à leur exécution : des fichiers de configuration, des résultats de calcul, des journaux d&amp;rsquo;événements, des listes d&amp;rsquo;étudiants, des images, etc. Sans cette capacité, chaque lancement du programme repart de zéro. Maîtriser la lecture et l&amp;rsquo;écriture de fichiers est donc une compétence fondamentale, au même titre que les boucles ou les méthodes.&lt;/p&gt;</description></item><item><title>Programmation Java en ligne</title><link>https://lemire.github.io/inf1220-nexam/docs/environnement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/environnement/</guid><description>&lt;h1 id="programmation-java-en-ligne"&gt;&#10; Programmation Java en ligne&#10; &lt;a class="anchor" href="#programmation-java-en-ligne"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Vous pouvez faire une grande partie des exercices du cours en ligne, dans votre navigateur.&#10;Pour commencer à programmer dans cet environnement Java en ligne, familiarisez-vous avec son interface intuitive. La page principale affiche une zone où vous pouvez ajouter des fichiers Java ou texte. Cliquez sur « Ajouter un fichier Java » pour créer un fichier avec l&amp;rsquo;extension .java, ou « Ajouter un fichier texte » pour un fichier .txt. Chaque fichier apparaît dans une boîte avec un champ pour le nom et un éditeur de texte. Pour les fichiers Java, l&amp;rsquo;éditeur offre une coloration syntaxique et des numéros de ligne, facilitant la lecture et l&amp;rsquo;écriture du code. Vous pouvez aussi sélectionner des exemples prédéfinis (comme « Bonjour le monde » ou « Fibonacci ») via le menu déroulant « Exemples » pour charger automatiquement des fichiers modèles. Une fois vos fichiers prêts, cliquez sur « Exécuter » pour compiler et exécuter le code.&lt;/p&gt;</description></item><item><title>Robot conversationnel et intelligence artificielle</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/robot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/robot/</guid><description>&lt;h1 id="robot-conversationnel-et-intelligence-artificielle"&gt;&#10; Robot conversationnel et intelligence artificielle&#10; &lt;a class="anchor" href="#robot-conversationnel-et-intelligence-artificielle"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;L&amp;rsquo;intelligence artificielle (IA) transforme profondément le domaine de la programmation, redéfinissant la manière dont les développeurs conçoivent, écrivent et maintiennent le code. Les outils basés sur l&amp;rsquo;IA, comme les assistants de codage (par exemple, GitHub Copilot), permettent d&amp;rsquo;automatiser des tâches répétitives, telles que la génération de code boilerplate ou la complétion automatique de fonctions. Ces outils s&amp;rsquo;appuient sur des modèles de langage avancés, entraînés sur d&amp;rsquo;immenses bases de données de code, pour proposer des suggestions contextuelles précises. Cette assistance accélère le processus de développement, permettant aux programmeurs de se concentrer sur des aspects plus créatifs et complexes de leurs projets, tout en réduisant les erreurs humaines.&lt;/p&gt;</description></item><item><title>Autoévaluation</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/autoevaluation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/autoevaluation/</guid><description>&lt;h1 id="autoévaluation"&gt;&#10; Autoévaluation&#10; &lt;a class="anchor" href="#auto%c3%a9valuation"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Avant de débuter le cours, il est important de faire le point sur votre préparation.&#10;Je vous invite donc à faire une autoévaluation.&lt;/p&gt;&#10;&lt;h2 id="connaissances-technologiques"&gt;&#10; Connaissances technologiques&#10; &lt;a class="anchor" href="#connaissances-technologiques"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Le cours ne nécessite pas une connaissance approfondie du fonctionnement des ordinateurs, mais il est utile d&amp;rsquo;avoir&#10;une certaine connaissance de base. Vous devriez savoir que les ordinateurs disposent d&amp;rsquo;un processeur, de mémoire, de&#10;disques, etc. et qu&amp;rsquo;ils fonctionnent à l&amp;rsquo;aide d&amp;rsquo;un système d&amp;rsquo;exploitation. Si vous ne vous êtes jamais intéressés à&#10;ces concepts de base, il peut être utile que vous preniez un peu de votre temps pour faire des recherches sur ces&#10;questions. Il peut être difficile de suivre ce cours si vous ne savez vraiment pas ce qu&amp;rsquo;est un processeur ou de la&#10;mémoire informatique.&lt;/p&gt;</description></item><item><title>Exercices sur l’héritage et le polymorphisme</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module5/exercices-5-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module5/exercices-5-1/</guid><description>&lt;h1 id="exercices-sur-lhéritage-et-le-polymorphisme"&gt;&#10; Exercices sur l&amp;rsquo;héritage et le polymorphisme.&#10; &lt;a class="anchor" href="#exercices-sur-lh%c3%a9ritage-et-le-polymorphisme"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="questionsréponses"&gt;&#10; Questions/Réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Veuillez répondre mentalement, sur papier ou bien en créant le code nécessaire pour répondre à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;</description></item><item><title>Exercices sur les flux</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module4/exercices-4-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module4/exercices-4-1/</guid><description>&lt;h1 id="exercices-sur-les-flux"&gt;&#10; Exercices sur les flux&#10; &lt;a class="anchor" href="#exercices-sur-les-flux"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="questionsréponses"&gt;&#10; Questions/réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Veuillez répondre mentalement, sur papier ou en créant le code nécessaire pour répondre à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Si vous ne faites pas honnêtement les exercices et les lectures dans ce cours, il est possible que vous n’arriviez pas à faire les examens.&lt;/p&gt;</description></item><item><title>Formattage du code Java</title><link>https://lemire.github.io/inf1220-nexam/docs/format/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/format/</guid><description>&lt;h2 id="formattage-du-code-java"&gt;&#10; Formattage du code Java&#10; &lt;a class="anchor" href="#formattage-du-code-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Dans le cadre de ce cours, vous aurez à composer beaucoup de code Java. Il est important&#10;de bien mettre en forme le code Java. Si vous rédigez vos documents avec Microsoft Word, celui-ci ne permet pas de mettre facilement le code en forme. À cette fin, vous pouvez insérer votre code Java dans la zone de texte&#10;et copier ensuite le résultat dans votre logiciel de traitement de texte. Vous devez garder vos lignes de code courtes, ajuster la taille de la police de caractères au besoin. Consultez &lt;a href="https://lemire.github.io/inf1220-nexam/docs/modules/module2/conseils/"&gt;nos conseils&lt;/a&gt; pour bien préparer votre code Java.&lt;/p&gt;</description></item><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Vous devez vous procurer le manuel Java pas à pas. Vous avez accès &lt;a href="https://raw.githubusercontent.com/RobertGodin/JavaPasAPas/master/JavaPasAPas.pdf"&gt;au document PDF&lt;/a&gt;. Si vous devez lire un document PDF, nous vous encourageons à charger le fichier sur votre machine et à l&amp;rsquo;ouvrir au sein d&amp;rsquo;un outil dédié (par ex. Adobe Acrobat). Il n&amp;rsquo;est pas très pratique de lire un document PDF au sein d&amp;rsquo;un navigateur web.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.amazon.ca/Java-pas-Introduction-programmation-langage/dp/B0CR7RW87Y/"&gt;Vous pouvez aussi acheter la version papier du manuel Java pas à pas chez Amazon &lt;/a&gt; pour une somme modeste :&lt;/p&gt;</description></item><item><title>Vous avez trouvé une erreur?</title><link>https://lemire.github.io/inf1220-nexam/docs/erreurs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/erreurs/</guid><description>&lt;h1 id="amélioration-continue-du-cours"&gt;&#10; Amélioration continue du cours&#10; &lt;a class="anchor" href="#am%c3%a9lioration-continue-du-cours"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le site web de ce cours est continuellement mis à jour avec de nouveaux exemples, de nouvelles explications, de nouvelles références. Le manuel est aussi mis à jour quand &#10;nous trouvons des erreurs.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSe8pU6ypxDsx-cZjcMURa6o2LRG8NODa3qYIcWLNGU2RcvaWQ/viewform"&gt;Vous pouvez, de manière anonyme, nous faire parvenir vos corrections lorsque vous trouvez des erreurs sur le site&lt;/a&gt;. Nous apprécions toujours vos commentaires constructifs.&lt;/p&gt;&#10;&lt;p&gt;Note: plusieurs étudiants partagent avec nous des suggestions de sites ou de vidéos en anglais. Bien que le cours fait quelques liens vers des sites en anglais, nous évitons l'anglais autant que possible. Si vous avez des suggestions, essayez de rester en français.&lt;/p&gt;</description></item><item><title>Développement web</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module4/web/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module4/web/</guid><description>&lt;h1 id="développement-web-en-java"&gt;&#10; Développement web en Java&#10; &lt;a class="anchor" href="#d%c3%a9veloppement-web-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le développement web en Java repose sur l’utilisation de technologies et de frameworks&#10;ermettant de créer des applications accessibles via un navigateur. Java est largement&#10;utilisé côté serveur grâce à sa robustesse, sa portabilité et la richesse de son écosystème.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;Dans ce cours, vous n&amp;rsquo;avez pas à maîtriser la programmation web. Nous vous présentons un exemple pour motiver votre apprentissage.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="concepts-de-base"&gt;&#10; Concepts de base&#10; &lt;a class="anchor" href="#concepts-de-base"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Un serveur web est un programme qui reçoit les requêtes des clients (navigateurs) et renvoie des réponses (pages HTML, données JSON, etc.). Le protocole de communication qui permet l’échange de données entre le navigateur (client) et le serveur web est le HTTP. Toutes les requêtes et réponses web transitent via HTTP ou HTTPS (version sécurisée).&lt;/p&gt;</description></item><item><title>Les ordinateurs et leurs langages</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/ordinateurs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/ordinateurs/</guid><description>&lt;h1 id="court-historique-des-langages-de-programmation"&gt;&#10; Court historique des langages de programmation&#10; &lt;a class="anchor" href="#court-historique-des-langages-de-programmation"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;figure&gt;&lt;img src="https://lemire.github.io/inf1220-nexam/comics/langages.jpg"&#10;&#9;&#9;&#9;alt="Les langages de programmation"&gt;&#10;&lt;/figure&gt;&#10;&#10;&lt;p&gt;L’idée de programmer des machines remonte au 19e siècle, époque marquée par l’émergence des premières machines de calcul et d’automatisation. Dès 1801, les métiers à tisser Jacquard utilisaient des cartes perforées pour programmer des motifs textiles, préfigurant les concepts de codage. Cependant, c’est au milieu du 19e siècle qu’un jalon historique est posé avec les travaux d’Ada Lovelace (1815-1852) sur la machine analytique de Charles Babbage. Considérée comme la première programmeuse, elle rédigea des notes détaillées incluant un algorithme pour calculer les nombres de Bernoulli, démontrant qu’une machine pouvait exécuter des instructions complexes. Le langage Ada, créé dans les années 1980, rend hommage à cette contribution pionnière.&lt;/p&gt;</description></item><item><title>Feuille de route</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/feuille-de-route/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/feuille-de-route/</guid><description>&lt;h1&gt;Feuille de route&lt;/h1&gt;&#10;&lt;p&gt;Prévoyez environ &lt;strong&gt;9 heures de travail par semaine pendant quinze semaines&lt;/strong&gt;. Il n&amp;rsquo;est pas possible, pour la plupart des étudiants, de réussir ce cours en prenant&#10;beaucoup moins de temps.&lt;/p&gt;&#10;&lt;p&gt;Chaque étudiant a sa propre date de départ et date de fin de cours personnalisée. Les dates auxquelles l'étudiant doit passer ses deux examens sont déterminées par l'Université: celle-ci vous fera parvenir les détails en temps opportun. Vous devez joindre l'Université si vous souhaitez les modifier. &lt;/p&gt;</description></item><item><title>Les algorithmes</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes/</guid><description>&lt;h1 id="les-algorithmes"&gt;&#10; Les algorithmes&#10; &lt;a class="anchor" href="#les-algorithmes"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;em&gt;The etymology of program is pro ‘before’ + graphein ‘write’. I think of programming as making a plan that will be executed in the future, something that every human does from time to time. The hard part is that a computer has to execute the plan, and computers are incredibly stupid. Dealing with such stupidity requires more patience and determination than many people have.&lt;/em&gt; (Peter Turney)&lt;/p&gt;</description></item><item><title>Examens</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/examen/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/examen/</guid><description>&lt;h1 id="examens"&gt;&#10; Examens&#10; &lt;a class="anchor" href="#examens"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le cours INF 1220 est évalué au moyen de &lt;strong&gt;deux examens en ligne télésurveillés&lt;/strong&gt;. Il n'y a aucun travail noté à remettre et aucun entretien de suivi. L&amp;rsquo;objectif des examens est de valider le savoir-faire que vous avez intégré tout au long du cours.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Évaluation&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Sujets&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Moment&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Durée&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Pondération&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Examen 1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modules 1 et 2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;semaine 7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 heures&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Examen 2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;L&amp;rsquo;ensemble du cours&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;fin du cours&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 heures&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Le premier examen a lieu à la septième semaine du cours et porte uniquement sur les deux premiers modules :&#10;les algorithmes et le pseudocode, puis les bases du langage Java (types, opérateurs, variables, méthodes,&#10;classes et instances). Comme la question revient sans cesse, soyons clair sur le second examen :&#10;&lt;strong&gt;l&amp;rsquo;examen 2 couvre toute la matière du cours&lt;/strong&gt;, y compris celle du premier examen.&lt;/p&gt;</description></item><item><title>Les algorithmes : conception et syntaxe</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes2/</guid><description>&lt;h1 id="les-algorithmes--conception-et-syntaxe"&gt;&#10; Les algorithmes : conception et syntaxe&#10; &lt;a class="anchor" href="#les-algorithmes--conception-et-syntaxe"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Un algorithme est une méthode structurée pour résoudre un problème de manière systématique et efficace. Comparable à une recette culinaire, il fournit des instructions précises, exécutables pas à pas, pour transformer des données d’entrée en résultats attendus. Comprendre la conception et la syntaxe des algorithmes est essentiel pour tout programmeur souhaitant traduire une solution abstraite en code fonctionnel, quel que soit le langage utilisé.&lt;/p&gt;</description></item><item><title>Ressources</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/ressources/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/ressources/</guid><description>&lt;h1 id="ressources-pour-apprendre-java"&gt;&#10; Ressources pour apprendre Java&#10; &lt;a class="anchor" href="#ressources-pour-apprendre-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Ce document regroupe des ressources variées pour apprendre Java, des livres aux tutoriels en ligne, en passant par des vidéos et des conseils pratiques. Il s’adresse aux débutants comme aux apprenants intermédiaires souhaitant approfondir leurs compétences en programmation.&lt;/p&gt;&#10;&lt;h2 id="ouvrages-de-référence"&gt;&#10; Ouvrages de référence&#10; &lt;a class="anchor" href="#ouvrages-de-r%c3%a9f%c3%a9rence"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Les livres suivants offrent une introduction ou un approfondissement en Java, adaptés à différents niveaux :&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Claude Delannoy, &lt;em&gt;Programmer en Java&lt;/em&gt;, Eyrolles : un ouvrage complet pour les débutants et intermédiaires.&lt;/li&gt;&#10;&lt;li&gt;Barry Burd, &lt;em&gt;Java pour les nuls&lt;/em&gt;, 4e édition (environ 25 $) : une approche conviviale, idéale pour les novices.&lt;/li&gt;&#10;&lt;li&gt;Cyrille Herby, &lt;em&gt;Apprenez à programmer en Java&lt;/em&gt; (environ 11 $) : un manuel axé sur la programmation professionnelle.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="documentation-officielle"&gt;&#10; Documentation officielle&#10; &lt;a class="anchor" href="#documentation-officielle"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;La documentation d’Oracle est une référence incontournable pour comprendre les bases et explorer les fonctionnalités avancées :&lt;/p&gt;</description></item><item><title>Les algorithmes: les structures de contrôle</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/algorithmes3/</guid><description>&lt;h1 id="les-structures-de-contrôle"&gt;&#10; Les structures de contrôle&#10; &lt;a class="anchor" href="#les-structures-de-contr%c3%b4le"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous avons déjà présenté les notions d&amp;rsquo;embranchement et de boucle. C&amp;rsquo;est ce que nous appelons des structures de contrôle. Il est essentiel&#10;d&amp;rsquo;en comprendre la fonction.&lt;/p&gt;&#10;&lt;p&gt;On peut concevoir un algorithme qui ne comprend qu&amp;rsquo;une liste d&amp;rsquo;opérations simples (addition, soustraction, etc.). Cependant sans structures de contrôle, nous aurons du mal à gérer les données dynamiques, par exemple un tableau qui peut contenir un nombre variable d&amp;rsquo;éléments, et on risque de devoir répéter beaucoup d&amp;rsquo;opérations.&#10;Les structures de contrôle permettent à l&amp;rsquo;algorithme de faire des choix de traitement en fonction de conditions. Une structure de contrôle correspond à l&amp;rsquo;action de tester des variables de contrôle et selon les résultats d&amp;rsquo;effectuer des opérations ou non.&lt;/p&gt;</description></item><item><title>Évaluation</title><link>https://lemire.github.io/inf1220-nexam/docs/evaluation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/evaluation/</guid><description>&lt;h1 id="évaluation"&gt;&#10; Évaluation&#10; &lt;a class="anchor" href="#%c3%a9valuation"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Ce cours est évalué au moyen de &lt;strong&gt;deux examens en ligne télésurveillés&lt;/strong&gt;. Il n&amp;rsquo;y a aucun travail noté&#10;à remettre et aucun entretien de suivi.&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Évaluation&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Sujets&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Moment&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Durée&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Pondération&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Examen 1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modules 1 et 2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;semaine 7&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 heures&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;30 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Examen 2&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;L&amp;rsquo;ensemble du cours&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;fin du cours&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3 heures&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;70 %&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Le premier examen porte uniquement sur la matière des deux premiers modules : les algorithmes et le&#10;pseudocode (module 1) ainsi que les bases du langage Java, soit les types, les opérateurs, les variables et les&#10;méthodes (module 2). Le second examen porte sur &lt;strong&gt;l&amp;rsquo;ensemble du cours&lt;/strong&gt;, y compris la matière déjà couverte&#10;par le premier examen.&lt;/p&gt;</description></item><item><title>Les problèmes difficiles</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/difficile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/difficile/</guid><description>&lt;h1 id="les-problèmes-difficiles"&gt;&#10; Les problèmes difficiles&#10; &lt;a class="anchor" href="#les-probl%c3%a8mes-difficiles"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;Dans ce cours, vous n&amp;rsquo;avez pas à maîtriser la notion de problème difficile, mais vous devriez être familier avec le concept.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Dans un cours d’introduction à la programmation, la plupart des exercices se concentrent sur des problèmes dont les algorithmes sont relativement simples à concevoir, surtout si vous maîtrisez les bases de la programmation et des mathématiques. Ces problèmes, comme calculer une moyenne ou trier une liste, demandent souvent une compréhension des structures de contrôle (conditions et boucles) et une application directe de concepts logiques. Cependant, dans des contextes plus avancés, certains problèmes se révèlent bien plus complexes, non pas à cause de la programmation elle-même, mais en raison de la difficulté à trouver un algorithme efficace. Ces défis, qualifiés de « problèmes difficiles », nécessitent des approches créatives et parfois des compromis, car leurs solutions idéales peuvent être hors de portée avec les ressources informatiques actuelles.&lt;/p&gt;</description></item><item><title>Pense-bête java</title><link>https://lemire.github.io/inf1220-nexam/docs/pensebete/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/pensebete/</guid><description>&lt;h1 id="fondamentaux-de-java"&gt;&#10; Fondamentaux de Java&#10; &lt;a class="anchor" href="#fondamentaux-de-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="types-de-données-java"&gt;&#10; Types de données Java&#10; &lt;a class="anchor" href="#types-de-donn%c3%a9es-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Exemple&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;byte / short / int / long&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-123&lt;/code&gt;, &lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Entiers de différentes tailles&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;float / double&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;235.13&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Nombres à virgule flottante&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;char&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;'U'&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Caractère unique&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;boolean&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Valeurs logiques&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;&amp;quot;Salutations de la Terre&amp;quot;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Chaînes de caractères&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="instructions-java"&gt;&#10; Instructions Java&#10; &lt;a class="anchor" href="#instructions-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Instruction&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Syntaxe&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;if&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;if (expression) { instructions } else if (expression) { instructions } else { instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;while&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;while (expression) { instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;do-while&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;do { instructions } while (expression);&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;for&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;for (int i = 0; i &amp;lt; max; ++i) { instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;for each&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;for (var : collection) { instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;switch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;switch (expression) { case valeur: instructions break; case valeur2: instructions break; default: instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;try-catch&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;try { instructions } catch (ExceptionType e1) { instructions } catch (Exception e2) { instructions } finally { instructions }&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="conversions-de-données-java"&gt;&#10; Conversions de données Java&#10; &lt;a class="anchor" href="#conversions-de-donn%c3%a9es-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Conversion&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Syntaxe&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Chaîne vers nombre&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;int i = Integer.parseInt(str);&lt;br&gt;double d = Double.parseDouble(str);&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tout type vers chaîne&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String s = String.valueOf(valeur);&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Numérique&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;int i = (int) expression numérique;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="méthodes-de-chaîne-java"&gt;&#10; Méthodes de chaîne Java&#10; &lt;a class="anchor" href="#m%c3%a9thodes-de-cha%c3%aene-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Méthode&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.length()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne la longueur de s&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.charAt(i)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Extrait le i-ème caractère&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.substring(début, fin)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Extrait une sous-chaîne de début à fin-1&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.toUpperCase()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne une copie en majuscules&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.toLowerCase()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne une copie en minuscules&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.indexOf(x)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne l’index de la première occurrence de x&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.replace(ancien, nouveau)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Remplace les occurrences&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.split(regex)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Divise la chaîne en jetons&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.trim()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime les espaces autour&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.equals(s2)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vrai si s est égal à s2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;s.compareTo(s2)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0 si égaux, + si s &amp;gt; s2, - si s &amp;lt; s2&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="méthodes-javautilarraylist"&gt;&#10; Méthodes java.util.ArrayList&#10; &lt;a class="anchor" href="#m%c3%a9thodes-javautilarraylist"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Méthode&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.add(élément)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ajoute un élément à la liste&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.add(index, élément)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Ajoute un élément à l’index spécifié&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.get(i)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne le i-ème élément&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.size()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne le nombre d’éléments&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.remove(i)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime le i-ème élément&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.remove(élément)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime la première occurrence de l’élément&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.set(i, val)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Place val à la position i&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.clear()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime tous les éléments&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;l.contains(élément)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vrai si l’élément est dans la liste&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="méthodes-javautilhashmap"&gt;&#10; Méthodes java.util.HashMap&#10; &lt;a class="anchor" href="#m%c3%a9thodes-javautilhashmap"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Méthode&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.put(clé, valeur)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Insère une valeur avec une clé&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.get(clé)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Récupère la valeur associée à la clé&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.containsKey(clé)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vrai si la clé existe&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.containsValue(valeur)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Vrai si la valeur existe&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.remove(clé)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime l’entrée associée à la clé&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.size()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne le nombre d’entrées&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.clear()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Supprime toutes les entrées&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.keySet()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne un ensemble des clés&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;m.values()&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Retourne une collection des valeurs&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="java-hello-world"&gt;&#10; Java Hello World&#10; &lt;a class="anchor" href="#java-hello-world"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;import&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#24292e"&gt;java.util.Date&lt;/span&gt;&lt;span style="color:#1f2328"&gt;;&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;class&lt;/span&gt; &lt;span style="color:#1f2328"&gt;Hello&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;public&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;static&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;void&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;main&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;String&lt;span style="color:#0550ae"&gt;[]&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;args&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;System&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;Bonjour, le monde !&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Date&lt;span style="color:#fff"&gt; &lt;/span&gt;maintenant&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;new&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;Date&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;System&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;out&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#1f2328"&gt;println&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;Heure : &amp;#34;&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;+&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;maintenant&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;Enregistrer dans &lt;code&gt;Hello.java&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Compiler : &lt;code&gt;javac Hello.java&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Exécuter : &lt;code&gt;java Hello&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="opérateurs-arithmétiques-java"&gt;&#10; Opérateurs arithmétiques Java&#10; &lt;a class="anchor" href="#op%c3%a9rateurs-arithm%c3%a9tiques-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Opérateur&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Description&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x + y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Addition&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x - y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Soustraction&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x * y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Multiplication&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x / y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Division&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x % y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Modulo&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;++x / x++&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Incrémentation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;ndash;x / x&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Décrémentation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;em&gt;Raccourcis d’affectation : x op= y (ex. x += 1 incrémente x)&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Complexité algorithmique</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/complex/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/complex/</guid><description>&lt;h1 id="complexité-algorithmique"&gt;&#10; Complexité algorithmique&#10; &lt;a class="anchor" href="#complexit%c3%a9-algorithmique"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La plupart des problèmes ne sont pas fondamentalement difficiles, mais toutes les solutions&#10;ne sont pas également efficaces. La complexité algorithmique fournit une mesure de cette efficacité.&lt;/p&gt;&#10;&lt;p&gt;La complexité algorithmique mesure le temps ou la mémoire qu’un algorithme nécessite en fonction de la taille de l’entrée (souvent notée \( n \)). Pour comparer les algorithmes, on utilise la notation grand-O (ou O-grande), qui donne un ordre de grandeur du nombre d’opérations à effectuer lorsque la taille des données augmente.&lt;/p&gt;</description></item><item><title>FAQ</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/faq/</guid><description>&lt;h3 id="question-quest-ce-que-java-et-pourquoi-est-il-utilisé-"&gt;&#10; Question: Qu&amp;rsquo;est-ce que Java et pourquoi est-il utilisé ?&#10; &lt;a class="anchor" href="#question-quest-ce-que-java-et-pourquoi-est-il-utilis%c3%a9-"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;p&gt;Réponse: Java est un langage de programmation orienté objet, populaire pour sa portabilité et sa robustesse. Il est utilisé pour développer des applications web, mobiles (comme Android), des logiciels d&amp;rsquo;entreprise et des jeux, car il fonctionne sur de nombreuses plateformes grâce à la machine virtuelle Java (JVM).&lt;/p&gt;&#10;&lt;h3 id="question-comment-installer-java-sur-mon-ordinateur-"&gt;&#10; Question: Comment installer Java sur mon ordinateur ?&#10; &lt;a class="anchor" href="#question-comment-installer-java-sur-mon-ordinateur-"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;p&gt;Réponse: Pour installer Java, téléchargez le JDK (Java Development Kit) depuis le site officiel d&amp;rsquo;Oracle ou adoptez une version open-source comme OpenJDK. Suivez les instructions d&amp;rsquo;installation pour votre système (Windows, macOS ou Linux). Vérifiez l&amp;rsquo;installation en tapant &lt;code&gt;java -version&lt;/code&gt; dans une invite de commande.&lt;/p&gt;</description></item><item><title>Les erreurs communes</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/erreurs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/erreurs/</guid><description>&lt;h1 id="erreurs-communes"&gt;&#10; Erreurs communes&#10; &lt;a class="anchor" href="#erreurs-communes"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Rédiger du pseudocode n&amp;rsquo;a rien de sorcier, mais plusieurs étudiants font des erreurs. Voici quelques erreurs communes.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Certains étudiants rédigent du pseudocode qui a l&amp;rsquo;air formel et correct, mais qui est en fait ambigu et inutilisable. Prenons cet exemple: &lt;code&gt; SI j'ai mal au dos ALORS je prends des aspirines OU SI j'ai faim ALORS je mange&lt;/code&gt;. Bien sûr, je n&amp;rsquo;ai utilisé que des expressions logiques. Des SI, des ALORS des OU. Mais qu&amp;rsquo;est-ce que ça signifie ? Par exemple, est-ce que je peux à la fois manger et prendre des aspirines dans ce scénario ? La réponse est subjective. Votre pseudocode doit être exécutable sans interprétation. Un pseudocode n&amp;rsquo;est pas un texte à interprétation subjective. Vous ne pouvez pas faire semblant d&amp;rsquo;écrire du pseudocode en utilisant simplement les termes qu&amp;rsquo;on trouve fréquemment au sein des pseudocodes. Ce n&amp;rsquo;est pas une question de syntaxe. On peut parfaitement écrire du pseudocode sans jamais utiliser SI, TANT QUE, etc. Plusieurs étudiants obsèdent sur la syntaxe, croyant à tort que si on leur donne les bons termes, la bonne grammaire, ils trouveront comment comprendre ce qu&amp;rsquo;est un pseudocode. Or, c&amp;rsquo;est justement le contraire de la leçon ici: nous voulons que vous compreniez que la syntaxe exacte est secondaire dans la pensée algorithmique. On peut être imprécis et incohérent en utilisant une syntaxe formelle, et on peut être précis et cohérent en utilisant du français usuel. Ce n&amp;rsquo;est pas parce que vous utilisez des expressions qui vous semblent précises que vous l&amp;rsquo;êtes. Vous devez avoir une idée précise en tête et vous devez l&amp;rsquo;exprimer avec précision.&lt;/p&gt;</description></item><item><title>Présentation du pseudocode</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/syntaxe/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/syntaxe/</guid><description>&lt;h1 id="guide-pour-présenter-du-pseudocode"&gt;&#10; Guide pour présenter du pseudocode&#10; &lt;a class="anchor" href="#guide-pour-pr%c3%a9senter-du-pseudocode"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Adoptez un style simple. Testez la lisibilité de votre pseudocode en le lisant à haute voix.&lt;/p&gt;&#10;&lt;p&gt;Voici un exemple de pseudocode difficile à comprendre.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;entrée : un nombre&#10;si mon nombre nombre &amp;gt; 0 alors &amp;#34;positif&amp;#34;&#10; autrement&#10; afficher &amp;#34;négatif ou zéro&amp;#34;&#10;fin du code&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voici un bon exemple.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;entrée : nombre&#10;si nombre &amp;gt; 0 alors&#10; afficher &amp;#34;positif&amp;#34;&#10;sinon&#10; afficher &amp;#34;négatif ou zéro&amp;#34;&#10;fin si&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="indentation"&gt;&#10; Indentation&#10; &lt;a class="anchor" href="#indentation"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;L&amp;rsquo;indentation est utile pour montrer la structure hiérarchique (boucles, conditions, blocs). Utilisez systématiquement 2 à 4 espaces par niveau, vous pouvez aussi utiliser des tabulations. Ne mélangez pas espaces et tabulations.&#10;Indentez chaque bloc intérieur d&amp;rsquo;un niveau supplémentaire. Alignez les instructions de fin de bloc (comme &amp;ldquo;fin si&amp;rdquo; ou &amp;ldquo;fin pour&amp;rdquo;) avec le début du bloc. Conservez une indentation cohérente dans tout le document.&lt;/p&gt;</description></item><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous vous invitons maintenant à lire le chapitre &lt;em&gt;Structures de contrôle&lt;/em&gt; (chapitre 3) du manuel Java pas à pas par Robert Godin et Daniel Lemire. Le chapitre comprend plusieurs exemples et exercices. Vous devez compléter les exercices du manuel. Vous pouvez aussi exécuter certains exemples du manuel sur cette page.&lt;/p&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553771193125"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553771193125 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553771193125 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553771193125 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553771193125 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553771193125 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553771193125 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553771193125 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553771193125 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553771193125 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553771193125-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java ExemplesMath.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553771193125-name'&gt;ExemplesMath.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553771193125-name'&gt;&#10;public class ExemplesMath {&#10;&#10; public static void main(String args[]) {&#10; System.out.println(&amp;#34;Math.log(1.0)=&amp;#34; &amp;#43; Math.log(1.0));&#10; System.out.println(&amp;#34;Math.exp(1.0)=&amp;#34; &amp;#43; Math.exp(1.0));&#10; System.out.println(&amp;#34;Math.cos(0)=&amp;#34; &amp;#43; Math.cos(0));&#10; System.out.println(&amp;#34;Math.sin(0)=&amp;#34; &amp;#43; Math.sin(0));&#10; System.out.println(&amp;#34;Math.sqrt(4)=&amp;#34; &amp;#43; Math.sqrt(4));&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553771193125-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553771193125');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553771249083"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553771249083 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553771249083 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553771249083 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553771249083 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553771249083 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553771249083 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553771249083 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553771249083 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553771249083 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553771249083-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java ExemplesString.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553771249083-name'&gt;ExemplesString.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553771249083-name'&gt;&#10;public class ExemplesString {&#10;&#10; public static void main(String args[]) {&#10;&#10; String string1 = &amp;#34;abc&amp;#34;;&#10; String string2 = &amp;#34;def&amp;#34;;&#10; String string3 = &amp;#34;abcdef&amp;#34;;&#10; String string4 = new String(&amp;#34;abcdef&amp;#34;);&#10;&#10; // Tous les litéraux identiques (� la compilation) sont traduits&#10; // par une référence au même objet&#10; System.out.println(string3 == &amp;#34;abcdef&amp;#34;); // true&#10; System.out.println(&amp;#34;abc&amp;#34; &amp;#43; &amp;#34;def&amp;#34; == &amp;#34;abcdef&amp;#34;); // true&#10;&#10; // Par contre, si le litéral est calculé à l&amp;#39;exécution, ce n&amp;#39;est pas le cas&#10; System.out.println(string1 &amp;#43; string2 == &amp;#34;abcdef&amp;#34;); // false&#10;&#10; // Le constructeur String produit toujours un objet différent de l&amp;#39;objet&#10; // correspondant au litéral&#10; System.out.println(string4 == &amp;#34;abcdef&amp;#34;); // false&#10;&#10; // La méthode intern() de la classe String permet de convertir&#10; // la référence à l&amp;#39;objet correspondant au litéral&#10; System.out.println((string1 &amp;#43; string2).intern() == &amp;#34;abcdef&amp;#34;); // true&#10; System.out.println(string4.intern() == &amp;#34;abcdef&amp;#34;); // true&#10;&#10; // La méthode equals() permet de comparer le contenu de l&amp;#39;objet plutôt que la référence&#10; System.out.println((string1 &amp;#43; string2).equals(&amp;#34;abcdef&amp;#34;)); // true&#10; System.out.println(string4.equals(&amp;#34;abcdef&amp;#34;)); // true&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553771249083-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553771249083');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553771291631"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553771291631 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553771291631 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553771291631 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553771291631 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553771291631 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553771291631 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553771291631 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553771291631 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553771291631 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553771291631-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java ExempleZero.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553771291631-name'&gt;ExempleZero.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553771291631-name'&gt;&#10;public class ExempleZero {&#10; public static void main(String[] s) {&#10; double minus_zero = -0.0;&#10; double plus_zero = &amp;#43;0.0;&#10; System.out.println(minus_zero == plus_zero);&#10; System.out.println(1/minus_zero);&#10; System.out.println(1/plus_zero);&#10; System.out.println(1/minus_zero == 1/plus_zero);&#10; double n = 0.0 / 0.0;&#10; System.out.println(n);&#10; System.out.println(n == n);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553771291631-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553771291631');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553771328188"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553771328188 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553771328188 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553771328188 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553771328188 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553771328188 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553771328188 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553771328188 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553771328188 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553771328188 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553771328188-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java ExerciceForFor.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553771328188-name'&gt;ExerciceForFor.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553771328188-name'&gt;&#10;public class ExerciceForFor {&#10; public static void main(String args[]) {&#10; for (int compteur1 = 1; compteur1 &amp;lt;= 9; compteur1 = compteur1 &amp;#43; 1) {&#10; for (int compteur2 = 1; compteur2 &amp;lt;= compteur1; compteur2 = compteur2 &amp;#43; 1)&#10; System.out.print(compteur2);&#10; System.out.println();&#10; }&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553771328188-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553771328188');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Après la lecture du chapitre, répondez aux questions suivantes.&lt;/p&gt;</description></item><item><title>Manuel</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/manuel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/manuel/</guid><description>&lt;p&gt;Nous utilisons un manuel d&amp;rsquo;introduction à la programmation Java intitulé &lt;em&gt;Java pas à pas&lt;/em&gt; par Robert Godin et Daniel Lemire. Vous pouvez &lt;a href="https://raw.githubusercontent.com/RobertGodin/JavaPasAPas/master/JavaPasAPas.pdf"&gt;charger le document PDF&lt;/a&gt; dès maintenant.&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Cet ouvrage présente les concepts de base de la programmation et du langage Java. Le livre s’adresse à un auditoire très large, aussi bien un débutant qui désire apprendre la programmation pour le plaisir qu’à un étudiant qui entreprend une carrière d’informaticien. L’approche proposée introduit graduellement les concepts de base de la programmation et leur incarnation dans le langage Java à l’aide d’une série d’exemples et d’exercices.&lt;/p&gt;</description></item><item><title>Préparation de l’espace de travail</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/preparation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/preparation/</guid><description>&lt;h1 id="préparation-de-lespace-de-travail"&gt;&#10; Préparation de l&amp;rsquo;espace de travail&#10; &lt;a class="anchor" href="#pr%c3%a9paration-de-lespace-de-travail"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Comme langage de support à l&amp;rsquo;introduction des concepts de programmation, nous utiliserons le langage Java. Tel que présenté dans l&amp;rsquo;introduction du cours, le langage Java est un langage interprété multi-plateforme où le code est pré-compilé dans un ensemble d&amp;rsquo;instructions intermédiaires (appelé Java bytecode), puis interprété sur chaque système d&amp;rsquo;exploitation à partir de la machine virtuelle Java. Celle-ci transforme alors le bytecode en instructions machine propre au système d&amp;rsquo;exploitation et aux processeurs spécifiques de l&amp;rsquo;ordinateur.&lt;/p&gt;</description></item><item><title>Exercices sur les algorithmes et les ordinateurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module1/exercices/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module1/exercices/</guid><description>&lt;h1 id="exercices-sur-les-algorithmes-et-les-ordinateurs"&gt;&#10; Exercices sur les algorithmes et les ordinateurs&#10; &lt;a class="anchor" href="#exercices-sur-les-algorithmes-et-les-ordinateurs"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La notion d&amp;rsquo;algorithme a été abordée implicitement dès les premiers cours de mathématiques, par exemple avec l&amp;rsquo;algorithme de la division longue. Ces exercices visent à vous faire décrire formellement un algorithme. La principale difficulté pour la plupart des étudiants réside dans la rigueur et la précision requises. Au-delà d’un certain point, il n’existe pas de lectures supplémentaires : la pratique est essentielle.&lt;/p&gt;</description></item><item><title>Rappel mathématique</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/math/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/math/</guid><description>&lt;h1 id="rappel-mathématique"&gt;&#10; Rappel mathématique&#10; &lt;a class="anchor" href="#rappel-math%c3%a9matique"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Avant de commencer, il est conseillé, pour se familiariser avec certaines notations, de jeter un coup d&amp;rsquo;œil sur le &lt;a href="#annexe"&gt;tableau des symboles et abréviations usuels&lt;/a&gt;.&lt;/p&gt;&#10;&lt;h2 id="1-les-propositions-les-ensembles-les-relations-et-les-nombres"&gt;&#10; 1. Les propositions, les ensembles, les relations et les nombres&#10; &lt;a class="anchor" href="#1-les-propositions-les-ensembles-les-relations-et-les-nombres"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Pour aborder les concepts mathématiques fondamentaux, il est essentiel de comprendre les notions de base qui sous-tendent la logique et la théorie des ensembles. Cette section introduit les propositions, les ensembles, les relations et les nombres, en posant les fondations nécessaires à une étude rigoureuse.&lt;/p&gt;</description></item><item><title>Intelligence artificielle</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/ia/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/ia/</guid><description>&lt;p&gt;Dans le cadre de ce cours, l’utilisation d’outils d’intelligence artificielle (tels que Claude, ChatGPT, Copilot, Grok, ou autres) est autorisée, mais demeure facultative. Ces outils peuvent servir de soutien pour approfondir votre compréhension, structurer vos idées ou générer des contenus préliminaires. Toutefois, leur usage doit être responsable, transparent et rigoureusement documenté. L’objectif est de garantir que votre travail reflète vos compétences et votre compréhension personnelle, tout en tirant parti des possibilités offertes par ces technologies. Une utilisation non déclarée ou inappropriée de l’intelligence artificielle peut être considérée comme une faute académique, tandis qu’une déclaration claire de son usage renforce la crédibilité de votre démarche.&lt;/p&gt;</description></item><item><title>Petit guide d’usage du courriel efficace</title><link>https://lemire.github.io/inf1220-nexam/docs/extra/courriel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/extra/courriel/</guid><description>&lt;p&gt;Lors de l&amp;rsquo;écriture d&amp;rsquo;un courriel, être bref est important. Omettez les formules de salutation, les signatures surfaites,&#10;etc.&lt;/p&gt;&#10;&lt;p&gt;Attention aux émotions : Il est facile quand on reçoit ou transmet un courriel de s&amp;rsquo;emporter ou de lire dans les&#10;messages reçus des sentiments. Dans un contexte professionnel, évitez d&amp;rsquo;écrire un courriel alors que vous êtes énervé.&lt;/p&gt;&#10;&lt;p&gt;Choisissez les destinataires de votre courriel avec soin. Il est pratiquement toujours mal avisé de transmettre un&#10;courriel à un grand groupe, à moins que le courriel soit une communication formelle. Dans le doute, écrivez un courriel&#10;à un seul destinataire.&lt;/p&gt;</description></item><item><title>Java pas à pas</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/pasapas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/pasapas/</guid><description>&lt;h1 id="java-pas-à-pas"&gt;&#10; Java pas à pas&#10; &lt;a class="anchor" href="#java-pas-%c3%a0-pas"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Nous vous invitons maintenant à lire les chapitres suivants du manuel Java pas à pas par Robert Godin et Daniel Lemire.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Chapitre 2. Introduction à la programmation Java&lt;/li&gt;&#10;&lt;li&gt;Chapitre 4. Types et expressions Java&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Les chapitres comprennent plusieurs exemples et exercices. Vous devez compléter les exercices du manuel.&lt;/p&gt;&#10;&lt;p&gt;Après votre lecture, répondez aux questions suivantes.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Chapitre 2. Introduction à la programmation Java&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Quelles sont les principales étapes de la création et de l&amp;rsquo;exécution d’un programme Java, et pourquoi la méthode main() est-elle essentielle dans ce processus ?&lt;/li&gt;&#10;&lt;li&gt;Expliquez la différence entre une déclaration de variable et une initialisation de variable à la déclaration dans une méthode Java. Donnez un exemple concret pour illustrer votre réponse.&lt;/li&gt;&#10;&lt;li&gt;Comment la classe Scanner est-elle utilisée pour lire des données saisies par l’utilisateur, et quelles précautions doivent être prises lors de son importation et de son utilisation ?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Chapitre 4. Types et expressions Java&lt;/p&gt;</description></item><item><title>Création d'une classe en Java</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/oriente/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/oriente/</guid><description>&lt;h1 id="création-dune-classe-en-java"&gt;&#10; Création d&amp;rsquo;une classe en Java&#10; &lt;a class="anchor" href="#cr%c3%a9ation-dune-classe-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Créer une classe en Java, c’est définir un nouveau type d’objet qui regroupe à la fois des données (appelées attributs ou champs) et des comportements (appelés méthodes). Cette approche permet de modéliser des entités du monde réel ou conceptuel de façon structurée et réutilisable. Une classe sert de « plan » pour fabriquer des objets : chaque objet créé à partir d’une classe possède ses propres valeurs pour les attributs, mais partage les mêmes méthodes. La programmation orientée objet favorise ainsi la modularité, la clarté et la maintenance du code, car chaque classe peut être développée, testée et améliorée indépendamment des autres.&lt;/p&gt;</description></item><item><title>GitHub</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/github/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/github/</guid><description>&lt;h1 id="github-optionnel"&gt;&#10; GitHub (optionnel)&#10; &lt;a class="anchor" href="#github-optionnel"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;&lt;a href="https://github.com"&gt;GitHub&lt;/a&gt; est un site où les programmeurs partagent leur code et travaillent de manière collaborative sur des projets de programmation. Si vous créez un compte et &lt;a href="https://www.youtube.com/watch?v=hPfgekYUKgk"&gt;apprenez à utiliser Git&lt;/a&gt;, vous pourrez y partager votre code, ou contribuer au code d&amp;rsquo;autres projets. C&amp;rsquo;est une excellente manière de développer un portfolio afin d&amp;rsquo;impressionner les employeurs potentiels. &lt;a href="https://github.com/lemire"&gt;Vous trouverez le professeur responsable du cours sur GitHub&lt;/a&gt;. Encore une fois, tout s&amp;rsquo;y déroule en anglais, mais si vous ne maîtrisez pas l&amp;rsquo;anglais, vous aurez du mal à faire carrière en informatique.&lt;/p&gt;</description></item><item><title>Les structures de contrôle</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-1/</guid><description>&lt;h1 id="les-structures-de-contrôle"&gt;&#10; Les structures de contrôle&#10; &lt;a class="anchor" href="#les-structures-de-contr%c3%b4le"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Les structures de contrôle sont des outils essentiels en programmation : elles permettent de prendre des décisions et de répéter des actions selon certaines conditions. En Java, les structures de contrôle principales sont &lt;strong&gt;if-else&lt;/strong&gt; et &lt;strong&gt;switch-case&lt;/strong&gt; pour le choix, ainsi que les boucles (qui seront vues plus loin).&lt;/p&gt;&#10;&lt;p&gt;Une structure de contrôle permet d’exécuter différentes instructions selon la valeur d’une variable ou le résultat d’une expression logique. Cela rend les programmes dynamiques et capables de s’adapter à différentes situations.&lt;/p&gt;</description></item><item><title>Introduction aux types de base et à leurs opérateurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/typeoperateur/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/typeoperateur/</guid><description>&lt;h1 id="introduction-aux-types-de-base-et-à-leurs-opérateurs"&gt;&#10; Introduction aux types de base et à leurs opérateurs&#10; &lt;a class="anchor" href="#introduction-aux-types-de-base-et-%c3%a0-leurs-op%c3%a9rateurs"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="mise-en-garde-pédagogique"&gt;&#10; Mise en garde pédagogique&#10; &lt;a class="anchor" href="#mise-en-garde-p%c3%a9dagogique"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Si on prend un cours de Mandarin, on ne s'attend pas à comprendre tout le Mandarin lu ou écouté du premier coup ou même du deuxième. Il en va de même lorsqu'on étudie un langage de programmation, surtout s'il s'agit du premier langage de programmation appris. La première fois, la seconde fois, ou même la troisième fois que vous verrez un bout de code, il est parfaitement normal de ne pas le comprendre entièrement. C'est d'autant plus vrai que le langage Java a une syntaxe plutôt lourde avec beaucoup de mots réservés à la signification abstraite. Vous verrez beaucoup de mots comme "class", "public", "static", "void" dans ce cours. Si ça vous semble être du jargon, c'est parce que c'est exactement ce dont il s'agit. Monter un programme en Java n'est pas chose aisée, il faut comprendre que les "classes" vont dans des fichiers avec un nom correspondant à la classe, il faut comprendre que seule la méthode "public static void main(String[])" est exécutable, etc., etc. Il est impossible d'absorber tout ça en un jour, en une semaine ou même en quelques courtes semaines. Ça prend du temps avant de s'y retrouver.&lt;/p&gt;</description></item><item><title>Les structures itératives</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-2/</guid><description>&lt;h1 id="les-structures-itératives"&gt;&#10; Les structures itératives&#10; &lt;a class="anchor" href="#les-structures-it%c3%a9ratives"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Les structures itératives permettent d&amp;rsquo;itérer un certain nombre de fois, basé sur des variables de contrôle. Elles permettent par exemple de chercher une valeur dans une structure de données (ex. un tableau d&amp;rsquo;entier), de lire un flux de données caractère par caractère, etc. Elles sont l&amp;rsquo;implémentation des &amp;ldquo;tant que&amp;rdquo;, des &amp;ldquo;pour i de 1 à 10 faire&amp;rdquo;, etc. Dans le langage Java, il existe trois structures itératives : le while, le for et le do-while.&lt;/p&gt;</description></item><item><title>Les chaînes de caractères (String)</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-string/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-string/</guid><description>&lt;h1 id="string"&gt;&#10; String&#10; &lt;a class="anchor" href="#string"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;En Java, le type &lt;code&gt;String&lt;/code&gt; représente une séquence de caractères. Il est très utilisé pour manipuler du texte : noms, messages, fichiers, etc. Une particularité essentielle à comprendre est que les objets de type &lt;code&gt;String&lt;/code&gt; sont &lt;strong&gt;immuables&lt;/strong&gt; : une fois créés, ils ne peuvent pas être modifiés. Toute opération qui semble modifier une chaîne (comme la concaténation, le remplacement ou la suppression de caractères) crée en réalité un nouvel objet &lt;code&gt;String&lt;/code&gt; en mémoire, sans changer l’original.&lt;/p&gt;</description></item><item><title>Exercices sur les classes, les variables, les types et les opérateurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-1/</guid><description>&lt;h1 id="exercices-sur-les-classes-les-variables-les-types-et-les-opérateurs"&gt;&#10; Exercices sur les classes, les variables, les types et les opérateurs&#10; &lt;a class="anchor" href="#exercices-sur-les-classes-les-variables-les-types-et-les-op%c3%a9rateurs"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Prenez en note chaque question. Tentez par vos propres moyens, mais avec l&amp;rsquo;aide de tout le matériel et de l&amp;rsquo;Internet, de résoudre le problème. Prévoyez jusqu&amp;rsquo;à 15 minutes de travail par question. Après avoir bien travaillé la question, consultez la réponse.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;</description></item><item><title>Les structures de données de base</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3/</guid><description>&lt;h1 id="les-structures-de-données-de-base"&gt;&#10; Les structures de données de base&#10; &lt;a class="anchor" href="#les-structures-de-donn%c3%a9es-de-base"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le langage Java possède toutes les stuctures de données nécessaires.&#10;Faisons-en rapidement le tour. En Java, les types de données sont organisés en deux grandes catégories : les types primitifs et les types référence. Les types primitifs, tels que int, double, float, long, short, byte, char et boolean, sont des types de base qui stockent directement des valeurs simples et ne sont pas des objets. Chaque type primitif possède une classe enveloppe correspondante (par exemple, Integer pour int, Double pour double) dans la catégorie des classes enveloppes. Ces classes permettent de représenter les primitifs sous forme d’objets, offrant des fonctionnalités supplémentaires comme l’utilisation dans des collections ou la conversion entre types.&lt;/p&gt;</description></item><item><title>Les valeurs aléatoires</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-random/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-random/</guid><description>&lt;h1 id="génération-de-valeurs-aléatoires"&gt;&#10; Génération de valeurs aléatoires&#10; &lt;a class="anchor" href="#g%c3%a9n%c3%a9ration-de-valeurs-al%c3%a9atoires"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;Vous n&amp;rsquo;avez pas à maîtriser la génération de valeurs aléatoires dans ce cours.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Pour tester des structures de données, il est utile de pouvoir générer des valeurs aléatoires. Le plus souvent en programmation logicielle, nous générons des valeurs pseudo-aléatoires. Une valeur pseudo-aléatoire semble aléatoire, mais elle est en réalité pré-déterminée. La classe &lt;code&gt;Random&lt;/code&gt; en Java, située dans le paquetage &lt;code&gt;java.util&lt;/code&gt;, permet de générer des nombres pseudo-aléatoires pour diverses applications, comme les simulations, les jeux ou les tests. Elle utilise un générateur de nombres pseudo-aléatoires basé sur une graine (seed), qui, si spécifiée, garantit la reproductibilité des séquences générées. Par défaut, &lt;code&gt;Random&lt;/code&gt; utilise une graine dérivée de l’heure système pour produire des résultats différents à chaque exécution. La classe offre des méthodes comme &lt;code&gt;nextInt()&lt;/code&gt;, &lt;code&gt;nextDouble()&lt;/code&gt; ou &lt;code&gt;nextBoolean()&lt;/code&gt; pour générer respectivement des entiers, des nombres à virgule flottante ou des booléens.&lt;/p&gt;</description></item><item><title>La programmation fonctionnelle en Java</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/fonctionnel/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/fonctionnel/</guid><description>&lt;h1 id="la-programmation-fonctionnelle-en-java"&gt;&#10; La programmation fonctionnelle en Java&#10; &lt;a class="anchor" href="#la-programmation-fonctionnelle-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La programmation fonctionnelle tire ses origines des mathématiques, en particulier du calcul lambda développé par Alonzo Church dans les années 1930. Ce formalisme a posé les bases théoriques pour décrire les calculs comme des fonctions pures, sans effets de bord. Dans les années 1950, John McCarthy a créé Lisp, le premier langage explicitement inspiré de ces idées, introduisant des concepts comme les fonctions de première classe. Les années 1980 ont vu l’émergence de langages comme Haskell, qui a mis l’accent sur les fonctions pures et l’évaluation paresseuse.&#10;L&amp;rsquo;évaluation paresseuse est une stratégie en programmation fonctionnelle où l&amp;rsquo;évaluation d&amp;rsquo;une expression est retardée jusqu&amp;rsquo;à ce que sa valeur soit réellement nécessaire. Cela permet d&amp;rsquo;optimiser les performances en évitant les calculs inutiles et de supporter des structures de données potentiellement infinies.&#10;Depuis, la programmation fonctionnelle a influencé de nombreux langages modernes (Scala, Clojure, F#) et a été intégrée dans des langages impératifs comme Python, JavaScript et Java, en réponse à la nécessité de parallélisme et de code plus robuste.&lt;/p&gt;</description></item><item><title>Méthodes et constructeurs</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/methodes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/methodes/</guid><description>&lt;h1 id="la-conception-de-méthodesfonctions-et-leur-appel"&gt;&#10; La conception de méthodes/fonctions et leur appel&#10; &lt;a class="anchor" href="#la-conception-de-m%c3%a9thodesfonctions-et-leur-appel"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La conception de méthodes (ou fonctions) est un pilier de la programmation structurée et orientée objet. Une méthode permet d’isoler une opération ou un calcul précis, de lui donner un nom, et de la réutiliser à volonté dans différents contextes du programme. Cela favorise la clarté, la maintenance et la réutilisabilité du code. Lorsqu’on appelle une méthode, on peut lui transmettre des informations (paramètres) et récupérer un résultat (valeur de retour). En Java, chaque méthode appartient à une classe : elle définit le comportement que les objets de cette classe peuvent adopter ou les opérations qu’ils peuvent effectuer. Bien concevoir ses méthodes, c’est donc apprendre à découper un problème en sous-tâches logiques, à nommer clairement les opérations, et à limiter la duplication de code.&lt;/p&gt;</description></item><item><title>Exercices sur les classes et méthodes</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/exercices-2-2/</guid><description>&lt;h1 id="questionsréponses"&gt;&#10; Questions/Réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Veuillez répondre mentalement ou sur papier à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="comment-faire-ces-exercices-"&gt;&#10; Comment faire ces exercices ?&#10; &lt;a class="anchor" href="#comment-faire-ces-exercices-"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;N'allez pas trop vite. Il ne sert à rien de lire la question et d'immédiatement lire la réponse. Le but des exercices est de vous amener à travailler la matière. Si vous ne faites que regarder les solutions, vous n'apprenez pas grand chose. &lt;/p&gt;</description></item><item><title>Exercices sur les structures de contrôle, les structures de données, les structures itératives</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/exercices-3-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/exercices-3-1/</guid><description>&lt;h1 id="exercices-sur-les-structures-de-contrôle-les-structures-de-données-les-structures-itératives"&gt;&#10; Exercices sur les structures de contrôle, les structures de données, les structures itératives&#10; &lt;a class="anchor" href="#exercices-sur-les-structures-de-contr%c3%b4le-les-structures-de-donn%c3%a9es-les-structures-it%c3%a9ratives"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="questionsréponses"&gt;&#10; Questions/Réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Veuillez répondre mentalement, sur papier ou bien en créant le code nécessaire pour répondre à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;</description></item><item><title>Les exceptions</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-4/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-4/</guid><description>&lt;h1 id="les-exceptions"&gt;&#10; Les exceptions&#10; &lt;a class="anchor" href="#les-exceptions"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;En programmation, il est essentiel de pouvoir gérer les erreurs qui peuvent survenir lors de l’exécution d’un programme. Java propose un mécanisme puissant et structuré : les exceptions. Plutôt que de laisser le programme s’arrêter brutalement en cas de problème (comme une division par zéro ou l’ouverture d’un fichier inexistant), Java permet de « lancer » une exception. Cette exception peut alors être capturée et traitée, ce qui rend le code plus robuste, plus lisible et plus facile à maintenir.&lt;/p&gt;</description></item><item><title>Recommandations</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/conseils/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/conseils/</guid><description>&lt;h1 id="recommandations"&gt;&#10; Recommandations&#10; &lt;a class="anchor" href="#recommandations"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Il est important d&amp;rsquo;écrire du code lisible et bien documenté. Il s&amp;rsquo;agit d&amp;rsquo;un compétence&#10;nécessaire pour développer du logiciel en pratique.&lt;/p&gt;&#10;&lt;h2 id="importance-de-la-lisibilité-du-code-en-java"&gt;&#10; Importance de la lisibilité du code en Java&#10; &lt;a class="anchor" href="#importance-de-la-lisibilit%c3%a9-du-code-en-java"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;La lisibilité du code est essentielle en Java pour faciliter la maintenance et la collaboration.&#10;Un code lisible réduit les erreurs et permet à d&amp;rsquo;autres développeurs (ou à vous-même dans le&#10;futur) de comprendre rapidement l&amp;rsquo;intention du programme. Pour y parvenir, il faut adopter&#10;des conventions de nommage claires et commenter judicieusement. Les normes de codage,&#10;comme celles définies par Oracle ou Google, standardisent la structure du code, rendant&#10;les projets cohérents. Une variable bien nommée, comme &lt;code&gt;nombreEtudiants&lt;/code&gt; au lieu de &lt;code&gt;n&lt;/code&gt;,&#10;et des commentaires explicatifs améliorent la compréhension.&lt;/p&gt;</description></item><item><title>Java moderne</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/javamodern/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/javamodern/</guid><description>&lt;h1 id="java-moderne"&gt;&#10; Java moderne&#10; &lt;a class="anchor" href="#java-moderne"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Le langage Java existe depuis des décennies. Pendant ce temps, les conventions&#10;qu&amp;rsquo;utilisent les programmeurs ont évoluées. Nous vous encourageons à utiliser&#10;un style plus moderne.&lt;/p&gt;&#10;&lt;h2 id="exemple-1"&gt;&#10; Exemple 1&#10; &lt;a class="anchor" href="#exemple-1"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionel"&gt;&#10; Conventionel&#10; &lt;a class="anchor" href="#conventionel"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937152401"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937152401 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937152401 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937152401 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937152401 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937152401 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937152401 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937152401 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937152401 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937152401 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937152401-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937152401-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937152401-name'&gt;&#10;class Point {&#10; private final double x;&#10; private final double y;&#10; public Point(double x, double y) {&#10; this.x = x;&#10; this.y = y;&#10; }&#10; public double x() {&#10; return x;&#10; }&#10; public double y() {&#10; return y;&#10; }&#10; public String toString() {&#10; return &amp;#34;Point[x=&amp;#34; &amp;#43; x &amp;#43; &amp;#34;, y=&amp;#34; &amp;#43; y &amp;#43; &amp;#34;]&amp;#34;;&#10; }&#10;}&#10;&#10;public class Main {&#10; public static void main(String[] args) {&#10; Point p = new Point(3.0, 4.5);&#10; System.out.println(p);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937152401-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937152401');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937211568"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937211568 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937211568 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937211568 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937211568 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937211568 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937211568 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937211568 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937211568 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937211568 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937211568-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937211568-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937211568-name'&gt;&#10;record Point(double x, double y) {}&#10;void main() {&#10; Point p = new Point(3.0, 4.5);&#10; System.out.println(p);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937211568-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937211568');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-2"&gt;&#10; Exemple 2&#10; &lt;a class="anchor" href="#exemple-2"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937271396"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937271396 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937271396 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937271396 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937271396 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937271396 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937271396 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937271396 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937271396 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937271396 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937271396-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937271396-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937271396-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; String name = &amp;#34;Marie&amp;#34;;&#10; int age = 37;&#10; String city = &amp;#34;Québec&amp;#34;;&#10; String message = &amp;#34;Bonjour, je m&amp;#39;appelle &amp;#34; &amp;#43; name &amp;#43;&#10; &amp;#34;, j&amp;#39;ai &amp;#34; &amp;#43; age &amp;#43; &amp;#34; ans et j&amp;#39;habite à &amp;#34; &amp;#43;&#10; city &amp;#43; &amp;#34;.&amp;#34;;&#10; System.out.println(message);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937271396-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937271396');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-1"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-1"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937311882"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937311882 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937311882 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937311882 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937311882 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937311882 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937311882 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937311882 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937311882 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937311882 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937311882-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937311882-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937311882-name'&gt;&#10;void main() {&#10; String name = &amp;#34;Marie&amp;#34;;&#10; int age = 37;&#10; String city = &amp;#34;Québec&amp;#34;;&#10; String message = &amp;#34;&amp;#34;&amp;#34;&#10; Bonjour, je m&amp;#39;appelle %s,&#10; j&amp;#39;ai %d ans&#10; et j&amp;#39;habite à %s.&#10; &amp;#34;&amp;#34;&amp;#34;.formatted(name, age, city);&#10; System.out.println(message);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937311882-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937311882');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-3"&gt;&#10; Exemple 3&#10; &lt;a class="anchor" href="#exemple-3"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel-1"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-1"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937353697"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937353697 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937353697 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937353697 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937353697 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937353697 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937353697 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937353697 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937353697 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937353697 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937353697-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937353697-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937353697-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; int jour = 3; // 1 = lundi, 2 = mardi, ..., 7 = dimanche&#10; String type;&#10; switch (jour) {&#10; case 1:&#10; case 2:&#10; case 3:&#10; case 4:&#10; case 5:&#10; type = &amp;#34;Jour de semaine&amp;#34;;&#10; break;&#10; case 6:&#10; case 7:&#10; type = &amp;#34;Fin de semaine&amp;#34;;&#10; break;&#10; default:&#10; type = &amp;#34;Jour invalide&amp;#34;;&#10; break;&#10; }&#10; System.out.println(type);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937353697-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937353697');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-2"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-2"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937386888"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937386888 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937386888 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937386888 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937386888 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937386888 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937386888 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937386888 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937386888 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937386888 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937386888-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937386888-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937386888-name'&gt;&#10;void main() {&#10; int jour = 3;&#10; String type = switch (jour) {&#10; case 1, 2, 3, 4, 5 -&amp;gt; &amp;#34;Jour de semaine&amp;#34;;&#10; case 6, 7 -&amp;gt; &amp;#34;Fin de semaine&amp;#34;;&#10; default -&amp;gt; &amp;#34;Jour invalide&amp;#34;;&#10; };&#10; System.out.println(type);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937386888-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937386888');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="exemple-4"&gt;&#10; Exemple 4&#10; &lt;a class="anchor" href="#exemple-4"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;h3 id="conventionnel-2"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-2"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937431269"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937431269 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937431269 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937431269 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937431269 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937431269 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937431269 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937431269 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937431269 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937431269 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937431269-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937431269-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937431269-name'&gt;&#10;class Livre {&#10; private final String titre;&#10; private final int annee;&#10; public Livre(String titre, int annee) {&#10; this.titre = titre;&#10; this.annee = annee;&#10; }&#10; public String getTitre() {&#10; return titre;&#10; }&#10; public int getAnnee() {&#10; return annee;&#10; }&#10; public String toString() {&#10; return &amp;#34;Livre{titre=&amp;#39;&amp;#34; &amp;#43; titre &amp;#43; &amp;#34;&amp;#39;, annee=&amp;#34; &amp;#43; annee &amp;#43; &amp;#34;}&amp;#34;;&#10; }&#10;}&#10;&#10;public class Main {&#10; public static void main(String[] args) {&#10; Livre livre = new Livre(&amp;#34;Le Petit Prince&amp;#34;, 1943);&#10; System.out.println(livre);&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937431269-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937431269');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="moderne-3"&gt;&#10; Moderne&#10; &lt;a class="anchor" href="#moderne-3"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937478658"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937478658 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937478658 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937478658 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937478658 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937478658 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937478658 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937478658 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937478658 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937478658 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937478658-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937478658-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937478658-name'&gt;&#10;record Livre(String titre, int annee) {}&#10;void main() {&#10; Livre livre = new Livre(&amp;#34;Le Petit Prince&amp;#34;, 1943);&#10; System.out.println(livre);&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937478658-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937478658');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h3 id="exemple-5"&gt;&#10; Exemple 5&#10; &lt;a class="anchor" href="#exemple-5"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;h3 id="conventionnel-3"&gt;&#10; Conventionnel&#10; &lt;a class="anchor" href="#conventionnel-3"&gt;#&lt;/a&gt;&#10;&lt;/h3&gt;&#10;&lt;div class="java-inline"&gt;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &lt;div id="java-runner-1789748553937513057"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css"&gt;&#10; &lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/eclipse.min.css"&gt;&#10; &lt;style&gt;&#10; #java-runner-1789748553937513057 .export-form textarea { width:100%; min-height:120px; font-family:monospace; border-radius:4px; border:1px solid #ccc; }&#10; #java-runner-1789748553937513057 .export-form { margin-bottom:0; }&#10; #java-runner-1789748553937513057 .export-result { background:#222; color:#eee; padding:12px; border-radius:6px; margin-top:16px; white-space:pre-wrap; font-family:monospace; }&#10; #java-runner-1789748553937513057 .export-result.is-running::after { content:''; animation: exportRunningDots 2s steps(1, end) infinite; }&#10; @keyframes exportRunningDots { 0% { content:''; } 25% { content:'.'; } 50% { content:'..'; } 75% { content:'...'; } }&#10; @media (prefers-reduced-motion: reduce) { #java-runner-1789748553937513057 .export-result.is-running::after { animation:none; content:'…'; } }&#10; #java-runner-1789748553937513057 .export-endpoint-info { color:#1976d2; font-size:0.98em; margin-top:8px; }&#10; #java-runner-1789748553937513057 .export-btn { background:#1976d2; color:#fff; border:none; border-radius:4px; padding:8px 16px; font-size:1em; cursor:pointer; margin-top:8px; }&#10; #java-runner-1789748553937513057 .export-file-block { max-width: 100%;flex:1 1 350px; background:#f9f9f9; border:1px solid #ddd; border-radius:6px; padding:12px; margin-bottom:8px; }&#10; #java-runner-1789748553937513057 .export-file-block .export-file-name { font-weight:bold; margin-bottom:4px; }&#10; .cm-java-error { background: #ffe0e0 !important; border-bottom: 2px dotted #c00; cursor: pointer; }&#10; .cm-java-error-line { background: #fff0f0 !important; }&#10; &lt;/style&gt;&#10; &lt;form class="export-form java-runner-1789748553937513057-form" style="margin-bottom:0;" aria-label="Exécuter le programme Java Main.java"&gt;&#10; &lt;input type="hidden" class="export-endpoint-var" value="https://flask-service-inf1220-java.90qakjuvfj4f8.ca-central-1.cs.amazonlightsail.com/run"&gt;&#10; &lt;div style="display:flex;gap:12px;flex-wrap:wrap;"&gt;&#10; &lt;div class='export-file-block'&gt;&lt;div class='export-file-name' id='java-runner-1789748553937513057-name'&gt;Main.java&lt;/div&gt;&lt;textarea aria-labelledby='java-runner-1789748553937513057-name'&gt;&#10;public class Main {&#10; public static void main(String[] args) {&#10; String name = &amp;#34; Alice &amp;#34;;&#10; if (name != null) {&#10; if (!name.trim().isEmpty()) {&#10; System.out.println(&amp;#34;Bonjour &amp;#34; &amp;#43; name.trim());&#10; } else {&#10; System.out.println(&amp;#34;Bonjour inconnu&amp;#34;);&#10; }&#10; } else {&#10; System.out.println(&amp;#34;Bonjour inconnu&amp;#34;);&#10; }&#10; }&#10;}&#10;&lt;/textarea&gt;&lt;/div&gt;&#10; &lt;/div&gt;&#10; &lt;button type="submit" class="export-btn java-runner-1789748553937513057-btn" style="background:#1976d2;color:#fff;border:none;border-radius:4px;padding:8px 16px;font-size:1em;cursor:pointer;margin-top:8px;"&gt;Exécuter&lt;/button&gt;&#10; &lt;/form&gt;&#10; &lt;div class="export-result" role="status" aria-live="polite" aria-atomic="true" aria-label="Résultat de l'exécution"&gt;&lt;/div&gt;&#10; &lt;div class="java-error-tooltip" style="display:none;position:absolute;z-index:1000;background:#fff0f0;color:#c00;border:1px solid #c00;padding:6px 12px;border-radius:6px;font-size:1em;box-shadow:0 2px 8px #0002;"&gt;&lt;/div&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js"&gt;&lt;/script&gt;&#10; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/clike/clike.min.js"&gt;&lt;/script&gt;&#10; &lt;script&gt;(function(){&#10; var root = document.getElementById('java-runner-1789748553937513057');&#10; if (!root) return;&#10; var form = root.querySelector('form');&#10; var resultDiv = root.querySelector('.export-result');&#10; var endpoint = form.querySelector('.export-endpoint-var').value;&#10; var tooltip = root.querySelector('.java-error-tooltip');&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; if(name.endsWith('.java')) {&#10; var cm = CodeMirror.fromTextArea(ta, {&#10; mode: "text/x-java",&#10; theme: "eclipse",&#10; lineNumbers: true,&#10; indentUnit: 4,&#10; tabSize: 4,&#10; &#10; &#10; extraKeys: {&#10; Tab: false,&#10; "Shift-Tab": false,&#10; Esc: function(c) { c.display.input.blur(); }&#10; }&#10; });&#10; (function(editor, fileName) {&#10; var label = "Éditeur de code Java : " + fileName;&#10; var wrapper = editor.getWrapperElement();&#10; wrapper.setAttribute('role', 'group');&#10; wrapper.setAttribute('aria-label', label);&#10; var field = editor.getInputField();&#10; if (field) { field.setAttribute('aria-label', label); }&#10; var scroll = wrapper.querySelector('.CodeMirror-scroll');&#10; if (scroll &amp;&amp; !scroll.hasAttribute('tabindex') &amp;&amp; !scroll.contains(field)) {&#10; scroll.setAttribute('tabindex', '0');&#10; scroll.setAttribute('role', 'region');&#10; scroll.setAttribute('aria-label', label);&#10; }&#10; })(cm, name);&#10; block._cm = cm;&#10; &#10; block._javaErrorLines = {};&#10; &#10; cm.on('cursorActivity', function() {&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (!statusBar) return;&#10; var cursor = cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; &#10; if(name.endsWith('.java')) {&#10; if (!block.querySelector('.java-error-status-bar')) {&#10; var statusBar = document.createElement('div');&#10; statusBar.className = 'java-error-status-bar';&#10; statusBar.setAttribute('role', 'status');&#10; statusBar.setAttribute('aria-live', 'polite');&#10; statusBar.style.marginTop = '4px';&#10; statusBar.style.fontSize = '0.95em';&#10; statusBar.style.color = '#c00';&#10; statusBar.style.minHeight = '1.2em';&#10; statusBar.style.visibility = 'hidden';&#10; block.appendChild(statusBar);&#10; }&#10; }&#10; });&#10; &#10; function showTooltip(msg, x, y) {&#10; tooltip.textContent = msg;&#10; tooltip.style.display = 'block';&#10; tooltip.style.left = (x+10) + 'px';&#10; tooltip.style.top = (y+10) + 'px';&#10; }&#10; function hideTooltip() {&#10; tooltip.style.display = 'none';&#10; }&#10; &#10; function escapeHtml(str) {&#10; if (str == null) return '';&#10; return String(str)&#10; .replace(/&amp;/g, '&amp;amp;')&#10; .replace(/&lt;/g, '&amp;lt;')&#10; .replace(/&gt;/g, '&amp;gt;')&#10; .replace(/"/g, '&amp;quot;')&#10; .replace(/'/g, '&amp;#39;');&#10; }&#10; form.onsubmit = function(e){&#10; e.preventDefault();&#10; var java_files = [], txt_files = [];&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var name = block.querySelector('.export-file-name').textContent;&#10; var ta = block.querySelector('textarea');&#10; var content = block._cm ? block._cm.getValue() : ta.value;&#10; if(name.endsWith('.java')) java_files.push({name: name, content: content});&#10; else txt_files.push({name: name, content: content});&#10; });&#10; &#10; resultDiv.textContent = 'Exécution en cours';&#10; resultDiv.classList.add('is-running');&#10; var execAnim = null;&#10; &#10; var controller = new AbortController();&#10; var timeoutId = setTimeout(function() { controller.abort(); }, 30000); &#10; fetch(endpoint, {&#10; method: 'POST',&#10; headers: { 'Content-Type': 'application/json' },&#10; body: JSON.stringify({ java_files: java_files, txt_files: txt_files }),&#10; signal: controller.signal&#10; })&#10; .then(function(r){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (!r.ok &amp;&amp; r.status !== 400 &amp;&amp; r.status !== 500) {&#10; throw new Error('Erreur HTTP ' + r.status + ' : ' + r.statusText);&#10; }&#10; return r.text();&#10; })&#10; .then(function(t){&#10; try {&#10; var j=JSON.parse(t);&#10; &#10; if(j.status==='ran_successfully') {&#10; resultDiv.innerHTML='&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='compiling') {&#10; resultDiv.innerHTML='&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.error||'').replace(/\n/g,'&lt;br&gt;')+escapeHtml(j.stderr||'')+'&lt;/pre&gt;';&#10; } else if(j.status==='runtime_error' || j.status==='error') {&#10; resultDiv.innerHTML=(j.output?'&lt;pre style="color:#222;background:#e0ffe0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.output).replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;':'')+'&lt;pre style="color:#c00;background:#ffe0e0;padding:12px;border-radius:6px;"&gt;'+escapeHtml(j.stderr||j.error||'').replace(/\n/g,'&lt;br&gt;')+'&lt;/pre&gt;';&#10; } else {&#10; resultDiv.textContent = t;&#10; }&#10; &#10; if(j.status==='compiling') {&#10; var errorText = j.error || '';&#10; var errorRegex = new RegExp('([\\w./\\-]+\\.java):(\\d+): error: ([^\\n]+)([\\s\\S]*?)(?=\\n[\\w./\\-]+\\.java:|$)','g');&#10; var match;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; &#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; while ((match = errorRegex.exec(errorText)) !== null) {&#10; var file = match[1], lineStr = match[2], msg = match[3], details = match[4];&#10; var line = parseInt(lineStr, 10) - 1;&#10; var errorMsg = (msg + (details ? details.replace(/\s+/g, ' ') : '')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameInput = block.querySelector('.export-file-name');&#10; if (nameInput &amp;&amp; (nameInput.textContent.trim() === file || nameInput.textContent.trim().endsWith('/'+file) || nameInput.textContent.trim().endsWith('\\'+file))) {&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; block._cm.markText({line:line, ch:0}, {line:line+1, ch:0}, {&#10; className: 'cm-java-error',&#10; title: errorMsg&#10; });&#10; });&#10; }&#10; &#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[line] = errorMsg;&#10; }&#10; });&#10; }&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm &amp;&amp; block._cm.getOption('lineNumbers')) {&#10; &#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; var cursor = block._cm.getCursor();&#10; var errMsg = block._javaErrorLines &amp;&amp; block._javaErrorLines[cursor.line];&#10; if (errMsg) {&#10; statusBar.textContent = 'Ligne ' + (cursor.line+1) + ' : ' + errMsg;&#10; statusBar.style.visibility = 'visible';&#10; } else {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; }&#10; }&#10; });&#10; } else if (j.status==='error' || j.status==='runtime_error') {&#10; var rtText = j.stderr || j.error || '';&#10; var rtCauses = rtText.split('\n').filter(function(l){ return /Caused by:/.test(l); });&#10; var rtMsg = (rtCauses.length&#10; ? rtCauses[rtCauses.length-1].replace(/^.*Caused by:\s*/, '')&#10; : (rtText.split('\n')[0] || 'Erreur d’exécution')).trim();&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function(){&#10; block._cm.getAllMarks().forEach(function(m){ m.clear(); });&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var sb = block.querySelector('.java-error-status-bar');&#10; if (sb) { sb.textContent = ''; sb.style.visibility = 'hidden'; }&#10; });&#10; var rtRegex = /\(([\w$-]+\.java):(\d+)\)/g;&#10; var rtSeen = {}, rtMatch;&#10; while ((rtMatch = rtRegex.exec(rtText)) !== null) {&#10; var rtFile = rtMatch[1], rtLine = parseInt(rtMatch[2], 10) - 1;&#10; if (rtLine &lt; 0 || rtSeen[rtFile + ':' + rtLine]) { continue; }&#10; rtSeen[rtFile + ':' + rtLine] = true;&#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var nameEl = block.querySelector('.export-file-name');&#10; var nm = nameEl ? nameEl.textContent.trim() : '';&#10; if (block._cm &amp;&amp; rtLine &lt; block._cm.lineCount() &amp;&amp;&#10; (nm === rtFile || nm.endsWith('/'+rtFile) || nm.endsWith('\\'+rtFile))) {&#10; block._cm.operation(function(){&#10; block._cm.markText({line:rtLine, ch:0}, {line:rtLine+1, ch:0}, {&#10; className: 'cm-java-error', title: rtMsg&#10; });&#10; });&#10; if (!block._javaErrorLines) { block._javaErrorLines = {}; }&#10; block._javaErrorLines[rtLine] = rtMsg;&#10; }&#10; });&#10; }&#10; } else {&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; if (block._cm) {&#10; block._cm.operation(function() {&#10; var marks = block._cm.getAllMarks();&#10; for (var i = 0; i &lt; marks.length; i++) { marks[i].clear(); }&#10; });&#10; }&#10; block._javaErrorLines = {};&#10; var statusBar = block.querySelector('.java-error-status-bar');&#10; if (statusBar) {&#10; statusBar.textContent = '';&#10; statusBar.style.visibility = 'hidden';&#10; }&#10; });&#10; }&#10; } catch(e){ console.log(e); resultDiv.textContent=t; }&#10; })&#10; .catch(function(error){&#10; clearInterval(execAnim);&#10; resultDiv.classList.remove('is-running');&#10; clearTimeout(timeoutId);&#10; if (error.name === 'AbortError') {&#10; resultDiv.textContent = 'Erreur : délai d’attente dépassé (30 secondes).';&#10; } else {&#10; resultDiv.textContent = 'Erreur lors de la requête : ' + error;&#10; }&#10; });&#10; };&#10; &#10; root.querySelectorAll('.export-file-block').forEach(function(block){&#10; var cm = block._cm;&#10; if (!cm) return;&#10; cm.on('mouseover', function(cm, event) {&#10; var pos = cm.coordsChar({ left: event.clientX, top: event.clientY });&#10; var line = pos.line, ch = pos.ch;&#10; var cursor = cm.getCursor();&#10; if (line === cursor.line &amp;&amp; block._javaErrorLines &amp;&amp; block._javaErrorLines[line]) {&#10; var msg = block._javaErrorLines[line];&#10; showTooltip(msg, event.clientX, event.clientY);&#10; }&#10; });&#10; cm.on('mouseout', function(cm, event) {&#10; hideTooltip();&#10; });&#10; });&#10; })();&lt;/script&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;(La méthode &lt;code&gt;trim()&lt;/code&gt; retourne une chaîne après avoir éliminé les espaces avant et après la chaîne.)&lt;/p&gt;</description></item><item><title>Markdown</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module2/markdown/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module2/markdown/</guid><description>&lt;h1 id="markdown"&gt;&#10; Markdown&#10; &lt;a class="anchor" href="#markdown"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Les traitements de texte comme Microsoft Word ne sont pas destinés à l&amp;rsquo;écriture&#10;technique avec du code informatique. Il est préférable d&amp;rsquo;utiliser une approche&#10;telle que Markdown pour la rédaction technique.&lt;/p&gt;&#10;&lt;p&gt;Markdown est un langage de balisage léger conçu pour formater du texte de manière simple et lisible, tout en permettant une conversion facile vers du HTML. Il a été créé en 2004 par John Gruber, avec l’aide d’Aaron Swartz, dans le but de rendre l’écriture de documents structurés accessible à tous, sans complexité technique.&#10;John Gruber, blogueur et développeur américain, a développé Markdown pour répondre au besoin d’un format de texte qui soit à la fois facile à lire en brut et simple à convertir en HTML pour le web. Aaron Swartz, programmeur et militant de l’Internet, a contribué à l’implémentation du premier convertisseur Markdown. Le nom &lt;em&gt;Markdown&lt;/em&gt; évoque l’idée de « réduire » (mark down) la complexité du balisage traditionnel.&lt;/p&gt;</description></item><item><title>La récursivité</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-5/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-5/</guid><description>&lt;h1 id="la-récursivité"&gt;&#10; La récursivité&#10; &lt;a class="anchor" href="#la-r%c3%a9cursivit%c3%a9"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;La récursivité est une technique fondamentale en informatique qui consiste pour une fonction à s’appeler elle-même afin de résoudre un problème en le divisant en sous-problèmes plus simples. Cette approche permet d’exprimer élégamment des solutions à des problèmes complexes, comme le calcul de suites, la recherche dans des structures arborescentes ou la résolution de certains algorithmes mathématiques. Comprendre la récursivité est essentiel pour progresser en algorithmique et en programmation.&lt;/p&gt;</description></item><item><title>Exercices sur les exceptions et la récursivité</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/exercices-3-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/exercices-3-2/</guid><description>&lt;h1 id="exercices-sur-les-exceptions-et-la-récursivité"&gt;&#10; Exercices sur les exceptions et la récursivité&#10; &lt;a class="anchor" href="#exercices-sur-les-exceptions-et-la-r%c3%a9cursivit%c3%a9"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;h2 id="questionsréponses"&gt;&#10; Questions/Réponses&#10; &lt;a class="anchor" href="#questionsr%c3%a9ponses"&gt;#&lt;/a&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Veuillez répondre mentalement, sur papier ou bien en créant le code nécessaire pour répondre à ces questions avant de regarder la réponse.&#10;Certaines questions sont difficiles, et il est normal de ne pas toutes les réussir.&lt;/p&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;N&amp;rsquo;oubliez pas d&amp;rsquo;utiliser notre &lt;a href="https://lemire.github.io/inf1220-nexam/docs/pensebete/"&gt;pense-bête Java&lt;/a&gt; au besoin. Pour les mathématiques,&#10;vous pouvez faire référence à notre rappel sur &lt;a href="https://lemire.github.io/inf1220-nexam/docs/extra/math/"&gt;les principales notions mathématiques&lt;/a&gt; du cours.&lt;/p&gt;</description></item><item><title>Exemple : modèle de langue</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-modele/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/activite-3-3-modele/</guid><description>&lt;h1 id="exemple--modèle-de-langue"&gt;&#10; Exemple : modèle de langue&#10; &lt;a class="anchor" href="#exemple--mod%c3%a8le-de-langue"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;blockquote class="book-hint info"&gt;&#10;&lt;p&gt;Ce exemple est une application des notions du module. Il s&amp;rsquo;agit de matériel optionnel.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Pour illustrer l&amp;rsquo;utilisation des tableaux, considérons l&amp;rsquo;exemple suivant. Le code implémente un modèle de langue simple en Java qui calcule les probabilités de transition entre caractères ASCII dans une chaîne donnée, puis génère une séquence de 100 caractères à partir d&amp;rsquo;un caractère initial. Il utilise un tableau à deux dimensions double[][] transitions de taille 128x128 pour stocker les probabilités qu’un caractère ASCII (0-127) soit suivi d’un autre. Dans calculerTransitions, le programme compte les occurrences des paires de caractères consécutifs dans le texte d’entrée et normalise ces comptes pour obtenir des probabilités, stockées dans transitions[i][j], où i est le caractère courant et j le suivant. Lors de la génération dans genererCaractereSuivant, ce tableau est utilisé pour sélectionner aléatoirement le caractère suivant en fonction des probabilités associées au caractère courant. Cette application des tableaux à deux dimensions permet de modéliser efficacement les relations entre caractères, chaque cellule représentant une probabilité de transition, et facilite la génération de texte en s’appuyant sur une structure matricielle claire et organisée.&lt;/p&gt;</description></item><item><title>Recommandations</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/conseils/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lemire.github.io/inf1220-nexam/docs/modules/module3/conseils/</guid><description>&lt;h1 id="recommandations"&gt;&#10; Recommandations&#10; &lt;a class="anchor" href="#recommandations"&gt;#&lt;/a&gt;&#10;&lt;/h1&gt;&#10;&lt;p&gt;Pour aborder un problème algorithmique, adoptez une démarche structurée. Analysez d’abord le problème en le décomposant en étapes simples. Avant de coder, rédigez un pseudocode ou un plan pour clarifier la logique. Cette préparation limite les erreurs et facilite la maintenance.&lt;/p&gt;&#10;&lt;p&gt;Privilégiez un code lisible avec des noms de variables explicites. Testez chaque étape avec des cas simples avant d’explorer des scénarios complexes. Cette validation progressive permet de repérer rapidement les anomalies et de garantir la robustesse de la solution.&lt;/p&gt;</description></item></channel></rss>