کامپیوترنرمافزار

RPN: الگوریتم، روش ها و نمونه

RPN یک بار اساس یک برنامه نویس کامپیوتر در جهان شکل گرفته است. امروز آن است که به خوبی شناخته شده است. بنابراین، تصویر کمیک، به تصویر می کشد "معکوس" لهستانی رول سوسیس خارج، می تواند هنوز هم توسط برخی از برنامه نویسان آگاه اشتباه گرفته شود. نه خیلی خوب توضیح شوخی، اما در این مورد از آن خواهد شد به طور کامل توجیه.

نشاندن

همه برنامه نویسان، و بیشتر دانش آموزان با استفاده از اپراتورهای آشنا هستند. به عنوان مثال، ارزش عبارت x + جمع برای متغیرهای x و y علامت مثبت استفاده می شود. کمتر شناخته شده این واقعیت است که این از نماد ریاضی، به نام نشانهگذاری میانوندی قرض گرفته، در واقع، یک مشکل بزرگ برای ماشین آلات است. این اپراتور دریافت به عنوان ورودی دو مقدار در سمت چپ و راست ثبت شده است. در برنامه نویسی نماد اختیاری با عملیات نشانه استفاده می شود. به عنوان مثال، x + y می تواند به عنوان یک تابع از برابر (X، Y)، که در آن کامپایلر و در نهایت تبدیل نشانهگذاری میانوندی نوشته شده است. با این حال، همه می دانند که ریاضی خیلی خوب است به استفاده از عبارات ریاضی، که یک نوع از داخلی مینی زبان به صورت تقریبا در هر زبان برنامه نویسی نیست.

ترجمه فرمول

اولین واقعا موفق زبان برنامه نویسی فرترن تبدیل شده است تا حد زیادی به دلیل عبارت حسابی (یعنی فرمول ..) آن را در کد تبدیل (پخش)، از این رو نام آن را - فرمول ترجمه. قبل از آن، آنها مجبور به ارسال، برای مثال، خورده در قالب توابع (و تکثیر (B، C)). در مشکل کوبول اجرای فرمول تبدیل اتوماتیک بسیار دشوار در نظر گرفته شد به این دلیل که برنامه نویسان مجبور به نوشتن چیزهایی مانند A را با B Mutliply توسط C.

چه اشکالی با میانوند است؟

مشکل این است که اپراتورهای دارای خواص مانند مقدم و associativity. به این دلیل، تعریف تابع میانوند کار غیر بدیهی شود. به عنوان مثال، ضرب سابقه دارد بالاتر از جمع یا تفریق، به این معنی که + 3 * 4 عبارت 2 است به مجموع 2 و 3، 4 ضرب شده توسط برابر نیست، آن را به عنوان در عملکرد اپراتورهای شود از چپ به راست. در واقع، ضرب 3 در 4 و اضافه کردن 2. این مثال نشان میدهد که در محاسبه عبارت میانوندی اغلب نیاز به تغییر در نظم اپراتورها و عملوند هستند. علاوه بر این، لازم است به استفاده پرانتز به نگاه نماد روشن تر باشد. به عنوان مثال، (2 + 3) * (4 + 5) را نمی توان بدون پرانتز نوشته شده است، چون 2 + 3 * 4 + 5 بدان معنی است که شما نیاز به ضرب 3 در 4 و اضافه کردن 2 و 5.

منظور که در آن شما می خواهید برای محاسبه اپراتورهای نیاز به یک مدت طولانی به یاد داشته باشید. به این دلیل، دانش آموزان که شروع به یادگیری ریاضی، اغلب نتایج غلط است، حتی اگر عملیات واقعی به درستی انجام شده است. آن را به آموزش منظور از اظهارات عمل توسط قلب ضروری است. اول، عمل باید در پرانتز، و سپس ضرب و تقسیم، و در نهایت جمع و تفریق انجام شده است. اما راه دیگری نوشتن عبارات ریاضی به عنوان نماد میانوند است تنها یکی از امکان "زبان کوچک" است که می تواند به بیشتر اضافه شده است.

پیشوند و پسوند نماد

دو تا از گزینه های شناخته شده ترین است برای ضبط اپراتور قبل یا بعد از عملوند آن است. آنها به عنوان پیشوند و پسوند نماد شناخته شده است. منطق دان یان Lukasevich برای اولین بار در سال 1920 اختراع شد. او در لهستان زندگی می کردند، به طوری که رکورد به نام لهستانی. نسخه پسوند، به ترتیب، به نام نشانه گذاری معکوس لهستانی (ARF). تنها تفاوت بین این دو روش جهت که در آن برای خواندن رکورد (از چپ به راست یا راست به چپ) است، پس از آن کافی است به در جزئیات فقط یکی از آنها. اپراتور OPN پس از عملوندهای خود را نوشته شده است. بنابراین، بیان AB + نشان دهنده یک مثال RPN برای A + ب

