PDA

View Full Version : سوال: پروزه infix to post fix به صورت پیشرفته



capsloack
دوشنبه 29 آبان 1391, 08:01 صبح
سلام دوستان
من یه سوال داشتم و واقعا به راهنمایی شما دوستان احتیاج دارم
من پروزه infix to postfix نوشتم و خدا رو شکر کامله
حالا استاد اومده گفته همین پروزه رو به صورت پیشرفته میخوام
یعنی اینکه اگه کاربر زده num +1*(var/e)
بیاد یه جای دیگه ی برنامه به اون num , var , e مقدار بده و حاصل کل رو حساب کنه
(اول برنامه هم که باید متوجه شده باشید میانوندی به پسوندی رو انجام بده که اون کامله)
دوستان اگه سورسی چیزی ندارید حداقل فکری اگه دارید بگید تا من کدشو بزنم

capsloack
دوشنبه 29 آبان 1391, 08:58 صبح
یعنی هیچکی نمی تونه کمکم کنه!!!! :افسرده:

tooraj_azizi_1035
دوشنبه 29 آبان 1391, 09:34 صبح
برای درک کد: http://www.codeproject.com/Articles/405361/Converting-Postfix-Expressions-to-Infix# (http://www.codeproject.com/Articles/405361/Converting-Postfix-Expressions-to-Infix)#


//
// class used to represent intermediate expressions on the stack.
//
public class Intermediate
{
public string expr; // subexpression string
public string oper; // the operator used to create this expression
public Intermediate(string expr, string oper)
{
this.expr = expr;
this.oper = oper;
}
}
//
// PostfixToInfix
//
static string PostfixToInfix(string postfix)
{
// Assumption: the postfix expression to be processed is space-delimited.
// Split the individual tokens into an array for processing.
var postfixTokens = postfix.Split(' ');
// Create stack for holding intermediate infix expressions
var stack = new Stack<Intermediate>();
foreach(string token in postfixTokens)
{
if (token == "+" || token == "-")
{
// Get the left and right operands from the stack.
// Note that since + and - are lowest precedence operators,
// we do not have to add any parentheses to the operands.
var rightIntermediate = stack.Pop();
var leftIntermediate = stack.Pop();
// construct the new intermediate expression by combining the left and right
// expressions using the operator (token).
var newExpr = leftIntermediate.expr + token + rightIntermediate.expr;
// Push the new intermediate expression on the stack
stack.Push(new Intermediate(newExpr, token));
}
else if (token == "*" || token == "/")
{
string leftExpr, rightExpr;

// Get the intermediate expressions from the stack.
// If an intermediate expression was constructed using a lower precedent
// operator (+ or -), we must place parentheses around it to ensure
// the proper order of evaluation.

var rightIntermediate = stack.Pop();
if (rightIntermediate.oper == "+" || rightIntermediate.oper == "-")
{
rightExpr = "(" + rightIntermediate.expr + ")";
}
else
{
rightExpr = rightIntermediate.expr;
}
var leftIntermediate = stack.Pop();
if (leftIntermediate.oper == "+" || leftIntermediate.oper == "-")
{
leftExpr = "(" + leftIntermediate.expr + ")";
}
else
{
leftExpr = leftIntermediate.expr;
}
// construct the new intermediate expression by combining the left and right
// using the operator (token).
var newExpr = leftExpr + token + rightExpr;
// Push the new intermediate expression on the stack
stack.Push(new Intermediate(newExpr, token));
}
else
{
// Must be a number. Push it on the stack.
stack.Push(new Intermediate(token, ""));
}
}
// The loop above leaves the final expression on the top of the stack.
return stack.Peek().expr;
}

capsloack
دوشنبه 29 آبان 1391, 09:52 صبح
دوست عزیز من برنامه ام واسه میانوندی به پیش وندی هستش
اون قسمت تبدیل درست کار میکنه
فقط میخوام که محاسبات هم انجام بده
num*2+(t/f+8)
مثلا این
میخوام که به جای num بزارم 3.یعنی مساوی 3 بعد جواب رو بده

