PDA

View Full Version : حرفه ای: خطای منطقی نفس گیر



arefba
یک شنبه 26 اردیبهشت 1389, 01:32 صبح
بسم الله الرحمن الرحیم

یه ساعت هست نشستم و رو کاغذ که این برنامه رو پیاده می کنم کاملا درسته ولی رو سیستم اشتباه در میاد
این برنامه باید رشته ای مثل
((5+3)-2)
سپس اون رو تبدیل کنه به
53+2-
خوب ولی اینکار رو نمی کنه و بجاش مینویسه
532-
این سورسش هست ببینم کسی میتونه بفهمه چشه ؟؟؟!!!!
:عصبانی++::عصبانی++::عصبانی++:: صبانی++::عصبانی++:

int n = 0;
int h = 0;
int z = 0;
string alltext = textBox1.Text;
string[] amalgar = new string[alltext.Length];
string[] amalvand = new string[alltext.Length];
for(int i=0;i<alltext.Length;++i)
{
if( (alltext.Substring(i,1)=="+")||(alltext.Substring(i,1)=="-")||(alltext.Substring(i,1)=="*")||(alltext.Substring(i,1)=="/")||(alltext.Substring(i,1)=="^"))
{ amalgar[n]=alltext.Substring(i,1);


++n;
}
if ((alltext.Substring(i, 1) == "0") || (alltext.Substring(i, 1) == "1") || (alltext.Substring(i, 1) == "2") || (alltext.Substring(i, 1) == "3") || (alltext.Substring(i, 1) == "4") || (alltext.Substring(i, 1) == "5") || (alltext.Substring(i, 1) == "6") || (alltext.Substring(i, 1) == "7") || (alltext.Substring(i, 1) == "8") || (alltext.Substring(i, 1) == "9"))
{
amalvand[h] = alltext.Substring(i, 1);

++h;
}
if((alltext.Substring(i,1)==")"))
{ amalvand[h]+=amalgar[z];
++z;
}

}
for (int i = 0; i < alltext.Length; ++i)
{
elEntryBox2.Text += amalvand[i];

}

