آموزش سی‌شارپ C# – بخش ۱۳

آموزش سی‌شارپ C# – بخش ۱۳
  • 1391/11/14
  • Jeff Mosawy
  • 24
  • مقدمه

در دو بخش قبلی، شما مقدمات لازم را جهت نوشتن یک ماشین‌حساب ساده (اما کامل) با چهار عمل اصلی ریاضی فراگرفتید. ممکن است خیلی از عزیزان خواننده، خودشان این پروژه را با موفقیت انجام داده‌اند؛ در حالی که ممکن است بعضی‌ها بدلیل مشکلاتی که در بین راه با آن‌ها برخورد کرده‌اند، نتوانسته‌اند پروژه را به‌صورت کامل آماده کنند.

  • طراحی ظاهری و شروع

اولین قدم در انجام پروژه ماشین‌حساب، طراحی ظاهری آن به‌شکلی که به سلیقه شما سازگار باشد، خواهد بود. من در اینجا به‌صورت یک ظاهر بسیار بسیار ساده آموزش خودم را شروع می‌کنم.

نسخه‌ی شماره ۱ نرم‌افزار ماشین‌حساب شما، به‌شکل زیر خواهد بود:

1-Calculator_Add_Form

همانطور که در تصویر فوق مشاهده می‌کنید، شما یک Text Boxجهت نمایش اعداد و ارقام (هنگام نوشتن و دریافت نتیجه)، button هایی برای نمایش اعداد از ۰ تا ۹، یک ممیز (point) که در اعداد انگلیسی به‌صورت نقطه می‌باشد و دو button برای جمع و مساوی را اضافه خواهید کرد.

خوب، اولین کار باید پروژه‌ی خود را شروع کنید. از منوی File، وارد بخش New Project شوید و پروژه‌ی خود را به‌صورت Windows Application بسازید. برای Form ایجاد شده، Property های زیر را تنظیم کنید:

Size: 440, 487

Text: Calculator

برای اینکه به فرم خود کمی رنگ اضافه کرده باشیم و آن را از حالت پیشفرض خارج کنیم، شما باید Property ای با نام BackColor را تغییر دهید. به تصویر زیر دقت کنید:

2-Properties_BackColor

من رنگ مورد نظر خودم را انتخاب کرده‌ام؛ شما می‌توانید رنگ دلخواه و سازگار با سلیقه خودتان را انتخاب کنید، پس راحت باشید!

اکنون، یک Text Box اضافه کنید و تنظیمات زیر را بر روی آن اعمال کنید:

Name: txtDisplay

Location: 66, 52

Size: 200, 26

TextAlign: Right

الان وقت اضافه کردن button ها که اعداد ۰ تا ۹ را برای شما نمایش دهند. شما برای اینکار به ۱۰ button نیاز خواهید داشت. اولین button را اضافه کنید و تنظیمات زیر را برای button مشخص شده اعمال کنید:

Name: btnZero

Font: Microsoft Sans Serif, Bold, 12

Location: 49, 40

Text: 0

این button برای نمایش عدد ۰ بود. Button بعدی را جهت نمایش عدد ۱ اضافه کنید و تنظیمات زیر را بر روی آن اعمال کنید:

Name: btnOne

Font: Micorosft Sans Serif, Bold, 12

Location: 49, 40

Text: 1

یکی از راه‌های آسان برای اضافه کردن چندین button، استفاده از Copy/Past می‌باشد. برای اینکار، button شماره ۱ را انتخاب کنید و بر روی آن Right Click کنید و Copy را انتخاب کنید. الان نشانگر موس را روی یک جای خالی از فرم خود قرار دهید و مجدداً Right Click کنید و Past را برگزینید. شما فقط کافیست که دو مشخصه را تغییر دهید؛ یکی Name را به btnTwo تغییر دهید و دیگری مشخصه Text آن را به ۲ تغییر دهید.

برای Button ممیز نیز مشخصه Name آن را به btnPoint تغییر دهید و مشخصه Text را به یک نقطه تغییر دهید.