mousa1992
دوشنبه 29 آبان 1391, 13:49 عصر
سلام دوست عزیز
کار مشکلی نیست شما توی رشته ای که میگیری عملوند ها داری و اعداد و حروف که میشه متغیرهاتون
با استفاده از ی پشته میتونی متغیرهارو جدا کنی و به ازای هر متغیر مثلا تکست باکسی و لیبلی رو add کنی به فرمت که کاربر بتونه از این طریق مقادیر رو وارد کنه و جایگزینی و محاسبه ی عبارت بازم با پشته ها
امیدوارم توضیحم مفید باشه
موفق باشی

capsloack
سه شنبه 30 آبان 1391, 00:04 صبح
واسه ادد کردن لیبل یا تکس باکس ...منظورتون اینه که همون لحظه توی برنامه ایجاد شه؟

capsloack
سه شنبه 30 آبان 1391, 19:23 عصر
در تاپیک زیر توضیح دادم. به کمک استک باید اینکار رو انجام بدی. توجه کن که اعداد در پشته قرار میگیرن نه نام متغیر. البته خروجی یک رشته infix هست منتها شما میتونی بر حسب عملوند عمل جمع،تفریق و... رو انجام بدی و حاصل رو در پشته قرار بدید. در آخر هم به جای رشته infix جواب عددی دریافت میکنید.
تبدیل Postfix به Infix (http://barnamenevis.org/showthread.php?341730-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-Postfix-%D8%A8%D9%87-Infix)

دوست عزیز این راه کار به درد من نمیخوره...چون واسه من مثله مثالی که زدم چند تا عملوند با هم میشن یه متغیر ...ولی اینجا این طور نیست

capsloack
سه شنبه 30 آبان 1391, 19:25 عصر
سلام دوست عزیز
کار مشکلی نیست شما توی رشته ای که میگیری عملوند ها داری و اعداد و حروف که میشه متغیرهاتون
با استفاده از ی پشته میتونی متغیرهارو جدا کنی و به ازای هر متغیر مثلا تکست باکسی و لیبلی رو add کنی به فرمت که کاربر بتونه از این طریق مقادیر رو وارد کنه و جایگزینی و محاسبه ی عبارت بازم با پشته ها
امیدوارم توضیحم مفید باشه
موفق باشی

همه مشکل من اینه که نمیتونم متغیر ها رو از هم جدا کنم
یکی به من کمک کنهه

capsloack
سه شنبه 30 آبان 1391, 21:38 عصر
http://upload.ustmb.ir/do.php?filename=20_12infixto-postfix.rar

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

capsloack
چهارشنبه 01 آذر 1391, 12:45 عصر
چی شد کسی نمیتونه کمک کنه؟

s3rv3r
چهارشنبه 01 آذر 1391, 13:25 عصر
با این الگوریتمی که پیاده کردید نبایدم بتونید که متغیرهارو جدا کنید. چون فقط و فقط روی یه عددی کار میکنه برای همین اگه متغییر چند کاراکتری باشه شدیدا به مشکل میخورید.
بشین الگوریتمو تغییر بده تا وقتی چندتا عدد کنار هم بود به عنوان یه عملوند بشناسه و بتونی بریزی تو پشته اینطوری میتونی متغیرر که چند کاراکتر هستش رو تشخیص بدی.
برنامتون هم کامل نیست.
کمی هم با ملایمت صحبت کنید همه از روی خیرخواهی جوابتون رو میدن بدهکار که نیستن عزیز

Mahmoud.Afrad
چهارشنبه 01 آذر 1391, 15:17 عصر
اینجا (http://barnamenevis.org/showthread.php?369710-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%85%DB%8C%D8%A7%D9%86%D9%88%D9%86%D8%AF%DB%8C-%D8%A8%D9%87-%D9%BE%D8%B3%D9%88%D9%86%D8%AF%DB%8C-%D9%88-%D9%85%D8%AD%D8%A7%D8%B3%D8%A8%D9%87-%D8%A2%D9%86-Infix-To-Postfix-and-Compute-Postfix) کامل توضیح دادم.
با اون چیزی که شما نوشتید متفاوته. برای پشته هم از کلاس Stack استفاده کردم که در دات نت موجود هست.

capsloack
چهارشنبه 01 آذر 1391, 20:25 عصر
ببخشید من اصلا قصد جسارت نداشتم...سوتفاهم شده....