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 = `
`;
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 = "";
}
}
}