فقط ۳ button دیگر مانده؛ این سه‌تا را هم اضافه کنید و به ترتیب Property های زیر را تغییر دهید:

Name: btnPlus

Font: Microsoft Sans Serif, Bold, 12

Location: 324, 159

Size: 49, 40

Text: +

Name: btnEquals

Font: Microsoft Sans Serif, Bold, 12

Location: 324, 230

Size: 49, 40

Text: =

Name: btnClear

Font: Microsoft Sans Serif, Bold, 12

Location: 324, 305

Size: 49, 40

Text: Clear

تا اینجا، ما کار طراحی ظاهری نرم‌افزار خودمان را تمام کرده‌ایم. پروژه‌ی خود را ذخیره کنید (قبل از اینکه برق بره!) تا کدنویسی آن را شروع کنیم.

  • شروع کدنویسی ماشین حساب

قبل از اینکه کار خودمان را شروع کنیم، اجازه دهید که یک نقشه کلی از پروژه‌ی خودمان داشته باشیم و مراحل کار را یک‌به‌یک با هم‌دیگر بررسی کنیم.

  1. شخص بر روی شماره‌ها کلیک می‌کند تا اولین رقم مورد نظر خود برای انجام عمل جمع را مشخص سازد.
  2. اولین رقمی که کاربر ایجاد می‌کند، باید در Text Box نمایش داده شود.
  3. بر روی کلید + کلیک می‌کند تا به سی‌شارپ این را بگوید که می‌خواهد عمل جمع را انجام دهد.
  4. بعد از کلیک بر روی +، باید Text Box پاک شود تا برای رقم دوم آماده شود.
  5. دوباره با استفاده از کلیدهای ۰ تا ۹، رقم دوم خود را مشخص می‌کند.
  6. بر روی کلید مساوی کلیک می‌کند تا نتیجه در Text Box ظاهر شود.

خوب با اولین مرحله شروع می‌کنیم.

بر روی button شماره ۱ دابل-کلیک کنید تا اینکه وارد کدنویسی شوید. ما در این مرحله، می‌خواهیم برای تمامی buttonها این‌کار را انجام دهید که وقتی یکی از button های اعداد کلیک بخورند، عدد آن‌ها در Text Box نمایش داده شود. پس برای button با نام btnOne، کد زیر را اضافه می‌کنیم:

txtDisplay.Text = btnOne.Text;

این کد می‌گوید: «مقدار Text مربوط به Text Box با نام txtDisplay را به مقدار Text برای button ای با نام btnOne (که ۱ است) تغییر بده.» به یاد داشته باشید که هرچیزی که در سمت راست مساوی در کدنویسی است، دقیقاً برابر مقداری خواهد بود که در سمت چپ آن خواهد بود.

برنامه‌ی خود را اجرا کنید؛ بر روی شماره ۱ کلیک کنید. خواهید دید که شماره ۱ در Text Box شما نمایش داده خواهد شد. چند بار دیگر بر روی شماره ۱ کلیک کنید؛ متوجه اشکال برنامه شدید؟ شما احتمالاً فکر می‌کردید که مثلاً اگر دوبار button شماره ۱ را کلیک کنید، باید عدد ۱۱ را نمایش دهد. چرا؟

دلیل ایراد نرم‌افزار این است که شما به سی‌شارپ نگفته بودید که مقداری که قبلاً در Text Box را نگه‌دار و مقدار جدید را در کنارش قرار بده! پس دوباره با دابل-کلیک کردن بر روی btnOne، وارد بخش کد شوید و کد قبلی خود را به کد زیر تغییر دهید:

txtDisplay.Text = txtDisplay.Text + btnOne.Text;

در این کد، علامت جمع نمایانگر عمل جمع نیست؛ بلکه چونکه هر دو متغیر از نوع String هستند، پس این دو را در کنار هم می‌آورد و به اصطلاح، یکدیگر را به هم الصاق می‌کند.

