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

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

در جلسات پیشین، با دستورات شرطی IF، ELSE و ELSE IF آشنا شدید و یاد گرفتید که چگونه می‌توان از آن‌ها استفاده نمود. همانطور هم که قبلاً گفته بودیم، تکمیل پروژه ماشین‌حساب به جهت استفاده از چند عملیات ریاضی به‌صورت همزمان، بدون استفاده از دستورات شرطی غیرممکن است.

اکنون که فراگرفتیم که چگونه از دستورات شرطی استفاده کنیم، می‌توانیم خیلی راحت به تکمیل پروژه‌ی خود ادامه دهیم.

  • تکمیل پروژه‌ی ماشین‌حساب

اول از همه، پروژه‌ی ماشین‌حسابی که قبلاً با هم آماده کردیم بودیم را فراخوانی کنید. برای فراخوانی پروژه‌ی‌های ایجاد شده، شما می‌توانید که با استفاده از گزینه Open Project از منوی File، به محل ذخیره‌سازی پروژه‌ی خود بروید و به دنبال فایلی با پسوند «.sln» باشید.

یک button جدید به ماشین‌حساب خود اضافه کنید (جهت انجام عمل تفریق) و Property های زیر را برای آن اعمال کنید:

Name: btnMinus

Font: Microsoft Sans Serif, 16, Bold

Location: آن را در سمت عمل جمع قرار دهید

Size: 49, 40

Text:

بر روی button تفریق خود دابل-کلیک کنید تا وارد بخش کدنویسی شوید. دو متغیر از نوع Bool به شکل زیر خارج از کدهای مربوط به button تفریق قرار دهید؛ درست بالای سر آن! به شکل زیر هم توجه کنید تا بهتر متوجه منظور من شوید:

bool plusButtonClicked = false;

bool minusButtonClicked = false;

1-btnMinus_BooleanVars

اکنون کدهای زیر را در داخل کدهای مربوط به button تفریق خود قرار دهید.

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

txtDisplay.Clear();

plusButtonClicked = false;

minusButtonClicked = true;

کدهایتان باید شکلی شبیه به تصویر زیر داشته باشد:

2-btnMinus_Code

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

وقتی که مثلاً button تفریق کلیک بخورد، ما این‌کار را خواهیم کرد: متغیر minusButtonClicked را True می‌کنیم و plusButtonClicked را False. شبیه همین‌کار را نیز برای button مربوط به جمع نیز انجام خواهیم داد.

اکنون برای کدهای مربوط به button جمع خود نیز، کدهای زیر را طبق تصویر اضافه کنید:

3-btnPlus_Code

اکنون، کاری که باید انجام دهیم، اصلاح بخش button مساوی است. پس به آن بخش مراجعه کنید و کدهای داخل آن را به کدهایی همانند تصویر زیر تغییر دهید:

4-btnEquals_ifStatement

فکر می‌کنم همه چیز در رابطه با کدها واضح است و نیازی به توضیح دادن آن‌ها نمی‌بینم.

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

تمرین: پروژه‌ی ماشین‌حسابتان را با اضافه کردن دو عمل اصلی دیگر، یعنی ضرب و تقسیم، کامل کنید. برای این تمرین، شما تنها دو متغیر دیگر از نوع Boolean در کنار متغیرهای Boolean قبلی تعریف خواهید کرد و با اضافه کردن ELSE IF های اضافی، خواهید توانست که این ماشین‌حساب را تکمیل کنید. مابقی کار‌ها نیز فکر می‌کنم تماماً واضح باشد و نیازی به راهنمایی نیست. به تصویر زیر که کدهای مربوط به عمل تفریق را پس از اضافه کردن دو عمل ضرب و تقسیم در کنار جمع و تفریق است، دقت کنید:

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

