سورس کد ماشین‌حساب علمی اندروید B4A — موتور پارسر کامل، آمادهٔ انتشار

# 🧮 سورس کد ماشین‌حساب علمی — Basic4Android

یک ماشین‌حساب **کامل و آمادهٔ انتشار** با موتور محاسبهٔ اختصاصی. نه یک دموی ساده —

یک اپ واقعی که می‌توانید همین امشب با آیکن و نام خودتان در بازار منتشر کنید.

---

## 🎯 چه چیزی این ماشین‌حساب را متفاوت می‌کند؟

اکثر سورس‌های ماشین‌حساب بازار، «دو عدد و یک عملگر» هستند: عدد اول را بگیر، عدد دوم را

بگیر، جمع کن. مشکلشان اینجاست که:

- پرانتز نمی‌فهمند

- اولویت عملگرها را نمی‌دانند (۲+۳×۴ را ۲۰ حساب می‌کنند به‌جای ۱۴)

- درصد واقعی ندارند

- وقتی عبارت غلط است، اپ هنگ می‌کند

این محصول یک **موتور پارسر واقعی** دارد (گرامر `expression → term → factor → unary → primary`)

که عبارت کامل را می‌فهمد.

---

## ✨ امکانات

### محاسبه

- 🔢 **عبارت کامل:** `2+3*(4-1)` ، `-(5+2)*3` ، `2^10`

- 📐 **اولویت عملگرها و پرانتز** — درست مثل یک ماشین‌حساب واقعی

- 🔄 **بستهٔ خودکار پرانتز:** وقتی پرانتز باز مانده، خودش می‌بندد

- 📊 **درصد هوشمند** (مثل ماشین‌حساب گوگل و ویندوز):

| عبارت | نتیجه |

|---|---|

| `200+10%` | **۲۲۰** (۱۰٪ روی ۲۰۰ اضافه می‌شود) |

| `200-10%` | **۱۸۰** |

| `50*20%` | **۱۰** |

| `50/20%` | **۲۵۰** |

- 🔬 **توابع علمی:** `sin` `cos` `tan` `asin` `acos` `atan` `sqrt` `cbrt` `log` `ln` `log2` `abs` `round` `floor` `ceil` `int` `sign`

- 🥧 **ثابت‌ها:** `pi` و `π`

- 🧠 **حافظه:** `M+` `M−` `MR` `MC` با نمایشگر وضعیت

- 🕘 **تاریخچه:** با لمس نمایشگر، لیست محاسبات قبلی باز می‌شود و با انتخاب هر مورد،

همان عبارت برمی‌گردد روی صفحه

### رابط کاربری

- 🎨 طراحی تاریک و مدرن، تمام‌کد (بدون فایل لایوت)

- 👁️ **پیش‌نمایش زنده:** همان لحظه که تایپ می‌کنید، نتیجه زیر عبارت نشان داده می‌شود

- 🔢 ارقام فارسی و جداکنندهٔ هزارگان در نمایشگر

- 📱 چیدمان تست‌شده روی سه اندازهٔ گوشی (۳۲۰، ۳۹۲ و ۴۳۰ dip)

- 🧩 صفحه‌کلید ۵×۴ + ردیف توابع علمی + نوار حافظه

---

## 🧪 کیفیت: ۱۳۰ تست خودکار

هیچ سورسی در بازار این را ندارد: **قبل از باز کردن B4A هم می‌توانید مطمئن شوید کد سالم است.**

| فایل تست | تعداد | چه چیزی را چک می‌کند |

|---|---|---|

| `test_calc.py` | ۸۶ | موتور محاسبه + **تست بار ۱۰٬۰۰۰ عبارت تصادفی** |

| `test_ui.py` | ۴۵ | چیدمان سه اندازهٔ گوشی + شبیه‌سازی فشردن دکمه‌ها |

شبیه‌ساز پایتون، همان الگوریتم فایل `.bas` را پیاده کرده؛ اگر تغییری در موتور دادید،

می‌توانید قبل از باز کردن B4A مطمئن شوید چیزی نشکسته است.

---

## 💻 نمونهٔ استفاده از موتور

```

Dim v As Double = CalcEngine.Evaluate("2*(3+4)^2") ' 98

If v = CalcEngine.ERR Then

ToastMessageShow("عبارت نامعتبر است", True)

End If

Log(CalcEngine.FormatResult(v)) ' «۹۸»

Log(CalcEngine.CanEvaluate("2+")) ' False

Log(CalcEngine.Backspace("123+")) ' «123»

Log(CalcEngine.AutoCloseParentheses("2*(3+4")) ' «2*(3+4)»

CalcEngine.MemoryAdd(v)

CalcEngine.MemorySub(10.5)

Log(CalcEngine.FormatResult(CalcEngine.MemoryGet))

```

---

## 🛠️ چرا این کد «حرفه‌ای» است؟ (نکات B4A)

این سورس با تجربهٔ واقعی از دام‌های B4A نوشته شده و همین‌هاست که تفاوت را می‌سازد:

1. **`Double.NaN` در B4A قابل اتکا نیست** → از مقدار نگهبان استفاده شده:

`ERR = -1.7976931348623157E308`

2. **هم‌نام نشدن با کتابخانهٔ Math:** اگر تابعی را `Power` یا `Ceil` بنامید، B4A

آن را به‌جای تابع شما صدا می‌زند و **بازگشت بی‌پایان** می‌گیرید. اینجا `PowSafe` و `CeilInt`.