یک‌بار دیگر برنامه خود را اجرا کنید و عملیات فوق را امتحان کنید، خواهید دید که این‌بار نمایش عدد‌های ۱، ۱۱، ۱۱۱، و … بدون مشکل خواهد بود.

الان به برنامه خود بازگردید و اینبار بر روی btnTwo دابل-کلیک کنید و کد زیر را اضافه کنید:

txtDisplay.Text = txtDisplay.Text + btnTwo.Text;

تنها تفاوتی که کد بالا با کد قبلی دارد این هست که نام button شما از btnOne به btnTwo تغییر پیدا کرد. تمامی این‌کارها را برای تمامی اعداد (از ۲ تا ۹) انجام دهید. در نهایت، باید کد‌های شما به شکل زیر باشد:

3-buttonCode_Numbers

یک‌بار دیگر جهت اطمینان، برنامه خود را اجرا کنید و از صحت کارکرد تمامی button ها مطمئن شوید. پس از اطمینان حاصل کردن از تمامی button ها به محیط برنامه خود بازگردید و بر روی button مربوط به Clear دابل-کلیک کنید و کد زیر را اضافه کنید:

txtDisplay.Clear();

بعد از نام Text Box، شما یک نقطه قرار دادید و کلمه Clear را نوشتید و در مقابل آن دو پرانتز قرار دادید؛ این بدین معنی‌است که Clear یک method است که مقدار داخل txtDisplay را خالی می‌کند.

مجدداً برنامه خود را اجرا کنید و پس از وارد کردن چندین عدد، button پاک‌کردن را امتحان کنید و از صحت کارکرد آن مطمئن شوید.

الان که کار نمایش اعداد ما به پایان رسید، وقت آن است که عدد وارد شده را در یک متغیر ذخیره کنیم؛ پس از آنکه کلید مساوی کلیک خورد، عمل جمع انجام شود. (توجه کنید که عمل جمع با کلیک کردن بر روی button مربوط به مساوی باید انجام شود؛ نه خود کلید جمع!)

Button جمع، باید عدد وارد شده را از Text Box دریافت کند و چونکه این مقدار بصورت String دریافت می‌شود، باید آن را به عدد تبدیل کرد. سپس این عدد را در یک متغیر عددی ذخیره می‌کنیم. در نهایت باید در انتهای کد خود، یک خط کد دیگری اضافه کنیم که مقدار داخل Text Box را خالی کند تا آماده دریافت رقم بعدی باشد.

اولین رقم وارد شده می‌بایست که در یک متغیر ذخیره شود. ما برای اینکار از متغیر نوع Double استفاده خواهیم کرد تا ما بتوانیم مقدار بزرگی را از اعداد پشتیبانی کنیم. (همچنان بتوانیم از ارقام دارای ممیز نیز پشتیبانی کنیم.)

از آنجایی که تمامی button های داخل فرم می‌بایست که متغیر را ببینند، می‌بایست که این متغیر خارج از هرگونه کدی مربوط به button تعریف شود. یعنی تعریف این متغیر در چنین جایی کاملاً اشتباه است:

private void btnOne_Click(object sender, EventArgs e)

{

            Double total1 = 0;

}

اگر شما چنین کاری را بکنید، تنها btnOne خواهد توانست که متغیر total1 را بشناسد؛ ولی دیگر اشیاء دسترسی به total1 نخواهند داشت و برای آن‌ها تعریف نشده خواهد ماند. روش درست تعریف متغیری که می‌بایست اصطلاحاً به‌صورت Global تعریف شود، به‌شکل زیر است:

double total1 = 0;

private void btnPlus_Click(object sender, EventArgs e)

{

}

کدی که باید برای خود btnPlus تعریف شود، به شکل زیر است: (کدهای آبی رنگ)

double total1 = 0;

private void btnPlus_Click(object sender, EventArgs e)

{

                        total1 = total1 + double.Parse(txtDisplay.Text);

                        txtDisplay.Clear();

}

