TietokoneetOhjelmistot

RPN: algoritmi, menetelmät ja esimerkit

RPN kerran muodosti perustan tietokoneohjelmoija maailmassa. Nykyään se ei ole niin tunnettu. Siksi koominen kuva, joka kuvaa "käänteinen" puola makkara rullina ulkopuolella, voi silti olla väärin joidenkin asiantunteva ohjelmoijat. Ei kovin hyvin selittää vitsi, mutta tässä tapauksessa se on täysin perusteltua.

infix

Kaikki ohjelmoijat, ja useimmat opiskelijat tuntevat operaattoreiden käyttöä. Esimerkiksi ilmaisu x + summattu arvot x ja y käytetty plus-merkki. Vähemmän tunnettua on se, että tämä on lainattu matematiikan merkinnöillä nimeltään infix merkintä, itse asiassa, on suuri ongelma koneita. Tämä operaattori vastaanottaa tulona kaksi arvot kirjataan vasemmalle ja oikealle. Ohjelmointi merkintätapaa käytetään mahdollisesti merkkejä toimintaa. Esimerkiksi, x + y voidaan kirjoittaa funktiona kertaiseksi (x, y), jossa kääntäjä ja lopulta muuntaa infix merkintätapa. Kuitenkin kaikki tietävät matematiikka on liian hyvä olla käyttämättä aritmeettinen ilmaisuja, jotka muodostavat eräänlaisen sisäisen mini-kieli lähes kaikissa ohjelmointikieli.

kaava kääntäjä

Ensimmäinen todella onnistunut Fortran ohjelmointikieli on tullut niin pitkälti siksi aritmeettinen lauseke (eli kaava ..) Se muunnettiin (broadcast) koodissa, joten nimi on - Formula Translation. Ennen sitä, ne piti kirjoittaa, esimerkiksi, muotoon laskostetun toimintoja (ja kerrotaan (b, c)). COBOL ongelma täytäntöönpanon automaattista muuntamista kaavan pidettiin erittäin vaikeaa, koska ohjelmoijat piti kirjoittaa esimerkiksi lisätä A paikkaan B Mutliply C.

Mitä vikaa infix?

Ongelmana on, että operaattoreilla on ominaisuuksiltaan sellainen edelle ja assosiatiivisuus. Tämän vuoksi määritelmä infix toiminto tulee ei-triviaali tehtävä. Esimerkiksi lisääntyminen on suurempi etusija kuin lisäys tai vähennys, mikä tarkoittaa sitä, että ilmaisu 2 + 3 * 4 ei ole yhtä suuri kuin summa 2 ja 3, kerrottuna 4, koska se olisi suorituskykyä operaattorit vasemmalta oikealle. Itse asiassa, kerrotaan 3 4 ja lisätä 2. Tämä esimerkki osoittaa, että laskettaessa infix ilmaisu edellyttää usein muutoksen järjestyksessä toimijoiden ja operandien. Lisäksi on tarpeen käyttää henkselit näyttää enemmän selkeitä merkintätapaa. Esimerkiksi (2 + 3) * (4 + 5) ei voi kirjoittaa ilman sulkuja koska 2 + 3 * 4 + 5 tarkoittaa, että sinun täytyy kertoa 3 4 ja lisätään 2 ja 5.

Järjestys, jossa haluat laskea toimijoille vaatii pitkän muistaa. Tämän vuoksi opiskelijat, jotka alkavat oppia aritmeettinen, usein saada väärän tuloksia, vaikka todellinen operaatiot suoritetaan oikein. On tarpeen opettaa järjestyksessä toiminnan lausuntojen ulkoa. Ensimmäinen, kanteen on suoritettava sulkeissa, sitten kerto- ja jakolasku, ja lopulta ja vähennyslaskua. Mutta on toinen tapa kirjoittaa matemaattisia ilmaisuja kuin infix merkintätapa on vain yksi mahdollinen "pieniä kieliä", joka voidaan lisätä enemmän.

Etuliite ja postfix merkintätapa

