class ScientificCalculator { constructor(containerId) { this.container = document.getElementById(containerId); if (!this.container) return; this.currentInput = "0"; this.previousInput = ""; this.operation = null; this.init(); } init() { this.container.innerHTML = `
0
`; this.prevScreen = this.container.querySelector("#calc-prev"); this.currentScreen = this.container.querySelector("#calc-current"); this.addListeners(); } addListeners() { this.container.addEventListener("click", (e) => { const button = e.target.closest("button"); if (!button) return; const action = button.getAttribute("data-action"); const value = button.getAttribute("data-value"); if (action === "number") { this.appendNumber(value); } else if (action === "operator") { this.chooseOperation(value); } else if (action === "scientific") { this.scientificOperation(value); } else if (action === "calculate") { this.compute(); } else if (action === "clear") { this.clear(); } else if (action === "delete") { this.deleteDigit(); } this.updateScreen(); }); } appendNumber(number) { if (number === "." && this.currentInput.includes(".")) return; if (this.currentInput === "0" && number !== ".") { this.currentInput = number; } else { this.currentInput += number; } } chooseOperation(op) { if (this.currentInput === "") return; if (this.previousInput !== "") { this.compute(); } this.operation = op; this.previousInput = this.currentInput; this.currentInput = ""; } scientificOperation(func) { const current = parseFloat(this.currentInput); if (isNaN(current)) return; let result; switch (func) { case "sqrt": result = current < 0 ? "Erreur" : Math.sqrt(current); break; case "sqr": result = Math.pow(current, 2); break; case "inv": result = current === 0 ? "Erreur" : 1 / current; break; case "sin": // Conversion en radians pour le calcul trigonométrique standard result = Math.sin(current * (Math.PI / 180)); break; case "cos": result = Math.cos(current * (Math.PI / 180)); break; case "tan": result = Math.tan(current * (Math.PI / 180)); break; default: return; } this.currentInput = typeof result === "number" ? parseFloat(result.toFixed(8)).toString() : result; } compute() { let computation; const prev = parseFloat(this.previousInput); const current = parseFloat(this.currentInput); if (isNaN(prev) || isNaN(current)) return; switch (this.operation) { case "+": computation = prev + current; break; case "-": computation = prev - current; break; case "*": computation = prev * current; break; case "/": computation = current === 0 ? "Erreur" : prev / current; break; default: return; } this.currentInput = parseFloat(computation.toFixed(8)).toString(); this.operation = null; this.previousInput = ""; } clear() { this.currentInput = "0"; this.previousInput = ""; this.operation = null; } deleteDigit() { if (this.currentInput.length === 1 || this.currentInput === "Erreur") { this.currentInput = "0"; } else { this.currentInput = this.currentInput.slice(0, -1); } } updateScreen() { this.currentScreen.innerText = this.currentInput === "" ? "0" : this.currentInput; if (this.operation != null) { this.prevScreen.innerText = `${this.previousInput} ${this.operation}`; } else { this.prevScreen.innerText = ""; } } }