mohamad_ice
یک شنبه 26 اردیبهشت 1389, 01:53 صبح
دوست عزیز
بذار باهم Trace کنیم تا بهتر متوجه اشتباهت بشی :
دو پرانتز ابتدایی که هیچ !
n=0
h=0
z=0
به عدد 5 میرسیم
amalvand=5
h=1
به + میرسیم
amalgar=+
n=1
به 3 میرسیم
amalvand=5|3
h=2
به ( میرسیم
حالا + را به انتهای amalvand اضافه میکنی
amalvand=5|3|+
و
h کماکان = 2
حالا به 2 که میرسیم جایگزین + میشه و ...

موفق و موید باشید
البتهاستفاده از پشته برای تبدیلات پیشوند و پسوند حرفه ای تر هست

arefba
یک شنبه 26 اردیبهشت 1389, 02:04 صبح
واقعا خوب پیداش کردی
احسنت
معلومه اینکاره ای
دهنت بیست
درست شد یه پلاس پلاس یه آدم رو از زندگی مایوس می کنه چه زمونه ای هست (آخر زمان )

arefba
یک شنبه 26 اردیبهشت 1389, 02:08 صبح
من از پشته استفاده کردم که اینطور شده مگه پشته چطوره ؟؟

mohamad_ice
یک شنبه 26 اردیبهشت 1389, 02:19 صبح
من از پشته استفاده کردم که اینطور شده مگه پشته چطوره ؟؟

به الگوریتم صفحه 251 کتاب ساختمان داده های قلزم مراجعه کنید

+
نیمی ازعمر برنامه نویسیم توی اون صفحه آبی turbo c گذشت... اما شما برو تو کارSOA!!!

mohamad_ice
یک شنبه 26 اردیبهشت 1389, 02:32 صبح
ساختمان داده مورد استفاده شما آرایه هست !
پشته فقط و فقط عملیاتPush , Pop رو داره
اما شما عملیات انتساب دارید !!!

اگه نیاز بود الگوریتمش رو بنویسم براتون ؟(فقط الگوریتم!)

+
متاسفانه بنده زیر 20 ارسال هستم ونمیتونم پ.خ شما رو جواب بدم!(برای همین اینجا جواب دادم)

hojjatshariffam
یک شنبه 26 اردیبهشت 1389, 03:12 صبح
البته استفاده از پشته برای تبدیلات پیشوند و پسوند حرفه ای تر هست
من موافقم
البته نمیشه گفت حرفه ای تره بلکه راهش همینه (استفاده از پشته و الگوریتم های ساختمان داده کلاسیک)
الگوریتم دوستمون فکر کنم فقط برای مثال های خاص جواب بده

حامد مصافی
یک شنبه 26 اردیبهشت 1389, 09:06 صبح
نمي دونم تونستم منطق مورد نظر شما رو درك كنم يا نه، به هر حال كد هاي زير رو امتحان كنيد.


string s = textBox1.Text.Replace("(", "").Replace(")", "");
Regex r = new Regex(@"(?<o>[\+\-\*\/])(?<a>\d+)");
s = r.Replace(s, "$2$1");
textBox2.Text = s;

arefba
یک شنبه 26 اردیبهشت 1389, 20:45 عصر
نمي دونم تونستم منطق مورد نظر شما رو درك كنم يا نه، به هر حال كد هاي زير رو امتحان كنيد.


string s = textBox1.Text.Replace("(", "").Replace(")", "");
Regex r = new Regex(@"(?<o>[\+\-\*\/])(?<a>\d+)");
s = r.Replace(s, "$2$1");
textBox2.Text = s;

این رجیکس چه using میخواد

Salar Ashgi
یک شنبه 26 اردیبهشت 1389, 21:24 عصر
اگه بحث ارزیابی عبارات تو ساختمان داده نباشه (infix , prefix , postfix) ، میتونید از کد ساده زیر

هم بدون استفاده از پشته استفاده کنید :



string str = "((5+3)-2)";
string res = "";
for (int i = 0; i < str.Length; i++)
{
if (char.IsDigit(str[i]))
res += str[i].ToString();
if (str[i] == '+' || str[i] == '-')
{
res += str[i + 1].ToString();
res += str[i].ToString();
i++;
}
}
MessageBox.Show(res);


موفق باشید .

arefba
یک شنبه 26 اردیبهشت 1389, 22:10 عصر
عزیز دل من این رو اگه با یه عبارت بزرگتر تست کنی کار نمیکنه این روش شما صرفا برای تست کد پایین است
((5+3)-2)

Salar Ashgi
یک شنبه 26 اردیبهشت 1389, 22:27 عصر
عزیز دل من این رو اگه با یه عبارت بزرگتر تست کنی کار نمیکنه این روش شما صرفا برای تست کد پایین است
دوست عزیز ، ناراحت نشید ها ، ولی مشکل کار تو بیان شماست ! شما اصلا نه هدف مساله رو گفتین ؟

نه حرفی از الگوریتم مساله زدین ؟ فقط گفتین یه عبارت رو به عبارت دیگه تبدیل کنه ؛ خوب ما هم کدشو

نوشتیم ، حالا اگه این کد مقصود شما نبوده ، منظورتان را واضحتر بیان کنید .

wolf_majid
دوشنبه 27 اردیبهشت 1389, 09:56 صبح
این کد برای تبدیل عبارت میانوندی به پسوندی
(البته زیاد جالب نیست :افسرده: )


char [] amalvand=new char[200];
char [] poshte=new char[200];

int _countAmalvand;
int _counterAmalgar=0;


public int olaviat(char ch)
{

switch (ch)
{
case '*':
return 10;
case '/':
return 10;
case '%':
return 10;
case '+':
return 5;
case '-':
return 5;
default :
return 0;
}

}




private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < myTextBox1.TextLength; i++)
{
//agar adad bood
if (char.IsNumber(myTextBox1.Text[i]))
{
amalvand[_countAmalvand++] = myTextBox1.Text[i];
}
//gheire adad
else
{
try
{
if (myTextBox1.Text[i] == '(')
{
poshte[_counterAmalgar++] = '(';
}
else if (myTextBox1.Text[i] == ')')
{
while (poshte[_counterAmalgar - 1] != '(')
{
amalvand[_countAmalvand++] = poshte[_counterAmalgar - 1];
poshte[--_counterAmalgar] = '\0';

}
poshte[--_counterAmalgar] = '\0';
//**************************************************
//break;

}
else
{
//sharte khali boodane avalin khanehe poshte
if (poshte[0] == '\0')
{
poshte[0] = myTextBox1.Text[i];
_counterAmalgar = 1;
}
//age ghablan dar poshte amalgar bood
else
{
//agar olaviat amalgar jadid bishtar bood
if (olaviat(myTextBox1.Text[i]) > olaviat(poshte[_counterAmalgar - 1]))
{
poshte[_counterAmalgar++] = myTextBox1.Text[i];
}
else
{
while (olaviat(myTextBox1.Text[i]) <= olaviat(poshte[_counterAmalgar - 1]))
{
amalvand[_countAmalvand++] = poshte[_counterAmalgar - 1];
poshte[--_counterAmalgar] = '\0';
}
poshte[_counterAmalgar++] = myTextBox1.Text[i];
}
}

}
}

catch { }
}

}
//tamame ebarate baghimande be ebarat ezafe mishavand
for (int i = _counterAmalgar-1 ; i >=0 ; i--)
{
amalvand[_countAmalvand++] = poshte[_counterAmalgar - 1];
poshte[--_counterAmalgar] = '\0';
}

}

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < _countAmalvand ; i++)
{
label1.Text += amalvand[i].ToString();
}
}