تبدیل عبارت میانوندی به پسوندی
سلام روز بخیر من ی سورس برای تبدیل عبارت میانوندی ب پسوندی گرفتم و تقریبا متوجه شدم چی گفته ی چندتا ارور هم داشت ک تونستم اصلاحشون کنم اما عبارت پسوندی رو چاپ نمیکنه می تونین راهنماییم کنین؟
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ ۵۱ ۵۲ ۵۳ ۵۴ ۵۵ ۵۶ ۵۷ ۵۸ ۵۹ ۶۰ ۶۱ ۶۲ ۶۳ ۶۴ ۶۵ ۶۶ ۶۷ ۶۸ ۶۹ ۷۰ ۷۱ ۷۲ ۷۳ ۷۴ ۷۵ ۷۶ ۷۷ ۷۸ ۷۹ ۸۰ ۸۱ ۸۲ ۸۳ ۸۴ ۸۵ ۸۶ ۸۷ ۸۸ ۸۹ ۹۰ ۹۱ ۹۲ ۹۳ ۹۴ ۹۵ ۹۶ ۹۷ ۹۸ ۹۹ ۱۰۰ ۱۰۱ ۱۰۲ ۱۰۳ ۱۰۴ ۱۰۵ ۱۰۶ ۱۰۷ ۱۰۸ ۱۰۹ ۱۱۰ ۱۱۱ ۱۱۲ ۱۱۳ ۱۱۴ ۱۱۵ ۱۱۶ ۱۱۷ ۱۱۸ ۱۱۹ ۱۲۰ ۱۲۱ ۱۲۲ ۱۲۳ ۱۲۴ ۱۲۵ ۱۲۶ ۱۲۷ ۱۲۸ ۱۲۹ ۱۳۰ ۱۳۱ ۱۳۲ ۱۳۳ ۱۳۴ ۱۳۵ ۱۳۶ ۱۳۷ ۱۳۸ ۱۳۹ ۱۴۰ ۱۴۱ ۱۴۲ ۱۴۳ ۱۴۴ ۱۴۵ ۱۴۶ ۱۴۷ ۱۴۸ ۱۴۹ ۱۵۰ ۱۵۱ ۱۵۲ ۱۵۳ ۱۵۴ ۱۵۵ ۱۵۶ ۱۵۷ ۱۵۸ |
#include "stdafx.h"//این دستور معمولا توسط نرم افزار ویژال استدیو نوشته می شود و در واقع کتابخانه ای که برای اجرای برنامه لازم هست را به برنامه اضافه می کند #include<iostream>// این کتابخانه برای چاپ اطلاعات در خروجی استفاده می گردد. در خط پایینی یک namespace معرفی شده است. #include<stdio.h>// اجازه دسترسی به هدرهای io استاندارد کتابخانه استاندارد و هدر کار با رشته ها و تعریف نوع رشته ای را می دهند. //#include<conio.h>وجودش لازم نیست*** یک هدرفایل غیراستاندارد سی است که بیشتر در کامپایلرهای اماس-داس برای فراهمکردن امکانات ورودی/خروجی در کنسول استفاده شدهاست. conio.h جزء هیچ یک از کتابخانه استاندارد سی، آنسی سی و پازیکس نیست. #include<string.h>// اجازه دسترسی به هدرهای io استاندارد کتابخانه استاندارد و هدر کار با رشته ها و تعریف نوع رشته ای را می دهند. using namespace std;//رخی از دستورات سی پلاس پلاس دارای namespace هستند. مثلا اگر ما این خط را ننوشته باشیم باید در زمان استفاده از دستور cout از این روش استفاده کنیم. std.cout که برای کوتاه تر شدن برنامه ها در ابتدای برنامه این namespace را به برنامه اعلام می نماییم. class stack//تعریف کلاسی برای پشته { int top;//عنصر بالایی در پشته ک با استفاده ازش می تونیم عملیات حذف و اضافه و ... رو داشته باشیم char *starry;//اشاره گری به پشته برای دسترسی به پشته int size;//اندازه ارایه public://قسمت عمومی کلاس پشته ک در اون تابع سازنده و حذف و اضافه کردن و همچنین تابع پر بودن نوشته شده stack(int);//تابع سازنده char pop();//حذف کردن char maxposhte(); void push(char ch);//اضافه کردن }; stack::stack(int s){ size = s; top = -۱;//یعنی پشته هست اما خالیه starry = new char(size);//تعریف حافظه پویا برای پشته } char stack::pop()//تابع popمخصوص حذف از پشته از کلاس پشته { char ret; if (top != -۱)//همون کار تابع isempity رو انجام میده میگه ا/ه تاپ مخالف منفی یک باشه یعنی تو پشته ی عنصری باشهاون عنصرر رو در متغییر رت ذخیره کن و تاپ رو یدونه کم کن و رت رو برگردون ب تابع پاپ یعنی رت رو حذف کن { ret = starry[top]; top--; return ret; } else//اگر پته خالی بود یعنی تاپ منفی یک شد شارپ رو برگردون return '#'; } void stack::push(char ch)//تابعی برای اضافه کردن عنصر { if (top != size - ۱)//اینکه بفهمیم پشته پر نیست و میشه ی عنصر جدید اضاف کرد ک می توانستیم یک تابع isfullبنویسیم ک ب این شکل هم مشکلی نداره. { top++;// تاپ هم یکی بیتر میکنیم starry[top] = ch;//پشته پر نیست پس این عنصر جدید رد ب عنوان تاپ ذخیره میکنیم } } char stack::maxposhte() { char ch; if (top != -۱) ch = starry[top]; else ch = '#'; return ch; } const int size = ۵۰; char mianvand[size], pasvand[size]; int arzesh(char ch); int main() { for (;;) { stack kk(۵۰); system("cls");//برای پاک کردن صفحه کنسولی گذاشتمش اگه اینو نمینوشتم پشت سر هم بعد ی بار اجرا مینوشت عبارت میانوندی را وارد کنید cout << "\n\n\n\t\t\tebarete mianvandi ra vared konid :" << "\n\n\n\t\t\t\t\t"; char x, y; int prep, pre, j = ۰, chk = ۰; char popped; char*gets(mianvand);//می خوایم ارایه بگیریم از این دستور استفاده می کنیم و ارایه میانوندی رو میگیریم ک از جنس کاراکتر و اشاره گره for (int i = ۰; mianvand[i] != ۰; i++) { if (mianvand[i] != '('&&mianvand[i] != ')'&&mianvand[i] != '^'&&mianvand[i] != '*'&&mianvand[i] != '/'&&mianvand[i] != '+'&&mianvand[i] != '-') { pasvand[j] = mianvand[i];//در اینجا اگر عبارتی وارد شود ک مخالف اپریتور های بالا باشد اوپرندش در خروجی چاپ می شود j++; } else if (mianvand[i] == '(')//در غیر این صورت اگر پرانتز باز, بودعبارت در پشته اضافه بشه { y = mianvand[i]; kk.push(y); } else if (mianvand[i] == ')')//اگر پرانتز بسته بود اون عبارت در عنصری ذخیره بشه و { popped = kk.pop(); while (popped != '(') { pasvand[j] = popped; j++; popped = kk.pop(); } } else//در غیر این صورت عبارت در وای ذخیره بشه و ارزش عبارت در پری ذخیره بشهو عبارتی ک در پشته قرار داره تابع ماکس پشته رو براش فراخونی کنیدو ارزش عنصر ک توی شته است در پریپ ذخیره بشه { y = mianvand[i]; pre = arzesh(y); x = kk.maxposhte(); prep = arzesh(x); if (pre > prep)//اگر ارزش عبارتی ک می خوادوارد پشته بشه بیشتر باشهاون رو اضافه کن kk.push(y); else//در غیر این صورت یعنی اگه ارزش عبارت ک می خواد وارد پشته بشه کمتر مساوی عبارت داخل پشته بود { while (prep >= pre) { if (x == '#')//اگر داخل پشته #بود از وایل خارج بشو break; popped = kk.pop();// و*اما اگه عبارتی در پشته وجود داشت با شرط فوقاون عنصر و از پشته حذف کن x = kk.maxposhte();//ماکس پشته رو ب عنصر دیگه میده pasvand[j] = popped;//*و در عبارت پسوندی ذخیره اش کن j++; prep = arzesh(x);//ارزش عنصری ک ماکس پشته شد مجددا در چری ذخیره میشه و دوباره برسی میشه وایل } kk.push(y);//در انتحا عنصر اخر ب پشته اضافه میشه } } } while ((popped = kk.pop()) != '#')//اگر عنصری ک از پشته حذف کردیم مخالف#باشه تو پسوندی ببرش و جی ی دونه اضافه بشه { pasvand[j] = popped; j++; } cout << "\n\n\n\t\t\t\t\t "; for (int i = ۰; pasvand[i]; i++)//عبارت پسوندی چاپ بشه { if (pasvand[i] != '(') cout << pasvand[i]; } cin.get(); } } int arzesh(char ch) { switch (ch) { case '^': return ۵; case '/': return ۴; case '*': return ۴; case '+': return ۳; case '-': return ۳; default: return ۰; } } |
پاسخ ها ( 1 )
سلام
تکه کد زیر هم مربوط به عملیات تبدیل عبارت میانوندی به پیشوندی است:
موفق باشید
ممنون از جوابتون اما من متوجه مشکل برنامه تبدیل عبارت پسوندی نمی شم می خوام با دستور coutعبارت رو نشون بدم اما نمیدونم مشکل چیه ک عبارت پسوندی رو نشون نمیده اگه بلدین ممنون میشم راهنمایی کنید
متاسفانه با زبان C آشنایی زیاد ندارم