دیدگاه خود را وارد کنید
تعداد دیدگاه ها : 40 دیدگاه
  1. سلام دوست عزیز
    کولاک کردی که داداش!! من ۲ هفته به نت دسترسی نداشتم الان که اومدم کلی ذوق کردم
    زنده باشی عزیز کارت واقعا داره-اجرشو ببینی

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

      خواهش می کنم؛ خوشحالم که راضی هستید. ممنونم از ابراز نظر مثبتتون.
      موفق باشید!

  2. سلام
    اگه بخواییم این پروژه رو به صورت یک نرم افزار مستقل اجرا کنیم چه باید کرد؟
    با تشکر از زحماتتون

    1. با سلام،

      اگر منظور شما از اجرای مستقل این هست که یک شبیه به یک نرم‌افزار کامل دربیاد که بتونید به هرکسی بدید، شما می‌تونید به‌جای Debug کردن، برنامه رو Release کنید.
      زیاد در این مورد عجله نکنید. من فکر این موقعیت‌ها رو کردم و قطعاً تمامی این موارد رو در نهایت ذکر خواهم کرد.

      موفق باشید.

  3. یه سوال دیگه ، برای کامنت کردن چند خط از برنامه به صورت همزمان باید چه کرد؟َ

    1. آقا شرمنده من هر چی میگردم دنبال جواب پیدا نمیکنم ولی به محض این که سوالو اینجا مطرح میکنم جواب پیدا میشه ! :))

      Ctrl+K,Ctrl+C
      اگه راه دیگه ای هم هست شما بفرمایید ما استفاده میکنیم

      حالا اگه بخوابم چند خط رو که کامنت کردیم دوباره برگردونیم به حالت عادی چه باید کرد؟

  4. سلام
    خیلی ممنون از سایت خوبتون و مخصوصا آموزش بسیار خوبتون.
    من وقتی برنامه رو اجرا میکنم هر عددی رو به علاوه یا منها کنم،جواب صفر رو به من نشون میده.btn 14 =mines btn 12 = plus btn 11 = equals
    اینم از کد من
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace test1
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void btn1_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn1.Text;
    }

    private void btn2_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn2.Text;
    }

    private void btn3_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn3.Text;
    }

    private void btn4_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn4.Text;
    }

    private void btn5_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn5.Text;
    }

    private void btn6_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn6.Text;
    }

    private void btn7_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn7.Text;
    }

    private void btn8_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn8.Text;
    }

    private void btn9_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn9.Text;
    }

    private void btn0_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn0.Text;
    }

    private void btn13_Click(object sender, EventArgs e)
    {
    txt1.Clear();//.است.بنابراین جلوی آن یک جفت پرانتز تو خالی می گذاریم method یک Clear//
    }
    double a = 0 , b = 0;
    private void btn12_Click(object sender, EventArgs e)
    {
    a = a + double.Parse(txt1.Text);
    txt1.Clear();
    bool plusButtonClicked = true;
    bool minusButtonClicked = false;
    }
    private void btn11_Click(object sender, EventArgs e)
    {
    if (plusButtonClicked == true)
    {
    b = a + double.Parse(txt1.Text);
    }
    else if (minusButtonClicked == true)
    {
    b = a – double.Parse(txt1.Text);
    }
    txt1.Text = b.ToString();
    a = 0;
    }

    private void btn10_Click(object sender, EventArgs e)
    {
    txt1.Text = txt1.Text + btn10.Text;
    }
    bool plusButtonClicked = false;
    bool minusButtonClicked = false;
    private void btn14_Click(object sender, EventArgs e)
    {
    a = a + double.Parse(txt1.Text);
    txt1.Clear();
    bool plusButtonClicked = false;
    bool minusButtonClicked = true;
    }

    }
    }

    اگه مشکل منو حل کنید خیلی ممنون میشم.
    من اسم button ها textbox رو مطابق میل خودم تغییر دادم.
    خییییییییییییییییییییییییییییییییییییییییلی ممنون.

  5. آخ آخ آخ آخ
    یادم رفتم
    متغیر ها رو هم برای راحتی کار تغییر دادم.
    total 1 =a
    total2 = b
    البته چون کدهارو copy paste کردم به هم ریخته شدن.
    به بزرگی خودتتون ببخشید.

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

      لطف می‌کنید کل پروژه رو برای من ایمیل بفرستید که من بررسی کنم؟ چونکه کپی کردن این پروژه نیاز به ساخت تک‌ تک فرم و دکمه‌ها هست که متأسفانه وقتش رو ندارم.

      ممنونم از لطف شما. آدرس ایمیل من jmosawy هست در سرویس Gmail (عمداً ایمیل رو کامل ننوشتم که از اسپم جلوگیری کنم)

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

      متأسفانه چیزی به‌دست من نرسیده است.
      موفق باشید.

    3. نمیدونم چرا ارسال نشد.ولی آپولدش کردم .اینم لینک دانلودش:
      [http://amir7613.persiangig.com/test1.rar]

    4. سلام آقای موسوی
      برنامه رو دیدید؟
      به نظرتون مشکلش ار کجاست؟

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

      بله برنامه شما بدست من رسید. مشکل شما اینجاست که دو متغیری که از نوع Bool تعریف کرده‌اید (PlusButtonClicked و MinusButtonClicked) در داخل یک Scope (بین دو براکت) تعریف کردید. لذا وقتی که این دو متغیر می‌خواهند از طریق کدهای مربوط به دکمه مساوی دسترسی داشته باشند، غیرممکن می‌شود.
      شما این دو متغیر رو خارج از هر گونه Scope تعریف کنید و فقط از آن‌ها در کدهای مربوط به Button ها استفاده کنید. مشکل رفع خواهد شد.

      موفق باشید.

    6. خیلی متشکرم از پاسخگوییتان
      ولی یه مشکل دیگه به وجود اومد.
      من اون ها رو از بین دو براکت خارج کردم و وارنینگ ها بر طرف شد اما در قسمت کد های دکمه مساوی زیر minesButtonClicked و plusButtonClicked خط قرمز کشیده و این ارور رو میده:
      Ambiguity between ‘test1.Form1.plusButtonClicked’ and ‘test1.Form1.plusButtonClicked’
      یه ارور دیگه مثل ارور بالایی میده فقط به جای پلاس ، ماینسه

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

      بگردید ببینید آیا نام مشابهی جای دیگه از کدهاتون استفاده کردید یا نه!

      موفق باشی دوست عزیزم.

  6. با سلام.
    شما در قسمت تفریق کد زیر رو نوشتید که درست نیست و کد مربوط به قسمت جمع هستش. حالا چه کدی باید قرار دهیم؟
    total1 = total1 + double.Parse(txtDisplay.Text);

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

      شما امتحان کردید؟ به مشکل برخورد کردید؟
      موفق باشید!

    2. این کد موقعی درسته که شما دو تا عدد رو از هم کم کنین.
      در مواقعی سه تا یا بیشتر رو بخواین تفریق کنین جواب درست درنمیاد.
      یه بار دقیق امتحان کنین.
      مثلا اگر بخواییم ۲-۳-۱۵ رو انجام بدیم که ۱۰ بشه اول میاد ۱۵ رو با ۳ جمع میکنه بعد ۲ رو ازش کم میکنه و جوابی که میده ۱۶ هستش نه ۱۰ !

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

      متأسفانه وقت نداشتم مشکل شما را در Visual Studio بررسی کنم و قدم‌به‌قدم برم جلو، اما چیزی که در ظاهر کد می‌بینم، نباید مشکلی باشه. متأسفانه فعلاً وقتی ندارم برای این‌کار؛ شما یکمی با علامت‌ها اگر بازی کنی و خط به خط برنامه رو بری احتمالاً مشکلت حل می‌شه.
      اگر هم ضرروی هست، لطفاً به من یک ایمیل بزن تا من جزو To-Doهای خودم قرار بدم تا بررسی کنم. شما فعلاً بخش‌های جلو تر رو مطالعه بفرمایید.
      ایمیل من: jmosawy @ gmail . com (فاصله‌ها رو خودتون حذف کنید)
      موفق باشید!

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

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

      من جوابتون رو توی ایمیل دادم؛ مجدداً اینجا هم برای دیگر دوستان قرار می‌دم. کدنویسی این ماشین‌حساب به‌صورتی بوده که برای بیشتر از دو عدد کاربردی ندارد؛ یعنی تنها یک پروژه‌ی ساده‌ای نوشته شده که با مفاهیم کلی سی‌شارپ و نحوه ایجاد یک پروژه‌ی بسیار ساده آموزش داده شود.
      موفق باشید!

    4. سلام جناب مهندس.منم همین مشکل رو برای تفریق دارم .میشه توضیح بدید .میخوام به جای دو عدد برای منها از چن عدد استفاده کنم.با تشکر.

  7. سلام من برای ممیز کد زیر را نوشتم ولی اشتباه حساب می کنه لطفا کمکم کنید
    private void button7_Click(object sender, EventArgs e)
    {
    textBox5.Text = textBox5.Text + “.”;
    total1 += double.Parse(textBox5.Text);

    }
    مثلا دو عدد 2.2 + 1.1=6.4 که اشتباه است.

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

      شما برای ممیز تنها می‌بایست کاراکتر «نقطه» را اضافه کنید. خط دوم که جمع کردید برای چی هست؟
      موفق باشید!

  8. با سلام و تشکر فراوان از زحمت های شما
    من یه سوالی دارم …یعنی یه برنامه ای میخوام بنویسم که خود اون نرم افزار بر روی مکان مشخصی از صفحه نمایش کلیک کند( و هم دابل کلیک)
    و ما تعداد دفعات کلیک و مختصات رو به نرم افزار بدهیم تا نرم افزار بر روی آن کلیک کند
    اگه راهنمایی کنید ممنون میشم
    fox11101@yahoo.oc

  9. به نام خدا
    با سلام
    چرا در کد زیر دوبار از total1 استفاده کردید
    total1=total1+double.Parse(txtDisplay.Text);
    و آن را به صورت زیر ننوشتید
    total1=double.Parse(txtDisplay.Text);
    لطفا سریعتر پاسخ دهید.

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

      باید مقدار ذخیره شده از قبل را با مقدا فعلی جمع می‌کردم و دوباره در همان متغیر ذخیره می‌شد. در صورتی که کد دومی که خودتون نوشتید رو می‌نوشتم، فقط مقدار فعلی را نگه می‌داشت.
      موفق و مؤید باشید.

  10. با سلام
    اگه بخواهیم عملی به شکل زیر انجام دهیم با مشکل مواجه میشیم
    ۹-۲-۱
    یعنی دوبار ‍متوالی تفریق انجام بدیم

    1. int a;
      a = b – c;
      a = a -d;
      در خط سوم عدد d رو از حاصل تفریق b , c کم می کنیم و توی a میریزیم

  11. باسلام!
    چطور میشه بررسی کرد که یک کاراکتر خاص موجود هست یا نه؟
    میخوام برای ممیز استفاده کنم که اگر کاربر یک ممیز گذاشت دیگه نتونه ممیز بزاره.
    ممنون از آموزش کامل و بسیار خوبتون

  12. با سلام!
    if(firstnumber.Text != “”)
    {
    firstnumber.Text = firstnumber.Text + “0”;
    }
    این کد میتونه از گذاشت صفر اول عدد جلوگیری فک میکنم بدردتون بخوره.

  13. با سلام!
    ببخشید من یه ماشین حساب درست کردم که با ماشین حساب شما یه مقدار تفاوت داره 🙁
    ومشکل اینجاست که با داده های بزرگ مشکل داره و ارور overflow رو میده!
    چطوری میتونم برنامه ام رو برای شما ارسال کنم که برام عیب اش رو پیدا کنید؟

    این هم کد مربوط به دکمه مساوی:
    private void mosavi_Click(object sender, EventArgs e)
    {
    number1 = int.Parse(firstnumber.Text);
    number2 = int.Parse(firstnumber.Text);
    javab = 0;
    if (what == “+”){javab = number1 + number2;}
    else if (what == “-“) { javab = number1 – number2; }
    else if (what == “x”) { javab = number1 * number2; }
    else if (what == “/”) { javab = number1 / number2; }
    else if (what == “^”) { javab = number1 ^ number2; }
    result.Text = javab.ToString();
    which = 1;
    }
    ۱-متغییر what با فشردن دکمه های عملگرا تغییر میکنه
    ۲- first number یه تکست باکسه که عدد اول رو میگیره
    ۳- secondnumber هم به همین صورت
    ۴- result هم یک تکست باکسه که جواب رو نشون میده
    //ببخشید اگه خیلی حرف زدم چون سایت شما بهترین منبع آموزشی هست و منم اون رو به همه معرفی میکنم

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