מחשביםתוכנה

RPN: אלגוריתם, שיטות ודוגמאות

RPN פעם היווה את הבסיס של מתכנת מחשבים בעולם. היום הוא לא כל כך מוכר. לכן, איור קומיקס, מתאר "הפוך" רולס נקניק פולני בחוץ, יכול עדיין להיות מובן על ידי כמה מתכנתים בעלי ידע. לא כל כך טוב להסביר את הבדיחה, אבל במקרה הזה זה יהיה מוצדק לחלוטין.

Infix

כל המתכנתים, ורוב התלמידים מכירים את השימוש מפעיל. לדוגמא, ביטוי x + ערכי סיכום עבור x משתנה סימן פלוס משומש y. פחות ידועה היא העובדה כי זה בהשאלה בסימון מתמטיקה, שנקרא סימון Infix, למעשה, היא בעיה גדולה עבור מכונות. אופרטור זה מקבל בתור שני ערכי קלט נרשמים על ימין ועל השמאל. בתכנות ייצוג השתמש אופציונאלי עם פעולות סימנים. לדוגמא, x + y יכול להיכתב כפונקציה של קיפול (x, y), שבו המהדר ולבסוף ממירת סימון Infix. עם זאת, כולם יודע את המתמטיקה היא טובה מדי לא להשתמש בביטויים אריתמטיים, המהווים מעין בשפה מיני פנימית כמעט בכל שפת תכנות.

מתרגם נוסחא

שפת תכנות פורטרן באמת המוצלחת הראשונה הפכה כל כך בעיקר משום ביטוי אריתמטי (כלומר נוסחא ..) זה המרה (שידור) בקוד, ומכאן השם של אותו - פורמולה התרגום. לפני כן, הם היו צריכים לכתוב, למשל, מקופלים בצורת פונקציות (ולהתרבות (ב, ג)). בשנת בעיה COBOL יישום נוסחת המרה אוטומטית נחשב קשה מאוד בגלל המתכנתים היו צריכים לכתוב דברים כמו להוסיף A ל- B Mutliply ידי C.

מה לא בסדר עם Infix?

הבעיה היא, שיש המפעילים תכונות כגון קדימות ו אסוציאטיבי. בגלל זה, ההגדרה של פונקצית Infix הופכת משימה לא טריוויאלית. לדוגמא, יש כפל עדיפות גבוהה יותר מאשר פעולות חיבור וחיסור, כלומר ביטוי 2 + 3 * 4 הם לא שווה לסכום של 2 ו 3, מוכפל 4, כפי שזה יהיה בביצוע של המפעילים משמאל לימין. למעשה, להכפיל 3 על ידי 4 ולהוסיף 2. דוגמא זו ממחישה כי החישוב של ביטוי Infix קרובות דורש שינוי הסדר למפעילים האופרנדים. בנוסף, יש צורך להשתמש בסוגריים כדי להיראות סימון ברור יותר. לדוגמה, (2 + 3) * (4 + 5) לא ניתן לכתוב בלי סוגריים, כי 2 + 3 * 4 + 5 אומר שאתה צריך להכפיל 3 על ידי 4 ולהוסיף 2 ו 5.

ההסדר שבו אתה רוצה לחשב את המפעילים דורש זמן לזכור. מסיבה זו, תלמידים שמתחילים ללמוד חשבון, לעתים קרובות להשיג את התוצאות הלא הנכונות, גם אם הפעולות בפועל מבוצעות כהלכה. יש צורך ללמד את סדר משפטי פעולה בעל פה. ראשית, הפעולה חייבת להתבצע בסוגריים, אז כפל וחילוק, ולבסוף חיבור וחיסור. אבל יש עוד דרך כתיבת ביטויים מתמטיים כמו סימון Infix הוא רק אחד "בשפות הקטנות" ייתכן כי ניתן להוסיף יותר.

סימון קידומת postfix

שתי החלופות הידועות ביותר היא להקליט את המפעיל לפני או אחרי האופרנדים שלה. הם ידועים בתור סימון קידומת postfix. לוגיקן יאן Lukasevich המציא את הראשון ב 1920. הוא חי בפולין, ולכן התיעוד נקרא פולני. גרסת Postfix, בהתאמה, שנקראה הפוך פולני סימון (ARF). ההבדל היחיד בין שתי השיטות הללו הוא הכיוון שבו לקרוא את השיא (משמאל לימין או מימין לשמאל), אז זה מספיק כדי לשקול בפירוט רק אחד מהם. מפעיל OPN נכתב לאחר האופרנדים שלה. לפיכך, הביטוי AB + מייצג דוגמה RPN עבור A + B.

מספר בלתי מוגבל של האופרנדים

היתרון המיידי של סימון הוא שזה מסכם את מפעיל n-ADIC ו- סימון Infix הוא באמת עובד רק עם שני האופרנדים, t. E. הוא מטבעם מתאים רק פעולה בינארית. לדוגמא, ABC @ הוא הביטוי הפולני הפוך באמצעות סימן טריאדית המהווה את הערך המקסימאלי של A, B ו- C. במקרה זה יפעל המפעיל בצד השמאל של האופרנד השלוש עצמו מתאים @ קריאה לפונקציה (A, B, C). אם אתה מנסה לכתוב את הסימן @ כפי Infix, כגון A BC @ או משהו כזה, מתברר כי זה פשוט לא עובד.

העדיפות שניתנה לפי הפקודה

יש RPN יתרון נוסף כי העדיפות של המפעיל יכולה להיות מיוצגת על ידי סדר הופעתם. במקביל לעולם צריך מסולסלים, למרות שהם עשויים להיכלל כפעילות תווים כדי להקל על המרה מ סימון Infix. לדוגמא, AB + C * - שווה ערך חד משמעי (A + B) * C, ולכן הכפל לא ניתן לחשב עד בנוסף בצע, אשר נותנת האופרנד שני לכפל. כלומר, אם המפעיל AB + C * ידי המחושב אחד בכל פעם, אנחנו מקבלים AB + C * -> (AB +) * C -> (A + B) * ג

אלגוריתם חישוב

מפעיל OPN נראה זהה פונקציה שלוקחת כטיעונים שני ערכים שנכתבו על השמאל שלה. בנוסף, מדובר בסימון טבעי לשימוש בשפות תכנות, כמו אופן החישוב שלה תואם את פעולות ערימה ואת הצורך בניתוח מתבטל. לדוגמה, arrester בביטוי 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 וערימות מתקיים קשר הדוק. דוגמא זו ממחישה כיצד להשתמש בזיכרון כדי לחשב את הערך של הסימון הפולני ההפוך. פחות ברור הוא כי אתה יכול להשתמש במחסנית, המרת ביטוי Infix הסטנדרטי אי ספיקת כליות חריפה.

דוגמאות של שפות תכנות

פסקל RPN הבין ככה (מראה את החלק של התוכנית).

כדי לקרוא את המספרים ואת המפעילים במחזור נקרא הליך, אשר קובע אם מבצע מספר או סימן האסימון. במקרה הראשון, את הערך מאוחסן המחסנית, והשני של שתי הפעולה המתאימה מספרת ערימה העליונה מבוצע והתוצאה מאוחסנת.

toktype: = num;

לקרוא (ים);

אם ג ב [ '+', '-', '*', '/'] אז מתחילים

אם eoln אז cn: = '' לקרוא אחר (CN);

אם cn = "" אז

במקרה של

'+': Toktype: = להוסיף; '-': toktype: = משנה;

'*': Toktype: = mul; '/': Toktype: = div

סוף

אחר להתחיל

אם = '-' אז SGN: = -1 שגיאה אחרת: c = <> '+';

עם: = cn

סוף

בסופו;

אם (לא שגיאה) ו (toktype = num) אז getnumber;

אם toktype <> num אז מתחיל

y = הפופ; x: = הפופ;

אם לא שגיאה אז

במקרה toktype של

להוסיף: z: = x + y; תת: z: = x-y; mul: z: = x * y; div: z: = x / y

סוף

דחיפה (z);

C-יישום RPN (חלק המוצג של התוכנית):

עבור (s = strtok (ים, w); s; s = strtok (0, w)) {

a = strtod (ים, & E);

אם (ה> ים) דחיפה (א);

#define rpnop (x) printf ( "% c:", * s), B = פופ (), פופ = (), דחיפה (x)

אחר אם (* s == '+') rpnop (a + b);

אחר אם (* s == '-') rpnop (א - ב);

אם אחר (* s == '*') rpnop (A * B);

אחר אם (* s == '/') rpnop (a / b);

rpnop #undef

}

יישומי חומרה

באותם ימים, כאשר טכנולוגית מחשב הייתה מאוד יקרה, היה נהוג לחשוב רעיון טוב כדי להכריח אנשים להשתמש arresters גל. בשנת 1960-ies., כמו עכשיו, אפשר היה לקנות את המחשבונים, אשר פועלים על פי שיטה פולנית הפוכה. כדי להוסיף 2 ו 3 מהם חייבים להיכנס 2, אז 3, ולחץ על הכפתור "פלוס". במבט ראשון, האופרנדים קלט למפעיל נראה מסובך וקשה לזכור, אבל אחרי כמה זמן כמה מכורים דרך החשיבה הזאת ולא יכולתי להבין מדוע אחרים מתעקשים על Infix טיפש, שהוא כל כך מורכב, לכן הוא מוגבל.

החברה בורוז אפילו בנה מיינפריים, אשר לא היה זיכרון אחר, למעט ערימה. הדבר היחיד שהופך את המכונה - ליישם האלגוריתמים ושיטות RPN אל הערימה המרכזית. כל פעילותה נחשבו מפעילים מכבאי, אשר חל על ערכי n העליונים. לדוגמא, צוות לקח את כתובת השולח מהחלק העליון של הערימה, וכן הלאה. ד הארכיטקטורה של מכונה כזו היה פשוט, אבל לא מהר מספיק כדי להתחרות עם הארכיטקטורות נפוצות יותר. רב, לעומת זאת, עדיין מצר על כך שגישה פשוטה ואלגנטית מחשובים שבו כל תכנית הייתה ביטוי של OPN, מצאה את ההמשכה.

מחשבוני פעם אחת עם RPN היו פופולריים, ויש אנשים עדיין נותנים להם העדפה. בנוסף, הם פיתחו בשפות ערימה מוכווני, כגון Forth. היום זה קצת משומש, אבל עדיין נוסטלגי מהמשתמשים שלו לשעבר.

אז מה היא בדיחות המשמעות לגבי נקניק הפוך פולני?

אם נניח כי המפעיל של הנקניק, בסימון Infix, זה צריך להיות בתוך הגליל כמו נקניקייה קונבנציונלית. RPN ממוקם ממש בשני חצאי לקבל therebetween מוכן לאחר החישוב. עכשיו מגיע החלק הקשה - חרדל. היא כבר על נקניק, t. E. מחושב כבר כמפעיל אונרי. הוא האמין כי חרדל צריך גם לראות כמו uncalculated ולכן יש להעביר לצד ימין של נקניק ... אבל זה אפשרי, זה ידרוש ערימה גדולה מדי של ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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