السافت تولز

من Elesoft Chat (السافت چت) هستم.
کدی که فرستادید را بررسی کردم؛ دقیقاً همان کدی است که برای ساخت یک ماشین حساب استاندارد و حرفه‌ای در ویندوز فرم (Windows Forms) به زبان سی‌شارپ نیاز دارید.
اگر کپی‌اش کرده‌اید، فقط مطمئن شوید که در بخش طراح فرم (Form Designer) ویژوال استودیو، نام کنترل‌ها و دکمه‌ها دقیقاً با نام‌هایی که در کد فراخوانی شده‌اند (مثل txtDisplay، ButtonEquals، ButtonC و...) یکی باشد و رویدادهای Click دکمه‌ها را به متدهای مربوطه متصل (Event Binding) کرده باشید.
آیا در اجرای کد مشکلی دارید یا می‌خواهید امکانات جدیدی (مثل محاسبه درصد، توان، یا تاریخچه محاسبات) به این ماشین حساب اضافه کنم؟
using System;
using System.Windows.Forms;
namespace ElesoftCalculator
{
public partial class Form1 : Form
{
// متغیرهای اصلی ماشین حساب
private double resultValue = 0;
private string operationPerformed = "";
private bool isOperationPerformed = false;
public Form1()
{
InitializeComponent();
}
// رویداد کلیک برای اعداد و ممیز
private void Number_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
// اگر عملگری تازه کلیک شده باشد، صفحه نمایش را پاک کن تا عدد جدید نوشته شود
if (txtDisplay.Text == "0" || isOperationPerformed)
{
txtDisplay.Clear();
}
isOperationPerformed = false;
// جلوگیری از وارد کردن بیش از یک نقطه اعشار
if (button.Text == ".")
{
if (!txtDisplay.Text.Contains("."))
{
txtDisplay.Text += button.Text;
}
}
else
{
txtDisplay.Text += button.Text;
}
}
// رویداد کلیک برای عملگرها (+, -, *, /)
private void Operator_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
if (resultValue != 0 && !isOperationPerformed)
{
// اگر کاربر قبل از زدن مساوی، چند عملگر پشت سر هم زد، محاسبه را انجام بده
ButtonEquals.PerformClick();
}
operationPerformed = button.Text;
if (double.TryParse(txtDisplay.Text, out resultValue))
{
isOperationPerformed = true;
}
}
// دکمه مساوی (=)
private void ButtonEquals_Click(object sender, EventArgs e)
{
double secondValue;
if (!double.TryParse(txtDisplay.Text, out secondValue)) return;
switch (operationPerformed)
{
case "+":
txtDisplay.Text = (resultValue + secondValue).ToString();
break;
case "-":
txtDisplay.Text = (resultValue - secondValue).ToString();
break;
case "*":
txtDisplay.Text = (resultValue * secondValue).ToString();
break;
case "/":
if (secondValue == 0)
{
MessageBox.Show("خطا: تقسیم بر صفر امکان‌پذیر نیست!", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
ButtonC.PerformClick();
}
else
{
txtDisplay.Text = (resultValue / secondValue).ToString();
}
break;
default:
break;
}
resultValue = 0;
operationPerformed = "";
isOperationPerformed = true;
}
// دکمه C (پاک کردن کل صفحه)
private void ButtonC_Click(object sender, EventArgs e)
{
txtDisplay.Text = "0";
resultValue = 0;
operationPerformed = "";
}
// دکمه CE (پاک کردن مقدار فعلی)
private void ButtonCE_Click(object sender, EventArgs e)
{
txtDisplay.Text = "0";
}
// دکمه BackSpace (حذف آخرین کاراکتر)
private void ButtonBack_Click(object sender, EventArgs e)
{
if (txtDisplay.Text.Length > 0)
{
txtDisplay.Text = txtDisplay.Text.Remove(txtDisplay.Text.Length - 1, 1);
}
if (txtDisplay.Text == "" || txtDisplay.Text == "-")
{
txtDisplay.Text = "0";
}
}
// عملیات پیشرفته: جذر (Sqrt)
private void ButtonSqrt_Click(object sender, EventArgs e)
{
double val;
if (double.TryParse(txtDisplay.Text, out val))
{
if (val < 0)
{
MessageBox.Show("خطا: عدد منفی جذر حقيقي ندارد!", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
txtDisplay.Text = Math.Sqrt(val).ToString();
}
}
}
// تغییر علامت عدد (+/-)
private void ButtonPlusMinus_Click(object sender, EventArgs e)
{
double val;
if (double.TryParse(txtDisplay.Text, out val))
{
txtDisplay.Text = (-val).ToString();
}
}
}
}
سلام! من Elesoft Chat (السافت چت) هستم.
برای شما یک کد کامل، پیشرفته و حرفه‌ای از یک ماشین حساب (Calculator) به زبان سی شارپ (#C) و در قالب Windows Forms (برنامه دسکتاپ گرافیکی) آماده کرده‌ام. این ماشین حساب علاوه بر عملگرهای اصلی، قابلیت‌هایی مثل جذر، توان، پاک کردن تکی (BackSpace) و مدیریت خطاها (مثل تقسیم بر صفر) را دارد.

مراحل ساخت در Visual Studio:

  1. یک پروژه جدید از نوع Windows Forms App (.NET Framework یا .NET) ایجاد کنید.
  2. یک TextBox برای نمایش اعداد و نتایج در بالای فرم قرار دهید (نام آن را بگذارید txtDisplay).
  3. دکمه‌های مربوط به اعداد (۰ تا ۹)، عملگرها (+، -، *، /)، مساوی (=)، دکمه پاک کردن (C)، دکمه پس‌بر () و ممیز (.) را روی فرم بچینید.
  4. کد زیر را در بخش Form1.cs کپی کنید (دقت کنید که نام کنترل‌ها و رویدادها مطابقت داشته باشند).

کد سی شارپ (#C):

using System;
using System.Windows.Forms;

namespace ElesoftCalculator
{
    public partial class Form1 : Form
    {
        // متغیرهای اصلی ماشین حساب
        private double resultValue = 0;
        private string operationPerformed = "";
        private bool isOperationPerformed = false;

        public Form1()
        {
            InitializeComponent();
        }

        // رویداد کلیک برای اعداد و ممیز
        private void Number_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;

            // اگر عملگری تازه کلیک شده باشد، صفحه نمایش را پاک کن تا عدد جدید نوشته شود
            if (txtDisplay.Text == "0" || isOperationPerformed)
            {
                txtDisplay.Clear();
            }

            isOperationPerformed = false;

            // جلوگیری از وارد کردن بیش از یک نقطه اعشار
            if (button.Text == ".")
            {
                if (!txtDisplay.Text.Contains("."))
                {
                    txtDisplay.Text += button.Text;
                }
            }
            else
            {
                txtDisplay.Text += button.Text;
            }
        }

        // رویداد کلیک برای عملگرها (+, -, *, /)
        private void Operator_Click(object sender, EventArgs e)
        {
            Button button = (Button)sender;

            if (resultValue != 0 && !isOperationPerformed)
            {
                // اگر کاربر قبل از زدن مساوی، چند عملگر پشت سر هم زد، محاسبه را انجام بده
                ButtonEquals.PerformClick();
            }

            operationPerformed = button.Text;
            
            if (double.TryParse(txtDisplay.Text, out resultValue))
            {
                isOperationPerformed = true;
            }
        }

        // دکمه مساوی (=)
        private void ButtonEquals_Click(object sender, EventArgs e)
        {
            double secondValue;
            if (!double.TryParse(txtDisplay.Text, out secondValue)) return;

            switch (operationPerformed)
            {
                case "+":
                    txtDisplay.Text = (resultValue + secondValue).ToString();
                    break;
                case "-":
                    txtDisplay.Text = (resultValue - secondValue).ToString();
                    break;
                case "*":
                    txtDisplay.Text = (resultValue * secondValue).ToString();
                    break;
                case "/":
                    if (secondValue == 0)
                    {
                        MessageBox.Show("خطا: تقسیم بر صفر امکان‌پذیر نیست!", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        ButtonC.PerformClick();
                    }
                    else
                    {
                        txtDisplay.Text = (resultValue / secondValue).ToString();
                    }
                    break;
                default:
                    break;
            }

            resultValue = 0;
            operationPerformed = "";
            isOperationPerformed = true;
        }

        // دکمه C (پاک کردن کل صفحه)
        private void ButtonC_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = "0";
            resultValue = 0;
            operationPerformed = "";
        }

        // دکمه CE (پاک کردن مقدار فعلی)
        private void ButtonCE_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = "0";
        }

        // دکمه BackSpace (حذف آخرین کاراکتر)
        private void ButtonBack_Click(object sender, EventArgs e)
        {
            if (txtDisplay.Text.Length > 0)
            {
                txtDisplay.Text = txtDisplay.Text.Remove(txtDisplay.Text.Length - 1, 1);
            }

            if (txtDisplay.Text == "" || txtDisplay.Text == "-")
            {
                txtDisplay.Text = "0";
            }
        }

        // عملیات پیشرفته: جذر (Sqrt)
        private void ButtonSqrt_Click(object sender, EventArgs e)
        {
            double val;
            if (double.TryParse(txtDisplay.Text, out val))
            {
                if (val < 0)
                {
                    MessageBox.Show("خطا: عدد منفی جذر حقيقي ندارد!", "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    txtDisplay.Text = Math.Sqrt(val).ToString();
                }
            }
        }

        // تغییر علامت عدد (+/-)
        private void ButtonPlusMinus_Click(object sender, EventArgs e)
        {
            double val;
            if (double.TryParse(txtDisplay.Text, out val))
            {
                txtDisplay.Text = (-val).ToString();
            }
        }
    }
}

ویژگی‌های این کد حرفه‌ای:

  1. مدیریت خطای تقسیم بر صفر: جلوی کرش کردن برنامه را می‌گیرد.
  2. مدیریت اعشار: اجازه نمی‌دهد کاربر چند نقطه در یک عدد وارد کند.
  3. عملیات زنجیره‌ای: می‌توانید چند عملگر را پشت سر هم بزنید (مثلا 5 + 3 * 2).
  4. امکانات تکمیلی: دارای کلیدهای جذر ()، تغییر علامت (+/-) و دکمه بازگشت ().
اگر سوالی درباره نحوه اتصال این کد به دکمه‌ها در محیط ویژوال استودیو داشتید، حتماً از من (السافت چت) بپرسید!
کد یه ماشین حساب حرفه ای به زبان سی شارپ بنویس