سورس کد ماشین‌حساب علمی اندروید 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 بسازید (مثلاً Package: `ir.yourname.calculator`)

2. `Project → Add Existing Modules`:

`Modules/CalcEngine.bas` و `Main.bas`

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

---

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

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

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

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

---

## 📄 مجوز

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

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

---

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

دسته‌بندیسورس کد اندروید
تاریخ انتشار۲۲ شهریور ۱۴۰۵ - ۰۱:۵۳
تعداد بازدید۳
تعداد فروش۰
فرمت تحویلفایل دانلودی (بعد از پرداخت آنی فعال می‌شود)
پشتیبانیتیکت پشتیبانی در پنل کاربری

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

  • موتور محاسبهٔ پارسر کامل — عبارت با پرانتز و اولویت عملگرها
  • درصد هوشمند: 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

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