ماشین حساب
قبل از اینکه بروم دانشگاه یکی از هدف های بزرگم این بود که ماشین حسابی بنویسم که فرمول های ریاضی را محاسبه کند. و آخرسر وقتی دانشگاه رفتم این کار را کردم.
میدونید که چه جور ماشین حسابی رو میگم ؟ یه چیزی که این عبارت رو محاسبه کنه :
4+12*569+4^10 و حتی از این بهتر اینکه بتوان برای آن متغیر تعریف کرد.
این برنامه از سه بخش تشکیل شده
یک فایل اجرایی که فقط رابط کاربر است و کارهای محاسباتی را انجام نمیدهد و با دلفی نوشته شده. دو فایل dll که نام یکی از آنها stack و دیگری Infix است.
stack.dllهمانطور که از اسمش مشخص است این فایل یک پشته درست میکند. با ویژوال بیسیک 6 نوشته شده و در پیاده سازی آن از آرایه استفاده شده است. البته با استفاده از redim و این جور چیزا اندازه آن دینامیک است. اگر با C مینوشتم حتما از لیست پیوندی link list برای درست کردن پشته استفاده میکردم. سورس این فایل فقط 58 خط است! (برای یک پشته زیادم هست!)
کمی هم توضیح درباره پشته :
پشته ساختماد داده ای است که بیشتر از هر چیز شبیه سینی هایی است که روی هم گذاشته شده باشند. به این معنی که اولین داده ای که وارد آن میشود آخرین داده ای است که خارج میشود First In Last Out(FIFO) . دو تابع اصلی این ساختمان داده push و pop هستند. تابع push یک عنصر به بالای پشته اضافه میکند و pop یک عنصر از بالای پشته حذف میکند و مقدار آن را برمیگرداند.
infix.dllاین فایل وظیفه اصلی را انجام میدهد. تبدیل کردن عبارت infix به postfix و سپس محاسبه کردن عبارت postfix و برگرداندن نتیجه.
برای استفاده از این dll باید یک شی از کلاس CInfix ایجاد کنید و عبارت ریاضی خودتان را به پروپرتی Infix بدهید. اگر متغیری هم دارید مقدار آنها را با فرمت value;"=varname" به پروپرتی VariableList بدهید. مانند زیر:
VariableList="y=10;x=3;varvarvari=3.23"
حالا فقط کافی است تابع claculate را صدا کنید تا مقدار محاسبه شده را به شما برگرداند.
اگر خطایی اتفاق بیفتند شماره آن خطا را میتوانید با GetLastError بگیرید. لیست شماره خطاها در زیر آمده :
NO_ERROR = 0
PARANTEZBAZ_REQUIRED = 1
PARANTEZBASTEH_REQUIRED = 2
VARIABLE_NOTDEFINE = 4
OVERFLOW = 6
WRONG_VARIABLE_LIST = 8
VARIABLE_VALUE_ISWRONG = 16
DIVID_BY_ZERO = 32
OPERATOR_NOT_DEFINED = 64
INVALID_CALL_OF_LOG = 65
INVALID_STATMENT = 99
UNKNOWN_ERROR = 200
اما روش کار این کلاس :
ابتدا عبارت infix (عبارتی که در آن عملگر بین عملوندها است) به postfix (عبارتی که در آن عملگر بعد از عملوندها میآید) تبدیل میشود.
برای مثال عبارت x+y تبدیل به xy+ میشود و عبارت (x+y)*z تبدیل به عبارت xy+z* میشود. سپس عبارت postfix ارزیابی میشود. که شبه کد آن در زیر آمده است.
for i=0 to len(infix)
if infix[i] is operand then
stack.push(infix[i])
else
x=stack.pop
y=stack.pop
stack.push(y operator x)
end if
next
return stack.pop
این کلاس از عملگرهای منها، منفی، ضرب، جمع، توان(^)، پرانتز ، ln، sin، cos، tan، atn و فاکتوریل(!) پشتیبانی میکند. هزینه اضافه کردن یک عملگر جدید زیاد نیست و با کمی دقت میتوانید یک عملگر دیگر اضافه کنید.
البته به دلیل یکی بودن کاراکتر منها و منفی تقریبا با تقلب کار میکند. به این معنی که در ابتدا تمام منفی ها تشخیص داده میشود و به یک کاراکتر دیگر(`) تبدیل میشود.
اجرای فایل exe اجرا کردن این فایل کمی دردسر دارد. اول باید دو dll را در ویندوز خودتان رجیستر کنید:
regsvr32 dllPathName
برای مثال :
regsvr32 d:\infix.dll
امیدوارم که از این برنامه خوشتان بیاید و کد آن را بهتر کنید و برای من بفرستید. بیخودی که opensource نیست.
استفاده کردن از dll ها کاملا آزاد است. فکر میکنم خیلی جاها میشود از این dll ها استفاده کرد. موفق و پیروز باشید
برای گرفتن برنامه همراه کد هر سه بخش آن
اینجا کلیک کنید.
جوتی
حاشیه : اگه جا کم بیارم پاکش میکنم.