تنها کاری که در کد‌های بالا انجام می‌دهیم این است که مقدار Text را از txtDisplay میگیرم، آن را به double تغییر می‌دهیم و در نهایت در متغیر total1 ذخیره می‌کنیم. دقت کنیم که ما مجدداً این خط کد را نوشتیم:

total1 = total1 +

درست همانند کاری که در رابطه با نمایش اعداد کردیم، در اینجا هم انجام می‌دهیم. با این تفاوت چونکه هر دو مقدار از نوع عدد هستند، متغیر total1 مقدار قبلی خود را حفظ می‌کند و توسط علامت +، مقدار جدید را به خود اضافه می‌کند.

یکی از راه‌های متداول در سی‌شارپ، چیزی شبیه به کد زیر است:

Total1 += double.Parse(txtDisplay.Text);

این کد، دقیقاً همان کاری را می‌کند که کد زیر انجام می‌دهد:

total1 = total1 + double.Parse(txtDisplay.Text);

پس آنکه کد مربوط به button جمع را نوشته‌ایم، به سراع کدهای مربوط به Button مساوی می‌پردازیم.

Button مساوی، محلی‌است که عمل جمع باید در آن اتفاق بیفتد؛ اینجاست که ما واقعاً عمل جمع را انجام خواهید داد. برای اینکه پاسخ نهایی را جایی ذخیره کنیم، ما یک متغیر دیگر به شکل زیر اضافه خواهیم کرد:

double total1 = 0;

double total2 = 0;

private void btnPlus_Click(object sender, EventArgs e)

{

total1 = total1 + double.Parse(txtDisplay.Text);

txtDisplay.Clear();

}

پس ما یک متغیر با نام total2 از نوع double تعریف کردیم.

به فرم خود برگردید و بر روی button مساوی دابل-کلیک کنید؛ کدهای زیر را اضافه کنید:

total2 = total1 + double.Parse( txtDisplay.Text );

txtDisplay.Text = total2.ToString( );

total1 = 0;

فکر نمی‌کنم نیازی به توضیح دادن کدهای بالا باشد! همه چیز کاملاً واضح است!

الان وقت آن است که برنامه خود را اجرا کنید و چند عمل جمع را انجام دهید و از صحت آن مطمئن شوید.

تمرین: ما هنوز کدی را برای ممیز ننوشته‌ایم. این‌کار را به عهده شما خواهیم گذاشت! (راهنمایی: شما تنها و تنها باید ۱ خط کد اضافه کنید!)

