PDA

View Full Version : برنامه ماشین حساب مهندسی با سی شارپ



abn.najaf
یک شنبه 08 تیر 1393, 01:15 صبح
http://www.uplooder.net/img/image/21/5eaa5adb300381228a2030a7f1b513e7/Untitled.jpg



با سلام خدمت شما دوستان
این ماشین که توسط بنده طراحی شده است ابتدا یک رشته از عملوند ها و عملگر ها را دریافت می کند (2+3*4) سپس محاسبه می کند مانند ماشین حساب مهندسی...
دوستان این برنامه صرفا جهت آموزش و یادگیری بنده بوده است اگر ایرادی دارد به بزرگی خودتون ببخشید....


uproject.mihanblog.com (http://uproject.mihanblog.com/post/44)

shahryari
یک شنبه 08 تیر 1393, 08:30 صبح
با تشکر از شما که این همه زحمت کشیدید لااقل دکمه ها رو مرتب میچیدید دوست گرامی

elec60
یک شنبه 08 تیر 1393, 08:57 صبح
http://www.uplooder.net/img/image/21/5eaa5adb300381228a2030a7f1b513e7/Untitled.jpg



با سلام خدمت شما دوستان
این ماشین که توسط بنده طراحی شده است ابتدا یک رشته از عملوند ها و عملگر ها را دریافت می کند (2+3*4) سپس محاسبه می کند مانند ماشین حساب مهندسی...



uproject.mihanblog.com (http://uproject.mihanblog.com/post/44)


البته بايد پرانتز رو هم در نظر مي گرفتيد تا كامل بشه. و بهتره از الگوريتم RPN استفاده كنين. توابع مثلثاتي و Log هم بايد اضافه بشه. در واقع بايد Function Parser بنويسيد كه كار نسبتا پيچيده ايه.

abn.najaf
یک شنبه 08 تیر 1393, 16:18 عصر
البته بايد پرانتز رو هم در نظر مي گرفتيد تا كامل بشه. و بهتره از الگوريتم RPN استفاده كنين. توابع مثلثاتي و Log هم بايد اضافه بشه. در واقع بايد Function Parser بنويسيد كه كار نسبتا پيچيده ايه.
خواستم پرانتز هم بزارم براش حوصلش رو نداشتم دنبالش برم اخه بلد نبودم باید می رفتم دنبالش :قهقهه::قهقهه:
داداش اگر شما ی زحمت بکشی بزاری تا منم یاد بگیرم ممنون میم:بوس::متفکر:

abn.najaf
یک شنبه 08 تیر 1393, 16:21 عصر
البته بايد پرانتز رو هم در نظر مي گرفتيد تا كامل بشه. و بهتره از الگوريتم RPN استفاده كنين. توابع مثلثاتي و Log هم بايد اضافه بشه. در واقع بايد Function Parser بنويسيد كه كار نسبتا پيچيده ايه.
داداش اگر منظورتون الگوریتم spn =shortest process next فکر نکنم جواب بده اخه اولویت عملگر ها توش هست....:متفکر:

elec60
یک شنبه 08 تیر 1393, 19:24 عصر
خواستم پرانتز هم بزارم براش حوصلش رو نداشتم دنبالش برم اخه بلد نبودم باید می رفتم دنبالش :قهقهه::قهقهه:
داداش اگر شما ی زحمت بکشی بزاری تا منم یاد بگیرم ممنون میم:بوس::متفکر:

منظورم RPN بود: Reverse Polish Notation

elec60
یک شنبه 08 تیر 1393, 19:28 عصر
خواستم پرانتز هم بزارم براش حوصلش رو نداشتم دنبالش برم اخه بلد نبودم باید می رفتم دنبالش :قهقهه::قهقهه:
داداش اگر شما ی زحمت بکشی بزاری تا منم یاد بگیرم ممنون میم:بوس::متفکر:

http://barnamenevis.org/showthread.php?457987-ماشين-حساب-با-قابليت-تبديل-عدد-به-حروف

برنامه رو که اجرا کنی ابتدا دو تا تکست باکس نمایش داده میشه ولی اگه علامت فلش بالا سمت راست فرم را کلیک کنی ماشین حساب نمایش داده میشه. کدها خیلی پیچیده هستن و باید کلی روش کار کنی:لبخند:

abn.najaf
دوشنبه 09 تیر 1393, 01:03 صبح
http://barnamenevis.org/showthread.php?457987-ماشين-حساب-با-قابليت-تبديل-عدد-به-حروف

برنامه رو که اجرا کنی ابتدا دو تا تکست باکس نمایش داده میشه ولی اگه علامت فلش بالا سمت راست فرم را کلیک کنی ماشین حساب نمایش داده میشه. کدها خیلی پیچیده هستن و باید کلی روش کار کنی:لبخند:
داداش دمت گرم خیلی کارت درسته
من دنبال راه حلی برای نشانه گذاری لهستانی بودم اما پیدا نکردم خودمم نشد که بنویسم...
میتونید یک راهنمایی از طریقه کار با نشانه گذاری لهستانی بگید که چجوری باید نوشتش....

jpjpjp
سه شنبه 10 تیر 1393, 14:27 عصر
اسمش هم درست كن
Calculator

elec60
سه شنبه 10 تیر 1393, 22:08 عصر
داداش دمت گرم خیلی کارت درسته
من دنبال راه حلی برای نشانه گذاری لهستانی بودم اما پیدا نکردم خودمم نشد که بنویسم...
میتونید یک راهنمایی از طریقه کار با نشانه گذاری لهستانی بگید که چجوری باید نوشتش....

http://en.wikipedia.org/wiki/Reverse_Polish_notation

abn.najaf
شنبه 14 تیر 1393, 02:38 صبح
http://en.wikipedia.org/wiki/Reverse_Polish_notation
داداش من توی تبدیلش به پسوندی مشکل داشتم با وجود پرانتز کار سخت تر میشه که من هر چه فکر کردم به راهی براش نرسیدم
ممنون میشم داداش راهنمایم کنید

elec60
شنبه 14 تیر 1393, 11:19 صبح
داداش من توی تبدیلش به پسوندی مشکل داشتم با وجود پرانتز کار سخت تر میشه که من هر چه فکر کردم به راهی براش نرسیدم
ممنون میشم داداش راهنمایم کنید

سورس خودمو كه گذاشتم برات.

abn.najaf
شنبه 14 تیر 1393, 16:02 عصر
سورس خودمو كه گذاشتم برات.
داداش ماشالله این قدر توش حرفای قلمبه سلمبه زدین من که هیچ کدومش رو متوجه نمیشم.خیلی بررسیش کردم اما به نتیجه ای نرسیدم....
یک الگوریتم از کار رو به صورت تیتر وار بگی من گرفتم...

elec60
یک شنبه 15 تیر 1393, 12:02 عصر
داداش ماشالله این قدر توش حرفای قلمبه سلمبه زدین من که هیچ کدومش رو متوجه نمیشم.خیلی بررسیش کردم اما به نتیجه ای نرسیدم....
یک الگوریتم از کار رو به صورت تیتر وار بگی من گرفتم...


الگوریتم Shunting Yard
یکی از چالش های دنیای نرم افزار، تجزیه کردن صحیح عبارات دارای مفهوم است. اولین قدم در اجرای یک عبارت با مفهوم، تجزیه آن به عوامل معنی دار و سپس ترتیب دادن به آن است.
تحلیل عبارات ریاضی به دلیل کاربرد فراوان آن، همواره ذهن برخی را به خود مشغول داشته است. در این میان ادگار دایجسترا الگوریتمی به نام محوطه تغییر ریل طراحی نموده که به دلیل شباهت آن با تغییر مسیر ریل راه آهن بدین نام نامگذاری شده است.
عبارات ریاضی قابل فهم برای ماشین تفاوت اندکی با عبارات قابل فهم برای انسان دارند. به طور دقیق تر، عباراتی که برای انسان قابل فهم هستند به عنوان میانوندی (infix) شناخته می شوند، ولی ماشین توانایی پردازش عبارات پسوندی (postfix) و یا پیشوندی (prefix) را داراست. هدف الگوریتم این مقال، تبدیل یک عبارت میانوندی به صورت پسوندی آن یا نشان گذاری لهستانی معکوس است:
Infix: (3+x)/(2+(4*1))
Postfix (RPN): 3x+241*+/
Prefix: /+*142+x3
پس از در دست داشتن صورت RPN یک عبارت، محاسبه مقدار آن با استفاده از یک پشته بسیار آسان است. کافی است از بالای پشته به ازای هر عملگر دوتایی، دو عدد برداشته و پس از انجام عملگر بر روی آنها، نتیجه را درون پشته وارد نمایید. در زیر الگوریتم لازم برای تبدیل عبارت میانوندی به پسوندی آمده است:
الگوریتم:
1. تا موقعی که کلمه ای برای خواندن وجود دارد:

1.1. کلمه را از ورودی بخوان

1.2. اگر کلمه یک عدد است، آنرا در پشته خروجی وارد کن.

1.3. اگر کلمه یک عملگر است، آنرا در پشته عملگرها وارد کن.

1.4. اگر کلمه یک عملگر بنام O1 است، آنگاه:

1.4.1. تا وقتی که عملگری بنام O2 در بالای پشته عملگرها قرار دارد و

1.4.1.1. O1 شرکت پذیر از چپ است و اولویت آن کمتر یا برابر O2 است ، یا

1.4.1.2. O1 از راست شرکت پذیر است و اولویت آن از O2 کمتر است،

1.4.2. O2 را از پشته عملگرها خارج کرده و به پشته خروجی وارد کن.

1.4.3. O1 را وارد پشته عملگرها کن.

1.5. اگر کلمه پرانتز چپ است، آنرا به پشته عملگرها وارد کن.

1.6. اگر کلمه پرانتز راست است،

1.6.1. تا وقتی که بالاترین کلمه پشته عملگر پرانتز چپ باشد، همه را خارج و به پشته خروجی وارد کن.

1.6.2. پرانتز چپ را خارج کن، ولی جایی وارد نکن. اگر بالاترین عضو پشته عملگرها یک عملگر است، آنرا خارج کن و به پشته خروجی وارد کن.

2. مابقی کلمه های پشته عملگرها را خارج کن و وارد پشته خروجی کن

3. پایان الگوریتم





6
5
4
3
2
1


6/(x+3)


6
X+3


X
3

6
X
3
4
2
X
3
1
4
2
X
3


حاصل
/
+

+
*



پس از طی مراحل فوق عبارت پسوندی محاسبه می شود. حال با در دست داشتن این عبارت می توان با طی مراحل روبرو حاصل عبارت را بدست آورد:
در زیر صورت ساده شده الگوریتم محوطه تغییر ریل را به زبان C++‎‎‎‎‎ ارائه می کنیم:


int ShuntingYard ( char * statement, STACK<char> OperatorStack, STACK<char> OutputStack)
{
char token,token1;
for ( i=0 ; s[i] ; ++i )
{
token = s[i] ; ( انتخاب کلمه جاری از عبارت )
if ( isdigit(token) || isletter(token) ) ( در صورت عدد بودن یا متغیر بودن در پشته خروجی وارد کن )
OutputStack.push (token);
else ( کلمه جاری پرانتز یا عملگر است )
{
if ( token==')' )
{
while ( OperatorStack.peek() !='(' ) (اگر پرانتز راست بود تا وقتی که به پرانتز چپ برسی... )
{
if ( OperatorStack.count()==0 ) return -1;
OutputStack.push ( OperatorStack.pop() );
}
OperatorStack.pop();
token1= OperatorStack.peek();
if ( isoperator( token 1) ) ( اگر آخرین کلمه عملگر بود آنرا نیز خارج و در خروجی وارد کن )
OutputStack.push( OperatorStack.pop() );
}
else ( کلمه جاری یا پرانتز چپ یا عملگر است )
{
if ( isoperator( token ) )
{
while ( OperatorStack.count()!=0 &&
precedence(c)<precedence(OperatorStack.peek()))
OutputStack.push(OperatorStack.pop());
OperatorStack.push( token );
}
else
if ( token=='(' )
OperatorStack.push( token );
}
}
return 1;
}
لازم به ذکر است که در این مثال، کلمات ما تک حرفی در نظر گرفته شده اند، درنتیجه نمی توان محاسباتی بزرگتر از 9 با استفاده از اعداد داشت. برای حل این مشکل، قابلیت استفاده از متغیر هایی با نام حروف (A-Z) در برنامه گنجانده شده که پس از مقدار دهی به آنها می توان هر عبارت دلخواهی را تولید و محاسبه کرد.

elec60
یک شنبه 15 تیر 1393, 12:12 عصر
مقاله بالا رو يه بنده خدايي به نام عباس نادري نوشته.

abn.najaf
یک شنبه 15 تیر 1393, 14:19 عصر
تشکر داداش مفید بود برام

abn.najaf
سه شنبه 17 تیر 1393, 00:35 صبح
http://barnamenevis.org/showthread.php?457987-ماشين-حساب-با-قابليت-تبديل-عدد-به-حروف

برنامه رو که اجرا کنی ابتدا دو تا تکست باکس نمایش داده میشه ولی اگه علامت فلش بالا سمت راست فرم را کلیک کنی ماشین حساب نمایش داده میشه. کدها خیلی پیچیده هستن و باید کلی روش کار کنی:لبخند:
سلام داداش
اولویت عمکر گر های sin , cos , tan , فاکتوریل و جذر چجوریه داداش

hiiva1
سه شنبه 17 تیر 1393, 08:14 صبح
سلام داداش
اولویت عمکر گر های sin , cos , tan , فاکتوریل و جذر چجوریه داداش



اینا اصلا عملگر نیستن. توابعن! پرانتز فک کنم حلش کنه!

abn.najaf
سه شنبه 17 تیر 1393, 10:33 صبح
اینا اصلا عملگر نیستن. توابعن! پرانتز فک کنم حلش کنه!
الان شما توی برنامه ای که به من دادین اولویتشون رو نسبت به عملگر ها چجوری گرفتین
مثلا رشته مقابل پسوندیش چی می شه
3+*6^sin(25)+22*5

snipercia
جمعه 10 مرداد 1393, 01:03 صبح
سلام میخواستم بدون استفاده از توابع x رو به توان y برسونم با استفاده از حلقه for یه دکمه تعریف کنم مثل x^y لگاریتم رو موندم چه جوری بدست بیارم.
ممنون میشم سورس کد رو بزارید. خود فایل رو هم براتون میزارم .با تشکر

abn.najaf
سه شنبه 14 مرداد 1393, 17:52 عصر
سلام میخواستم بدون استفاده از توابع x رو به توان y برسونم با استفاده از حلقه for یه دکمه تعریف کنم مثل x^y لگاریتم رو موندم چه جوری بدست بیارم.
ممنون میشم سورس کد رو بزارید. خود فایل رو هم براتون میزارم .با تشکر


http://barnamenevis.org/showthread.php?459902-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AD%D8%B3%D8%A7%D8%A8-%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D9%88%D8%B1%DA%98%D9%86-2&p=2061528#post2061528


توی این پروژه که لینکش رو برات گذاشتم نوشتم تابع توان رو داداش