RačunalaSoftver

RPN: algoritam, metode i primjeri

RPN jednom je temelj računalni programer na svijetu. Danas nije tako dobro poznato. Dakle, strip ilustraciju, prikazom „preokrenuti” poljske kobasice role vani, još uvijek može biti pogrešno neki obrazovan programera. Nije baš dobro objasniti šalu, ali u ovom slučaju to će biti u potpunosti opravdana.

infiks

Svi programeri, a većina studenata su upoznati s upotrebom operatora. Na primjer, izraz x + zbrajanje vrijednosti varijabli x i y koristi znak plus. Manje poznato je činjenica da je to posudio od matematike zapis pod nazivom utjerati notacija, u stvari, je veliki problem za strojeve. Ovaj operater prima jer su ulazni dvije vrijednosti zabilježene na lijevo i desno. U programiranju zapis koristi opcionalno sa znakovima operacija. Na primjer, x + y može biti napisan kao funkcija puta (x, y), u kojoj je prevodilac i na kraju pretvara utjerati notacija. Međutim, svatko zna da je matematika je previše dobro da ne koriste aritmetički izraz, koje tvore svojevrsnu internu mini-jezik u gotovo svakom programskom jeziku.

formula translator

Prvi stvarno uspješna Fortran programski jezik je postao tako velikoj mjeri, jer aritmetički izraz (npr formula ..) Ona pretvara (broadcast) u kodu, otuda i naziv za to - Formula prijevod. Prije toga, oni su pisati, na primjer, u obliku presavijeni funkcija (i umnožiti (b, c)). U COBOL problemom primjene automatskog formulu pretvorbe smatralo vrlo teško jer su programeri morali pisati stvari kao što Dodaj A do točke B Mutliply C.

Što nije u redu s utjerati?

Problem je u tome, da operatori imaju svojstva kao prednost i asocijativnosti. Zbog toga, definicija utjerati funkcija postaje ne-trivijalan zadatak. Na primjer, množenje ima veću prednost od toga ili oduzimanja, što znači da je izraz 2 + 3 * 4 nije jednak zbroju 2 i 3, pomnožen 4, jer bi se u obavljanju operatora s lijeva na desno. U stvari, množenje 3 za 4 i dodati 2. Ovaj primjer pokazuje da je izračun izražavanja utjerati često zahtijeva promjenu u poretku operatora i operanada. Osim toga, potrebno je koristiti aparatić da izgleda više jasan zapis. Na primjer, (2 + 3) * (4 + 5) ne može biti napisan bez zagrada, jer 2 + 3 * 4 + 5 znači da morate pomnožiti 3 po 4 i dodati 2 i 5.

Redoslijed u kojem želite izračunati operatera zahtijeva dugo pamtiti. Zbog toga, studenti koji počinju učiti aritmetiku, često se pogrešne rezultate, čak i ako su stvarne operacije izvode ispravno. Potrebno je naučiti redoslijed djelovanja izjava napamet. Prvo, radnja se mora provesti u zagradi, onda množenja i dijeljenja, te konačno zbrajanje i oduzimanje. No, postoji još jedan način pisanja matematičkih izraza kao utjerati notacija je samo jedan od mogućih „malih jezika” koje se mogu dodati više.

Prefiks i postfix notacija

Dva od najpoznatijih alternativa je snimiti operatera prije ili poslije svojih operanada. Oni su poznati kao prefiks i postfix notaciju. Logičar Yan Lukasevich izumio prvi u 1920. Živio je u Poljskoj, pa je zapis zove poljski. Postfix verzija, odnosno, zove obrnuta poljska notacija (ARF). Jedina razlika između ove dvije metode je smjer u kojem se pročitati zapisnik (s lijeva na desno ili desna na lijevo), pa dovoljno je razmotriti u detalje samo jedan od njih. OPN operater je napisan nakon svojih operanada. Tako, izraz AB + predstavlja primjer RPN za A + B.

Neograničen broj operanada

Neposredna prednost zapis je da sumira n-adske operatera i utjerati notacija stvarno radi samo s dva operanda, t. E. su sami po sebi prikladan samo za binarne operacije. Na primjer, ABC 'je obrnuto poljski izraz koristi trijadnoj oznaku koja je maksimalna vrijednost od A, B i C. U ovom slučaju operator djeluje na lijevo od tri operanda same i odgovara na funkciju poziva @ (A, B, C). Ako pokušate napisati @ simbol kao utjerati, kao što je @ BC ili nešto slično, postaje jasno da to jednostavno ne radi.

Dao po redu prvenstva

RPN ima još jednu prednost da je prioritet od operatora može biti zastupljena po nalogu svom izgledu. Istovremeno nikada ne treba aparatić, iako mogu biti uključeni kao znakovi operacije kako bi se olakšalo prebacivanje s utjerati notacija. Na primjer, AB + C * - jednoznačan ekvivalent (A + B) + C, tako da se ne može množenje izračunati do toga izvedena, što daje drugi operanda umnožavanja. To jest, ako je izračunata AB + C * od jednog operatora na vrijeme, dobili smo AB + * -> (AB +) * C -> (A + B), C *

algoritam izračuna

