PDA

View Full Version : مبتدی: سوال در مورد ریست شدن مقدار در ماشین حساب



همـااا
یک شنبه 17 اسفند 1393, 14:13 عصر
سلام ... میخوام ماشین حسابی "دقیقا " عین ویندوز بنویسم ...
چن جاش به مشکل خوردم ...

تو ماشین حساب ویندوز ، وقتی یه عددو میدیم بعد رو + کلیک میکنیم عدده و عملگر میره تو حافظه ... عدد اول از جای اولش پاک هم نمیشه !!!!!!!!!
بعد که رو یه عددی کلیک میکنیم بعد عدد اول پاک میشه و عدد دوم میشینه سر جاش ...

خب الان من چطوری باید کد بنویسم که بعده زدن + عدد اولو از لیبل پاک نکن و صبر کن رو باتنی کلیک بشه بعد پاکش کن؟؟؟؟ مقدار باتنم بریز تو تکست لیبل ، مقدارای بعدیرم الحاق کن به مقدار تکستش و در حین الحاق چیزیو پاک نکن :-s ینی دونه به دونه باید برای همه ی باتنها if بذارم؟؟؟ (که البته باز یه مدل دیگه قاطی میکنه!!!! )
راه حل بهتری داره؟؟؟ راهنمایی کنین لدفا...

1000net
یک شنبه 17 اسفند 1393, 14:43 عصر
سلام ... میخوام ماشین حسابی "دقیقا " عین ویندوز بنویسم ...
چن جاش به مشکل خوردم ...

تو ماشین حساب ویندوز ، وقتی یه عددو میدیم بعد رو + کلیک میکنیم عدده و عملگر میره تو حافظه ... عدد اول از جای اولش پاک هم نمیشه !!!!!!!!!
بعد که رو یه عددی کلیک میکنیم بعد عدد اول پاک میشه و عدد دوم میشینه سر جاش ...

خب الان من چطوری باید کد بنویسم که بعده زدن + عدد اولو از لیبل پاک نکن و صبر کن رو باتنی کلیک بشه بعد پاکش کن؟؟؟؟ مقدار باتنم بریز تو تکست لیبل ، مقدارای بعدیرم الحاق کن به مقدار تکستش و در حین الحاق چیزیو پاک نکن :-s ینی دونه به دونه باید برای همه ی باتنها if بذارم؟؟؟ (که البته باز یه مدل دیگه قاطی میکنه!!!! )
راه حل بهتری داره؟؟؟ راهنمایی کنین لدفا...
سلام
خب شما باید یک متغییر تعریف کنید بعنوان عملوند و یک متغییر برای ذخیره عدد داخل تکست باکس
مثلا کد زیر چک میکنه که اگه عملوند جمع مقداردهی شده تکست باکس رو خالی می کنه


int a;
string op="";
private void button1_Click(object sender, EventArgs e)// جمع
{

op = "+";
a=Convert.ToInt32(textBox1.Text);

}

private void button2_Click(object sender, EventArgs e)// دکمه شماره یک
{
if (op != "")
{
textBox1.Text = "";
}
textBox1.Text = "1" + textBox1.Text;
}

private void button3_Click(object sender, EventArgs e)// دکمه مساوی
{
textBox1.Text =( a + Convert.ToInt32(textBox1.Text)).ToString();
}

همـااا
یک شنبه 17 اسفند 1393, 15:19 عصر
سلام
خب شما باید یک متغییر تعریف کنید بعنوان عملوند و یک متغییر برای ذخیره عدد داخل تکست باکس
مثلا کد زیر چک میکنه که اگه عملوند جمع مقداردهی شده تکست باکس رو خالی می کنه


int a;
string op="";
private void button1_Click(object sender, EventArgs e)// جمع
{

op = "+";
a=Convert.ToInt32(textBox1.Text);

}

private void button2_Click(object sender, EventArgs e)// دکمه شماره یک
{
if (op != "")
{
textBox1.Text = "";
}
textBox1.Text = "1" + textBox1.Text;
}

private void button3_Click(object sender, EventArgs e)// دکمه مساوی
{
textBox1.Text =( a + Convert.ToInt32(textBox1.Text)).ToString();
}


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

1000net
یک شنبه 17 اسفند 1393, 15:48 عصر
سورس زیر رو دانلود کنید شاید بدرد خورد.
http://www.mspsoft.com/1389/12/16/%D8%B3%D9%88%D8%B1%D8%B3-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AD%D8%B3%D8%A7%D8%A8-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE/

همـااا
پنج شنبه 13 فروردین 1394, 04:31 صبح
اون مشکلو با ایده ازین سورس با یه متغیر بولین حل کردم ولی باز هزار جااااااااای پروژه سر همین پاک شدنها مشکل دارم !!!!! :لبخند:

