# 🧮 سورس کد ماشینحساب علمی — 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)
هنوز نظری ثبت نشده است. اولین نفر باشید!
برای ثبت نظر وارد شوید. (ثبت نظر پس از خرید فعال میشود)
' ═══ نمونهای از سورس (بخشی از موتور محاسبه) ═══
' گرامر: 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
⚠ نسخهٔ کامل موتور ۵۸۸ خط دارد با توضیحات فارسی.