كتابة حاسبة جافا سكريبت



يوم جيد يا اصدقاء!

في هذه المقالة ، نحن ، كما يوحي الاسم ، سنكتب آلة حاسبة جافا سكريبت بسيطة.

جاءتني الرغبة في كتابة آلة حاسبة بعد مشاهدة برنامج تعليمي واحد حول إنشاء "آلة حاسبة بسيطة" ، والتي تبين أنها بعيدة عن البساطة ولا يمكنها فعل أي شيء.

ستكون الآلة الحاسبة الخاصة بنا بسيطة للغاية (42 سطرًا من التعليمات البرمجية ، بما في ذلك المسافات بين الكتل) ، ولكنها تعمل بكامل طاقتها وقابلة للتطوير.

سيتم استخدام هذه المكتبة الرائعة (Math.js) للحسابات .

بدون مزيد من المقدمة ، ننطلق في العمل.

يبدو ترميزنا كما يلي:

<!-- head -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.6.4/math.js"></script>

<!-- body -->
<div class="calculator">
    <output></output>
</div>

هنا نقوم بتوصيل المكتبة ، وإنشاء حاوية للآلة الحاسبة وحقل لأحرف الإدخال والنتيجة.

نحن نربط الأنماط:
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  height: 100vh;
  background: radial-gradient(circle, skyblue, steelblue);
  display: flex;
  justify-content: center;
  align-items: center;
}

.calculator {
  width: 320px;
  height: 480px;
  background: #eee;
  border-radius: 5px;
  box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2), -2px -2px 3px rgba(0, 0, 0, 0.2);
}

output {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 300px;
  height: 40px;
  background: #fff;
  margin: 10px auto;
  border-radius: 5px;
  font-size: 1.4em;
  font-weight: bold;
  box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.3),
    inset -1px -1px 1px rgba(0, 0, 0, 0.3);
}

.keyboard {
  height: 440px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-evenly;
  align-items: flex-start;
}

button {
  margin: 0.5em 1em;
  width: 40px;
  height: 40px;
  display: flex;
  justify-content: center;
  align-items: center;
  background: none;
  border: none;
  cursor: pointer;
  font-size: 1em;
  font-weight: bold;
}


إليك ما لدينا في الوقت الحالي:



سيتم إنشاء الأزرار برمجيًا.

ننتقل إلى البرنامج النصي.

نحدد مجالا لإخراج النتيجة وإنشاء حاوية لوحة المفاتيح:

const output = document.querySelector('output')

const div = document.createElement('div')
div.classList.add('keyboard')
document.querySelector('.calculator').appendChild(div)

يبدو خطنا مع الشخصيات كما يلي:

'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) ='

تحويل هذه السلسلة إلى صفيف وإنشاء الأزرار:

//    
//      ,       "CE"
'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) ='.split(' ')
    //   
    //   
    //      
    //      "value" 
    .map(symbol => {
        div.insertAdjacentHTML('beforeend', `<button value="${symbol}">${symbol}</button>`)
    })

نجد الأزرار التي تم إنشاؤها وإضافة معالج حدث النقر إليها:

document.querySelectorAll('button').forEach(button => {
    button.addEventListener('click', function () {
        //          
        calc(this.value)
    })
})

نريد أيضًا أن نتمكن من إدخال الأحرف باستخدام لوحة المفاتيح. للقيام بذلك ، نحتاج إلى إضافة معالج الأحداث "ضغط المفاتيح" إلى كائن "المستند" أو "النافذة" ، ثم تصفية القيم غير الضرورية لخاصية "المفتاح" للمفتاح ، على سبيل المثال ، باستخدام تعبير عادي:

document.addEventListener('keydown', event => {
    if ((event.key).match(/[0-9%\/*\-+\(\)=]|Backspace|Enter/)) calc(event.key)
})

تلعب طريقة المطابقة في هذه الحالة دور المرشح: فهي لا تسمح بتمرير وسيطة إلى دالة calc التي لا تتطابق مع الشرط المحدد فيها.

الشرط نفسه كما يلي: إذا كانت قيمة event.key هي إحدى الأحرف الموضحة بين قوسين معقوفين ([] ؛ رقم من 0 إلى 9 ، علامات القسمة ، الضرب ، الجمع ، الطرح ، الفتح ، إغلاق الأقواس أو علامة مساوية ؛ الشرطة المائلة للخلف - الهروب) أو (| - التعديل) Backspace ، أو Enter ، ثم نسمي الحساب بـ event.key كمعلمة ، وإلا فإننا لا نفعل شيئًا (يتم تجاهل Shift أيضًا بنجاح).

وظيفتنا الرئيسية (والوحيدة) هي كما يلي (يجب قراءة الرمز من الأسفل إلى الأعلى):

//       
function calc(value) {
    //      Enter
    if (value.match(/=|Enter/)) {
        //   
        try {
            //   
            //     "evaluate"  "math"
            // Math.trunc      
            output.textContent = Math.trunc(math.evaluate(output.textContent))
            
        //    
        } catch {
            //   
            let oldValue = output.textContent
            //   
            let newValue = ' '
            //      
            output.textContent = newValue
            //       
            setTimeout(() => {
                output.textContent = oldValue
            }, 1500)
        }
        
    //    "C"
    } else if (value === 'C') {
        //  
        output.textContent = ''
    
    //    ""  Backspace
    } else if (value.match(/CE|Backspace/)) {
        //     
        output.textContent = output.textContent.substring(0, output.textContent.length - 1)
        
    //     ()   
    } else {
        //     
        output.textContent += value
    }
}

في الختام ، بضع كلمات حول قابلية التوسع المعلنة والوظائف الكاملة.

تتميز طريقة التقييم (التي تم تقييمها سابقًا) وأساليب Math.js الأخرى بقدرات كبيرة جدًا. استنادًا إلى هذه الميزات ، يمكننا بسهولة توسيع وظائف الآلة الحاسبة لدينا عن طريق إضافة أحرف وعوامل جديدة إليها ، مما يوفر إمكانية العمل مع أرقام الفاصلة العائمة (ضبط عدد المنازل العشرية باستخدام المحول وأسلوب "toFixed") ، إلخ.

نتيجة:



كود جيثب .

شكرآ لك على أهتمامك. آمل أن تجد شيئًا مفيدًا لنفسك. أتمنى لك عطلة نهاية أسبوع سعيدة وترميز سعيد.

All Articles