CalculatoareSoftware-ul

RPN: algoritm, metode și exemple

RPN a format o dată pe baza unui programator de calculator din lume. Astăzi nu este atât de bine cunoscut. Prin urmare, ilustrare de benzi desenate, reprezentând un „Reverse“ rulouri cârnați polonezi din afară, poate încă fi înțeleasă greșit de către unii programatori informați. Nu foarte bine explica gluma, dar în acest caz va fi pe deplin justificată.

infix

Toate programatori, și cei mai mulți studenți sunt familiarizați cu utilizarea operatorilor. De exemplu, valorile de expresie x + însumare pentru variabilele x și y semnul plus folosit. Mai puțin cunoscut este faptul că acest lucru este împrumutat de la matematică notație, numita notatie infix, de fapt, este o mare problemă pentru mașinile. Acest operator primește ca intrare două valori sunt înregistrate pe stânga și pe dreapta. În programarea notație utilizată opțional cu operații semne. De exemplu, x + y poate fi scrisă ca funcție de ori (x, y), în care compilatorul și în cele din urmă convertește notatie infix. Cu toate acestea, toată lumea știe matematica este prea bine să nu folosească expresii aritmetice, care formează un fel de mini-limbaj intern în aproape orice limbaj de programare.

formula traducător

Prima într-adevăr cu succes limbajul de programare Fortran a devenit atât de mare măsură, deoarece expresia aritmetică (de exemplu, formula ..) convertit (difuzare) în codul, de aici numele de ea - FORMULA de traducere. Înainte de aceasta, au trebuit să scrie, de exemplu, îndoite sub formă de funcții (și se multiplică (b, c)). În problema COBOL de punere în aplicare a formulei de conversie automată a fost considerată foarte dificilă, deoarece programatorii trebuiau să scrie lucruri, cum ar fi Adauga la A la B Mutliply de C.

Ce este în neregulă cu infix?

Problema este, că operatorii au proprietăți, cum ar fi prioritate și asociativitate. Din acest motiv, definiția funcției infix devine sarcină non-triviale. De exemplu, multiplicarea are prioritate mai mare decât adunare sau scădere, ceea ce înseamnă că expresia 2 + 3 * 4 nu este egal cu suma de 2 și 3, înmulțit cu 4, așa cum ar fi în performanța operatorilor de la stânga la dreapta. De fapt, se înmulțește cu 3 până la 4 și se adaugă 2. Acest exemplu ilustrează că calculul expresiei infix necesită adesea o schimbare în ordinea operatorilor și operanzi. În plus, este necesar să se folosească acolade să se uite notație mai clare. De exemplu, (2 + 3) * (4 + 5) nu pot fi scrise fără paranteze, deoarece 2 + 3 * 4 + 5 înseamnă că trebuie să se multiplice 3 cu 4 și se adaugă 2 și 5.

Ordinea în care doriți să calculeze operatorii necesită o lungă amintesc. Din acest motiv, elevii care încep să învețe aritmetică, de multe ori obține rezultate greșite, chiar dacă operațiunile reale sunt efectuate corect. Este necesar să se predea ordinea declarațiilor de acțiune prin inimă. În primul rând, acțiunea trebuie să fie efectuată în paranteze, apoi înmulțire și împărțire, și în cele din urmă adunare și scădere. Dar există un alt mod de a scrie expresii matematice ca notație infixat este doar una dintre posibilele „limbi mici“, care pot fi adăugate la mai mult.

Prefixul și postfix notație

Două dintre alternativele cele mai bine cunoscute este de a înregistra operatorul înainte sau după operanzilor. Acestea sunt cunoscute sub numele notația prefix și postfix. Logician Yan Lukasevich a inventat primul în 1920. El a trăit în Polonia, astfel încât înregistrarea este numit polonez. versiunea Postfix, respectiv, numit Reverse polonez Notația (ARF). Singura diferență între aceste două metode este direcția în care să citească înregistrarea (de la stânga la dreapta sau de la dreapta la stânga), astfel încât este suficient să se ia în considerare în detaliu doar unul dintre ele. Operatorul OPN este scris după operanzilor. Astfel, expresia AB + reprezintă un exemplu RPN pentru A + B.

Număr nelimitat de operanzi

Avantajul imediat al notație este că acesta rezumă operatorul n-adice și notație infixat este într-adevăr funcționează numai cu doi operanzi, t. E. sunt în mod inerent adecvat numai pentru operațiunile binare. De exemplu, ABC @ este inversă expresia poloneză folosind marca triadic care este valoarea maximă a A, B și C. În acest caz, operatorul acționează din partea stângă a trei operandului în sine și corespunde unui apel funcții @ (A, B, C). Dacă încercați să scrie simbolul @ ca infix, cum ar fi un @ BC sau ceva de genul asta, devine clar că pur și simplu nu funcționează.

Prioritatea acordată de ordinea

RPN are un alt avantaj în faptul că prioritatea operatorilor poate fi reprezentat de ordinea apariției lor. În același timp, nu au nevoie de aparat dentar, deși acestea pot fi incluse ca operațiunile de caractere pentru a facilita conversia de la notația infix. De exemplu, AB + C * - echivalent neambiguă (A + B) * C, astfel încât multiplicarea nu poate fi calculată până când adăugarea efectuată, care dă un al doilea operand pentru înmulțire. Aceasta este, în cazul în care calculată AB + C * de un operator, la un moment dat, obținem AB + C * -> (AB +) * C -> (A + B) * C.