OPN operater izgleda isto kao funkcija koja se kao argumenti dvije vrijednosti napisano na njezinom lijevom. Osim toga, to je prirodni zapis za uporabu u programskim jezicima, kao način izračuna odgovara operacija stack i potreba za parsiranje se eliminira. Na primjer, odvodnik u izrazu 5 + 6 * 7 pojavit će se kao 5, 6, 7 *, +, a može se izračunati jednostavnim skeniranjem s lijeva na desno i pisati vrijednosti u stog. Kad god čest znak djelovanja, izabran od strane gornjeg elementa 2 memoriju računala, operater koristi, a rezultat se vraća u memoriju. Kada je krajnji rezultat izraza za izračun će biti u vrhu snopa.

Na primjer:

  • S = () 5, 6, 7, * + 5 stavi na stog.
  • S = (5) 6, 7, * + 6 stavi na stog.
  • S = (5, 6), 7 *, 7 + mjesto snop.
  • S = (5, 6, 7), * 2 + izbor vrijednosti iz dimnjaka, korištenje * i mjesto rezultat u hrpe.
  • S = (5, 6 * 7) = (5, 42) + 2 vrijednosti odabranih iz dimnjaka, primijeniti + i staviti rezultat u hrpe.
  • S = (5 + 42) = (47) izračun završeno, rezultat se sprema u vrhu dimnjaka.

Ovaj algoritam se može provjeriti RPN puta, ali svaki put to će raditi, bez obzira koliko je složena aritmetička izraza.

OPN i hrpe usko su povezani. Ovaj primjer pokazuje kako koristiti memoriju za izračunavanje vrijednosti obrnuta poljska notacija. Manje očigledno je da možete koristiti stog, pretvaranje standardne utjerati izraz u akutno zatajenje bubrega.

Primjeri programskih jezika

Pascal RPN shvatila ovako (pokazuje dio programa).

Za čitanje brojeva i operatora u ciklusu pod nazivom postupak, koji određuje da li tokena broj ili znak rada. U prvom slučaju, vrijednost pohranjena u stog, a drugi od dva gornja stog brojeva odgovara djelovanja obavlja i rezultat se sprema.

toktype: = num;

čitanje (s);

Ako u c [ '+', '-', '*', '/'] tada počinje

ako eoln onda cn: = '' drugo čitanje (CN);

ako cn = „” onda

slučaju

'+': Toktype: = dodati; '-': toktype: = sub;

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

kraj

inače početi

ako = '-' onda SG: = -1 drugi pogreške: = C <> '+';

s: = cn

kraj

kraj;

if (nije pogreška) i (toktype = num), zatim getnumber;

ako toktype <> num tada počinju

y = pop; X: = pop;

ako nije greška onda

Slučaj toktype od

dodati: z: = x + y; sub: z: = x-y; mul: z: = x * y; div: z: = x / y

kraj

guranje (z);

C implementacija RPN (prikazan dio programa):

za (e = strtok (s, m), a S = strtok (0, m)) {

a = strtod (s, e);

if (e> s) pritiskom (a);

# define rpnop (x) printf ( "% c:" * s), b = pop (), a = pop (), push (x)

inače ako (* s == '+') rpnop (a + b);

inače ako (* s == '-') rpnop (a - b);

ako (* s == '*') rpnop (a * b);

inače ako (* s == '/') rpnop (a / b);

#undef rpnop

}

hardverske implementacije

U one dane, kad je računalna tehnologija je vrlo skupo, to je mislio dobru ideju kako natjerati ljude da koriste odvodnika prenapona. U 1960-ih godina., Kao i sada, bilo je moguće kupiti računala, koja rade u obrnuta poljska notacija. Za dodavanje 2 i 3 od njih mora unijeti 2, zatim 3 i pritisnite „plus” gumb. Na prvi pogled, ulazni operandi za operatera činilo komplicirano i teško zapamtiti, ali nakon nekog vremena neki su ovisni o tom načinu razmišljanja i ne mogu shvatiti zašto drugi inzistiraju na glupe utjerati, koji je tako kompliciran i tako je ograničen.

Burroughs tvrtka čak izgradili mainframe, koja je imala nikakvu drugu memoriju, osim dimnjaka. Jedina stvar koja čini stroj - primijeniti algoritme i metode RPN na središnjem stogu. Sve svoje poslovanje su kao prenapona operatera, koji se odnosi na gornje vrijednosti n. Na primjer, tim je povratna adresa s vrha hrpe, i tako dalje. D. Arhitektura takav stroj je jednostavan, ali ne dovoljno brzo da se natječu s više od uobičajene arhitekture. Mnogi, međutim, još uvijek je žao što tako jednostavan i elegantan pristup računarstva gdje je svaki program bio izraz OPN, pronašao svoj nastavak.

Jednokratna kalkulatori s RPN bili popularni, a neki ljudi još uvijek im dati prednost. Osim toga, razvili su hrpu orijentiranih jezika, kao što je naprijed. Danas je to malo korišten, ali još uvijek nostalgična od svojih bivših korisnika.

Dakle, ono što je smisao vicevi o reverse Polish kobasica?

Ako pretpostavimo da je operator kobasica je utjerati notacija, to bi trebao biti u roli kao u konvencionalnoj hot dog. RPN nalazi se u dvije polovice dobiti spremna između njih nakon izračuna. Sada dolazi teži dio - senf. Ona je već na kobasice, t. E. Već izračunava se kao predznak. Smatra se da je senf također treba biti prikazan kao uncalculated i stoga ih treba premjestiti na desno od kobasica ... Ali, to je moguće, to bi zahtijevalo prevelik hrpu ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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