Calculator construit from scratch, cu evaluator de expresii propriu (fără functia predefinita eval).
- Funcționalități
- Cum îl rulezi
- Comenzi de la tastatură
- Arhitectură și implementare
- De ce nu am folosit eval
- Probleme întâlnite
- Roadmap
- Adunare (+), Scădere (-), Înmulțire (*) și Împărțire (/)
- Egal (=) pentru evaluarea expresiei curente
- Clear (C) pentru ștergere
- Afișare cu separatori pentru mii și zecimale
- Interacțiune din tastatură
Metoda simplă, local:
- Deschide fișierul
calculator_project.htmlîn browser (double-click sau drag & drop).
- Tab / Shift+Tab: navigare între butoane
- Enter: activează butonul focalizat
- Tastele numerice și operatorii (+, -, *, /, =) se pot introduce de la tastatura pentru ca exista mapare in fisierul de JavaScript.
Funcțiile cheie:
custom_eval_funct()– înlocuieșteeval; separă numerele și operatorii și evaluează expresia si respectiv precedențatokenize()– extrage token-urile (numere, inclusiv negative, și operatori)formatWithThousandSeparator_used_for_eval()– normalizează stringul (înlocuiește,cu.la zecimale și elimină.din partea întreagă)
expression()– calculează rezultatul cu:process_division_and_multiplication()sum_and_difference()
displayResult()– formatează rezultatul final (mii folosinduse.si,pentru zecimale; foloseștetoFixed()pentru a evita erori de reprezentare si pentru ca rezultatul sa nu fie lung)updateDisplay()– formatează dinamic inputul curent; împarte după operatori, formatează partea numerică și re-compune stringul
Notă: Regulile de formatare sunt in concordanta cu stilul „european” (punct pentru mii, virgulă pentru zecimale).
display– input-ul principal pe care se afișează expresia/rezultatulhistory_numbers– listă cu rezultate pentru istoric- Setări UI:
list_of_fontsizes,list_of_lenghtsșiindex_of_lenghtspentru redimensionarea fontului în funcție de lungimea expresiei;initial_sizesalvează mărimea de font inițială - Variabile de context:
operatorRegex,prev_input,prev_display,operator,temp_operator,lastNumber,temp_lastNumber,count
- Introducere (click/ tastatură) prin
add(input) - Edge case-uri luate in considerare:
- început cu operator (exceptând „-” pentru numere negative)
- secvențe invalide de operatori sau zecimală dublă (
isInvalidOperatorSequence,isDuplicateDecimal) - zerouri la început (
isLeadingZero) - adăugare cifre după calculare (
isInvalidPostCalculationInput) - limită de lungime (
too_long_input)
- Daca totul este in regula se executa
updateDisplay(input)care:- formatează partea întreagă cu
formatWithThousandSeparator - ajustează dimensiunea fontului (
modify_size)
- formatează partea întreagă cu
Erorile sunt comunicate prin showAlert(message) urmat de reset_display() pentru revenire la starea inițială.
calculate()realizeaza evaluarea și gestionează edge-case-uri: expresie goală, dividere la zero, operator la final + ce am scris mai sustokenize()transformă stringul în vector de token-uri numeric/operator, cu suport pentru numere negative și separatori (prinformatWithThousandSeparator_used_for_eval)expression()aplică precedența operatorilor în doi pași:process_division_and_multiplication()– executa prima oara inmultirea si impartirea si pune rezultate într-un vector intermediarsum_and_difference()– calculează suma/diferența secvențial
displayResult(result):- convertește numărul la string; păstrează întregul sau folosește
toFixed(4)pentru zecimale predefinite - înlocuiește
.cu,la zecimale, inserează.pentru mii - salvează în
prev_displayși ajustează fontul
- convertește numărul la string; păstrează întregul sau folosește
updateHistory()– afișează lista rezultatelor în containerul#historycu scroll.toggleHistory()– arată/ascunde containerul istoriculclearHistory()– golește istoricul și actualizează UIdeleteLastCharacter()– șterge ultimul caracter, reformatează inputul și reaplică regula separatorilor
Listener global keydown mapează:
- cifrele 0–9 și operatorii + - * / către
add .sau,către,(zecimal)Entersau=cătrecalculateBackspacecătredeleteLastCharacterC,csauEscapecătreclear_displayHsauhcătretoggleHistory
- Securitate –
evalpoate executa cod arbitrar, risc dacă inputul nu e controlat - Performanță – un evaluator dedicat pentru aritmetică simplă e, în general, mai eficient
- Control – dețin control complet asupra tokenizării și regulilor (edge cases incluse)
- Învățare – a cimentat înțelegerea manipulării stringurilor și a formatării numerelor
- Formatarea numerelor: folosesc
.pentru mii și,pentru zecimale –parseFloat()ignoră partea după,. Soluție:formatWithThousandSeparator_used_for_eval()normalizează înainte de calcul. updateDisplay()inițial rudimentar: împărțirea după,a generat erori. Soluție: împărțire după operatori și formatare pe segmente.
- Mesaje de alertă user-friendly (fără a folosi dialogul afisat de browser)