3. **توان کسری با پایهٔ منفی** (`(-8)^(1/3)` = ‎-۲) پیاده شده — اکثر پیاده‌سازی‌ها خطا می‌دهند.

4. **B4A آرایهٔ دوبعدی ندارد** → صفحه‌کلید با آرایهٔ یک‌بعدی و `i / cols`.

5. **`Const` در B4A** گاهی دردسر می‌سازد → همه‌جا `Dim`.

---

## 🚀 نصب در ۳ مرحله

1. B4A را باز کنید → `File → Open Project`

2. فایل `Calculator.b4a` را از داخل بسته انتخاب کنید

3. `F5` — تمام. هیچ کتابخانهٔ بیرونی یا فایل لایوت لازم نیست.

> بسته یک **پروژهٔ واقعی B4A** است — ماژول‌های Main و CalcEngine خودکار شناسایی می‌شوند.

---

## 🎁 ایدهٔ درآمد

- منتشر با نام و آیکن خودتان در کافه‌بازار و مایکت

- افزودن مبدل واحد و تبدیل ارز (موتور آماده است، فقط دکمه اضافه کنید)

- نسخهٔ ماشین‌حساب تخصصی (قسط وام، حقوق و دستمزد) — موتور همان است

---

## 📄 مجوز

انتشار اپ ساخته‌شده با این سورس با نام خودتان **آزاد است**.

فروش مجدد سورس یا انتشار آن به‌عنوان محصول مستقل مجاز نیست.

---

💬 سؤالی دارید؟ از بخش پشتیبانی فروشگاه پیام بدهید.

دسته‌بندیسورس کد اندروید
تعداد بازدید۵۸
تعداد فروش۰
فرمت تحویلفایل دانلودی (بعد از پرداخت آنی فعال می‌شود)
پشتیبانیتیکت پشتیبانی در پنل کاربری

ویژگی‌های کلیدی

  • موتور محاسبهٔ پارسر کامل — عبارت با پرانتز و اولویت عملگرها
  • درصد هوشمند: 200+10% = 220 و 50*20% = 10
  • توابع علمی: sin cos tan asin acos atan sqrt cbrt log ln log2 abs round floor ceil int sign
  • ثابت‌های pi و π
  • توان با نمای کسری و پایهٔ منفی: (-8)^(1/3) = -2
  • حافظهٔ کامل: M+ / M− / MR / MC با نمایشگر وضعیت
  • تاریخچهٔ محاسبات با لمس نمایشگر
  • پیش‌نمایش زندهٔ نتیجه هنگام تایپ
  • بستهٔ خودکار پرانتز بازمانده
  • ارقام فارسی و جداکنندهٔ هزارگان
  • رابط کاربری کامل در کد — بدون فایل لایوت
  • چیدمان تست‌شده روی سه اندازهٔ گوشی (۳۲۰/۳۹۲/۴۳۰ dip)
  • ۱۳۰ تست خودکار شامل تست بار ۱۰٬۰۰۰ عبارت
  • شبیه‌ساز پایتون موتور برای تست بدون B4A
  • بدون Double.NaN و بدون هم‌نامی با کتابخانهٔ Math (دام‌های رایج B4A)

هنوز نظری ثبت نشده است. اولین نفر باشید!

برای ثبت نظر وارد شوید. (ثبت نظر پس از خرید فعال می‌شود)

B4A — کد نمونه رایگان این تکه‌کد را می‌توانید مستقیم در پروژه بیسیک۴اندروید استفاده کنید
' ═══ نمونه‌ای از سورس (بخشی از موتور محاسبه) ═══
'  گرامر:  expression → term → factor → unary → primary
'  هر مرحله فقط کار خودش را می‌کند؛ همین راز درستی اولویت عملگرهاست.

' جمع و تفریق (+ و درصد)
Private Sub ParseExpression(s As String, pos As Int) As Double
    Dim left As Double = ParseTerm(s, pos)
    Do While pos < s.Length
        Dim c As String = s.SubString2(pos, pos + 1)
        If c = "+" Or c = "-" Then
            pos = pos + 1
            Dim right As Double = ParseTerm(s, pos)
            ' درصد:  200+10%  یعنی ۱۰٪ خودِ ۲۰۰
            If pctFlag Then
                Dim pct As Double = left * pctRaw / 100
                If c = "+" Then
                    left = left + pct
                Else
                    left = left - pct
                End If
                pctFlag = False
            Else
                If c = "+" Then
                    left = left + right
                Else
                    left = left - right
                End If
            End If
        Else
            Exit
        End If
    Loop
    Return left
End Sub

' مقدار نگهبان به‌جای Double.NaN  (در B4A قابل اتکا نیست)
Public ERR As Double = -1.7976931348623157E308

' ⚠ تابع هم‌نام کتابخانهٔ Math نسازید!
' Sub Power(...) → B4A تابع کتابخانه را صدا می‌زند → بازگشت بی‌پایان
Private Sub PowSafe(base As Double, exp As Double) As Double
    ' ...
End Sub

⚠ نسخهٔ کامل موتور ۵۸۸ خط دارد با توضیحات فارسی.
تخصصی بیسیک۴اندرویدسورس‌کد آمادهآموزش گام‌به‌گامکتابخانه‌های کاربردیتحویل آنی بعد از پرداختپشتیبانی واقعی ۲۴/۷بروزرسانی رایگان+۱۰۲۷ محصول فعال