تعداد نامحدود از عملوند

مزیت فوری نماد این است که آن را خلاصه اپراتور N-adic به و نشانهگذاری میانوندی است که واقعا تنها با دو عملوند کار می کند، تی. E. ذاتا مناسب فقط برای عملیات دودویی. به عنوان مثال، ABC @ بیان معکوس لهستانی با استفاده از علامت سه گانه است که حداکثر مقدار A، B و C در این مورد اپراتور در سمت چپ از سه عملوند خود عمل می کند و مربوط به یک فراخوانی تابع @ است (A، B، C). اگر شما سعی می کنید به نوشتن علامت @ به عنوان میانوند، مانند A @ قبل از میلاد و یا چیزی شبیه به آن، روشن می شود که آن را به سادگی کار نمی کند.

اولویت داده شده توسط سفارش

RPN دارای مزیت دیگری در این اولویت از اپراتورهای را می توان با سفارش از ظاهر خود نشان داده است. در همان زمان هرگز پرانتز نیاز دارید، اگر چه آنها ممکن است شامل به عنوان شخصیت های عملیات به منظور تسهیل در تبدیل از نشانهگذاری میانوندی. به عنوان مثال، AB + C * - معادل بدون ابهام (A + B) * گراد، بنابراین ضرب نمی توان تا علاوه بر انجام، می دهد که یک عملوند دوم برای ضرب محاسبه می شود. است که، اگر محاسبه AB + C * توسط یک اپراتور در یک زمان، ما AB + C * -> (AB +) * C -> (A + B) * C.

الگوریتم محاسبه

اپراتور OPN همان یک تابع است که طول می کشد به عنوان آرگومان دو مقدار در سمت چپ او نوشته شده است به نظر می رسد. علاوه بر این، آن را به یک نماد طبیعی برای استفاده در زبان های برنامه نویسی است، به عنوان نحوه محاسبه آن مربوط به عملیات پشته و نیاز به تجزیه حذف شده است. به عنوان مثال، گیر در بیان 5 + 6 * 7 به عنوان یک 5، 6، 7 *، + ظاهر خواهد شد، و می توان آن را به سادگی با اسکن محاسبه شده از چپ به راست و ارسال مقادیر در پشته. هر زمان که یک علامت مشترک از عمل، انتخاب شده توسط عنصر بالا 2 از حافظه کامپیوتر، اپراتور استفاده می شود و در نتیجه بازگشت و به حافظه است. هنگامی که نتیجه نهایی بیان محاسبه خواهد شد در بالای پشته باشد.

به عنوان مثال:

  • S = () 5، 6، 7، *، + 5 قرار داده شده در پشته.
  • S = (5) 6، 7، *، + 6 قرار داده در پشته.
  • S = (5، 6)، 7 * 7 + مشخصات، پشته.
  • S = (5، 6، 7)، * 2 + را انتخاب کنید ارزش از پشته، استفاده * و محل در نتیجه در پشته.
  • S = (5، 6 * 7) = (5، 42) + 2 مقادیر انتخاب شده از پشته، به درخواست های + و نتیجه را در پشته.
  • S = (5 + 42) = (47) محاسبه کامل شده است، در نتیجه در بالای پشته ذخیره می شود.

این الگوریتم را می توان بررسی RPN بارها و بارها، اما هر بار آن کار خواهد کرد، بدون توجه به چگونه پیچیده عبارت حسابی.

OPN و پشته نزدیک مرتبط است. این مثال چگونگی استفاده از حافظه برای محاسبه ارزش از نماد معکوس لهستانی. کمتر آشکار است که شما می توانید پشته استفاده، تبدیل عبارت میانوندی استاندارد در نارسایی حاد کلیه.

نمونه هایی از زبان های برنامه نویسی

پاسکال RPN متوجه مثل این (نشان می دهد بخشی از برنامه).

برای خواندن اعداد و اپراتورها در چرخه به نام روش، که آیا تعداد و یا ثبت نام عملیات رمز را تعیین میکند. در مورد اول، مقدار ذخیره شده در پشته، و دوم از دو عدد در پشته بالا اقدام مربوطه انجام شده و در نتیجه ذخیره شده است.

