<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Module 3: Les structures de données, de contrôle et d'itération en Java on INF 1220 - Introduction à la programmation</title><link>https://lemire.github.io/inf1220-nexam/docs/modules/module3/</link><description>Recent content in Module 3: Les structures de données, de contrôle et d'itération en Java on INF 1220 - Introduction à la programmation</description><generator>Hugo</generator><language>fr</language><atom:link href="https://lemire.github.io/inf1220-nexam/docs/modules/module3/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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>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>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>