Kaksi tunnetuimpia vaihtoehtoja on kirjata operaattorin ennen tai jälkeen sen operandien. Ne tunnetaan etuliite ja postfix merkintätapa. Logician Yan Lukasevich keksi ensimmäisenä vuonna 1920. Hän asui Puolassa, joten levy on nimeltään puola. Postfix versio vastaavasti nimeltään Käänteinen puolalainen notaatio (ARF). Ainoa ero näiden kahden menetelmän on suunta, johon lukea kirjaa (vasemmalta oikealle tai oikealta vasemmalle), niin se riittää, kun tarkastellaan yksityiskohtaisesti vain yksi niistä. OPN operaattori on kirjoitettu jälkeen operandit. Näin ollen ilmaisumuoto AB + esittää esimerkkiä RPN A + B

Rajattomasti operandien

Välitön etu merkintä on, että se on yhteenveto n- adic operaattori ja infix merkintätapa on todella toimii vain kahden operandin, t. E. ovat luonnostaan soveltuu vain binäärioperaatio. Esimerkiksi ABC @ on päinvastainen Puolan ilmaisu käyttäen kolmisointuisten tavaramerkki, joka on suurin arvo A, B ja C. Tässä tapauksessa operaattori toimii vasemmalla kolmen operandin itse ja vastaa funktiokutsu @ (A, B, C). Jos yrität kirjoittaa @ -merkki kuin infix kuten @ BC tai jotain, on selvää, että se ei yksinkertaisesti toimi.

Antaman ensisijaisen tilauksen

RPN on toinenkin etu, että prioriteetin operaattorit voivat edustaa järjestyksessä niiden ulkonäköä. Samanaikaisesti ei tarvitse henkselit, vaikka ne voidaan sisällyttää merkkiä toiminnan helpottamiseksi muuntaminen infix merkintätapaa. Esimerkiksi, AB + C * - yksiselitteinen vastaava (A + B) * C, niin kertominen ei voida laskea, kunnes lisäys suoritetaan, joka antaa toisen operandin kertomiseen. Eli jos laskettu AB + C * yhden operaattorin kerrallaan, saamme AB + C * -> (AB +) * C -> (A + B) * C.

laskenta-algoritmi

OPN operaattori näyttää samalta kuin funktio, joka vie argumentteina kaksi arvoa kirjoitettu hänen vasemmalla. Lisäksi se on luonnollinen merkintä käytettäväksi ohjelmointikieliä, kuten niiden laskentatapa vastaa pinon toimintaa ja tarve jäsennys on eliminoitu. Esimerkiksi pysäytyslaite lauseke 5 + 6 * 7 näkyy 5, 6, 7 *, +, ja se voidaan laskea yksinkertaisesti skannaus vasemmalta oikealle ja kirjoittaa arvot pinon. Kun yhteinen merkki toimintaa, valitaan ylempi elementti 2 tietokoneen muistiin, käyttäjä käyttää ja tulos palautetaan muistiin. Kun lopputulos laskulauseke tulee olemaan pinon päälle.

Esimerkiksi:

  • S = () 5, 6, 7, *, + 5 sijoitetaan pinoon.
  • S = (5) 6, 7, *, + 6 sijoitetaan pinoon.
  • S = (5, 6), 7 * 7 + sijoittaa pino.
  • S = (5, 6, 7), * 2 + valita arvot pinosta, käyttö * ja aseta tulos pinossa.
  • S = (5, 6 * 7) = (5, 42) + 2-arvot on valittu pinosta, soveltaa + ja esittää tuloksen pinossa.
  • S = (5 + 42) = (47) laskenta on valmis, tulos tallennetaan pinon päälle.

Tämä algoritmi voidaan tarkistaa RPN toistuvasti, mutta joka kerta se toimii, ei väliä kuinka monimutkainen aritmeettinen lauseke.

OPN ja pinot liittyvät läheisesti toisiinsa. Tämä esimerkki osoittaa, miten käyttää muistia laskea arvon käänteisen Puolan merkintätapa. Vähemmän selvää on se, että voidaan käyttää pinoa, muuntaa standardi infix ilmentymisen akuutti munuaisten vajaatoiminta.