toktype: = NUM.

به عنوان خوانده شده (بازدید کنندگان)؛

اگر c در [ '+'، '-'، '*'، '/'] پس از آن شروع

اگر پس از آن eoln CN: = '' دیگری خوانده (CN)؛

اگر CN = '' پس از آن

مورد

'+': Toktype: = اضافه کنید. '-': toktype: = زیر؛

"*": Toktype: = MUL؛ '/': Toktype: = دیو

پایان

دیگری شروع

اگر a = '-' پس از آن SGN: = -1 خطای دیگری: = ج <> '+'؛

با: = CN

پایان

پایان؛

اگر (خطا نیست) و (toktype = NUM) پس از آن getnumber؛

اگر toktype <> NUM پس از آن شروع

Y = پاپ؛ X: = پاپ؛

اگر نه پس از آن خطا

مورد toktype از

اضافه کنید: Z: = X + Y؛ زیر: Z: = X-Y؛ MUL: Z: = X * Y؛ دیو: Z: = X / Y

پایان

فشار (Z).

RPN C از اجرا (قسمت نشان داده شده است از برنامه):

برای (بازدید کنندگان = strtok (S، W)؛) S = strtok (0، W؛ بازدید کنندگان) {

A = strtod (بازدید کنندگان، و ه)؛

اگر (E> بازدید کنندگان) فشار (یک)؛

# تعریف rpnop (X) تابع () printf ( "٪ ج:"، * ها)، ب = پاپ ()، یک = پاپ ()، فشار (X)

دیگری اگر (* بازدید کنندگان == '+') rpnop (A + B)؛

دیگری اگر (* بازدید کنندگان == '-') rpnop (- ب)؛

دیگری اگر (* بازدید کنندگان == '*') rpnop (A * B)؛

دیگری اگر (* بازدید کنندگان == '/') rpnop (A / B)؛

rpnop #undef

}

پیاده سازی سخت افزاری

در آن روزها، زمانی که تکنولوژی کامپیوتر بسیار گران بود، آن را یک ایده خوب تصور می شد به زور مردم را به استفاده از برقگیرها. در سال 1960، می نماید.، در حال حاضر، آن را ممکن است به خرید ماشین حساب، که در نماد معکوس لهستانی کار بود. برای اضافه کردن 2 و 3 از آنها باید 2 و سپس 3 را وارد کنید، و دکمه "به همراه" را فشار دهید. در نگاه اول، عملوندها ورودی به اپراتور پیچیده و دشوار به یاد داشته باشید به نظر می رسید، اما پس از در حالی که برخی معتاد به این طرز تفکر هستند و نمی توانستم بفهمم چرا دیگران در میانوند احمقانه است که خیلی پیچیده است و به همین محدود است، اصرار دارند.

شرکت باروز حتی یک پردازنده مرکزی، که تا به حال هیچ حافظه دیگر، به جز پشته ساخته شده است. تنها چیزی که باعث می شود دستگاه - الگوریتم ها و روش RPN به پشته مرکزی اعمال می شود. تمام عملیات آن به عنوان برقگیرهای اپراتورهای، که شامل مقادیر N بالا در نظر گرفته شد. به عنوان مثال، تیم آدرس برگشت از بالای پشته را گرفت، و به همین ترتیب. D. معماری مانند یک ماشین ساده بود، اما به اندازه کافی سریع است به رقابت با معماری شایع تر است. بسیاری از افراد هنوز هم این واقعیت است که چنین رویکرد ساده و ظریف به محاسبات که در آن هر برنامه بیان OPN بود، پیدا شده است ادامه آن پشیمانی.

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

پس چه جوک معنای مورد معکوس لهستانی سوسیس است؟

اگر فرض کنیم که اپراتور از سوسیس، نشانهگذاری میانوندی، آن را باید در رول در سگ داغ متعارف باشد. RPN واقع شده است درست در دو نیمه از therebetween آماده پس از محاسبه. حال حاضر می آید بخشی از مشکل - خردل. او در حال حاضر در سوسیس، تی. E. حال حاضر به عنوان یک عملگر یگانی محاسبه می شود. اعتقاد بر این است که خردل نیز باید به عنوان حساب نشده ای نشان داده می شود و در نتیجه باید به سمت راست از سوسیس نقل مکان کرد ... اما ممکن است، این امر نیاز به پشته بیش از حد بزرگ از ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 fa.atomiyme.com. Theme powered by WordPress.