جهت دریافت این بخش آموزشی به‌صورت فایل PDF، بر روی اینجا کلیک کنید.

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

    1. سلام.
      انشاءالله که همینطور خواهد بود.
      موفق باشید!

  2. سلام و مچکرم از توضیحات عاااااااااااالیتون

    اما میخواستم ببینم اون یه خط کدی که برا ممیز میگین چیه؟ چون بدون اونم که ج میده!!!
    آیا کد خاصی مد نظره؟؟؟

    1. سلام دوست عزیز،

      ممنونم از نظر شما، لطف دارید! دقت کنید که در یک ماشین‌حساب، علاوه بر جمع اعداد صحیح، باید قابلیت جمع اعداد اعشاری نیز فراهم باشد. منظور من از ممیز، همون اعشار هست که در اعداد انگلیسی همان «نقطه» است. خیلی کد ساده‌ای داره! فقط کافیه یک خط کد بنویسید که وقتی که کلید ممیز کلیک بخورد، یک نقطه به عدد اضافه کند؛ همین!

  3. سلام دوست خوبم
    برای ممیز دقیقا مانند بقیه اعداد این کد رو مینویسم
    ولی در این روش میشه برای یک عدد چندبار ممیز زد که این باعث میشه برنامه ارور بده
    فکر کنم باید از دستور if هم اینجا کمک گرفت ؟

    1. سلام دوست عزیزم،

      بله، مثلاً یکی از راه‌های اون، استفاده از متغیرهای Bool و if استفاده کنیم. راه‌ها زیاد هستند که هم می‌تونید خودتون بدست بیارید و هم می‌تونید در اینترنت بیشتر جستجو کنید.

      ممنونم از شما
      موفق باشید!

  4. درود بر جناب موسوی
    جناب موسوی خواستم بدونم درعمل تفریق ، تقسیم ، ضرب هم آیا باید یه متغیر مثل total معرفی کرد ؟!
    لطفا در این رابطه اندکی راهنمایی کنید منو 🙂
    با تشکر

    1. درود بر شما فرناز خانم،

      بخش‌های بعدی آموزش در رابطه با اضافه کردن عمل‌های مختلف حسابی بحث شده است.
      موفق باشید!

  5. سلام الان مشکل اینه مثلا اگه یه بار بزنید 2+2 خوب میشه 4
    حالا دوباره اگه بخواهید بنویسید 1+1 =2 میزنه 41 +2 =43

    1. سلام دوست عزیزم،

      کدهای خودتون رو خوب بررسی کردید؟ همه‌ی Syntax ها درست بود؟ خصوصاً علامت‌هایی مثل += یا -= ؟

      موفق باشید!

  6. بالاخره کد ممیز رو پیدا کردم 😀

    کدش میشه این :
    txtDisplay.Text +=”.”;

    به همین راحتی 😀

  7. با سلام
    استاد گرامی از برنامه محاسبه گری که با زبان بسیار سلیس و روان ارائه نمو دید بی نهایت سپاس گزارم و اولین بار است که از خواندن یک زبان سطح بالا اینقدر لذت میبرم و از زحمات بسیار زیادی که در تهیه این آموزش متحمل می شوید بی نهایت سپاسگذارم .پیروزی و موفقیت شما را آرزو مندم

  8. سلام
    این همه زحمت میکشد این برنامه ها را مینویسد
    حداقل اینا رو در قالب pdf کنید تا ما آماتورها هم Save کنیم واستفاده کنیم .

    متشکرم : amani

  9. میشه کد ممیزو بگید من مثل کد شماره های 0 تا 9 نوشتم وقتی عدد ممیز دار میزنم جمع انجام نمیشه میگه فرمت همخوانی نداره. من تازه سی شارپو شروع کردم

  10. سلام و خسته نباشید خدمت اقای موسوی.
    سایت و مطالبی که درمورد سی شارپ گذاشتین واقعا عالی ان.
    من واسه کدممیز ماشین حساب اومدم اینکارو کردم که فعلا جواب داده.
    خواستم نظرمو بگم تا بقیه دوستان هم امتحان کنن.
    من اومدم یه global variableتعریف کردم .مثلا int a=0
    بعد تو قسمت کد مربوط به ممیز از دستور if اومدم شرط اینکه a=0رو بررسی کردم اگه صفر بود که کد اجرا بشه و بعد از اجرا آخر کار اومدم یه واحد به a اضافه کردم تا در کلیک های بعدی شرط ifدرست نباشه و نتونیم ممیز اضافی وارد کنیم.
    ولی الان کد مربوط به ممیز درسته و تنها ایراد اینجاست که تا آخر کار دیگه نمی شه ممیز دیگه وارد کرد مثلا بعد از پاک کردن تکست باکس.
    برای حل این مشکلم اومدم تو کد مربوط به clearبعد از نوشتن کد پاک کردن دوباره مقدار a را صفر کردم تا مشکل برطرف شه.
    امیدوارم امتحان کنین و این راه حلم درست باشه.

  11. سلامی مجدد.
    دوستان تو کد بالا یه مشکل دیگه هم که هست اینکه وقتی دوتا عدد رو جمع میکنیم ما نمی تونیم علامت ممیز رو در عدد دومی اضافه کنیم برای رفع این مشکل باید در کد مربوط به علامت جمع بعد از کدی که نوشتیم مقدار a =0 lتا درست بشه.این کارو برای همه ی عملگرها انجام می دهیم.مثل تفریق و تقسیم و ضرب.البته بازم باید اقای موسوی بهتره نظر بدن چون من این به ذهنم رسید و نوشتم .از ذهنیت خودم هست پس امکان اشتباهش هم هست.

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *