คอมพิวเตอร์ซอฟต์แวร์

RPN: ขั้นตอนวิธีการวิธีการและตัวอย่าง

RPN ครั้งเดียวรูปแบบพื้นฐานของโปรแกรมคอมพิวเตอร์ในโลก วันนี้มันไม่เป็นเช่นนั้นรู้จักกันดี ดังนั้นภาพประกอบการ์ตูน, ภาพวาด "ย้อนกลับ" ม้วนไส้กรอกโปแลนด์นอกยังสามารถเข้าใจผิดโดยโปรแกรมเมอร์ที่มีความรู้บางอย่าง ไม่ได้เป็นอย่างดีอธิบายเรื่องตลก แต่ในกรณีนี้มันจะเป็นธรรมอย่างเต็มที่

มัด

โปรแกรมเมอร์ทั้งหมดและนักเรียนส่วนใหญ่มีความคุ้นเคยกับการใช้งานของผู้ประกอบการ ยกตัวอย่างเช่นการแสดงออก x + ค่าบวกสำหรับตัวแปร x และ y ใช้เครื่องหมายบวก น้อยที่รู้จักกันดีคือความจริงที่ว่านี้ยืมมาจากสัญกรณ์คณิตศาสตร์ที่เรียกว่าสัญกรณ์มัดในความเป็นจริงเป็นปัญหาใหญ่สำหรับเครื่อง ผู้ประกอบการนี้ได้รับเป็น input สองค่าถูกบันทึกลงบนด้านซ้ายและขวา ในสัญกรณ์การเขียนโปรแกรมที่ใช้ตัวเลือกที่มีการดำเนินงานสัญญาณ ยกตัวอย่างเช่น x + y ที่สามารถเขียนเป็นฟังก์ชั่นของการพับ (x, y) ซึ่งในคอมไพเลอร์และในที่สุดก็แปลงสัญกรณ์มัด แต่ทุกคนรู้ว่าคณิตศาสตร์เป็นสิ่งที่ดีเกินไปที่จะไม่ใช้การแสดงออกทางคณิตศาสตร์ซึ่งรูปแบบชนิดของมินิภาษาภายในในเกือบทุกภาษาการเขียนโปรแกรม

แปลสูตร

ครั้งแรกที่ประสบความสำเร็จจริงๆการเขียนโปรแกรมภาษา Fortran ได้กลายเป็นส่วนใหญ่เพราะการแสดงออกทางคณิตศาสตร์ (เช่นสูตร .. ) มันแปลง (ออกอากาศ) ในรหัสเพราะฉะนั้นชื่อของมัน - สูตรแปล ก่อนที่พวกเขาจะต้องเขียนเช่นพับเก็บในรูปแบบของฟังก์ชั่น (และคูณ (B, C)) ในปัญหาของการใช้ภาษาโคบอลสูตรการแปลงโดยอัตโนมัติได้รับการพิจารณายากมากเพราะโปรแกรมเมอร์ต้องเขียนสิ่งที่ต้องการเพิ่ม A ไป B Mutliply โดยซี

อะไรคือสิ่งที่ผิดปกติกับมัด?

ปัญหาคือว่าผู้ประกอบการมีคุณสมบัติเช่นความสำคัญและเชื่อมโยงกัน ด้วยเหตุนี้ความหมายของฟังก์ชั่นมัดจะกลายเป็นงานที่ไม่น่ารำคาญ ยกตัวอย่างเช่นการคูณมีลำดับความสำคัญสูงกว่านอกจากนี้หรือลบซึ่งหมายความว่าการแสดงออก 2 + 3 * 4 ไม่เท่ากับผลรวมของ 2 และ 3 คูณด้วย 4 มันจะเป็นในการปฏิบัติงานของผู้ประกอบการจากซ้ายไปขวา ในความเป็นจริงคูณ 3 4 และเพิ่ม 2. ตัวอย่างนี้แสดงให้เห็นว่าการคำนวณในการแสดงออกมัดมักจะต้องมีการเปลี่ยนแปลงในการสั่งซื้อของผู้ประกอบการและถูกดำเนิน นอกจากนี้ยังมีความจำเป็นต้องใช้การจัดฟันจะมองโน้ตชัดเจนมากขึ้น ยกตัวอย่างเช่น (2 + 3) * (4 + 5) ไม่สามารถเขียนได้โดยไม่ต้องวงเล็บเพราะ 2 + 3 * 4 + 5 หมายความว่าคุณต้องคูณ 3 4 และเพิ่ม 2 และ 5

ลำดับที่คุณต้องการคำนวณผู้ประกอบการต้องมีความยาวจำ ด้วยเหตุนี้นักเรียนที่เริ่มเรียนรู้คณิตศาสตร์มักจะได้รับผลที่ไม่ถูกต้องแม้ว่าการดำเนินงานที่เกิดขึ้นจริงจะดำเนินการอย่างถูกต้อง มันเป็นสิ่งจำเป็นที่จะสอนสั่งของงบดำเนินการโดยการเต้นของหัวใจ ประการแรกการดำเนินการจะต้องดำเนินการในวงเล็บแล้วคูณและหารและในที่สุดก็บวกและการลบ แต่มีวิธีการเขียนนิพจน์ทางคณิตศาสตร์เป็นสัญกรณ์มัดอื่นเป็นเพียงหนึ่งที่เป็นไปได้ "ภาษาเล็ก" ที่สามารถเพิ่มให้มากขึ้น

คำนำหน้าและ postfix สัญกรณ์

สองทางเลือกที่รู้จักกันดีที่สุดคือการบันทึกผู้ประกอบการก่อนหรือหลังตัวถูกดำเนินการของ พวกเขาเป็นที่รู้จักกันเป็นคำนำหน้าและ postfix สัญกรณ์ ตรรกวิทยายานลูคาเซวิชคิดค้นครั้งแรกในปี 1920 เขาอาศัยอยู่ในโปแลนด์เพื่อบันทึกที่เรียกว่าโปแลนด์ รุ่น Postfix ตามลำดับเรียกว่าย้อนกลับโปแลนด์สัญกรณ์ (ARF) ข้อแตกต่างระหว่างทั้งสองวิธีเป็นทิศทางในการที่จะอ่านบันทึก (จากซ้ายไปขวาหรือขวาไปซ้าย) จึงพอเพียงที่จะพิจารณาในรายละเอียดเพียงหนึ่งของพวกเขา ผู้ประกอบการ OPN ถูกเขียนขึ้นหลังจากที่ถูกดำเนินการของ ดังนั้นการแสดงออก AB + เป็นตัวอย่าง RPN สำหรับ A + B.

ไม่ จำกัด จำนวนของตัวถูกดำเนินการ

ประโยชน์ทันทีของโน้ตก็คือว่ามันสรุปผู้ประกอบการ n-adic และสัญกรณ์มัดมันทำงานได้เฉพาะกับสองตัวถูกดำเนินการที. อีเป็นอย่างโดยเนื้อแท้เหมาะสำหรับฐานปฏิบัติการ ยกตัวอย่างเช่น ABC @ คือการแสดงออกโปแลนด์ย้อนกลับที่ใช้เครื่องหมาย triadic ซึ่งเป็นค่าสูงสุดของ A, B และ C ในกรณีนี้ผู้ประกอบการที่ทำหน้าที่เกี่ยวกับทางด้านซ้ายของตัวถูกดำเนินการสามตัวเองและสอดคล้องกับฟังก์ชั่นการโทร @ (A, B, C) ถ้าคุณพยายามที่จะเขียนสัญลักษณ์ @ เป็นมัด, เช่น A @ BC หรือสิ่งที่ต้องการก็เป็นที่ชัดเจนว่ามันก็ไม่ทำงาน

ลำดับความสำคัญที่ได้รับจากการสั่งซื้อ

RPN มีความได้เปรียบอีกว่ามีความสำคัญของผู้ประกอบการสามารถแสดงโดยลำดับการปรากฏตัวของพวกเขา ในเวลาเดียวกันไม่จำเป็นต้องวงเล็บแม้ว่าพวกเขาอาจจะรวมการดำเนินงานตัวอักษรเพื่อความสะดวกในการแปลงจากสัญกรณ์มัด ยกตัวอย่างเช่น AB + C * - เทียบเท่าโปร่งใส (A + B) * C ดังนั้นคูณไม่สามารถคำนวณจนถึงนอกจากนี้การดำเนินการซึ่งจะช่วยให้ตัวถูกดำเนินการที่สองสำหรับการคูณ นั่นคือถ้าคำนวณ AB + C * โดยหนึ่งในผู้ประกอบการในช่วงเวลาที่เราได้รับ AB + C * -> (AB +) * C -> (A + B) * ซี

ขั้นตอนวิธีการคำนวณ

ผู้ประกอบการ 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;

อ่าน (s);

ถ้าคใน [ '+', '-', '*', '/'] จากนั้นเริ่มต้น

ถ้า eoln แล้ว CN = '' อื่นอ่าน (CN);

ถ้า cn = '' แล้ว

กรณีของ

'+': Toktype = เพิ่ม; '-': toktype = ย่อย;

'*': Toktype = มัล; '/': Toktype = div

ปลาย

อื่นเริ่มต้น

ถ้า = '-' แล้ว SGN: = -1 อื่นข้อผิดพลาด: c = <> '+';

ด้วย: = CN

ปลาย

จบ;

(ถ้าไม่ผิดพลาด) และ (toktype = NUM) แล้ว getnumber;

ถ้า toktype <> NUM จากนั้นเริ่มต้น

การ y = ป๊อป; x = ป๊อป;

หากไม่ได้รับข้อผิดพลาดแล้ว

กรณี toktype ของ

เพิ่ม: Z = x + y ที่; ย่อย: Z = x-Y; มัล: Z = x * Y; div: Z = x y /

ปลาย

ผลักดัน (z);

C-การดำเนิน RPN (ส่วนแสดงของโปรแกรม):

สำหรับ (s = strtok (s, W); s; s = strtok (0, W)) {

A = strtod (s & E);

ถ้า (จ> s) ผลักดัน (ก);

#define rpnop (x) printf ( "% C:" * s), B = ป๊อป () a = ป๊อป () ผลักดัน (x)

อื่นถ้า (* s == '+') rpnop (A + B);

อื่นถ้า (* s == '-') rpnop (a - b);

อื่นถ้า (* s == '*') rpnop (a * b);

อื่นถ้า (* s == '/') rpnop (A / B);

rpnop #undef

}

การใช้งานฮาร์ดแวร์

ในวันนั้นเมื่อเทคโนโลยีคอมพิวเตอร์มีราคาแพงมาก ๆ ก็คิดความคิดที่ดีที่จะบังคับให้คนที่จะใช้ arresters กระชาก ในปี 1960 โอบอุ้ม. ในฐานะที่เป็นตอนนี้มันเป็นไปได้ที่จะซื้อเครื่องคิดเลขซึ่งทำงานในสัญกรณ์โปแลนด์ย้อนกลับ หากต้องการเพิ่มที่ 2 และ 3 ของพวกเขาจะต้องใส่ 2 แล้ว 3 และกดปุ่ม "บวก" ได้อย่างรวดเร็วก่อนที่ตัวถูกดำเนินการป้อนข้อมูลไปยังผู้ประกอบการที่ดูเหมือนซับซ้อนและยากที่จะจำ แต่หลังจากที่ในขณะที่บางคนกำลังติดอยู่กับวิธีคิดนี้และไม่เข้าใจว่าทำไมคนอื่น ๆ ยืนยันในการมัดโง่ซึ่งมีความซับซ้อนดังนั้นจึงมี จำกัด

บริษัท โรห์แม้กระทั่งสร้างเมนเฟรมซึ่งไม่มีหน่วยความจำอื่น ๆ ยกเว้นสแต็ค มีเพียงสิ่งเดียวที่ทำให้เครื่อง - ใช้ขั้นตอนวิธีการและวิธีการที่จะ RPN สแต็คกลาง ทั้งหมดของการดำเนินงานได้รับการยกย่องเป็นผู้ประกอบการ arresters ซึ่งนำไปใช้กับค่า n บน ยกตัวอย่างเช่นทีมเอาอยู่กลับมาจากด้านบนของสแต็คและอื่น ๆ . D. สถาปัตยกรรมของเครื่องดังกล่าวเป็นที่เรียบง่าย แต่ไม่เร็วพอที่จะแข่งขันกับสถาปัตยกรรมร่วมกันมากขึ้น แต่หลายคนก็ยังคงเสียใจความจริงที่ว่าวิธีการดังกล่าวที่เรียบง่ายและสง่างามในการใช้คอมพิวเตอร์โปรแกรมที่ทุกคนการแสดงออกของ OPN พบต่อเนื่อง

เครื่องคิดเลขหนึ่งเวลากับ RPN เป็นที่นิยมและบางคนยังคงให้พวกเขามีการตั้งค่า นอกจากนี้พวกเขาพัฒนาสแต็คที่มุ่งเน้นภาษาเช่น Forth วันนี้มันเป็นเล็ก ๆ น้อย ๆ ที่ใช้แล้ว แต่ยังคงคิดถึงจากผู้ใช้ในอดีตของเขา

ดังนั้นสิ่งที่เป็นเรื่องตลกที่มีความหมายเกี่ยวกับไส้กรอกย้อนกลับโปแลนด์?

ถ้าเราคิดว่าผู้ประกอบการของไส้กรอก, โน้ตมัดมันควรจะอยู่ในม้วนในขณะที่สุนัขร้อนธรรมดา RPN ตั้งอยู่ในสองส่วนได้รับ therebetween พร้อมหลังจากการคำนวณ ตอนนี้มาเป็นส่วนที่ยาก - มัสตาร์ด เธอมีอยู่แล้วในไส้กรอกที. อีคำนวณแล้วเป็นผู้ประกอบการเอก เป็นที่เชื่อว่ามัสตาร์ดควรที่จะแสดงให้เห็นว่า uncalculated และดังนั้นจึงควรจะย้ายไปทางขวาของไส้กรอก ... แต่ก็เป็นไปได้นี้จะต้องสแต็คที่มีขนาดใหญ่เกินไป ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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