جوتی
پسر/دختر بابالنگدراز
My Favorites:
bbgoal
lamp
far-near
ashoob
miladkdz
rohmamiya
acetaminophen
debug
smartdevice
farstec
khak
aaab
nochagh
persiangirl
parsmedia
w3schoolsir
azemat
sargardoon
mahoordad
techopedia

My Programs:
BlogClient
MinsweeperRobot
Calculator
CalcWebSrvc
2unicode
HuffmanCode
FileValidator
ConvexHall2D
FSProject
IISLog

Options:
No CSS
CSS Layout
ماشین حساب
ماشین حساب
قبل از اینکه بروم دانشگاه یکی از هدف های بزرگم این بود که ماشین حسابی بنویسم که فرمول های ریاضی را محاسبه کند. و آخرسر وقتی دانشگاه رفتم این کار را کردم.
میدونید که چه جور ماشین حسابی رو میگم ؟ یه چیزی که این عبارت رو محاسبه کنه :
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 ها استفاده کرد. موفق و پیروز باشید
برای گرفتن برنامه همراه کد هر سه بخش آن اینجا کلیک کنید.
جوتی
حاشیه : اگه جا کم بیارم پاکش میکنم.

سیصد و شصت و پنج روز پیش :

آرشیو ماهیانه:
مهر 81
آبان 81
آذر 81
دی 81
بهمن 81
اسفند 81
فروردین 82
اردیبهشت 82
خرداد 82
تیر 82
امرداد 82
شهریور 82
مهر 82
آبان 82
آذر 82
دی 82
بهمن 82
اسفند 82
فروردین 83
اردیبهشت 83
خرداد 83
تیر 83
امرداد 83
شهریور 83
مهر 83
آبان 83
آذر 83
دی 83
بهمن 83
اسفند 83
فروردین 84
اردیبهشت 84
خرداد 84
تیر 84
امرداد 84
شهریور 84
مهر 84
آبان 84
آذر 84
دی 84
بهمن 84
اسفند 84
فروردین 85
اردیبهشت 85
خرداد 85
تیر 85
امرداد 85
شهریور 85
مهر 85
آبان 85
آذر 85
دی 85
بهمن 85
اسفند 85
فروردین 86
اردیبهشت 86
خرداد 86
تیر 86
امرداد 86
شهریور 86
مهر 86
آبان 86
آذر 86
دی 86
بهمن 86
اسفند 86
فروردین 87
اردیبهشت 87
خرداد 87
تیر 87
امرداد 87
شهریور 87
مهر 87
آبان 87
آذر 87
دی 87
بهمن 87
اسفند 87
فروردین 88
اردیبهشت 88
خرداد 88
تیر 88
امرداد 88
شهریور 88
مهر 88
آبان 88
آذر 88
دی 88
بهمن 88
اسفند 88
فروردین 89
اردیبهشت 89
خرداد 89
تیر 89
امرداد 89
شهریور 89

آرشیو سالیانه:
سال 1381
سال 1382
سال 1383
سال 1384
سال 1385
سال 1386
سال 1387
سال 1388
سال 1389

قصه‌های من:

گرگ قسمت اول
گرگ قسمت دوم
موش کور
باغبان
جزیره
آتشفشان
کرم ابریشم
توپ
قصه‌های کامپیوتری

کتاب VB.NET مقدماتی
جزوه ویژوال بیسیک
رمزگذاری-رمزگشایی
تمام حقوق این سایت متعلق به امیر احسانی است.
شما حق دارید از مطالب این سایت هرطور که مایل هستید استفاده کنید بشرط اینکه برای آنها هیچ گونه وجهی دریافت نکنید. اگر منبع را هم ذکر کنید ممنون میشم.
jooti [at] ehsani [dot] org