algoritmul de calcul

Operatorul OPN arată la fel ca și o funcție care are ca argumente două valori scrise pe stânga ei. În plus, este o notație naturală pentru utilizare în limbaje de programare, ca modul de calcul al acestuia corespunde operațiunilor stiva și nevoia de parsare este eliminat. De exemplu, descărcătorul în expresia 5 + 6 * 7 va apărea ca 5, 6, 7 *, +, și se poate calcula simplu prin scanarea de la stânga la dreapta și scrie valorile într-o stivă. Ori de câte ori un semn comun de funcționare, selectate de către elementul superior 2 din memoria calculatorului, operatorul este utilizat, iar rezultatul a revenit în memorie. În cazul în care rezultatul final al expresiei de calcul va fi în vârful stivei.

De exemplu:

  • S = () 5, 6, 7, *, + 5 plasat pe stivă.
  • S = (5) 6, 7, *, + 6 plasat pe stivă.
  • S = (5, 6), 7 *, 7 + plasa stiva.
  • S = (5, 6, 7), * 2 + alege valori din stivă, utilizarea * și plasează rezultatul în stivă.
  • S = (5, 6 * 7) = (5, 42) + 2 valori selectate din stivă, pentru a aplica + și pune rezultatul în stivă.
  • S = (5 + 42) = (47) de calcul este finalizată, rezultatul este stocat în vârful stivei.

Acest algoritm poate fi verificat RPN în mod repetat, dar de fiecare dată când va funcționa, indiferent de cât de complex expresia aritmetică.

OPN și stive sunt strâns legate. Acest exemplu demonstrează modul de utilizare a memoriei pentru a calcula valoarea notația poloneză inversă. Mai puțin evident este că puteți utiliza stiva, de conversie de expresie infix standard, în insuficiența renală acută.

Exemple de limbaje de programare

Pascal RPN a dat seama ca aceasta (arata partea programului).

Pentru a citi numerele și operatorii din ciclul numit procedură, care determină dacă numărul sau semnul operației jeton. În primul caz, valoarea stocată în stivă, iar a doua a acțiunii corespunzătoare a două numere de stivă superioare se realizează, iar rezultatul este stocat.

toktype: = num;

citit (e);

în cazul c în [ '+' '-' '*', '/'] apoi începe

în cazul în care eoln apoi cn: = '' citește altceva (cn);

dacă cn = „“ atunci

cazul unei

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

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

capăt

else begin

dacă o = '-' apoi sgn: = -1 altă eroare: = c <> '+';

cu: = cn

capăt

se încheie;

dacă (nu eroare) și (toktype = num) atunci getnumber;

dacă toktype <> num începe apoi

y = pop; x: = pop;

în cazul în care nu de eroare, atunci

caz de toktype

adaugă: z: = x + y; sub: z: = x-y; Mul: z: = x * y; div: z: = x / y

capăt

împingere (z);

RPN C-implementare (partea prezentată a programului):

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

a = strtod (s, & e);

în cazul în care (e> s) împingere (a);

#define rpnop (x) printf ( "% c:", * s), b = pop (), o = pop (), împingere (x)

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

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

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

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

rpnop #undef

}

implementări hardware

În acele zile, atunci când tehnologia informatică a fost foarte scump, sa gândit o idee bună pentru a forța oamenii să folosească descărcătoare. În 1960-e., Ca și acum, a fost posibil să cumpere calculatoare, care lucrează în notația poloneză inversă. Pentru a adăuga 2 și 3 dintre ele trebuie să intre 2, apoi 3, și apăsați butonul „plus“. La prima vedere, operanzii de intrare operatorului părea complicat și dificil de reținut, dar după un timp unele sunt dependent de acest mod de a gândi și a nu putea înțelege de ce ceilalți insista pe infixat prost, care este atât de complicat și așa este limitată.

compania Burroughs a construit chiar și un mainframe, care a avut nici o altă memorie, cu excepția stivă. Singurul lucru care face ca mașina - a aplicat algoritmi și metode RPN la stiva centrală. Toate operațiunile sale au fost considerate ca operatori descărcătoare, care se aplică la valorile n superioare. De exemplu, echipa a luat adresa expeditorului din partea de sus a stivei, și așa mai departe. D. Arhitectura unei astfel de mașini a fost simplu, dar nu suficient de rapid pentru a concura cu cele mai comune arhitecturi. Mulți, cu toate acestea, încă regret faptul că o astfel de abordare simplă și elegantă pentru calcul în cazul în care fiecare program a fost o expresie a OPN, găsit continuarea acesteia.

Un calculatoare de timp cu RPN au fost populare, iar unii oameni încă le dea preferință. În plus, ei au dezvoltat un orientate spre stiva de limbi, cum ar fi Forth. Astăzi este puțin folosită, dar încă nostalgic de la foștii săi utilizatori.

Deci, ce este sensul glume despre cârnați Reverse polonez?

Dacă presupunem că operatorul cârnați, notația infix, ar trebui să fie în cadrul ruloul în hot dog convențional. RPN este situat chiar în două jumătăți obține gata după calcul între ele. Acum vine partea dificilă - muștar. Ea este deja pe cârnații, t. E. deja calculată ca un operator unar. Se crede că muștar ar trebui să fie, de asemenea, indicat ca necalculate și, prin urmare, ar trebui să fie mutat la dreapta cârnați ... Dar este posibil, acest lucru ar necesita teanc prea mare de ...

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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