بک اسپیس ماشین حسابو در نظر بگیرین ... خب من براش این کدو نوشتم :


char[] j = lblCalc.Text.ToCharArray();
string edgham = "";
for (int i = 0; i < j.Length - 1; i++)
{
edgham += j[i].ToString();


}
lblCalc.Text = edgham;


if (lblCalc.Text == "")
{
lblCalc.Text = "0";
}



ولی بخوام عین مال ویندوزو پیاده سازی کنم ، تو ماشین حساب ویندوز وقتی یه عدد منفی وارد میکنیم مثلا : -45 ، اول پنج رو پاک میکنه بعد -4 رو با هم !!!
در حالیکه تو کد من سه بار باید بک اسپیسو کلیک کنیم تا این مقدار پاک شه ... (زیرا کاراکتر به کاراکتر پاک میکنه).
خب الان من این کدو برای اعداد منفی چطوری بنویسم؟

am_al_59
پنج شنبه 13 فروردین 1394, 06:39 صبح
راه اول:
بعد از هر پاک کردن مقدار TextBox رو چک کنی که قابل تبدیل به عدد هست یانه اگر نبود محتوی ریست بشه
راه دوم:
بعد از زدن کلید BackSpace چک کنی مقدار چک باکس طولش برابر دو باشه و اگر کاراکتر اول عددی بود که هیچ اما اگر نبود محتوی رو ریست کنی

برای اینکه چک کنی عبارت قابل تبدیل به عدد هست بایت از متد تایپ مورد نظرت استفاده کنی مثلاً اگر ماشین حسابت فقط اعداد صحیح میگیره متدت میشه


int.TryParse(textBox1.Text);

برای اعداد اعشاری هم این شکلی میشه

double.TryParse(textBox1.Text);



متد IsDigit تایپ char هم برای چک کردن اینکه کاراکتر عددی هست یا نه البته این تابع یک overload هم داره که میتونی رشته بهش بدی و ایندکس کاراکتر رو تعیین کنی


char.IsDigit(textBox1.Text[0]);استفاده در حالت کاراکتری//
char.IsDigit(textBox1.Text,0);استفاده در حالت رشته و ایندکس//

همـااا
پنج شنبه 13 فروردین 1394, 07:37 صبح
خیلی خیلی ممنونم ... همین الگوریتم و توضیحاتتونو که خوندم کارم را افتاد ، با راه حل دومتون نوشتمش:


char[] j = lblCalc.Text.ToCharArray();
string edgham = "";
for (int i = 0; i < j.Length - 1; i++)
{
edgham += j[i].ToString();
}
lblCalc.Text = edgham;


//if (j.Length == 2 && j[0] == '-')
//{
// lblCalc.Text = "";
//}


if (lblCalc.Text == "")
{
lblCalc.Text = "0";
}


راه حل اولم حتما تست میکنم ...
یه سوال دیگه هم دارم :افسرده:
(این مقدار دهیا و پاک کردنا منو کشتن!! )

دو تا تکست باکس هست یکی بالا یکی پایین ... ظاهر برنامم عین همین ماشین حساب ویندوزه ...
خب بعد وقتی مثلا میزنیم 12 + 2 ، عدد اول همراه + میره بالا ، عدد دوم پایینه ،،، اگه بجای مساوی ، دوباره یه عملگر و یه عدد بزنیم اونا هم میرن بالا ولی حاصلشون محاسبه شده و پایین نشون داده میشه و همینطور تا اخر ...
یعنی همیشه عدد پایینی برحسب اون عملگره و عدد "ما قبل" عملگره محاسبه میشه ...

الان من عدد ما قبل عملگرو چطوری بگیرم ؟؟؟؟ الگوریتمشو نمیدونم اصلا...

am_al_59
پنج شنبه 13 فروردین 1394, 10:17 صبح
من اینطوری برداشت کردم که شما رشته محاسباتی رو داری و در مواقع لازم میخوای اونو محاسبه کنی و جواب رو بدست بیاری
سه تا راه داری که میتونی انجام بدی

اولی استفاده از یک پروژه آماده به نام Ncal هست که اونوباید در solution اضافه کنی و به پروژت Reference بدی طرز کارشم اینطوریه


Expression ex =new Expression("14+5-9");
ex.Evaluate();


دومین راه حل پیاده سازی عبارات محاسباتی بصورت پسوندی و یا پیشوندی هست که در درس ساختمان داده بود و خودم شخصاً اصلاً دوست ندارم

سومین راه حل و ساده ترینش استفاده از DataTable هست که کدش این میشه

DataTable dt =new DataTable();
dt.Compute("14+5-9","");



توی گوگل عبارت Evaluate C#‎‎‎‎‎‎‎ string with math operators رو جستجو کن کلی جواب و مثال بهت میده