Esimerkkejä ohjelmointikieliä

Pascal RPN toteuttaa näin (esitetty osa ohjelmaa).

Lukea numerot ja toimijoiden sykli kutsutaan menettelyä, joka määrittää, onko merkki numero tai merkki toimintaa. Ensimmäisessä tapauksessa, tallennettu arvo pinossa, ja toinen kahden ylemmän pinon vastaavat numerot toiminto suoritetaan ja tulos tallennetaan.

toktype: = luku;

luettu (t);

jos c [ '+', '-', '*', '/'] sitten alkaa

jos eoln sitten cn: = '' muun luettaviksi (CN);

jos cn = '' sitten

Jos kyseessä on

'+': Toktype: = lisätä; '-': toktype: = sub;

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

pää

muuten alkaa

jos a = '-' sitten sgn: = -1 muu virhe: = c <> '+';

jossa: = cn

pää

end;

jos (ei virhe) ja (toktype = num) sitten getnumber;

jos toktype <> num sitten alkaa

y = pop; X: = pop;

jos ei virhe sitten

tapaus toktype of

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

pää

push (z);

C-toteuttamiseen RPN (esitetty osa ohjelmaa):

ja (s = strtok (s, w), s; s = strtok (0, w)) {

a = strtod (s, ja e);

jos (e> t) push (a);

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

else if (* t == '+') rpnop (a + b);

else if (* t == '-') rpnop (a - b);

else if (* t == '*') rpnop (a * b);

else if (* t == '/') rpnop (a / b);

#undef rpnop

}

laitteistototeutuksiin

Niinä päivinä, jolloin tietotekniikan oli erittäin kallis, ajateltiin hyvä pakottaa ihmisiä käyttämään ylijännitesuojat. 1960-luvulla., Kuten nytkin, oli mahdollista ostaa laskimet, jotka toimivat päinvastaisessa Puolan merkintätapa. Lisätä 2 ja 3 heistä on kirjoitettava 2, sitten 3, ja paina "plus" -painiketta. Ensi silmäyksellä, tulo operandit operaattorille näytti monimutkainen ja vaikea muistaa, mutta jonkin ajan kuluttua jotkut ovat riippuvaisia tämän ajattelutavan eikä voinut ymmärtää, miksi toiset vaativat tyhmä infix, joka on niin monimutkainen ja niin on rajallinen.

Burroughs yhtiö jopa rakensi mainframe, jolla ei ollut muuta muistia, paitsi pino. Ainoa asia, joka tekee kone - sovellettu algoritmit ja menetelmät RPN keskusyksikköön pino. Kaikessa toiminnassaan pidettiin ylijännitesuojat operaattorit, jota sovelletaan ylemmän n arvoa. Esimerkiksi joukkue otti Palautusosoitteen ylhäältä pinon, ja niin edelleen. D. arkkitehtuuria tällaisen koneen oli yksinkertainen, mutta ei ole tarpeeksi nopea kilpailemaan enemmän laitealustoille. Monet kuitenkin edelleen valitettavaa, että tällainen yksinkertainen ja tyylikäs lähestymistapa computing jossa jokainen ohjelma oli ilmaus OPN, löysi sen jatkaminen.

Kerran laskimet RPN olivat suosittuja, ja jotkut vielä antaa heille etusija. Lisäksi he kehittivät pino suuntautunut kielet, kuten Forth. Nykyään se on vähän käytetty, mutta silti nostalginen entiseltä käyttäjille.

Joten mitä tarkoittaa vitsit Käänteinen puolalainen makkara?

Jos oletetaan, että operaattori makkaraa, infix merkintä, se olisi telan sisällä kuten tavanomaisessa hot dog. RPN sijaitsee aivan kahteen puoliskoon valmiina välissä jälkeen laskentaa. Nyt tulee vaikea osa - sinappi. Hän on jo makkaraa, t. E. jo laskettu yksipaikkainen operaattori. Uskotaan, että sinapin tulisi näkyä myös niin uncalculated ja siksi se olisi siirrettävä oikealle makkaran ... Mutta se on mahdollista, tämä vaatisi liian suuri nippu ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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