<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog despre resurse educaţionale din IT</title>
	<atom:link href="http://resurse-educationale.uv.ro/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://resurse-educationale.uv.ro</link>
	<description>Cu informatii pentru dezvoltare personala, dar şi pentru studentţi, elevi, profesori, webmasteri, programatori</description>
	<lastBuildDate>Fri, 27 Jan 2012 01:12:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>CONCEPTE DE BAZĂ ALE PROGRAMĂRII  ORIENTATE OBIECT</title>
		<link>http://resurse-educationale.uv.ro/?p=198</link>
		<comments>http://resurse-educationale.uv.ro/?p=198#comments</comments>
		<pubDate>Wed, 14 Sep 2011 13:31:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[clase]]></category>
		<category><![CDATA[mostenire]]></category>
		<category><![CDATA[obiecte]]></category>
		<category><![CDATA[pe obiect]]></category>
		<category><![CDATA[polimorfism]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[programare]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=198</guid>
		<description><![CDATA[9.1.  INTRODUCERE   Termenul &#8220;OOP&#8221; (&#8220;Object Oriented Programming&#8221;) desemnează disciplina programării obiectuale (orientate-obiect). Această disciplină care are la bază ideea unificării datelor cu modalităţile de prelucrare a acestora şi manevrează entităţi reprezentate sub formă de obiecte (obiect=date+cod de tratare a &#8230; <a href="http://resurse-educationale.uv.ro/?p=198">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p align="center"><strong>9.1.  INTRODUCERE</strong></p>
<p align="center"><strong> </strong></p>
<p>Termenul &#8220;OOP&#8221; (&#8220;<strong>O</strong>bject <strong>O</strong>riented <strong>P</strong>rogramming&#8221;) desemnează disciplina programării obiectuale (orientate-obiect). Această disciplină care are la bază ideea unificării datelor cu modalităţile de prelucrare a acestora şi manevrează entităţi reprezentate sub formă de <strong>obiecte</strong> (obiect=date+cod de tratare a acestor date).</p>
<p>&nbsp;</p>
<p>Aşa cum s-a subliniat în capitolul 1.3., rezolvarea unei probleme se poate face pe 3 direcţii:</p>
<p>q  Rezolvarea <em>orientată pe algoritm</em> (pe acţiune), în care organizarea datelor este neesenţială;</p>
<p>q  Rezolvarea <em>orientată pe date</em>, acţiunile fiind determinate doar de organizarea datelor;</p>
<p>q  Rezolvarea <em>orientată obiect</em>, care combină tendinţele primelor două abordări.</p>
<p>&nbsp;</p>
<p>Programarea obiectuală oferă posibilităţi de <strong>modelare </strong>a obiectelor, a proprietăţilor şi a relaţiilor dintre ele, dar şi posibilitatea de a <strong>descompune</strong> o problemă în componentele sale (soft mai mentenabil, adaptabil, reciclabil). Câteva exemple de limbaje de programare orientată obiect: SIMULA(1965), SIMULA-2(1967), Smalltalk, C++, Java (în plus, Java poate fi considerat un limbaj de programare orientată eveniment).</p>
<p><strong> </strong></p>
<p><strong>Facilităţile</strong> oferite de programarea orientată obiect (conform lui Pascou) sunt:</p>
<ol>
<li>abstractizarea datelor;</li>
<li>moştenirea;</li>
<li>încapsularea (ascunderea)  informaţiei;</li>
<li>legarea dinamică (“târzie”).</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><strong>9.2.  ABSTRACTIZAREA DATELOR</strong></p>
<p>&nbsp;</p>
<p>Obiectele sunt componente software care modelează fenomene din lumea reală. În general, un fenomen implică tipuri diferite de obiecte. Obiectele care reprezintă aceeaşi idee sau concept sunt de acelaşi <strong>tip</strong> şi pot fi grupate în <strong>clase</strong> (<em>concrete</em> sau <em>abstracte</em>). Clasele implementează tipuri de date (aşa cum s-a subliniat în capitolul 2, un tip de date înseamnă o mulţime de valori pentru care s-a adoptatat un anumit mod de reprezentare şi o muţime de operatori care pot fi aplicaţi acestor valori), deci şi operatorii destinaţi manipulării acestora:<strong> </strong><strong>Clasă = Date + Operaţii</strong><strong>.</strong></p>
<p>De exemplu, programatorul îşi poate defini tipul (clasa) matrice şi operatorii care pot fi aplicaţi matricilor (* pentru înmulţirea a două matrici, + pentru adunarea a două matrici, &#8211; pentru scăderea a două matrici, etc). Astfel, el poate folosi tipul matrice în mod similar unui tip predefinit:</p>
<p>matrice A, B;</p>
<p>matrice C=A+B;</p>
<p><strong>Tipul</strong> unui obiect (şablon al obiectului) este o <strong>clasă</strong>. O clasă se caracterizează prin: numele clasei, atribute, funcţii şi relaţii cu alte clase.</p>
<p><strong>Instanţa</strong> este un obiect dintr-o clasă (A, B, C sunt obiecte, instanţe ale clasei matrice) şi are proprietăţile definite de clasă. Pentru o clasă definită, se pot crea mai multe instanţe ale acesteia. Toate obiectele au o <strong>stare</strong> şi un <strong>comportament</strong>. <strong><em>Starea</em></strong> unui obiect se referă la elementele de date conţinute în obiect şi la valorile asociate acestora (datele membre). <strong><em>Comportamentul</em></strong> unui obiect este determinat de care acţiunile pe care obiectul poate să le execute (metodele).</p>
<p><strong>Atributele </strong>specificate în definiţia unei clase <strong>descriu valoric proprietăţile</strong> obiectelor din clasă, sub diferite aspecte. Cele mai multe limbaje orientate obiect fac următoarea distincţie între atribute:</p>
<p>q  atribute ale clasei (au aceeaşi valoare pentru toate instanţele clasei);</p>
<p>q  atribute ale instanţei (variază de la o instanţă la alta, fiecare instanţă având propria copie a atributului).</p>
<p>În limbajul C++ atributele se numesc <strong>date membre</strong>. Toate datele membre sunt atribute instanţă. Atributele de clasă se pot obţine în cazul datelor membre statice (aceeaşi adresă de memorare pentru orice instanţă a clasei).</p>
<p><span id="more-198"></span></p>
<p><strong>Metode (funcţii membre)</strong>. La definirea unei clase se definesc şi metodele acesteia (numite şi funcţii membre). Fiecare obiect are acces la un set de funcţii care descriu operaţiile care pot fi executate asupra lui. Metodele pot fi folosite de instanţele clasei respective, dar şi de instanţele altor clase (prin mecanismul moştenirii).</p>
<p>Clasa conţine atât structurile de date necesare descrierii unui obiect, cât şi metodele care pot fi aplicate obiectului. Astfel, gradul de abstractizare este, mult mai ridicat, iar programele devin mult mai uşor de înţeles, depanat sau întreţinut.</p>
<p>&nbsp;</p>
<p>La crearea unui obiect, alocarea memoriei se poate fi face <em>static</em> sau <em>dinamic</em> (cu ajutorul unor funcţii membre speciale, numite <strong><em>constructori</em></strong>). Eliberarea memoriei se realizează cu ajutorul unor funcţii membre speciale, numite <strong><em>destructori</em></strong>, în momentul încheierii existenţei obiectului respectiv.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><strong>9.3.  MOŞTENIREA</strong></p>
<p>&nbsp;</p>
<p>Moştenirea este o caracteristică a limbajelor de programare orientate obiect, care permite refolosirea codului şi extinderea funcţionalităţii claselor existente. Între două clase pot exista multe diferenţe, dar şi multe asemănări. Este bine ca informaţia comună unor clase să fie specificată o singură dată (conceptul de <strong><em>clasă/subclasă</em></strong>, <strong><em>superclas</em></strong><strong><em>ă</em></strong><strong><em>/clasă</em></strong> în OOP). Mecanismul moştenirii permite crearea unei ierarhii de clase şi trecerea de la clasele generale la cele particulare. Procesul implică la început definirea clasei de bază care stabileşte calităţile comune ale tuturor obiectelor ce vor deriva din bază (ierarhic superioară)(figura 9.1.). Prin moştenire, un obiect poate prelua proprietăţile obiectelor din clasa de bază.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>&nbsp;</p>
<p><strong>9.3.1.  MOŞTENIREA UNICĂ</strong></p>
<p>&nbsp;</p>
<p>În cazul moştenirii unice, fiecare clasă are doar o superclasă. Există <em>două modalităţi de specializare </em>a unei clase de bază<em>:</em></p>
<p>q  introducerea de<em> extra-atribute</em> şi<em> extra-metode</em> în clasa derivată (particulare doar clasei derivate);</p>
<p>q  <em>redefinirea membrilor </em>în clase derivate<em> (polimorfism).</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>9.3.2.  MOŞTENIREA MULTIPLĂ</strong></p>
<p>&nbsp;</p>
<p>În situaţia moştenirii multiple, o clasă are mai multe superclase. Astfel, moştenirea clasei va fi multiplă (rezultând o structură de reţea).</p>
<table cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="20" height="5"></td>
<td width="308"></td>
<td width="41"></td>
<td width="236"></td>
</tr>
<tr>
<td height="1"></td>
<td colspan="2"></td>
<td rowspan="2" align="left" valign="top"></td>
</tr>
<tr>
<td height="221"></td>
<td rowspan="2" align="left" valign="top"></td>
</tr>
<tr>
<td height="3"></td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p><em> </em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Moştenirea multiplă este utilă, dar poate crea <strong>ambiguităţi</strong> (când pentru acelaşi atribut se moştenesc valori diferite). Există mai multe <strong>strategii de rezolvare a conflictului</strong> (părintele cel mai apropiat, cel mai depărtat, etc.). Deasemenea, este posibilă o <strong>moştenire repetată</strong>, în care o clasă ajunge să moştenească de la aceeaşi clasă, pe drumuri diferite în reţea (vezi figura 9.3., în care clasa E moşteneşte de la aceeaşi clasă A, pe drumurile A-B-E, A-C-E) . Aşa cum vedea în capitolele următoare, în aceste situaţii, limbajul C++ oferă programatorului două strategii: 1) clasa E poate avea două copii ale lui A, una pentru fiecare drum; 2) clasa E are o singură copie, iar A este clasă virtuală de bază şi pentru C şi pentru B. Ideea moştenirii multiple poate duce la utilizarea unor <strong>clase pentru care nu există instanţe</strong>, care să ajute doar la organizarea structurii (reţelei) de moştenire. În plus, limbajul C++ permite un control puternic asupra atributelor şi metodelor care vor fi moştenite.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p align="center"><strong>9.4.  ÎNCAPSULAREA (ASCUNDEREA) INFORMAŢIEI</strong></p>
<p>&nbsp;</p>
<p>Încapsularea (ascunderea) informaţiei reflectă faptul că <strong>atributele instanţă ş</strong>i <strong>metodele</strong> unui obiect îl definesc doar pe acesta. Vom spune că metodele şi atributele unui obiect sunt “private”, încapsulate în obiect. Interfaţa cu obiectul relevă foarte puţin din ceea ce se petrece în interiorul lui. Obiectul deţine controlul asupra atributelor instanţă, care nu pot fi alterate de către alte obiecte. Excepţia de la această observaţie o reprezintă doar <em>atributele de clasă</em> care nu sunt încapsulate, fiind partajate între toate instanţele clasei. Această tehnică de &#8220;plasare&#8221; a valorilor în datele membre private ale obiectului, reprezintă un mecanism de ascundere a datelor.</p>
<p>&nbsp;</p>
<p>În limbajul C++ încapsularea poate fi forţată prin controlul accesului, deoarece toate datele şi funcţiile membre sunt caracterizate printr-un <strong>nivel de acces</strong> (rezultând astfel o mare flexibilitate). Nivelul de acces la membrii unei clase poate fi (figura 9.4.):</p>
<table cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="1" height="9"></td>
</tr>
<tr>
<td></td>
<td bgcolor="white" width="318" height="227">
<table width="100%" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div>
<p>q  private: membrii (date şi metode) la care accesul este private pot fi accesaţi doar prin metodele clasei (nivel acces implicit);</p>
<p>q  protected: aceşti membri pot fi accesaţi prin funcţiile membre ale clasei şi funcţiile membre ale clasei derivate;</p>
<p>q  public: membrii la care accesul este public pot fi accesaţi din orice punct al domeniului de existenţă a  clasei respective;</p>
<p>q  friend: aceşti membri pot fi accesaţi prin funcţiile membre ale funcţiei prietene specificate.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>În limbajul C++, nivelul de acces poate preciza şi tipul de moştenire (capitolul 12).</p>
<p>q  Publică, unde în clasa derivată nivelul de acces al membrilor este acelaşi ca în clasa de bază;</p>
<p>q  Privată, unde membrii protected şi public din clasa bază devin private în clasa derivată.</p>
<p align="center"><strong>9.5.  LEGAREA DINAMICĂ (“TÂRZIE”)</strong></p>
<p>&nbsp;</p>
<p>Obiectele unei clase părinte trebuie cunoscute în momentul compilării. Efectul combinat al moştenirii poate determina ca o anumită metodă să fie specializată diferit (prin redefinire), pentru subclase diferite. <strong>Polimorfismul</strong> reprezintă comportamente diferite ale unei metode în raport cu tipul unui obiect. Selectarea unei metode redefinite poate fi realizată în faza de compilare (legarea iniţială), sau în momentul execuţiei (legare târzie). În limbajul C++, legarea dinamică se poate realiza prin implementarea de:</p>
<p>q  funcţii virtuale (pot fi redefinite polimorfic);</p>
<p>q  funcţii virtuale pure (doar declarate, nu definite).</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><strong>9.6.  ALTE ASPECTE</strong></p>
<p><strong> </strong></p>
<p>q  <strong>Comunicarea între obiecte</strong></p>
<p>În limbajele de programare orientate obiect, obiectele comunică între ele prin <strong><em>mesaje</em></strong>, ceea ce conduce la accentuarea conceptului de încapsulare. Un obiect poate “stimula” un altul să activeze (declanşeze) o metodă, trimiţându-i un mesaj. După primirea mesajului, metoda respectivă este apelată cu parametrii furnizaţi, asigurând comportarea corespunzătoare a obiectelor. Metodele sunt invocate prin <strong>trimiterea de mesaje.</strong></p>
<p>În limbajul C++ <strong>funcţiile membre (metodele) sunt accesate</strong> în mod similar oricarei funcţii, cu deosebirea că este necesară specificarea obiectului căruia îi corespunde metoda.</p>
<p>&nbsp;</p>
<p>q  <strong>Pseudovariabile</strong></p>
<p>Limbajele de programare orientate obiect posedă două variabile (numite pseudo-variabile) care diferă de variabilele normale prin faptul că nu li se pot atribui valori în mod direct, de către programator. În general, pseudovariabilele sunt o formă scurtă pentru “<strong><em>obiectul curent </em></strong>” şi pentru <strong><em>“clasa părinte a obiectului curent”</em></strong>. În limbajul C++ există doar una din aceste pseudovariabile, numită <strong>”this”</strong> (pointer către obiectul curent).</p>
<p><strong> </strong></p>
<p>q  <strong>Metaclasele</strong></p>
<p>Metaclasele reprezintă “clase de clase”. O clasă este, de fapt, o instanţă a unei metaclase. <em>Diferenţele</em> dintre clase şi metaclase sunt:</p>
<p>q  Clasa defineşte caracteristici (atribute şi metode) ale instanţelor de acel tip. Metodele pot fi folosite doar de obiectele clasei, nu şi de însăşi clasa (restricţie).</p>
<p>q  Metaclasele furnizează un mijloc prin care variabilele clasă pot fi implementate: în unele limbaje OOP, variabilele clasă sunt instanţieri ale unei metaclase.</p>
<p>&nbsp;</p>
<p>Limbajul C++ nu include explicit metaclasele, dar suportă <em>variabilele clasă</em> sub forma datelor <strong>statice</strong>. Aşa cum funcţiile membre obişnuite sunt încapsulate înăuntrul fiecarei instanţe, pentru o <strong><em>funcţie membru statică</em></strong> a unei clase, se foloseşte o singură copie, partajată de către toate instanţele clasei. O asemenea funcţie nu este asociată unei anumite instanţe.</p>
<p><strong> </strong></p>
<p>q  <strong>Persistenţa</strong></p>
<p>Persistenţa reprezintă <em>timpul de viaţă al unui obiect</em> (între crearea obiectului şi ştergerea sa). Instanţele unei clase au un timp de viaţă dat de execuţia unei metode sau a unui bloc, de crearea sau ştergerea specificată explicit în program sau de durata întregului program. Persistenţa obiectelor este importantă în special în aplicaţiile de baze de date.</p>
<p><strong> </strong></p>
<p>q  <strong>Supraîncarcarea operatorilor</strong>.</p>
<p>Limbajul C++ furnizează modalităţi de <em>supraîncarcare a operatorilor</em> <em>(overloading)</em>: acelaşi operator are semnificaţii diferite, care depind de numărul şi tipul argumentelor.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=198</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Limbajele C, C++. DATE, OPERATORI ŞI EXPRESII</title>
		<link>http://resurse-educationale.uv.ro/?p=194</link>
		<comments>http://resurse-educationale.uv.ro/?p=194#comments</comments>
		<pubDate>Wed, 14 Sep 2011 13:28:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[expresii]]></category>
		<category><![CDATA[operatori]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=194</guid>
		<description><![CDATA[Aşa cum comunicarea dintre două persoane se realizează prin intermediul limbajului natural, comunicarea dintre om şi calculator este mijlocită de un limbaj de programare. Limbajele C şi C++ sunt limbaje de programare de nivel înalt.  Limbajul C a apărut în &#8230; <a href="http://resurse-educationale.uv.ro/?p=194">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<div>Aşa cum comunicarea dintre două persoane se realizează prin intermediul limbajului natural, comunicarea dintre om şi calculator este mijlocită de un limbaj de programare. Limbajele C şi C++ sunt limbaje de programare de nivel înalt. <strong><br />
</strong></div>
<div>
<p><strong>Limbajul C</strong> a apărut în anii 1970 şi a fost creat de Dennis Ritchie în laboratoarele AT&amp;T Bell. Limbajul C face parte din familia de limbaje concepute pe principiile programării structurate, la care ideea centrală este ”structurează pentru a stăpâni o aplicaţie”. Popularitatea limbajului a crescut rapid datorită eleganţei şi a multiplelor posibilităţi oferite programatorului (puterea şi flexibilitatea unui limbaj de asamblare); ca urmare, au apărut numeroase alte implementări. De aceea, în anii ’80 se impune necesitatea standardizării acestui limbaj. În perioada 1983-1990, un comitet desemnat de ANSI (American National Standards Institute) a elaborat un compilator ANSI C, care permite scrierea unor programe care pot fi portate fără modificări, pe orice sistem.</p>
<p><strong>Limbajul C++</strong> apare la începutul anilor ’80 şi îl are ca autor pe Bjarne Stroustrup. El este o variantă de limbaj C îmbunătăţit, mai riguroasă şi mai puternică, completată cu construcţiile necesare aplicării principiilor programării orientate pe obiecte (POO). Limbajul C++  păstrează toate elementele limbajului C,  beneficiind de eficienţa şi flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C. Incompatibilităţile sunt minore, de aceea, modulele C pot fi încorporate în proiecte C++ cu un efort minim.</p>
<p>&nbsp;</p>
<p><strong>2.2.</strong><strong>  PROGRAME ÎN LIMBAJUL C/C++</strong></p>
<p>Un <em>program</em> scris în limbajul C (sau C++) este compus din unul sau mai multe <em>fişiere sursă</em>. Un fişier sursă este un fişier text care conţine codul sursă (în limbajul C) al unui program. Fiecare fişier sursă conţine una sau mai multe <em>funcţii</em> şi eventual, referinţe către unul sau mai multe <em>fişiere header</em> (figura 2.1.).</p>
<p>&nbsp;</p>
<p>Funcţia principală a unui program este numită <strong><em>main</em></strong>. Execuţia programului începe cu execuţia acestei funcţii, care poate apela, la rândul ei, alte funcţii. Toate funcţiile folosite în program trebuie descrise în fişierele sursă (cele scrise de către programator), în fişiere header (funcţiile predefinite, existente în limbaj), sau în biblioteci de funcţii.</p>
<p>&nbsp;</p>
<p>Un fişier header este un fişier aflat în sistem sau creat de către programator, care conţine declaraţii şi definiţii de funcţii şi variabile.</p>
<p>&nbsp;</p>
<p>Acţiunile din fiecare funcţie sunt codificate prin <em>instrucţiuni</em> (figura 2.2.a.). Există mai multe tipuri de instrucţiuni, care vor fi discutate în capitolul următor. O instrucţiune este orice expresie validă (de obicei, o asignare sau un apel de funcţie), urmată de simbolul ;. În figura 2.2.b. este dat un exemplu de instrucţiune simplă. Uneori, ca instrucţiune poate apare instrucţiunea nulă (doar <strong>;</strong>), sau instrucţiunea compusă (privită ca o succesiune de instrucţiuni simple, încadrate între acoladele delimitatoare {}.</p>
<table cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="49" height="4"></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>Pentru a înţelege mai bine noţiunile prezentate, să considerăm un exemplu foarte simplu. Programul următor afişează pe ecran un mesaj (mesajul <em>Primul meu program</em>). Informaţia de prelucrat (de intrare) este însuşi mesajul (o constantă şir), iar prelucrarea ei constă în afişarea pe ecran.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>#include &lt;iostream.h&gt;   // linia 1</p>
<p>void main()      // linia 2 &#8211; antetul funcţiei main</p>
<p>{                    /* linia 3 &#8211; începutul corpului funcţiei, a unei intrucţiuni</p>
<p align="center">compuse */</p>
<p>cout&lt;&lt;”Primul meu program in limbajul C++\n”;   // linia 5</p>
<p>}                          // linia6-sfârşitul corpului funcţiei</p>
<p>&nbsp;</p>
<p>Prima linie este o <em>directivă preprocesor</em> (indicată de simbolul #) care determină includerea în fişierul sursă a fişierului header cu numele iostream.h. Acest header permite realizarea afişării<em> </em>pe monitor.</p>
<p>Programul conţine o singură funcţie, <em>funcţia principală</em>, numită main<em>, </em>al cărui <em>antet</em> (linia 2) indică:</p>
<p>- tipul valorii returnate de funcţie (void, ceea ce înseamnă că funcţia nu returnează nici o valoare)</p>
<p>- numele funcţiei (main)</p>
<p>- lista argumentelor primite de funcţie, încadrată de cele 2 paranteze rotunde.</p>
<p>Funcţiile comunică între ele prin argumente. Aceste argumente reprezintă datele de intrare ale funcţiei. În cazul nostru, nu avem nici un argument în acea listă, deci puteam să scriem antetul funcţiei şi astfel:</p>
<p>void main(void)</p>
<p>Ceea ce urmează după simbolul //, până la sfărşitul liniei,<em> </em>este un<em> comentariu</em>, care va fi ignorat de către compilator. Comentariul poate conţine un text explicativ; informaţii lămuritoare la anumite aspecte ale problemei sau observaţii. Dacă vrem să folosim un comentariu care cuprinde mai multe linii, vom delimita începutul acestuia indicat prin simbolulurile /*, iar sfârşitul &#8211; prin */ (vezi liniile 3, 4). Introducerea comentariilor în programele sursă uşurează înţelegerea acestora. În general, se recomandă introducerea unor comentarii după antetul unei funcţiei, pentru a preciza prelucrările efectuate în funcţie, anumite limite impuse datelor de intrare, etc.</p>
<p>Începutul şi sfârşitul corpului funcţiei <em>main </em>sunt indicate de cele două acoalade { (linia3) şi }(linia 6). Corpul funcţiei (linia 5) este format dintr-o singură instrucţiune, care implementează o operaţie de scriere. Cuvantul cout este un cuvânt predefinit al limbajului C++ &#8211; <strong>c</strong>onsole <strong>out</strong>put &#8211; care desemnează dispozitivul logic de iesire; simbolul &lt;&lt;<em> </em> este operatorul de transfer a informaţiei. Folosite astfel, se deschide un canal de comunicaţie a datelor către dispozitivul de ieşire, în cazul acesta, monitorul. După operator se specifică informaţiile care vor fi afişate (în acest exemplu, un şir de caractere constant). Faptul că este un şir constant de caractere este indicat de ghilimelele care îl încadrează. Pe ecran va fi afişat fiecare caracter din acest şir, cu excepţia grupului \n<em>. </em>Deşi grupul este format din două caractere, acesta<em> </em>va fi interpretat ca un singur caracter &#8211; numit <em>caracter escape</em> &#8211; care determină poziţionarea cursorului la începutul următoarei linii. O secvenţă escape (cum este \n) furnizează un mecanism general şi extensibil pentru reprezentarea caracterelor invizibile sau greu de obţinut. La sfârşitul instrucţiunii care implementează operaţia de scriere, apare ; .</p>
<p><span id="more-194"></span></p>
<p align="center"><strong>2.3.  PREPROCESORUL</strong></p>
<p>Aşa cum am menţionat în capitolul 1.3., în faza de compilare a fişierului sursă este invocat întâi preprocesorul. Acesta tratează directivele speciale &#8211; numite <em>directive preprocesor </em>- pe care le găseşte în fişierul sursă. Directivele preprocesor sunt identificate prin simbolul #, care trebuie să fie primul caracter, diferit de spaţiu, dintr-o linie. Directivele preprocesor sunt utilizate la includerea fişierelor header, la definirea numelor constantelor simbolice, la definirea macro-urilor, sau la realizarea altor funcţii (de exemplu, compilarea condiţionată), aşa cum ilustrează exemplele următoare:</p>
<p>&nbsp;</p>
<p>q  Includerea fişierelor header în codul sursă:</p>
<h6><strong><em><span style="text-decoration: underline;">Exemplul1:</span></em></strong><strong><em></em></strong></h6>
<h6>#include &lt;stdio.h&gt;</h6>
<p>Când procesorul întâlneşte această linie, datorită simbolului #, o recunoaşte ca fiind o directivă preprocesor, localizează fişierul header indicat (parantezele unghiulare &lt; &gt; indică faptul că este vorba de un <em>fişier header sistem</em>).</p>
<h6><strong><em><span style="text-decoration: underline;">Exemplul 2:   </span></em></strong></h6>
<h6>#include &#8220;headerul_meu.h&#8221;</h6>
<p>Numele fişierului header inclus între ghilimele, indică faptul că headerul_meu.h este un fişier header creat de utilizator. Preprocesorul va căuta să localizeze acest fişier în directorul curent de lucru al utilizatorului. În cazul în care fişierul header nu se află în directorul curent, se va indica şi calea către acesta.</p>
<h6><strong><em><span style="text-decoration: underline;">Exemplul 3:   </span></em></strong></h6>
<h6>#include &#8220;c:\\bc\\head\\headerul_meu.h&#8221;</h6>
<p>În acest exemplu, pentru interpretarea corectă a caracterului backslash \, a fost necesară &#8220;dublarea&#8221;  acestuia, din motive pe care le vom prezenta în paragraful 2.5.2.4.</p>
<p>&nbsp;</p>
<p>q  Asignarea de nume simbolice constantelor:</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>#define TRUE      1</p>
<p>#define FALSE     0</p>
<p>Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii întregi 1 numelui   (constantei simbolice) TRUE, şi a valorii 0 numelui simbolic FALSE. Ca urmare, înaintea compilării propriu-zise, în programul sursă, apariţiile numelor TRUE şi FALSE vor fi înlocuite cu valorile 1, respectiv 0.</p>
<p>&nbsp;</p>
<p>q  Macrodefiniţii:</p>
<p>Directiva #define este folosită şi în macrodefiniţii. Macrodefiniţiile permit folosirea unor nume simbolice pentru expresiile indicate în directivă.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>#define NEGATIV(x)      -(x)</p>
<p>Între numele macrodefiniţiei şi paranteza stângă (  <em>NEGATIV(</em>…) ) nu sunt permise spaţii albe. La întalnirea în programul sursă a macrodefiniţiei NEGATIV, preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului). Macrodefiniţia din exemplu poate fi folosită în programul sursă astfel: NEGATIV(a+b). Când preprocesorul întâlneşte numele expresiei, subtituie literalii din paranteză, a+b, cu argumentul din macrodefiniţie, x, obţinându-se   -(a+b).</p>
<p>Dacă macrodefiniţia ar fi fost de forma:</p>
<p>#define NEGATIV(x)      -x</p>
<p>NEGATIV(a+b) ar fi fost tratată ca -a+b.</p>
<p align="center"><strong> </strong></p>
<p align="center"><strong> </strong></p>
<p align="center"><strong>2.4. ELEMENTE DE BAZĂ ALE LIMBAJULUI</strong></p>
<p><strong> </strong></p>
<p><strong>2.4.1. VOCABULARUL</strong></p>
<p>&nbsp;</p>
<p>În scrierea programelor în limbajul C/C++ pot fi folosite doar anumite simboluri care alcătuiesc <em>alfabetul limbajului. </em>Acesta cuprinde:</p>
<p>q  Literele mari sau mici de la A la Z (a-z);</p>
<p>q  Caracterul subliniere ( _ underscore), folosit, de obicei, ca element de legătura între cuvintele compuse;</p>
<p>q  Cifrele zecimale (0-9);</p>
<p>q  Simboluri speciale:</p>
<p>q  Caractere:</p>
<p>q  operatori (Exemple:  +, *, !=);</p>
<p>q  delimitatori (Exemple:  blank (spaţiu), tab \t, newline \n, cu rolul de a separa cuvintele);</p>
<p>q  Grupuri (perechi de caractere).</p>
<p>&nbsp;</p>
<p>Grupurile de caractere, numire adesea <em>separatori</em>, pot fi:</p>
<p>q  ( )           &#8211; Încadrează lista de argumente ale unei funcţii sau sunt folosite în expresii pentru schimbarea ordinii de efectuare a operaţiilor (în ultimul caz, fiind operator);</p>
<p>q  { }           &#8211; Încadrează instrucţiunile compuse;</p>
<p>q  //              &#8211; Indică începutul unui comentariu care se poate întinde până la sfârşitul liniei;</p>
<p>q  /*   */ &#8211; Indică începutul şi sfârşitul unui comentariu care poate cuprinde mai multe linii;</p>
<p>q  &#8221; &#8220;     &#8211; Încadrează o constantă şir (un şir de caractere);</p>
<p>q  &#8216; &#8216;           &#8211; Încadrează o constantă caracter (un caracter imprimabil sau o secvenţă escape).</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>2.4.2. UNITĂŢILE LEXICALE</strong></p>
<p>&nbsp;</p>
<p>Unităţile lexicale (cuvintele) limbajului C/C++ reprezintă grupuri de caractere cu o semnificaţie de sine stătătoare. Acestea sunt:</p>
<p>q  Identificatori;</p>
<p>q  Cuvinte cheie ale limbajului;</p>
<p><strong> </strong></p>
<p><strong>Identificatorii</strong> reprezintă numele unor date (constante sau variabile), sau ale unor funcţii. Identificatorul este format dintr-un şir de litere, cifre sau caracterul de subliniere (underscore), trebuie să înceapă cu o literă sau cu caracterul de subliniere şi să fie sugestivi.</p>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong>   viteză, greutate_netă, Viteza, Viteza1, GreutateNetă</p>
<p>Identificatorii pot conţine litere mici sau mari, dar limbajul C++ este senzitiv la majuscule şi minuscule (case-sensitive). Astfel, identificatorii viteza şi Viteza sunt diferiţi.</p>
<p>Nu pot fi folosiţi ca identificatori cuvintele cheie. Identificatorii pot fi standard (ca de exemplu numele unor funcţii predefinite: scanf, clear, etc.) sau aleşi de utilizator.</p>
<p><strong> </strong></p>
<p><strong>Cuvintele cheie</strong> sunt cuvinte ale limbajului, împrumutate din limba engleză, cărora programatorul nu le poate da o altă utilizare. Cuvintele cheie se scriu cu litere mici şi pot reprezenta:</p>
<p>q  Tipuri de date (Exemple: int, char, double);</p>
<p>q  Clase de memorare (Exemple: extern, static, register);</p>
<p>q  Instrucţiuni (Exemple: if, for, while);</p>
<p>q  Operatori (Exemplu: sizeof).</p>
<p>Sensul cuvintelor cheie va fi explicat pe masură ce vor fi prezentate construcţiile în care acestea apar.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align="center"><strong>2.5. DATE ÎN LIMBAJUL C/C++</strong></p>
<p>&nbsp;</p>
<p>Aşa cum s-a văzut în capitolul 1, un program realizează o prelucrare de informaţie. Termenul de prelucrare trebuie să fie considerat într-un sens foarte general (de exemplu, în programul prezentat în paragraful 2.2., prelucrarea se referea la un text şi consta în afişarea lui). În program datele apar fie sub forma unor <strong><em>constante</em></strong> (valori cunoscute anticipat, care nu se modifică), fie sub forma de <strong><em>variabile</em></strong>. Constantele şi variabilele sunt obiectele informaţionale de bază manipulate într-un program.</p>
<p>&nbsp;</p>
<p>Fiecare categorie de date este caracterizată de atributele:</p>
<p>q  Nume;</p>
<p>q  Valoare;</p>
<p>q  Tip;</p>
<p>q  Clasa de memorare.</p>
<p>De primele trei tipuri de atribute ne vom ocupa în continuare, urmând ca de atributul clasă de memorare să ne ocupăm în paragraful 6.8.</p>
<p>&nbsp;</p>
<p><strong>Numele unei date</strong></p>
<p>Numele unei date este un identificator şi, ca urmare, trebuie să respecte regulile specifice identificatorilor. Deasemenea, numărul de caractere care intră în compunerea unui identificator este nelimitat, însă, implicit, numai primele 32 de caractere sunt luate în considerare. Aceasta înseamnă că doi identificatori care au primele 32 de caractere identice, diferenţiindu-se prin caracterul 33, vor fi consideraţi identici.</p>
<p>&nbsp;</p>
<p><strong>2.5.1.  TIPURI DE DATE</strong></p>
<p><strong> </strong></p>
<p><strong>Tipul unei date </strong>constă într-o <em>mulţime de valori</em> pentru care s-a adoptat un anumit mod de reprezentare în memoria calculatorului şi o <em>mulţime de operatori</em> care pot fi aplicaţi acestor valori. Tipul unei date determină <em>lungimea zonei de memorie</em> ocupată de acea dată. În general, lungimea zonei de memorare este dependentă de calculatorul pe care s-a implementat compilatorul. Tabelul 2.1. prezintă lungimea zonei de memorie ocupată de fiecare tip de dată pentru compilatoarele sub MS-DOS şi UNIX/LINUX.</p>
<p><strong>Tipurile de bază</strong> sunt:</p>
<p>q  char         un singur octet (1 byte=8 biţi), capabil să conţină codul unui caracter din setul</p>
<p>local de caractere;</p>
<p>q  int           număr întreg, reflectă în mod tipic mărimea naturală din calculatorul utilizat;</p>
<p>q  float       număr real, în virgulă mobilă, simplă precizie;</p>
<p>q  double     număr real, în virgulă mobilă, dublă precizie.</p>
<p>&nbsp;</p>
<p>În completare există un număr de <em>calificatori, </em>care se pot aplica tipurilor de bază char, int, float sau double: short, long, signed şi unsigned. Astfel, se obţin <strong><em>tipurile derivate de date</em></strong>. Short şi long se referă la mărimea diferită a întregilor, iar datele de tip unsigned int sunt întotdeauna pozitive. S-a intenţionat ca short şi long să furnizeze diferite lungimi de întregi, int reflectând mărimea cea mai &#8220;naturală&#8221; pentru un anumit calculator. Fiecare compilator este liber să interpreteze short şi long în mod adecvat propriului hardware; în nici un caz, însă, short nu este mai lung decât long. Toţi aceşti calificatori pot aplicaţi tipului int. Calificatorii signed (cel implicit) şi unsigned se aplică tipului char. Calificatorul long se aplică tipului double. Dacă într-o declaraţie se omite tipul de bază, implicit, acesta va fi int.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="142">Tabelul 2.1.</td>
<td colspan="2" valign="top" width="132"></td>
<td valign="top" width="369"></td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center"><strong>Tip</strong></p>
</td>
<td colspan="2" valign="top" width="132">
<p align="center"><strong>Lungimea zonei de memorie ocupat</strong><strong>e</strong><strong> (în biţi)</strong></p>
</td>
<td valign="top" width="369">
<p align="center"><strong>Descriere</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="142"></td>
<td valign="top" width="66">MS-DOS</td>
<td valign="top" width="66">UNIXLINUX</td>
<td valign="top" width="369"></td>
</tr>
<tr>
<td valign="top" width="142">char</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="369">Valoarea unui singur caracter; poate fi întâlnit în expresii cu extensie de semn</td>
</tr>
<tr>
<td valign="top" width="142">unsigned char</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="369">Aceeaşi ca la char, fară extensie de semn</td>
</tr>
<tr>
<td valign="top" width="142">signed char</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="66">
<p align="center">8</p>
</td>
<td valign="top" width="369">Aceeaşi ca la char, cu extensie de semn obligatorie</td>
</tr>
<tr>
<td valign="top" width="142">int</td>
<td valign="top" width="66">
<p align="center">16</p>
</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="369">Valoare întreagă</td>
</tr>
<tr>
<td valign="top" width="142">long</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="66">
<p align="center">64</p>
</td>
<td valign="top" width="369">Valoare întreagă cu precizie mare</td>
</tr>
<tr>
<td valign="top" width="142">(long int)</td>
<td valign="top" width="66"></td>
<td valign="top" width="66"></td>
<td valign="top" width="369"></td>
</tr>
<tr>
<td valign="top" width="142">long long int</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="66">
<p align="center">64</p>
</td>
<td valign="top" width="369">Valoare întreagă cu precizie mare</td>
</tr>
<tr>
<td valign="top" width="142">short int</td>
<td valign="top" width="66">
<p align="center">16</p>
</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="369">Valoare întreagă cu precizie mică</td>
</tr>
<tr>
<td valign="top" width="142">unsigned int</td>
<td valign="top" width="66">
<p align="center">16</p>
</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="369">Valoare întreagă, fără semn</td>
</tr>
<tr>
<td valign="top" width="142">unsigned long int</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="66">
<p align="center">64</p>
</td>
<td valign="top" width="369">Valoare întreagă, fără semn</td>
</tr>
<tr>
<td valign="top" width="142">float</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="66">
<p align="center">32</p>
</td>
<td valign="top" width="369">Valoare numerică cu zecimale, simplă precizie (6 )</td>
</tr>
<tr>
<td valign="top" width="142">double</td>
<td valign="top" width="66">
<p align="center">64</p>
</td>
<td valign="top" width="66">
<p align="center">64</p>
</td>
<td valign="top" width="369">Valoare numerică cu zecimale, dublă precizie (10 )</td>
</tr>
<tr>
<td valign="top" width="142">long double</td>
<td valign="top" width="66">
<p align="center">80</p>
</td>
<td valign="top" width="66">
<p align="center">128</p>
</td>
<td valign="top" width="369">Valoare numerică cu zecimale, dublă precizie</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Să considerăm, de exmplu, tipul int, folosit pentru date întregi (pozitive sau negative). Evident că mulţimea valorilor pentru acest  tip va fi, de fapt, o <em>submulţime finită</em> de numere întregi. Dacă pentru memorarea unei date de tip int se folosesc 2 octeţi de memorie, atunci valoarea maximă pentru aceasta va fi 2- 1, deci 2- 1 (32767), iar valoarea minimă va fi -2, deci -2 (-32768). Încercarea de a calcula o expresie de tip int a cărei valoare se situează în afara acestui domeniu va conduce la o eroare de execuţie.</p>
<p>Mulţimea valorilor pentru o dată de tip unsigned int (întreg fără semn) va fi formată din numerele întregi situate în intervalul [0, 2- 1].</p>
<p>&nbsp;</p>
<p>În header-ul <strong>&lt;values.h&gt;</strong> sunt definite constantele simbolice (cum ar fi: MAXINT, MAXSHORT, MAXLONG, MINDOUBLE, MINFLOAT, etc.) care au ca valoare limitele inferioară şi superioară ale intervalului de valori pentru tipurile de date enumerate.  (de exemplu MAXINT reprezintă valoarea întregului maxim care se poate memora, etc. )</p>
<p>&nbsp;</p>
<p>Fără a detalia foarte mult modul de reprezentare a datelor reale (de tip float sau double), vom sublinia faptul că, pentru acestea, este importantă şi <em>precizia de reprezentare</em>. Deoarece calculatorul poate reprezenta doar o submulţime finită de valori reale, în anumite cazuri, pot apare erori importante.</p>
<p>Numerele reale pot fi scrise sub forma:                       N = mantisa  baza</p>
<p>unde:baza reprezintă baza sistemului de numeraţie; mantisa (coeficientul) este un număr fracţionar normalizat ( în faţa virgulei se află 0, iar prima cifră de după virgulă este diferită de zero); exponentul este un număr întreg. Deoarece forma internă de reprezentare este binară, baza=2. În memorie vor fi reprezentate doar mantisa şi exponentul. Numărul de cifre de după virgulă determină <em>precizia</em> de exprimare a numărului. Ce alte cuvinte, pe un calculator cu o precizie de 6 cifre semnificative, două valori reale care diferă la a 7-a cifră zecimală, vor avea aceeaşi reprezentare. Pentru datele de tip float, precizia de reprezentare este 6; pentru cele de tip double, precizia este 14, iar pentru cele de tip long double, precizia este 20.</p>
<p>Lungimea zonei de memorie ocupate de o dată de un anumit tip (pe câţi octeţi este memorată data) poate fi aflată cu ajutorul operatorului sizeof.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu: </span></em></strong></p>
<p>cout&lt;&lt;&#8221;Un int este memorat pe &#8220;&lt;&lt;sizeof(int)&lt;&lt;&#8221;octeti.\n&#8221;;</p>
<p>Instrucţiunea are ca efect afişarea pe monitor a mesajului: <em>Un int este memorat pe 2 octeţi.</em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.5.2.  CONSTANTE</strong></p>
<p>&nbsp;</p>
<p>O constantă este un <strong>literal</strong> (o formă externă de reprezentare) <em>numeric</em>, <em>caracter</em> sau <em>şir de caractere</em>. Numele şi valoarea unei constante sunt identice. Valoarea unei constante nu poate fi schimbată în timpul execuţiei programului în care a fost utilizată. Tipul şi valoarea ei sunt determinate în mod automat, de către compilator, pe baza caracterelor care compun literalul.</p>
<p>&nbsp;</p>
<p><strong>2.5.2.1.    </strong><strong>Constante întregi</strong></p>
<p><strong> </strong></p>
<p>Constantele întregi sunt literali numerici (compuşi din cifre), fără punct zecimal.</p>
<p>q  Constante <em>întregi în baza 10, 8 sau 16</em></p>
<p>q  Constante <em>întregi în baza 10</em></p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p><em>     </em>45</p>
<p>-78   // constante întregi decimale (în baza 10), tip <strong>int</strong></p>
<p>q  Constante <em>întregi octale</em></p>
<p>Dacă în faţa numărului apare cifra zero (0), acest lucru indică faptul că acea constantă este de tipul int, in baza opt (constantă octală).</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>056</p>
<p>077   // constante întregi octale, tip <strong>int</strong></p>
<p>q  Constante <em>întregi hexagesimale</em></p>
<p>Dacă în faţa numărului apar caracterele zero (0) şi x (sau X), acest lucru indică faptul că acea constantă este de tipul int, în baza 16 (constantă hexagesimală). Amintim că în baza 16 cifrele sunt: 0-9, A (sau a) cu valoare 10, B (sau b) cu valoare 11, C (sau c) cu valoare 12, D (sau d) cu valoare 13, E (sau e) cu valoare 14, F (sau f) cu valoare 15.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>0&#215;45</p>
<p>0x3A</p>
<p>0Xbc  // constante întregi hexagesimale, tip <strong>int</strong></p>
<p>q  Constante <em>întregi, de tipuri derivate</em></p>
<p>q  Dacă secvenţa de cifre este urmată de L sau l, tipul constantei este <strong>long int</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>145677L</p>
<p>897655l     // tip decimal <strong>long int </strong></p>
<p>q  Dacă secvenţa de cifre este urmată de U sau u, tipul constantei este <strong>unsigned int</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>65555u</p>
<p>q  Dacă secvenţa de cifre este urmată de U (u) şi L (l), tipul constantei este <strong>unsigned long int</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong><em>    </em>7899UL     //tip decimal <strong>unsigned long int</strong></p>
<p><strong><em><span style="text-decoration: underline;"> </span></em></strong></p>
<p>&nbsp;</p>
<h2>2.5.2.2.  Constante numerice, reale</h2>
<p>&nbsp;</p>
<p>q  Dacă o constantă numerică conţine punctul zecimal, ea este de tipul <strong>double</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>3.1459           //tip <strong>double</strong></p>
<p>q  Dacă numărul este urmat de F sau f, constante este de tip <strong>float</strong>.</p>
<p>q  Dacă numărul este urmat de L sau l, este de tip <strong>long double.</strong></p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>0.45f      //tip <strong>float</strong></p>
<p>9.788L     //tip <strong>long double</strong></p>
<p>q  Constante reale în format ştiinţific</p>
<p>Numărul poate fi urmat de caracterul e sau E şi de un număr întreg, cu sau fără semn. În acest caz, constanta este în <em>notaţie ştiinţifică</em>. În această formă externă de reprezentare, numărul din faţa literei E reprezintă <em>mantisa</em>, iar numărul întreg care urmează caracterului E reprezintă <em>exponentul</em>. In forma externă de reprezentare, baza de numeraţie este 10, deci valoarea constantei va fi dată de mantisa10.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>1.5e-2     //tip double, în notaţie ştiinţifică, valoare 1.510</p>
<p><strong> </strong></p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>#include &lt;values.h&gt;</p>
<p>#define PI 3.14359</p>
<p>int main()</p>
<p>{</p>
<p>cout&lt;&lt;&#8221;Tipul int memorat pe: &#8220;&lt;&lt;sizeof(int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul int memorat pe: &#8220;&lt;&lt;sizeof(23)&lt;&lt;&#8221; octeti\n&#8221;; //23-const. zecimala int</p>
<p>cout&lt;&lt;&#8221;Int maxim=&#8221;&lt;&lt;MAXINT&lt;&lt;’\n’;</p>
<p>//const. simbolice MAXINT, MAXLONG, etc. &#8211; definite in &lt;values.h&gt;</p>
<p>cout&lt;&lt;&#8221;Const. octala 077 are val decimala:&#8221;&lt;&lt;077&lt;&lt;’\n;</p>
<p>cout&lt;&lt;&#8221;Const. hexagesimala d3 are val decimala:&#8221;&lt;&lt;0xd3&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned int memorat pe:&#8221;&lt;&lt;sizeof(unsigned int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned int memorat pe: &#8220;&lt;&lt;sizeof(23U)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned int memorat pe: &#8220;&lt;&lt;sizeof(23u)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul long int memorat pe: &#8220;&lt;&lt;sizeof(long int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul long int memorat pe: &#8220;&lt;&lt;sizeof(23L)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul long int memorat pe: &#8220;&lt;&lt;sizeof(23l)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>//23L sau 23l-const. decimala long int</p>
<p>cout&lt;&lt;&#8221;Long int maxim=&#8221;&lt;&lt;MAXLONG&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned long memorat pe:&#8221;;</p>
<p>cout&lt;&lt;sizeof(unsigned long int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned long memorat pe: &#8220;&lt;&lt;sizeof(23UL)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul unsigned long memorat pe: &#8220;&lt;&lt;sizeof(23ul)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>//23UL sau 23ul-const. decimala unsigned long int</p>
<p>cout&lt;&lt;&#8221;Tipul long long int memorat pe: &#8220;;</p>
<p>cout&lt;&lt;sizeof(long long int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul long long int memorat pe: &#8220;&lt;&lt;sizeof(d)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul short int memorat pe: &#8220;&lt;&lt;sizeof(short int)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Short int maxim=&#8221;&lt;&lt;MAXSHORT&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Tipul float memorat pe: &#8220;&lt;&lt;sizeof(float)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul float memorat pe: &#8220;&lt;&lt;sizeof(23.7f)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>//23.7f-const. decimala float</p>
<p>cout&lt;&lt;&#8221;Float maxim=&#8221;&lt;&lt;MAXFLOAT&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Float minim=&#8221;&lt;&lt;MINFLOAT&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Tipul double memorat pe: &#8220;&lt;&lt;sizeof(double)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul double memorat pe: &#8220;&lt;&lt;sizeof(23.7)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>//23.7-const. decimala double</p>
<p>cout&lt;&lt;&#8221;Const. decim. doubla in notatie stiintifica:&#8221;&lt;&lt;23.7e-5&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;”Const. PI este:”&lt;&lt;PI&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;”Constanta PI este memorata pe:”&lt;&lt;sizeof(PI)&lt;&lt;”octeti\n”:</p>
<p>cout&lt;&lt;&#8221;Double maxim=&#8221;&lt;&lt;MAXDOUBLE&lt;&lt;’\n’&lt;&lt;&#8221;Double minim=&#8221;&lt;&lt;MINDOUBLE&lt;&lt;’\n’;</p>
<p>cout&lt;&lt;&#8221;Tipul long double memorat pe: &#8220;&lt;&lt;sizeof(long double)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Tipul long double memorat pe: &#8220;&lt;&lt;sizeof(23.7L)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>//23.7L-const. decimala long double</p>
<p>cout&lt;&lt;&#8221;Cifra A din HEXA are val.:&#8221;&lt;&lt;0xA&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Cifra B din HEXA are val.:&#8221;&lt;&lt;0XB&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Cifra C din HEXA are val.:&#8221;&lt;&lt;0xc&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221; Cifra D din HEXA are val.:&#8221;&lt;&lt;0xD&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221; Cifra E din HEXA are val.:&#8221;&lt;&lt;0XE&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221; Cifra F din HEXA are val.:&#8221;&lt;&lt;0xf&lt;&lt;&#8221;\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Val. const. hexa 0x7ac1e este: &#8220;&lt;&lt;0x7ac1e&lt;&lt;&#8217;\n&#8217;;</p>
<p>cout&lt;&lt;&#8221;Val. const. octale 171 este: &#8220;&lt;&lt;0171&lt;&lt;&#8217;\n&#8217;;</p>
<p>cout&lt;&lt;&#8221;O const. octala se memoreaza pe &#8220;&lt;&lt;sizeof(011)&lt;&lt;&#8221; octeti\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;O const.oct.long se mem pe &#8220;;cout&lt;&lt;sizeof(011L)&lt;&lt;&#8221; octeti\n&#8221;;}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.5.2.3.  Constante caracter</strong></p>
<p>&nbsp;</p>
<p>Constantele caracter sunt încadrate între apostroafe.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong><strong><em></em></strong></p>
<p>&#8216;a&#8217;        //tip <strong>char</strong></p>
<p>O constantă caracter are ca valoare <strong><em>codul ASCII</em></strong> al caracterului pe care îl reprezintă.</p>
<p>Acest set de caractere are următoarele <em>proprietăţi</em>:</p>
<p>q  Fiecărui caracter îi corespunde o valoare întreagă distinctă (ordinală);</p>
<p>q  Valorile ordinale ale literelor mari sunt ordonate şi consecutive (&#8216;A&#8217; are codul ASCII 65, &#8216;B&#8217; &#8211; codul 66, &#8216;C&#8217; &#8211; codul 67, etc.);</p>
<p>q  Valorile ordinale ale literelor mici sunt ordonate şi consecutive (&#8216;a&#8217; are codul ASCII 97, &#8216;b&#8217; &#8211; codul 98, &#8216;c&#8217; &#8211; codul 99, etc.);</p>
<p>q  Valorile ordinale ale cifrelor sunt ordonate şi consecutive (&#8217;0&#8242; are codul ASCII 48, &#8217;1&#8242; &#8211; codul 49, &#8217;2&#8242; &#8211; codul 50, etc.).</p>
<p>&nbsp;</p>
<p>q  Constante caracter <em>corespunz</em><em>ă</em><em>toare caracterelor imprimabile</em></p>
<p>O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv inclus între apostroafe.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu</span></em></strong>:</p>
<p>Constantă caracter      Valoare</p>
<p>‘A’               65</p>
<p>‘a’               97</p>
<p>‘0’               48</p>
<p>‘*’               42</p>
<p><strong><em>Excepţii </em></strong>de la regula de mai sus le constituie <em>caracterele imprimabile apostrof</em> (&#8216;) şi backslash (\).</p>
<p>Caracterul <em>backslash</em> se reprezintă:            &#8216;\\&#8217;. Caracterul <em>apostrof </em>se reprezintă:         &#8216;\&#8221;.</p>
<p>&nbsp;</p>
<p>q  Constante caracter <em>corespunz</em><em>ă</em><em>toare caracterelor neimprimabile</em></p>
<p>Pentru caracterele neimprimabile, se folosesc <strong><em>secvenţe escape</em></strong>. O secvenţă escape furnizează un mecanism general şi extensibil pentru  reprezentarea caracterelor invizibile sau greu de obţinut.  În tabelul 2.2. sunt prezentate câteva caractere escape utilizate frecvent.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="104">Tabelul 2.2.</td>
<td valign="top" width="94"></td>
<td valign="top" width="85"></td>
<td valign="top" width="331"></td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">Constantă caracter</p>
</td>
<td valign="top" width="94">
<p align="center">Valoare</p>
<p align="center">(Cod ASCII)</p>
</td>
<td valign="top" width="85">
<p align="center">Denumirea caracterului</p>
</td>
<td valign="top" width="331">
<p align="center">Utilizare</p>
</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">‘\n’</p>
</td>
<td valign="top" width="94">
<p align="center">10</p>
</td>
<td valign="top" width="85">
<p align="center">LF</p>
</td>
<td valign="top" width="331">rând nou (Line Feed)</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">‘\t’</p>
</td>
<td valign="top" width="94">
<p align="center">9</p>
</td>
<td valign="top" width="85">
<p align="center">HT</p>
</td>
<td valign="top" width="331">tabulator orizontal</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">‘\r’</p>
</td>
<td valign="top" width="94">
<p align="center">13</p>
</td>
<td valign="top" width="85">
<p align="center">CR</p>
</td>
<td valign="top" width="331">poziţionează cursorul în coloana 1 din rândul curent</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">‘\f’</p>
</td>
<td valign="top" width="94">
<p align="center">12</p>
</td>
<td valign="top" width="85">
<p align="center">FF</p>
</td>
<td valign="top" width="331">salt de pagină la imprimantă (Form Feed)</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">‘\a’</p>
</td>
<td valign="top" width="94">
<p align="center">7</p>
</td>
<td valign="top" width="85">
<p align="center">BEL</p>
</td>
<td valign="top" width="331">activare sunet</td>
</tr>
</tbody>
</table>
<p>O constantă caracter pentru o secvenţă escape poate apare însă, şi sub o formă în care se indică codul ASCII, în octal, al caracterului dorit:</p>
<p>’\ddd’                       unde d este o cifră octală.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>’\11’ (pentru ’\t’)</p>
<p>reprezintă constanta caracter backspace, cu codul 9 în baza 10, deci codul 11 în baza 8.</p>
<p>’\15’ (pentru ’\r’)</p>
<p>reprezintă constanta caracter CR, cu codul 13 în baza 10, deci codul 11 în baza 8.</p>
<p><strong><span style="text-decoration: underline;"> </span></strong></p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main(void)</p>
<p>{</p>
<p>cout&lt;&lt;&#8221;Un caracter este memorat pe &#8220;&lt;&lt;sizeof(char)&lt;&lt;&#8221; octet\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Caracterul escape \\n este memorat pe &#8220;;</p>
<p>cout&lt;&lt;sizeof(&#8216;\n&#8217;)&lt;&lt;&#8221; octet\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Caracterul escape &#8216;\\n\&#8217; este memorat pe &#8220;&lt;&lt;sizeof(&#8216;\n&#8217;);</p>
<p>cout&lt;&lt;&#8221; octet\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Caracterul &#8217;9&#8242; este memorat pe &#8220;&lt;&lt;sizeof(&#8217;9&#8242;)&lt;&lt;&#8221; octet\n&#8221;;</p>
<p>cout&lt;&lt;&#8217;B';cout&lt;&lt;&#8217; &#8216;;cout&lt;&lt;&#8217;c';cout&lt;&lt;&#8217;\t&#8217;;</p>
<p>cout&lt;&lt;&#8217;\t&#8217;;cout&lt;&lt;&#8217;9&#8242;;cout&lt;&lt;&#8217;\b&#8217;;cout&lt;&lt;&#8217;\a&#8217;;</p>
<p>cout&lt;&lt;&#8217;L';cout&lt;&lt;&#8217;\v&#8217;;cout&lt;&lt;&#8217;L';</p>
<p>cout&lt;&lt;&#8217;\&#8221;;cout&lt;&lt;&#8217;\t&#8217;;cout&lt;&lt;&#8217;\&#8221;&#8216;;cout&lt;&lt;&#8217;\\&#8217;;cout&lt;&lt;&#8217;\n&#8217;;</p>
<p>cout&lt;&lt;&#8217;\a&#8217;;cout&lt;&lt;&#8217;\7&#8242;;</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>2.5.2.4.  Constante şir de caractere</h2>
<p>&nbsp;</p>
<p>Constanta şir este o succesiune de zero sau mai multe caractere, încadrate de ghilimele. În componenţa unui şir de caractere, poate intra orice caracter, deci şi caracterele escape. Lungimea unui şir este practic nelimitată. Dacă se doreşte continuarea unui şir pe rândul următor, se foloseşte caracterul backslash.</p>
<p>&nbsp;</p>
<p>Caracterele componente ale unui şir sunt memorate într-o zonă continuă de memorie (la adrese succesive). Pentru fiecare caracter se memorează codul ASCII al acestuia. După ultimul caracter al şirului, compilatorul plasează automat <em>caracterul NULL</em> (\0), caracter care reprezintă <em>marcatorul sfârşitului de şir</em>. Numărul de octeţi pe care este memorat un şir va fi, deci, mai mare cu 1 decât numărul de caractere din şir.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>”Acesta este un şir de caractere”     //constantă şir memorată pe 32 octeţi</p>
<h3>”Şir de caractere continuat\”</h3>
<p>pe rândul următor!”               //constantă şir memorată pe 45 octeţi</p>
<p>”Şir \t cu secvenţe escape\n”      //constantă şir memorată pe 26 octeţi</p>
<p>’\n’                            //constantă caracter memorată pe un octet</p>
<p>”\n”  //constanta şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de şir)</p>
<p>”a\a4”           /*Şir memorat pe 4 octeţi:</p>
<p>Pe  primul  octet: codul  ASCII al  caracterului a</p>
<p>Pe  al doilea  octet: codul  ASCII al  caracterului escape \a</p>
<p>Pe al treilea octet: codul ASCII al caracterului 4</p>
<p>Pe al  patrulea octet:  terminatorul de şir NULL, cod ASCII 0 */</p>
<p>”\\ASCII\\”      /*Şir memorat pe 8 octeţi:</p>
<p>Pe primul octet: codul  ASCII al  caracterului backslah</p>
<p>Pe  al doilea   octet:  codul   ASCII   al   caracterului A</p>
<p>Pe  al  treilea  octet:  codul  ASCII    al   caracterului S</p>
<p>Pe al   patrulea octet: codul ASCII al caracterului S</p>
<p>Pe al  6-lea  octet:  codul  ASCII  al  caracterului  I</p>
<p>Pe al  7-lea  octet:  codul  ASCII  al  caracterului  I</p>
<p>Pe  al  8-lea  octet:  codul   ASCII   al  caracterului backslah</p>
<p>Pe al 9-ea octet: terminatorul de şir NULL, de cod ASCII 0 */</p>
<p><strong>   </strong>”1\175a”         /*Şir memorat pe 4 octeţi:</p>
<p>Primul octet: Codul ASCII al caracterul 1</p>
<p>Al 2-lea  octet:  codul  ASCII 125 (175 in octal) al caracterului }</p>
<p>Al  3-lea  octet:  codul  ASCII  al caracterului a</p>
<p>Al 4-lea  octet: codul ASCII 0 pentru terminatorul şirului */</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu:</span></em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{ cout&lt;&lt;&#8221;Şirul \&#8221;Ab9d\&#8221; este memorat pe:&#8221;&lt;&lt;sizeof(&#8220;Ab9d&#8221;)&lt;&lt;&#8221; octeţi\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Şirul \&#8221;Abcd\\t\&#8221; este memorat pe:&#8221;&lt;&lt;sizeof(&#8220;Abcd\t&#8221;)&lt;&lt;&#8221; octeţi\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Şirul \&#8221;\n\&#8221; este memorat pe &#8220;&lt;&lt;sizeof(&#8220;\n&#8221;)&lt;&lt;&#8221; octeţi\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Şirul \&#8221;\\n\&#8221; este memorat pe &#8220;&lt;&lt;sizeof(&#8220;\n&#8221;)&lt;&lt;&#8221; octeţi\n&#8221;;</p>
<p>cout&lt;&lt;&#8221;Şirul \&#8221;ABCDE\&#8221; se memorează pe &#8220;&lt;&lt;sizeof(&#8220;ABCDE&#8221;)&lt;&lt;&#8221; octeţi\n&#8221;;}</p>
<p>&nbsp;</p>
<p><strong> </strong></p>
<p><strong>2.5.3.  VARIABILE</strong></p>
<p>&nbsp;</p>
<p>Spre deosebire de constante, variabilele sunt date (obiecte informaţionale) ale căror valori se pot modifica în timpul execuţiei programului. Şi variabilele sunt caracterizate de atributele <em>nume</em>, <em>tip</em>, <em>valoare </em>şi <em>clasă de memorare</em>. Variabilele sunt <em>nume simbolice</em> utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor. Dacă la o constantă ne puteam referi folosind caracterele componente, la o variabilă ne vom referi prin numele ei. Numele unei variabile ne permite accesul la valoarea ei, sau schimbarea valorii sale, dacă este necesar acest lucru. Numele unei variabile este un identificator ales de programator. Ca urmare, trebuie respectate regulile enumerate în secţiunea identificatori.</p>
<p>&nbsp;</p>
<p>Dacă o dată nu are legături cu alte date (de exemplu, relaţia de ordine), vom spune că este o dată <em>izolată</em>. O dată izolată este o <em>variabilă simplă</em>. Dacă datele se grupează într-un anumit mod (în  tablouri &#8211; vectori, matrici &#8211; sau structuri), variabilele sunt <em>compuse</em> (<em>structurate</em>).</p>
<p>&nbsp;</p>
<p>În cazul constantelor, în funcţie de componenţa literalului, compilatorul stabilea, automat, tipul constantei. În cazul variabilelor este necesară specificarea tipului fiecăreia, la declararea acesteia. Toate variabilele care vor fi folosite în program, trebuie declarate înainte de utilizare.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.5.3.1.  Declararea variabilelor</strong></p>
<p>&nbsp;</p>
<p>Modul general de declarare a variabilelor este:</p>
<p>tip_variabile   listă_nume_variabile;</p>
<p>Se specifică tipul variabilei(lor) şi o listă formată din unul sau mai mulţi identificatori ai variabilelor de tipul respectiv. Într-un program în limbajul <strong>C++</strong>, declaraţiile de variabile pot apare în orice loc în programul sursă. La declararea variabilelor, se rezervă în memorie un număr de octeţi corespunzător tipului variabilei, urmând ca ulterior, în acea zonă de memorie, să fie depusă (memorată, înregistrată) o anumită valoare.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>int i, j;/*declararea var. simple <em>i,</em>  <em>j</em>, de tip <em>int</em>. Se rezervă pentru i şi j câte 16 biţi (2octeţi)*/</p>
<p>char c;         /* declararea variabilei simple <em>c</em>, de tip <em>char</em>. Se rezervă un octet. */</p>
<p>float lungime;    /* declararea variabilei simple <em>lungime</em>; se rezervă 4 octeţi */</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>2.5.3.2.  Iniţializarea variabilelor în declaraţii</strong></p>
<p>&nbsp;</p>
<p>În momentul declarării unei variabile, acesteia i se poate da (asigna, atribui) o anumită valoare. În acest caz, în memorie se rezervă numărul de locaţii corespunzător tipului variabilei respective, iar valoarea va fi depusă (memorată) în acele locaţii.</p>
<p>Forma unei declaraţii de variabile cu atribuire este:</p>
<p>tip_variabilă  nume_variabilă=expresie;</p>
<p>Se evaluează expresia, iar rezultatul acesteia este asignat variabilei specificate.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>char backslash=’\\’;    //declararea şi iniţializarea variabilei simple backslash</p>
<p>int a=7*9+2;     /* declararea variabilei simple a, de tip int şi iniţializarea ei cu valoarea 65*/</p>
<p>float radiani, pi=3.14;/*declararea variabilei radiani;declararea şi iniţializarea var. pi*/</p>
<p>short int z=3;              //declararea şi iniţializarea variabilei simple z</p>
<p>char d=’\011’;</p>
<p>char LinieNoua=’\n’;</p>
<p>double x=9.8, y=0;</p>
<p>&nbsp;</p>
<p>Compilatorul C++ furnizează mecanisme care permit programatorului să influenţeze codul generat la compilare, prin aşa-numiţii <strong><em>calificatori</em></strong>.</p>
<p>Aceştia sunt:</p>
<p>q  const;</p>
<p>q  volatile.</p>
<p>&nbsp;</p>
<p>Calificatorul <strong>const</strong> asociat unei variabile, nu va permite modificarea ulterioară a valorii acesteia, prin program (printr-o atribuire). Calificatorul <strong>volatile</strong> (cel implicit) are efect invers calificatorului const. Dacă după calificator nu este specificat tipul datei, acesta este considerat tipul implicit, adică <strong>int</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>const float b=8.8;</p>
<p>volatile char terminator;terminator=’@’;terminator=’*’;    //permis</p>
<p>b=4/5;                                                //nepermisa modificarea valorii variabilei b</p>
<p>const w;    volatile g;      //w, g de tip int, implicit</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.5.3.3.  </strong><strong>Opera</strong><strong>ţii de intrare/ieşire</strong></p>
<p>&nbsp;</p>
<p>Limbajele C/C++ nu posedă instrucţiuni de intrare/ieşire, deci de citire/scriere (ca limbajul PASCAL, de exemplu). În limbajul C aceste operaţii se realizează cu ajutorul unor funcţii (de exemplu, printf şi scanf), iar în limbajul C++ prin supraîncărcarea operatorilor (definirea unor noi proprietăţi ale unor operatori existenţi, fără ca proprietăţile anterioare să dispară), mai precis a operatorilor <strong>&gt;&gt;</strong> şi <strong>&lt;&lt;</strong> . Vom folosi în continuare abordarea limbajului C++, fiind, în momentul de faţă, mai simplă. În limbajul C++ sunt predefinite următoarele dispozitive logice de intrare/ieşire:</p>
<p><strong>cin</strong> &#8211; <strong>c</strong>onsole <strong>in</strong>put &#8211; dispozitivul de intrare (tastatura);</p>
<p><strong>cout</strong> &#8211; <strong>c</strong>onsole <strong>ou</strong>tput &#8211; dispozitivul de ieşire (monitorul).</p>
<p>Aşa cum se va vedea în capitolul 9, cin şi cout sunt, de fapt, obiecte (predefinite). Transferul informaţiei se realizează cu <strong>operatorul </strong><strong>&gt;&gt;</strong> pentru intrare şi <strong>operatorul </strong><strong>&lt;&lt;</strong> pentru ieşire. Utilizarea dispozitivelor de intrare/ieşire cu operatorii corespunzători determină deschiderea unui canal de comunicaţie a datelor către dispozitivul respectiv. După operator se specifică informaţiile care vor fi citite sau afişate.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p><strong>cout &lt;&lt; var;</strong>            /* afişează valoarea variabilei var pe monitor*/</p>
<p><strong>cin  &gt;&gt; var;</strong>            /* citeşte valoarea variabilei var de la tasatatură */</p>
<p>&nbsp;</p>
<p>Sunt posibile operarţii multiple, de tipul:</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>cout &lt;&lt; var1 &lt;&lt; var2 &lt;&lt; var3;</p>
<p>cin &gt;&gt; var1 &gt;&gt; var2 &gt;&gt; var3;</p>
<p>În acest caz, se efectuează succesiv, de la stânga la dreapta, scrierea, respectiv citirea valorilor variabilelor var1, var2 şi var3.</p>
<p>&nbsp;</p>
<p>Operatorul <strong>&gt;&gt;</strong> se numeşte <strong><em>operator extractor</em></strong> (extrage valori din fluxul datelor de intrare, conform tipului acestora), iar operatorul <strong>&lt;&lt; </strong>se numeşte <strong><em>operator insertor</em></strong> (inserează valori în fluxul datelor de ieşire, conform tipului acestora). Tipurile de date citite de la tastatură pot fi toate tipurile numerice, caracter sau şir de caractere. Tipurile de date transferate către ieşire pot fi: toate tipurile numerice, caracter sau şir de caractere. Operanzii operatorului extractor (<strong>&gt;&gt;</strong>) pot fi doar nume de variabile. Operanzii operatorului insertor (<strong>&lt;&lt;</strong>) pot fi nume de variabile (caz în care se afişează valoarea variabilei), constante sau expresii. Utilizarea dispozitivelor şi operatorilor de intrare/ieşire în C++ impune includerea fişierului  <strong>iostream.h</strong>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>char c;</p>
<p>cout&lt;&lt;&#8221;Astept un caracter:&#8221;;  //afişarea constantei şir de caractere, deci a mesajului</p>
<p>cin&gt;&gt;c;                       //citirea valorii variabilei c, de tip caracter</p>
<p>int a, b, e; double d;</p>
<p>cin&gt;&gt;a&gt;&gt;b&gt;&gt;e&gt;&gt;d;        //citirea valorilor variabilelor a, b, e, d de tip int, int, int, double</p>
<p>cout&lt;&lt;&#8221;a=&#8221;&lt;&lt;a&lt;&lt;&#8221;Valoarea expresiei a+b este:&#8221;&lt;&lt;a+b&lt;&lt;&#8217;\n&#8217;;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2 align="center">2.6.  OPERATORI ŞI EXPRESII</h2>
<p>&nbsp;</p>
<p>Datele (constante sau variabile) legate prin operatori, formează<strong> expresii </strong>(figura 2.4). Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor, datorită faptului că tipul unei date constă într-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare în memoria calculatorului şi <em>o mulţime de operatori</em> care pot fi aplicaţi acestor valori.</p>
<p>&nbsp;</p>
<p>Operatorii pot fi:</p>
<p>q  unari (necesită un singur operand);</p>
<p>q  binari (necesită doi operanzi);</p>
<p>q  ternari (trei operanzi).</p>
<p>O <strong>expresie </strong>este o combinaţie corectă din punct de vedere sintactic, formată din operanzi şi operatori. Expresiile, ca şi operanzii, au <strong><em>tip</em></strong> şi <strong><em>valoare</em></strong>.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>2.6.1.  OPERATORI </strong></p>
<p>&nbsp;</p>
<p>q  Operatorul unar <strong><em>adresă</em></strong> <strong>&amp;</strong>, aplicat identificatorului unei variabile, furnizează adresa la care este memorată aceasta. Poate fi aplicat <em>oricărui tip de date</em> şi se mai numeşte <em>operator de referenţiere.</em></p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>int a;</p>
<p>cout&lt;&lt;&#8221;Adresa la care este memorata variabila a este:&#8221;&lt;&lt;<strong><em>&amp;</em></strong>a;</p>
<p>q  Operatorul <strong><em>de atribuire</em></strong><em> (de asignare) </em>este un operator <em>binar</em> care se aplică tuturor tipurilor de variabile. Este folosit sub formele următoare:</p>
<p>nume_variabilă<strong>=</strong>expresie;</p>
<p><em>sau:</em><em>        </em>expresie1<strong>=</strong>expresie2;</p>
<p>Se evaluează expresia din membrul drept, iar valoarea acesteia este atribuită variabilei din membrul stâng. Dacă tipurile membrilor stâng şi drept diferă, se pot realiza anumite conversii, prezentate în paragraful 2.7.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>float x; int a,b; x=9.18;</p>
<p>a=b=10;</p>
<p>int s; s=a+20*5;             //rezultat: s=110</p>
<p>s=x+2;                     //rezultat s=11, deoarece s este int.</p>
<p>&nbsp;</p>
<p>Aşa cum se observă în linia a 2-a din exemplul precedent, operatorul de atribuire poate fi utilizat de mai multe ori în aceeaşi expresie. Asociativitatea operatorului are loc de la dreapta la stânga. Astfel, mai întâi b=10, apoi a=b.</p>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{</p>
<p>float x,y=4.25;   char car=’A’; int a,b,c;</p>
<p>cout&lt;&lt;”Val. lui y este:”&lt;&lt;y&lt;&lt;’\n’;             //Afişare: Val. lui y este:4.25</p>
<p>x=y; cout&lt;&lt;”Val. lui x este:”&lt;&lt;x&lt;&lt;’\n’;    //Afişare: Val. lui x este:4.25</p>
<p>a=x;cout&lt;&lt;”Val.lui a este:”&lt;&lt;a&lt;&lt;’\n’; //Afişare:Val. lui a este:4, deoarece a de tip int!!!</p>
<p>c=b=a; cout&lt;&lt;”b=”&lt;&lt;b&lt;&lt;”\tc=”&lt;&lt;c&lt;&lt;’\n’;         //Afişare: b=4      c=4</p>
<p>cout&lt;&lt;”Introduceţi val. lui c:”; cin&gt;&gt;c;       // citire val. pentru c</p>
<p>cout&lt;&lt;”Val. lui c este:”&lt;&lt;c&lt;&lt;’\n’;            //Afişare: Val. lui c este:4</p>
<p>}</p>
<p>&nbsp;</p>
<p>Operatorul poate fi aplicat tipurilor de date întregi, reale, caracter, şi chiar şiruri de caractere, aşa cum vom vedea în capitolele următoare (exemplu: char şir [10]=”a5dfgthklj”).</p>
<p>&nbsp;</p>
<p>q  Operatori <strong><em>aritmetici unari</em></strong>:</p>
<p><strong>Operator         Semnificaţie                                        Exemple</strong></p>
<p><strong>-</strong><strong>                      </strong>Minus unar                                          -a</p>
<p><strong>++</strong><strong>                    </strong>Operator de incrementare                    a++      sau</p>
<p>(adună 1 la valoarea operandului)       ++a</p>
<p><strong>&#8211;</strong><strong>                    </strong>Operator de decrementare                    a&#8211;        sau</p>
<p>(scade 1 din valoarea operandului)      &#8211;a</p>
<p>&nbsp;</p>
<p>q  Operatorul <strong>-</strong><strong> </strong>unar schimbă semnul operandului.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>int a,b;    cout&lt;&lt;”a=”&lt;&lt;-a&lt;&lt;’\n’;   b=-a;</p>
<p>cout&lt;&lt;”b=”&lt;&lt;b&lt;&lt;’\n’;</p>
<p>Operatorul &#8211; unar poate fi aplicat datelor întregi, reale, caracter.</p>
<p>&nbsp;</p>
<p>q  Operatorii de incrementare şi decrementare pot fi aplicaţi<em>  datelor numerice sau caracter</em>.</p>
<p>Ambii operatori pot fi folosiţi în formă <em>prefixată</em>, înaintea operandului, (++a, respectiv &#8211;a) sau <em>postfixată</em>, după operand<em> </em>(a++, respectiv a&#8211;).</p>
<p>Operatorul de decrementare &#8212; care poate fi folosit în formă <em>prefixată</em> (&#8211;a) sau <em>postfixată</em> (a&#8211;).</p>
<p>&nbsp;</p>
<p>Utilizarea acestor operatori în expresii, în formă prefixată sau postfixată, determină evaluarea acestora în moduri diferite, astfel:</p>
<p>&nbsp;</p>
<p>y=++x              este echivalent cu:       x=x+1;</p>
<p>y=x;</p>
<p>y=x++              este echivalent cu:       y=x;</p>
<p>x=x+1;</p>
<p>y=&#8211;x                este echivalent cu:       x=x-1;</p>
<p>y=x;</p>
<p>y=x&#8211;                este echivalent cu:       y=x;</p>
<p>x=x-1;</p>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong>:  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{ int a=9; cout&lt;&lt;”a++=”&lt;&lt;a++&lt;&lt;’\n’; //Afişare: a++=9</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;               //Afişare: a=10</p>
<p>a=9;                             //Revenire in situatia anterioara</p>
<p>cout&lt;&lt;”++a=”&lt;&lt;++a&lt;&lt;’\n’;           //Afişare: ++a=10</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              //Afişare: a=10</p>
<p>a=9; cout&lt;&lt;”a&#8211;=”&lt;&lt;a&#8211;&lt;&lt;’\n’;      //Afişare: a&#8211;=9</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              //Afişare: a=8</p>
<p>a=9;                            //Revenire in situaţia anterioara</p>
<p>cout&lt;&lt;”&#8211;a=”&lt;&lt;&#8211;a&lt;&lt;’\n’;           //Afişare: &#8211;a=8</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              //Afişare: a=8</p>
<p>int z,x=3; z=x++-2;</p>
<p>cout&lt;&lt;”z=”&lt;&lt;z&lt;&lt;’\n’;              //Afişare: z=1</p>
<p>cout&lt;&lt;&#8221;x=”&lt;&lt;x&lt;&lt;’\n’;              //Afişare: x=4</p>
<p>x=3; z=++x-2; cout&lt;&lt;”z=”&lt;&lt;z&lt;&lt;’\n’;  //Afişare: z=2</p>
<p>cout&lt;&lt;&#8221;x=”&lt;&lt;x&lt;&lt;’\n’;              //Afişare: x=4</p>
<p>}</p>
<p>q  Operatori <strong><em>aritmetici binari:</em></strong></p>
<p><strong>Operator                     Semnificaţie                                                    Exemple</strong></p>
<p><strong>+</strong><strong>                      </strong>Adunarea celor doi operanzi<strong>                                        </strong>a+b</p>
<p><strong>-</strong><strong>                      </strong>Scăderea celor doi operanzi                                         a-b</p>
<p><strong>*</strong><strong>                      </strong>Înmulţirea<strong> </strong>celor doi operanzi                                       a*b</p>
<p><strong>/</strong><strong>                      </strong>Împărţirea<strong> </strong>celor doi operanzi                                       a/b</p>
<p><strong>%                    </strong>Operatorul modulo (operatorul rest)                            a%b</p>
<p>(furnizează restul împărţirii operatorului stâng la operatorul drept).</p>
<p>&nbsp;</p>
<p>Operatorul modulo se aplică numai operanzilor întregi (de tip int sau char). Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor întregi sau reale.</p>
<p>Dacă într-o expresie cu 2 operanzi şi un operator binar aritmetic, ambii operanzi sunt întregi, rezultatul expresiei va fi tot un număr întreg. De exemplu, la evaluarea expresiei 9/2, ambii operanzi fiind întregi, rezultatul furnizat este numărul întreg 4.</p>
<p>Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate, care determină precis modul în care va fi evaluată expresia în care aceştia apar. În tabelul 2.3 sunt prezentaţi operatorii anteriori, în ordinea descrescătoare a priorităţii. Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="219">Tabelul 2.3.</td>
<td valign="top" width="226"></td>
<td valign="top" width="197"></td>
</tr>
<tr>
<td valign="top" width="219">
<p align="center"><strong>Clasă de operatori</strong></p>
</td>
<td valign="top" width="226">
<p align="center"><strong>Operatori</strong></p>
</td>
<td valign="top" width="197">
<p align="center"><strong>Asociativitate</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="219">Unari</td>
<td valign="top" width="226">
<p align="center">-  (unar)      ++       &#8211;</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="219">Multiplicativi</td>
<td valign="top" width="226">
<p align="center">*     /    %</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Aditivi</td>
<td valign="top" width="226">
<p align="center">+      -</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Atribuire</td>
<td valign="top" width="226">
<p align="center">=</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{</p>
<p>int rezult, a=20,b=2,c=25,d=4; rezult=a-b;</p>
<p>cout&lt;&lt;”a-b=”&lt;&lt;rezult&lt;&lt;’\n’;                   // Afişare: a-b=18</p>
<p>rezult=a+b; cout&lt;&lt;”a+b=”&lt;&lt;rezult&lt;&lt;’\n’;        // Afişare: a+b=22</p>
<p>rezult=a*b;cout&lt;&lt;”c*b=”&lt;&lt;rezult&lt;&lt;’\n’;         // Afişare: c*b=50</p>
<p>rezult=a/d; cout&lt;&lt;”a/d=”&lt;&lt;rezult&lt;&lt;’\n’;        // Afişare: a/d=5</p>
<p>rezult=c%b; cout&lt;&lt;”c%b=”&lt;&lt;rezult&lt;&lt;’\n’;               // Afişare: c%b=1</p>
<p>rezult=c/b*d; cout&lt;&lt;”c/b*d=”&lt;&lt;rezult&lt;&lt;’\n’;    // Afişare: c/b*d=48</p>
<p>rezult= -b+a; cout&lt;&lt;”-b+a=”&lt;&lt;rezult&lt;&lt;’\n’;      // Afişare: -b+a=18</p>
<p>rezult= -(b+a); cout&lt;&lt;”-(b+a)=”&lt;&lt;rezult&lt;&lt;’\n’;  // Afişare: -(b+a)=-22</p>
<p>rezult=b+c*d;cout&lt;&lt;”b+c*d=”&lt;&lt;rezult&lt;&lt;’\n’;      // Afişare: b+c*d=102</p>
<p>rezult=(b+c)*d;cout&lt;&lt;”(b+c)*d=”&lt;&lt;rezult&lt;&lt;’\n’;  // Afişare: (b+c)*d=108</p>
<p>}</p>
<p>&nbsp;</p>
<p>q  Operatori <strong><em>aritmetici binari compuşi</em></strong></p>
<p><strong>Operator                     Semnificaţie                Exemple</strong></p>
<p><strong>+=</strong><strong>                                </strong>a=a+b<strong>                           </strong>a+=b</p>
<p><strong>-=</strong><strong>                                </strong>a=a+b                           a-=b</p>
<p><strong>*=</strong><strong>                                </strong>a=a*b                           a*=b</p>
<p><strong>/=</strong><strong>                                </strong>a=a/b                            a/=b</p>
<p><strong>%=                              </strong>a=a%b                         a%=b</p>
<p>Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare:</p>
<p><em> </em>expresie1  operator= expresie2;</p>
<p>Rezultatul obţinut este acelaşi cu rezultatul obţinut prin:</p>
<p><em>     </em>expresie1 = expresie1  operator  expresie2;</p>
<p>Toţi aceşti operatorii modifică valoarea operandului stâng prin adunarea, scăderea, înmulţirea sau împărţirea  acestuia prin valoarea operandului drept.</p>
<p>Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1.</p>
<p>Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi. Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire.</p>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu:</span></em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{</p>
<p>int a,b; float c=9.3; a=3; b=8;</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              //Afişare  a=3</p>
<p>a+=b; cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;         //Afişare  a=11</p>
<p>a-=b; cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;         //Afişare  a=-5</p>
<p>a*=b; cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;         //Afişare  a=24</p>
<p>a/=b; cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;         //Afişare  a=0</p>
<p>a%=b; cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;         //Afisare  a=3</p>
<p>}</p>
<p>q  Operatori <strong><em>relaţionali binari</em></strong></p>
<p><strong>Operator                     Semnificaţie                            Exemple</strong></p>
<p><strong>==</strong><strong>                                </strong>Egal cu<strong>                                     </strong>a==b</p>
<p><strong>!=</strong><strong>                                </strong>Diferit de                                 a!=b</p>
<p><strong>&lt;</strong><strong>                                  </strong>Mai mic decât                          a&lt;b</p>
<p><strong>&lt;=</strong><strong>                                </strong>Mai mic sau egal                      a&lt;=b</p>
<p><strong>&gt;</strong><strong>                                  </strong>Mai mare decât                                    a&gt;b</p>
<p><strong>&gt;=</strong><strong>                                </strong>Mai mare sau egal                    a&gt;=b</p>
<p>Primii doi operatori mai sunt numiţi <em>operatori de egalitate</em>. Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor. Rezultatul unei expresii în care apare unul din operatorii relaţionali binari este întreg şi are valoarea zero (0) dacă relaţia este falsă, sau valoarea unu (1) (sau diferită de 0 în cazul compilatoarelor sub UNIX), dacă relaţia este adevărată. Aceşti operatorii pot fi aplicaţi datelor de tip întreg, real sau char.</p>
<p>Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate în tabelul 2.4.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="219">Tabelul 2.4.</td>
<td valign="top" width="226"></td>
<td valign="top" width="197"></td>
</tr>
<tr>
<td valign="top" width="219">
<p align="center"><strong>Clasă de operatori</strong></p>
</td>
<td valign="top" width="226">
<p align="center"><strong>Operatori</strong></p>
</td>
<td valign="top" width="197">
<p align="center"><strong>Asociativitate</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="219">Unari</td>
<td valign="top" width="226">
<p align="center">-  (unar)      ++       &#8211;</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="219">Multiplicativi</td>
<td valign="top" width="226">
<p align="center">*     /    %</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Aditivi</td>
<td valign="top" width="226">
<p align="center">+      -</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Atribuire</td>
<td valign="top" width="226">
<p align="center">=</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="219">Relaţionali</td>
<td valign="top" width="226">
<p align="center">&lt;   &lt;=   &gt;   &gt;=</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">De egalitate</td>
<td valign="top" width="226">
<p align="center">==   !=</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Atribuire şi aritmetici binari</td>
<td valign="top" width="226">
<p align="center">=    *=    /=    %=    +=    -=</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Observaţie: </span></em></strong>Deosebirea dintre operatorii <strong>==</strong> (relaţional, de egalitate) şi <strong>=</strong> (de atribuire) constă în faptul că primul nu modifică valoarea nici unuia dintre operanzii săi, pe când cel de-al doilea modifică valoarea operandului stâng (vezi exemplul următor)</p>
<p>&nbsp;</p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{</p>
<p>int a=1, b=20, lim=100; int rezult; rezult=a&lt;b;</p>
<p>cout&lt;&lt;”a&lt;b=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>// Afişare:  a&lt;b=1 (sau o altă valoare diferită de zero pentru alte compilatoare)</p>
<p>rezult=a&lt;=b;</p>
<p>//operatorul realţional &lt;= are prioritate mai mare decât cel de atribuire</p>
<p>cout&lt;&lt;”a&lt;=b=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>// Afisare:  a&lt;b=1 (sau o alta valoare diferită de zero pentru alte compilatoare)</p>
<p>rezult=a&gt;b; cout&lt;&lt;”a&gt;b=”&lt;&lt;rezult&lt;&lt;’\n’;        // Afişare:  a&lt;b=0</p>
<p>rezult=a+10&gt;=lim; cout&lt;&lt;”a+10&gt;=lim=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>/* Operatorul + are prioritate mai mare decât operatorul &gt;= .   Afişare:  a+10&gt;=lim=0 */</p>
<p>rezult=a+(10&gt;=lim);     cout&lt;&lt;”a+(10&gt;=lim)=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>/* Schimbarea prioritatii operatorilor prin folosirea parantezelor;  Afişare:  a+(10&gt;=lim)=1  */</p>
<p>rezult=a==b;</p>
<p>cout&lt;&lt;”a==b=”&lt;&lt;rezult&lt;&lt;’\n’;       // Afişare:  a==b=0</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              // Afişare:  a=1</p>
<p>cout&lt;&lt;”b=”&lt;&lt;b&lt;&lt;’\n’;              // Afişare:  b=20</p>
<p>rezult=a=b; cout&lt;&lt;”a=b=”&lt;&lt;rezult&lt;&lt;’\n’;   // Afişare:  a=b=20</p>
<p>cout&lt;&lt;”a=”&lt;&lt;a&lt;&lt;’\n’;              // Afişare:  a=20</p>
<p>cout&lt;&lt;”b=”&lt;&lt;b&lt;&lt;’\n’;              // Afişare:  b=20</p>
<p>rezult=5&gt;b&gt;10;cout&lt;&lt;”b=”&lt;&lt;b&lt;&lt;’\n’;  // Afişare:  b=20</p>
<p>cout&lt;&lt;”5&gt;b&gt;10=”&lt;&lt;rezult&lt;&lt;’\n’;     //Echivalent cu (5&gt;b)&gt;10 Afişare:  5&gt;b&gt;10=0</p>
<p>}</p>
<p><strong><em> </em></strong></p>
<p>q  Operatori <strong><em>logici pe cuvânt</em></strong></p>
<p><strong>Operator                     Semnificaţie                                                    Exemple</strong></p>
<p><strong>!</strong><strong>                                  </strong>Not (<strong>negaţie</strong> logică)                                         !(a==b)</p>
<p><strong>&amp;&amp;</strong><strong>                                </strong>And (conjuncţie, <strong>şi</strong> logic)                                 <strong>(</strong>a&gt;b) &amp;&amp; (b&gt;c)</p>
<p><strong>||</strong><strong>                                </strong>Or<strong> (</strong>disjuncţie, <strong>sau</strong> logic)<strong>                                  (</strong>a&gt;b) || (b&gt;c)</p>
<p>Aceşti operatori pot fi aplicaţi datelor de tip întreg, real sau caracter. Evaluarea unei expresii în care intervin operatorii logici se face conform tabelului 2.5.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="142">Tabelul 2.5.</td>
<td valign="top" width="123"></td>
<td valign="top" width="133"></td>
<td valign="top" width="123"></td>
<td valign="top" width="123"></td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center"><strong>x</strong></p>
</td>
<td valign="top" width="123">
<p align="center"><strong>y</strong></p>
</td>
<td valign="top" width="133">
<p align="center"><strong>!x</strong></p>
</td>
<td valign="top" width="123">
<p align="center"><strong>x&amp;&amp;y</strong></p>
</td>
<td valign="top" width="123">
<p align="center"><strong>x||y</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="133">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="133">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="133">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">adevărat (1)</p>
</td>
</tr>
<tr>
<td valign="top" width="142">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="133">
<p align="center">adevărat (1)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
<td valign="top" width="123">
<p align="center">fals (0)</p>
</td>
</tr>
</tbody>
</table>
<p>Expresia   !expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero.</p>
<p>Expresia   expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1, FIE expresie2 au valori diferite de zero.</p>
<p>Expresia   expresie1 &amp;&amp; expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero.</p>
<p><strong><span style="text-decoration: underline;"> </span></strong></p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong>  </strong>Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{ int a=0, b=10, c=100, d=200; int rezult; rezult=a&amp;&amp;b;</p>
<p>cout&lt;&lt;”a&amp;&amp;b=”&lt;&lt;rezult&lt;&lt;’\n’;            //Afişare  a&amp;&amp;b=0</p>
<p>rezult=a||b; cout&lt;&lt;”a||b=”&lt;&lt;rezult&lt;&lt;’\n’;//Afişare  a||b=1 (sau valoare nenula)</p>
<p>rezult=!a;cout&lt;&lt;”!a=”&lt;&lt;rezult&lt;&lt;’\n’;     //Afişare  !a=1 (sau valoare nenula)</p>
<p>rezult=!b; cout&lt;&lt;”!b=”&lt;&lt;rezult&lt;&lt;’\n’;     //Afişare  !b=0</p>
<p>rezult=(a&gt;b) || (b&gt;c);cout&lt;&lt;”(a&gt;b) || (b&gt;c)=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>//Afişare (a&gt;b) || (b&gt;c) =1(sau valoare nenula)</p>
<p>rezult=!(c&lt;d);cout&lt;&lt;”!(c&lt;d)=”&lt;&lt;rezult&lt;&lt;’\n’;//Afişare  !(c&gt;d)=0</p>
<p>rezult=(a-b)&amp;&amp;1;cout&lt;&lt;”(a-b)&amp;&amp;1=”&lt;&lt;rezult&lt;&lt;’\n’;</p>
<p>//Afişare (a-b)&amp;&amp;1 =1(sau valoare nenula)</p>
<p>rezult=d||b&amp;&amp;a;cout&lt;&lt;”d||b&amp;&amp;a=”&lt;&lt;rezult&lt;&lt;’\n’;//Afişare d||b&amp;&amp;a =1</p>
<p>}// În evaluarea expresiilor din exemplu, s-au aplicat priorităţile operatorilor, indicate în tabelul. 2.6.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="219">Tabelul 2.6.</td>
<td valign="top" width="226"></td>
<td valign="top" width="197"></td>
</tr>
<tr>
<td valign="top" width="219">
<p align="center"><strong>Clasă de operatori</strong></p>
</td>
<td valign="top" width="226">
<p align="center"><strong>Operatori</strong></p>
</td>
<td valign="top" width="197">
<p align="center"><strong>Asociativitate</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="219">Unari</td>
<td valign="top" width="226">
<p align="center">!   &#8211; (unar)      ++       &#8211;</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="219">Multiplicativi</td>
<td valign="top" width="226">
<p align="center">*     /    %</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Aditivi</td>
<td valign="top" width="226">
<p align="center">+      -</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">Atribuire</td>
<td valign="top" width="226">
<p align="center">=</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="219">relaţionali</td>
<td valign="top" width="226">
<p align="center">&lt;   &lt;=   &gt;   &gt;=</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">de egalitate</td>
<td valign="top" width="226">
<p align="center">==   !=</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">logici</td>
<td valign="top" width="226">
<p align="center">&amp;&amp;</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">logici</td>
<td valign="top" width="226">
<p align="center">||</p>
</td>
<td valign="top" width="197">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="219">atribuire şi aritmetici binari</td>
<td valign="top" width="226">
<p align="center">=    *=    /=    %=    +=    -=</p>
</td>
<td valign="top" width="197">de la dreapta la stânga</td>
</tr>
</tbody>
</table>
<p><strong><em><span style="text-decoration: underline;"> </span></em></strong></p>
<p><strong><em><span style="text-decoration: underline;">Exerciţiu</span></em></strong><strong><em>:</em></strong><strong> </strong>Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură, sau 0 în caz contrar.</p>
<p>#include &lt;iostream.h&gt;</p>
<p>void main()</p>
<p>{</p>
<p>double lmin, lmax, nr;cout&lt;&lt;&#8221;Numar=&#8221;;cin&gt;&gt;nr;</p>
<p>cout&lt;&lt;”Limita inferioară a intervalului:”; cin&gt;&gt;lmin;</p>
<p>cout&lt;&lt;”Limita superioară a intervalului:”; cin&gt;&gt;lmax;</p>
<p>cout&lt;&lt;(nr&gt;=lmin &amp;&amp; nr&lt;=lmax); }</p>
<p>&nbsp;</p>
<p>q  Operatori <strong><em>logici pe bit</em></strong></p>
<p><strong>Operator         Semnificaţie                                                    Exemple</strong></p>
<p><strong>~</strong><strong>                      </strong>Negaţie (cod complementar faţă de unu)                     ~a</p>
<p><strong>&amp;</strong><strong>                      </strong>AND (Conjuncţie, şi logic pe bit                                  a &amp; 0377</p>
<p><strong>|</strong><strong>                      </strong>OR<strong> (</strong>Disjuncţie, sau logic pe bit)<strong>                                  </strong>a <strong>| </strong>0377</p>
<p><strong>^</strong>                      XOR (Sau exclusiv logic pe bit)                                   a^b</p>
<p><strong>&lt;&lt;</strong><strong>                    </strong>Deplasare stânga                                              0377 &lt;&lt; 2</p>
<p><strong>&gt;&gt;</strong><strong>                    </strong>Deplasare dreapta                                            0377 &gt;&gt; 2</p>
<p>&nbsp;</p>
<p>Aceşti operatori nu se aplică numerelor reale, ci numai datelor de tip întreg sau caracter. Primul operator este unar, ceilalţi binari. Operatorii acţionează la nivel de bit, la nivelul reprezentării interne (în binar), conform tabelelului 2.7.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="104">Tabelul 2.7.</td>
<td valign="top" width="104"></td>
<td valign="top" width="104"></td>
<td valign="top" width="113"></td>
<td valign="top" width="104"></td>
<td valign="top" width="113"></td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center"><strong>x</strong></p>
</td>
<td valign="top" width="104">
<p align="center"><strong>y</strong></p>
</td>
<td valign="top" width="104">
<p align="center"><strong>x&amp;y</strong></p>
</td>
<td valign="top" width="113">
<p align="center"><strong>x | y</strong></p>
</td>
<td valign="top" width="104">
<p align="center"><strong>x^y</strong></p>
</td>
<td valign="top" width="113">
<p align="center"><strong>~x</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="113">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="113">
<p align="center">0</p>
</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="113">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="113">
<p align="center">0</p>
</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="113">
<p align="center">1</p>
</td>
<td valign="top" width="104">
<p align="center">1</p>
</td>
<td valign="top" width="113">
<p align="center">1</p>
</td>
</tr>
<tr>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="113">
<p align="center">0</p>
</td>
<td valign="top" width="104">
<p align="center">0</p>
</td>
<td valign="top" width="113">
<p align="center">1</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Operatorul <strong>~</strong> are aceeaşi prioritate ca şi ceilalţi operatori unari. El furnizează complementul faţă de unu al unui întreg, adică va schimba fiecare bit de pe 1 în zero şi invers. Operatorii de deplasare pe bit (<strong>&lt;&lt;</strong> şi <strong>&gt;&gt;</strong>) efectuează deplasarea la stânga sau la dreapta a operandului stâng, cu numărul de biţi indicaţi de operandul drept. Astfel, x&lt;&lt;2 deplasează biţii din x la stânga, cu două poziţii, introducând zero pe poziţiile rămase vacante.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>int a=3;    //Reprezentare internă a lui a (pe 2 octeţi):       0000000000000<strong>011</strong></p>
<p>int b=5;        //Reprezentare internă a lui b (pe 2 octeţi):      0000000000000<strong>101</strong></p>
<p>int rez=~a;</p>
<p>cout&lt;&lt;&#8221;~&#8221;&lt;&lt;a&lt;&lt;&#8217;='&lt;&lt;rez&lt;&lt;&#8217;\n&#8217;; //~3= -4</p>
<p>//Complementul faţă de unu este: 1111111111111<strong>100</strong>  (în octal: 0177777774  (!a= &#8211; 4)</p>
<p>rez=a &amp; b; cout&lt;&lt;a&lt;&lt;&#8217;&amp;&#8217;&lt;&lt;b&lt;&lt;&#8217;='&lt;&lt;rez&lt;&lt;&#8217;\n&#8217;; //3&amp;5=1</p>
<p>//a&amp;b=0000000000000<strong>001</strong> =1</p>
<p>rez=a^b; cout&lt;&lt;a&lt;&lt;&#8217;^'&lt;&lt;b&lt;&lt;&#8217;='&lt;&lt;rez; // 3^5= 6</p>
<p>//a ^b = 0000000000000<strong>110</strong></p>
<p>rez=a|b; cout&lt;&lt;a&lt;&lt;&#8217;|'&lt;&lt;b&lt;&lt;&#8217;='&lt;&lt;rez; //3|5= 7</p>
<p>//a | b = 0000000000000<strong>111</strong></p>
<p>rez=a&lt;&lt;2; cout&lt;&lt;a&lt;&lt;&#8221;&lt;&lt;&#8221;&lt;&lt;3&lt;&lt;&#8217;='&lt;&lt;rez;    //3&lt;&lt;2=16=2*2</p>
<p>//a&lt;&lt;2= 000000000<strong>1100000</strong></p>
<p>rez=5&gt;&gt;2; cout&lt;&lt;b&lt;&lt;&#8221;&gt;&gt;&#8221;&lt;&lt;2&lt;&lt;&#8217;='&lt;&lt;rez;    //5&gt;&gt;2=1=5/2</p>
<p>//b&gt;&gt;2= 0000000000000<strong>001</strong></p>
<p>&nbsp;</p>
<p>Operatorul binar ^  îşi găseşte o utilizare tipică în expresii ca: x&amp;^077, care maschează ultimii 6 biţi ai lui x pe zero.</p>
<p>Operatorul &amp; este adesea utilizat în expresii ca x&amp;0177, unde setează toţi biţii pe zero, cu excepţia celor de ordin inferior din x.</p>
<p>Operatorul | este utilizat în expresii ca: x&amp;MASK , unde setează pe unu biţii care în x şi masca MASK sunt setaţi pe unu.</p>
<p>Operatorii logici pe bit &amp; şi | sunt diferiţi de operatorii logici &amp;&amp; şi || (pe cuvânt).</p>
<p>Deplasarea la stânga a unei date cu n poziţii este echivalentă cu înmulţirea valorii acesteia cu 2. Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu împărţirea valorii acesteia cu 2.</p>
<p>Combinând operatorii logici pe bit cu operatorul de atribuire, se obţin operatorii:</p>
<p><strong>&amp;=</strong>, <strong>^=</strong>, <strong>|=</strong>, <strong>&lt;&lt;=</strong>, <strong>&gt;&gt;=</strong>.</p>
<p><em> </em></p>
<p>q  Operatorul <strong><em>condiţional</em></strong></p>
<p>Este un operator ternar (necesită 3 operanzi), utilizat în construcţii de forma:</p>
<p align="center">expresie1<strong>?</strong>expresie2<strong>:</strong>expresie3</p>
<p>&nbsp;</p>
<p>Se evaluează <em>expresia1</em>. Dacă aceasta are o valoare diferită de zero, atunci tipul şi valoarea întregii expresii vor fi aceleaşi cu tipul şi valoarea <em>expresiei2</em>. Altfel (dacă expresie1 are valoarea zero), tipul şi valoarea întregii expresii vor fi aceleaşi cu tipul şi valoarea <em>expresiei3</em>. Deci operatorul condiţional este folosit pentru a atribui întregii expresii tipul şi valoarea expresiei2 sau a expresiei3, în funcţie de o anumită condiţie. Acest lucru este echivalent cu:</p>
<p><span style="text-decoration: underline;">Dacă</span> <em>expresie1</em> diferită de zero</p>
<p><span style="text-decoration: underline;">Atunci</span> evaluează <em>expresie2</em></p>
<p><span style="text-decoration: underline;">Altfel</span> evaluează <em>expresie3</em></p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>int semn=(x&lt;0)?-1:1</p>
<p>Dacă x&lt;0, atunci semn=-1, altfel semn=1.</p>
<p><strong><em> </em></strong></p>
<p>q  Operatorul <strong><em>virgulă</em></strong></p>
<p>Este utilizat în construcţii de forma:</p>
<p>expresie1 , expresie2</p>
<p>Operatorul virgulă forţează evaluarea unei expresii de la stânga la dreapta. Tipul şi valoarea întregii expresii este dată de tipul şi valoarea expresiei2. Operatorul virgulă este folosit în instrucţiunea <strong><em>for</em></strong>. Operatorul virgulă are cea mai mică prioritate.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>int x, c, y;</p>
<p>cout&lt;&lt;”Astept val. ptr. y:”; cin&gt;&gt;y;</p>
<p>x=(c=y, c&lt;=5);    /* c va primi valoarea lui y (citită); se verifică dacă c este mai mic sau</p>
<p align="right">egal cu 5. Daca nu, x=0; daca da, x=1 sau x=valoare diferită de zero)*/</p>
<p>x++, y&#8211;;                  //întâi este incrementat x, apoi este decrementat y</p>
<p>q  Operatorul <strong><em>sizeof()</em></strong></p>
<p>Este un operator unar, care are ca rezultat numărul de octeţi pe care este memorată o dată de un anumit tip. Operandul este <em>un tip</em> sau <em>o dată (constantă sau variabilă) de un anumit tip</em>.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong><strong><em></em></strong></p>
<p>cout&lt;&lt;sizeof(int);     // afişează numărul de octeţi pe care este memorat un întreg (2)</p>
<p>cout&lt;&lt;sizeof(”ab6*”);// afişează 5, nr. de octeţi pe care este memorată constanta şir ”ab6*”</p>
<p>&nbsp;</p>
<p>q  Operatorul <strong><em>(tip)</em></strong><em> </em></p>
<p>Este un operator unar care apare în construcţii numite ”cast” şi converteşte tipul operandului său la tipul specificat între paranteze.</p>
<p><strong><em><span style="text-decoration: underline;">Exemple:</span></em></strong></p>
<p>int a; (float) a; // converteşte operandul a (care era de tip întreg) în float</p>
<p>În afara operatorilor prezentaţi, există şi alţii, pe care îi vom enumera în continuare. Despre aceşti operatori vom discuta în capitolele viitoare, când cunoştinţele acumulate vor permite acest lucru.</p>
<p><strong> </strong></p>
<p>q  Operatorul unar <strong>*</strong><strong></strong></p>
<p>Este operator unar, numit şi <em>operator de deferenţiere. </em>Se aplică unei expresii de tip pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul. Operatorii &amp; (adresă) şi * sunt complementari.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong> Expresia *a este înlocuită cu valoarea de la adresa conţinută în variabila pointer a.</p>
<p>&nbsp;</p>
<p>q  Operatorii <strong><em>paranteză</em></strong></p>
<p>Parantezele rotunde <strong>( )</strong><strong> </strong>se utilizează în expresii, pentru schimbarea ordinii de efectuare a operaţiilor, sau la apelul funcţiilor. La apelul funcţiilor, parantezele rotunde încadrează lista parametrilor efectivi. Din acest motiv, parantezele rotunde sunt numite şi <em>operatori de apel de funcţie</em><em>.</em></p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>double sum<strong>(</strong>double a, double b<strong>)</strong>;</p>
<p>/*declar. funcţiei sum, care primeşte 2 argumente reale(double) şi returnează o valoare tip double */</p>
<p>void main()</p>
<p>{</p>
<p>. . .</p>
<p>double a=sum<strong>(</strong>89.9, 56.6<strong>)</strong>;  //apelul funcţiei <em>sum</em>, cu parametri efectivi 89.9 şi 56.6</p>
<p>int s0=6; double s1=<strong>(</strong>s0+9<strong>)</strong>/a; //folosirea parantezelor în expresii</p>
<p>. . .</p>
<p>}</p>
<p>&nbsp;</p>
<p>q  Operatorii <strong><em>de indexare</em></strong></p>
<p>Operatorii de indexare<strong> </strong>sunt parantezele pătrate <strong>[]</strong>. Acestea<strong> </strong>includ expresii întregi care reprezintă indici ai unui tablou.</p>
<p>q  Operatori <strong><em>de acces la membri structurilor</em></strong></p>
<p>Operatorii <strong>::</strong>, <strong>.</strong>,<strong> </strong><strong>-&gt;</strong>, <strong>.*</strong> şi <strong>-&gt;*</strong> permit accesul la componentele unei structuri. Ei vor fi studiaţi în capitolul 7.</p>
<p>&nbsp;</p>
<p>În tabelul 2.8. sunt prezentaţi toţi operatorii, grupaţi pe categorii, cu priorităţile lor şi regulile de asociativitate. Operatorii dintr-o categorie au aceeaşi prioritate.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td colspan="2" valign="top" width="189">Tabelul 2.8.</td>
<td valign="top" width="274"></td>
<td valign="top" width="180"></td>
</tr>
<tr>
<td valign="top" width="38">
<p align="center">Nr.</p>
</td>
<td valign="top" width="151">
<p align="center"><strong>Clasă de operatori</strong></p>
</td>
<td valign="top" width="274">
<p align="center"><strong>Operatori</strong></p>
</td>
<td valign="top" width="180">
<p align="center"><strong>Asociativitate</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="38">1.</td>
<td valign="top" width="151">Primari</td>
<td valign="top" width="274">
<p align="center"><strong>() [] . -&gt;  ::</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">2.</td>
<td valign="top" width="151">Unari</td>
<td valign="top" width="274"><strong>! ~ ++ &#8212; sizeof  (tip)</strong><strong>-</strong>(unar)  <strong>*</strong>(deferenţiere)<strong> &amp;</strong>(referenţiere)</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">3.</td>
<td valign="top" width="151">Multiplicativi</td>
<td valign="top" width="274">
<p align="center"><strong>*     /     %</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">4.</td>
<td valign="top" width="151">Aditivi</td>
<td valign="top" width="274">
<p align="center"><strong>+     -</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">5.</td>
<td valign="top" width="151">Deplasare pe bit</td>
<td valign="top" width="274">
<p align="center"><strong>&lt;&lt;     &gt;&gt;</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">6.</td>
<td valign="top" width="151">Relaţionali</td>
<td valign="top" width="274">
<p align="center"><strong>&lt;    &lt;=    &gt;    &gt;=</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">7.</td>
<td valign="top" width="151">De egalitate</td>
<td valign="top" width="274">
<p align="center"><strong>==     !=</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">8.</td>
<td valign="top" width="151"></td>
<td valign="top" width="274">
<p align="center"><strong>&amp; </strong>(ŞI logic pe bit)<strong></strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">9.</td>
<td valign="top" width="151"></td>
<td valign="top" width="274">
<p align="center"><strong>^ </strong>(XOR pe bit)</p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">10.</td>
<td valign="top" width="151"></td>
<td valign="top" width="274">
<p align="center"><strong>| </strong>(SAU logic pe bit)</p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">11.</td>
<td valign="top" width="151"></td>
<td valign="top" width="274">
<p align="center"><strong>&amp;&amp;</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">12.</td>
<td valign="top" width="151"></td>
<td valign="top" width="274">
<p align="center"><strong>||</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
<tr>
<td valign="top" width="38">13.</td>
<td valign="top" width="151">Condiţional</td>
<td valign="top" width="274">
<p align="center"><strong>?:</strong></p>
</td>
<td valign="top" width="180">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="38">14.</td>
<td valign="top" width="151">De atribuire</td>
<td valign="top" width="274">
<p align="center"><strong>=   +=   -=   *=    %=</strong></p>
<p align="center"><strong>&amp;=  ^=  |=  &lt;&lt;=  &gt;&gt;=</strong></p>
</td>
<td valign="top" width="180">de la dreapta la stânga</td>
</tr>
<tr>
<td valign="top" width="38">15.</td>
<td valign="top" width="151">Virgulă</td>
<td valign="top" width="274">
<p align="center"><strong>,</strong></p>
</td>
<td valign="top" width="180">de la stânga la dreapta</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2.6.2.  EXPRESII</strong></p>
<p>Prin combinarea operanzilor şi a operatorilor se obţin <strong><em>expresii</em></strong>. Tipul unei expresii este dat de tipul rezultatului obţinut în urma evaluării acesteia. La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie. Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor. La alcătuirea expresiilor, este indicată evitarea expresiilor în care un operand apare de mai multe ori.</p>
<p><strong>2.6.3.  CONVERSII DE TIP</strong></p>
<p>La evaluarea expresiilor, se realizează conversii ale tipului operanzilor. Conversiile sunt:</p>
<p>q  Automate;</p>
<p>q  Cerute de evaluarea expresiilor;</p>
<p>q  Cerute de programator (prin construcţiile cast), explicite.</p>
<p><strong><em>Conversiile automate</em></strong> sunt realizate de către compilator:</p>
<p><strong>            </strong><strong>char, short int -&gt;   int</strong></p>
<p>Ele sunt realizate de fiecare dată când într-o expresie apar operanzi de tipul char sau short int.</p>
<p><strong><em>Conversiile cerute de evaluarea expresiilor</em></strong> sunt efectuate în cazurile în care în expresii apar operanzi de tipuri diferite. Înaintea aplicării operatorilor, se realizează conversia unuia sau a ambilor operanzi:</p>
<p>q  Dacă un operand este de tip long int, celălalt este convertit la acelaşi tip; tipul expresiei este long int.</p>
<p>q  Dacă un operand este de tipul<strong> </strong>double, celălalt este convertit la acelaşi tip; tipul expresiei este double.</p>
<p>q  Dacă un operand este de tipul<strong> </strong>float, celălalt este convertit la acelaşi tip; tipul expresiei este float.</p>
<p><strong><em>Conversiile explicite (cerute de programator)</em></strong><em> </em>se realizează cu ajutorul construcţiilor cast.</p>
<p><strong><em><span style="text-decoration: underline;">Exemplu:</span></em></strong></p>
<p>int x=3;    float y;          y=<em>(float)</em>x/2;</p>
<p>Înainte de a se efectua împărţirea celor 2 operanzi, operandul x (întreg) este convertit în număr real simplă precizie. După atribuire, valoarea lui y va fi 1.5. Dacă nu ar fi fost folosit operatorul de conversie în expresia y=x / 2, operanzii x şi 2 fiind întregi, rezultatul împărţirii este întreg, deci y ar fi avut valoarea 1.</p>
<p>&nbsp;</p>
<p align="center"><strong>ÎNTREBĂRI ŞI EXERCIŢII</strong></p>
<p><strong>Chestiuni teoretice</strong></p>
<p>&nbsp;</p>
</div>
<p>&nbsp;</p>
<div>
<ol>
<li>Ce reprezintă datele şi care sunt atributele lor?</li>
<li>Care sunt diferenţele între constante şi variabile?</li>
<li>Cine determină tipul unei constante?</li>
<li>Ce sunt identificatorii?</li>
<li>Ce sunt directivele preprocesor?</li>
<li>Ce reprezinta variabilele?</li>
<li>Ce sunt constantele?</li>
<li>Enumeraţi tipurile simple de variabile.</li>
<li>Câte tipuri de directive preprocesor cunoasteţi? Exemple.</li>
<li>Care este modalitatea de a interzice modificarea valorii unei variabile?</li>
<li>Ce loc ocupă declararea varibilelor în cadrul unui program sursă scris în limbajul C++?</li>
<li>Ce conţin fişierele header?</li>
<li>Ce tipuri de variabile se utilizează pentru datele numerice?</li>
<li>Care sunt calificatorii folosiţi alături de tipurile de bază pentru obţinerea tipurilor derivate de date?</li>
<li>Ce semnifică parantezele unghiulare &lt; &gt; care încadrează numele unui fişier header?</li>
<li>Care este diferenţa între constantele 35.2e-1 şi 3.52 ? Dar între &#8220;\t&#8221; şi &#8216;\t&#8217;?</li>
<li>Ce tip are constanta 6.44 ?</li>
<li>Care este diferenţa între operatorii = şi = = ?</li>
<li>Ce reprezintă caracterele &#8220;escape&#8221;?</li>
<li>Constante întregi.</li>
<li>Constante caracter.</li>
<li>Ce tipuri de conversii cunoaşteţi?</li>
<li>Care sunt conversiile realizate în mod automat, de către compilator?</li>
<li>Constante şir de caractere.</li>
<li>Constante reale.</li>
<li>Ce operatori ternari cunoasteţi?</li>
<li>Operatorul virgulă.</li>
<li>Operatorul sizeof.</li>
<li>Operatori aritmetici binari compuşi.</li>
<li>Operatorul de referenţiere.</li>
<li>Operatori relaţionali binari.</li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Chestiuni aplicative</strong></p>
<p><strong> </strong></p>
<ol>
<li>Să se scrie declaraţiile pentru definirea constantelor simbolice: pi, g (acceleraţia gravitaţională), unghi_drept, dimensiune_MAX.</li>
<li>Care va fi rezultatul afişat pe ecran în urma execuţiei următoarelor secvenţe de instrucţiuni:</li>
</ol>
<p>q  double a=9/2; cout&lt;&lt;a*5&lt;&lt;’\n’;</p>
<p>q  double a=9.7, b=5.6; cout&lt;&lt;(a+6&lt;b)&lt;&lt;’\n’;</p>
<p>q  double a=9/4; cout&lt;&lt;a*6&lt;&lt;’\n’;</p>
<p>q  double x=3;int y=++x+5;cout&lt;&lt;y&lt;&lt;’\n’;</p>
<p>q  int a=7;    cout&lt;&lt;(!a)&lt;&lt;’\n’;</p>
<p>q  int a=10.5; cout&lt;&lt;a++&lt;&lt;’\n’; cout&lt;&lt;a&lt;&lt;’\n’;</p>
<p>q  int a=7; cout&lt;&lt;++a&lt;&lt;’\n’; cout&lt;&lt;a&lt;&lt;’\n’;</p>
<p>q  int a=10; cout&lt;&lt;a++&lt;&lt;’\n’; cout&lt;&lt;a&lt;&lt;’\n’;</p>
<p>q  double a=7/2; cout&lt;&lt;a&lt;&lt;’\n’;</p>
<p>q  int x=3; int y=x++-2; cout&lt;&lt;y&lt;&lt;’\n’;</p>
<p>q  int x=3; int y=++x+5; cout&lt;&lt;y&lt;&lt;’\n’;</p>
<p>q  double a=5.6, b=7.45; cout&lt;&lt;(a&gt;b)&lt;&lt;’\n’;</p>
<ol>
<li>Să se verifice corectitudinea următoarelor secvenţe. Pentru cele incorecte, explicaţi sursa erorilor.</li>
</ol>
<p>q  double a=9.7, b=5.2; int c=(a+6&lt;b)++; cout&lt;&lt;c&lt;&lt;’\n’;</p>
<p>q  double a=7/5; double c=a*5++; cout&lt;&lt;c&lt;&lt;’\n’;</p>
<p>q  double a=9.7, b=5.6; int c=(a%6&lt;b)++; cout&lt;&lt;c&lt;&lt;’\n’;</p>
<p>q  double a=5.6, b=7.45; cout&lt;&lt;++(a+5&gt;b)&lt;&lt;’\n’;</p>
<p>q  double a=9.8; double b=9.7; cout&lt;&lt;a%b&lt;&lt;’\n’;</p>
<p>q  cout&lt;&lt;&amp;(a+8)&lt;&lt;&#8217;\n&#8217;;</p>
<p>q  int I=8; cout&lt;&lt;(I+10)++&lt;&lt;&#8217;\n&#8217;;</p>
<p>q  double a=8.7; A=(a+8)/56; cout&lt;&lt;A&lt;&lt;&#8217;\n&#8217;;</p>
<p>q  int x=3/5; int y=x++; char x=&#8217;J'; cout&lt;&lt;&#8221;y=&#8221;&lt;&lt;y&lt;&lt;&#8217;\n&#8217;;</p>
<p>q  char a=&#8217;X'; const int b=89; b+=8; cout&lt;&lt;&#8221;b=&#8221;&lt;&lt;b&lt;&lt;&#8221; a=&#8221;&lt;&lt;a&lt;&lt;&#8217;\n&#8217;;</p>
<ol>
<li>Să se scrie un program care afişează următoarele mesaje:</li>
</ol>
<p>q  Sirul &#8220;este dupa-amiaza&#8221; este memorat pe &#8230;. octeti.</p>
<p>q  O marime intreaga este memorata pe &#8230; octeti.</p>
<p>q  O marime reala, in simpla precizie este memorata pe &#8230; octeti!</p>
<p>q  O marime reala, in dubla precizie este memorata pe &#8230; byti!</p>
<p>q  Constanta caracter &#8216;Q&#8217; memorata pe &#8230; octeti!</p>
<p>q  Sirul &#8220;a\n\n&#8221; este memorat pe &#8230; octei!</p>
<p>q  Sirul &#8220;\n&#8221; este memorat pe &#8230; biti!</p>
<p>q  Caracterul &#8216;\&#8217; este memorat pe &#8230;. biti.</p>
<ol>
<li>Să se evalueze expresiile, ştiind că: int i=1;int j=2;int k=-7;double x=0;double y=2.3;</li>
</ol>
<p>q  -i &#8211; 5 * j  &gt;= k + 1</p>
<p>q  3 &lt; j &lt; 5</p>
<p>q  i + j + k == -2 * j</p>
<p>q  x &amp;&amp; i || j &#8211; 3</p>
<ol>
<li>Ce operaţie logică şi ce mască trebuie să folosiţi pentru a converti codurile ASCII ale literelor mici în litere mari? Dar pentru conversia inversă?</li>
<li>O deplasare la dreapta cu 3 biţi este echivalentă cu o rotaţie la stânga cu câţi biţi?</li>
<li>Să se seteze pe 1 toţi biţii dintr-un octet, cu excepţia bitului cel mai semnificativ.</li>
<li>Să se scrie un program care citeşte o valoare întreagă. Să se afişeze un mesaj care să indice dacă numărul citit este par sau impar.</li>
<li>Să se citeasca două valori întregi. Să se calculeze şi să se afişeze restul împărţirii celor două numere</li>
</ol>
<p>download <a href="http://resurse-educationale.uv.ro/?attachment_id=195" rel="attachment wp-att-195">cap02</a></p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=194</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework Reference 1.11 Русская версия</title>
		<link>http://resurse-educationale.uv.ro/?p=186</link>
		<comments>http://resurse-educationale.uv.ro/?p=186#comments</comments>
		<pubDate>Tue, 13 Sep 2011 11:38:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend framework]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=186</guid>
		<description><![CDATA[Zend_Acl&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 2 Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 2 Ресурсы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 2 Роли&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 2 Создание списка контроля доступа (ACL)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 4 Регистрация ролей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 4 Определение контроля доступа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 5 Запросы к ACL&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 6 Настройка управления доступом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 8 Точное управление доступом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 8 Удаление правил доступа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 9 Zend_Application&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 11 Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; &#8230; <a href="http://resurse-educationale.uv.ro/?p=186">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Zend_Acl&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 2</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 2</p>
<p>Ресурсы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 2</p>
<p>Роли&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 2</p>
<p>Создание списка контроля доступа (ACL)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 4</p>
<p>Регистрация ролей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 4</p>
<p>Определение контроля доступа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 5</p>
<p>Запросы к ACL&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 6</p>
<p>Настройка управления доступом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 8</p>
<p>Точное управление доступом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 8</p>
<p>Удаление правил доступа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 9</p>
<p>Zend_Application&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 11</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 11</p>
<p>Zend_Application &#8211; Быстрый старт&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 11</p>
<p>Использование вместе с Zend_Tool&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 11</p>
<p>Добавление Zend_Application в приложение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 13</p>
<p>Добавление и создание ресурсов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 15</p>
<p>Следующие шаги с Zend_Application&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 16</p>
<p>Расширенное использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 17</p>
<p><span id="more-186"></span></p>
<p>Постоянное хранение данных ACL&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 17</p>
<p>Написание условных правил ACL с утверждениями&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 17</p>
<p>Теоретические основы работы с Zend_Application&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 19</p>
<p>Начальная загрузка&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 20</p>
<p>Методы ресурсов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 20</p>
<p>Загрузки, использующие плагины ресурсов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 21</p>
<p>Реестр ресурсов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 23</p>
<p>Отслеживание зависимостей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 25</p>
<p>Плагины ресурсов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 26</p>
<p>Zend_Cache&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 28</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 28</p>
<p>Теория кэширования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 30</p>
<p>Фабричный метод Zend_Cache&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 30</p>
<p>Добавление тегов к записям&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 31</p>
<p>Очистка кэша&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 31</p>
<p>Фронтэнды Zend_Cache&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 32</p>
<p>Zend_Cache_Core&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 32</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 32</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 32</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 33</p>
<p>Zend_Cache_Frontend_Output&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 35</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 35</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 35</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 35</p>
<p>Zend_Cache_Frontend_Function&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 36</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 36</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 36</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 36</p>
<p>Zend_Cache_Frontend_Class&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 36</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 36</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 36</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 37</p>
<p>Zend_Cache_Frontend_File&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 37</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 37</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 38</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 38</p>
<p>Zend_Cache_Frontend_Page&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 38</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 38</p>
<p>Доступные опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 39</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 40</p>
<p>Отмена кэширования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 41</p>
<p>Бэкэнды Zend_Cache&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 43</p>
<p>Zend_Cache_Backend_File&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 43</p>
<p>Доступные опции:&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 43</p>
<p>Zend_Cache_Backend_Sqlite&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 43</p>
<p>Доступные опции:&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 43</p>
<p>Zend_Cache_Backend_Memcached&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 44</p>
<p>Доступные опции:&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 44</p>
<p>Zend_Cache_Backend_Apc&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 44</p>
<p>Zend_Cache_Backend_Xcache&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 44</p>
<p>Доступные опции:&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 45</p>
<p>Zend_Cache_Backend_ZendPlatform&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 45</p>
<p>Zend_Cache_Backend_TwoLevels&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 45</p>
<p>Доступные опции:&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 45</p>
<p>Zend_Cache_Backend_ZendServer_Disk и Zend_Cache_Backend_ZendServer_ShMem&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 46</p>
<p>Zend_Config&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 47</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 47</p>
<p>Теоретические основы работы с Zend_Config&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 48</p>
<p>Zend_Config_Ini&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 49</p>
<p>Zend_Config_Xml&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 51</p>
<p>Zend_Config_Writer&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 55</p>
<p>Zend_Controller&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 57</p>
<p>Zend_Controller &#8211; Быстрый старт&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 57</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 57</p>
<p>Быстрый старт&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 57</p>
<p>Создайте файловую структуру&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 57</p>
<p>Установите корневую директорию для документов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 57</p>
<p>Создайте свои правила перезаписи&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 57</p>
<p>Создайте файл загрузки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 58</p>
<p>Создайте свой контроллер действий, используемый по умолчанию&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 59</p>
<p>Создайте скрипт вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 60</p>
<p>Создайте контроллер ошибок&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 60</p>
<p>Смотрим сайт!&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 61</p>
<p>Основы Zend_Controller&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 62</p>
<p>Фронт-контроллер&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 65</p>
<p>Обзор&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 65</p>
<p>Ключевые методы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 65</p>
<p>getInstance()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 65</p>
<p>setControllerDirectory() и addControllerDirectory()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 65</p>
<p>addModuleDirectory() и getModuleDirectory()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 66</p>
<p>dispatch()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 66</p>
<p>run()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 67</p>
<p>Методы-аксессоры для конфигурирования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 67</p>
<p>Параметры фронт-контроллера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 69</p>
<p>Расширение фронт-контроллера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 70</p>
<p>Объект запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 71</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 71</p>
<p>HTTP-запросы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 71</p>
<p>Доступ к данным запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 71</p>
<p>Базовый URL и поддиректории&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 73</p>
<p>Определение HTTP-метода запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 74</p>
<p>Определение запросов AJAX&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 74</p>
<p>Создание подклассов объекта запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 74</p>
<p>Стандартный маршрутизатор&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 76</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 76</p>
<p>Использование маршрутизатора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 78</p>
<p>Базовые операции Rewrite Router&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 78</p>
<p>Маршруты, используемые по умолчанию&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 79</p>
<p>Базовый URL и поддиректории&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 80</p>
<p>Глобальные параметры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 81</p>
<p>Типы маршрутов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 81</p>
<p>Zend_Controller_Router_Route&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 81</p>
<p>Значения переменных по умолчанию&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 82</p>
<p>Требования к переменным&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 83</p>
<p>Переводимые сегменты&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 83</p>
<p>Zend_Controller_Router_Route_Static&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 86</p>
<p>Zend_Controller_Router_Route_Regex&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 86</p>
<p>Zend_Controller_Router_Route_Hostname&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 90</p>
<p>Zend_Controller_Router_Route_Chain&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 90</p>
<p>Объединение маршрутов через Zend_Config&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 91</p>
<p>Использование Zend_Config вместе с RewriteRouter&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 94</p>
<p>Создание подклассов маршрутизатора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 94</p>
<p>Диспетчер&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 96</p>
<p>Обзор&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 96</p>
<p>Создание подклассов диспетчера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 97</p>
<p>Контроллеры действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 101</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 101</p>
<p>Инициализация объекта&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 102</p>
<p>Перехватчики Pre- и Post-Dispatch&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 103</p>
<p>Аксессоры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 103</p>
<p>Интеграция вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 104</p>
<p>Инициализация вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 104</p>
<p>Рендеринг видов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 105</p>
<p>Сервисные методы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 106</p>
<p>Создание подклассов контроллера действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 106</p>
<p>Помощники действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 109</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 109</p>
<p>Инициализация помощника&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 109</p>
<p>Брокер помощников&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 109</p>
<p>Встроенные помощники действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 111</p>
<p>ActionStack&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 111</p>
<p>AutoComplete&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 113</p>
<p>Автодополнение c Dojo&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 114</p>
<p>Автодополнение с Scriptaculous&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 117</p>
<p>ContextSwitch и AjaxContext&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 118</p>
<p>Доступные по умолчанию контексты&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 119</p>
<p>Создание своего контекста&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 120</p>
<p>Установка контекстов для действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 121</p>
<p>Инициализация переключения контекста&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 123</p>
<p>Дополнительный функционал&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 123</p>
<p>Функционал AjaxContext&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 125</p>
<p>FlashMessenger&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 126</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 126</p>
<p>Базовый пример использования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 126</p>
<p>JSON&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 127</p>
<p>Redirector&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 128</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 128</p>
<p>Базовые примеры использования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 130</p>
<p>ViewRenderer&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 133</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 133</p>
<p>API&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 134</p>
<p>Примеры базового использования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 139</p>
<p>Примеры продвинутого использования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 142</p>
<p>Написание собственных помощников&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 143</p>
<p>Объект ответа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 145</p>
<p>Использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 145</p>
<p>Управление заголовками&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 146</p>
<p>Именованные сегменты&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 147</p>
<p>Проверка на исключения в объекте ответа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 149</p>
<p>Создание подклассов объекта ответа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 150</p>
<p>Плагины&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 151</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 151</p>
<p>Написание плагинов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 151</p>
<p>Использование плагинов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 152</p>
<p>Извлечение и работа с плагинами&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 153</p>
<p>Плагины, включенные в стандартную поставку&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 153</p>
<p>ActionStack&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 153</p>
<p>Zend_Controller_Plugins_ErrorHandler&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 154</p>
<p>Использование ErrorHandler в качестве обработчика ошибки 404&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 155</p>
<p>Управление сгенерированным ранее выводом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 157</p>
<p>Примеры использования плагина&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 157</p>
<p>Пример контроллера ошибок&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 158</p>
<p>Использование модульной структуры директорий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 159</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 159</p>
<p>Определение директорий контроллеров в модулях&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 160</p>
<p>Маршрутизация применительно к модулям&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 161</p>
<p>Модуль или глобальный контроллер по умолчанию&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 161</p>
<p>Исключения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 162</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 162</p>
<p>Обработка исключений&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 162</p>
<p>Исключения в MVC, с которыми вы можете встретиться&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 163</p>
<p>Zend_Db&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 167</p>
<p>Zend_Db_Adapter&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 167</p>
<p>Соединение с БД с использованием адаптера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 167</p>
<p>Использование конструктора адаптера Zend_Db&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 167</p>
<p>Использование фабрики Zend_Db&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 168</p>
<p>Использование Zend_Config с фабрикой Zend_Db&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 169</p>
<p>Параметры адаптера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 169</p>
<p>Управление отложенными соединениями&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 171</p>
<p>Пример базы данных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 172</p>
<p>Чтение результатов запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 173</p>
<p>Извлечение полного набора результатов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 173</p>
<p>Изменение режима извлечения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 174</p>
<p>Извлечение результатов выборки в виде ассоциативного массива&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 175</p>
<p>Извлечение единственного столбца из результатов выборки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 175</p>
<p>Извлечение пар ключ-значение из результатов выборки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 175</p>
<p>Извлечение единственной строки из результатов выборки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 176</p>
<p>Извлечение единственного скалярного значения из результатов выборки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 176</p>
<p>Изменение данных в БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 176</p>
<p>Добавление данных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 176</p>
<p>Получение сгенерированного значения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 177</p>
<p>Обновление данных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 179</p>
<p>Удаление данных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 180</p>
<p>Заключение в кавычки значений и идентификаторов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 180</p>
<p>Использование quote()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 181</p>
<p>Использование quoteInto()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 182</p>
<p>Использование quoteIdentifier()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 183</p>
<p>Управление транзакциями&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 184</p>
<p>Листинг и описание таблиц&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 185</p>
<p>Закрытие соединения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 186</p>
<p>Запуск других операторов БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 186</p>
<p>Примечания к отдельным адаптерам&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 187</p>
<p>IBM DB2&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 187</p>
<p>MySQLi&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 187</p>
<p>Oracle&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 187</p>
<p>PDO для IBM DB2 и Informix Dynamic Server (IDS)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 188</p>
<p>PDO Microsoft SQL Server&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 188</p>
<p>PDO MySQL&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 188</p>
<p>PDO Oracle&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 189</p>
<p>PDO PostgreSQL&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 189</p>
<p>PDO SQLite&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 189</p>
<p>Firebird/Interbase&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 190</p>
<p>Zend_Db_Statement&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 191</p>
<p>Создание оператора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 191</p>
<p>Выполнение оператора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 191</p>
<p>Извлечение результатов выполнения оператора SELECT&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 192</p>
<p>Извлечение одной строки из набора результатов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 192</p>
<p>Извлечение всего набора результатов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 193</p>
<p>Изменение формата извлечения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 193</p>
<p>Извлечение одного столбца из набора результатов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 194</p>
<p>Извлечение строки в виде объекта&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 194</p>
<p>Zend_Db_Profiler&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 195</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 195</p>
<p>Использование профилировщика&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 196</p>
<p>Расширенное использование профилировщика&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 197</p>
<p>Фильтрация по времени выполнения запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 198</p>
<p>Фильтрация по типу запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 198</p>
<p>Получение профилей по типу запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 199</p>
<p>Специализированные профилировщики&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 199</p>
<p>Profiling with Firebug&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 199</p>
<p>Zend_Db_Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 201</p>
<p>Обзор&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 201</p>
<p>Создание объекта Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 201</p>
<p>Построение запросов Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 201</p>
<p>Добавление предложения FROM&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 202</p>
<p>Добавление колонок&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 203</p>
<p>Добавление столбцов выражений&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 204</p>
<p>Добавление столбцов в существующую таблицу FROM или JOIN&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 205</p>
<p>Добавление в запрос другой таблицы c помощью JOIN&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 206</p>
<p>Добавление предложения WHERE&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 209</p>
<p>Добавление предложения GROUP BY&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 211</p>
<p>Добавление предложения HAVING&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 211</p>
<p>Добавление предложения ORDER BY&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 212</p>
<p>Добавление предложения LIMIT&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 213</p>
<p>Добавление модификатора DISTINCT&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 214</p>
<p>Добавление модификатора FOR UPDATE&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 214</p>
<p>Произведение запросов на выборку&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 214</p>
<p>Произведение запросов на выборку из адаптера БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 214</p>
<p>Произведение запросов на выборку через объект Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 214</p>
<p>Преобразование объекта Select в SQL-строку&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 215</p>
<p>Другие методы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 215</p>
<p>Получение частей объекта Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 215</p>
<p>Сброс частей запроса в объекте Select&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 216</p>
<p>Zend_Db_Table&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 218</p>
<p>Класс таблицы &#8211; введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 218</p>
<p>Определение класса таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 218</p>
<p>Определение имени и схемы таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 218</p>
<p>Определение первичного ключа таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 219</p>
<p>Переопределение методов установки таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 220</p>
<p>Инициализация таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 220</p>
<p>Создание экземпляра класса таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 221</p>
<p>Установка адаптера БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 221</p>
<p>Установка используемого по умолчанию адаптера БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 221</p>
<p>Хранение адаптера БД в реестре&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 222</p>
<p>Добавление строк в таблицу&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 222</p>
<p>Использование таблицы с автоинкрементным ключом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 223</p>
<p>Использование таблицы с последовательностью&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 223</p>
<p>Использование таблицы с естественным ключом&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 224</p>
<p>Обновление строк в таблице&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 224</p>
<p>Удаление строк из таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 225</p>
<p>Извлечение строк по первичному ключу&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 225</p>
<p>Извлечение наборов строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 227</p>
<p>API для произведения выборки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 227</p>
<p>Извлечение набора строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 228</p>
<p>Расширенное использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 229</p>
<p>Извлечение одной строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 230</p>
<p>Получение метаданных таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 231</p>
<p>Кэширование метаданных таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 231</p>
<p>Расширение класса таблицы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 233</p>
<p>Использование собственных классов строки и набора строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 233</p>
<p>Определение собственной логики для добавления, обновления и удаления строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 235</p>
<p>Определение собственных методов для поиска&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 235</p>
<p>Определение инфлекции в Zend_Db_Table&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 236</p>
<p>Zend_Db_Table_Row&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 238</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 238</p>
<p>Извлечение строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 238</p>
<p>Чтение значений столбцов из строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 238</p>
<p>Получение данных строки в виде массива&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 238</p>
<p>Извлечение данных из связанных таблиц&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 239</p>
<p>Редактирование строк в БД&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 239</p>
<p>Изменение значений столбцов в строке&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 239</p>
<p>Вставка новой строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 239</p>
<p>Изменение значений в нескольких столбцах&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 240</p>
<p>Удаление строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 241</p>
<p>Сериализация и десериализация строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 241</p>
<p>Сериализация объекта строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 241</p>
<p>Десериализация данных строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 241</p>
<p>Восстановление соединения для объекта строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 242</p>
<p>Расширение класса строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 242</p>
<p>Инициализация строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 243</p>
<p>Определение собственной логики для добавления, обновления и удаления в Zend_Db_Table_Row&#8230;&#8230;&#8230;&#8230;. 243</p>
<p>Определение инфлекции в Zend_Db_Table_Row&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 245</p>
<p>Zend_Db_Table_Rowset&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 247</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 247</p>
<p>Получение набора строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 247</p>
<p>Получение строк из набора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 247</p>
<p>Получение набора строк в виде массива&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 248</p>
<p>Сериализация и десериализация наборов строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 249</p>
<p>Расширение класса набора строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 250</p>
<p>Связи между таблицами Zend_Db_Table&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 252</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 252</p>
<p>Определение связей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 252</p>
<p>Извлечение зависимых строк&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 254</p>
<p>Извлечение родительской строки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 256</p>
<p>Извлечение строк через связи &#8220;многие-ко-многим&#8221;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 257</p>
<p>Каскадные операции записи&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 260</p>
<p>Примечания относительно каскадных операций&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 261</p>
<p>Zend_Debug&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 263</p>
<p>Дамп переменных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 263</p>
<p>Отладка с применением Zend_Log&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 263</p>
<p>Zend_Dom&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 264</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 264</p>
<p>Zend_Dom_Query&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 264</p>
<p>Теория работы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 264</p>
<p>Доступные методы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 266</p>
<p>Zend_Dom_Query&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 266</p>
<p>Zend_Dom_Query_Result&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 266</p>
<p>Zend_Exception&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 267</p>
<p>Использование исключений&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 267</p>
<p>Basic usage&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 267</p>
<p>Previous Exceptions&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 267</p>
<p>Zend_Filter&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 269</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 269</p>
<p>Что есть фильтр?&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 269</p>
<p>Основы использования фильтров&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 269</p>
<p>Использование статического метода get()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 269</p>
<p>Цепочки фильтров&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 270</p>
<p>Написание фильтров&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 271</p>
<p>Zend_Form&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 272</p>
<p>Zend_Form&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 272</p>
<p>Zend_Form &#8211; Быстрый старт&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 272</p>
<p>Создание объекта формы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 272</p>
<p>Добавление элементов в форму&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 272</p>
<p>Визуализация формы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 274</p>
<p>Проверка корректности данных формы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 276</p>
<p>Получение статуса ошибки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 276</p>
<p>Объединяя изложенное&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 277</p>
<p>Использование объекта Zend_Config&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 278</p>
<p>Заключение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 279</p>
<p>Zend_Http&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 280</p>
<p>Zend_Http_Client &#8211; Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 280</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 280</p>
<p>Параметры конфигурации&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 280</p>
<p>Выполнение базовых HTTP-запросов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 281</p>
<p>Добавление параметров GET и POST&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 281</p>
<p>Получение последних запроса и ответа&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 282</p>
<p>Zend_Json&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 284</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 284</p>
<p>Основы применения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 284</p>
<p>Объекты JSON&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 284</p>
<p>XML to JSON conversion&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 285</p>
<p>Zend_Layout&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 287</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 287</p>
<p>Zend_Layout &#8211; Быстрый старт&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 287</p>
<p>Скрипты макетов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 287</p>
<p>Использование Zend_Layout с MVC Zend Framework-а&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 288</p>
<p>Использование Zend_Layout как отдельной компоненты&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 290</p>
<p>Пример макета&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 292</p>
<p>Опции конфигурирования Zend_Layout&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 293</p>
<p>Примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 293</p>
<p>Использование Zend_Layout для опытных разработчиков&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 295</p>
<p>Собственные объекты вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 295</p>
<p>Собственные плагины фронт-контроллера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 297</p>
<p>Собственные помощники действий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 297</p>
<p>Собственное определение пути к скрипту макета: использование инфлектора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 297</p>
<p>Zend_Loader&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 299</p>
<p>Динамическая загрузка файлов и классов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 299</p>
<p>Zend_Loader vs. require_once()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 299</p>
<p>Загрузка файлов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 299</p>
<p>Загрузка классов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 299</p>
<p>Проверка на возможность чтения из файла&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 300</p>
<p>Использование автозагрузчика&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 300</p>
<p>Автозагрузчик&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 302</p>
<p>Использование автозагрузчика&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 302</p>
<p>Итерфейс автозагрузчика&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 303</p>
<p>Справка по автозагрузчику&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 303</p>
<p>Zend_Mail&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 310</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 310</p>
<p>Начало работы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 310</p>
<p>Конфигурирование транспорта, используемого по умолчанию&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 310</p>
<p>Отправка через SMTP&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 311</p>
<p>Отправка нескольких сообщений за одно SMTP-соединение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 311</p>
<p>Использование различных транспортов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 312</p>
<p>Сообщение в формате HTML&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 313</p>
<p>Вложения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 313</p>
<p>Добавление получателей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 314</p>
<p>Контроль за разделителями MIME&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 314</p>
<p>Дополнительные заголовки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 314</p>
<p>Наборы символов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 314</p>
<p>Кодировка&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 315</p>
<p>SMTP-аутентификация&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 315</p>
<p>Securing SMTP Transport&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 316</p>
<p>Zend_Navigation&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 317</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 317</p>
<p>Страницы и контейнеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 317</p>
<p>Страницы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 317</p>
<p>Контейнеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 317</p>
<p>Разделение данных (модели) и отображения (вида)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 317</p>
<p>Страницы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 318</p>
<p>Общие функциональные возможности страниц&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 318</p>
<p>Zend_Navigation_Page_Mvc&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 320</p>
<p>Zend_Navigation_Page_Uri&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 323</p>
<p>Creating custom page types&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 323</p>
<p>Creating pages using the page factory&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 324</p>
<p>Zend_Paginator&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 327</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 327</p>
<p>Использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 327</p>
<p>Разбиение наборов данных на страницы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 327</p>
<p>Адаптеры DbSelect и DbTableSelect&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 328</p>
<p>Рендеринг страниц через скрипты видов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 329</p>
<p>Примеры постраничной навигации&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 331</p>
<p>Список свойств&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 333</p>
<p>Конфигурация&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 334</p>
<p>Расширенное использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 334</p>
<p>Создание собственных адаптеров к источникам данных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 334</p>
<p>Создание своих стилей прокрутки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 334</p>
<p>Возможности кэширования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 335</p>
<p>Интерфейс Zend_Paginator_AdapterAggregate&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 336</p>
<p>Zend_Registry&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 338</p>
<p>Использование реестра&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 338</p>
<p>Установка значений в реестре&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 338</p>
<p>Получение значений из реестра&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 338</p>
<p>Создание объекта реестра&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 338</p>
<p>Доступ к реестру как к массиву&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 339</p>
<p>Доступ к реестру как к объекту&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 339</p>
<p>Проверка существования индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 340</p>
<p>Создание подклассов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 341</p>
<p>Уничтожение статического реестра&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 341</p>
<p>Zend_Search_Lucene&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 341</p>
<p>Обзор&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 341</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 341</p>
<p>Объекты документа и поля&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 342</p>
<p>Значение типов полей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 344</p>
<p>HTML-документы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 344</p>
<p>Индексация&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 347</p>
<p>Создание нового индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 347</p>
<p>Обновление индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 347</p>
<p>Обновление документов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 347</p>
<p>Получение размера индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 348</p>
<p>Оптимизация индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 348</p>
<p>Опция автоматической оптимизации <em>MaxBufferedDocs</em>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 350</p>
<p>Опция автоматической оптимизации <em>MaxMergeDocs</em>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 350</p>
<p>Опция автоматической оптимизации <em>MergeFactor</em>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 350</p>
<p>Ограничения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 351</p>
<p>Поиск по индексу&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 351</p>
<p>Построение запросов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 351</p>
<p>Парсинг запроса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 352</p>
<p>Результаты поиска&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 353</p>
<p>Ранжирование результата&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 354</p>
<p>Сортировка результатов поиска&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 354</p>
<p>Подсветка результатов поиска&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 355</p>
<p>Язык запросов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 355</p>
<p>Элементы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 355</p>
<p>Поля&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 356</p>
<p>Модификаторы элементов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 356</p>
<p>Поиск по критерию близости&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 356</p>
<p>Усиление элемента&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 357</p>
<p>Булевы операторы&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 357</p>
<p>AND&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 357</p>
<p>OR&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 357</p>
<p>NOT&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 358</p>
<p>Операторы &amp;&amp;, ||, и !&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 358</p>
<p>+&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 358</p>
<p>-&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 358</p>
<p>Отсутствие оператора&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 358</p>
<p>Групирование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 358</p>
<p>Группирование полей&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 359</p>
<p>Экранирование специальных символов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 359</p>
<p>API для построения запросов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 360</p>
<p>Исключения, бросаемые парсером запросов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 360</p>
<p>Простой запрос (запрос по одному ключевому слову)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 360</p>
<p>Составной запрос (запрос по нескольким ключевым словам)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 360</p>
<p>Фразовый запрос&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 362</p>
<p>Кодировки&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 365</p>
<p>Поддержка UTF-8 и однобайтных наборов символов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 365</p>
<p>Используемый по умолчанию анализатор текста&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 365</p>
<p>Совместимый с UTF-8 анализатор текста&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 365</p>
<p>Расширяемость&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 366</p>
<p>Анализ текста&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 366</p>
<p>Фильтрация лексем&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 368</p>
<p>Алгоритмы ранжирования&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 370</p>
<p>Контейнеры хранения&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 371</p>
<p>Взаимодействие с Java Lucene&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 375</p>
<p>Форматы файлов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 375</p>
<p>Директория для индекса&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 375</p>
<p>Исходный код Java&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 375</p>
<p>Zend_Session&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 376</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 376</p>
<p>Базовое использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 377</p>
<p>Учебные примеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 377</p>
<p>Итерация по пространствам имен&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 378</p>
<p>Методы доступа для пространств имен&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 378</p>
<p>Расширенное использование&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 380</p>
<p>Старт сессии&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 380</p>
<p>Блокировка пространств имен&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 381</p>
<p>Время жизни пространства имен&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 382</p>
<p>Инкапсуляция сессий и контроллеры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 383</p>
<p>Ограничение количества экземпляров Zend_Session_Namespace до одного на каждое пространство имен.. 384</p>
<p>Работа с массивами в пространствах имен&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 385</p>
<p>Использование сессий вместе с аутентификацией&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 386</p>
<p>Использование сессий с юнит-тестами&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 387</p>
<p>Общее управление сессиями&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 390</p>
<p>Zend_Session::setOptions()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 390</p>
<p>Опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 391</p>
<p>regenerateId()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 392</p>
<p>Введение: идентификаторы сессий&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 392</p>
<p>Угон и фиксация сессии&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 394</p>
<p>rememberMe(integer $seconds)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 395</p>
<p>forgetMe()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 396</p>
<p>sessionExists()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 396</p>
<p>destroy(bool $remove_cookie = true, bool $readonly = true)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 396</p>
<p>stop()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 396</p>
<p>writeClose($readonly = true)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 396</p>
<p>expireSessionCookie()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 397</p>
<p>setSaveHandler(Zend_Session_SaveHandler_Interface $interface)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 397</p>
<p>namespaceIsset($namespace)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 397</p>
<p>namespaceUnset($namespace)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 397</p>
<p>namespaceGet($namespace)&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 397</p>
<p>getIterator()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 398</p>
<p>Zend_Validate&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 399</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 399</p>
<p>Что такое валидатор?&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 399</p>
<p>Базовое использование валидаторов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 399</p>
<p>Установка собственных сообщений от ошибках&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 400</p>
<p>Использование статического метода is()&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 401</p>
<p>Перевод сообщений&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 402</p>
<p>Цепочки валидаторов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 402</p>
<p>Написание валидаторов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 403</p>
<p>Zend_View&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 408</p>
<p>Введение&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 408</p>
<p>Скрипт контроллера&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 408</p>
<p>Скрипт вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 408</p>
<p>Опции&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 409</p>
<p>Короткие теги в скриптах вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 410</p>
<p>Вспомогательные аксессоры&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 411</p>
<p>Скрипты контроллеров&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 411</p>
<p>Установка переменных&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 411</p>
<p>Выполнение скрипта вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 412</p>
<p>Пути к скриптам вида&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 412</p>
<p>Скрипты видов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 413</p>
<p>Экранирование вывода&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 414</p>
<p>Использование других шаблонизаторов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 415</p>
<p>Шаблонизаторы c использованием скриптов видов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 415</p>
<p>Шаблонизаторы с использованием Zend_View_Interface&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; 416</p>
<p>Помощники видов&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;. 422</p>
<p>Начальный набор помощников&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 422</p>
<p>Помощник Action&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. 426<br />
<strong> </strong></p>
<h1>Zend_Acl</h1>
<h2>Введение</h2>
<p>Zend_Acl предоставляет легковесную и гибкую реализацию списка прав доступа (<acronym>ACL</acronym>) и управления привилегиями. Приложение может использовать такие списки для контроля доступа одних объектов к другим &#8211; защищенным.</p>
<p>В рамках данной документации,</p>
<ul>
<li><em>Ресурс</em> &#8211; объект, доступ к которому контролируется.</li>
<li><em>Роль</em> &#8211; объект, который может запрашивать доступ к ресурсу.</li>
</ul>
<p>Говоря проще, <em>роли запрашивают доступ к ресурсам</em>. Например, если парковщик запрашивает доступ к автомобилю, то парковщик &#8211; это роль, а автомобиль &#8211; ресурс, поскольку доступ к автомобилю не может предоставляться всем без исключения.</p>
<p>Благодаря спецификации и использованию списка прав доступа (ACL) приложение может контролировать предоставление ролям доступа к ресурсам.</p>
<h3>Ресурсы</h3>
<p>Создать ресурс в Zend_Acl очень просто. Zend_Acl предоставляет интерфейс ресурса Zend_Acl_Resource_Interface для облегчения процесса создания ресурса. Этот интерфейс содержит только один метод, <code>getResourceId</code><code>()</code>. Классу достаточно реализовывать этот интерфейс для того, чтобы Zend_Acl рассматривал объект этого класса как ресурс. Кроме того, Zend_Acl предоставляет <code>Zend</code><code>_</code><code>Acl</code><code>_</code><code>Resource</code> в качестве базового класса, который разработчики могут расширять по желанию.</p>
<p>Zend_Acl предоставляет древовидную структуру, в которую могут добавляться различные ресурсы. В этой структуре они могут быть организованы от общих (корень дерева) к специфическим (листья дерева). При запросах к определенным ресурсам в иерархии будет выполнен автоматический поиск правил, относящихся к ресурсам-предкам, учитывающий простое наследование правил. Например, если некое общее правило должно действовать в каждом здании города, то проще прикрепить его к городу, чем крепить к каждому зданию в городе. Однако, для некоторых зданий могут потребоваться исключения из этого правила, в Zend_Acl это достигается путем закрепления исключений за каждым зданием, требующим исключений из правила. Ресурс может наследовать только от одного родительского ресурса, однако сам родительский ресурс может, в свою очередь, наследовать от другого родительского ресурса и т.д.</p>
<p>Zend_Acl также поддерживает права доступа к ресурсам (например, &#8220;создание&#8221;, &#8220;чтение&#8221;, &#8220;обновление&#8221;, &#8220;удаление&#8221;), разработчик может присваивать правила, которые будут влиять на все или определенные права доступа к ресурсу.</p>
<h3>Роли</h3>
<p>Как и в случае с ресурсами, создавать роль тоже очень просто. Все роли должны реализовывать интерфейс Zend_Acl_Role_Interface. Этот интерфейс содержит единственный метод <code>getRoleId</code><code>()</code>. Кроме того, Zend_Acl предоставляет Zend_Acl_Role в качестве базового класса, который разработчики могут расширять по желанию.</p>
<p>В Zend_Acl роль может наследовать от одной или от нескольких ролей. Это реализовано для поддержки наследования правил между ролями. Например, пользовательская роль, такая как &#8220;Салли&#8221;, может принадлежать одной или нескольким родительским ролям, таким как &#8220;редактор&#8221; и &#8220;администратор&#8221;. Разработчик может привязывать правила к &#8220;редактору&#8221; и &#8220;администратору&#8221; раздельно, и &#8220;Салли&#8221; будет наследовать правила обоих ролей. Нет необходимости привязывать правила непосредственно к &#8220;Салли&#8221;.</p>
<p>Хотя множественное наследование ролей &#8211; очень полезная возможность, она также усложняет разработку. Следующий пример демонстрирует неопределенное условие и показывает, как Zend_Acl решает эту проблему.</p>
<p><strong>Example</strong><strong> #1 Множественное наследование ролей</strong></p>
<p>Следующий код определяет три базовые роли: &#8220;<code>guest</code>&#8220;, &#8220;<code>member</code>&#8221; и &#8220;<code>admin</code>&#8220;, от которых будут наследовать другие роли. Далее создается &#8220;<code>someUser</code>&#8220;, он наследует от этих только что созданных трех ролей. Порядок, в котором эти роли появляются в массиве <var>$</var><var>parents</var>, важен. При необходимости Zend_Acl ищет правила доступа не только для запрашиваемых ролей (в нашем случае, &#8220;<code>someUser</code>&#8220;), но и для ролей, от которых запрашиваемая роль унаследована (в нашем примере, &#8220;<code>guest</code>&#8220;, &#8220;<code>member</code>&#8221; и &#8220;<code>admin</code>&#8220;):</p>
<p>1.  $acl = <strong>new</strong> Zend_Acl();</p>
<p>2.</p>
<p>3.  $acl-&gt;addRole(<strong>new</strong> Zend_Acl_Role(&#8216;guest&#8217;))</p>
<p>4.      -&gt;addRole(<strong>new</strong> Zend_Acl_Role(&#8216;member&#8217;))</p>
<p>5.      -&gt;addRole(<strong>new</strong> Zend_Acl_Role(&#8216;admin&#8217;));</p>
<p>6.</p>
<p>7.  $parents = <a href="http://www.php.net/array">array</a>(&#8216;guest&#8217;, &#8216;member&#8217;, &#8216;admin&#8217;);</p>
<p>8.  $acl-&gt;addRole(<strong>new</strong> Zend_Acl_Role(&#8216;someUser&#8217;), $parents);</p>
<p>9.</p>
<p>10.$acl-&gt;add(<strong>new</strong> Zend_Acl_Resource(&#8216;someResource&#8217;));</p>
<p>11.</p>
<p>12.$acl-&gt;deny(&#8216;guest&#8217;, &#8216;someResource&#8217;);</p>
<p>13.$acl-&gt;allow(&#8216;member&#8217;, &#8216;someResource&#8217;);</p>
<p>14.</p>
<p>15.<a href="http://www.php.net/echo">echo</a> $acl-&gt;isAllowed(&#8216;someUser&#8217;, &#8216;someResource&#8217;) ? &#8216;разрешен&#8217; : &#8216;запрещен&#8217;;</p>
<p>Поскольку нет правил, определенных специально для роли &#8220;<code>someUser</code>&#8221; и ресурса &#8220;<code>someResource</code>&#8220;, то Zend_Acl должен производить поиск правил, которые могут быть определены для ролей, от которых &#8220;<code>someUser</code>&#8221; наследуется. Сперва проверяется роль &#8220;<code>admin</code>&#8220;, и обнаруживается, что для нее не определены правила доступа. Затем проверяется роль &#8220;<code>member</code>&#8220;, и Zend_Acl обнаруживает, что есть правило разрешающее доступ для &#8220;<code>member</code>&#8221; к &#8220;<code>someResource</code>&#8220;.</p>
<p><a href="http://resurse-educationale.uv.ro/?attachment_id=189" rel="attachment wp-att-189">Download Zend Framework Reference</a></p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=186</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Structuri de date. Stive. Cozi. (Pascal)</title>
		<link>http://resurse-educationale.uv.ro/?p=183</link>
		<comments>http://resurse-educationale.uv.ro/?p=183#comments</comments>
		<pubDate>Thu, 04 Aug 2011 14:18:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Pascal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[algoritmi]]></category>
		<category><![CDATA[extraşcolar]]></category>
		<category><![CDATA[informatică]]></category>
		<category><![CDATA[multime]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[programare]]></category>
		<category><![CDATA[programe rezolvate]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tipuri de date]]></category>
		<category><![CDATA[units]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=183</guid>
		<description><![CDATA[Stucturi de date 8.1 Noţiuni generale Orice algoritm lucrează cu date (numere întregi, reale, şiruri de caractere etc.). Referitor la acestea, în informatică, s-au cristalizat anumite concepte fundamentale, pe care le vom prezenta în continuare. Printr-un tip de dată  înţelegem &#8230; <a href="http://resurse-educationale.uv.ro/?p=183">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Stucturi de date</p>
<p>8.1 Noţiuni generale</p>
<p>Orice algoritm lucrează cu date (numere întregi, reale, şiruri de caractere etc.). Referitor la acestea, în informatică, s-au cristalizat anumite concepte fundamentale, pe care le vom prezenta în continuare.</p>
<p><em>Printr-un tip de dată  înţelegem o mulţime cu elemente numite valori.</em></p>
<p>Exemplu:{-32768, 32767, &#8230;&#8230;.0,1,&#8230;&#8230;..32767} este omulţime de numere întregi. Atunci cînd nu există posibilatea de confuzie, putem nota mulţimea de mai sus astfel: [-32768,32767]. Un element al acestei mulţimi este 7 (valoarea 7). În Turbo Pascal un astfel de tip se numeşte <em>integer</em>. Şi este predefinit (este cunoscut de limbaj, nu trebuie definit de programator).</p>
<p><em>Pe mulţimea valorilor unui tip se definesc operaţiile asociate tipului</em>.</p>
<p>Exemplu: Pentru tipul integer se definesc operaţiile de adunare, scădere, înmulţire etc.</p>
<p><em>Pentru fiecare tip se defineşte modul în care se valorile sale.</em></p>
<p>Exemplu: Pentru tipul <em>integer </em>valorile se memorizează utilizînd codul complementar şi se folosesc 2 octeţi consecutivi.</p>
<p>Pentru a lucra cu date de un anumit tip se folosesc variabile.</p>
<p>O <em>variabilă </em>se caracterizează prin: tip (natura datelor şi modul de memorare), nume (prin care aceasta se adresează) şi adresă (număr de ordine al primului octet în care se reţin datele, memoria internă fiind privită ca o succesiune de octeţi numerotaţi).</p>
<p>Tipuri de date pot fi <em>simple</em> (mulţimile care alcătuiesc nu sunt rezultate ca produs cartezian a altor mulţimi) şi <em>stucturate</em> în caz contrar. Exemplu:tipul <em>integer</em> este simplu, iar tipul <em>record</em> este structurat.</p>
<p>Limbajele de programare evoluate utilizează din plin tipurile de date. Mai mult, unele din ele permit programului, folosind tipurile existente, să definească noi tipuri de date. Limbajul Turbo Pascal este un exemplu în acest sens.</p>
<p><span id="more-183"></span></p>
<p><em>Noţiunea de tip de date este strânsă legată de un anumit limbaj de programare. În situaţia în care se renunţă la această legătură, se ajunge la o altă noţiune mult utilizată şi anume cea de structură de date</em>.</p>
<p>Exemplu: <em>Mulţimea</em> este o structură de date (după cum vom arăta). În limbajul Turbo Pascal există tipul mulţime (<em>set</em>). Alte limbaje (de exemplu C) nu cunosc acest tip. Aceasta nu înseamnă că în C nu vom putea lucra cu mulţimi. Sarcina noastră este să înţelegem structura de date numită mulţime şi să o implementăm în orice limbaj de programare dorim.</p>
<p>Un curs de algoritmi trebuie să fie independenţi de orice limbaj. Fapt că în aceasta lucrare algoritmii se implementează în Turbo Pascal nu înseamnă că ei pot fi folosiţi numai în acest limbaj. Din acest motiv, orice curs de algoritmi va utiliza noţiunea de <em>structură de date</em>.</p>
<p><em>Structurile de date</em> se clasifică în două mari categorii:statice şi dinamice.</p>
<p>Criteriul de clasificare este dat de modul de alocare a memoriei interne.</p>
<p><em>Astfel, pentru structurile statice memoria se alocă la începutul execuţiei programului şi rămăne alocată pînă cînd se încheie execuţia acestuia. Pentru structurile dinamice se alocă memorie în timpul execuţiei programului, iar cînd nu mai este necesară, memoria se eliberează</em>.Modalitatea prin care se poate realiza aceasta în Turbo Pascal va fi arătată chiar în acest capitol.</p>
<p>8.1.1 Structuri statice</p>
<p>Aceste structuri ne sunt deja binecunoscute. În acest capitol le vom prezenta în mod sistematic şi, pe cît posibil, formalizat.</p>
<p>1)  Tabloul</p>
<p>Fie Ani={1,2,….ni} mulţimea primelor ni numere naturale.</p>
<p>Fie M=An1 x An2  x…..x Ank   produsul cartezian a k astfel de mulţimi.</p>
<p><em>Se numeşte tablou o funcţie f:M→T, unde T este o mulţime oarecare.</em></p>
<p><em>Numărul k este dimensiunea tabloului. Dacă k=1 tabloul se mai numeşte şi vector. Vectorul are n</em><em>1</em><em> componente. Dacă k=2 tabloul se mai numeşte şi matrice. Matricea are n</em><em>1</em><em>xn</em><em>2</em><em> elemente.</em></p>
<p>Atenţie! Frecvent se confundă numărul componentelor cu dimensiunea tabloului.</p>
<p>De exemplu, despre un vector cu n componente se spune că este de dimensiune n (cînd, de fapt, toţi vectorii au dimensiunea 1).</p>
<p>Majoritatea limbajelor de programare evoluate au implementat tipul tablou (<em>array</em> <em>în Turbo Pascal</em>). Pentru a identifica elementele unui tablou se folosesc indici (aceştia sunt elemente ale produsului cartezian pe care este definită funcţia).</p>
<p>2)       Articolul</p>
<p>Fie A1, A2,….An n mulţimi finite. În general, natura elementelor acestor mulţimi poate fi diferită. De exemplu, A1 poate fi alcătuită din numere întregi, A2 poate fi alcătuită din caractere etc. Fie A=A1xA2x…xAn produsul cartezian  a celor n mulţimi. <em>Un articol reţine un element al mulţimii A. Un cîmp reţine un element al</em> mulţimii Ai. Majoritatea limbajelor de programare  evaluate  cunosc tipul structurat articol (<em>record</em> în Turbo Pascal). Oricare cîmp poate fi, la rîndul său, articol (<em>record</em> în <em>record</em>).</p>
<p>3)       Mulţimea</p>
<p>Fie A o mulţime finită. Ea poate fi privită ca o structură de date. Puţine dintre limbaje  (Turbo Pascal) admit chiar un tip de date numit mulţime (set). Însă şi aici numărul elementelor unei mulţimi nu poate fi mai mare decît 255 (avantajul este că sunt predefinite operaţiile cu mulţimi ). În ipoteza că programatorul doreşte să implementeze  algoritmi care lucrează cu mulţimi, indiferent de limbaj, se poate folosi <em>vectorul caracteristic</em>. Astfel , pentru o mulţime cu n elemente, orice submulţime a sa (v) va fi definită cu ajutorul unui vector cu n componente, în care fiecare componentă poate lua doar două valori 0 şi 1.</p>
<p>¥ i Є{1..n} avem v(i)=</p>
<p>În acest caz, este sarcina programatorului să stimuleze diversele operaţii cu mulţimi.</p>
<p>4)       Stiva alocată static</p>
<p>Structura de date numită <em>stivă </em>a fost prezentată şi este binecunoscută cititorului. Nu ne rămîne decît să precizăm faprul că, pînă acum, a fost impementată ca structură statică, cu ajutorul vectorilor . modul în care s-a realizat implementarea ne este clar, cu ajutorul unui vector (ST l-am numit) şi a unei variabile k (indică vîrful ei). Principalul dezavantaj al unei astfel de implementări este dat de faptul că, deşi ca structură de date nu are limitat numărul nivelelor (putem folosi oricîte), practice, numărul acestora nu poate fi mai mare decît numărul componentelor vectorului. Acest dezavantaj se reduce simţitor în cazul cînd în care stivă este implementată dinamic, însă, din cauza limitării memoriei interne, se menţine totuşi.</p>
<p>5)       Coada alocată static</p>
<p><em>Coada este acea structură de date în care toate înserările sunt făcute la unul din capetele cozii, iar toate ştergerile (în general, prelucrările) sunt făcute la celălalt capăt.</em></p>
<p>Este cu totul nerecomandabilă utilizarea vectorilor pentru stimularea cozii (alocarea statică). Facem această precizare deoarece, în această situaţie are loc un fenomen de migraţie a datelor de la dreapta la stînga în cadrul vectorului.</p>
<p>Să presupunem că stimulăm o coadă cu ajutorul unui vector cu zece componente, care reţin numere întregi. Presupunem de asemenea că niciodată în coadă nu vom mai avea mai  mult bde 4 elemente. Introducem în coadă numerele 1,2,3,4. pentru a avea unde să introducem şi alte completăm vectorul de la dreapta la stînga.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top">4</td>
<td width="64" valign="top">3</td>
<td width="64" valign="top">2</td>
<td width="64" valign="top">1</td>
</tr>
</tbody>
</table>
<p>Dacă scoatem din coadă pe 1 şi introducem în coadă pe 5, coada va arăta astfel:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top">5</td>
<td width="64" valign="top">4</td>
<td width="64" valign="top">3</td>
<td width="64" valign="top">2</td>
<td width="64" valign="top"></td>
</tr>
</tbody>
</table>
<p>Scoatem din coadă pe 2 şi obţinem pe 6:</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
<td width="64" valign="top">6</td>
<td width="64" valign="top">5</td>
<td width="64" valign="top">4</td>
<td width="64" valign="top">3</td>
<td width="64" valign="top"></td>
<td width="64" valign="top"></td>
</tr>
</tbody>
</table>
<p>Se observă acest fenomen de migraţie a datelor, de la dreapta spre stînga.</p>
<p>O altă soluţie ar fi ca, după fiecare stocare de date din coadă, să deplasăm întregul şir de date cărte dreapta, însă în acest caz se consumă mult timp.</p>
<p><em>O soluţie mai bună de implementare a cozii este să folosim un vector pe care îl privim ca fiind &#8220;circular&#8221; (facem convenţia ca după ultima componentă să urmeze prima). Adresa componentei de început a cozii va fi reţinută de altă variabilă, iar adresa componentei de sfîrşit va fi reţinută de o altă variabilă. </em>Un astfel de procedeu poate fi folosit, dar nu este recomandabil atît timp cît există alocarea dinamică a memoriei (aşa se lucra prin anii 70, când limbajele &#8220;la modă&#8221; <em>Fortan</em> şi <em>Cobol</em> nu putea aloca memoria dinamic).</p>
<p>Din cele prezentate nu rezultă în nici un fel la ce foloseşte această structură de date. Deşi are numeroase utilizări (rol fundamental în informatică) pentru moment nu putem da exemple (ne lipsesc condiţiile necesare). Vezi parcurgerea în lăţime a arborilor oarecare.</p>
<p>8.1.2. Alocarea dinamică a memoriei în Turbo Pascal</p>
<p>Din punct de vedere al unui programator, memoria calculatorului se prezintă ca o succesiune de octeţi, fiecare octet avînd o adresă binară bine stabilită. Aceşti octeţi sunt identificaţi prin numere cuprinse între 0 şi n-1. convenim să numim adresă numărul de ordine al unui octet. Un octet este format din 8 biţi. Fiecare bit poate memora fie cifra binară 1, fie cifra binară 0, diversele tipuri de date cunoscute pînă acum (INTEGER, REAL) ocupă 2 sau mai mulţi octeţi consecutive. Pentru fiecare tip de dată cunoscut există o anumită logică potrivit căreia se face memorarea efectivă a conţinutului. De exemplu, pentru tipul INTEGER memorarea se face în COD COMPLEMENTAR. Nu ne propunem să prezentăm modul de reprezintare a datelor. Ne mărginim numai să atragem atenţia că o variabilă folosită de noi în program are un nume (simbolic), o valoare şi o adresă la care o găsim memorată (adresa primului octet din cei <em>p</em> octeţi consecutive ocupaţi de variabilă). În general, în limbajele evaluate nu este necesar ca programatorul să cunoască adresa la care se găsesc variabilele cu care lucrează.</p>
<p>Se cunosc două forme de alocare a memoriei de către programator în cadrul limbajului PASCAL: statică şi dinamică.</p>
<ul>
<li>Utilizînd forma de alocare statică, variabilele se declară utilizînd cuvîntul cheie VAR la începutul programului.</li>
<li>Utilizînd forma de alocare dinamică, în timpul rulării programului, în funcţie de necesităţi, se alocă memorie suplimentară sau se renunţă la ea.</li>
</ul>
<p>Pentru alocarea dinamică utilizăm tipul de date referinţă. Se consideră secvenţa de program:</p>
<p>type  ref=^inr;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>adrurm:ref</p>
<p>end;</p>
<p>var c:ref;</p>
<p>Aici variabila c este o variabilă de tip referinţă. Ea reţine adrese de înregistrări. La rîndul ei, o înregistrare are două cîmpuri: nr, care conţine un număr întreg (informaţia utilă) şi adrurm (adresa următoare), care conţine adresa unei alte înregistrări.</p>
<p>Procedura NEW (c) rezervă spaţiu (un număr de octeţi cosecutivi) pentru o înregistrare, adresa primului octet fiind depusă în variabila c. Presupunem că variabila c conţine adresa unei înregistrări.</p>
<p>Procedura DISPOSE (c) eliberează spaţiul de memorie afectat acelei înregistrări care avea adresa în c. Cuvîntul cheie NIL are semnificaţia &#8221; nici o adresă&#8221;.</p>
<p><em>Observaţii:</em></p>
<p>1)    c se referă la adresa care se găseşte în variabila c;</p>
<p>2)    c^.nr se referă la cîmpul numeric al înregistrării care are adresa memorată în variabil c;</p>
<p>3)    c^.adrurm semnifică adresa de înregistrare care se găseşte memorată în cadrul înregistrării care are adresa c;</p>
<p>4)    c^.adrurm.nr  semnifică variabila <em>nr </em>care se găseşte în înregistrarea care care adresa plasată în cîmpul <em>adrurm </em>al înregistrării cu adresa c.</p>
<p>Observaţie foarte importantă: spaţiul necesar variabilelor alocate dinamic se rezervă într-o zonă de memorie, special destinată numită <em>HEAP</em> (<em>pentru PC compatibile i.B.M.).</em></p>
<p><strong>8.2 Structuri dinamice</strong>.</p>
<p>8.2.1 Listă liniară simplu înlănţuită</p>
<p>O listă liniară simplu înlănţuită este o structură de forma:</p>
<p>adr1                                                   adr2                                                                       adrn</p>
<p>Semnificaţia notaţiilor folosite este următoarea:</p>
<ul>
<li> adr1, adr2,…,adrn reprezintă adresele din memorie ale celor <em>n</em> înregistrări;</li>
<li>in1, in2,…, inn reprezintă informaţiile utile din cele <em>n</em> înregistrări (altele decît cele de adresă pentru înregistrarea următoare ).</li>
</ul>
<p>Denumirea &#8220;simplu înlănţuită&#8221;  provine din faptul că fiecare element  al listei conţine o singură adresă, şi anume adresa elementului următor din listă. Aici avem o excepţie pentru ultimul element, care are în cîmpul de adresă cuvîntul cheie  NIL (semnificînd &#8220;nici o adresă&#8221;). Operaţiile pe care le putem face în legătură cu această structură de date sunt următoarele:</p>
<p>1)    creare;</p>
<p>2)    listare;</p>
<p>3)    adăugare;</p>
<p>4)    ştergere;</p>
<p>În programul care urmează aceste operaţii sunt realizate de   procedurile cu acelaşi nume (facem precizarea că, în program, informaţiile utile sunt date de numere 1,2,…,n). Am recurs la această cale din dorinţa de a simplifica pe cît posibil prezentarea.</p>
<p><strong><em>1) </em></strong><em>Creare</em></p>
<p>Se cere numărul n de înregistrări. Se creează o primă înregistrare avînd ca informaţie utilă numărul 1. Variabila <em>b</em> de tip referinţă reţine adresa primei înregistrări din listă. Pentru fiecare <em>i</em> cuprins între 2 şi n se adaugă cite o nouă înregistrare listei. Variabila <em>d</em> reţine adresa ultimei înregistrări deja create pentru a-i completa cîmpul de adresă. Se procedează astfel pentru că în momentul în care am creat o înregistrare nu se cunoaşte adresa înregistrării care urmează.</p>
<p><strong><em>2) </em></strong><em>Listare </em></p>
<p><em> </em>Am precizat faptul că <em>b</em> reţine adresa primei înregistrări. Pentru a nu deteriora această valoare, o vom memora în variabila <em>c</em> . Atît timp cît nu am ajuns  la sfîrşitul listei, tipărim informaţia utilă şi încărcăm  în <em>c</em> adresa înregistrării următoare.</p>
<p><strong><em>3) </em></strong><em>Adăugare </em></p>
<p>Operaţia de adăugare a unui nou element la listă comportă cunoaşterea a două informaţii:</p>
<ul>
<li>Informaţia utilă a elementului (înregistrării) din listă după care urmează  să se facă adăugarea;</li>
<li>Informaţia utilă a elmentului care urmează să fie adăugat.</li>
</ul>
<p>Adăugarea propriu-zisă constă în următoarele:</p>
<ul>
<li>Poziţionarea pe înregistrarea  după care urmează să adăugăm noua înregistrare;</li>
<li>Alocarea spaţiului pentru noua înregistrare;</li>
<li>Completarea informaţiei utile pentru aceasta;</li>
<li>Completarea adresei următoare a noii înregistrări, care va fi adresa următoare a înregistrării pe care suntem poziţionaţi;</li>
<li>Cîmpul de adresă al înregistrării pe care suntem poziţionaţi va lua ca valoare adresa noii înregistrări.</li>
</ul>
<p><em>Observaţie</em>:</p>
<p>- Aşa cum este concepută procedura, nu se poate adăuga  o primă înregistrare listei. Propunem ca exerciţiu modificarea ei în acest sens.</p>
<p>4) <em>Ştergerea</em></p>
<p>Pentru a şterge o înregistrare este necesar  să cunoaştem informaţia utilă</p>
<p>a acesteia. Vom proceda în mod diferit pentru situaţiile în care se şterge  prima înregistrare sau una diferită de prima.</p>
<p>În cazul în care ştergem prima înregistrare, efectuăm operaţiile:</p>
<ul>
<li>Se salvează în variabila <em>c</em> adresa primei înregistrări (cea care urmează a fi ştearsă);</li>
<li>Variabila <em>b</em> (care reţine adresa primei înregistrări) va lua ca valoare adresa următoare primei înregistrări;</li>
<li>Se eliberează spaţiul rezervat înregistrării şterse;</li>
</ul>
<p>În situaţia în care ştergem o altă înregistrare decît prima, procedăm în felul următor:</p>
<ul>
<li>Se face poziţionarea pe înregistrarea care urmează a fi ştearsă;</li>
<li>Cîmpul  de adresă al înregistrării precedente capătă valoarea cîmpului de adresă al înregistrării curente;</li>
<li>Eliberăm spaţiul rezervat înregistrării curente.</li>
</ul>
<p>program 11n;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>adrurm:ref</p>
<p>end;</p>
<p>var b,c,d:ref;</p>
<p>n,i: integer;</p>
<p>procedure creare;</p>
<p>begin</p>
<p>write (‘n=’); readln(n);</p>
<p>new ( c); c^.nr:=1;</p>
<p>b:=c; d:=c;</p>
<p>for i:=2 to n do</p>
<p>begin</p>
<p>new ( c);</p>
<p>c^.nr:=i;</p>
<p>d^.adrurm:=c;</p>
<p>d:=c</p>
<p>end;</p>
<p>procedure listare;</p>
<p>begin</p>
<p>c:=b;</p>
<p>while c&lt; &gt;nil do</p>
<p>begin</p>
<p>writeln( c^.nr);</p>
<p>c:=c^.adrurm</p>
<p>end</p>
<p>end;</p>
<p>procedure ştergere;</p>
<p>begin</p>
<p>write (‘i=’); readln(i);</p>
<p>if  i=1 then</p>
<p>begin</p>
<p>c:=b;</p>
<p>b:=b^.adrurm;</p>
<p>dispose (c)</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>c:=b;</p>
<p>while  c^.nr&lt; &gt;i do</p>
<p>begin</p>
<p>d:=c;</p>
<p>c:=c^.adrurm</p>
<p>end;</p>
<p>d^.adrurm:=c^.adrurm;</p>
<p>dispose ( c)</p>
<p>end</p>
<p>end;</p>
<p>procedure adăugare;</p>
<p>begin</p>
<p>write(‘i=’); readln(i);</p>
<p>write(‘n=’); readln(n);</p>
<p>c:=b;</p>
<p>while c^.nr&lt; &gt;i do c:=c^.adrurm;</p>
<p>new (d );</p>
<p>d^.nr:=n;</p>
<p>d^.adrurm:=c^.adrurm;</p>
<p>c^.adrurm:=d</p>
<p>end;</p>
<p>begin</p>
<p>creare;</p>
<p>listare;</p>
<p>adăugare;</p>
<p>listare;</p>
<p>ştergere;</p>
<p>listare</p>
<p>end.</p>
<p>În continuare ne propunem să construim şi să tipărim o listă liniară simplu înlănţuită, utilizînd tehnici recursive.</p>
<p>Funcţia <em>lista</em> are sarcina de a construi lista liniară înlănţuită. La început se cere informaţia utilă. În situaţia în care aceasta este diferită de 0 (valoare care semnifică faptul  că nu mai avem de adăugat nici un element), se rezervă un spaţiu pentru noua înregistrare, se completează informaţia utilă, iar cîmpul <em>adrurm</em> va lua valoarea funcţiei  de tip <em>lista</em> care se autoapelează. În încheiere <em>lista </em>va lua valoarea <em>c </em>a cîmpului care reţine adresa noului element.</p>
<p>Este interesant să observăm că iniţial se creează lista simplu înlănţuită fără a completa cîmpul <em>adresa</em>, această completare urmînd să se facă la revenirea în procedură.</p>
<p>Să ne imaginăm că rulînd acest program dorim să creăm o listă cu două înregistrări care au informaţiile  utile 1 şi 2.</p>
<p>Rularea decurge astfel:</p>
<ul>
<li>Apelăm procedura;</li>
<li>Citim valoarea lui <em>n</em> şi anume 1;</li>
<li>Se alocă spaţiu pentru prima înregistrare;</li>
<li>Completăm informaţia utilă;</li>
<li>Pentru a completa adresa următoare înregistrării curente, se apelează din nou funcţia;</li>
<li>Citim valoarea lui <em>n</em> şi anume 2;</li>
<li>Alocăm spaţiu pentru a doua înregistrare;</li>
<li>Completăm informaţia utilă cu 2;</li>
<li>Se apelează din nou funcţia;</li>
<li>Se citeşte 0;</li>
<li>Funcţia ia valoarea NIL;</li>
<li>Se revine din apel şi se continuă de acolo de unde am rămas;</li>
<li>Cîmpul de adresă al celei de a doua înregistrări va lua valoarea NIL;</li>
<li>Funcţia capătă valoarea adresei înregistrării 2,</li>
<li>Se revine din apel;</li>
<li>Cîmpul de adresă al primei înregistrări ia valoarea celei de-a doua înregistrări;</li>
<li>Funcţia ia  valoarea adresei primei înregistrări;</li>
<li>Se revine în programul principal.</li>
</ul>
<p>Observăm că valoarea variabilei <em>c</em> a programului principal va fi după rulare adresa primei înregistrări.</p>
<p>Propunem ca exerciţiu construirea listei utilizînd o procedură recursivă. Putem defini recursiv lista astfel:</p>
<ul>
<li>O mulţime vidă de înregistrări este o listă;</li>
<li>Dacă la o listă se adaugă o înregistrare, se obţine o listă.</li>
</ul>
<p>Recursiv putem tipări informaţia utilă din listă în două moduri:</p>
<ul>
<li>În ordinea în care a fost creată;</li>
<li>În ordinea inversă celei în care a fost creată.</li>
</ul>
<p>Lăsăm pe seama cititorului analiza acestor două proceduri.</p>
<p>program 11r;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>adrurm:ref</p>
<p>end;</p>
<p>var n:integer;</p>
<p>c:ref;</p>
<p>function lista:ref;</p>
<p>var c:ref;</p>
<p>begin</p>
<p>write(‘n=’); readln(n);</p>
<p>if n&lt; &gt;0</p>
<p>then</p>
<p>begin</p>
<p>new(c);</p>
<p>c^.nr:=n;</p>
<p>c^.adrurm:=lista;</p>
<p>lista:=c;</p>
<p>end</p>
<p>else lista:nil</p>
<p>end;</p>
<p>procedure tipard(c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>writeln(c^.nr);</p>
<p>tipard (c^.adrurm)</p>
<p>end</p>
<p>end;</p>
<p>procedure tipari(c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt; nil tfen</p>
<p>begin</p>
<p>tipari (c^.adrurm);</p>
<p>writeln(c^.nr)</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>c:=lista;</p>
<p>tipard©;</p>
<p>writeln(‘&#8212;&#8212;&#8212;&#8212;’);</p>
<p>tipari©</p>
<p>end.</p>
<p>Aplicaţie (Sortare topologică)</p>
<p><em>Presupunem că dorim sortarea numerelor. 1, 2, &#8230;.., n, numere care se găsesc într-o ordine oarecare, alta decît naturală. Pentru a afla relaţia în care se găsesc numerele, introducem un număr finit de perechi (i,j). O astfel de pereche ne spune că, în relaţia de ordine considerată, i se află înaintea lui j.</em></p>
<p><em><span style="text-decoration: underline;">Exemplu 1</span></em><em>: </em>n=3 şi citim perechile (3,1) şi (3,2). Numărul 3 se află înaintea lui1 şi 3 se află înaintea lui 2. Apar două soluţii posibile: 3,1,2 şi 3,2,1, întucît nu avem nici o informaţie asupra relaţiilor dintre 1şi 2. Tragem de aici concluzia că o astfel de problemă poate avea mai multe soluţii.</p>
<p><em><span style="text-decoration: underline;">Exemplu 2</span></em>: n=3 şi citim (1,2), (2,3), (3,1). În acest caz nu avem soluţie.di primele două relaţii rezultă că ordinea ar fi 1,2,3 iar a-3-a contrazice această ordine.</p>
<p>În concluzie, problema ar avea sau nu soluţie, iar dacă are poate fi sau nu unică.</p>
<p>Algoritmul pe care îl prezentăm în continuare furnizează o singură soluţie atunci cînd problema admite soluţii. În caz contrar specifică faptul că problema nu admite soluţie.</p>
<p>Vom exemplifica funcţionarea algoritmului pe exemplu următor: n=4 şi se citesc perechile (3,4), (4,2), (1,2), (3,1).</p>
<p>Pentru fiecare număr între 1 şi <em>n </em>trebuie să avem următoarele informaţii:</p>
<ul>
<li>Numărul predecesorilor săi;</li>
<li>Succesorii săi;</li>
</ul>
<p>Pentru aceasta folosi doi vectori:</p>
<ul>
<li><em> contor</em>, vector care reţine numărul predecesorilor fiecărui <em>k</em>, cu <em>k </em><em>Є </em><em>{1..n}.</em></li>
<li><em>a</em>, care reţine adresele de început ale listelor de succesori ai fiecărui element.</li>
</ul>
<p>Pentru fiecare element există o listă simplu înlănţuită a succesorulor săi. Fiecare înregistrare din aceste liste conţine două elemente:</p>
<ul>
<li>succesorul;</li>
<li>adresa următorului element din listă.</li>
</ul>
<p>Iniţial, în dreptul fiecărui element în vectorul „contor” se trece 0, iar în vectorul „a” se trece NIL.</p>
<p>Citirea unei perechi (i,j) înseamnă efectuarea următoarelor operaţii:</p>
<ul>
<li>mărirea cu 1 a cîmpului <em>contor (j)</em> (j are un predecesor, şi anume pe i);</li>
<li>adăugarea lui <em>j </em>la lista succesorului lui <em>i.</em></li>
</ul>
<p>Pentru exemplu nostru, lucrurile decurg astfel:</p>
<p>CONTOR</p>
<p>A</p>
<p>În continuare se procedează astfel:</p>
<ul>
<li>toate elementele au 0 în cîmpul lui <em>contor</em> se reţine într-un vector <em>c;</em></li>
<li>pentru fiecare element al vectorului <em>c</em> se procedează astfel:
<ul>
<li>se tipăreşte;</li>
<li>se marchează cu -1 cîmpul său de contor;</li>
<li>pentru toţi succesorii săi (aflaţi în lista succesorilor) se scade cu 1 din cîmpul <em>contor</em> (este normal, întrucît aceştia au un predecesor mai puţin).</li>
<li>Se reia algoritmul dacă nu este îndeplinită una din condiţiile următoare:</li>
</ul>
</li>
</ul>
<p>v   Au fost tipărite toate elementele, caz în care algoritmul se încheie cu succes;</p>
<p>v   Nu avem nici un element cu 0 în cîmpul <em>contor</em>, caz în care relaţiile au fost incoerente.</p>
<p>.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="51" valign="top">1</td>
<td width="51" valign="top">2</td>
<td width="51" valign="top">-1</td>
<td width="51" valign="top">0</td>
</tr>
<tr>
<td width="51" valign="top">al1</td>
<td width="51" valign="top">nil</td>
<td width="51" valign="top">al3</td>
<td width="51" valign="top">al4</td>
</tr>
<tr>
<td width="51" valign="top">2</td>
<td width="51" valign="top"></td>
<td width="51" valign="top">4</td>
<td width="51" valign="top">2</td>
</tr>
</tbody>
</table>
<p>tipăresc 3, scad 1 din predecesorii lui 4 şi 1, cu -1 contorul lui 3;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="50" valign="top">0</td>
<td width="50" valign="top">1</td>
<td width="50" valign="top">-1</td>
<td width="50" valign="top">-1</td>
</tr>
<tr>
<td width="50" valign="top"></td>
<td width="50" valign="top"></td>
<td width="50" valign="top"></td>
<td width="50" valign="top"></td>
</tr>
</tbody>
</table>
<p><em><span style="text-decoration: underline;">Observaţie:</span></em></p>
<p>Algoritmul are mai multe aplicaţii, ca de exemplu:</p>
<ul>
<li>Ordonarea unor activităţi, atunci cînd ele sunt condiţionate una după alta;</li>
<li>Ordonarea unor termeni care se cer explicaţi pentru a-i putea explica prin alţi deja prezentaţi.</li>
</ul>
<p>Program stoop;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>succ:integer;</p>
<p>urm:ref</p>
<p>end;</p>
<p>vector=array [1..100] of integer;</p>
<p>vectad=array [1..100]of ref;</p>
<p>var n, m, i, j, k:integer;</p>
<p>contor, c:vector;</p>
<p>a:vectad;</p>
<p>gasit:boolean;</p>
<p>procedure adaug  (i,j:integer);</p>
<p>var c,d:ref;</p>
<p>begin</p>
<p>contor [j]:=contor [j]+1;</p>
<p>c:=a[i];</p>
<p>new (d);</p>
<p>d^.urm:=nil;</p>
<p>d^.succ:=j;</p>
<p>if c=nil</p>
<p>then a[i]:=d</p>
<p>else</p>
<p>begin</p>
<p>while c^.urm&lt; &gt;nil do c:=c^.urm;</p>
<p>c^.urm:=d</p>
<p>end</p>
<p>end;</p>
<p>procedure actual (i:integer);</p>
<p>var c:ref;</p>
<p>begin</p>
<p>c:=a[i];</p>
<p>while c &lt; &gt;nil do</p>
<p>begin</p>
<p>contor [c^.succ]:=contor[c^.succ]-1;</p>
<p>c:=c^.urm</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>write (’n=’); readln(n);</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>contor [i]:=0;</p>
<p>a[i]:=nil</p>
<p>end;</p>
<p>while i&lt; &gt;0 do</p>
<p>begin</p>
<p>write (’tastati i,j=’);</p>
<p>readln (i,j);</p>
<p>if i&lt; &gt;0 then adaug (i,j)</p>
<p>end;</p>
<p>m:=n;</p>
<p>repeat</p>
<p>k:=1;</p>
<p>gasit:false;</p>
<p>for i:=1 to n do if contor [i]=0</p>
<p>then</p>
<p>begin</p>
<p>gasit:=true;</p>
<p>m:=m-1;</p>
<p>c[k]:=1;</p>
<p>k:=k+1;</p>
<p>contor [i]:=-1</p>
<p>end;</p>
<p>for i:=1 to k-1 do</p>
<p>begin</p>
<p>actual (c[i]);</p>
<p>writeln (c[i]);</p>
<p>end;</p>
<p>until (not gasit) or (m=0);</p>
<p>if m=0</p>
<p>then writeln (’totul e ok’)</p>
<p>else writeln (’relatii contradictorii’)</p>
<p>end.</p>
<p>8.2.2 Lista liniară dublu înlănţuită</p>
<p>O listă dublu înlănţuită este o structură de date de forma:</p>
<p>adr1                                                           adr2                                                            adrn</p>
<p>Operaţiile pe care le putem face cu o listă dublu înlănţuită sunt următoarele:</p>
<p>1)    Creare;</p>
<p>2)    Adăugare la dreapta;</p>
<p>3)    Adăugare la stînga;</p>
<p>4)    Adăugare în interiorul listei;</p>
<p>5)    Ştergere din interiorul listei;</p>
<p>6)    Ştergere la sînga listei;</p>
<p>7)    Ştergere la dreapta listei;</p>
<p>8)    Listare de  la sînga la dreapta;</p>
<p>9)    Listare de la dreapta  la sînga;</p>
<p>1)    Creare</p>
<p>O listă dublu înlănţuită se creează cu o singură înregistrare. Pentru a ajunge la numărul de înregistrări dorit, utilizăm proceduri de adăugare la stînga sau la dreapta. În programul de faţă acest lucru este realizat de procedura creare. Această procedură realizează operaţiile următoare:</p>
<ul>
<li>Citirea informaţiei utile;</li>
<li>Completarea înregistrării cu informaţia utilă;</li>
<li>Completarea adreselor de legătură la stînga şi la dreapta cu NIL;</li>
<li>Variabilele tip referinţă <em>b </em>şi <em>s</em> vor căpăta valoarea adresei acestei prime înregistrări (b semnfică adresa înregistrării cea de mai din stînga, s adresa ultimei înregistrări din dreapta).</li>
</ul>
<p>2) Adăugarea la dreapta</p>
<p>Această operaţie este realizată de procedura <em>addr</em>. Pentru adăugarea unei înregistrări se realizează următoarele operaţii:</p>
<ul>
<li>Citirea informaţiei utile;</li>
<li>Alocarea spaţiului pentru înregistrare;</li>
<li>Completarea adresei la dreapta cu NIL;</li>
<li>Completarea adresei din stînga şcu adresa celei mai din dreapta înregistrări (reţinute în variabila <em>s</em>);</li>
<li>Modificare cîmpului de adresă la dreapta a înregistrării din <em>s</em> cu adresa noii înregistrări;</li>
<li><em>s </em>va lua valorile noi înregistrări, deoarece va fi cea mai din dreapta.</li>
</ul>
<p><em> </em></p>
<p>3)    Adăugarea la stînga</p>
<p>Această operaţie o propunem ca exerciţiu.</p>
<p>4)    Adăugare în interiorul listei</p>
<p>Această operaţie este realizată de procedura <em>includ</em>, care realizează următoarele operaţii:</p>
<p>ü Parcurge lista de la stînga la dreapta căutînd înregistarea cu informaţia utilă <em>m</em>, în dreapta căreia urmează să introducem noua înregisrare;</p>
<p>ü Citeşte informaţia utilă;</p>
<p>ü Alocă spaţiu pentru noua înregistrare;</p>
<p>ü Completează informaţia utilă;</p>
<p>ü Adresa stîngă a noii înregistrări ia valoarea adresei înregistrării de informaţie utilă <em>m</em>;</p>
<p>ü Adresa dreaptă a noii înregistrări ia valoarea adresei dreapta a înregistrării de informaţia utilă <em>m</em>;</p>
<p>ü Adresa dreaptă a înregistrării cu informaţia utilă <em>m</em> ia valoarea noii înregistrări;</p>
<p><em><span style="text-decoration: underline;">Observaţie:</span></em></p>
<p>Propunem ca exerciţiu realizarea unei proceduri de adăugare în interiorul listei a unei înregistrări la dreapta înregistrării cu informaţia utilă <em>m.</em></p>
<p><em> </em></p>
<p>5)    Ştergere din interiorul listei</p>
<p>Această operaţie este realizată de procedura <em>sterg</em>. Operaţiile efectuate de această procedură următoarele:</p>
<p>ü Se parcurge lista de la stînga la dreapta pentru a ne poziţiona pe înregistrarea care urmează a fi ştearsă;</p>
<p>ü Cîmpul de adresă dreapta al înregistrării care o precede pe această şi va lua valoarea cîmpului de adresă dreapta al înregistrării care va fi ştearsă;</p>
<p>ü  Cîmpul de adresă stînga al înregistrării care urmează înregistrării care va fi ştearsă va lua valoarea cîmpului de adresă stînga al înregistrării pe care o ştergem;</p>
<p>ü Se eliberează spaţiul de memorie rezervat înregistrării care se şterge.</p>
<p>6)-7) Ştergere la sînga şi la dreapta  listei</p>
<p>Aceste două operaţii sunt propuse cititorului ca exerciţiu.</p>
<p>8) Listare de  la sînga la dreapta</p>
<p>Această operaţie este realizată de procedura <em>listare</em>, procedură care realizează următoarele operaţii:</p>
<p>v Porneşte din stînga listei;</p>
<p>v Atît timp cît nun s-a ajuns la capătul din dreapta al listei, se tipăreşte informaţia utilă şi se trece la înregistrarea următoare.</p>
<p>9)    Listare de la dreapta  la sînga</p>
<p>O propunem ca exerciţiu.</p>
<p>Program 1di;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>as:ref;</p>
<p>nr:integer;</p>
<p>ad:ref</p>
<p>end;</p>
<p>var b,s,c:ref;</p>
<p>n,m,i:integer;</p>
<p>procedure creare (var b,s:ref);</p>
<p>begin</p>
<p>write (‘n=’); readln (n);</p>
<p>new (b); b^.nr:=n;</p>
<p>b^.as:=nil; b^.ad:=nil;</p>
<p>s:=b</p>
<p>end;</p>
<p>procedure addr (var s:ref);</p>
<p>var  d:ref;</p>
<p>begin</p>
<p>write (‘n=’); readln (n);</p>
<p>new (d); d^.nr:=n;</p>
<p>d^.as:=s; d^.ad:=nil;</p>
<p>s^.ad:=d; s:=d</p>
<p>end;</p>
<p>procedure listare (b:ref);</p>
<p>var d:ref;</p>
<p>begin</p>
<p>d:=b;</p>
<p>while d&lt; &gt;nil do</p>
<p>begin</p>
<p>writeln (d^.nr);</p>
<p>d:=d^.ad</p>
<p>end</p>
<p>end;</p>
<p>procedure include (m:integer; b:ref);</p>
<p>var d,e:ref;</p>
<p>begin</p>
<p>d:=b;</p>
<p>while d^.nr&lt; &gt;m do d:d^.ad;</p>
<p>write (‘n=’); readln (n);</p>
<p>new (e);</p>
<p>e^.nr:=n;</p>
<p>e^.as:=d;</p>
<p>d^.ad^.as:=e;</p>
<p>e^.ad:=d^.ad;</p>
<p>d^.ad:=e</p>
<p>end;</p>
<p>procedure sterg (m:integer; b:ref);</p>
<p>var d:ref;</p>
<p>begin</p>
<p>d:=b;</p>
<p>while d^.nr&lt; &gt;m do d:=d^.ad;</p>
<p>d^.as^.ad:=d^.ad;</p>
<p>d^.ad^.as:=d^.as;</p>
<p>dispose (d)</p>
<p>end;</p>
<p>begin</p>
<p>writeln (‘creare lista cu o singura inregistrare’);</p>
<p>creare (b, s);</p>
<p>write (‘cite inregistrari se adauga?’);</p>
<p>readln (m);</p>
<p>for i:=1 to m do addr (s);</p>
<p>writeln (‘acum listez de la stinga la dreapta’);</p>
<p>listare (b);</p>
<p>writeln (‘includem la dreapta o inregistrare’);</p>
<p>write (‘dupa care inregistrare se facec includerea?’);</p>
<p>readln (m);</p>
<p>include (m,b);</p>
<p>writeln (‘acum listez de la stinga la dreapta’);</p>
<p>listare (b);</p>
<p>writeln (‘Acum stergem o inregistrare din interior’);</p>
<p>write (‘Ce inregistrare stergem?’);</p>
<p>readln (m);</p>
<p>sterg (m,b);</p>
<p>writeln (‘Acum  listez de la stinga la dreapta’);</p>
<p>listare (b)</p>
<p>end.</p>
<p>8.2.3 Lista circulară</p>
<p><em>Se consideră o listă liniară. Dacă, ultima înregistrare, adresa următoare va fi înregistrării, am definit o listă circulară. În cazul în care lista iniţială este simplu înlănţuită, listă circulară va fi simplu înlănţuită, iar dacă listă iniţială este dublu înlănţuită şi lista ciculară va fi dublu înlănţuită.</em></p>
<p>Întucît operaţiile care se efectuează cu aceasta sunt asemănătoare cu cele prezente anterior, ne oprim cu explicaţiile în acest punct.</p>
<p>8.2.4 Stiva</p>
<p><em>O stivă poate fi definită şi ca o listă liniară  simplu înlănţuită în care toate intrările şi ieşirile se fac la un singur capăt al ei.</em></p>
<p>În acest caz, elementul de pe nivelul <em>k</em> al stivei va reţine adresa elementului de pe nivelul <em>k-1</em>.</p>
<p>În versiunile anterioare ale acestei cărţi am prezentat stiva ca  fiind o listă liniară <em>dublu înlănţuită</em>, fapt pentru care am fost criticat. Motivul? Prezentînd stiva ca o listă dublu înlănţuită, am avantajul că o pot folosi în mai multe aplicaţii (de exemplu, pentru backtracking, unde pentru a valida un element era necesară comparaţia sa cu cele aflate în stivă pe nivelele inferioare). Desigur, chiar folosind pentru stiva actuala definiţie (prezentă în toate lucrările de specialitate) putem realiza toate aplicaţiile făcute pînă în acest moment, însă mai greu (recursiv, cu pierdere de timp). Chiar modul de lucru standart cu stiva calculatorului (în limbaj de asamblare) permite accesul la elemente ale stivei care nu se află pe ultimul nivel.</p>
<p>Datorită celor prezentate, vom implementa stiva tot ca listă liniară dublu înlănţuită. Cititorul, dacă nu este de acord cu aceasta, îşi poate scrie propriile rutine.</p>
<p>Fiecare înregistrare corespunzătoare stivei conţine trei informaţii: adresa înainte (a elementului următor), adresa înapoi şi informaţia utilă care se diferă de la caz la caz.</p>
<p>Pentru a lucra cu o astfel de stivă sunt suficiente două proceduri: <em>adaug</em> şi <em>scot</em>, cu rolul de a adăuga şi, respectiv, de a scoate o informaţie din stivă. Modul de alcătuire al acestora îl putem analiza din programul următor:</p>
<p>Program stivă;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>adrurm, adrinap:ref</p>
<p>end;</p>
<p>var  v:ref;</p>
<p>n:integer;</p>
<p>procedure adaug (var v:ref);</p>
<p>var c:ref;</p>
<p>n:integer;</p>
<p>begin</p>
<p>write (‘n=’); readln (n);</p>
<p>new (c);</p>
<p>c^.nr:=n;</p>
<p>c^.adrurm:=nil;</p>
<p>c^.adrinap:=v;</p>
<p>if v&lt; &gt;nil then v^.adrurm:=c;</p>
<p>v:=c</p>
<p>end;</p>
<p>procedure scot (var v:ref);</p>
<p>var c:ref;</p>
<p>begin</p>
<p>if v=nil</p>
<p>then</p>
<p>writeln (’Stiva este vida’)</p>
<p>else</p>
<p>begin</p>
<p>writeln (v^.nr);</p>
<p>c:=v;</p>
<p>v:=v^.adrinap;</p>
<p>dispose (c)</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>adaug (v);  adaug (v);</p>
<p>scot (v);  scot (v); scot (v)</p>
<p>end.</p>
<p>Spre deosebire de stimularea stivei prin intermediul vectorilor, aici avem avantajul că stiva nu este limitată la cele <em>n</em> componente alocate vectorului. Principalul dezavantaj al acestui mod de stimulaqre a stivei este faptul că pe lîngă informaţia utilă se reţin informaţii de adresă, fapt care duce la consum de memorie.</p>
<p>8.2.5 Coada</p>
<p>Structura de coadă a fost deja prezentată (nu şi exemplificată). Reamintim faptul că toate intrările se fac la un capăt şi toate ieşirile se fac la celălalt capăt. Coada nu se poate implementa dinamic cu mare uşurinţă. Astfel va fi implementată ca o listă <em>simplu înlănţuită </em>(sau, pentru a uşura anumite operaţii, chiar <em>dublu înlănţuită</em>). O variabilă de tip referinţă va reţine o adresă de început a cozii, iar alta de acelaşi tip va reţine adresa de sfîrşit. Exerciţiu: scrieţi un program care creează o coadă cu două, trei elemente, apoi le scoate. La sfîrşit se va da mesajul coadă vidă (asemănător cu programul care exemplifică stiva).</p>
<p>8.2.6 Structuri arborescente</p>
<p>8.2.6.1 Arbori binari</p>
<p>Vom defini arborii binari ca un set finit T de unul sau mai multe noduri, astfel încît:</p>
<ul>
<li>există un nod cu destinaţie specială numită tulpina (rădăcina) arborelui;</li>
<li>Celelalte noduri sunt repartizate în două seturi disjuncte şi fiecare din aceste seturi este la rîndul lui un arbore.</li>
</ul>
<p><em><span style="text-decoration: underline;">Observaţii:</span></em></p>
<ul>
<li>Cei doi arbori subordonaţi tulpinei poartă denumirea de <em>subarbore stîng</em> şi <em>subarbore drept</em>,</li>
<li>Definiţia este recursivă, acest lucru fiind de mare folos în continuare,</li>
<li>În cele ce urmează, pentru tulpină vom folosi  şi termenul de <em>vîrf</em>,</li>
<li>Dacă un nod nu subordonează arbori, îl vom numi <em>nod terminal</em>, în caz contrar îl vom numi <em>nod neterminal</em>.</li>
</ul>
<p>Ne propunem să construim un program care generează în memorie un arbore binar. Pentru aceasta, fiecare nod va fi o înregistrare care conţine trei cîmpuri: informaţia utilă, adresa subarborelui stîng şi adresa subarborelui drept. Modul recursiv de definire a arborilor binari ne conduce la ideea de a folosi o funcţie recursivă şi chiar de a utiliza metoda DIVIDE ET IMPERA conform acestei metode se procedează astfel:</p>
<p>Se citeşte informaţia utilă pentru un nod;</p>
<p>Se alocă spaţiu în memorie pentru aceasta;</p>
<p>Se completează informaţia utilă;</p>
<p>Se costruieşte subarborele stâng;</p>
<p>Se costruieşte subarborele drept;</p>
<p>Exact în acest mod se procedează funcţia <em>arb</em> de tip referinţă. Aici, este de remarcat modalitate de trecere la construcţia subarborilor stâg şi drept. Atunci cînd trebuie completate cîmpurile de adresă, acestea primesc ca valoare funcţiei, ceea ce duce autoapelarea ei. Semnalizarea faptului că nu avem subarbore stîng sau drept se face completînd 0 pentru informaţia utilă.</p>
<p>În principal se folosesc trei metode de parcurgere a arborilor.</p>
<ul>
<li>Stînga, vîrf, dreapta sau inordine, în care se parcurg mai întîi                                                               subarborele stîng, rădăcina şi apoi subarborele drept;</li>
<li> Vîrf, stînga, dreapta saunpreordine, în care se parcurg mai întîi rădăcina, subarborele stîng şi apoi subarborele drept;</li>
<li>Stînga, dreapta, vîrf sau postordine, în care se parcurg mai întîi subarborele stîng, subarborele drept şi apoi rădăcina.</li>
</ul>
<p>Fie arborele de mai jos:</p>
<p>Datele se introduc astfel:</p>
<p>1240050800360079001000.</p>
<p>Parcurgerea în <em>inordine</em> înseamnă:</p>
<p>4 2 5 8 1 6 3 9 7 10.</p>
<p>Parcurgerea în <em>preordine</em> înseamnă:</p>
<p>1 2 4 5 8 3 6 7 9 10.</p>
<p>Parcurgerea în <em>postordine</em> înseamnă:</p>
<p>8 5 2 6 9 10 7 3 1.</p>
<p>Parcurgerile arborului binar sunt realizate de procedurile: <em> svd</em> ( Stînga, vîrf, dreapta), <em>vsd</em> (Vîrf, stînga, dreapta), <em>sdv</em> (Stînga, dreapta, vîrf).în comentariul pe care îl facem acestor proceduri ne mărginim  să precizăm că sunt realizate utilizînd tehnica DIVIDE ET IMPERA.</p>
<p>Program arbori;</p>
<p>type  ref=^inr;</p>
<p>inr=record</p>
<p>st,dr:ref;</p>
<p>nr:integer</p>
<p>end;</p>
<p>var  c:ref;</p>
<p>function arb:ref;</p>
<p>var n:integer;</p>
<p>c:ref;</p>
<p>begin</p>
<p>write (‘n=); readln (n);</p>
<p>if n&lt; &gt;0</p>
<p>then</p>
<p>begin</p>
<p>new (c);</p>
<p>arb:=c;</p>
<p>arb^.nr:=n;</p>
<p>arb^.st:=arb;</p>
<p>arb^.dr:=arb</p>
<p>end</p>
<p>else arb:=nil</p>
<p>end;</p>
<p>procedure svd (c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>svd (c^.st);</p>
<p>writeln (c^.nr);</p>
<p>svd (c^.dr)</p>
<p>end</p>
<p>end;</p>
<p>procedure vsd (c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>writeln (c^.nr);</p>
<p>vsd (c^.st);</p>
<p>vsd (c^.dr)</p>
<p>end</p>
<p>end;</p>
<p>procedure sdv (c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>svd (c^.st);</p>
<p>svd (c^.dr);</p>
<p>writeln (c^.nr)</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>c:=arb;</p>
<p>writeln (‘Parcurg stinga virf dreapta’);</p>
<p>svd(c);</p>
<p>writeln (‘Parcurg virf stinga dreapta’);</p>
<p>vsd (c);</p>
<p>writeln (‘Parcurg  stinga dreapta virf’);</p>
<p>sdv (c)</p>
<p>end.</p>
<p>Aplicaţie. Forma poloneză</p>
<p><em>Se dă o expresie aritmetică. Să se construiască forma poloneză asociată acesteia.</em></p>
<p>Acest exerciţiu l-am rezolvat utilizînd diagramele de sintaxă. În acest capitol îl vom rezolva cu ajutorul arborilor binari. Tehnica de programare folosită va fi DEVIDE ET IMPERA.</p>
<p>Expresiile aritmetice pot fi reprezentate utilizînd arbori binari, respectînd următoarele reguli:</p>
<ul>
<li>Fiecare operaţie corespunde unui nod neterminal, avînd ca informaţie utilă operaţia respectivă;</li>
<li>Fiecare nod terminal este etichetat cu o variabilă sau cu o constantă;</li>
<li>Pentru fiecare nod neterminal subarborele din stînga şi cel din dreapta reprezintă, în această ordine, cei doi operanzi;</li>
<li>Rădăcina corespunde ultimei operaţii executate la evaluarea expresiei.</li>
</ul>
<p>Exemplu: Expresiei (a+b)*c-d/e i se asociază arborele binar din figura de mai jos. Parcurgerea acestui arbore în <em>postordine</em> va da chir forma poloneză: ab+c*de/-. Utilizînd cele spuse, pentru rezolvarea problemei, vom proceda în felul următor:</p>
<ul>
<li>Construim arborele binar asociat, expresiei aritmetice;</li>
<li>Îl parcurgem în <em>postordine</em> pentru a obţine forma poloneză.</li>
</ul>
<p>Parcurgerea arborelui a fost deja prezentată, problema principală rămînînd construirea acestuia.</p>
<p>Pentru  aceasta vom acorda priorităţi operatorilor şi operanzilor (mai puţin parantezelor), după cum urmează:</p>
<ul>
<li>Prioritatea iniţială a operatorilor &#8216;+&#8217;, &#8216;-&#8217; este  1;</li>
<li>Prioritatea iniţială a operatorilor &#8216;*&#8217;, &#8216;/&#8217; este 10;</li>
<li>La prioritatea unui operator se adună 10 pentru fiecare pereche de paranteze între care se găseşte;</li>
<li>Prioritatea unui operand este 1000.</li>
</ul>
<p>În program acest lucru se realizează astfel:</p>
<ul>
<li>Se citeşte expresia aritmetică în variabila e;</li>
<li>Se utilizează o variabilă <em>j</em> care indică ce număr se adaugă la prioritatea iniţială a unui operator (la întîlnirea unei paranteze deschise <em>j</em> creşte cu 10, iar la întîlnirea unei paranteze închise <em>j</em> scade cu 10);</li>
<li>Se parcurge expresia caracter cu caracter şi se pun în vectorul p priorităţile acestor operatori şi operanzi (mai puţin ale parantezelor);</li>
<li>În <em>efp</em> se construieşte  expresia fără paranteze (la expresia aritmetică iniţială lipsesc parantezele), iar în <em>pfp </em> se obţine vectorul priorităţilor, din care, spre deosebire de p, lipsesc componentele corespunzătoare parantezelor (acestea nu aveau nici o valoare).</li>
</ul>
<p>Utilizînd <em>efp</em> şi <em>pfp </em>,cu ajutorul funcţiei <em>arb</em>, se construieşte arborele ataşat expresiei aritmetice. Un nod al acestui arbore are ca informaţie utilă un operator sau un operand.</p>
<p>Conform tehnicii DIVIDE ET IMPERA, funcţia <em>arb </em> procedează în felul următor:</p>
<ul>
<li>de la limita superioară către limita inferioară (limite corespunzătoare subşirurilor de caractere tratate din efp) caută operatorul sau operandul cu prioritate minimă, reţinînd poziţia acestuia;</li>
<li>acesta constituie informaţia utilă din nod, care va fi completată;</li>
<li>în situaţia în care limita inferioară este diferită de limita superioară, pentru completarea adresei subarborelui din stînga şi a arborelui din dreapta se reapelează funcţia, iar în caz contrar aceste cîmpuri capătă valoarea NIL.</li>
</ul>
<p>Pentru listarea în postordine se utilizează procedura <em>parc </em>.</p>
<p>program fp;</p>
<p>type ref=^inr;</p>
<p>sir=array [1..30] of char;</p>
<p>vector=array [1..30] of integer;        inr=record</p>
<p>as, ad:ref;</p>
<p>op:char</p>
<p>end;</p>
<p>var e, efp:sir;</p>
<p>pfp, p:vector;</p>
<p>i, j, n:integer;</p>
<p>c:ref;</p>
<p>a:char;</p>
<p>function arb (1i,1s:integer; var efp:sir; var pfp:vector):ref;</p>
<p>var c:ref;</p>
<p>i, j, min: integer;</p>
<p>begin</p>
<p>min:=pfp [1s];</p>
<p>i:=1s;</p>
<p>for j:= 1s downto 1i do</p>
<p>if pfp [j]&lt;min<br />
then</p>
<p>begin</p>
<p>min:=pfp [j];</p>
<p>i:=j</p>
<p>end;</p>
<p>new ( c);</p>
<p>arb:=c;</p>
<p>arb^.op:=efp [i];</p>
<p>if 1i=1s</p>
<p>then</p>
<p>begin</p>
<p>arb^.as:=nil;</p>
<p>arb^.ad:=nil</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>arb^.as:=arb(1i, i-1, efp, pfp);</p>
<p>arb^.ad:=arb(i+1, 1s, efp, pfp)</p>
<p>end</p>
<p>end;</p>
<p>procedure parc (c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>parc ( c^.as);</p>
<p>parc (c^.ad);</p>
<p>write (c^.op)</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>j:=0;</p>
<p>read (a);</p>
<p>n:=1;</p>
<p>while a&lt; &gt;’.’ do</p>
<p>begin</p>
<p>e [n]:=a;</p>
<p>n;=n+1;</p>
<p>read (a )</p>
<p>end;</p>
<p>n:=n-1;</p>
<p>for I;=1 to n do</p>
<p>case e[i] of</p>
<p>‘)’:j:=j-10;</p>
<p>‘(‘:j:=j+10;</p>
<p>‘+’,’-‘:p[i]:=j+1;</p>
<p>‘*’,’/’:p[i]:=j+10</p>
<p>else p[i]:=1000</p>
<p>end;</p>
<p>j:=1;</p>
<p>for i:=1 to n do</p>
<p>if  (e[i] &lt; &gt;’)’) and ( e[i]&lt; &gt;’(‘)</p>
<p>then</p>
<p>begin</p>
<p>efp[j]:=e[i];</p>
<p>pfp[j]:=p[i];</p>
<p>j:=j+1</p>
<p>end;</p>
<p>c:=arb (1,j-1, efp,pfp);</p>
<p>parc ( c);</p>
<p>writeln</p>
<p>end.</p>
<p>Aplicaţie. Arbori de căutare</p>
<p><em> Se numeşte arbore de căutare un arbore binar ale cărui noduri au o cheie de identificare ( mulţimea cheilor asociate nodurilor este o mulţime bine ordonată – între oricare două elemente distincte ale acestei mulţimi a şi b avem sau a&gt;b sau a&lt;b=, iar pentru fiecare nod avem proprietăţile următoare:</em></p>
<ul>
<li><em>Orice cheie asociată unui nod al subarborelui stîng este mai mică decît cheia asociată nodului;</em></li>
<li><em>Orice cheie asociată unui nod al subarborelui drept este mai mare decît cheia asociată nodului.</em></li>
</ul>
<p><em>Orice nod al arborelui are asociate trei informaţii</em></p>
<ul>
<li><em>Cheia de identificare (NR);</em></li>
<li><em>Adresa subarborelui stîng (AS);</em></li>
<li><em>Adresa subarborelui drept (AD).</em></li>
</ul>
<p>Arborii de căutare au fost creaţi pentru regăsirea rapidă a informaţiei.</p>
<p>Aplicaţiile care creează şi actualizează un arbore de căutare, care reţine numerele naturale citite (acestea var fi şi chei asociate noduri).</p>
<p>Vor fi prezentate următoarele funcţii:</p>
<ul>
<li>Inserarea şi căutarea;</li>
<li>Listarea;</li>
<li>Ştergerea;</li>
</ul>
<p>Inserarea şi căutarea</p>
<p>Crearea arborilor de căutare se face aplicînd de un număr de ori operaţia de inserare. Regula de inserare este următoarea:</p>
<ul>
<li>se compară cheia asociată a unui nod cu numărul de inserat;avem trei posibilităţi:
<ul>
<li>cheia coincide cu numărul – se renunţă la inserarea acelui număr;</li>
<li>cheia este mai mare decît numărul – se încearcă inserarea în subarborele stîng;</li>
<li>cheia este mai mic decît numărul – se încearcă inserarea în subarborele drept.</li>
</ul>
</li>
</ul>
<p>Inserarea propriu-zisă se realizează atunci cînd subarborele stîng, respectiv drept, este vid, altfel se reia.</p>
<p>Mecanismul descris este tipic tehnicii DIVIDE ET IMPERA.</p>
<p>Pornim de la un arbore de căutare vid. Inserăm numărul 10.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="33" valign="top">10</td>
</tr>
</tbody>
</table>
<p>Inserăm 5. Acest număr se inserează în subarborele sting.</p>
<p>Inserăm 7. Acesta este mai mic decît 10. Se trece la subarborele stîng. Se compară cu 5, faţă de care este mai mare. Se inserează în subarborele drept.</p>
<p>Se inserează 15; cum acesta este mai mare decît 10 vom avea:</p>
<p>Iată cum arată arborele după inserarea numerelor 3, 9, 12, 30.</p>
<p>Operaţia de căutare este asemănătoare cu cea de inserare. Cheia căutată se compară cu cheia asociată vîrfului. În caz de egalitate imformaţia a fost găsită. Dacă este mai mică decît cheia asociată nodului, se caută în subarborele stîng iar dacă este mai mare se caută în subarborele drept. Dacă în procesul de căutare s-a ajuns să se caute cheia într-un subarbore vid, înseamnă că nodul cu cheia respectivă lipseşte.</p>
<p>Programul care urmează conţine o procedură de inserare (C_I). Când cheia pentru care se încearcă inserarea lipseşte se execută inserarea, altfel se dă un mesaj corespunzător.</p>
<p>Transmiterea parametrului <em>c</em> se face prin referinţă. Adresa de alocare (obţinută prin NEW) va fi trecută automat părintelui, ca adresă de subarbore stîng sau drept (după caz).</p>
<p>Odată creat, un arbore de căutare permite regăsirea mai rapidă a informaţiei decât în cazul în care ar fi memorate secvenţial. Odată analizată informaţia ataşată prin nod, în caz de inegalitate se trece la subarborele stâng (sau drept) caz în care informaţiile cu cheile din subarborele drept (sau stâng) nu se mai ia în calcul. Numărul de comparaţii este mai mic sau egal cu numărul de niveluri ale arborelui de căutare. De exemplu, pentru regăsirea unei imformaţii, în cadrul arborelui din figură se fac cel mult 4 comparaţii. Dacă pentru memorizare se utilizează o listă simplu înlănţuită, în cazul cel mai defavorabil trebuie de efectuate 8 comparaţii.</p>
<p>Există totuţi o problemă care poate duce la scăderea eficienţei de căutare. În cazul în care cheile sunt introduse în ordine strict crescătoare sau în ordine descrescătoare, arborele degenerează într-o listă liniară (fiecare nod are un singur subarbore nevid). Putem aprecia că introducerea numerelor în această ordine este improbabilă.</p>
<p>Listarea informaţiei</p>
<p>Informaţia se poate lista utilizând oricare din metodele cunoscute pentru parcurgerea arborilor. Dacă dorim listarea imformaţiilor în ordinea strict crescătoare a cheilor, se utilizează metoda stânga-vârf-dreapta (inordine), întucât pentru orice nod avem următoarele:</p>
<ul>
<li>cheile nodurilor din subarborele stâng sunt mai mici decât cheia asociată nodului;</li>
<li>cheile nodurilor din subarborele drept sunt mai mari decât cheia asociată nodului.</li>
</ul>
<p>Vom lista arborele stâng,informaţia din nod şi informaţiile din subarborele drept (SVD).</p>
<p>Ştergerea</p>
<p>După ştergerea unui nod care are o anumită cheie, arborele rămas trebuie să fie de căutare. Nodul care urmează a fi şters se caută după metoda de acum binecunoscută. Se disting 4 situaşii posibil:</p>
<p>a)     nodul care urmează a fi şters este nod terminal – în acest caz se face ştergerea  având grijă ca la părintele lui să înlocuim adresa către el cu NIL;</p>
<p>b)    nodul care urmează a fi şters subordonează un singur subarbore – cel drept – caz în care părintelui i se va înlocui adresa către el cu adresa subarborelui drept, iar nodul respectiv se va şterge;</p>
<p>c)     nodul care urmează a fi şters subordonează un singur subarbore – cel stâng – caz în care părintelui i se va înlocui adresa către el cu adresa subarborelui stâng, iar nodul respectiv se va şterge;</p>
<p>d)    nodul care urmează a fi şters (după cum vom vedea, acesta se va şterge numai logic) subordonează doi subarbori, caz în care se fac operaţiile:</p>
<ul>
<li>se identifică cel mai din dreapta nod al subarborelui stâng corespunzător nodului care urmează a fi şters (acesta va fi şters ăn mod efectiv, ni înainte de a muta informaţiile sale la nodul care se şterge logic);</li>
<li>cheia acestuia şi alte informaţii utile conţinute de el (altele decât cele de adresă) se mută lanodul care urmează a fi şters;</li>
<li>subarborele stâng care se va şterge fizic se leagă:
<ul>
<li>în stânga nodului care se va şterge logic (dacă nodul identificat ca cel mai din dreapta din subarborele stâng este descendentdirect al nodului care se va şterge logic)</li>
<li>în dreapta tatălui nodului care se va şterge fizic (în caz contrar);</li>
</ul>
</li>
</ul>
<p>se şterge fizic nodul care a fost identificat şi ale cărui informaţii au fost mutate (cu cheia cea mai mare din suarborele stâng).</p>
<p><em>Exemlu</em>: pentru cazul d):</p>
<p>Fie arborele din figura de mai jos la care se şterge nodul 6:</p>
<ul>
<li>se identifică nodul cel mai din dreapta pentru subarborele stâng (5);</li>
<li>el nu este descendent direct al nodului care se şterge (6);</li>
<li>informaţia sa se trece nodului şi se obţine:</li>
</ul>
<ul>
<li>subarborele stâng al nodului care se şterge fizic este dat de nodul 4;</li>
<li>acesta se leagă în dreapta tatălui nodului care se şterge fizic (3);</li>
<li>se execută ştergerea fizică şi se obţine:</li>
</ul>
<p>Ştergerea unui nod este realizată de procedura ŞTERG. Pentru situaţia în care un nod care urmează a fi şters subordonează doi arbori, se apelează procedura CMMD.</p>
<p>Mecanismul de transmitere al parametrilor prin referinţă face ca această procedură să fie exterm de scurtă. Astfel, căutarea nodului cel mai din dreapta pentru subarborele stâng (adresa F) se face recursiv, ce procedura a fost apelată pentru primul nod al subarborelui stâng. În situaţia în care acesta este subordonat direct nodului care se şterge, procedura nu se autoapelează, iar după transferul informaţiilor adresa subarborelui stâng (F^.AS) trece ca adresă în stînga nodului care se şterge logic. În caz contrar, datorită faptului că procedura s-a autoapelat, F^.AS trece ca adresa în dreapta pentru părintele nodului care se şterge fizic.</p>
<p>Întrebarea la care trebuie să răspundem în continuare este următoarea: de ce, dacă se şterge în acest mod un nod, arborele rămîne în căutare? Ştergerea unui nod se face în mod distinct pentru fiecare din cele 4 cazuri arătate. Datorită simplităţii prelucrării, primele 3 cazuri nu necesită comentarii. În cazul 4 se identifică nodul cel mai din dreapta din arborele stâng (care este cu cheia cea mai mare din aceste subarbore). Cheia acestuia trece în locul cheii nodului care se şterge. Aceasta este mai mică decât cheia iniţială (pentru că se găseşte în subarborele stâng), este în acelaşi timp cea mai mare cheie din subarborele stâng care este cea mai mică decât cheia care se şterge. Iată motivul pentru care aceasta trece în locul cheii şterge logic.</p>
<p>program c;</p>
<p>type ref=^inr;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>as, ad:ref</p>
<p>end;</p>
<p>var  v, man:ref;</p>
<p>k:integer;</p>
<p>opt:char;</p>
<p>procedure c_i (var  c:ref;  k:integer;);</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>if c^.nr=k</p>
<p>then</p>
<p>writeln (‘nr deja inserat’)</p>
<p>else</p>
<p>if  c^.nr&lt;k</p>
<p>then</p>
<p>c_i(c^.ad,k)</p>
<p>else</p>
<p>c_i(c^.as,k)</p>
<p>else</p>
<p>begin</p>
<p>new (c);</p>
<p>c^.as:=nil;</p>
<p>c^.ad:=nil;</p>
<p>c^.nr:=k</p>
<p>end;</p>
<p>end.</p>
<p>procedure svd (c:ref);</p>
<p>begin</p>
<p>if c&lt; &gt;nil then</p>
<p>begin</p>
<p>svd (c^.as);</p>
<p>writeln (c^.nr);</p>
<p>svd( c^.ad)</p>
<p>end;</p>
<p>end;</p>
<p>procedure cmmd (var  c,f:ref);</p>
<p>begin</p>
<p>if f^.ad&lt; &gt;nil</p>
<p>then</p>
<p>cmmd (c,f^.ad)</p>
<p>else</p>
<p>begin</p>
<p>c^.nr:=f^.nr;</p>
<p>man:=f;</p>
<p>f:=f^.as;</p>
<p>dispose (man);</p>
<p>end;</p>
<p>end;</p>
<p>procedure sterg;</p>
<p>var f:ref;</p>
<p>begin</p>
<p>if c&lt; &gt;nil</p>
<p>then</p>
<p>if c^.nr=k</p>
<p>then</p>
<p>begin</p>
<p>if (c^.as=nil) and (c^.ad=nil)</p>
<p>then</p>
<p>begin</p>
<p>dispose (c);</p>
<p>c:=nil</p>
<p>end</p>
<p>else</p>
<p>if c^.as=nil</p>
<p>then</p>
<p>begin</p>
<p>f:=c^.ad;</p>
<p>dispose (c);</p>
<p>c:=f;</p>
<p>end</p>
<p>else</p>
<p>if c^.ad=nil</p>
<p>then</p>
<p>begin</p>
<p>f:=c^.as;</p>
<p>dispose (c);</p>
<p>c:=f;</p>
<p>end</p>
<p>else</p>
<p>cmmd  (c, c^.as)</p>
<p>end</p>
<p>else</p>
<p>if c^.nr&lt;k</p>
<p>then</p>
<p>sterg (c^.ad, k)</p>
<p>else</p>
<p>sterg (c^.as, k)</p>
<p>else</p>
<p>writeln (‘numar absent – tentativa esuata ‘)</p>
<p>end;</p>
<p>begin</p>
<p>v:=nil;</p>
<p>repeat</p>
<p>write (‘optiunea’);</p>
<p>readln (opt);</p>
<p>case opt of</p>
<p>’i’:    begin</p>
<p>write (‘k=’); readln (k);</p>
<p>c_i (v, k)</p>
<p>’l’:   svd (v);</p>
<p>’s’:   begin</p>
<p>write (‘se va sterge numarul  ‘);  readln (k);</p>
<p>sterg  (v, k)</p>
<p>end;</p>
<p>end  {case}</p>
<p>until   opt=’t’</p>
<p>end.</p>
<p>Teoria regăsirii informaţiei este deosebit de importantă pentru viaţa practică. Reţinem faptul că se pot crea arbori de căutare (echilibraţi) în care toate nodurile terminale se găsesc numai pe două niveluri consecutive. Aceasta conduce la o căutare rapidă (puţine operaţii).</p>
<p>8.2.7   Arbori oarecare</p>
<p><em>Vom defini arbori oarecare după D.E.   KNUTH. Se numeşte arbore oarecare un set finit T de unul sau mai multe noduri astfel încât:</em></p>
<ul>
<li><em>există un nod cu destinaţie specială numit tulpina arborelui;</em></li>
<li><em>celelalte noduri sunt repartizate în m≥0 seturi disjunctive T</em><em>1,</em><em>T</em><em>2,</em><em> &#8230;,</em><em> </em><em>T</em><em>m</em><em> unde fiecare din aceste seturi la rândul său este un arbore.</em></li>
</ul>
<p>Am folosit această definiţie recursivă întrucît ne este de mare folos în scrierea programului care creează un arbore oarecare.</p>
<p>În programul care urmează construim un arbore oarecare în care fiecărui nod i se subordonează cel mult trei subarbori.</p>
<p>Pentru un nod se completează informaţia utilă (un număr întreg) precum şi un vector de adrese ale subarborilor subordonaţi nodului respectiv. Am utilizat tehnica DIVIDE ET IMPERA atât la creare cât şi la parcurgere.</p>
<p>Fie arborele oarecare din figura de mai jos:</p>
<p>Pentru a crea acest arbore vom introduce informaţiile în ordinea următoare:</p>
<p>1 2 3 0 0 0 4 0 0 0 5 0 0 0 6 0 0 0.</p>
<p>Vom prezenta două dintre cele mai uzuale metode de parcurgere a arborilor oarecare:</p>
<p>1) <em>Parcurgerea în adâncime</em> (realizată de procedura <em>padinc</em>), în care se utilizează întâi tulpina, apoi subarborii de la stânga la dreapta (pentru arboreledin figura de mai sus avem: 1 2 3 4 5 6);</p>
<p>program arbg;</p>
<p>type ref=^inr;</p>
<p>vectad=array [1..3] of ref;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>a:vectad</p>
<p>end;</p>
<p>var  c:ref;</p>
<p>function arb:ref;</p>
<p>var  c:ref;</p>
<p>n, i:integer;</p>
<p>begin</p>
<p>write (‘n=’); readln (n);</p>
<p>if n&lt; &gt;0</p>
<p>then</p>
<p>begin</p>
<p>new (c);</p>
<p>arb:=c;</p>
<p>arb^.nr:=n;</p>
<p>for i:=1 to 3 do arb ^.a[i]:=arb</p>
<p>end</p>
<p>else arb:=nil</p>
<p>end;</p>
<p>procedure padinc (c:ref);</p>
<p>var i:integer;</p>
<p>begin</p>
<p>if c&lt; &gt;nil then</p>
<p>begin</p>
<p>writeln (c^.nr);</p>
<p>for i:=1 to 3 do padinc (c^.a[i])</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>c:=arb;</p>
<p>padinc (c)</p>
<p>end.</p>
<p>2)    <em>Parcurgerea în lăţime.</em></p>
<p>În acest caz, fiecare element al listei liniare care constituie coada va fi o înregistrare care cuprinde în general două câmpuri: adresa înapoi şi informaţia utilă. Dacă variabilele de tip referinţă <em>b</em> şi <em>v </em>vor reţine adresa utimului element introdus în coadă şi adresa elementului care poate fi scos din coadă.</p>
<p>Lucrul cu coada se poate face utilizînd trei proceduri:</p>
<p>1)    crearea cozii;</p>
<p>2)    adăugarea la coadă;</p>
<p>3)    scoaterea (prelucrarea) din coadă.</p>
<p>1)                Crearea cozii</p>
<p>Această operaţie este realizată de procedura <em>ccoada. </em>Crearea cozii constă în:</p>
<ul>
<li>alocarea spaţiului pentru o înregistrare;</li>
<li>completarea informaţiei utile;</li>
<li>completarea informaţiei îapoi prin NIL.</li>
</ul>
<p>2)                Adăugarea la coadă</p>
<p>Operaţia de adăugare la coadă este realizată de procedura <em>adcoada</em>. Parametrii ei sunt: t (informaţia utilă) şi b (adresa ultimului element introdus în coadă). Pentru aceasta se realizează următoarele operaţii:</p>
<ul>
<li>alocarea spaţiului pentru noua înregistrare;</li>
<li>completarea informaţiei utile;</li>
<li>completarea câmpului de adresă înapoi a înregistrării de la b cu adresa noii înregistrări;</li>
<li>b va lua valoarea adresei noii înregistrări.</li>
</ul>
<p>3)                Scoaterea din coadă</p>
<p>Această operaţie este realizată de procedura <em>scoada</em>. În acest sens se realizează operaţiile:</p>
<ul>
<li>se reţine adresa elementului care urmează a fi scos din coadă;</li>
<li>se şterge înregistrarea acestui element;</li>
<li><em>v</em> va lua valoarea adresei înregistrării plasate înaintea celei şterse.</li>
</ul>
<p>O aplicaţie foarte importantă a structurii de coadă este parcurgerea în lăţime a arborilor oarecare.</p>
<p>Pentru arborele din figura de mai sus, ordinea de parcurgere a vârfurilor este următoarea:</p>
<p>1 2 5 6 3 4.</p>
<p>În exemplul care urmează, această parcurgere este realizată de procedura <em>tipari</em>. Ideea de lucru este următoarea:</p>
<ul>
<li>se porneşte cu o coadă care conţine numai rădăcinile arborelui;</li>
<li>pentru fiecare element din vârful cozii procedăm astfel:</li>
<li>îl listăm;</li>
<li>îi încărcăm toţi succesorii în coadă;</li>
<li>algoritmul se încheie când coada este vidă.</li>
</ul>
<p>Recomandăm cititorului analizarea cu  atenţie a acestei proceduri.</p>
<p>program arbg;</p>
<p>type ref=^inr;</p>
<p>vectad=array [1..3]of ref;</p>
<p>inr=record</p>
<p>nr:integer;</p>
<p>a:vectad</p>
<p>end;</p>
<p>refl=^inr1;</p>
<p>inr1=record</p>
<p>inreg:inr;</p>
<p>inapoi:ref1</p>
<p>end;</p>
<p>var  c:ref;</p>
<p>b, v:ref1;</p>
<p>function  arb:ref;</p>
<p>var  c:ref;</p>
<p>n,i:integer;</p>
<p>begin</p>
<p>write (‘n=’);</p>
<p>readln (n);</p>
<p>if n&lt; &gt;0</p>
<p>then</p>
<p>begin</p>
<p>new (c);</p>
<p>arb:=c;</p>
<p>arb^.nr:=n;</p>
<p>for i:=1  to  3  do  arb^.a[i]:=arb</p>
<p>end</p>
<p>else  arb:=nil</p>
<p>end;</p>
<p>procedure ccoada;</p>
<p>var  d:ref1;</p>
<p>i:integer;</p>
<p>begin</p>
<p>new (d);</p>
<p>d^.inreg:=c^;</p>
<p>d^.inapoi:=nil;</p>
<p>b:=d;</p>
<p>v:=d</p>
<p>end;</p>
<p>procedure adcoada (t:inr;  var  b:ref1);</p>
<p>var  d:ref1;</p>
<p>begin</p>
<p>new (d);</p>
<p>d^.inapoi:=nil;</p>
<p>d^.inreg:=t;</p>
<p>b^.inapoi:=d;</p>
<p>b:=d</p>
<p>end;</p>
<p>procedure scoada  (var  v:ref1);</p>
<p>var  d:ref1;</p>
<p>begin</p>
<p>d:=v;</p>
<p>dispose (v);</p>
<p>v:=d^.inapoi</p>
<p>end;</p>
<p>procedure  tipari (var  b, v:ref1);</p>
<p>var  d:ref;</p>
<p>t:inr;</p>
<p>i:integer;</p>
<p>begin</p>
<p>while  v&lt; &gt;nil do</p>
<p>begin</p>
<p>writeln (v^.inreg.nr);</p>
<p>for  i:=1  to  3  do  begin</p>
<p>d:=v^.inreg.a[i];</p>
<p>if d&lt; &gt;nil</p>
<p>then</p>
<p>begin</p>
<p>t:=d^;</p>
<p>adcoada (t,b)</p>
<p>end</p>
<p>end;</p>
<p>scoada (v)</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>c:=arb;</p>
<p>ccoada;</p>
<p>tipari  (b, v)</p>
<p>end.</p>
<p>Aplicaţie. Partiţia determinată de o relaţie de echivalenţă.</p>
<p>Un arbore oarecare poate fi memorat utilizînd o legătură de tip <em>tată</em>. Pentru aceasta este necesar un singur vector <em>v</em>, în care, pentru fiecare nod <em>i, v(i)</em> are semnificaţia de <em>tatăl lui i</em>. Avem v(i)=0 dacănodul lui <em>i</em> este vârf.</p>
<p><em><span style="text-decoration: underline;">Observaţii:</span></em></p>
<p>- această formă de memorare este extrem de economică din punct de vedere al memoriei folosite (un nod poate avea mai multe noduri subordonate, dar numai un nod <em>tată</em>, deci avem o singură informaţie de adresă).</p>
<p>-parcurgerea arborilor reprezintanţi astfel de greoaie, fiind consumat mult timp.</p>
<p>Din matematică este cunoscută relaţia de echivalenţă. Aici o vom reaminti. O relaţie de echivalenţă &#8216;≈&#8217; este o relaţie între elementele unei mulţimi, care satisface următoarele trei proprietăţi:</p>
<p>1)    x≈x (reflexivitate);</p>
<p>2)    dacă x≈y avem şi y≈x (simetrie);</p>
<p>3)    dacă x≈y şi y≈z, atunci x≈z (tranzitivitate).</p>
<p>Pentru că formează o submulţime aparte a mulţimii considerate, toate elementele sunt echivalente între ele. Cum fiecare element este cel puţin echivalent cu el însuşi, înseamnă că o relaţie de echivalenţă determină pe mulţimea considerată o partiţie.</p>
<p><em>Se consideră mulţimea primilor n numere naturale {1, 2, …, n}. Se dau un număr neprecizat de perechi echivalente de forma x≈y şi se cere  partiţia determinată de această relaţie de echivalenţă.</em></p>
<p><em>Exemplu</em>:</p>
<p>Fie n=4 şi perechile 1≈3, 1≈4, 3≈4.</p>
<p>În acest caz relaţia 3≈4 ar putea fi dedusă dinprimele două relaţii:anume din 1≈4 rezultă 4≈1 (simetrie), iar din 4≈1 şi 1≈3 rezultă 4≈3 (tranzitivitate), deci 3≈4 (simetrie). Partiţia determinată de această relaţie de echivalenţă este {1,3,4}, {2}.</p>
<p>Pentru rezolvare, considerăm o pădure cu arbori oarecare, cu nodurile elemente ale mulţimii considerate, reprezintaţi într-un vector cu <em>n</em>, componente, utilizând legătura de tip &#8216;tată&#8217;.</p>
<p>Iniţial, fiecare element constituie un arbore aparte, deci componentele vectorului <em>v</em> au valoarea 0.</p>
<p>Aplicăm soluţia următoare: toate elementele echivalente între ele (care vor alcătui o submulţime aparte a partiţiei) formează un arbore oarecare. Deci la citirea unei perechi j≈k se pune v(j) =k (adică tatăl lui <em>j</em> este <em>k</em>). Există posibilitatea ca j să fie subordonat unui alt părinte (v(j)≠0). În această situaţie j va lua valoarea lui v(j); raţionamentul continuă pînă când v(j) va fi 0 (se ajunge la tulpina arborelui construit pentru această submulţime). În acest moment v(j) va lua valoarea lui k, ceea ce înseamnă că întreg arborele se subordonează lui k. preluăm un exemplu al lui D.E. KNUTH.</p>
<p>Fie n=9 şi perechile citite: 1≈5, 6≈8, 7≈2, 9≈8, 3≈7, 4≈2, 9≈3.</p>
<p>Iniţial vectorul <em>v</em> va arăta astfel:</p>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v            0  0  0  0  0  0   0  0  0</p>
<p>arbori      1  2  3  4  5  6  7  8  9</p>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v             5  0  0  0  0  0  0  0  0            am citit 1=5</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>111</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>arbori      2   3   4   5   6  7  8  9</p>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v             5  0  0  0  0  8  0  0  0             am citit 6=8</p>
<p>arbori       2   3    4  5    7   8   9</p>
<p>1        6</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>6</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v             5  0  0  0  0  8  2  0  0            am citit 9=8</p>
<p>arbori        2  3  4      5  7    8</p>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v              5  0  7  2  0  8  2  0  8         am citit 3=7</p>
<p>arbori             2   4  5       8</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>3</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>1</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>7</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<p>v             5  0  7  2   0  8  2  0  8       am citit 4=2</p>
<p>arbori            2         5      8</p>
<table cellspacing="0" cellpadding="0" align="left">
<tbody>
<tr>
<td width="131" height="3"></td>
<td width="30"></td>
<td width="18"></td>
<td width="26"></td>
<td width="10"></td>
<td width="30"></td>
<td width="18"></td>
<td width="30"></td>
</tr>
<tr>
<td height="30"></td>
<td rowspan="2" align="left" valign="top"></td>
<td></td>
<td width="26" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>4</td>
</tr>
</tbody>
</table>
</td>
<td></td>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>6</td>
</tr>
</tbody>
</table>
</td>
<td></td>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>9</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td height="47"></td>
</tr>
</tbody>
</table>
<p>indici      1  2  3  4  5  6  7  8  9</p>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>5</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="30" height="30" bgcolor="white">
<table cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>2</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
<p>v              5  0  7  2  0  8  2  3  8        am citit 8=3arbori</p>
<p>Se obţine partiţia {2,7,4,3,8,6,9} şi {5,1}.</p>
<p><em><span style="text-decoration: underline;">Observaţie:</span></em></p>
<p>- Algoritmul nu înregistrează relaţii de forma j≈j sau, dacă a înregistrat j≈k, nu înregistrează k≈j. Pentru listare utilizăm procedura tipar. Precizăm faptul că, în acest algoritm nu sunt permise ca intrări informaţii redundante.</p>
<p>Exemplu:(1,2),  (2,3),  (3,1).  Modificarea algoritmuui în acest sens este propusă ca exerciţiu.</p>
<p>program rechiv;</p>
<p>type  vector=array [1..100]  of integer;</p>
<p>var  v:vector;</p>
<p>n, j, k:integer;</p>
<p>procedure adaug (var j, k:integer; var  v:vector);</p>
<p>begin</p>
<p>while v[j]&lt; &gt;0  do  j:=v[j];</p>
<p>if  (j&lt; &gt;k)  and  (v[k]&lt; &gt;j)  then  v[j]:=k</p>
<p>end;</p>
<p>procedure tipar  (j:integer);</p>
<p>var  i:integer;</p>
<p>begin</p>
<p>for  i:=1  to n do  if  v[i]=j</p>
<p>then</p>
<p>begin</p>
<p>if j=0  then writeln (‘&#8212;&#8212;-clasa&#8212;&#8212;-‘);</p>
<p>writeln (i);</p>
<p>tipar (i);</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>write (‘n=’); readln (n);</p>
<p>for j:=1  to  n  do  v[j]:=0;</p>
<p>while  j&lt; &gt;0 do</p>
<p>begin</p>
<p>write (‘j k’);</p>
<p>readln   (j, k);</p>
<p>if  j&lt; &gt;0  then adaug (j, k, v)</p>
<p>end;</p>
<p>tipar (0)</p>
<p>end.</p>
<p><strong>Probleme propuse</strong><strong> </strong></p>
<p>1)    Se citesc <em>n</em> numere naturale, distincte. Să se sorteze crescător, utilizînd lista liniară simplu înlănţuită, după următorul algoritm</p>
<ul>
<li>iniţial lista va conţine numai primul număr;</li>
<li>dacă al doilea este mai mare decît primul, se va pune în coada listei, altfel va fi primul element din listă;</li>
<li>orice număr se aşează în listă înaintea celui mai mic număr care este mai mare decît el (dacă există un astfel de număr), sau la sfîrşitul listei, în caz contrar.</li>
</ul>
<p>În final, se listează conţinutul listei liniare simplu înlănţuită. (sortare prin inserţie).</p>
<p>2)    Să se rezolve una din problemele propuse la capitolul 1 utilizînd stiva implementată dinamic.</p>
<p>3)    Să se creeze un obiect numit LLSI – lista liniară simplu înlănţuită – care conţine numere naturale. Acesta va cuprinde metode pentru adăugarea la sfîrşitul listei, ştergerea unui element ş.a.m.d. (în general toate operaţiile care se fac cu liste liniar simplu înlănţuite).</p>
<p>4)    Utilizînd obiectul creat la problema anterioară să se construiască un descendent al acestuia, numit NUMĂR_MARE, în care fiecare element al listei reţine o cifră între 0 şi 9 (în ansamblu o astfel de listă va reţine un număr cu mai multe cifre). Obiectul va fi înzestrat cu metode pentru citarea şi tipărirea numărului.</p>
<p>5)    Să se scrie o procedură care poate aduna două ’’numere mari’’.</p>
<p>6)    Să se scrie o procedură care înmulţeşte două ’’numere mari’.</p>
<p>7)    Pentru realizarea unui curs în care se explică conţinutul a <em>n</em> noţiuni, se citesc <em>p</em> perechi de cuvinte de forma (ni, nj). Fiecare cpereche citită are semnificaţia următoare: noţiunea <em>i</em> foloseşte în definirea noţiunii <em>j</em>. Se cere să se precizeze ordinea de prezentare a noţiunilor în curs.</p>
<p>8)    În jurul arbitrului sunt aşezaţi în cerc N jucători, numerotaţi în sens orar. Arbitrul, începînd de la jucătorul K, numără pînă la M. persoana la care sa oprit numărătoarea este eliminată din cerc. Arbitrul se poziţionează pe următoarea persoană şi repetă procedeul pînă cînd în cerc rămîne un singur jucător (L).</p>
<p>Să se scrie un program care:</p>
<ul>
<li>Citind M, N şi K, să-l determuine pe L;</li>
<li>Citind M, N şi L, să-l determuine pe K.</li>
</ul>
<p>9)    Să se sorteze n numere naturale cu ajutorul arborilor de căutare.</p>
<p>10)               Evidenţa produselor aflate în stocul unui magazin se ţine pe baza unui arbore de căutare. Pentru fiecare produs se reţine:</p>
<ul>
<li>denumirea;</li>
<li>preţul;</li>
<li>cantitatea existentă (buc.).</li>
</ul>
<p>În fiecare seară arborele estev actualizat prin comenzi de forma:</p>
<p>i – se introduc produsele primite de la depozit (Atenţie! Un astfel de produs poate să mai existe în stoc);</p>
<p>s – se şterg produsele vândute în ziua respectivă;</p>
<p>De asemenea, programul acceptă şi comenzile:</p>
<p>v – se tipăreşte valoarea tuturor produselor aflate în stoc;</p>
<p>l – se tipăreşte o listă completă a produselor aflate în stoc, în ordine alfabetică. Pentru fiecare produs se va tipări şi numărul de bucăţi.</p>
<p>11)           <em>Problema jocurilor între doi parteneri</em>, în care unul din jucători este calculatorul. Pentru a putea juca, calculatorul îşi construieşte un arbore corespunzător situaţiilor care pot apărea.</p>
<p>Pentru a exemplifica vom considera un joc simplu, numit ’GRUNDY’. Se consideră o stivă de n monede. Unul din cei doi parteneri o împarte în două părţi inegale. Celălalt partener împarte una din cele două stive de monede rămase în două părţi inegale ş.a.m.d.. Pierde acel jucător care nu mai poate face o astfel de împărţire.</p>
<p>Vom considera cazul n=5. În această situaţie calculatorul îşi construieşte arborele din figura de mai jos:</p>
<p>O primă problemă care se pune este dacă într-o anumită situaţie, presupunînd că trebuie să mute calculatorul, acesta dispune sau nu de strategie sigură de cîştig. Această problemă se poate rezolva utilizînd algoritmul MINI-MAX. Aplicarea acestui algoritm presupune următoarele:</p>
<ul>
<li>analiza nodurilor terminale ale arborelui, unde pot apărea două situaţii:</li>
<li>trebuie să mute calculatorul, caz în care nodul se etichetează cu 0;
<ul>
<li>trebuie să mute partenerul uman, caz în care nodul se etichetează cu 1;</li>
</ul>
</li>
<li>analiza nodurilor neterminale ale arborelui, unde apar din nou două situaţii:
<ul>
<li>mută calculatorul, situaţie în care nodul se etichetează cu maximul dintre etichetele nodurilor subordonate acestuia;</li>
<li>mută partenerul uman, situaţie în care nodul se etichetează cu minimul dintre etichetele nodurilor subordonate acestuia.</li>
</ul>
</li>
</ul>
<p>Acest mod de etichetare îşi găseşte explicaţia în faptul că, la mutarea efectuată de calculator, acesta va alege o mutare convenabilă (se va duce într-un nod etichetat cu 1), iar la mutarea efectuată de partenerul uman se presupune că acesta va alege o mutare  convenabilă lui (va face o mutare care îl va duce într-un nod etichetat 0).</p>
<p>Scrieţi un program cu ajutorul căruia calculatorul va juca Grundy cu dumneavoastră.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=183</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Probleme rezolvate in Pascal</title>
		<link>http://resurse-educationale.uv.ro/?p=181</link>
		<comments>http://resurse-educationale.uv.ro/?p=181#comments</comments>
		<pubDate>Thu, 04 Aug 2011 14:15:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Pascal]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[algoritmi]]></category>
		<category><![CDATA[Biblioteci]]></category>
		<category><![CDATA[cozi]]></category>
		<category><![CDATA[informatică]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[program]]></category>
		<category><![CDATA[programe rezolvate]]></category>
		<category><![CDATA[sisteme de numereaţie]]></category>
		<category><![CDATA[teza]]></category>
		<category><![CDATA[tipuri de date]]></category>
		<category><![CDATA[units]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=181</guid>
		<description><![CDATA[Probelma 1. Creaţi un program care afişează următoarea funcţie. Program P2.1; uses crt; var i,n,s : integer; f : boolean; begin clrscr; repeat write(&#8216;Introduceţi un număr natural n=&#8217;); readln(n); until n&#62;2; if n mod 2=0 then f:=false else f:=true; write(&#8216;s=&#8217;); &#8230; <a href="http://resurse-educationale.uv.ro/?p=181">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong> </strong></p>
<p><strong>Probelma 1</strong>. Creaţi un program care afişează următoarea funcţie.</p>
<p><strong> </strong></p>
<p>Program P2.1;</p>
<p>uses crt;</p>
<p>var i,n,s : integer;</p>
<p>f : boolean;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi un număr natural n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;2;</p>
<p>if n mod 2=0 then f:=false else f:=true;</p>
<p>write(&#8216;s=&#8217;);</p>
<p>for i:=1 to n-2 do</p>
<p>if(not f) and (i mod 2 =0)then write(&#8216;*&#8217;,i)</p>
<p>else</p>
<p>if f and (i mod 2&lt;&gt;0)then write(&#8216;*&#8217;,i);</p>
<p>writeln(&#8216;*&#8217;,n);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Se dă un număr natural n. Verificaţi daca acest număr este prim sau nu.</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>Program P2.2;</p>
<p>uses crt;</p>
<p>var i,n,f : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi un număr natural n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;2;</p>
<p>f:=0;</p>
<p>for i:=2 to n div 2 do</p>
<p>if n mod i=0 then f:=1;</p>
<p>if f=0 then</p>
<p>writeln(&#8216;Numărul&#8217;,n:6,&#8217; este prim&#8217;)</p>
<p>else</p>
<p>writeln(&#8216;Numărul&#8217;,n:6,&#8217; nu este prim&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Este dat intervalul numerelor naturale de la n pina la m. Determinati toate numerele naturale din acest interval.</strong><strong> </strong></p>
<p><strong> </strong></p>
<p>Program P2.3;</p>
<p>uses crt;</p>
<p>var i,n,f,j,r,m : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi limita de jos a intervalului n=&#8217;);</p>
<p>read(n);</p>
<p>write(&#8216;Introduceţi limita de sus a intervalului m=&#8217;);</p>
<p>readln(m);</p>
<p>until (n&gt;0) and(m&gt;0) and(n&lt;m);</p>
<p>writeln(&#8216;Introduceţi intervalul de la&#8217;,n:6,&#8217;pina la&#8217;,m:6&#8242;);</p>
<p>r:=0;</p>
<p>for j:=n to m do</p>
<p>begin</p>
<p>f:=0;</p>
<p>for i:=2 to j div 2 do</p>
<p>if j mod i=0 then f:=1;</p>
<p>if f=0 then</p>
<p>begin r:=1;</p>
<p>writeln(&#8216;Numărul&#8217;,j:6,&#8217; este prim&#8217;)</p>
<p>end;</p>
<p>end;</p>
<p>if r=0 then writeln(&#8216;Numărul nu este prim&#8217;);</p>
<p>readkey;</p>
<p>end.<span id="more-181"></span></p>
<p><strong> </strong></p>
<p><strong>Se da un număr natural n. Determinaţi toate numerele prime, inclusiv n.</strong></p>
<p><strong> </strong></p>
<p>Program P2.4;</p>
<p>uses crt;</p>
<p>var i,n,f,j,r,m : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi un număr natural n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;0;</p>
<p>writeln(&#8216;Introduceţi intervalul de la 1 pînă la&#8217;,n:6&#8242;);</p>
<p>r:=0;</p>
<p>for j:=1 to n do</p>
<p>begin</p>
<p>f:=0;</p>
<p>for i:=2 to j div 2 do</p>
<p>if j mod i=0 then f:=1;</p>
<p>if f=0 then</p>
<p>begin r:=1;</p>
<p>writeln(&#8216;Numarul&#8217;,j:6,&#8217; este prim&#8217;)</p>
<p>end;</p>
<p>end;</p>
<p>if r=0 then writeln(&#8216;Numărul nu este prim&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Introduceţi doua numere naturale m si n. Determinaţi împărţitorul lor comun NOD.</strong></p>
<p><strong> </strong></p>
<p>Program p2_5;</p>
<p>uses crt;</p>
<p>var i,m,n,k,nod:integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi numărul natural n=&#8217;);</p>
<p>readln(n);</p>
<p>write(&#8216;Introduceţi numărul natural m=&#8217;);</p>
<p>readln(m);</p>
<p>until (n&gt;0) and (m&gt;0);</p>
<p>if n&gt;m then k:=m else k:=n;</p>
<p>for i:=1 to k do</p>
<p>if (n mod i=0) and (m mod i=0) then nod:=i;</p>
<p>writeln(&#8216;Împărţitorul numărului comun &#8216;,n, &#8216;şi&#8217;, m,</p>
<p>&#8216;nod=&#8217;,nod);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Tema 3:</strong></p>
<p><strong> </strong></p>
<p><strong>Sunt date următoarele n numerele naturale. Găsiţi suma tuturor numerelor naturale negative.</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>Program P3.1;</p>
<p>uses crt;</p>
<p>var n,x,sum,i : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi lungimea următoarelor numere n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;0;</p>
<p>sum:=0;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>writeln(&#8216;introdu x=&#8217;);</p>
<p>readln(x);</p>
<p>if x&lt;0 then sum:=sum+x;</p>
<p>end;</p>
<p>if sum=0 then writeln(&#8216;Numărul negativ nu exisţă&#8217;)</p>
<p>else</p>
<p>writeln(&#8216;Suma numerelor negative este sum=&#8217;,sum);</p>
<p>end.</p>
<p><strong>Sunt date următoarele n numere naturale. Găsiţi numărul maximal.</strong></p>
<p>Program P3.2;</p>
<p>uses crt;</p>
<p>var n,x,max,i : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi lungimea următoarelor numere n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;0;</p>
<p>writeln(&#8216;introdu x=&#8217;);</p>
<p>readln(x);</p>
<p>max:=x;</p>
<p>for i:=2 to n do</p>
<p>begin</p>
<p>writeln(&#8216;introdu x=&#8217;);</p>
<p>readln(x);</p>
<p>if (x&gt;max) then max:=x;</p>
<p>end;</p>
<p>writeln(&#8216;Numărul maximal este max=&#8217;,max);</p>
<p>end.</p>
<p><strong>Sunt date următoarele n numere naturale. Găsiţi numărul maximal din numerele negative.</strong></p>
<p><strong> </strong></p>
<p>Program p3_3;</p>
<p>uses crt;</p>
<p>var n,x,max,i:integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi lungimea numărul natural n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;0;</p>
<p>max:=0;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi x=&#8217;);</p>
<p>readln(x);</p>
<p>n:=n-1;</p>
<p>until (x&lt;0) o</p>
<p>r (n&lt;=1);</p>
<p>if x&lt;0 then max:=x;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>write(&#8216;Introduceţi x=&#8217;);</p>
<p>readln(x);</p>
<p>if (x&lt;0) and (x&gt;max) then max:=x;</p>
<p>end;</p>
<p>if max=0 then write(&#8216;Numărul negativ nu există&#8217;)</p>
<p>else</p>
<p>writeln(&#8216;Numărul maximal din numerele negative max:=&#8217;,max);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Întroduceţi următoarele n numere naturale. Determinaţi de cîte ori alternează şirul din numărul dat.</strong></p>
<p><strong> </strong></p>
<p>Program P3_4;</p>
<p>uses crt;</p>
<p>var old,new,f:real;</p>
<p>k,i,n:integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>repeat</p>
<p>write(&#8216;Introduceţi lungimea numărul natural n=&#8217;);</p>
<p>readln(n);</p>
<p>until n&gt;0;</p>
<p>write(&#8216;Introduceţi x=&#8217;);</p>
<p>readln(old);</p>
<p>f:=old;</p>
<p>k:=0;</p>
<p>for i:=2 to n do</p>
<p>begin</p>
<p>write(&#8216;Introduceţi x=&#8217;);</p>
<p>readln(new);</p>
<p>if (new&lt;&gt;0) and (f=0) then f:=new;</p>
<p>if new*f&lt;0 then</p>
<p>begin</p>
<p>f:=new;</p>
<p>k:=k+1;</p>
<p>end;</p>
<p>old:=new;</p>
<p>end;</p>
<p>if k&gt;0 then</p>
<p>writeln(&#8216;Următorul îsi schimba semnul’, k, &#8216;odată&#8217;)</p>
<p>else</p>
<p>writeln(&#8216;Urmatorul nu-si schimba semnul&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Întroduceţi următoarele numere nenule, 0-sfirsitul enumerării. Determinaţi este oare enumerarea schimbătoare de semn sau nu.</strong></p>
<p>Program P3_5;</p>
<p>uses crt;</p>
<p>var old,new,x:real;</p>
<p>f :boolean;</p>
<p>begin</p>
<p>clrscr;</p>
<p>write(&#8216;Introduceţi x=&#8217;);</p>
<p>readln(old);</p>
<p>write(&#8216;Introduceti x=&#8217;);</p>
<p>read(new);</p>
<p>f:=true;</p>
<p>repeat</p>
<p>if new*old&gt;0 then f:=false;</p>
<p>old:=new;</p>
<p>write(&#8216;Introduceti x=&#8217;);</p>
<p>readln(new);</p>
<p>until new=0;</p>
<p>if f then</p>
<p>writeln(&#8216;Este enumerare schimbătoare de semn&#8217;)</p>
<p>else</p>
<p>writeln(&#8216;Nu este enumerare de semn&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Tema 4</strong></p>
<p><strong> </strong></p>
<p><strong>Extrageţi intr-un rînd abbccc … zz … z.</strong></p>
<p><strong> </strong></p>
<p>Program P4_1;</p>
<p>uses crt;</p>
<p>var i : char;</p>
<p>k,j : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>k:=1;</p>
<p>for i:= &#8216;a&#8217; to &#8216;z&#8217; do</p>
<p>begin</p>
<p>for j:=1 to k do</p>
<p>write(i);</p>
<p>k:=k+1;</p>
<p>end;</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Extrageţi triunghiul  abc…  z</strong></p>
<p><strong> bc…  z</strong></p>
<p><strong> ……   z</strong></p>
<p><strong> </strong></p>
<p>Program P4_2;</p>
<p>uses crt;</p>
<p>var i,l : char;</p>
<p>j : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>l:=&#8217;a';</p>
<p>for j:=1 to 26 do</p>
<p>begin</p>
<p>for i:=&#8217;a&#8217; to l do</p>
<p>write(&#8221;);</p>
<p>for i:=l to &#8216;z&#8217; do</p>
<p>write(i);</p>
<p>write;</p>
<p>l:=succ(l);</p>
<p>end;</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Este dat un şir de simboluri. De înlocuit din ’a’ prin ‘aaa’.</strong></p>
<p><strong> </strong></p>
<p>Program P4_3;</p>
<p>uses crt;</p>
<p>var str : string;</p>
<p>l,i : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceţi text&#8217;);</p>
<p>readln(str);</p>
<p>l:=length(str);</p>
<p>writeln(&#8216;Textul transformat este&#8217;);</p>
<p>for i:=1 to l do</p>
<p>if (str[i]=&#8217;a') then write(&#8216;aaa&#8217;)</p>
<p>else write(str[i]);</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Este dat un şir de simboluri. Ştergeţi din ia toate semnele de punctuaţie.</strong></p>
<p>Program P4_4;</p>
<p>uses crt;</p>
<p>var str : string;</p>
<p>l,i : integer;</p>
<p>m : set of char;</p>
<p>begin</p>
<p>clrscr;</p>
<p>m:=['.',',','!',':',';','?','-'];</p>
<p>writeln(&#8216;Introduceţi text&#8217;);</p>
<p>readln(str);</p>
<p>l:=length(str);</p>
<p>writeln(&#8216;Textul transformat este&#8217;);</p>
<p>for i:=1 to l do</p>
<p>if not(str[i] in m) then write(str[i]);</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dat un şir de simboluri. De schimbat pe toate semnele exclamării pe puncte.</strong></p>
<p>Program P4_5;</p>
<p>uses crt;</p>
<p>var str : string;</p>
<p>l,i : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceţi text&#8217;);</p>
<p>readln(str);</p>
<p>l:=length(str);</p>
<p>writeln(&#8216;Textul transformat este&#8217;);</p>
<p>for i:=1 to l do</p>
<p>if (str[i]=&#8217;!') then write(&#8216;.&#8217;);</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Tema 5</strong></p>
<p><strong>Este dat un şir de simboluri. De ividenţiat sub sirul dintre primul si al doilea punct.</strong></p>
<p>Program P5_1;</p>
<p>uses crt;</p>
<p>var s1,str : string;</p>
<p>l,i : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceţi textul&#8217;);</p>
<p>readln(str);</p>
<p>s1:=str;</p>
<p>l:=pos(&#8216;.&#8217;,s1);</p>
<p>if i&lt;&gt;0 then</p>
<p>begin</p>
<p>delete(s1,1,l);</p>
<p>i:=pos(&#8216;.&#8217;,s1);</p>
<p>if i&lt;&gt;0 then</p>
<p>begin</p>
<p>s1:=copy(s1,1,i-1);</p>
<p>writeln(&#8216;Evidenţiaţi şirul dintre primul si al doilea</p>
<p>numar&#8217;);</p>
<p>writeln(s1);</p>
<p>end</p>
<p>else</p>
<p>writeln(&#8216;In text este doar un singur punct);</p>
<p>end</p>
<p>else</p>
<p>wrireln(&#8216;In text nu exista punct&#8217;);</p>
<p>writeln;</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Este dat un şir de simboluri. De evidenţiat sub şirul dintre primul si ultimul punct.</strong></p>
<p><strong> </strong></p>
<p>Program P5_1;</p>
<p>uses crt;</p>
<p>var s1,str : string;</p>
<p>l,i,j : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceţi textul&#8217;);</p>
<p>readln(str);</p>
<p>s1:=str;</p>
<p>l:=pos(&#8216;.&#8217;,s1);</p>
<p>j:=i; l:=0;</p>
<p>if i&lt;&gt;0 then</p>
<p>begin</p>
<p>while i&lt;&gt;0 do</p>
<p>begin</p>
<p>delete(s1,1,l);</p>
<p>i:=pos(&#8216;.&#8217;,s1);</p>
<p>end;</p>
<p>if i&lt;&gt;0 then</p>
<p>begin</p>
<p>s1:=copy(str,j+1,l-j-1);</p>
<p>writeln(&#8216;Evidentiati sirul primului numar&#8217;);</p>
<p>writeln(s1);</p>
<p>end</p>
<p>else</p>
<p>writeln(&#8216;In text este doar un singur punct);</p>
<p>end</p>
<p>else</p>
<p>wrireln(&#8216;In text nu exista punct&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dat un şir de simboluri. De evidenţiat sub şirul dintre primul si ultimul punct.</strong></p>
<p>Program P5_2;</p>
<p>uses crt;</p>
<p>var s1,str : string;</p>
<p>l,i,j : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceti text&#8217;);</p>
<p>readln(str);</p>
<p>s1:=str;</p>
<p>l:=pos(&#8216;.&#8217;,s1);</p>
<p>j:=i; l:=0;</p>
<p>if i&lt;&gt;0 then</p>
<p>begin</p>
<p>while i&lt;&gt;0 do</p>
<p>begin</p>
<p>delete(s1,1,l);</p>
<p>l:=l+i;</p>
<p>i:=pos(&#8216;.&#8217;,s1);</p>
<p>end;</p>
<p>if l&lt;&gt;j then</p>
<p>begin</p>
<p>s1:=copy(str,j+1,l-j-1);</p>
<p>writeln(&#8216;Evidentiati sirul primului numar&#8217;);</p>
<p>writeln(s1);</p>
<p>end</p>
<p>else</p>
<p>writeln(&#8216;In text este doar un singur punct);</p>
<p>end</p>
<p>else</p>
<p>wrireln(&#8216;In text nu exista punct&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dat un şir de caractere până la un punct. Grupul de simboluri intre spatii se scot. De găsit câte cuvinte se încep cu una si aceeaşi litera.</strong></p>
<p><strong> </strong></p>
<p>Program P5_3;</p>
<p>uses crt;</p>
<p>var   s1 : string;</p>
<p>k,i,j : integer;</p>
<p>x : char;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceti text&#8217;);</p>
<p>readln(s1);</p>
<p>i:=pos(&#8216;.&#8217;,s1);</p>
<p>s1:=copy(s1,1,j-1)+&#8221;;</p>
<p>k:=0;</p>
<p>repeat</p>
<p>if s1[1]&lt;&gt;&#8221;then x:=s1[1];</p>
<p>i:=pos(&#8216;.&#8217;,s1);</p>
<p>if i&gt;1 then if x=s1[-1] then k:=k+1;</p>
<p>delete(s1,1,l);</p>
<p>until l=0;</p>
<p>writeln(&#8216;Evidentiati numarul de cuvinte k=&#8217;,k&#8217;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dat un şir de caractere până la un punct. Grupul de simboluri intre spatii se scot. De găsi câte cuvinte conţine trei litere din l.</strong></p>
<p><strong> </strong></p>
<p>Program P5_4;</p>
<p>uses crt;</p>
<p>var m,k,l,j : integer;</p>
<p>s1 : string;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceti text&#8217;);</p>
<p>readln(s1);</p>
<p>j:=pos(&#8216;.&#8217;,s1);</p>
<p>s1:=copy(s1,1,j-1)+&#8221;;</p>
<p>m:=0;</p>
<p>repeat</p>
<p>j:=pos(&#8221;,s1);</p>
<p>if l&gt;1 then begin</p>
<p>k:=0;</p>
<p>for j:=1 to l-1 do</p>
<p>if s1[j]=&#8217;e'then k:=k+1;</p>
<p>if k=3 then m:=m+1;</p>
<p>end;</p>
<p>delete(s1,1,l);</p>
<p>until l=0;</p>
<p>writeln(&#8216;Numarul de cuvinte este k=&#8217;,k);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dat un şir de caractere până la un punct. Grupul de simboluri intre spatii se scot. De verificat daca ea este de la un număr real.</strong></p>
<p><strong> </strong></p>
<p>Program P5_5;</p>
<p>uses crt;</p>
<p>var l,k : integer;</p>
<p>s1 : string;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceti text&#8217;);</p>
<p>readln(s1);</p>
<p>k:=0; l:=1;</p>
<p>repeat</p>
<p>case s1[l] of</p>
<p>&#8217;0&#8242;..&#8217;9&#8242; :k:=k+(ord(s1[l])-ord(&#8217;0&#8242;));</p>
<p>&#8221;:;</p>
<p>else k:=-1;</p>
<p>end;</p>
<p>i:=i+1</p>
<p>until (s1[l]==&#8217;.')or(k&lt;0);</p>
<p>if k mod 5 = 0 then</p>
<p>writeln(&#8216;Esre o cifra zecimala,reala 5&#8242;);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong>Tema 6</strong></p>
<p><strong>Se dată o mulţime de numere. De găsit elementul maximal dacă sînt careva elemente maximale. De evidenţiat câte elemente sunt.</strong></p>
<p>Program P6_1;</p>
<p>uses crt;</p>
<p>var mas:array[1..10] of integer;</p>
<p>i,max,k,n : integer;</p>
<p>begin</p>
<p>clrscr;</p>
<p>writeln(&#8216;Introduceţi mărimea şirului n=&#8217;);</p>
<p>readln(N);</p>
<p>writeln(&#8216;Introduceţi elementele şirului&#8217;);</p>
<p>readln(mas[1]);</p>
<p>max:=mas[1];</p>
<p>k:=1;</p>
<p>for i:=2 to n do</p>
<p>begin</p>
<p>write(&#8216;Introduceţi elementele şirului&#8217;);</p>
<p>readln(mas[1]);</p>
<p>if max&lt;mas[i] then</p>
<p>begin</p>
<p>max:=mas[i];</p>
<p>k:=1</p>
<p>end</p>
<p>else</p>
<p>if max = mas[i] then k:=k+1;</p>
<p>end;</p>
<p>writeln(&#8216;Max=&#8217;,max, &#8216;Aceste elemente&#8217;, k);</p>
<p>readkey;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dată o mulţime de numere. De găsit câte perechi de elemente vecine identice sunt în ea. </strong></p>
<p><strong> </strong></p>
<p>Program P6_2;</p>
<p>const m=100;</p>
<p>var mas : array[1..m] of integer;</p>
<p>i,k,n : integer;</p>
<p>begin</p>
<p>readln(n);</p>
<p>k:=0;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>write(&#8216;Introduceţi elementele şirului&#8217;);</p>
<p>readln(mas[1]);</p>
<p>end;</p>
<p>for i:=1 to n-1 do</p>
<p>if mas[i]=mas[i+1] then k:=k+1;</p>
<p>writeln(&#8216;Perechile asemenea in şirul elementului este &#8216;,k);</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dată o mulţime de numere. De găsit cel mai mare element şi să-l plasăm pe primul loc.</strong></p>
<p>Program P6_3;</p>
<p>const m=100;</p>
<p>var mas : array[1..m] of integer;</p>
<p>i,k,new,n : integer;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului n=&#8217;);</p>
<p>readln(n);</p>
<p>writeln(&#8216;Introduceţi&#8217;, n, &#8216;Şirul elementului&#8217;);</p>
<p>for i:=1 to n do</p>
<p>read(mas[i]);</p>
<p>writeln;</p>
<p>new:=mas[n];</p>
<p>k:=n;</p>
<p>for i:=n downto 1 do</p>
<p>if mas[i]&gt;new then</p>
<p>begin</p>
<p>k:=i;</p>
<p>new:=mas[i]</p>
<p>end;</p>
<p>mas[k]:=mas[1];</p>
<p>mas[1]:=new;</p>
<p>for i:=1 to n do</p>
<p>write(mas[i]:4);</p>
<p>writeln</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Se cunosc datele despre reuşita a nu mai mult de 27 grupe de studiu(în procente). De evidenţiat cu cît trebuie de ridicat reuşita în cea mai rămasă grupă pentru a atinge nivelul mediu.</strong></p>
<p><strong> </strong></p>
<p>Program P6_4;</p>
<p>const m=100;</p>
<p>var mas : array[1..m] of integer;</p>
<p>i,n : integer;</p>
<p>min,sum : real;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului n=&#8217;);</p>
<p>readln(n);</p>
<p>repeat</p>
<p>writeln(&#8216;Introduceţi elementului şirului(%)&#8217;);</p>
<p>readln(mas[1]);</p>
<p>until (mas[1]&lt;101)and(mas[1]&gt;0);</p>
<p>min:=mas[1];sum:=min;</p>
<p>for i:=2 to n do</p>
<p>begin</p>
<p>sum:=sum+mas[i];</p>
<p>if min&gt;mas[i] then min:=mas[i];</p>
<p>end;</p>
<p>writeln(&#8216;Dea ridica cea mai înalta grupa&#8217;);</p>
<p>writeln(&#8216;Din cel mai jos nivel pe&#8217;,(sum/n)-min);</p>
<p>end.</p>
<p><strong>Sunt cunoscute datele despre temperatura medie lunară pe an. De evidenţiat care temperatură a fost cea mai înaltă vara şi cea mai joasă iarna.</strong></p>
<p><strong> </strong></p>
<p>Program P6_5;</p>
<p>const m=12;</p>
<p>var mas : array[1..m] of real;</p>
<p>i,n : integer;</p>
<p>min,max : real;</p>
<p>begin</p>
<p>for i:=1 to 12 do</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului&#8217;);</p>
<p>readln(mas[i]);</p>
<p>end;</p>
<p>max:=mas[6];min:=mas[12];</p>
<p>for i:=7 to 8 do</p>
<p>if max&lt;mas[i] then max:=mas[i];</p>
<p>for i:=1 to 2 do</p>
<p>if min&gt;mas[i] then min:=mas[i];</p>
<p>writeln(&#8216;Cea mai înalta temperatura vara&#8217;, max);</p>
<p>writeln(&#8216;Cea mai joasa temperatura iarna&#8217;, min);</p>
<p>end.</p>
<p><strong>Tema 7</strong></p>
<p><strong>Este dată matricea N x M, formată din numere naturale. De găsit cel mai mic element şi poziţia lui dacă sunt mai multe de aceste elemente, de afişat pe ecran poziţiile fiecăruia.</strong></p>
<p><strong> </strong></p>
<p>Program P7_1;</p>
<p>Const t;100; s;100;</p>
<p>Var A:array [1..t,1..s] of integer;</p>
<p>n,m,im,jm,i,j,min,k : integer;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului&#8217;);</p>
<p>readln(n);</p>
<p>writeln(&#8216;Introduceţi mărimea şirului&#8217;);</p>
<p>readln(m);</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>writeln(&#8216;Introduceţi&#8217;, m, &#8216;şiru&#8217;l);</p>
<p>for j:’1 to m do</p>
<p>read(a[i,j]);</p>
<p>end;</p>
<p>min:=a[1,1];</p>
<p>im:=1;jm:=1;k:=0;</p>
<p>for i:=1 to n do</p>
<p>for j:=1 to m do</p>
<p>if min&gt;a[i,j] then</p>
<p>begin</p>
<p>k:=1;im:=i;jm:=j;</p>
<p>min:= a[i,j]</p>
<p>end</p>
<p>else</p>
<p>if min= a[i,j] then k:=k+1;</p>
<p>if k=1 then</p>
<p>begin</p>
<p>writeln(’Cel mai mic element este min=’,min);</p>
<p>writeln(’În’, im, ’În rînd’, jm, ’Coloniţă’);</p>
<p>end</p>
<p>else</p>
<p>begin</p>
<p>writeln(’Î n matricea’,k, ’Elementul minimal min =’,min);</p>
<p>for i:=im to n do</p>
<p>for j:=1 to m do</p>
<p>if min=a[i,j] then writeln(’În rând’, i, ’În coloniţaâ,j)</p>
<p>end</p>
<p>end.</p>
<p><strong>Este dată matricea N x M, formată din numere naturale. De a găsi în şiruri cele mai mici elemente din dreapta şi de a găsi poziţia lor.</strong></p>
<p>Program P7_2;</p>
<p>Const t;100; s;100;</p>
<p>Var A:array [1..t,1..s] of integer;</p>
<p>n,m,jm,i,j,min : integer;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului&#8217;);</p>
<p>readln(n);</p>
<p>writeln(&#8216;Introduceţi mărimea şirului&#8217;);</p>
<p>readln(m);</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>writeln(&#8216;Introduceţi&#8217;, m, &#8216;şirul&#8217;);</p>
<p>for j:’1 to m do</p>
<p>read(a[i,j]);</p>
<p>end;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>min:= (a[i,m]);</p>
<p>jm:=m;</p>
<p>for j:=m downto 1 do</p>
<p>if min&gt;a[i,j] then</p>
<p>begin</p>
<p>jm:=j;</p>
<p>min:= a[i,j]</p>
<p>end;</p>
<p>writeln(’În rîndul i=’, i, ’Din dreapta min=’,min);</p>
<p>writeln(’În coloniţa’, jm);</p>
<p>end;</p>
<p>end.</p>
<p><strong>Este dată matricea N x M, formată din numere naturale. De găsit cele mai mici elemente din stânga şi a le pune în prima coloniţă.</strong></p>
<p>Program P7_3;</p>
<p>Const t;100; s;100;</p>
<p>Var A:array [1..t,1..s] of integer;</p>
<p>n,m,jm,i,j,min : integer;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului n=&#8217;);</p>
<p>readln(n);</p>
<p>writeln(&#8216;Introduceţi mărimea şirului m=&#8217;);</p>
<p>readln(m);</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>writeln(&#8216;Introduceţi&#8217;, m, &#8216;şirul&#8217;);</p>
<p>for j:=1 to m do</p>
<p>read(a[i,j]);</p>
<p>end;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>min:= (a[i,1]);</p>
<p>jm:=1;</p>
<p>for j:=1 to m do do</p>
<p>if min&gt;a[i,j] then</p>
<p>begin</p>
<p>jm:=j;</p>
<p>min:= a[i,j]</p>
<p>end;</p>
<p>a[i,jm]:= a[i,1]</p>
<p>a[i,1]:=min</p>
<p>end;</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>for j:=1 to m do</p>
<p>write(a[i,j]:4);</p>
<p>writeln</p>
<p>end;</p>
<p>end.</p>
<p><strong>Este dată matricea N x M, alcătuită din litere latine. De aranjat fiecare şir în ordine alfabetică.</strong></p>
<p>Program P7_4;</p>
<p>Const t;100; s;100;</p>
<p>Var A:array [1..t,1..s] of integer;</p>
<p>n,m,i,j,k : integer;</p>
<p>temp:char;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi mărimea şirului n=&#8217;);</p>
<p>readln(n);</p>
<p>writeln(&#8216;Introduceţi mărimea şirului m=&#8217;);</p>
<p>readln(m);</p>
<p>writeln(’Introduceţi’,m*n, ’litere’);</p>
<p>for i:=1 to n do</p>
<p>for j:=1 to m do</p>
<p>read(a[i,j]);</p>
<p>for i:=1 to n do</p>
<p>begin</p>
<p>for k:=1 to m-1 do</p>
<p>for j:=k to m do</p>
<p>if a[i,k]&gt;a[i,j] then</p>
<p>begin</p>
<p>temp:= a[i,k]</p>
<p>a[i,k]:=a[i,j]</p>
<p>a[i,j]:=temp;</p>
<p>end;</p>
<p>end;</p>
<p>fpr i:=1 to n do</p>
<p>begin</p>
<p>for j:=1 to m do</p>
<p>write(a[i,j]);</p>
<p>writeln</p>
<p>end;</p>
<p>end.</p>
<p><strong> </strong></p>
<p><strong>Este dată matricea pătrată N x M, alcătuită din numere naturale, de a o întoarce la 90 de grade împotriva acelor ceasornice şi a extrage rezultatele pe ecran. </strong></p>
<p>Program P7_5;</p>
<p>Const t;100; s;100;</p>
<p>Var A:array [1..t,1..s] of integer;</p>
<p>m,i,j,k : integer;</p>
<p>temp:char;</p>
<p>begin</p>
<p>write(&#8216;Introduceţi lungimea matricei m=&#8217;);</p>
<p>readln(m);</p>
<p>writeln(&#8216;Matricea de ieşire&#8217;);</p>
<p>k:=1;</p>
<p>for i:=1 to m do</p>
<p>for j:=1 to m do</p>
<p>begin</p>
<p>a[i,j]:=k;</p>
<p>k:=k+1;</p>
<p>if j&lt;m then write(a[i,j]:4)</p>
<p>else writeln(a[i,j]:4)</p>
<p>end;</p>
<p>writeln(’Matricea după întoarcere la 90 de grade’’);</p>
<p>for i:=1 to m do</p>
<p>for j:=1 to m do</p>
<p>begin</p>
<p>b[i,j]:=a[j,m+1-i];</p>
<p>if j&lt;m then write(b[i,j]:4)</p>
<p>else writeln(b[i,j]:4)</p>
<p>end;</p>
<p>end.</p>
<p><strong>Tema 8</strong></p>
<p><strong>Dgukoolfju</strong></p>
<p>Program P8_1;</p>
<p>Var f1,f2 : text;</p>
<p>X : char;</p>
<p>Begin</p>
<p>assign(f1,’c\e\one’);</p>
<p>reset(f1);</p>
<p>assign(f2,’’);</p>
<p>while not eof(f1) do</p>
<p>begin</p>
<p>read(1,x);</p>
<p>write(f2,x+’’+x)</p>
<p>end;</p>
<p>writeln;</p>
<p>close(f1);</p>
<p>close(f2)</p>
<p>end.</p>
<p><strong>Mhfzkrdfdf</strong></p>
<p>Program P8_2;</p>
<p>Var f1 : text;</p>
<p>x : char;</p>
<p>k : integer;</p>
<p>Begin</p>
<p>k:=0;</p>
<p>assign(f1, ’two’);</p>
<p>reset(f1);</p>
<p>while not eof(f1) do</p>
<p>begin</p>
<p>read(f1,x);</p>
<p>if (x=’a’) or (x=’A’) then k:=k+1;</p>
<p>end;</p>
<p>writeln(‚Numărul de litere A:’, K);</p>
<p>closes(f1);</p>
<p>end.</p>
<p><strong>Dtjuetdlofz</strong></p>
<p>Program P8_3;</p>
<p>Var f1 : file of char;</p>
<p>f2 : text;</p>
<p>x : char;</p>
<p>i : integer;</p>
<p>begin</p>
<p>assign(f1, ’two’);</p>
<p>reset(f1);</p>
<p>assign(f2, ’’);</p>
<p>rewrite(f2);</p>
<p>for i:=1 to 2 do</p>
<p>begin</p>
<p>while not eof(f1) do</p>
<p>begin</p>
<p>read(f1,x);</p>
<p>write(f2,x);</p>
<p>end;</p>
<p>writeln;</p>
<p>seek(f1,0)</p>
<p>end;</p>
<p>writeln;</p>
<p>closes(f1);</p>
<p>closes(f2);</p>
<p>end.</p>
<p><strong>K,tzibnhggg</strong></p>
<p>Program P8_4;</p>
<p>Var f1 : file of char;</p>
<p>f2 : text;</p>
<p>x : char;</p>
<p>l,i : integer;</p>
<p>begin</p>
<p>assign(f1, ’two’);</p>
<p>reset(f1);</p>
<p>assign(f2, ’’);</p>
<p>rewrite(f2);</p>
<p>l:=filesize(f1);</p>
<p>while not eof(f1) do</p>
<p>begin</p>
<p>read(f1,x);</p>
<p>write(f2,x)</p>
<p>end;</p>
<p>writeln;</p>
<p>for i:=l-1 downto 0 do</p>
<p>begin</p>
<p>seek(f1,i);</p>
<p>read(f1,x);</p>
<p>write(f2,x)</p>
<p>end;</p>
<p>writeln;</p>
<p>closes(f1);</p>
<p>closes(f2);</p>
<p>end.</p>
<p><strong>Khfkdhztswreh</strong></p>
<p>Program P8_5;</p>
<p>f2 : text;</p>
<p>x : char;</p>
<p>l,i : integer;</p>
<p>begin</p>
<p>assign(f1, ’two’);</p>
<p>reset(f1);</p>
<p>assign(f2, ’’);</p>
<p>rewrite(f2);</p>
<p>k:=-1;</p>
<p>while note of(f1) do</p>
<p>begin</p>
<p>k:=k+1;</p>
<p>read(f1,x);</p>
<p>if x&lt;&gt;’.’ then write(f2,x)</p>
<p>else</p>
<p>begin</p>
<p>seek(f1,k+1);</p>
<p>write(f2,x);</p>
<p>trunca(f1)</p>
<p>end;</p>
<p>end;</p>
<p>writeln;</p>
<p>closes(f1);</p>
<p>closes(f2);</p>
<p>end.</p>
<p><strong>Tema 9</strong></p>
<p><strong> </strong></p>
<p><strong>Jhdkzustz</strong></p>
<p>Program P9_1;</p>
<p>const u=100;</p>
<p>Var n,m : integer;</p>
<p>t : array of integer;</p>
<p>procedure tab_in(var l,k : integer);</p>
<p>var i,j : integer;</p>
<p>begin</p>
<p>for i:=1 to l do</p>
<p>beginn</p>
<p>for j:=1 to k do</p>
<p>begin</p>
<p>’);</p>
<p>read(t)</p>
<p>end;</p>
<p>writeln</p>
<p>end</p>
<p>end;</p>
<p>procedure tab_out(var l,k : integer);</p>
<p>var i,j : integer;</p>
<p>begin</p>
<p>for i:=1 to l do</p>
<p>begin</p>
<p>for j:=1 to k do</p>
<p>write(t);</p>
<p>writeln</p>
<p>end</p>
<p>end;</p>
<p>begin</p>
<p>writeln(’Introduceţi mărimea matricii N x M’);</p>
<p>write(’n=’);</p>
<p>read(n);</p>
<p>write(’m=’);</p>
<p>read(m);</p>
<p>tab_in(n,m);</p>
<p>writeln(’Matricea’,m,’x’,m);</p>
<p>tab_out(n,m)</p>
<p>end.</p>
<p><strong>Jhzdddddd</strong></p>
<p>Program P9_2;</p>
<p>var n,m : integer;</p>
<p>function min(i,j : integer) : integer;</p>
<p>begin</p>
<p>if i&lt;j then min:=i;</p>
<p>else min:=j;</p>
<p>end;</p>
<p>begin</p>
<p>writeln(’Introduceţi două numere întregi’);</p>
<p>readln(i,j);</p>
<p>writeln(’min=’,min(i,j));</p>
<p>end.</p>
<p><strong>Fgjjjjjjjj</strong></p>
<p>Program P9_3;</p>
<p>var n : longing;</p>
<p>k : integer;</p>
<p>function min(i,j : longing) : integer;</p>
<p>var s : integer;</p>
<p>begin</p>
<p>s:=0;</p>
<p>repeat</p>
<p>s:=s+n mod 10;</p>
<p>n:=n div 10</p>
<p>until n=0;</p>
<p>num:=s;</p>
<p>end;</p>
<p>begin</p>
<p>write(’Introduceţi un număr intreg n=’);</p>
<p>readln(n);</p>
<p>k:=num(n);</p>
<p>writeln(’Suma cifrelor lor asemănătoare lui’,k);</p>
<p>end.</p>
<p><strong>Ffjjjjjjjjj</strong></p>
<p>Program P9_4;</p>
<p>var a,b,d,k,x,y : integer;</p>
<p>function min(i,j : longing) : integer;</p>
<p>begin</p>
<p>if if i&lt;j then min:=i;</p>
<p>else min:=j;</p>
<p>end;</p>
<p>function min(i,j : longing) : integer;</p>
<p>begin</p>
<p>if if i&lt;j then max:=i;</p>
<p>else max:=j;</p>
<p>end;</p>
<p>begin</p>
<p>repeat</p>
<p>write(’Introduceţi două numere intreg ’);</p>
<p>readln(a,b);</p>
<p>until (a&gt;0) and (b&gt;0);</p>
<p>k:=1;</p>
<p>x:=min(a,b);</p>
<p>y:=max(a,b);</p>
<p>while x&lt;&gt;y do</p>
<p>begin</p>
<p>k:=k+1;</p>
<p>d:=y-x;</p>
<p>y:=max(d,x);</p>
<p>x:=min(d,x);</p>
<p>end;</p>
<p>writeln(’Numărul la pătrat căutat :’,k);</p>
<p>end.</p>
<p><strong>Jhgggggggg</strong></p>
<p>Program P9_5;</p>
<p>var i : integer;</p>
<p>function fib(i,j : integer) : integer;</p>
<p>begin</p>
<p>if i=j then fib:=0;</p>
<p>if (i=1) or (i=2) then fib:=1</p>
<p>else</p>
<p>fib:=fib(i-1)+fib(i-2)</p>
<p>end;</p>
<p>begin</p>
<p>repeat</p>
<p>write(’Introduceţi în ordine numerele întregi i=’);</p>
<p>readln(i);</p>
<p>until i&gt;=;</p>
<p>writeln(i:5,’-Numărul fib corect’,fib(i));</p>
<p>end.</p>
<p><strong>Tema 10</strong></p>
<p><strong>Fjjjjjjjjjjjj</strong></p>
<p>Program P10_1;</p>
<p>uses crt;</p>
<p>var i : integer;</p>
<p>begin</p>
<p>textbackground(2);</p>
<p>clrscr;</p>
<p>delay(1000);</p>
<p>textcolor(0);</p>
<p>for i:=1 to 11 do</p>
<p>begin</p>
<p>textcolor(i+4);</p>
<p>writeln;</p>
<p>write(’’:2*i);</p>
<p>write(’One moment,please&#8230;’);</p>
<p>delay(1500);</p>
<p>end;</p>
<p>readln;</p>
<p>textbackground(1);</p>
<p>clrscr</p>
<p>end.</p>
<p><strong>Ddddtttttttt</strong></p>
<p>Program P10_2;</p>
<p>uses crt;</p>
<p>var i,x : integer;</p>
<p>begin</p>
<p>textbackground(1);</p>
<p>clrscr;</p>
<p>x:=1;</p>
<p>delay(1000);</p>
<p>textcolor(0);</p>
<p>for i:=1 to 11 do</p>
<p>begin</p>
<p>if (i&lt;&gt;1) and (i&lt;&gt;9) then textbackground(i);</p>
<p>else textbackground(i+4);</p>
<p>window(x,9,x+5,14);</p>
<p>clrscr;</p>
<p>writeln;</p>
<p>writeln(’?’);</p>
<p>delay(1500);</p>
<p>x:=x+7;</p>
<p>end;</p>
<p>readln;</p>
<p>textbackground(1);</p>
<p>clrscr</p>
<p>end.</p>
<p><strong>Kkkkkkkkkkkkk</strong></p>
<p>Program P10_3;</p>
<p>uses crt;</p>
<p>var i : integer;</p>
<p>begin</p>
<p>textbackground(2);</p>
<p>clrscr;</p>
<p>delay(1000);</p>
<p>for i:=1 to 15 do</p>
<p>begin</p>
<p>textcolor(1+random(15));</p>
<p>window(2*i,i,80-2*i,26-i);</p>
<p>clrscr;</p>
<p>delay(1500);</p>
<p>end;</p>
<p>readln;</p>
<p>textbackground(2);</p>
<p>clrscr</p>
<p>end.</p>
<p><strong>Lllllllll</strong></p>
<p>Program P10_4;</p>
<p>uses crt;</p>
<p>var x,y,i : integer;</p>
<p>begin</p>
<p>textbackground(2);</p>
<p>clrscr;</p>
<p>x:=5;</p>
<p>y:=10;</p>
<p>delay(1000);</p>
<p>for i:=1 to 15 do</p>
<p>begin</p>
<p>x:=x+2;</p>
<p>textcolor(9);</p>
<p>window(x,y,x+18,y+7);</p>
<p>clrscr;</p>
<p>sound(300);</p>
<p>nosound;</p>
<p>delay(500);</p>
<p>nosound;</p>
<p>textcolor(2);</p>
<p>clrscr;</p>
<p>delay(300);</p>
<p>end;</p>
<p>readln;</p>
<p>clrscr</p>
<p>end.</p>
<p><strong>Ttttttttt</strong></p>
<p>Program P10_5;</p>
<p>uses crt;</p>
<p>var x,y,i : integer;</p>
<p>begin</p>
<p>textbackground(2);</p>
<p>clrscr;</p>
<p>x:=30;</p>
<p>y:=2;</p>
<p>delay(1000);</p>
<p>for i:=1 to 15 do</p>
<p>begin</p>
<p>y:=y+1;</p>
<p>textcolor(9);</p>
<p>window(x,y,x+18,y+7);</p>
<p>clrscr;</p>
<p>sound(300);</p>
<p>delay(500);</p>
<p>nosound;</p>
<p>textcolor(2);</p>
<p>clrscr;</p>
<p>delay(300);</p>
<p>end;</p>
<p>readln;</p>
<p>clrscr</p>
<p>end.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=181</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tehnologia satelitilor. HowTo.</title>
		<link>http://resurse-educationale.uv.ro/?p=175</link>
		<comments>http://resurse-educationale.uv.ro/?p=175#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:53:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[calibrare]]></category>
		<category><![CDATA[configurare]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[isp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[netsystem]]></category>
		<category><![CDATA[pppd]]></category>
		<category><![CDATA[satelit]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[thnologie]]></category>
		<category><![CDATA[tv]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=175</guid>
		<description><![CDATA[Sat (Satellite Technology) HOWTO Roberto Arcomano berto@fatamorgana.com, Florindo Santoro flosan@hack-it.net v1.3, 21 July 2001 Traducerea din limba engleza: Victor Plugaru vuk@go.ro Cu scuzele de rigoare pentru eventualele greseli sau inadvertente. Tehnologia satelitilor incepe sa devina o mare resursa pentru utilizatorii &#8230; <a href="http://resurse-educationale.uv.ro/?p=175">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sat (Satellite Technology) HOWTO<br />
Roberto Arcomano berto@fatamorgana.com, Florindo Santoro<br />
flosan@hack-it.net<br />
v1.3, 21 July 2001<br />
Traducerea din limba engleza: Victor Plugaru vuk@go.ro<br />
Cu scuzele de rigoare pentru eventualele greseli sau inadvertente.</p>
<p>Tehnologia satelitilor incepe sa devina o mare resursa pentru<br />
utilizatorii de Internet, permitand largimi mari de banda pentru download,<br />
precum si pentru multe alte servicii interesante. Acest document tine<br />
de investigheze modalitatile de conectare a mediului Linux prin<br />
satelit, cum sa obtineti viteze superioare si sa partajati aceasta cu alti<br />
clienti. Puteti gasi ultimele versiuni ale acestui document la<br />
http://www.fatamorgana.com/bertolinux/sat/english &lt;http://www.fata-<br />
morgana.com/bertolinux/sat/english&gt; si http://www.hack-it.net/How-<br />
To/Sat-HOWTO.html &lt;http://www.hack-it.net/How-To/Sat-HOWTO.html&gt; .<br />
______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere</p>
<p>1.1 Introducere<br />
1.2 Copyright</p>
<p>2. Cunostinte necesare</p>
<p>2.1 Despre sateliti<br />
2.2 Cum lucreaza?<br />
2.3 Alte tehnologii<br />
2.4 Care este largimea de banda maxima?<br />
2.5 Cat costa?<br />
2.5.1 Costurile hardware<br />
2.5.2 Costurile conturilor<br />
2.6 Ce sateliti sunt folositi?<br />
2.7 Ce ISP-uri ofera servicii de acces prin Internet?<br />
2.8 Altceva?</p>
<p>3. Informatii tehnice</p>
<p>3.1 Functionare generala<br />
3.2 Frecvente<br />
3.3 Carduri receptoare DVB<br />
3.4 Configurarea nivelului legaturii de date DVB<br />
3.5 Functionarea TCP/IP<br />
3.6 Autentificarea<br />
3.7 Servicii pe care le pot folosi cu o conexiune prin satelit</p>
<p>4. Cerinte</p>
<p>4.1 Cerinte privind cunostintele<br />
4.2 Hardware<br />
4.3 Software<br />
4.4 Software TV<br />
4.4.1 Pentru Windows<br />
4.4.2 Pentru Linux</p>
<p>5. Configurarea echipamentului</p>
<p>5.1 Montajul<br />
5.2 Calibrarea<br />
5.3 Double Feed (LNB-uri duble)<br />
5.4 Reglajul nivelului legaturii de date</p>
<p>6. Configurarea  sub Linux</p>
<p>6.1 Instalarea Driverelor<br />
6.2 Configurarea fisierului /etc/dvbd.conf<br />
6.3 Daemonul dvbd<br />
6.4 Cum se configureaza serviciul EON<br />
6.5 Cum se configureaza serviciul Netsystem<br />
6.5.1 conexiuni VPN<br />
6.5.2 Patch pentru pppd<br />
6.5.3 setarea rutarii<br />
6.5.4 Patch pentru dvbd.c<br />
6.5.5 Testarea<br />
6.5.6 Obtinerea unor performante superioare<br />
6.5.7 Partajarea Netsystem cu mai multi clienti<br />
6.6 Cum se utilizeaza serviciul Sat Node</p>
<p>7. Configurarea sub Windows</p>
<p>7.1 EON<br />
7.2 Netsystem</p>
<p>8. Anexa A &#8211; Note<br />
8.1 Translatarea IP dinamic -&gt; Adrese MAC<br />
8.2 Cadrul TCP<br />
8.3 Download accelerator<br />
8.3.1 Sub Linux<br />
8.3.2 Sub Windows</p>
<p>9. Anexa B &#8211; Valori cunoscute pentru ISP-urile ce ofera servicii<br />
prin satelit</p>
<p>9.1 EuropeOnLine<br />
9.1.1 Transponder 113<br />
9.1.2 Transponder 114<br />
9.1.3 Transponder 115<br />
9.1.4 Transponder 103<br />
9.2 Netsystem<br />
9.2.1 Transponder 119<br />
9.3 Sat Node</p>
<p><span id="more-175"></span></p>
<p>______________________________________________________________________</p>
<p>1. Introducere</p>
<p>1.1. Introducere</p>
<p>Acest document intentioneaza sa explice cate ceva despre<br />
tehnologia satelitara, cum functioneaza, de ce aveti nevoie, configuarea<br />
si cum sa partajati accesul pentru mai multi clienti. Conexiunile prin<br />
satelit sunt foarte diferite de cele terestre, cer mai mult atentie la<br />
configuare si mai multa intretinere pentru a le mentine stabile (ninsoarea<br />
sau ploaia intensa va pot impiedica sa aveti un semnal de calitate).</p>
<p>Opiniile Dumneavoastra sunt binevenite, nu ezitati sa<br />
ne contactati: berto@fatamorgana.com &lt;mailto:berto@fatamorgana.com&gt; si<br />
flosan@hack-it.net &lt;mailto:flosan@hack-it.net&gt; .</p>
<p>1.2. Copyright</p>
<p>Copyright (C) 2000,2001 Roberto Arcomano, Florindo Santoro. Acest document<br />
este gratuit; il puteti redistribui sau/si modifica sub<br />
termenii GNU Licenta Publica Generala asa cum a fost publicata de Free<br />
Software Foundation, de asemeni pentru versiunea 2 a licentei sau (conform<br />
optiunii Dumneavoastra) conform oricarei viitoare versiuni. Acest document<br />
este distribuit in speranta ca va fi folositor, dar</p>
<p>FARA NICI O GARANTIE, fara implicarea vreunei garantii<br />
comerciale ori a FIABILITATII INTR-UN SCOP PREDEFINIT.<br />
Consultati Licenta Generala Publica GNU  pentru mai multe detalii.<br />
Puteti obtine o copie a Licentei Generale Publice GNU la adresa<br />
&lt;http://www.gnu.org/copyleft/gpl.html&gt;</p>
<p>2. Cunostinte necesare</p>
<p>2.1. Despre sateliti</p>
<p>In ultimii cativa ani satelitii au inceput sa fie folositi<br />
pentru comunicatia in Internet, in primul rand de catre ISP-uri medii-mari<br />
(ISP= Internet Service Provider), dar am intalnit si utilizatori<br />
individuali. Conexiunile prin satelit sunt un tip diferit de<br />
cele terestre, cu temporizari (timing-uri) diferite, cum ar fi RTT<br />
(Round Trip Time), dar si cu valori diferite ale largimii de banda, pana<br />
la 2 Mb/s sau mai mult.</p>
<p>2.2. Cum functioneaza?</p>
<p>Sa ne imaginam o cale ca aceasta:</p>
<p>||||||    S A T E L I T   ||||||||<br />
/                       /|\<br />
Downl             /                         |      Upload<br />
load             /                          |      de la<br />
la              /(4)                        | (3)  server<br />
client         /                            |<br />
/                             |<br />
SatCard(antena parabolica)                  |<br />
|                              |<br />
\|/                             |<br />
PC &#8212;-adreseaza cerere&#8212;&#8211;&gt; SAT-SERVER&lt;&#8212;extragere&#8212;&gt; INTERNET<br />
(1)                               (2)</p>
<p>In primul rand facem cererea (1) folosind conexiunea noastra<br />
Internet catre Sat-SERVER, acesta va extrage informatiile din Internet (2)<br />
si le va trimite catre satelit (3); in final vom receptiona datele de la<br />
satelit (4) folosind o antena parabolica si cardul DVB pentru satelit.</p>
<p>Tipic exista 2 tipuri de cereri:</p>
<p>- http<br />
- ftp</p>
<p>Ambele au un flux mic de date pentru cerere si un volum mare de date<br />
pentru raspuns, asa ca satelitii lucreaza bine cu acestea, dar cu un<br />
timp mai mare de raspuns. Aceasta este cea mai mare problema a conexiunior<br />
prin satelit (ganditi-va la o distanta tipica la care orbiteaza satelitii<br />
de cca 36000 km, asa incat veti avea un timp de acces de [ 36000<br />
km / 300.000 km/s = 0.120 s = ] 120 ms pe care trebuie sa le adaugati de<br />
la conexiunea clasica la Internet de doua ori pentru ca ISP-ul trimite odata<br />
catre satelit iar clientul descarca de la satelit).</p>
<p>ISP-uri recente permit clientilor utilizarea si a altor servicii, ca:</p>
<p>-chat<br />
-email<br />
-news<br />
si multe altele</p>
<p>Exita asa numitele servicii one-way (monosens), care constau in servicii<br />
de mail, download la cerere (unde faceti rezervari de fisiere)<br />
si site-download; aceste servicii sunt off-line (neconectate), asa incat<br />
le puteti accesa fara modem, sau alt fel de conexiuni.</p>
<p>2.3. Alte tehnologii</p>
<p>Trebuie sa amintim si alte tehnologii satelitare: conexiunuea<br />
dublu-sens (2-way). Acestea folosesc antena parabolica pentru conexiunea<br />
la Internet in ambele sensuri. Costa mult mai mult decat<br />
cele monosens. Asteptam mai multe in aceasta directie in vitorul apropiat,<br />
la momentul actual permit o largime de banda de 4 Mb/s la download si 256k<br />
la upload.</p>
<p>2.4. Care este largimea de banda maxima?</p>
<p>Depinde de multi factori: scopul ISP-ului, parametrul TCP window folosit,<br />
aplicatiile folosite de clienti, si mai important decat toate,<br />
&#8220;Congestia internet&#8221;. Va puteti astepta la o largime de banda maxima<br />
de 1-4Mb/s si o medie de 10-30KBytes/s dar, repet, depinde de multi alti<br />
factori.</p>
<p>Oricum, unele ISP-uri (Furnizori de Servicii Internet) pretind ca<br />
va asigura &#8220;largime de banda maxima&#8221;, in timp ce media largimii de banda<br />
poate fi mult mai mica, datorita congestiilor dintre ISP-uri.</p>
<p>Alte ISP-uri va garanteaza largimea de banda minima, ceea ce are o inteles<br />
decat cea maxima, pentru ca este disponibila tot timpul.</p>
<p>Va rugam consultati Anexa A pentru a afla mai multe despre obtinerea<br />
unor performante mai bune la download.</p>
<p>2.5. Cat costa ?</p>
<p>Noi am distins intre costurile hardware (ale echipamentelor)<br />
si costurile conturilor. Primele sunt cunoscute, in timp ce ultimele<br />
depind de ce servicii alegeti (garantate/negarantate, largime de banda<br />
maxima).</p>
<p>2.5.1. Costurile hardware</p>
<p>Pentru a instala micul nostru sistem satelit avem nevoie de :</p>
<p>1. Cardul de acces<br />
2. Antena parabolica<br />
3. Unul sau mai multe convertoare (LNC-uri, LNB-uri)</p>
<p>trebuie utilizat un convertor digital pentru accesul Internet via satelit</p>
<p>Cardurile DVB costa intre 200$-300$ depinde de marca<br />
Antena parabolica costa 50$<br />
Convertorul LNB costa aproximativ 50$</p>
<p>Deci avem aproape 3-400$ costuri hardware (poate vreti sa adaugati<br />
si costurile instalarii !!)</p>
<p>2.5.2. Costurile conturilor</p>
<p>Aici costurile depind de ce va ofera ISP-ul , care este largimea de banda,<br />
daca exista largimi de banda garantate (care sunt mai importante decat<br />
largimile maxime de banda), ce servicii puteti accesa, si asa mai departe.</p>
<p>Unele ISP-uri va ofera acces gratuit in schimbul vesnicei vizualizari a<br />
unui banner (pe care nu il puteti minimiza), in acest caz veti plati<br />
atunci cand veti cumpara ceva prezentat in banner.</p>
<p>Tipic, costurile conturilor se ridica la 100-150$ pe an pentru servicii<br />
&#8220;negarantate&#8221; si 4-600$ sau mai mult pentru servicii &#8220;garantate&#8221; (va<br />
garanteaza o largime de banda minima pe care o puteti folosi in momente de<br />
congestie, evident congestii intre ISP-uri satelitare), cand ati &#8220;iesit&#8221;<br />
catre Internet, nimeni nu va mai poate garanta nimic.</p>
<p>2.6. Care sunt satelitii utilizati?</p>
<p>Cand discutam de sateliti, ne referim la: Astra (19.2 grade SE), Hotbird<br />
(13.2 grade SE), noul Europestar (45 grade SE), Eutelsat (8 grade<br />
SV), Astra (26 E), Arabsat 3A (26E).</p>
<p>2.7. Ce ISP-uri ofera servicii Internet prin satelit?</p>
<p>In Europa cunoastem circa 8 ISP-uri care ofera acces Internet prin satelit:</p>
<p>1. EuropeOnLine &#8211; EON &lt;http://www.europeonline.net&gt;</p>
<p>2. Netsystem &lt;http://www.netsystem.com&gt;</p>
<p>3. Starspeeder &lt;http://www.starspeeder.com&gt;</p>
<p>4. Sat Node &lt;http://www.satnode.com&gt;</p>
<p>5. Eliosat &lt;http://www.eliosat.com&gt;</p>
<p>6. Falcon Stream  &lt;http://www.falconstream.com&gt;</p>
<p>7. SkyDSL &lt;http://www.skydsl.com&gt;</p>
<p>8. OpenSky &lt;http://www.opensky.it&gt;</p>
<p>9. DirecPC &lt;http://www.direcpc.com&gt; dar acesta foloseste un<br />
card propietar (este unul dintre primele ISP-uri de acest tip)</p>
<p>EON ofera acces pentru aproximativ 150$ pe an fara largime<br />
de banda garantata.</p>
<p>Netsystem ofera servicii la costuri nule, trebuie doar sa ii &#8220;suportati&#8221;<br />
bannerele.</p>
<p>StarSpeeder ofera acces ???</p>
<p>Eliosat costa 350$ pe an cu 128k/s garantat (servicii minime, vedeti<br />
site-ul web pentru mai multe informatii); pe langa aceasta, ofera si<br />
tehnologia dublu-sens pentru a transmite si receptiona flux de date.</p>
<p>SkyDSL ofera acces pentru aproximativ 15$ pe luna cu 128k/s largime de<br />
banda, dar permite largimi de banda mai mari pentru fiecare Mb downloadat<br />
pe care il platiti (puteti selecta de la 256k la 4Mb/s),<br />
pentru mai multe informatii vizitati site-ul web.</p>
<p>IMPORTANT: inainte de a va inregistra la vreunul dintre aceste servicii,<br />
verificati aria de acoperire si diametrul necesar al antenei parabolice.</p>
<p>2.8. Altceva ?</p>
<p>Cu orice fel de card DVB puteti deasemeni receptiona si canale TV<br />
digitale (doar cele gratuite), iar unele carduri au suport<br />
pentru interfata comuna de decriptare a canalelor codate.</p>
<p>Urmeaza schema:</p>
<p>Smart-Card -&gt; CAM -&gt; Interfata Comuna -&gt; Sat Card (cu suport C.I.)</p>
<p>Cardul CAM (sunt multe standarde folosite pentru decriptare: SECA, IRDETO,<br />
VIACCESS si altele) este dispozitivul care permite decriptarea (pentru TV,<br />
RADIO si date), in timp ce Interfata Comuna sau C.I. (ETSI EN<br />
50221) permite conectarea intre CAM si cardul pentru satelit.</p>
<p>3. Informatii tehnice</p>
<p>Acum vom incerca sa intelegem cum functioneaza si in ce conditii, conexiunile<br />
prin satelit.</p>
<p>Ne putem imagina legatura prin satelit ca o legatura fara fir<br />
clasica, radio (wireless), intelegand prin asta o legatura intre<br />
doua sisteme care nu folosesc un cablu pentru a comunica.</p>
<p>Legaturile fara fir sunt foarte diferite de cele cablate pentru ca<br />
exista anumite probleme aditionale de rezolvat cum ar fi sensibilitatea,<br />
problemele legate de securitate, s.a. Pot aparea si alte probleme legate<br />
de vreme, in special in conditii de ploaie sau ninsoare.</p>
<p>Oricum, trebuie sa avem in vedere primul principiul al legaturilor fara<br />
fir: vizibilitate directa libera de obstacole, care este IMPERATIVA si<br />
fara de care nu putem comunica. Pentru mai multe informatii,<br />
consultati documentul Wireless-HOWTO.<br />
&lt;http://www.fatamorgana.com/bertolinux/&gt; .</p>
<p>In conexiunile prin satelit folosim un tip special de antena, o antena<br />
parabolica, care ne confera un castig mare la receptie, necesar pentru a<br />
receptiona semnalul de la satelit. De fapt, satelitul are o orbita<br />
geostationara la 36.000 km si singurul tip de antena pe care<br />
il putem utiliza este antena parabolica.</p>
<p>3.2. Frecvente</p>
<p>Frecventele pe care le receptionam sunt de la 11Ghz la 12.7Ghz (de<br />
la transponderul satelitului, emitatorul care ne trimite<br />
date), o frecventa foarte inalta, dar fedderul (convertorul,<br />
LNB-ul din centrul antenei parabolice) converteste acest semnal la<br />
1-2Ghz asa incat putem trimite semnalul la receptor prin cablu (pana la<br />
40m, depinde de pierderile cablului).</p>
<p>3.3. Cardul receptor DVB</p>
<p>1 GHz Signal &#8211;&gt; |RX|&#8211;&gt; |ADC| &#8211;&gt; |Low Level Network| &#8211;&gt; |O.S.TCP/IP Stack<br />
|____________________________________|<br />
DVB Card</p>
<p>Acum ne putem imagina un receptor clasic la 1Ghz receptionand semnale<br />
analogice de la satelit, convertindu-le in semnale digitale si livrandu-le<br />
catre nivelul de retea (ISO OSI 1,2): aici, codul firmware din<br />
card genereaza pachete pe doua nivele (cam ca ethernet) pentru a<br />
fi trimise catre pc-ul nostru cu linux, windows, sau alt sistem,<br />
in final vom transforma aceste date in pachete TCP/IP.</p>
<p>3.4.Configurarea nivelului legaturii de date DVB</p>
<p>Aici avem de facut cateva setari la chiar la cartela DVB:</p>
<p>1. Frecventa de lucru, trebuie sa setam frecventa satelitului (ca in<br />
reviste): este intre 11.8Ghz si 12.8Ghz de exemplu 12640000 Khz.</p>
<p>2. Rata simbolurilor, masurata in simboluri pe secunda, tipic 22 MS/s<br />
(mega simboluri pe secunda)</p>
<p>3. Polarizarea, care este o setare a antenei, configurabila din software:<br />
valorile posibile sunt H (orizontal) si V (vertical).</p>
<p>4. PID-urile. PID-ul este folosit pentru a selecta o transmisiune dintre<br />
mai multe semnale ale aceleiasi frecvente.</p>
<p>5. Trebuie sa specificam si masca filtrului de biti care ne indica cat<br />
de mare este grupul adreselor MAC destinatie (masca bitfilter este<br />
similara netmaskului TCP/IP, singura diferenta este ca masca bitfilter<br />
este pe 48 de biti, iar netmaskul TCP/IP este pe 32 biti. Intotdeauna,<br />
datele Internet sunt transmise cu PID unicast, in timp<br />
ce iformatiile video sunt transmise folosind PID multicast.</p>
<p>6. Calcularea adresei MAC: aici specificam care va fi adresa MAC a<br />
cardului DVB. Trebuie facut acest lucru pentru ca unele ISP-uri folosesc<br />
un algoritm (vezi anexa A pentru mai multe informatii) care va calculeaza<br />
adresa MAC din adresa IP, alte ISP-uri folosesc propria dumneavoastra<br />
adresa MAC.</p>
<p>3.5 Functionarea TCP/IP</p>
<p>Cum am aratat in sectiunea 2.2, trebuie sa facem o cerere folosind<br />
interfata modem (de exemplu ppp0 sau orice alta interfata pe<br />
care o folosim pentru a comunica cu Internetul), apoi raspunsul se<br />
va intoarce la interfata noastra DVB (dvb0).</p>
<p>Sistemele de operare moderne ne permit sa receptinam datele printr-o<br />
interfata de intrare diferita de cea prin care am facut cererea.<br />
Pentru a face aceasta, e nevoie sa dezactivam controlul fluxului<br />
pentru unele pachete, ca de exemplu cu comanda:</p>
<p>echo &#8221; 0&#8243; &gt; /proc/sys/net/ipv4/conf/dvb0/rp_filter (pentru Linux).</p>
<p>3.6. Autentificarea</p>
<p>Ramane doar un singur lucru de completat in descrierea noastra: metoda de<br />
autentificare.</p>
<p>Unele ISP-uri prin satelit folosesc asa-numita &#8220;autentificare prin proxy&#8221;:<br />
cand folositi proxy-ul lor, trebuie sa indicati un nume de login si o<br />
parola pentru a continua cererea (trebuie initial sa va inregistrati cu un<br />
cont pentru a folosi serviciile lor prin satelit): odata facuta aceasta,<br />
ISP-ul foloseste adresa IP a dumneavoastra pentru a calcula<br />
adresa MAC (vezi anexa A) catre care va trimite raspunsul.</p>
<p>Alte ISP-uri va cer sa configurati o conexiune VPN intai (folosind login-ul<br />
si parola dumneavoastra), apoi vor controla contul cu care sunteti<br />
inregistrat (cand extrag adresa MAC) apoi vor trimite datele catre (si<br />
numai) cardul dvs. DVB (adresa MAC).</p>
<p>Oricum, sa aveti in vedere ca puteti modifica valoarea filtrului DVB<br />
pentru a fi capabil sa receptionati ORICE adresa MAC (raportata la o<br />
frecventa data).</p>
<p>3.7 Servicii pe care le pot folosi cu o conexiune prin satelit</p>
<p>Tipic, serviciile pe care le puteti folosi cu o conexiune prin satelit<br />
depind de tipul de autentificare folosit de ISP.</p>
<p>- cu clasica &#8220;autentificare proxy&#8221; puteti folosi doar serviciile HTTP<br />
si FTP<br />
- cu conexiunea VPN nu aveti (in principiu) nici o restrictie<br />
la serviciile pe care le puteti folosi, singura limita este definita<br />
de RTT (Timpul de acces) la satelit, aproximativ 500-1000ms in medie, asa<br />
ca uitati de &#8220;voce&#8221; sau alte servicii in timp real !! <img src='http://resurse-educationale.uv.ro/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> (( Vedeti<br />
documentul VoIP-HOWTO.<br />
&lt;http://www.fatamorgana.com/bertolinux&gt;<br />
pentru mai multe informatii. Oricum, puteti totusi utiliza mail, chat,<br />
telnet, ping, dns, si asa mai departe.</p>
<p>4. Cerinte</p>
<p>4.1 Cerinte privind cunostintele</p>
<p>Pentru aceste incercari aveti nevoie de ceva experienta in comunicatii<br />
Internet si retele (continute in Net-HOWTO &lt;http://www.linuxdoc.org/HOWTO/Net-<br />
HOWTO/index.html&gt; ) si o oarecare experienta practiva privind antenele<br />
parabolice si sistemele pentru satelit (ar trebui sa stiti sa va orientati<br />
antena, unghiurile corecte)</p>
<p>4.2 Hardware</p>
<p>Avem nevoie de:</p>
<p>1. Antena parabolica, de la un sistem analogic</p>
<p>2. Convertorul digital sa fie plasat in centrul antenei (LNB digital)</p>
<p>3. Cardul receptor compatibil DVB</p>
<p>4. Un PC cu care sa va conectati</p>
<p>4.3 Software</p>
<p>Aici aveti nevoie de :</p>
<p>1. Drivere pentru cardul DVB pentru a functiona sub sistemul dvs. de<br />
operare (Linux, Windows sau altele)</p>
<p>2. Setarile corecte</p>
<p>3. Aplicatii externe, in anumite cazuri,ca si client VPN-PPTP pentru<br />
ISP-uri ca Netsystem sau StarSpeeder</p>
<p>Pentru soft de Linux, puteti gasi drivere pentru Siemens DVB la Linux<br />
TV Project &lt;http://www.linuxtv.org&gt; .</p>
<p>4.4. Software TV</p>
<p>Tot astfel, exista software video pentru implementarea receptiei TV:</p>
<p>4.4.1 Sub Windows</p>
<p>1. MultiDec MultiDec 6.6b<br />
&lt;http://www.erkner.com/free/digi/MultiDec66b.zip&gt; (sursa gratuita<br />
si cod)</p>
<p>2. TPREdit TPREdit &lt;http://come.to/uhura&gt; (pentru Technotrend)</p>
<p>3. WinTV DVBs Hauppauge &lt;http://www.hauppauge.de/software.htm&gt; sau<br />
Technotrend &lt;http://www.technotrend.de&gt; (pentru cardurile compatibile<br />
Siemens, Hauppauge, Technotrend, Technisat, etc&#8230; )</p>
<p>4. WinDVB2000 WinDVB2000 &lt;http://www.odsoft.org/english.html&gt; (circa<br />
19$).</p>
<p>4.4.2. Sub Linux</p>
<p>1. gVideo &#8211; aplicatie inclusa in driverul SIemens</p>
<p>2. Vdr Video Recorder (bun si pentru urmarit TV)</p>
<p>5. Configurarea echipamentului</p>
<p>5.1. Montarea</p>
<p>Primul lucru de facut este montarea antenei parabolice;</p>
<p>Dupa care trebuie sa o orientam (cautarea unghurilor corecte din diverse<br />
reviste de specialitate): unghiurile sunt intotdeauna specificate de la sud<br />
la est sau la vest pentru cele orizontale si de la sol catre linia<br />
satelitului pentru cele verticale. Unealta clasica de orientare este<br />
compasul.</p>
<p>5.2. Calibrarea</p>
<p>Cum putem sti daca ne-am orientat corect?</p>
<p>Dupa ce am stabilit plaja corecta de unghiuri, trebuie sa o ajustam masurand<br />
nivelul de putere. Pentru aceasta putem</p>
<p>1. folosi de expemplu un receptor analogic (care este compatibil<br />
cu convertorul digital) si sa trecem la cautarea unghiului corect.<br />
Cand putem vedea imagine, inseamna ca l-am gasit. Va sugerez sa folositi<br />
un convertor analogic pentru ca, poate aveti unul (pe care l-ati folosit<br />
la o instalare anterioara) si pentru ca este mult mai simplu de calibrat<br />
decat unul digital.</p>
<p>2. Folosit un instrument de masurare a puterii (vreo 20$) cu indicator<br />
secvential (la putere maxima, toate ledurile se aprind).</p>
<p>5.3. LNB-uri duble</p>
<p>Puteti de asemeni sa folositi LNB-uri duble (unii comercianti vand<br />
kituri complete cu distante standard de receptie,<br />
de exemplu Astra (19.2 SE) cu Eutelsat (16 SE) sau cu Hotbird (13 SE).</p>
<p>Pentru montaj trebuie sa aveti in vedere, tot odata, ca satelitii sunt<br />
in directii opuse ale convertorilor, ca in figura:</p>
<p>SAT1                 SAT2<br />
\                 /<br />
\               /<br />
\   C1   C2   /<br />
\    \    \ /    /     /<br />
\    \   / \   /     /<br />
\____\ /___\ /_____/</p>
<p>Vedere de sus</p>
<p>C1 receptioneaza de la SAT2<br />
C2 receptioneaza de la SAT1</p>
<p>5.4. Reglajul nivelului legaturii de date</p>
<p>Odata ce am obtinut semnalul analog, trebuie sa ajustam receptorul<br />
nostru pe frecventa, PID-ul, rata de simboluri corecta, samd.</p>
<p>Prezint aici un exemplu de configurare pentru EON (EuropeOnline),<br />
transponderul 114 pe satelitul Astra (19.2 SE)</p>
<p>Frecventa: 12640 MHz</p>
<p>Polarizarea: V (Vertical)</p>
<p>Symbol Rate: 22000 KS/s</p>
<p>PID:</p>
<p>·  Unicast: 512 (decimal), 0&#215;200 (hexadecimal)</p>
<p>·  Multicast: 785, 786, 1041 (decimal), 0&#215;311, 0&#215;312, 0&#215;411<br />
(hexadecimal), dar sa aveti in vedere ca, in multe cazuri, Multicast<br />
PID sunt alocate automat.</p>
<p>Mai avem nevoie de o informatie: ce adresa MAC sa ii alocam cardului DVB</p>
<p>Din nou, pentru EON (EuropeOnline) trebuie sa consultati anexa A<br />
pentru a calcula adresa MAC din adresa IP dinamica.</p>
<p>Evident, aveti nevoie de login si de parola pentru respectivul<br />
serviciu ISP</p>
<p>6. Configurarea sub Linux</p>
<p>In aceasta sectiune vom presupune ca folosim un card Siemens compatibil,<br />
cum ar fi un card Hauppage WinTV DVB, pentru astfel de carduri<br />
gasiti drivere la &lt;http://www.linuxtv.org/download/dvb&gt; sau DVB PCI card<br />
sub Linux &lt;http://www2.arnes.si/~mthale1/index.html &gt; .</p>
<p>6.1.Instalarea driverelor</p>
<p>Odata descarcate driverele, trebuie sa desfacem arhiva tar intr-un<br />
director, intram in director si dam comanda &#8220;make&#8221; si &#8220;make insmod&#8221;.<br />
Pentru aceasta, trebuie sa aveti sursele kernelului curent in directorul<br />
/usr/src/linux (sau le descarcati de la http://www.kernel.org<br />
&lt;http://www.kernel.org&gt; si le recompilati.</p>
<p>Dupa comanda &#8220;make insmod&#8221;, sistemul dumneavoastra ar trebui sa aiba<br />
modulele DVB incarcate. Pentru a le descarca, dati comanda &#8220;make rmmod&#8221;.</p>
<p>6.2. Configurarea fisierului /etc/dvbd.conf</p>
<p>Fisierul /etc/dvbd.conf este folosit pentru a configura<br />
parametrii legaturii de date pentru cardul DVB. Aici sunt setarile<br />
principale:</p>
<p>- &#8220;power&#8221; indica puterea pentru LNB, 1=ON, 0=off. De obicei o veti seta<br />
1, doar daca nu folositi vreun fel de cascadare intre mai multe LNB-uri</p>
<p>- &#8220;symbolrate&#8221;, aceasta este rata simbolurilor pe secunda, de obicei<br />
22.000.000</p>
<p>- &#8220;frequency&#8221; , frecventa la care se receptioneaza datele, cum ar fi<br />
12.640.000</p>
<p>- &#8220;ttk&#8221; , semnalul de 22khz, aproape intotdeauna 1</p>
<p>- &#8220;diseqc&#8221;, folosit pentru controlul discriminarii, doar daca folositi<br />
un discriminator pentru controlul mai multor LNB-uri, 0 daca nu e cazul</p>
<p>- &#8220;AFC&#8221; de obicei 1</p>
<p>- &#8220;polarization&#8221;, 1 pentru orizontal, 0 pentru vertical.</p>
<p>- &#8221; filter_n &lt;PID&gt; &lt;MAC&gt; &lt;BITFILTER&gt;&#8221;, unde n este 0 pentru Unicast si<br />
1-9 pentru Multicast; PID este exprimat in forma decimala, MAC<br />
este adresa MAC valida doar pentru filtrul Multicast, iar BITFILTER este<br />
numarul ai carui biti reprezinta bytes pentru masca ((de exemplu<br />
10 = 2 (bit 1) + 8 (bit 3), asa ca masca va fi 00 00 FF 00 FF 00).</p>
<p>Exemplu:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p># DVB receiver configuration file, (c) 2000 data planet international</p>
<p># standard location in /etc</p>
<p># LNB power on=1/off=0</p>
<p>power 1</p>
<p># symbol rate [symbol/sec]</p>
<p>symbolrate 22000000</p>
<p># ASTRA TR 114</p>
<p>frequency 12640000</p>
<p># 22 kHz signal on=1/off=0</p>
<p>ttk 1</p>
<p># diseqc on=1/off=0</p>
<p>diseqc 0</p>
<p># AFC on=1/off=0</p>
<p>AFC 1</p>
<p># polarisation H=1/V=0</p>
<p>polarisation 1</p>
<p># settings for MPE filter, PID and MAC filtering, valid MAC bytes</p>
<p>filter_0 512</p>
<p>filter_1 785 00:D0:5C:1E:96:01 48</p>
<p>filter_2 786 00:D0:5C:1E:96:01 48</p>
<p>filter_3 1041 00:D0:5C:1E:96:01 48</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>filter_0 nu are valori nici pentru MAC si nici pentru bitfilter pentru<br />
ca adresa MAC potrivita este calculata din adresa IP (anexa A). Vom vedea<br />
ca aceste setari sunt in regula numai pentru anumite ISP-uri,<br />
pentru altele, va trebui sa modificam fisierul dvbd.c</p>
<p>6.3 Daemonul dvbd</p>
<p>Odata ce fisierul /etc/dvbd.conf este OK, puteti lansa aplicatia<br />
dvbd care, executata fara optiunea -d scrie catre stdout nivelul calitatii<br />
semnalului.</p>
<p>- Sync TREBUIE sa fie 127 sau pe-aproape</p>
<p>- Vber TREBUIE sa fie 0</p>
<p>doar daca nu cumva aveti o receptie slaba de la satelit (verificati cablul<br />
si orientarea antenei)</p>
<p>Nota:</p>
<p>S-ar putea sa trebuiasca schimbat in dvbd.h aceasta linie:</p>
<p>#define network_device &#8220;eth0&#8243;</p>
<p>cu</p>
<p>#define network_device &#8220;ppp0&#8243;</p>
<p>functie de ce interfata utilizati pentru a comunica cu Internetul,<br />
eth0 sau ppp0, dati comanda &#8220;make&#8221; pentru a updata fisierul binar si<br />
restartati dvbd.</p>
<p>6.4. Cum se configureaza serviciul EON (Europe Online)</p>
<p>Acum, daca aveti semnal bun, puteti incerca sa folositi un<br />
serviciu Internet prin satelit.</p>
<p>Pentru EuropeOnline mergeti la setarea &#8220;proxy&#8221; din Netscape si setati la<br />
HTTP si FTP:</p>
<p>proxy.xxx.europeonline.net</p>
<p>si, in &#8220;port&#8221; 8080 si FTP proxy cu &#8221; port&#8221; 8090.</p>
<p>unde xxx este numarul transponderului (103,113,114 sau 115) pe care il<br />
folositi (vedeti anexa B pentru mai multe informatii).</p>
<p>Acum va trebui sa puteti naviga cu browserul oriunde doriti&#8230;</p>
<p>Pentru a partaja serviciile EuropeOnline cu mai multi clienti, va trebui<br />
sa folositi proxy-ul Squid &lt;http://www.squid-cache.org&gt;, activand<br />
cascadarea catre proxy-ul EON.</p>
<p>Pentru o mai complexa utilizare EON, cum ar fi o mai complexa cascadare a<br />
proxy-urilor sau partajarea cu clientii, consultati EON Linux Masquerading<br />
FAQ &lt;http://obiwan.hvrlab.org/~faz/eon/eon_masq.html&gt;</p>
<p>6.5. Cum se configureaza serviciul Netsystem</p>
<p>Serviciul NetSystem este ceva mai complicat decat EON sub Linux, caz<br />
in care, mai trebuie configurate:</p>
<p>1. conexiunea VPN</p>
<p>2. patch-ul pentru pppd (doar daca pppd &lt;=2.4.0)</p>
<p>3. setarile de routere cu fisiere exemplu</p>
<p>4. patch-ul pentru dvbd.c</p>
<p>5. testarea</p>
<p>6. imbunatatirea performantelor</p>
<p>7. partajarea conexiunii NetSystem cu mai multi clienti</p>
<p>6.5.1 Conexiunea VPN</p>
<p>In primul rand trebuie sa descarcati aplicatia client VPN PPTP<br />
&lt;http://cag.lcs.mit.edu/~cananian/Projects/PPTP/&gt;</p>
<p>Dupa desfacerea arhivei tar, compilare si instalare, trebuie sa<br />
adaugati o intrare in fisierul /etc/ppp/pap-secrets si /etc/ppp/chap-secrets:</p>
<p>&#8221; login&#8221; * &#8221; password&#8221; *</p>
<p>unde &#8220;login&#8221; si &#8220;password&#8221; sunt cele cu care v-ati inregistrat la NetSystem<br />
&lt;http://css.netsystem.com&gt;</p>
<p>6.5.2 Patch-ul pentru pppd</p>
<p>Asa cum se arata in descrierea PPTP &lt;http://www.sigpipe.org/~me/vpn/pptp.html&gt;<br />
trebuie sa patch-uiti demonul pppd pentru a suporta conexiunile cu serverul<br />
VPN NetSystem (server Linux).</p>
<p>Trebuie sa:</p>
<p>1. Descarcati o versiune recenta de pppd<br />
&lt;ftp://cs.anu.edu.au/pub/software/ppp/&gt;</p>
<p>2. Descarcati si dezarhivati patch-ul corespondent pentru pppd<br />
&lt;ftp://ftp.binarix.com/pub/ppp-mppe/&gt;</p>
<p>3. dezarhivati pppd intr-un director</p>
<p>4. dati comanda &#8220;patch -p0 &lt; nume_patch</p>
<p>5. intrati in directorul pppd</p>
<p>6. dati comanda &#8220;make&#8221; si &#8220;make install&#8221;</p>
<p>6.5.3. Setarile de routare</p>
<p>Acum pppd va fi capabil sa lucreze cu VPN-ul NetSystem. Puteti incerca cu</p>
<p>&#8221; pptp vpn.netsystem.com debug user &lt;login&gt;&#8221;</p>
<p>unde &#8220;login&#8221; este numele de login al contului dvs de la NetSystem;<br />
veti vedea in /var/log/messages informatii de depanare de la interfata ppp1</p>
<p>Daca totul e OK ar trebui sa vedeti interfata ppp1 cu comanda &#8220;ifconfig&#8221;</p>
<p>Daca totusi aveti probleme cu atentificarea, adaugati &#8220;noauth&#8221; in fisierul<br />
/etc/ppp/options</p>
<p>Odata ce interfata ppp1 a pornit, va trebui sa treceti la urmatoarele:</p>
<p>1. dati comanda &#8220;ifconfig ppp1&#8243; si cautati adresa IP din dreapta<br />
sirului &#8220;P-t-P:&#8221; (o voi numi in continuare IP)</p>
<p>2. stergeti-o din tabela de routare cu &#8220;route de IP&#8221;</p>
<p>3. adaugati-o la interfata ppp0 cu &#8220;route add IP dev ppp0&#8243;</p>
<p>4. stergeti gateway-ul implicit din ppp0 cu &#8220;route del default&#8221;</p>
<p>5. adaugati gateway implicit pentru ppp1 cu &#8220;route add default dev ppp1&#8243;</p>
<p>Punctele 1-3 sunt necesare pentru ca interfetele punct-la-punct sunt<br />
administrate sub linux, adaugand gateway-ul la noua interfata (ceea ce<br />
nu e o idee buna in cazul de fata, doar daca nu vreti sa<br />
obtineti o bucla infinita, caz in care pachetul va circula la infinit,<br />
icapsulandu-se in sine insusi <img src='http://resurse-educationale.uv.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ))</p>
<p>Punctele 4-5 sunt necesare pentru a face toate cererile de<br />
date catre ppp1, adica vom avea contact cu lumea folosind conexiunea<br />
VPN, aceasta nefiind solutia optima in anumite conditii, de exemplu pentru<br />
interogarile DNS care ar putea fi trimise direct, pentru a evita<br />
intarzierile prin satelit inutile.</p>
<p>In loc sa configurati manual rutarea, puteti incerca acest script:</p>
<p>&#8221; netsystem.on&#8221; script</p>
<p>______________________________________________________________________<br />
route add IP_DNS1 dev ppp0<br />
route add IP_DNS2 dev ppp0<br />
route add -net 212.31.242.0 netmask 255.255.255.0 dev ppp0<br />
pptp vpn.netsystem.com user &lt;login&gt;<br />
/bin/sleep 5<br />
route add default dev ppp1<br />
______________________________________________________________________</p>
<p>&#8221; netsystem.off&#8221; script</p>
<p>______________________________________________________________________<br />
route del IP_DNS1 dev ppp0<br />
route del IP_DNS2 dev ppp0<br />
route del -net 212.31.242.0 netmask 255.255.255.0 dev ppp0<br />
kill -9 &#8216;s x|grep &#8220;pppd&#8221;|grep &#8220;&lt;login&gt;&#8221;|grep -v &#8220;ps&#8221;|tr &#8221; &#8221; &#8220;\n&#8221;|head -n<br />
rm &#8211;force /var/lock/LCK..tty*<br />
rm &#8211;force /var/run/pptp/*<br />
route del -net 212.31.242.0 netmask 255.255.255.0 dev ppp0<br />
kill -9 &#8216;s x|grep &#8220;pppd&#8221;|grep &#8220;&lt;login&gt;&#8221;|grep -v &#8220;ps&#8221;|tr &#8221; &#8221; &#8220;\n&#8221;|head -n<br />
rm &#8211;force /var/lock/LCK..tty*<br />
rm &#8211;force /var/run/pptp/*<br />
rm &#8211;force /var/run/ppp1.pid<br />
killall -9 pptp<br />
______________________________________________________________________</p>
<p>IP_DNS1 si IP_DNS2 sunt adresele IP ale serverelor dumneavoastra DNS<br />
(primar si secundar), &lt;login&gt; este numele de login al contului<br />
dvs. Netsystem. L-am incercat sub kernelul 2.4.6 Redhat 7.1 si<br />
functioneaza foarte bine (fara nici un fel de probleme legate de bucla<br />
infinita ppp1 sau altele asemenea).</p>
<p>Aceasta linie ;</p>
<p>kill -9 &#8216;s x|grep &#8220;pppd&#8221;|grep &#8220;&lt;login&gt;&#8221;|grep -v &#8220;ps&#8221;|tr &#8221; &#8221; &#8220;\n&#8221;|head<br />
-n 2&#8242;</p>
<p>este folosita pentru a identifica PID procesului pppd care &#8220;discuta&#8221;<br />
cu serverul VPN (interfata ppp1); notati ca nu puteti da comanda<br />
&#8220;killall pppd&#8221;  pentru ca ati inchide si interfata ppp0</p>
<p>6.5.4 Patch-ul pentru dvbd.c</p>
<p>Dupa rezolvarea problemelor legate de PPTP trebuie sa modificati<br />
cateva linii in dvbd.c , in apropiere de finalul fisierului:</p>
<p>if (strcmp (v, &#8220;filter_0&#8243;) == 0) { if (s != NULL) { unsigned char ip[4];<br />
dvbcfg[0].status = ON ;<br />
dvbcfg[0].filter.data[0] = 0x3eff ;<br />
dvbcfg[0].filter.pid = (__u16) atoi (s) ;<br />
dvbcfg[0].filter.mode = 0x0c ;<br />
if (ipget (ip, network_device)) { fprintf(stderr,&#8221;Can&#8217;t get local ip address.<br />
syslog (LOG_NOTICE, &#8220;Local ip is %u:%u:%u:%u\n&#8221;, ip[0], ip[1],ip[2], ip[3]);<br />
dvbcfg[0].filter.data[1] = (ip[3] &lt;&lt; 8) | 0x00ff ;<br />
dvbcfg[0].filter.data[2] = (ip[2] &lt;&lt; 8) | 0x00ff ;<br />
dvbcfg[0].filter.data[6] = (ip[1] &lt;&lt; 8) | 0x00ff ;<br />
dvbcfg[0].filter.data[7] = (ip[0] &lt;&lt; 8) | 0x00ff ;<br />
dvbcfg[0].filter.data[8] = (0&#215;02 &lt;&lt; 8) | 0x00ff ;<br />
dvbcfg[0].filter.data[9] = (0&#215;00 &lt;&lt; 8) | 0x00ff ;<br />
setmac (ip) ; }<br />
else { dvbcfg[1].status = OFF ; } }</p>
<p>Urmatoarele linii:</p>
<p>dvbcfg[0].filter.data[1] = (ip[3] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[2] = (ip[2] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[6] = (ip[1] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[7] = (ip[0] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[8] = (0&#215;02 &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[9] = (0&#215;00 &lt;&lt; 8) | 0x00ff ;</p>
<p>vor fi inlocuite cu:</p>
<p>dvbcfg[0].filter.data[1] = (MAC[5] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[2] = (MAC[4] &lt;&lt; 8) | 0x00ff;</p>
<p>dvbcfg[0].filter.data[6] = (MAC[3] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[7] = (MAC[2] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[8] = (MAC[1] &lt;&lt; 8) | 0x00ff ;</p>
<p>dvbcfg[0].filter.data[9] = (MAC[0] &lt;&lt; 8) | 0x00ff ;</p>
<p>Unde MAC[0]:MAC[1]:MAC[2]:MAC[3]:MAC[4]:MAC[5] sunt adresele noastre MAC<br />
(conform contului Netsystem).</p>
<p>Dupa aceasta va trebui sa dati comanda &#8220;make&#8221; si noul dvbd va di creat.</p>
<p>NOTA: pentru a corecta cu succes dvbd.c trebuie sa folositi un driver dvb<br />
versiune &gt;=0.8.2 pentru ca versiunile mai vechi au probleme de<br />
instabiliate</p>
<p>6.5.5 Testarea</p>
<p>In final, putem testa Netsystem de sub Linux. Putem da o comanda<br />
&#8220;ping www.oricehostpingabil.com&#8221; si sa verificam timpul de raspuns. Ar<br />
trebui sa fie intre 400 si 2000 ms.</p>
<p>Daca mai aveti probleme, va trebui sa verificati daca e totul OK<br />
cu interfata VPN.</p>
<p>1. deschideti snifferul de retea preferat (de exemplu, Ethereal<br />
&lt;www.ethereal.net&gt; si incepeti sa analizati interfata ppp0 (nu ppp1 !!!)</p>
<p>2. dati un ping</p>
<p>Daca VPN-ul e ok, ar trebui sa vedeti 2 (poate 1) pachete incapsulate-GRE<br />
pe secunda. Daca nu vedeti nimic, VPN-ul nu merge corect. Opriti-l<br />
si porniti-l din nou.</p>
<p>6.5.6. Imbunatatirea performantelor</p>
<p>Odata ce ati pus la punct lucrurile, TREBUIE sa folositi (in special cu<br />
Netsystem) un download accelerator pentru a imbunatati performantele.<br />
Vedeti anexa A pentru mai multe informatii.</p>
<p>6.5.7 Partajarea Netsystem cu mai multi clienti</p>
<p>Pentru aceasta puteti activa IP Masquerading-ul, permitand clientilor sa<br />
foloseasca VPN ca o interfata Internet normala; principala problema<br />
este ca, conexiunea noastra prin satelit este foarte buna pentru<br />
download dar are performante slabe la navigarea in paginile web (sau<br />
alte servicii mai interactive decat download-ul).</p>
<p>Va puteti gandi la utilizarea proxy-ului Squid<br />
&lt;http://www.squid-cache.org&gt; sau Socks &lt;http://www.socks.nec.com/&gt;, dar nu<br />
veti rezolva problema pentru ca si acum toate cererile for fi trimise catre<br />
aceiasi interfata VPN.</p>
<p>Solutia este sa folositi 2 tabele de rutare, una folosind interfata directa<br />
de linie si cealalta interfata VPN. Asa ca puteti face cum urmeaza:</p>
<p>1. asigurati-va ca ati instalat comenzile &#8220;iproute2&#8243; (de pilda<br />
dati comanda &#8220;ip&#8221; in shell si verificati daca va spune ceva.<br />
Pentru mai multe informatii, consultati Linux 2.4 Advanced Routing HOWTO<br />
&lt;http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html&gt; .</p>
<p>2. asigurati-va ca ati pornit serviciile NetSystem si notati-va adresa<br />
IP a interfetei ppp1, pe care o vom numi acum LOCALIP.</p>
<p>3. tastati: &#8221; echo &#8221; 210 sat&#8221; &gt;&gt; /etc/iproute2/rt_tables&#8221; pentru a apela<br />
cat mai confortabil regula 210 pentru satelit</p>
<p>4. tastati: &#8221; ip rule add from LOCALIP table sat&#8221; , pentru a crea tabela<br />
&#8220;sat&#8221;</p>
<p>raportata la toate cererile venind de la adresa IP LOCALIP</p>
<p>5. tastati: &#8221; ip route add default dev ppp1 table sat&#8221;<br />
pentru a trimite toate cererile &#8220;sat&#8221; (vezi mai sus) catre interfata ppp1</p>
<p>6. daca folositi proxy-ul Socks &lt;http://www.socks.nec.com&gt; fiti siguri<br />
ca ati setat in sockd.conf &#8220;external&#8221; pentru LOCALIP</p>
<p>7. daca folositi proxy-ul Squid &lt;http://www.squid-cache.org&gt; fiti siguri<br />
ca ati setat in squid.conf &#8221; tcp_outgoing_address&#8221; ca LOCALIP</p>
<p>Odata ce ati facut toate acestea, veti observa ca aveti doua moduri de<br />
lucru: fara proxy, clientii for adresa cereri catre linia directa, iar<br />
in prezenta unui proxy (squid sau sockd) cererile vor fi inaintate<br />
interfetei VPN si, in final, catre satelit.</p>
<p>Observati ca s-ar putea sa aveti nevoie de sockd in loc de squid pentru<br />
ca cererile catre satelit sunt folosite in special pentru download, in<br />
timp ce squid-ul este tipic folosit pentru browsing.</p>
<p>6.6. Cum se utilizeaza serviciul Sat Node</p>
<p>Trebuie sa urmati toate instructiunile de la NetSYstem.</p>
<p>Inainte de a activa conexiunea VPN , trebuie sa :</p>
<p>.<br />
.<br />
.<br />
.  pentru a va conecta la serverul vpn doar prin ppp0<br />
?????? lipsesc parti din howto-ul in limba engleza?????????</p>
<p>Ce se schimba fata de Netsystem este ca nu fortam gateway-ul VPN<br />
(212.56.224.34, IP-ul de la drepta lui &#8221;P-t-P&#8221; in interfata ppp1) in<br />
interfata ppp0, dar fortam un alt IP (212.56.224.36). Restul nu se schimba.</p>
<p>Multumiri lui Ricardo Santiago Mozos si Norberto Garcia Prieto.</p>
<p>7. Configurarea sub Windows</p>
<p>7.1. EON</p>
<p>Hauppage WinTV are aplicatii DVB-DATA  care permit speficiarea setarilor<br />
legaturii de date.</p>
<p>7.2 Netsystem</p>
<p>In primul rand e nevoie sa instalati resursele VPN. Aditional, e nevoie sa<br />
descarcati software-ul Netsystem (intotdeauna cu banner) si sa il lansati.<br />
Il puteti descarca de aici:<br />
&lt;http://bertolinux2000.interfree.it/Netsystem/Netsystem.zip&gt;</p>
<p>8. Anexa A &#8211; NOTE</p>
<p>8.1. Translatarea IP dinamic &gt; adrese MAC</p>
<p>Translatarea folosita de unele ISP-uri pentru a calcula adresa MAC (pe<br />
care cardul DVB trebuie sa o aiba pentru a receptiona pachete) este:</p>
<p>00 : 01 : IP[0] : IP[1] : IP[2] : IP[3]</p>
<p>unde</p>
<p>IP[0].IP[1].IP[2].IP[3] este adresa IP dinamica.</p>
<p>Aceasta caracteristica este folosita de exemplu de EON.</p>
<p>8.2 Cadrul TCP</p>
<p>Conexiunile prin satelit sunt un interesant exemplu de foarte mari RTT<br />
(round trip time, timp de acces): un alt exemplu<br />
este comunicatia Marte-Pamant sau Pamant-Luna.</p>
<p>Aceste conexiuni au o trasatura foarte proasta: foarte scazuta<br />
interactivitate.</p>
<p>Conexiunile de retea tipice (sau digitale, in general) folosesc asa numita<br />
transmisie in &#8220;cadre&#8221;, ceea ce inseamna ca bufferul de date poate fi<br />
trimis inainte de a astepta un raspuns. In stiva<br />
protocolului TCP/IP, &#8220;cadrul&#8221; TCP arata cam asa:</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
| &#8211; - &#8211; - &#8211; - &#8211; &gt; poate continua |-|-|-|&#8212;-&gt;<br />
|               &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
|             Buffer transmisibil inaintea confirmarii<br />
|<br />
| &#8211; - &#8211; - &#8211; - &#8211; &lt;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
Confirmare</p>
<p>Acum, daca in comunicatia noastra avem un timp mare de acces si daca am<br />
avea un cadru TCP mic, am pierde mult timp doar asteptand confirmarea<br />
(ACK), asa incat largimea de banda reala ar scadea (de exemplu, daca avem<br />
un cadru TCP de 16kb, tipic pentru sistemele Windows, si RTT de 400ms, nu<br />
se pate depasi 16KB/0.4 = 40 KB/s)</p>
<p>Solutia este utilizarea unor cadre TCP foarte mari (ca 256kb sau cativa MB)</p>
<p>Din pacate, sub multe sisteme nu este posibil sa avem<br />
un cadru TCP mare, asa ca in ultimii ani au aparut multe<br />
aplicatii, asa numitele &#8220;download acceleratoare&#8221; care impart<br />
in multe fragmente un fisier si le descarca pe toate simultan. Aceasta<br />
este echivalent cu a descarca un singur fisier dintr-o singura bucata,<br />
evitand problemele RTT-ului.</p>
<p>8.3 Download accelerator</p>
<p>Va indicat cateva link-uri catre asa numitele &#8220;download acceleratoare&#8221;,<br />
aplicatii care fac doua lucruri:</p>
<p>1. managementul resuming-ului sesiunilor; permit oprirea download-ului<br />
si continuarea lui (aceasta poate fi facuta multumita posibilitatii de<br />
&#8220;resume&#8221; introdusa in serverele http si ftp, care permite specificarea la<br />
ce numar de bit sa inceapa download-ul);</p>
<p>2. impartirea fisierului in multe fragmente si posibilitatea lor<br />
de a &#8220;pleca&#8221; in maniera multithread;</p>
<p>Asa cum am vazut in sectiunea precedenta, download acceleratorul permite<br />
cresterea largimii de banda</p>
<p>8.3.1 Sub Linux</p>
<p>·  Aria &lt;http://aria.rednoah.com/&gt;</p>
<p>8.3.2 Sub Windows</p>
<p>·  FlashGet &lt;http://www.amazesoft.com&gt;</p>
<p>·  GetRight &lt;http://www.getright.com&gt;</p>
<p>·  Mass Downloader &lt;http://www.metaproducts.com&gt;</p>
<p>9 Anexa B &#8211; Valori cunoscute pentru ISP-urile prin satelit</p>
<p>9.1 Europe Online</p>
<p>EON trimite date prin satelitul Astra (19.2 SE)</p>
<p>Adresa MAC este calculata din adresa IP (anexa A)</p>
<p>Foloseste autentificarea proxy</p>
<p>urmeaza setarile pentru cei 4 transponderi:</p>
<p>9.1.1.  Transponder 113</p>
<p>·  Frequency: 12633.250 MHz,</p>
<p>·  SRate : 22 MS/s</p>
<p>·  Polarization: Horizontal</p>
<p>·  Unicast PID: 512 (decimal)</p>
<p>9.1.2.  Transponder 114</p>
<p>·  Frequency: 12640 MHz,</p>
<p>·  SRate : 22 MS/s</p>
<p>·  Polarization: Vertical</p>
<p>·  Unicast PID: 512 (decimal)</p>
<p>9.1.3.  Transponder 115</p>
<p>·  Frequency: 12662.750 MHz,</p>
<p>·  SRate : 22 MS/s</p>
<p>·  Polarization: Horizontal</p>
<p>·  Unicast PID: 512 (decimal)</p>
<p>9.1.4.  Transponder 103</p>
<p>·  Frequency: 12461 MHz,</p>
<p>·  SRate : 27.5 MS/s</p>
<p>·  Polarization: Horizontal</p>
<p>·  Unicast PID: 512 (decimal)</p>
<p>9.2 Netsystem</p>
<p>Foloseste satelitul Astra (19.2 SE) pentru a trimite date.</p>
<p>Adresa MAC este adresa reala a cardului DVB.</p>
<p>Foloseste conexiune VPN.</p>
<p>urmeaza datele setarilor:</p>
<p>9.2.1.  Transponder 119</p>
<p>·  Frequency: 12721 MHz</p>
<p>·  SRate: 22MS/s</p>
<p>·  Polarization: Horizontal</p>
<p>·  Unicast PID: 451 (decimal)</p>
<p>9.3.  Sat Node</p>
<p>Sat Node foloseste satelitul Astra (19.2 SE).</p>
<p>·  Frequency: 12603.750 MHz</p>
<p>·  SRate: 22MS/s</p>
<p>·  Polarization: Horizontal</p>
<p>·  Unicast PID: 302</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=175</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cum sa realizezi masquerading, transparent proxy,  forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.</title>
		<link>http://resurse-educationale.uv.ro/?p=173</link>
		<comments>http://resurse-educationale.uv.ro/?p=173#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:50:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[dnat]]></category>
		<category><![CDATA[forward]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[mapare]]></category>
		<category><![CDATA[masquerading]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[porturi]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[redirectare]]></category>
		<category><![CDATA[snat]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=173</guid>
		<description><![CDATA[traducere ver. 0.2 de catre Riddl Multumiri tuturor celor care m-au ajutat, in special lui Gushterul. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de &#8230; <a href="http://resurse-educationale.uv.ro/?p=173">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>traducere ver. 0.2 de catre Riddl</p>
<p>Multumiri tuturor celor care m-au ajutat,  in special lui Gushterul.<br />
Observatie f importanta: probabil ca exista unele greseli in acest document.<br />
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de<br />
traducere si pentru observatii pertinente trimiteti-mi mail pentru Riddl la<br />
&#8220;discutzii at gmx dot net&#8221;. Nu uitati sa precizati numele documentului.<br />
Multumesc anticipat.<br />
Aceasta versiune este  putin modificata fata de original, deorece unii termeni<br />
sunau foarte ciudat in ro.<br />
Pentru ultima versiune a acestui document verifica<br />
&lt;http://www.securityorg.net/docs/&gt;.</p>
<p>Lecturare placuta!<br />
______________________________________________________________________<br />
Linux 2.4 NAT HOWTO<br />
Rusty Russell, lista de discutii netfilter@lists.samba.org<br />
$Revision: 1.3 $ $Date: 2002/06/05 13:21:56 $</p>
<p>Acest document descrie cum sa realizezi masquerading, transparent proxy,<br />
forwardare de porturi, si alte forme de NAT pentru kernelurile Linux ver 2.4.</p>
<p>______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere<br />
2. Care este site-ul oficial si care sunt listele de discutii?<br />
2.1. Ce inseamna NAT?<br />
2.2. De ce as dori sa realizez NAT?<br />
3. Doua tipuri de NAT<br />
4. Trecere rapida de la kernelurile 2.0 si 2.2<br />
4.1. Doresc sa realizez doar masquerading! Help!<br />
4.2. Dar despre ipmasqadm?<br />
5. Controlul a ceea ce dorim sa facem cu NAT?<br />
5.1 Selectare simpla folosind iptables<br />
5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim<br />
modificate<br />
6. Cum sa modificam pachetele<br />
6.1 Folosirea NAT pentru modificarea adresei sursa (SNAT)<br />
6.1.1 Masquerading<br />
6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)<br />
6.2.2 Redirectare<br />
6.3 Mapare complexa<br />
6.3.1. Selectarea de adrese multiple dintr-un sir<br />
6.3.2. Realizarea de mapare NAT nula<br />
6.3.3. Comportamentul NAT standard<br />
6.3.4. Mapare implicita a porturilor sursa<br />
6.3.5. Ce se intampla cand NAT-area nu reuseste<br />
6.3.6. Mapari multiple, Suprapuneri si Conflicte<br />
6.3.7. Schimbarea destinatiei conexiunilor generate local<br />
7. Protocoale speciale<br />
8. Avertizmente privind folosirea NAT<br />
9. Folosirea SNAT si rutarea<br />
10. Folosirea DNAT pentru adrese aflate in aceeasi retea.<br />
11. Multumiri</p>
<p><span id="more-173"></span></p>
<p>______________________________________________________________________</p>
<p>1. Introducere</p>
<p>Bine ai venit!</p>
<p>Esti pe cale sa incepi sa inveti fascinanta (si uneori inspaimantatoare)<br />
lume a NAT-ului: traducerea adreselor de retea. Acest Howto iti va fi<br />
oarecum un ghid precis pentru kernelurile din linux ver. 2.4 si peste.</p>
<p>In kernelul de linux ver. 2.4, a fost introdus suport pentru modificarea<br />
pachetelor, numit &#8220;netfilter&#8221;. Un nivel deasupra acestuia pune la dispozitie<br />
NAT (translatarea adreselor de retea), complet rescris fata de versiunile din<br />
kernelurile anterioare.</p>
<p>(C) 2000 Paul &#8220;Rusty&#8221; Russell.  Sub licenta GNU GPL.</p>
<p>2. Care este site-ul oficial si care sunt listele de discutii?</p>
<p>Sunt trei site-uri oficiale:</p>
<p>o       Multumiri lui Filewatcher &lt;http://netfilter.filewatcher.org/&gt;.<br />
o       Multumiri Echipei Samba si SGI &lt;http://netfilter.samba.org/&gt;.<br />
o       Multumiri lui Harald Welte &lt;http://netfilter.gnumonks.org/&gt;.</p>
<p>Le poti accesa pe toate folosind round-robin DNS la:<br />
&lt;http://www.netfilter.org/&gt; si  &lt;http://www.iptables.org/&gt;</p>
<p>Pentru lista de discutii oficiala de la netfilter, vezi:<br />
&lt;http://www.netfilter.org/contact.html#list&gt;.</p>
<p>2.1. Ce inseamna NAT?</p>
<p>In mod normal, pachetele intr-o retea se deplaseaza de la sursa  (cum ar fi<br />
computerul tau) la destinatia  (cum ar fi www.securityorg.net) prin mai<br />
multe legaturi de retea diferite: de exemplu cam 19 de la locatia in care ma<br />
aflu eu. Nici una din aceste legaturi nu iti modifica pachetul, pur si simplu<br />
este trimis mai departe.</p>
<p>Daca una din aceste legaturi ar fi facut NAT, atunci ar fi modificat sursa sau<br />
destinatia pachetului ce intra. Dupa cum iti imaginezi nu asa a fost conceput<br />
sistemul sa functioneze, si din aceasta cauza NAT este intodeauna ceva<br />
in genul unui infirm. Deobicei legatura care a facut NAT va tine minte cum a<br />
modificat pachetul, si cand un pachet replica vine din cealalta parte, va<br />
realiza modificarea inversa a pachetului replica, asa ca totul va functiona.</p>
<p>2.2. De ce as dori sa realizez NAT?</p>
<p>Intr-o lume perfecta nu ai avea nevoie. Intre timp, principale motive sunt:</p>
<p>Conexiunile prin modem la internet<br />
Cele mai multe ISP-uri iti dau doar o singura adresa IP cand te<br />
conectezi la ei. Poti trimite pachete cu orice adresa sursa pe care o<br />
doresti, dar doar pachetele cu aceasta adresa IP se vor intoarce la<br />
tine. Daca doresti sa folosesti mai multe sisteme (cum ar fi reteaua<br />
de acasa) pentru a le conecta la internet prin aceasta singura<br />
legatura vei avea nevoie de NAT.<br />
Aceasta este de departe cel mai raspandit mod de folosire al NAT-ului<br />
din zilele noastre, cunoscut si sub numele de &#8220;masquerading&#8221; in lumea<br />
Linuxului. Eu numesc aceasta SNAT, deoarece modifici adresa sursa a<br />
primului pachet.</p>
<p>Servere multiple<br />
Uneori doresti sa modifici directia in care sa se indrepte pachetele<br />
ce intra in reteaua ta. In mod frecvent aceasta este (ca si mai sus)<br />
deoarece ai doar o singura adresa IP, dar doresti ca oameni sa poata<br />
sa ajunga la computerele din spatele sistemului cu adresa IP &#8220;reala&#8221;.<br />
Daca rescrii adresa destinatie a pachetelor care intra, poti realiza<br />
acest lucru. Acest tip de NAT a fost numit forwardare (inaintare) de<br />
porturi in versiunile anterioare de Linux.<br />
O variatie des intalnita a acestei aplicatii al NAT-ului este<br />
load-sharing-ul (incarcare partajata), unde se mapeaza mai multe<br />
sisteme, permitand sistemelor sa ajung la aceste sisteme. Daca<br />
realizezi acest lucru la o scara mare, ar fi bine sa te uiti pe<br />
Linux Virtual Server &lt;http://linuxvirtualserver.org/&gt;.</p>
<p>Proxy transparent<br />
Uneori doresti sa para ca fiecare pachet care trece prin sistemul tau<br />
Linux este destinat pentru un program ruland chiar pe sistemul tau.<br />
Acest lucru este folosit pentru a realiza proxy-uri transparente: un<br />
proxy este un program care se interpune intre reteaua ta si lumea<br />
exterioara, mediand comunicarea intre ele. Se numeste transparent<br />
deoarece reteaua ta nici nu va realiza ca foloseste un proxy, doar daca<br />
bineinteles, proxy-ul nu functioneaza.<br />
Squid-ul poate fi configurat sa ruleze in acest mod, si aceasta era<br />
numita redirectare sau realizare de proxy transparent in versiunile<br />
anterioare de linux.</p>
<p>3. Doua tipuri de NAT</p>
<p>Am impartit NAT-ul in doua tipuri: NAT pentru sursa (SNAT) si NAT pentru<br />
destinatie (DNAT).</p>
<p>SNAT este realizat atunci cand modifici adresa sursa al primului pachet:<br />
schimbi sursa de unde porneste conexiunea. SNAT este intodeauna realizat dupa<br />
procesul de rutare al pachetelor, chiar inainte de a pleca pe conexiune<br />
pachetul. Masquerading este o forma particulara de SNAT.</p>
<p>DNAT este realizat cand modifici adresa destinatie al primului pachet: schimbi<br />
destinatia unde va fi facuta conexiunea. DNAT este intodeauna realizat<br />
inainte de rutarea pachetelor, cand pachetul tocmai a venit prin interfata.<br />
Forwardare de porturi, load-sharing-ul, si proxy-ul transparent sunt toate<br />
forme de DNAT.</p>
<p>4. Trecere rapida de la kernelurile 2.0 si 2.2</p>
<p>Imi pare rau pentru aceia dintre dumneavastra socati de trecerea de la<br />
versiunea 2.0 (ipfwadm) la 2.2 (ipchains). Exista vesti bune si vesti proaste.</p>
<p>In primul rand, poti in mod simplu sa folosesti ipchains si ipfwadm ca mai<br />
inainte. Pentru aceasta trebuie sa incarci (insmod) modulele pentru kernel<br />
&#8220;ipchains.o&#8221; sau &#8220;ipfwadm.o&#8221; ce se gasesc in ultima distributie netfilter.<br />
Acestea se exclud reciproc (ai fost avertizat), si nu ar trebui folosite cu<br />
nici un alt modul din netfilter.</p>
<p>Odata ce unul din aceste module a fost incarcat, vei putea folos ipchains si<br />
ipfwadm in mod normal, insa cu unele diferente:</p>
<p>- Setarea de timeout-uri pentru masquerading cu ipchains  -M -S, sau ipfwadm<br />
-M -s nu rezolva nimic. Cum timeout-urile sunt mai mari pentru noua<br />
infrastructura NAT, acest lucru nu ar trebui sa conteze.</p>
<p>- Campurile init_seq, delta si previous_delta in listarea detaliata a<br />
masqueradarii sunt intodeauna zero.</p>
<p>- Resetarea si listarea counter-elor simultana &#8220;-Z -L&#8221; nu mai este posibila:<br />
countere-le nu vor fi resetate.</p>
<p>- Nivelul de compatibilitate nu este foarte bun pentru un numar de conexiuni<br />
foarte mare: nu il folosi pentru gateway-ul corporatiei.</p>
<p>Hackerii pot deasemenea sa observe:</p>
<p>- Acum te poti lega si pe porturile 61000-65095 chiar daca realizezi<br />
masquerading. Codul pentru masqueradare obisnuia sa considere ca nimic in<br />
aceasta raza ar fi fost ceva corect, asa ca programele nu puteau sa o<br />
foloseasca.</p>
<p>- &#8220;Hack-ul&#8221; (nedocumentat) &#8220;getsockname&#8221;, pe care programele ce realizau proxy<br />
transparent il puteau folosi pentru a afla adresa reala a conexiunilor nu<br />
mai este disponibil.</p>
<p>- &#8220;Hack-ul&#8221; (nedocumentat) bind-to-foreign-address (atasare pe o adresa<br />
straina) nu mai este deasemnea implementat; acesta era folosit pentru a<br />
completa iluzia de proxy transparent.</p>
<p>4.1. Doresc sa realizez doar masquerading! Help!</p>
<p>Aceasta este ce vor majoritatea oamenilor. Daca ai o adresa PPP IP dinamica,<br />
vrei in mod simplu sa spui sistemului tau ca toate pachetele ce vin din<br />
reteaua interna ar trebui sa fie modificate astfel incat sa para ca vin de la<br />
sistemul tau.</p>
<p># Incarca modulul NAT (acesta introduce toate modulele necesare)<br />
modprobe iptable_nat</p>
<p># In tabela NAT (-t nat) in chain-ul POSTROUTING adauga o regula<br />
# pentru toate pachetele care ies prin ppp0 (-p ppp0) care precizeaza<br />
# sa masqueradeze conexiunea (-j MASQUERADE).<br />
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p># Da drumul la forwardarea IP<br />
echo 1 &gt; /proc/sys/net/ipv4/ip_forward</p>
<p>Observatie: aici nu faci nici un fel de filtrare a pachetelor: pentru aceasta<br />
citeste Packet Filtering HOWTO: capitolul &#8220;Folosirea impreuna a NAT-ului si a<br />
filtrarii de pachete&#8221;.</p>
<p>4.2. Dar despre ipmasqadm?</p>
<p>Nu este cazul sa ne facem probleme prea mari pentru compatibilitate. Poti<br />
folosi in mod simplu  &#8220;iptables -t nat&#8221; pentru a realiza forwardare de<br />
porturi. De exemplu, in Linux 2.2 ai fi facut:</p>
<p># Linux 2.2<br />
# Forwardeaza pachetele TCP catre portul 8080, adresa 1.2.3.4, spre<br />
# portul 80, adresa 192.168.1.1<br />
ipmasqadm portfw -a -P tcp -L 1.2.3.4 8080 -R 192.168.1.1 80</p>
<p>Acum ar trebui sa faci:</p>
<p># Linux 2.4<br />
# Adauga o regula inainte de procesul rutarii in chain-ul PREROUTING<br />
# (-A PREROUTING) in tabela NAT (-t nat) pentru ca pachetele TCP<br />
# (-p tcp) care vin spre adresa 1.2.3.4 (-d 1.2.3.4), portul 8080<br />
# (&#8211;dport 8080) sa aiba destinatia mapata (-j DNAT) catre<br />
# 192.168.1.1, portul 80 (&#8211;to 192.168.1.1:80)<br />
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 &#8211;dport 8080 \<br />
-j DNAT &#8211;to 192.168.1.1:80</p>
<p>5. Controlul a ceea ce dorim sa facem cu NAT?</p>
<p>Ai nevoie sa scrii reguli NAT pentru a spune kernelului ce conexiuni sa<br />
schimbe, si cum sa le schimbe. Pentru a realiza aceasta folosim comanda<br />
iptables, si precizam ca dorim a schimba tabela NAT prin specificarea optiunii<br />
&#8220;-t nat&#8221;.</p>
<p>Tabela regulilor NAT cuprinde trei liste numite &#8220;chain-uri&#8221;: fiecare regula<br />
este examinata in chain pana cand una se potriveste. Doua chain-uri sunt<br />
numite PREROUTING (pentru DNAT, pentru pachetele care tocmai au intrat) si<br />
POSTROUTING (pentru SNAT, pentru pachetele care sunt pe cale sa iasa). Al<br />
treilea chain (OUTPUT) va fi ignorat in cele ce urmeaza.</p>
<p>Urmatoarea diagrama ilustreaza destul de bine cum stau lucrurile:</p>
<p>_____                                     _____<br />
/     \                                   /     \<br />
PREROUTING &#8211;&gt;[Routing ]&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;&gt;POSTROUTING&#8212;&#8211;&gt;<br />
\D-NAT/     [Decision]                    \S-NAT/<br />
|                            ^<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
|                            |<br />
&#8212;&#8212;&#8211;&gt; Local Process &#8212;&#8212;</p>
<p>La fiecare dintre punctele de mai sus, cand un pachet trece este determinat<br />
carei conexiuni ii este asociat. Daca este o conexiune noua, este determinat<br />
chain-ul corespunzator in tabela NAT pentru a determina ce sa facem cu acel<br />
pachet. Raspunsul determinat va fi aplicat pentru toate pachetele viitoare<br />
apartinand acelei conexiuni.</p>
<p>5.1 Selectare simpla folosind iptables</p>
<p>iptables admite un numar de optiuni standard dupa cum sunt listate mai jos.<br />
Toate optiunile care incep cu &#8220;&#8211;&#8221; pot fi prescurtate, atat timp cat iptables<br />
poate sa le deosebeasca de alte optiuni. Daca kernelul tau are iptables<br />
compilat ca modul, este necesar sa incarci intai modulul iptables: &#8220;insmod<br />
ip_tables&#8221;.</p>
<p>Cea mai importanta optiune in acest caz este optiunea de selectare a tabelei,<br />
&#8220;-t&#8221;. Pentru toate actiune NAT, vei dori sa folosesti &#8220;-t nat&#8221; pentru tabela<br />
NAT. A doua cea mai importanta optiune este &#8220;-A&#8221; pentru a adauga o noua regula<br />
la sfarsitul unui chain (&#8220;-A POSTROUTING&#8221;), sau &#8220;-I&#8221; pentru a insera o regula<br />
la inceputul unui chain (&#8220;-I PREROUTING&#8221;).</p>
<p>Poti specifia sursa (&#8220;-s&#8221; sau &#8220;&#8211;source&#8221;) si destinatia (&#8220;-d&#8221; sau<br />
&#8220;&#8211;destination&#8221;) pachetelor pe care le doresti sa le prelucrezi prin NAT.<br />
Aceste optiuni pot fi urmate de o singura adresa IP (192.168.1.1), un nume<br />
(www.securityorg.net), sau o adresa de retea (192.168.1.0/24 sau<br />
192.168.1.0/255.255.255.0).</p>
<p>Poti specifica interfata cu care sa se potriveasca regula, de intrare (&#8220;-i&#8221;<br />
sau &#8220;&#8211;in-interface&#8221;) sau de iesire (&#8220;-o&#8221; sau &#8220;&#8211;out-interface&#8221;), dar ceea ce<br />
poti specifica depinde si de chain-ul in care introduci regula: pentru<br />
chain-ul PREROUTING poti selecta numai interfete prin care intra pachetele,<br />
si in chain-ul POSTROUTING poti selecta numai interfete de iesire. Daca<br />
folosesti o interfata gresita iptables iti va da eroare.</p>
<p>5.2 Aspecte delicate in privinta selectarii pachetelor ce le dorim modificate</p>
<p>Am spus mai sus ca poti preciza o adresa sursa si destinatie. Daca vei omite<br />
optiunea privitoare la adresa sursa, atunci regula se va potrivi pentru<br />
orice adresa sursa. Analog, daca omiti optiunea pentru adresa destinatie, atunci<br />
regula se va potrivi pentru orice adresa destinatie.</p>
<p>Poti deasemenea indica un protocol specific (&#8220;-p&#8221; sau &#8220;&#8211;protocol&#8221;), cum ar fi<br />
TCP sau UDP; doar pachetele de acest tip se vor potrivi cu regula. Principalul<br />
motiv pentru a preciza unul dintre aceste protocoale permite apoi folosirea de<br />
noi optiuni: in special optiunile &#8220;&#8211;source-port&#8221; si &#8220;&#8211;destination-port&#8221;<br />
(prescurtate &#8220;&#8211;sport&#8221; si &#8220;&#8211;dport&#8221;).</p>
<p>Aceste optiuni iti permite sa specifici ca numai pachetele cu anumite porturi<br />
destinatie sau porturi sursa se vor potrivi cu regulii. Aceste optiuni sunt<br />
folositoare, de exemplu, pentru redirectarea cererilor web (porturile TCP 80<br />
sau 8080) si nemodificarea celorlalte pachete.</p>
<p>Aceste optiuni trebuie sa fie puse dupa optiunea &#8220;-p&#8221; (care are ca alt efect<br />
incarcarea optiunilor extinse pentru acel protocol). Poti folosi pentru<br />
porturi numere, sau nume cum sunt scrise in fisierul /etc/services.</p>
<p>Toate caracteristicile dupa care poti selecta un pachet sunt detaliate in<br />
pagina de manual pentru iptables (man iptables).</p>
<p>6. Cum sa modificam pachetele</p>
<p>In concluzie, acum stim cum sa selectam pachetele pe care le dorim modificate.<br />
Pentru a scrie regulile complete trebuie sa spunem kernelului cu exactitate<br />
ceea ce dorim sa facem pachetelor.</p>
<p>6.1 Folosirea NAT pentru modificarea adresei sursa</p>
<p>Doresti sa faci SNAT; sa schimbi adresa sursa a conexiunilor cu ceva diferit.<br />
Acesta este realizat in chain-ul POSTROUTING, chiar inainte de a fi trimis<br />
pachetul; acesta este un detaliu important, deoarece inseamna ca orice alceva<br />
in sistemul Linux (rutare, filtrare de pachete) va vedea doar pachetul<br />
neschimbat. Mai inseamna deasemenea ca optiunea &#8220;-o&#8221; (interfata de iesire)<br />
poate fi folosita.</p>
<p>SNAT este specificat folosind optiunea &#8220;-j SNAT&#8221;; si optiunea &#8220;&#8211;to-source&#8221;<br />
specifica o adresa IP, un sir de adrese IP, si un port optional sau un sir de<br />
porturi (doar in cazul protocoalelor UDP si TCP).</p>
<p>## Schimba adresa sursa cu 1.2.3.4<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4</p>
<p>## Schimba adresa sursa cu 1.2.3.4, 1.2.3.5 sau 1.2.3.6<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4-1.2.3.6</p>
<p>## Schimba adresa sursa cu 1.2.3.4, si porturile intre 1-1023<br />
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT &#8211;to 1.2.3.4:1-1023</p>
<p>6.1.1 Masquerading</p>
<p>Exista un caz particular de SNAT numit masquerading: ar trebui sa fie folosit<br />
numai pentru adrese IP asignate dinamic, cum ar fi in cazul celor ce se<br />
conecteaza prin dial-up (pentru adrese IP statice, foloseste SNAT ca mai sus).</p>
<p>Nu este necesar cand faci masquerading sa specifici adresa sursa: deoarece va<br />
folosi adresa sursa a interfetei prin care va iesi pachetul. Dar ce este mai<br />
importat, daca legatura cu ISP-ul cade, conexiunile (care acum sunt pierdute<br />
oricum) sunt uitate, acest lucru inseamnand mai putine probleme tehnice cand<br />
legatura cu ISP-ul revine cu o noua adresa IP.</p>
<p>## masqueradare pentru ppp0<br />
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p>6.2 Folosirea NAT pentru modificarea adresei destinatie (DNAT)</p>
<p>Aceasta se realizeaza  in chain-ul PREROUTING, exact  dupa primirea<br />
pachetului, aceasta insemna ca orice in sistemul Linux (rutare, filtrare de<br />
pachete) va vedea pachetul cu noua adresa destinatie. Mai inseamna ca optiunea<br />
&#8220;-i&#8221; (interfata de intrare) poate fi folosita.</p>
<p>Se specifica folosirea DNAT cu ajutorul optiunii &#8220;-j DNAT&#8221;, iar optiunea<br />
&#8220;&#8211;to-detination&#8221; specifica o adresa IP, un sir de adrese IP, si un port<br />
optional sau un sir de porturi (acest lucru fiind valabil doar pentru<br />
protocoalele UPD si TCP).</p>
<p>## Schimba adresa destinatie cu 5.6.7.8<br />
# iptables -t nat -A PREROUTING -i eth0 -j DNAT &#8211;to 5.6.7.8</p>
<p>## Schimba adresa destinatie cu  5.6.7.8, 5.6.7.9 sau 5.6.7.10.<br />
# iptables -t nat -A PREROUTING -i eth0 -j DNAT &#8211;to 5.6.7.8-5.6.7.10</p>
<p>##Schimba adresa destinatie a traficului spre portul 80 cu 5.6.7.8, port 8080.<br />
# iptables -t nat -A PREROUTING -p tcp &#8211;dport 80 -i eth0 \<br />
-j DNAT &#8211;to 5.6.7.8:8080</p>
<p>6.2.2 Redirectare</p>
<p>Exista un caz particular de DNAT numita redirectare: este o simpla conventie<br />
care este echivalenta cu a realiza DNAT catre adresa interfetei prin care<br />
intra pachetele.</p>
<p>## Trimite traficul care vine pe portul 80 catre squid (proxy-ul<br />
transparent<br />
# iptables -t nat -A PREROUTING -i eth1 -p tcp &#8211;dport 80 \<br />
-j REDIRECT &#8211;to-port 3128</p>
<p>Observatie: squid-ul trebuie sa fie configurat pentru a putea fi folosit ca<br />
proxy transparent!</p>
<p>6.3 Mapare complexa</p>
<p>Sunt cateva lucruri rafinate in folosirea NAT pe care majoritatea oamenilor nu<br />
vor avea nevoie sa le foloseasca. Aceste lucruri sunt documentate mai jos<br />
pentru curiosi.</p>
<p>6.3.1. Selectarea de adrese multiple dintr-un sir</p>
<p>Daca un sir de adrese IP este specificat, adresa IP care va fi folosita este<br />
bazata pe cea mai putin folosita la conexiuni adresa IP de care sistemul stie.<br />
Acest comportament furnizeaza load-balancing primar.</p>
<p>6.3.2. Realizarea de mapare NAT nula</p>
<p>Poti folosi tinta &#8220;-j ACCEPT&#8221; pentru a permite realizarea conexiunii fara sa<br />
fie realizat deloc NAT.</p>
<p>6.3.3. Comportamentul NAT standard</p>
<p>Comportamentul obisnuit este sa modifice conexiunea cat mai putin posibil, cu<br />
exceptia regulilor date de catre utilizator. Aceasta inseamna ca nu vor fi<br />
remapate porturile decat daca suntem obligati sa realizam acest lucru.</p>
<p>6.3.4. Mapare implicita a porturilor sursa</p>
<p>Chiar daca folosirea NAT nu este ceruta pentru o conexiune, translatarea<br />
portului sursa poate fi facut automat, daca o alta conexiune a fost mapata<br />
peste una noua. De exemplu considerati un caz care este comun in masquerading:</p>
<p>1. O conexiune web este realizata de la un sistem cu IP-ul 192.1.1.1 cu portul<br />
sursa 1024 catre www.securityorg.net portul 80.</p>
<p>2. Aceasta conexiune este masqueradata de un sistem care se ocupa cu acest<br />
lucru, pentru a folosi IP-ul sursa al sistemului ce realizeaza masqueradarea<br />
(1.2.3.4)</p>
<p>3. Insusi sistemul ce realizeaza masquerading initiaza o conexiune catre<br />
www.securityorg.net, portul 80, de la 1.2.3.4 (adresa interfetei externe)<br />
portul 1024</p>
<p>4. Codul NAT va modifica portul sursa al celei de-a doua conexiuni cu 1025,<br />
astfel ca sa nu existe conflict intre cele doua conexiuni.</p>
<p>Cand se realizeaza aceasta mapare automata a sursei, porturile sunt impartite<br />
in trei clase:</p>
<p>o Porturile sub 512<br />
o Porturile intre 512 si 1023<br />
o Porturile de la 1024, inclusiv, in sus</p>
<p>Un port nu va fi niciodata mapat automat intr-o clasa diferita.</p>
<p>6.3.5. Ce se intampla cand NAT-area nu reuseste</p>
<p>Daca nu mai este disponibil nici un mod in care sa se relizeze maparea unica a<br />
conexiunii cerute de catre utilizator, conexiunea va fi abandonata. Acest<br />
comportament se aplica ai in cazurile in care pachetele nu au putut fi<br />
clasificate ca parte a unei conexiuni, deoarece sunt malformate, sau sistemul<br />
nu mai are memorie libera, etc.</p>
<p>6.3.6. Mapari multiple, Suprapuneri si Conflicte</p>
<p>Daca ai reguli care folosesc NAT pentru mapare de porturi aflate intr-o raza<br />
comuna; codul NAT este destul de inteligent pentru a evita conflicte. Aceasta<br />
pentru ca, avand doua reguli, este corecta maparea adresei sursa pentru<br />
192.168.1.1 si respectiv 192.168.1.2 in adresa 1.2.3.4.</p>
<p>Mai mult, poti face mapare peste adrese IP reale folosite, atat timp cat<br />
aceste adrese trec deasemenea prin masina care realizeaza maparea. Asa ca daca<br />
ai o retea asignata (1.2.3.0/24), dar ai o retea interna care foloseste<br />
aceasta clasa de IP-uri si inca o retea care foloseste o clasa de adrese IP<br />
private 192.168.1.0/24, poti sa realizezi SNAT pentru adresele cu sursa IP<br />
192.168.1.0/24 peste adresele din reteaua 1.2.3.0, fara sa iti fie teama de<br />
conflicte:</p>
<p># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \<br />
-j SNAT &#8211;to 1.2.3.0/24</p>
<p>Aceeasi logica se aplica adreselor folosite de insusi sistemul ce realizeaza<br />
NAT: in acest fel functioneaza si masquerading-ul (prin folosirea impreuna a<br />
adresei interfatei de catre pachetele masqueradate si pachetele &#8220;reale&#8221;<br />
venite de la insusi sistemul ca realizeaza masquerading-ul).</p>
<p>De altfel, poti mapa aceleasi pachete pe mai multe sisteme diferite, si<br />
acestea vor fi folosite in comun. De exemplu, daca nu doresti sa mappezi nimic<br />
peste adresa 1.2.3.5, ai putea sa dai urmatoarea comanda:</p>
<p># iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 \<br />
-j SNAT &#8211;to 1.2.3.0-1.2.3.4 &#8211;to 1.2.3.6-1.2.3.254</p>
<p>6.3.7. Schimbarea destinatiei conexiunilor generate local</p>
<p>Codul NAT iti permite sa introduce reguli in chainul OUTPUT avand ca tinta<br />
DNAT, dar acest lucru nu este in intregime suportat in kernelurile 2.4 (poate<br />
fi programat dar are nevoie de noi optiuni, testari, si putina programare,<br />
asa ca daca nimeni nu il contacteaza pe Rusty pentru al scrie, nu o sa fie<br />
disponibil prea devreme).</p>
<p>Limitarea curenta este faptul ca poti sa schimbi destinatia pachetelor doar<br />
catre sistemul local ( &#8220;-j DNAT &#8211;to 127.0.0.1&#8243;), nu si catre alte sisteme, in<br />
caz contrar replicile nu vor fi primite in mod corect inapoi.</p>
<p>7. Protocoale speciale</p>
<p>Unele protocoale nu accepta sa fie NAT-uite. Pentru fiecare dintre aceste<br />
protocoale, doua module speciale trebuiesc scrie; unul pentru urmarirea<br />
conexiunilor si al doilea pentru operatia de NAT-are propriu-zisa.</p>
<p>In cadrul distributiei netfilter, exista module pentru ftp: ip_conntrack_ftp.o<br />
si ip_nat_ftp.o. Daca le inserezi in kernel (insmod) sau le compilezi in<br />
kernel, atunci realizarea oricarui tip de NAT pentru conexiuni ftp ar trebui<br />
sa functioneze. Daca nu, atunci poti folosi ftp pasiv, si chiar si atunci s-ar<br />
putea sa nu functioneze foarte sigur daca vrei sa realizezi alceva decat SNAT.</p>
<p>8. Avertizmente privind folosirea NAT</p>
<p>Daca realizezi NAT pentru o conexiune, pachetele venind din ambele sensuri<br />
(din afara si din inauntrul retelei) trebuie sa treaca prin sistemul care<br />
realizeaza NAT-area, in caz contrar lucrurile nu vor functiona sigur. In<br />
special, codul urmarii conexiunilor reansambleaza fragmentele, care inseamna<br />
ca nu numai depistarea conexiunilor nu va fi sigura, dar chiar si pachetele<br />
s-ar putea sa nu treaca deloc, ca fragmente fiind retinute.</p>
<p>9. Folosirea SNAT si rutarea</p>
<p>Daca doresti sa realizezi SNAT, vei dori sa fii sigur ca fiecare masina la<br />
care ajung pachete care sunt parte a unei conexiuni SNAT, vor trimite<br />
pachetele replica inapoi la sistemul care realizeaza SNAT-ul.<br />
De exemplu, daca mapezi niste pachete ce ies, cu adresa sursa 1.2.3.4, atunci<br />
ruterul extern trebuie sa stie ca trebuie sa trimita pachetele replica inapoi<br />
(care vor avea adresa destinatie 1.2.3.4) catre acest sistem.<br />
Acest lucru poate fi realizat in urmatoarele moduri:</p>
<p>1. Daca realizezi SNAT peste adresa propriului sistem (pentru care rutarea si<br />
toate celelalte merg deja), nu trebuie sa faci nimic</p>
<p>2. Daca realizezi SNAT peste o adresa nefolosita din propriul LAN (de exemplu,<br />
mappezi peste 1.2.3.99, o adresa IP nefolosita din reteaua ta  1.2.3.0/24),<br />
sistemul ce realizeaza NAT va trebui sa raspunda la cereri ARP pentru aceea<br />
adresa ca si pentru propria sa adresa: cea mai simpla metoda de a rezolva<br />
acest lucru este sa creezi un alias pentru adresa IP, de exemplu:</p>
<p># ip address add 1.2.3.99 dev eth0</p>
<p>3. Daca realizezi SNAT peste o adresa complet diferita, va trebui sa te asiguri<br />
ca masinile la care vor ajunge pachetele SNAT-atate vor ruta aceasta adresa<br />
inapoi catre sistemul pe care se realizeaza SNAT-ul. Aceasta este realizata<br />
deja daca sistemul care realizeaza SNAT-ul este gateway-ul lor default, in caz<br />
contrar va trebui sa adaugi o ruta pe fiecare sistem prin care trec pachetele<br />
modificate.</p>
<p>10. Folosirea DNAT pentru adrese aflate in aceeasi retea.</p>
<p>Daca realizezi forwardare de porturi inapoi in aceeasi retea, trebuie sa fii<br />
sigur ca atat pachetele viitoare cat si pachetele ce vin in replica vor trece<br />
prin sistemul ce realizeaza DNAT-ul (pentru ca acestea sa fie modificate).<br />
Codul NAT va bloca (inca din ver. 2.4.0-test6) pachetele ICMP de redirectare<br />
care rezulta atunci cand pachetele NAT-ate se indreapta catre aceeasi interfata<br />
spre care au venit, dar serverul care primeste acele pachete va incerca in<br />
continuare sa raspunda direct catre client (care nu va recunoaste pachetele<br />
replica).</p>
<p>Cazul clasic este cand un sistem din reteaua interna incearca sa acceseze<br />
serverul www &#8220;public&#8221;, care este defapt DNAT-at de la adresa publica (1.2.3.4)<br />
catre un sistem din reteaua interna (192.168.1.1), astfel:</p>
<p># iptables -t nat -A PREROUTING -d 1.2.3.4 \<br />
-p tcp &#8211;dport 80 -j DNAT &#8211;to 192.168.1.1</p>
<p>O cale este sa rulezi un server de DNS intern care sa stie adresa IP reala<br />
(interna) al site-ului public de web, si sa inainteze toate celelate cereri<br />
catre un server DNS extern. Aceasta inseamna ca va fi folosita o conexiune<br />
directa catre server-ul de web, fara sa mai fie nevoie de a trece prin<br />
sistemul care realizeaza NAT.</p>
<p>Cealalta cale este sa realizezi, pe sistemul care face DNAT, mapparea adresei<br />
sursa spre propria lui adresa pentru conexiunile venind din reteaua interna,<br />
pacalind serverul de web sa trimita pachetele replica spre masina ce se ocupa<br />
cu NAT-area. Pentru acest exemplu vom proceda astfel (presupunem ca adresa IP<br />
al sistemului care realizeaza NAT este 192.168.1.250):</p>
<p># iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 \<br />
-p tcp &#8211;dport 80 -j SNAT &#8211;to 192.168.1.250</p>
<p>Deoarece regula din chain-ul PREROUTING este executata prima, pachetele vor fi<br />
deja destinate pentru server-ul de web intern: putem preciza care din pachete<br />
sunt din reteaua interna dupa adresa IP sursa.</p>
<p>11. Multumiri</p>
<p>Multumirile sunt in primul rand pentru WatchGuard, si David Bonn, care a<br />
crezut in ideea netfilter destul pentru a ma sustine sa o tranform in<br />
realitate. Si pentru toti ceilalti, care m-au suportat cand faceam pe grozavul<br />
cand am invatat despre uratenia NAT-ului, in special celor ce mi-au citit<br />
jurnalul.</p>
<p>Rusty.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=173</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Folosirea lui iptables pentru filtrarea pachetelor in kernelurile versiunea 2.4</title>
		<link>http://resurse-educationale.uv.ro/?p=171</link>
		<comments>http://resurse-educationale.uv.ro/?p=171#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:47:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Servers]]></category>
		<category><![CDATA[filtru de pachete]]></category>
		<category><![CDATA[icmp]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[ipchains]]></category>
		<category><![CDATA[ipfwadm]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nat]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[protocol]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[udp]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=171</guid>
		<description><![CDATA[traducere ver. 0.6 de catre Riddl Multumiri tuturor celor care m-au ajutat. Lui Gushterul in special. Deasemenea multumiri si lui Little Dragon. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput &#8230; <a href="http://resurse-educationale.uv.ro/?p=171">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>traducere ver. 0.6 de catre Riddl</p>
<p>Multumiri tuturor celor care m-au ajutat. Lui Gushterul in special.<br />
Deasemenea multumiri si lui Little Dragon.<br />
Observatie f importanta: probabil ca exista unele greseli in acest document.<br />
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de<br />
traducere si pentru observatii pertinente mail me (Riddl) at<br />
&#8220;discutzii at gmx dot net&#8221;. Nu uitati sa precizati numele documentului.<br />
Multumesc anticipat.<br />
Aceasta versiune este putin modificata fata de original, deorece unii termeni<br />
sunau foarte aiurea in ro.<br />
Pentru ultima versiune a acestui document verifica<br />
&lt;http://www.securityorg.net/docs/&gt;.</p>
<p>Lecturare placuta!</p>
<p>______________________________________________________________________</p>
<p>Linux 2.4 Packet Filtering HOWTO<br />
Rusty Russel, lista de discutii netfilter@lists.samba.org<br />
$Revision: 1.2 $ $Date: 2002/02/19 11:33:43 $</p>
<p>Acest document descrie folosirea lui iptables pentru filtrarea pachetelor in<br />
kernelurile versiunea 2.4.<br />
______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere<br />
2. Care este site-ul oficial? Exista vreo lista de discutii?<br />
3. Deci, ce inseamna filtru de pachete?<br />
3.1 De ce as vrea sa filtrez pachetele?<br />
3.2 Cum filtrez pachetele sub linux?<br />
3.2.1 iptables<br />
3.2.2 Crearea regulilor permanente<br />
4. Cine dracu esti tu, si de ce te joci cu kernelul meu?<br />
5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete<br />
6. Cum traverseaza pachetele filtrele?<br />
7. Folosirea iptables<br />
7.1 Ce vei vedea cand porneste calculatorul<br />
7.2 Operatii pentru o singura regula<br />
7.3 Optiuni de filtrare<br />
7.3.1 Specificarea IP-ului sursa si destinatie<br />
7.3.2 Specificarea inversa<br />
7.3.3 Specificarea protocolului<br />
7.3.4 Specificarea unei interfete<br />
7.3.5 Specificarea fragmentelor<br />
7.3.6 Optiuni extinse la iptables: Noi potriviri<br />
7.3.6.1 Optiuni extinse TCP<br />
7.3.6.1.1 O explicatie pentru flag-urile TCP<br />
7.3.6.2 Optiuni extinse UDP<br />
7.3.6.3 Optiuni extinse ICMP<br />
7.3.6.4 Alte optiuni extinse pentru potrivire<br />
7.3.6.5 Potrivirea dupa stare<br />
7.4 Argumente asupra tintei<br />
7.4.1 Chain-uri definite de utilizator<br />
7.4.2 Optiuni extinse la iptables: Noi tinte<br />
7.4.3 Tinte speciale construite default<br />
7.5 Operatii asupra unui intreg chain<br />
7.5.1 Creearea unui nou chain<br />
7.5.2 Stergerea unui chain<br />
7.5.3 Stergerea tuturor regulilor unui chain<br />
7.5.4 Listarea unui chain<br />
7.5.5 Resetarea counter-elor<br />
7.5.6 Setarea policy-ului</p>
<p>8. Folosirea ipchains si ipfwadm<br />
9. Folosirea impreuna a NAT-ului si a filtrarii de pachete<br />
10. Diferente intre iptables si ipchains<br />
11. Sfaturi asupra designului filtrului de pachete</p>
<p><span id="more-171"></span></p>
<p>______________________________________________________________________</p>
<p>1. Introducere</p>
<p>Bine ai venit, cititorule. (:))</p>
<p>Se presupune ca stii ce este aceea o adresa IP, adresa de retea, netmask,<br />
routare si DNS. Daca nu, se recomanda sa citesti Network Concepts Howto.<br />
Acest HOWTO loveste intre o introducere draguta (care te poate lasa<br />
increzator pentru moment, dar neprotejat in lumea reala) si o dezvaluire<br />
total neprelucrata (care ii vor lasa pe toti, mai putin caracterele tari,<br />
in confuzie, paranoici si in cautarea de arme grele).</p>
<p>Reteaua ta nu este sigura. Problema permiterii comunicarii rapide si<br />
comode, in acelasi timp cu restrictia acesteia numai pentru bine si nu in<br />
mod malefic, este asemanatoare cu alte probleme opuse  cum ar fi permiterea<br />
vorbirii libere in acelasi timp cu refuzarea unui strigat de &#8220;FOC!!&#8221; intr-un<br />
teatru aglomerat. Nu va fi rezolvata aceasta problema in spatiul acestui<br />
HOWTO.</p>
<p>Asa ca doar tu poti sa decizi unde va fi compromisul. Voi incerca sa te<br />
instruiesc in folosirea unor comenzi disponibile si a unor vulnerabilitati<br />
de care sa fii constient, in speranta ca vei folosi aceasta in mod pozitiv<br />
si nu in scopuri malefice. Aceasta este o alta problema asemanatoare.</p>
<p>(C) 2000 Paul &#8220;Rusty&#8221; Russell.  Cu licenta sub  GNU GPL.</p>
<p>2. Care este site-ul oficial? Exista vreo lista de discutii?</p>
<p>Sunt trei site-uri oficiale:</p>
<p>o 	Multumiri lui Filewatcher &lt;http://netfilter.filewatcher.org/&gt;.<br />
o 	Multumiri Echipei Samba si SGI &lt;http://netfilter.samba.org/&gt;.<br />
o 	Multumiri lui Harald Welte &lt;http://netfilter.gnumonks.org/&gt;.</p>
<p>Le poti accesa pe toate folosind round-robin DNS la:<br />
&lt;http://www.netfilter.org/&gt; si  &lt;http://www.iptables.org/&gt;</p>
<p>Pentru lista de discutii oficiala de la netfilter, vezi:<br />
&lt;http://www.netfilter.org/contact.html#list&gt;.</p>
<p>3. Deci, ce inseamna filtru de pachete?</p>
<p>Un filtru de pachete este o bucatica de software care se uita la header-ul<br />
pachetelor pe masura ce ele intra, si decid soarta intregului pachet. Acest<br />
filtru poate decide sa ignore pachetul (DROP) (respinge pachetul ca si cum<br />
nu l-ar fi primit niciodata), accepta (ACCEPT) pachetul (lasa pachetul sa<br />
intre), sau alte decizii mai complicate.</p>
<p>Sub linux, filtrarea de pachete este construita in kernel (ca modul sau<br />
construita in el), si sunt cateva lucruri complicate pe care le putem face cu<br />
pachetele, dar principiul general de examinare al header-ului pachetului si<br />
decidere asupra sortii pachetului este inca acolo.</p>
<p>3.1 De ce as vrea sa filtrez pachetele?</p>
<p>Control. Securitate. Vigilenta.</p>
<p>Control:<br />
cand folosesti un sistem Linux pentru a-ti conecta reteaua interna<br />
la o alta retea (sa spunem, Internet) ai posibilitatea de a permite<br />
un anumit tip de trafic, si sa refuzi pe altele. De exemplu,<br />
header-ul contine adresa destinatie a unui pachet, asa ca poti<br />
preveni pachetele sa se duca spre o anumita parte a retelei<br />
exterioare. Ca un alt exemplu, folosesc Netscape pentru accesarea<br />
arhivelor Dilbert. Sunt reclame pe pagina de la doubleclick.net, si<br />
Netscape imi pierde timpul incarcandu-le. Spunand filtrului de pachete<br />
sa nu permita pachete de la sau spre nici una din adresele detinute<br />
de catre doubleclick.net, rezolva aceasta problema (cu toate acestea<br />
sunt modalitati mai bune pentru aceasta: vezi Junkbuster).</p>
<p>Securitate:<br />
cand sistemul tau Linux este singurul intre haosul Internetului<br />
si reteaua ta ordonata si delicata, este placut sa stii ca poti<br />
sa restrictionezi ceea ce vine tropaind la usa. De exemplu, poti sa<br />
permiti la tot sa iasa din retea, dar ai putea fi ingrijorat de<br />
binecunoscutul &#8220;Ping al Mortii&#8221; venind de la persoanele din afara rau<br />
intentionate. Ca un alt exemplu, s-ar putea sa nu doresti ca<br />
persoanele din afara sa se telnet-uiasca pe sistemul tau Linux, chiar<br />
daca toate conturile tale au parole. Poate doresti (ca multi oameni)<br />
sa fii un observator  al Internet-ului, si nu server (de voie, sau in<br />
alt mod). Pur si simplu nu lasa pe nimeni sa se conecteze, punand<br />
fitrul de pachete sa respinga pachetele folosite la initierea de<br />
conexiuni.</p>
<p>Vigilenta:<br />
uneori o masina prost configurata in reteaua locala va decide sa<br />
arunce pachete spre lumea din afara. Este dragut sa-i spui filtrului de<br />
pachete sa te anunte daca se intampla ceva anormal; poate poti face<br />
ceva cu privire la acel lucru, sau poate esti doar curios.</p>
<p>3.2 Cum filtrez pachetele sub linux?</p>
<p>Kernelurile Linux au avut filtrare de pachete inca de la versiunile 1.1.<br />
Prima generatie, bazata pe ipfw de la BSD, a fost portata de catre Alan Cox<br />
spre sfarsitului anului 1994. Aceasta a fost dezvoltata de catre Jos Vos si<br />
altii pentru Linux 2.0; comanda pentru utilizatori &#8220;ipfwadm&#8221; controla<br />
regulile de filtrare ale kernelului. La mijlocului anului 1998, pentru Linux<br />
2.2, am rescris puternic kernelul cu ajutorul lui Michael Neuling, si am<br />
introdus comanda pentru utilizatori &#8220;ipchains&#8221;. In sfarsit, a patra generatie<br />
de comenzi, &#8220;iptables&#8221;, si o noua rescriere a kernelului s-a intamplat la<br />
mijlocul anului 1999 pentru Linux 2.4. Acest HOWTO este centrat pe iptables.</p>
<p>Ai nevoie de un kernel care are infrastructura netfilter in el: netfilter este<br />
un cadru in interiorul kernelului Linux in care alte lucruri (cum ar fi<br />
modulul de iptables) se pot introduce. Asta inseamna ca ai nevoie de kernel<br />
versiune 2.3.15 sau peste, si sa raspunzi &#8220;Y&#8221; la CONFIG_NETFILTER in<br />
configurarea kernelului.</p>
<p>Comanda iptables comunica kernelului si ii spune ce pachete sa filtreze.</p>
<p>3.2.1 iptables</p>
<p>Comanda iptables insereaza si sterge reguli din tabela de filtrare a<br />
pachetelor din kernel. Asta inseamna ca orice vei seta, va fi pierdut dupa<br />
rebootare; vezi &#8220;Crearea regulilor permanente&#8221; pentru cum sa fii sigur ca vor<br />
fi restaurate data urmatoare cand va boota Linuxul.</p>
<p>iptables este un inlocuitor pentru ipfwadm si ipchains: vezi &#8220;Folosirea<br />
ipchains si ipfwadm&#8221; pentru a afla cum poti evita fara probleme folosirea<br />
iptables daca folosesti una din aceste comenzi.</p>
<p>3.2.2 Crearea regulilor permanente</p>
<p>Setarile firewall-ului tau curent sunt pastrate in kernel, si de aceea vor fi<br />
pierdute la rebootare. Poti folosi scripturile iptables-save si<br />
iptables-restore sa le salvezi, sau restaurezi dintr-un fisier.</p>
<p>O alte cale este sa pui comenzile cerute sa iti setezi regulile intr-un<br />
script de initializare. Ai grija sa faci ceva inteligent in caz ca una din<br />
comenzi nu ar reusi (de obicei &#8220;exec /sbin/sulogin&#8221;).</p>
<p>4. Cine dracu esti tu, si de ce te joci cu kernelul meu?</p>
<p>Sunt Rusty Russel; cel ce mentine Linux IP Firewall si doar un alt<br />
programator care s-a intamplat sa fie in locul potrivit la momentul potrivit.<br />
Am scris ipchains (vezi mai sus &#8220;Cum filtrez pachetele sub linux?&#8221; pentru a da<br />
credit celor care au facut de fapt munca), si am invatat suficient sa fac<br />
cum trebuie de data asta filtrarea de pachete. Sper.</p>
<p>WatchGuard &lt;http://www.watchguard.com&gt;, o compania excelenta de firewall-uri<br />
care vinde chiar simpaticul plug-in Firebox, s-a oferit sa ma plateasca sa nu<br />
fac nimic, pentru a-mi petrece tot timpul meu sa scriu asta, si sa imi<br />
mentin munca anterioara. Am preconizat 6 luni, si mi-au luat 12, dar la<br />
sfarsit am simtit ca l-am facut cum trebuie. Multe rescrieri, o cedare a<br />
unui hardisk, un laptop furat, doua sisteme de fisiere corupte si un<br />
monitor spart mai tarziu, asta este.</p>
<p>Cat sunt aici, vreau sa indrept niste idei gresite ale unor oameni: nu sunt<br />
un guru al kernelului. Stiu asta, pentru ca munca mea pe partea din kernel<br />
m-a adus in contact cu unii din acestia: David S. Miller, Alexey Kuznetsov,<br />
Andi Kleen, Alan Cox. Oricum, sunt cu totii ocupati sa faca magia din<br />
interior,  lasandu-ma sa avansez cu greu prin superficialitate unde este<br />
sigur.</p>
<p>5. Ghidul intr-adevar rapid al lui Rusty pentru filtrarea de pachete</p>
<p>Cei mai multi oameni au o singura conexiune PPP spre Internet, si nu vor ca<br />
cineva sa intre inapoi in reteaua lor, iata firewall-ul:</p>
<p>## Se insereaza modulele pentru connection-tracking (nu este necesar<br />
## daca sunt compilate in kernel)<br />
# insmod ip_conntrack<br />
# insmod ip_conntrack_ftp</p>
<p>## Se creeaza chain-ul care blocheaza conexiunile noi, cu exceptia celor<br />
## venite din interior.</p>
<p># iptables -N block<br />
# iptables -A block -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A block -m state &#8211;state NEW -i ! ppp0 -j ACCEPT<br />
# iptables -A block -j DROP</p>
<p>## Se sare la acest chain din chain-urile INPUT si FORWARD<br />
# iptables -A INPUT -j block<br />
# iptables -A FORWARD -j block</p>
<p>6. Cum traverseaza pachetele filtrele?</p>
<p>Kernelul porneste cu trei liste de reguli in tabela de &#8220;filtrare&#8221;; aceste<br />
liste sunt numite chain-uri ale firewall-ului sau pur si simplu chain-uri<br />
(lanturi). Cele trei chain-uri se numesc INPUT, OUTPUT si FORWARD.</p>
<p>Pentru fanii ASCII, chain-urile sunt aranjate cam in felul urmator: (Nota:<br />
acesta este un aranjament foarte diferit fata de cel din kernelurile ver.<br />
2.0 si 2.2 !)</p>
<p>_____<br />
Incoming                 /     \         Outgoing<br />
&#8211;&gt;[Routing ]&#8212;&gt;|FORWARD|&#8212;&#8212;-&gt;<br />
[Decision]     \_____/        ^<br />
|                        |<br />
v                       ____<br />
___                     /    \<br />
/   \                   |OUTPUT|<br />
|INPUT|                   \____/<br />
\___/                       ^<br />
|                        |<br />
&#8212;-&gt; Local Process &#8212;-</p>
<p>Cele trei cercuri reprezinta cele trei chain-uri despre care am vorbit<br />
anterior. Cand un pachet ajunge la un cerc din diagrama, acel chain este<br />
examinat pentru a decide soarta pachetului. In cazul in care chain-ul spune sa<br />
ignore pachetul (DROP), este taiat acolo, daca insa chain-ul spune sa accepte<br />
pachetul (ACCEPT), atunci pachetul continua sa parcurga diagrama.</p>
<p>Un chain este o lista de verificare cu reguli. Fiecare regula spune &#8220;daca<br />
headerul pachetului arata asa, atunci iata ce sa faci cu pachetul&#8221;. Daca<br />
regula nu se potriveste cu pachetul, atunci urmatoarea regula din chain<br />
(lant) este examinata. In final, daca nu mai exista reguli de examinat,<br />
kernelul se uita la politica acelui chain-ului pentru a decide soarta pachetului.<br />
Intr-un sistem sigur, politica in chain-uri este de obicei sa taie pachetul<br />
(DROP).</p>
<p>1. Cand un pachet vine (sa zicem, prin placa de retea) kernelul se<br />
uita intai la destinatia pachetului: aceasta se numeste &#8220;routing&#8221;<br />
(rutare).</p>
<p>2. Daca pachetul este destinat pentru aceasta masina, pachetul trece pe<br />
diagrama in chain-ul INPUT. Daca trece de acest chain, orice proces care<br />
asteapta acel pachet il va primi.</p>
<p>3. In caz contrar, daca kernelul nu are forwarding-ul pus, sau nu stie<br />
cum sa forward-eze pachetul, acesta este ignorat. Daca este pus<br />
forwarding-ul, si pachetul are ca destinatie o alta interfata de<br />
retea (daca mai ai inca una), atunci pachetul se duce in diagrama<br />
noastra direct catre chain-ul FORWARD. Daca este acceptat pachetul va<br />
fi transmis.</p>
<p>4. In final, un program ce ruleaza pe sistem poate trimite pachete.<br />
Aceste pachete trec direct in chain-ul OUTPUT: daca este acceptat<br />
pachetul isi continua drumul fara sa conteze interfata spre care este<br />
destinat.</p>
<p>7. Folosirea iptables</p>
<p>iptables are o pagina de manual destul de detaliata (man iptables), si daca<br />
ai nevoie de detalii mai in amanunt. Aceia dintre voi familiarizati cu<br />
ipchains vor dori poate sa se uite la &#8220;Diferente intre iptables si<br />
ipchains&#8221;; sunt comenzi foarte similare.</p>
<p>Sunt mai multe lucruri pe care le poti face cu iptables. Pornesti la drum cu<br />
trei chainu-ri default care nu pot fi sterse INPUT, OUTPUT si FORWARD. Sa<br />
privim operatiile care se pot aplica pentru un intreg chain:</p>
<p>1. Creearea unui chain nou (-N).<br />
2. Stergerea unui chain gol (care nu contine reguli) (-X).<br />
3. Schimbarea politicii pentru un chain default (-P).<br />
4. Listarea regulilor dintr-un chain (-L).<br />
5. Stergerea tuturor regulilor dintr-un chain (-F).<br />
6. Resetarea counter-elor de pachete si bytes pentru toate regulile<br />
dintr-un chain (-Z).</p>
<p>Sunt mai multe moduri in care se pot manipula regulile intr-un chain:</p>
<p>1. Adaugarea in coada chain-ului a unei noi reguli (-A).<br />
2. Insereaza o regula noua la o anumita pozitie in chain (-I). Daca<br />
nu este precizata pozitia printr-un numar atunci regula este adaugata<br />
la inceputul chain-ului.<br />
3. Inlocuieste o regula la o anumita pozitie in chain (-R).<br />
4. Sterge o regula la o anumita pozitie in chain, sau prima care se<br />
potriveste (-D).</p>
<p>7.1 Ce vei vedea cand porneste calculatorul</p>
<p>Iptables poate fi un modul, numit (&#8220;iptable_filter.o&#8221;), care ar trebui sa fie<br />
incarcat in mod automat cand rulezi prima oara iptables. Poate fi deasemenea<br />
compilat in kernel in mod permament.</p>
<p>Inainte de rularea oricarei comenzi iptables (ai grija: unele distributii vor<br />
rula iptables in scripturile lor de initializare), nu vor fi reguli in nici<br />
una din chain-urile default (&#8220;INPUT&#8221;, &#8220;OUTPUT&#8221; si &#8220;FORWARD&#8221;), toate<br />
chain-urile vor avea politica de acceptare a pachetelor (ACCEPT). Poti schimba<br />
politica default al chain-ului FORWARD prin stipularea optiunii &#8220;forward=0&#8243;<br />
modulului iptable_filter. (n.t. sau &#8220;echo 0 &gt; /proc/sys/net/ipv4/ip_forward&#8221;,<br />
depinde insa si de distributie, pe redhat default inseamna ca forward-ul<br />
este 0)</p>
<p>7.2 Operatii pentru o singura regula</p>
<p>Aceasta este paine-si-untul, sarea si piperul, si ce mai vreti voi, a filtrarii<br />
de pachete; manipularea regulilor. Cel mai obisnuit, vei folosi probabil<br />
comenzile de adaugare (-A) si stergere (-D). Celelalte (-I pentru inserare<br />
si -R pentru inlocuire) sunt doar extensii ale acestor concepte.</p>
<p>Fiecare regula specifica o multime de conditii pe care un pachet trebuie sa le<br />
indeplineasca si ce sa faca daca acestea sunt indeplinite (o &#8220;tinta&#8221;<br />
(target)). De exemplu, s-ar putea sa doresti sa ignori toate pachetele de<br />
tip ICMP care vin de la adresa 127.0.0.1. Deci, in acest caz conditiile<br />
noastre sunt ca protocolul sa fie ICMP si ca adresa sursa sa fie 127.0.0.1.<br />
&#8220;tinta&#8221; noastra este DROP. 127.0.0.1 este interfata &#8220;loopback&#8221;, pe care o ai<br />
chiar daca nu ai conexiune reala de retea. Poti folosi programul &#8220;ping&#8221;<br />
pentru a genera acest tip de pachete (pur si simplu trimite pachete ICMP de<br />
tip 8 (echo request) la care toate host-urile ar trebui sa raspunda cu<br />
pachete ICMP de tip 0 (echo replay)). Aceast program este foarte folositor<br />
pentru teste.</p>
<p># ping -c 1 127.0.0.1<br />
PING 127.0.0.1 (127.0.0.1): 56 data bytes<br />
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms</p>
<p>&#8212; 127.0.0.1 ping statistics &#8212;<br />
1 packets transmitted, 1 packets received, 0% packet loss<br />
round-trip min/avg/max = 0.2/0.2/0.2 ms<br />
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP<br />
# ping -c 1 127.0.0.1<br />
PING 127.0.0.1 (127.0.0.1): 56 data bytes</p>
<p>&#8212; 127.0.0.1 ping statistics &#8212;<br />
1 packets transmitted, 0 packets received, 100% packet loss<br />
#</p>
<p>Poti vedea aici ca primul ping reuseste (&#8220;-c 1&#8243; spune sa sa trimita doar un<br />
singur pachet).</p>
<p>Apoi adaugam in coada (-A) chain-ului &#8220;INPUT&#8221;, o regula ce spune ca<br />
pentru pachetele de la 127.0.0.1 (&#8220;-s 127.0.0.1&#8243;) de tip ICMP (&#8220;-p icmp&#8221;)<br />
trebuie sa sarim la &#8220;DROP&#8221; (&#8220;-j DROP&#8221;).</p>
<p>Apoi testam regula noastra, folosind al doilea ping. Va fi o pauza pana cand<br />
programul se da batut sa astepte un raspuns care nu va veni niciodata. (:)),<br />
cat de DRAMATIC)</p>
<p>Am putea sa stergem regula in  doua moduri. Intai, deoarece stim ca este<br />
singura regula din chain-ul INPUT, putem folosi o stergere numarata, ca<br />
in:</p>
<p># iptables -D INPUT 1<br />
#</p>
<p>Pentru a sterge regula cu numarul 1 in chain-ul de INPUT.</p>
<p>Al doilea mod este sa scriem comanda prin care am introdus regula -A, dar sa<br />
inlocuim -A cu -D. Aceasta este folositor cand ai un chain complex de reguli<br />
si nu doresti sa le numeri ca sa iti dai seama ca este a 37-a regula de<br />
care vrei sa scapi. In aces caz, vom folosi:</p>
<p># iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP<br />
#</p>
<p>Sintaxa comenzii -D trebuie sa aiba exact aceleasi optiuni cum are comanda -A<br />
(sau -I, sau -R). Daca sunt reguli identice in acelasi chain, numai prima<br />
regula va fi stearsa.</p>
<p>7.3 Optiuni de filtrare</p>
<p>Am vazut folosirea optiunii &#8220;-p&#8221; pentru a specifica protocolul, si optiunii<br />
&#8220;-s&#8221; pentru a specifica adresa sursa, dar sunt alte optiuni pe care le putem<br />
folosi pentru a preciza caracteristici ale pachetului. Ceea ce urmeaza este<br />
un compedium complet.</p>
<p>7.3.1 Specificarea IP-ului sursa si destinatie</p>
<p>Adresele IP ale sursei (&#8220;-s&#8221;, &#8220;&#8211;source&#8221; sau &#8220;&#8211;src&#8221;) si destinatiei (&#8220;-d&#8221;,<br />
&#8220;&#8211;destination&#8221; sau &#8220;&#8211;dst&#8221;) pot fi specificate in patru moduri. Cea mai<br />
obisnuita forma este sa folosesti numele complet, cum ar fi &#8220;localhost&#8221; sau<br />
&#8220;www.securityorg.net&#8221;. Cea de-a doua cale este sa specifici adresa IP cum ar fi<br />
&#8220;127.0.0.1&#8243;.</p>
<p>Cea de a treia si a patra cale permite specificarea unui grup de adrese IP,<br />
cum ar fi &#8220;199.95.207.0/24&#8243; sau &#8220;199.95.207.0/255.255.255.0&#8243;. Amandoua<br />
specifica orice adresa IP de la 199.95.207.0 pana la 199.95.207.255 inclusiv;<br />
cifrele dupa &#8220;/&#8221; spun care parti din adresa IP sunt semnificative. &#8220;/32&#8243; sau<br />
&#8220;/255.255.255.255&#8243; este default (se potriveste cu toata adresa IP). Pentru a<br />
specifica oricare adresa IP &#8220;/0&#8243; poate fi folosit, astfel:</p>
<p>[ NOTA: "-s 0/0" este redundant aici. ]<br />
# iptables -A INPUT -s 0/0 -j DROP<br />
#</p>
<p>Aceasta este folosit in mod rar, deoarece efectul de mai sus este asemanator<br />
cu nespecificare deloc a optiunii &#8220;-s&#8221;.</p>
<p>7.3.2 Specificarea inversa</p>
<p>Multe optiuni, inclusiv optiunile &#8220;-s&#8221; (sau &#8220;&#8211;source&#8221;) si &#8220;-d&#8221;<br />
(&#8220;&#8211;destination&#8221;) pot avea argumentele precedate de &#8220;!&#8221; (pronuntat &#8220;nu&#8221;)<br />
pentru a corespunde adreselor care NU sunt egale cu adresele date. De exemplu,<br />
&#8220;-s ! localhost&#8221; corespunde oricarui pachet care nu vine de la localhost.</p>
<p>7.3.3 Specificarea protocolului</p>
<p>Protocolul poate fi specificat prin optiunea &#8220;-p&#8221; (sau &#8220;&#8211;protocol&#8221;).<br />
Protocolul poate fi un numar ( daca stii valorile numerice de protocol pentru<br />
IP) sau un nume pentru cazurile speciale de &#8220;TCP&#8221;, &#8220;UDP&#8221; sau &#8220;ICMP&#8221;. Nu<br />
conteaza daca se foloseste sau nu CAPS, asa ca &#8220;tcp&#8221; merge la fel ca si<br />
&#8220;TCP&#8221;.</p>
<p>Numele protocolului poate fi precedat de &#8220;!&#8221;, pentru a inversa, ca si &#8220;-p !<br />
tcp&#8221; pentru a specifica pachetele care nu sunt TCP.</p>
<p>7.3.4 Specificarea unei interfete</p>
<p>Optiunea &#8220;-i&#8221; (sau &#8220;&#8211;in-interface&#8221;) si &#8220;-o&#8221; (sau &#8220;&#8211;out-interface&#8221;)<br />
specifica numele interfatei cu care sa corespunda. O interfata este<br />
dispozitivul fizic prin care intra pachetul (&#8220;-i&#8221;) sau prin care iese<br />
pachetul (&#8220;-o&#8221;). Poti folosi comanda ifconfig pentru a lista interfetele<br />
care sunt &#8220;sus&#8221; (i.e., in stare de functionare in acel moment).</p>
<p>Pachetele care traverseaza chain-ul &#8220;INPUT&#8221; nu au o interfata de iesire, asa<br />
ca orice regula care foloseste &#8220;-o&#8221; in acest chain nu se va potrivi<br />
niciodata. In mod similar pachetele care travereseaza chain-ul OUTPUT nu au o<br />
interfata de intrare, asa ca orice regula care foloseste &#8220;-i&#8221; in acest<br />
chain nu se va potrivi niciodata.</p>
<p>Doar pachetele care travereseaza chain-ul FORWARD au o interata de intrare si<br />
de iesire. Este perfect valabil sa specifici o interfata care nu exista;<br />
regula nu se va potrivi cu nici un pachet pana cand interfata nu este sus.<br />
Aceasta este extrem de folositor pentru legaturi PPP de dial-up (de obicei<br />
interfete ppp0) si asemanatoare.</p>
<p>Ca un caz special, un nume de interfata terminandu-se cu &#8220;+&#8221; se va potrivi cu<br />
toate interfetele (fie ca exista sau nu) care incep cu acel sir de caractere.<br />
De exemplu pentru a specifica o regula care sa se potriveasca tuturor<br />
interfetelor PPP, optiunea -i ppp+ ar fi folosita.</p>
<p>Numele interfetei poate fi precedata de &#8220;!&#8221; cu spatii in jur, pentru a<br />
corespunde cu pachetul care nu se potriveste cu intefata specificata, de<br />
exemplu: -i ! ppp+.</p>
<p>7.3.5 Specificarea fragmentelor</p>
<p>Uneori un pachet este prea mare pentru a incape cu totul pe conexiune. Cand<br />
aceasta se intampla, pachetul este divizat in fragmente, si trimis ca pachete<br />
multiple. Celalalt capat reansambleaza aceste fragmente pentru a construi<br />
intregul pachet.</p>
<p>Problema cu fragmentele este ca primul fragment are campurile complete in<br />
header (IP + TCP, UDP si ICMP) pentru a le examina, dar cele care urmeaza au<br />
doar o submultime a header-elor (IP fara campurile protocolului aditional).<br />
De aceea privirea in header-e dupa protocol in pachetelor care urmeaza (cum se<br />
face in cazul  TCP, UDP si ICMP)  nu este posibila.</p>
<p>Daca faci connection tracking sau NAT, atunci toate fragmentele vor fi reunite<br />
inainte de a ajunge la codul filtrului de pachete, asa ca nu trebuie sa te<br />
ingrijorezi vreodata pentru fragmente.</p>
<p>Te rog sa retii de asemenea: chain-ul INPUT al tabelei de filtrare (sau a<br />
oricarei alte tabele care depinde de NF_IP_LOCAL_IN) este traversat dupa<br />
defragmentarea stivei principale IP.</p>
<p>In caz contrar, este important sa stii cum sunt tratate fragmentele de catre<br />
regulile de filtrare. Orice regula de filtrare care cere informatii pe care<br />
nu le avem nu se va potrivi. Aceasta inseamna ca primul fragment este tratat<br />
ca orice alt pachet. Al doilea si urmatoarele nu vor mai fi. De aceea o<br />
regula  -p tcp &#8211;sport www (specificand un port sursa &#8220;www&#8221;) nu se vor potrivi<br />
cu un fragment (altul decat primul). Nici regula opusa nu va face acest lucru<br />
-p tcp &#8211;sport ! www.</p>
<p>Oricum, poti sa specifici o regula special pentru fragmentul al doilea si<br />
urmatoarele, folosind optiunea &#8220;-f&#8221; (sau &#8220;&#8211;fragment&#8221;). Este de asemenea<br />
legal sa specifici ca o regula nu se aplica la al doilea si urmatoarele<br />
fragmente, prin precedarea lui &#8220;-f&#8221; cu &#8220;!&#8221;.</p>
<p>De obicei este considerat sigur sa lasi sa treaca al doilea si urmatoarele<br />
fragmente, deoarece filtrarea va afecta primul fragment, si de aceea previne<br />
reansamblarea pe calculatorul destinatie; cu toate acestea, sunt cunoscute<br />
bug-uri care permit caderea sistemului doar prin simpla trasnmitere de<br />
fragmente. Este decizia ta.</p>
<p>Nota pentru network-heads: pachetele cu malformatii (pachete TCP, UDP si<br />
ICMP prea scurte codului de firewall ca sa citeasca tipul portului sau codul<br />
ICMP si tipul) sunt ignorate cand asemenea examinarii sunt incercate.<br />
Astfel sunt si fragmentele TCP care pornesc de la pozitia 8.</p>
<p>Ca un exemplu, urmatoarea regula va ignora fragmentele care se duc spre<br />
192.168.1.1:</p>
<p># iptables -A OUTPUT -f -d 192.168.1.1 -j DROP<br />
#</p>
<p>7.3.6 Optiuni extinse la iptables: Noi potriviri</p>
<p>iptables este extensibil, asta inseamna ca amandoua, iptables si kernelul pot<br />
fi extinse pentru a suporta noi optiuni.</p>
<p>Unele dintre aceste optiuni sunt standard, altele sunt mai exotice. Aceste<br />
optiuni pot fi facute de catre alti oameni si distribuite.</p>
<p>Extensiile kernelului sunt gasite deobicei in subdirectorul de module ale<br />
kernelului cum ar fi /lib/modules/2.4.0-test10/kernel/net/ipv4/netfilter. Ele<br />
se incarca automat daca kernelul tau a fost compilat cu optiunea CONFIG_KMOD,<br />
asa ca nu o sa fie necesar sa le incarci manual.</p>
<p>Extensiile la programul iptables sunt librarii shared care de obicei se gasesc<br />
in /usr/local/lib/iptables/, deseamenea o distributie poate sa le puna in<br />
directorul /lib/iptables sau /usr/lib/iptables.</p>
<p>Optiuniile vin in doua feluri: noi tinte si noi potriviri (vom vorbi despre<br />
tinte ceva mai tarziu). Unele protocoale automat ofera noi teste pentru<br />
pachete: in mod curent acestea sunt TCP, UDP si ICMP, cum sunt aratate mai jos.</p>
<p>Pentru acestea vei putea sa specifici noile teste in linia de comanda dupa<br />
optiunea &#8220;-p&#8221;, care va pune la dispozitie automat optiunile extinse. Pentru<br />
a preciza teste noi, foloseste optiunea &#8220;-m&#8221; pentru a incarca extensia, dupa<br />
care optiunile extinse vor putea fi folosite.</p>
<p>Pentru a vedea help-ul pentru  optiunile extinse foloseste optiunea de<br />
incarcare (&#8220;-p&#8221;, &#8220;-j&#8221; sau &#8220;-m&#8221;) urmat de &#8220;-h&#8221; sau &#8220;&#8211;help&#8221;, de exemplu:</p>
<p># iptables -p tcp &#8211;help<br />
#</p>
<p>7.3.6.1 Optiuni extinse TCP</p>
<p>Optiunile extinse TCP sunt disponibile in mod automat daca se specifica<br />
optiunea &#8220;-p tcp&#8221;. Aceste optiuni sunt urmatoarele (nici una dintre ele nu<br />
se vor potrivi cu fragmente):</p>
<p>&#8211;tcp-flags<br />
poate fi urmat de semnul optional &#8220;!&#8221;, apoi de doua siruri de<br />
flag-uri, care permite filtrarea dupa anumite flag-uri. Primul sir de<br />
flag reprezinta mask-ul, flag-urile pe care doresti a le examina. Al<br />
doilea sir reprezinta care dintre acestea ar trebui sa fie prezente.<br />
De exemplu:</p>
<p># iptables -A INPUT &#8211;protocol tcp &#8211;tcp-flags ALL SYN,ACK -j DROP</p>
<p>Aceasta comanda spune ca toate flag-urile trebuiesc examinate (&#8220;ALL&#8221;<br />
este sinonim cu &#8220;SYN,ACK,FIN,RST,URG,PSH&#8221;), dar doar SYN si ACK<br />
trebuie sa fie setate. Exista de asemnea un argumente &#8220;NONE&#8221; similar<br />
pentru nici unul dintre acestea.</p>
<p>&#8211;syn<br />
In mod optional precedata de semnul &#8220;!&#8221;, este o prescurtare pentru<br />
&#8220;&#8211;tcp-flags  SYN,RST,ACK SYN&#8221;</p>
<p>&#8211;source-port<br />
poate fi urmat de un optional &#8220;!&#8221;, si fie de un singur port, fie<br />
de o sir de porturi. Porturile pot fi specificate fie folosind numere<br />
fie folosind nume, asa cum sunt specificate in /etc/services.<br />
sirurile se specifica prin doua porturi despartite de &#8220;:&#8221;, sau<br />
(pentru a specifica o sir de porturi mai mare sau egal cu un port<br />
dat) un port urmat de &#8220;:&#8221;, sau (pentru a specifica o lista de porturi<br />
mai mica sau egala decat un port dat) un port precedat de &#8220;:&#8221;.</p>
<p>&#8211;sport este sinonim cu &#8211;source-port</p>
<p>&#8211;destination-port<br />
si<br />
&#8211;dport<br />
sunt similare cu modul in care se specifica portul sursa numai ca in<br />
loc de portul sursa se face potrivirea dupa portul destinatie.</p>
<p>&#8211;tcp-option<br />
urmat de un optional &#8220;!&#8221; si un numar, se potriveste pentru un<br />
pachet cu optiunea TCP egala cu acel numar. Un pachet care nu are un<br />
header complet TCP este ignorat automat daca este facuta incercarea<br />
de a se examina headerele TCP.</p>
<p>7.3.6.1.1 O explicatie pentru flag-urile TCP</p>
<p>Uneori este folositor sa permiti conexiunile TCP intr-o singura directie, nu<br />
si in cealalta. De exemplu, ai putea sa permiti conexiuni catre un server<br />
extern WWW, dar nici o conexiune de la acel server.</p>
<p>Naiv ar fi sa blochezi pachetele TCP dinspre server. Din pacate, conexiunile<br />
TCP cer pachetele sa circule in ambele directii.</p>
<p>Solutia ar fi sa blochezi numai pachetele folosite pentru a initia<br />
conexiuni. Aceste pachete sunt numite pachete SYN (ok, tehnic sunt pachete cu<br />
flag SYN pus si cu flagurile RST si ACK nepuse, dar le numim pe scurt<br />
pachete SYN). Prin ignorarea acestor pachete, putem sa oprim aceste<br />
conexiuni.</p>
<p>Optiunea &#8220;&#8211;syn&#8221; este folosita pentru aceasta; este valida numai pentru<br />
regulile in care specificam tcp ca protocol. De exemplu, pentru a specifica<br />
incercarile de conexiune de la 192.168.1.1:</p>
<p>-p TCP -s 192.168.1.1 &#8211;syn</p>
<p>Aceasta optiune poate fi inversat prin precedarea &#8220;&#8211;syn&#8221; cu semnul &#8220;!&#8221;.</p>
<p>7.3.6.2 Optiuni extinse UDP</p>
<p>Aceste optiuni sunt automat disponibile cand se specifica &#8220;-p udp&#8221;. Acestea<br />
sunt: &#8220;&#8211;source-port&#8221;, &#8220;&#8211;sport&#8221;,&#8221;&#8211;destination-port&#8221; si &#8220;&#8211;dport&#8221; care au<br />
fost detaliate mai sus.</p>
<p>7.3.6.3 Optiuni extinse ICMP</p>
<p>Aceste optiuni sunt automat disponibile cand se specifica &#8220;-p icmp&#8221;. Este<br />
doar o singura optiune noua:</p>
<p>&#8211;icmp-type<br />
urmat de un semnul optional &#8220;!&#8221;, apoi de numele tipului icmp (ex.<br />
&#8220;host-unreachable&#8221;), sau tipul numeric (ex. &#8220;3&#8243;), sau tipul numeric<br />
si codul separate de &#8220;/&#8221; (ex. &#8220;3/3&#8243;). O lista a numelor de tipuri de<br />
pachete icmp este data folosind &#8220;-p icmp &#8211;help&#8221;.</p>
<p>7.3.6.4 Alte optiuni extinse pentru potrivire</p>
<p>Alte optiuni extinse in pachtetul de filtrare sunt optiuni demonstrative,<br />
care (daca sunt instalate) pot fi invocate cu optiunea &#8220;-m&#8221;.</p>
<p>mac</p>
<p>Acest modul trebuie in mod explicit specificat prin optiunea &#8220;-m mac&#8221;<br />
sau &#8220;&#8211;match mac&#8221;. Este folosit pentru a se potrivi cu pachetele ce au o<br />
anumita adresa ethernet MAC, si de aceea este folositoare numai<br />
pentru pachetele care traverseaza chain-urile PREROUTING si INPUT.<br />
Este disponibila o singura optiune noua:</p>
<p>&#8211;mac-source<br />
urmat de semnul optional &#8220;!&#8221;, apoi de o adresa ethernet in notatie<br />
hexa separata prin &#8220;:&#8221;, ex. &#8220;&#8211;mac-source 00:60:08:91:CC:B7&#8243;.</p>
<p>limit</p>
<p>Acest modul trebuie in mod explicit specificat prin optiunea &#8220;-m limit&#8221;<br />
sau cu &#8220;&#8211;match limit&#8221;. Este folosit pentru a restrange rata de<br />
potriviri, ca de exemplu pentru reprimarea mesajelor in log-uri<br />
(log-urile sunt fisierele in care sistemul scrie anumite date<br />
considerate importante, in ideea de a putea fi accesate mai tarziu). Se<br />
vor potrivi numai un numar dat de pachete pe secunda (default 3<br />
potriviri pe ora, la un numar maxim de 5 potriviri). Sunt disponibile<br />
doua optiuni:</p>
<p>&#8211;limit<br />
urmat de un numar; specifica numarul maxim de potriviri permise pe<br />
secunda. Numarul poate fi specificat pe unitati de timp explicite,<br />
folosind &#8220;/second&#8221;, &#8220;/minute&#8221;, &#8220;/hour&#8221; or &#8220;/day&#8221;, sau parti din ele<br />
(ex. &#8220;5/second&#8221; este la fel cu &#8220;5/s&#8221;).</p>
<p>&#8211;limit-burst<br />
urmat de un numar, indica numarul maxim de potriviri dupa care limita<br />
de mai sus intra in actiune.</p>
<p>Aceasta potrvire poate adesea fi folosita cu tinta LOG pentru a face<br />
logare limitata dupa o rata. Pentru a intelege cum functioneaza sa ne<br />
uitam la urmatoarea regula care logheaza cu parametri de limita default:</p>
<p># iptables -A FORWARD -m limit -j LOG</p>
<p>Prima data cand se ajunge la aceasta regula, pachetul va fi scris in<br />
log-uri, de fapt, deorece numarul limita este 5, primele 5 pachete vor<br />
ajunge in log-uri. Dupa aceasta vor trece 20 de minute pana cand alt<br />
pachet sa ajunga in log-uri datorita acestei reguli, fara sa conteze<br />
numarul de pachete care ajung la regula. Dupa 20 de minute<br />
limit-burst-ul,	numarul de pachete care vor putea fi primite va fi unu,<br />
dupa inca 20 de minute va mai creste cu o unitate, daca nici un pachet<br />
nu s-a potrivit cu regula. Deasemenea, la fiecare 20 de minute	care<br />
trec fara ca pachete sa se potriveasca  regulii, numarul limita va<br />
creste cu o unitate; daca nici un pachet nu se potriveste cu regula dupa 	100 de minute, numarul limita va fi din nou atins, inapoi de unde am<br />
plecat.</p>
<p>Nota: nu poti crea o regula cu un timp de reincarcare mai mare de 59<br />
de ore, asa ca daca pui o limita de 1/zi, atunci numarul maxim de<br />
potriviri (burst-rate) trebuie sa fie mai mic decat 3.</p>
<p>Poti de asemenea sa folosesti acest modul pentru a te feri de<br />
diferitele atacuri denial of service (DoS) cu o rata mai mare pentru a<br />
creste sensibilitatea.</p>
<p>Protectie pentru syn-flood:</p>
<p># iptables -A FORWARD -p tcp &#8211;syn -m limit 1/s -j ACCEPT</p>
<p>Pentru scannere de porturi clandestine:</p>
<p># iptables -A FORWARD -p tcp &#8211;tcp-flags SYN,ACK,FIN,RST RST<br />
-m limit &#8211;limit 1/s -j ACCEPT</p>
<p>Pingul mortii:</p>
<p># iptables -A FORWARD -p icmp &#8211;icmp-type echo-request -m<br />
-m limit &#8211;limit 1/s -j ACCEPT</p>
<p>Acest modul se comporta ca o &#8220;usa histeresis&#8221;, ca in graficul urmator:</p>
<p>rata (pachete/s)<br />
^        .&#8212;.<br />
|       / DoS \<br />
|      /       \<br />
Limita   DoS -|&#8230;..:&#8230;&#8230;&#8230;\&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..<br />
= (limit *  |    /:          \<br />
limit-burst) |   / :           \         .-.<br />
|  /  :            \       /   \<br />
| /   :             \     /     \<br />
End of DoS  -|/&#8230;.:&#8230;&#8230;&#8230;&#8230;..:&#8230;/&#8230;&#8230;.\&#8230;./.<br />
= limit     |     :              :&#8221;-&#8221;         &#8220;&#8211;&#8221;<br />
&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt; time (s)<br />
LOGIC =&gt;  Potrivire | Nepotrivire  |  Potrivire</p>
<p>Sa consideram ca avem o potrivire de un pachet pe secunda cu o<br />
limita maxima de 5 pachete, dar pachetele vin cu o rata de patru pe<br />
secunda timp de 3 secunde, apoi incep din nou sa vina peste 3 secunde.</p>
<p>&lt;&#8211;Flood 1&#8211;&gt;           &lt;&#8212;Flood 2&#8212;&gt;</p>
<p>Pachete^                   Line  __&#8211;      YNNN<br />
total  |               Rate  __&#8211;      YNNN<br />
|            mum  __&#8211;      YNNN<br />
10 |        Maxi __&#8211;         Y<br />
|         __&#8211;            Y<br />
|     __&#8211;               Y<br />
| __&#8211;    YNNN<br />
|-    YNNN<br />
5 |    Y<br />
|   Y         Legenda:  Y -&gt; se potriveste cu regula<br />
|  Y          	  	 N -&gt; nu se potriveste cu regula<br />
| Y<br />
|Y<br />
0 +&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&gt; timpul in<br />
secunde<br />
0   1   2   3   4   5   6   7   8   9  10  11  12</p>
<p>Se poate vedea ca primele 5 pachete sunt permise sa depaseasca limita<br />
de un pachet pe secunda, apoi limit intervine. Daca este o  pauza de o<br />
secunda inca un pachet in plus va fi permis sa treaca. Intodeauna<br />
insa, nu se va permite depasirea de un pachet/secunda dupa ca<br />
numarul limita (burst-limit) este atins.</p>
<p>owner</p>
<p>acest modul incearca sa se potriveasca trasaturilor diferite ale<br />
creatorului pachetului, pentru pachetele generate local. Este valid<br />
numai in chain-ul OUTPUT, si chiar si atunci unele pachete (cum ar<br />
fi raspunsurile de tip ICMP) pot sa nu aiba creator, si de aceea sa<br />
nu se potriveasca.</p>
<p>&#8211;uid-owner userid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de user.</p>
<p>&#8211;gid-owner groupid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de group.</p>
<p>&#8211;pid-owner processid<br />
se potriveste daca pachetul a fost creat de catre un proces cu<br />
acelasi id de proces.</p>
<p>&#8211;sid-owner sessionid<br />
se potriveste daca pachetul a fost creat de catre un proces in grupul<br />
de sesiune dat.</p>
<p>unclean</p>
<p>Acest modul experimental trebuie sa fie in mod explicit specificat cu<br />
optiunea &#8220;-m unclean&#8221; sau &#8220;&#8211;match unclean&#8221;. Realizeaza niste teste<br />
variate de sanatate asupra pachetelor. Acest modul nu a fost testat,<br />
si nu ar trebui sa fie folosit ca o unealta in securitate (probabil<br />
ca inrautateste lucrurile din cauza ca el insusi s-ar putea sa aiba<br />
buguri). Nu este disponibila nici o optiune.</p>
<p>7.3.6.5 Potrivirea dupa stare</p>
<p>Cele mai folositoare optiuni este furnizata de modulul &#8220;state&#8221;, care<br />
interpreteaza analizele detectorului de conexiuni ale modulului<br />
&#8220;ip_conntrack&#8221;. Aceasta este foarte recomandata.</p>
<p>Specificarea modulului &#8220;-m state&#8221; permite folosirea unei optiuni<br />
aditionale de stare  &#8220;&#8211;state&#8221;. Aceste stari sunt:</p>
<p>NEW<br />
un pachet care creeaza o noua conexiune.</p>
<p>ESTABLISHED<br />
un pachet care apartine unei conexiuni deja stabilite (un pachet<br />
replica (replay), sau un pachet care pleaca al unei conexiuni care a primit<br />
replayuri).</p>
<p>RELATED<br />
Un pachet care este inrudit, dar care nu este parte a unei conexiuni existente,<br />
cum ar fi o eroare ICMP, sau (cu modulul FTP introdus), un pachet care<br />
stabileste o conexiune FTP.</p>
<p>INVALID<br />
Un pachet care nu a putut fi identificat pentru niste motive: aceasta include<br />
ramanerea fara memorie sau erori ICMP care nu apartin nici unei conexiuni<br />
cunoscute. In mod normal aceste pachete ar trebui ignorate.</p>
<p>Un exemplu pentru aceasta puternica optiune de potrivire ar fi:</p>
<p># iptables -A FORWARD -i ppp0 -m state ! NEW -j DROP</p>
<p>7.4 Argumente asupra tintei</p>
<p>Acum stim ce examinare poate fi facuta asupra unui pachet, avem nevoie de o<br />
cale pentru a preciza ce sa facem cu pachetele care se potrivesc  testelor<br />
noastre. Aceasta este numita tinta unei reguli.</p>
<p>Exista doua foarte simple tinte incluse: DROP si ACCEPT. Ne-am intalnit deja<br />
cu aceastea. Daca o regula se potriveste cu un pachet si tinta regulii este<br />
una din aceste doua, nici una din regulile urmatoare nu  sunt consultate,<br />
soarta pachetului a fost decisa.</p>
<p>Mai sunt doua tipuri de tinte pe langa acestea incluse: tinte extinse si<br />
chain-urile definite de catre utilizator.</p>
<p>7.4.1 Chain-uri definite de utilizator</p>
<p>O caracteristica puternica pe care iptables o mosteneste de la ipchains este<br />
posibilitatea utilizatorului de a crea chain-uri noi, pe langa cele incluse<br />
default (INPUT, OUTPUT si FORWARD). Prin conventie, chain-urile definite de<br />
catre utilizator se scriu cu litera mica pentru a le deosebi (vom descrie<br />
mai jos cum sa cream acest tip de chain-uri in &#8220;7.5 Operatii asupra unui<br />
intreg chain&#8221;).</p>
<p>Cand un pachet se potriveste cu o regula a carei tinta este un chain definit<br />
de catre utilizator, pachetul incepe sa traverseze chain-ul definit de catre<br />
utilizator. Daca acel chain-ul nu decide soarta pachetul de indata ce<br />
pachetul ajunge la sfarsitul chain-ului respectiv, pachetul continua<br />
traversarea  chain-ului initial.</p>
<p>Este timpul pentru niste arta ASCII. Considera doua chain-uri aiurea: INPUT<br />
(chain-ul inclus default) si test (un chain definit de utilizator).</p>
<p>&#8220;INPUT&#8221;                         &#8220;test&#8221;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
| Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|<br />
| Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
| Rule3: -p UDP -j DROP    |<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>Considera un pachet TCP venind de la 192.168.1.1 si ducandu-se catre 1.2.3.4.<br />
Acesta intra in chain-ul INPUT. Rule1 nu se potriveste cu el, Rule2 se<br />
potriveste asa ca urmatoarea regula care este examinata este prima din<br />
chain-ul test. Rule1 se potriveste dar nu este specificata nici o tinta,<br />
asa ca urmatoarea regula este examinata. Rule2 nu se potriveste asa ca am<br />
ajuns la sfarsitul chain-ului. Astfel ne reintoarcem in chain-ul INPUT, unde<br />
am examinat Rule2, asa ca examinam Rule3 care nici aceasta nu se potriveste.</p>
<p>Deci calea urmata de catre pachet este:</p>
<p>v    __________________________<br />
&#8220;INPUT&#8221;                |   /    &#8220;test&#8221;                v<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8211;/    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|&#8212;-<br />
| Rule1                 | /|    | Rule1                |   |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|/-|    |&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|&#8212;|<br />
| Rule2                 /  |    | Rule2                |   |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;|    &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;v&#8212;-<br />
| Rule3 	               /&#8211;+___________________________/<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|&#8212;<br />
v</p>
<p>Chain-urile definite de catre utilizator pot sari la alte chain-uri definite<br />
de catre utilizator (dar nu crea trasee in cerc, pachetele tale vor fi<br />
ignorate daca intra in bucla).</p>
<p>7.4.2 Optiuni extinse la iptables: Noi tinte</p>
<p>Celalat tip de optiune extinsa este o tinta. O tinta extinsa este formata<br />
dintr-un modul de kernel si o extensie optionala la iptables pentru a pune<br />
la dispozitie noi optiuni in linia de comanda. Sunt mai multe optiuni<br />
extinse in distributia default a netfilter-ului:</p>
<p>LOG</p>
<p>Acest modul permite log-area de catre kernel a pachetelor care se<br />
potrivesc. Acest modul pune la dispozitie urmatoarele optiuni<br />
aditionale:</p>
<p>&#8211;log-level<br />
urmat de un numar al nivelului sau de un nume. Numele corecte sunt<br />
(nu conteaza daca sunt scrise cu litera mare sau nu) &#8220;debug&#8221;, &#8220;info&#8221;,<br />
&#8220;notice&#8221;, &#8220;warning&#8221;, &#8220;err&#8221;, &#8220;crit&#8221; and &#8220;emerg&#8221;, corespunzand numerelor<br />
de la 7 la 0. Citeste man-ul de la syslog.conf pentru o explicatie<br />
privind aceste niveluri de logare. Nivelul default este &#8220;warning&#8221;.</p>
<p>&#8211;log-prefix<br />
urmat de un sir de caractere pana la 29 de caractere, acest mesaj<br />
este pus in fata mesajului care este logat, pentru a-i permite<br />
identificarea unica.</p>
<p>Acest modul este bun dupa o limita de potrivire, pentru a nu-ti<br />
flooda fisierele de log.</p>
<p>REJECT</p>
<p>Acest modul are acelasi efect cu &#8220;DROP&#8221;, cu exceptia faptului ca<br />
celui ce trimite pachetele ii este trimis mesaj de eroare ICMP &#8220;port<br />
unreachable&#8221;. Bagati la cap ca mesajul de eroare ICMP nu este trimis<br />
daca (citeste RFC 1122):<br />
- pachetul de il filtrezi a fost de la inceput o eroare ICMP<br />
sau alt tip de pachet ICMP necunoscut.<br />
- pachetul ce este filtrat nu este un fragment de inceput.<br />
- am trimis recent prea multe mesaje de eroare ICMP catre acea<br />
destinatie ( cat /proc/sys/net/ipv4/icmp_ratelimit).<br />
REJECT pune de asemenea la dispozitie o noua optiune<br />
&#8220;&#8211;reject-with&#8221; care modifica pachetul folosit la replay: man<br />
iptables.</p>
<p>7.4.3 Tinte speciale construite default</p>
<p>Sunt doua tinte speciale contruite default: RETURN si QUEUE.</p>
<p>RETURN are acelasi efect cu trecerea direct la sfarsitul chain-ului: pentru<br />
o regula in chain-ul inclus default politica acelui chain-ului este executata.<br />
Pentru o regula intr-un chain definit de catre utilizator, traversarea continua in<br />
chain-ul anterior, exact dupa regula care a determinat trecerea la acest<br />
chain.</p>
<p>QUEUE este o tinta speciala, care pune in rand pachetul pentru procesare de<br />
catre programe utilizator. Pentru ca aceasta sa fie folositor doua urmatoare<br />
componente sunt cerute:</p>
<p>- un &#8220;gestionar al cozii&#8221;, care se ocupa de mecanismele propriu-zise de<br />
trecere a pachetelor intre kernel si modul utilizator; si</p>
<p>- un program in mod utilizator pentru a primi, posibil a manipula, si a<br />
da verdicte in ceea ce priveste pachetele.</p>
<p>Gestionarul standard al cozii pentru iptables IPv4 este modulul ip_queue, care<br />
este distribuit cu kernelul si considerat experimental.</p>
<p>Ceea ce urmeaza este un scurt exemplu despre cum sa folosesti iptables pentru<br />
a pune in coada pachetele pentru procesare in mod utilizator:</p>
<p># modprobe iptable_filter<br />
# modprobe ip_queue<br />
# iptables -A OUTPUT -p icmp -j QUEUE</p>
<p>Cu aceasta regula, pachetele ICMP  generate local (care sunt create<br />
, sa zicem, cu ping) sunt pasate modulului ip_queue, care apoi incearca sa<br />
livreze pachetele unei aplicatii in mod utilizator. Daca nici o<br />
aplicatie nu asteapta acele pachete, acestea sunt ignorate.</p>
<p>Pentru a scrie o aplicatie in mod utilizator, poti folosi libipq API. Acesta<br />
este distribuit impreuna cu iptables. Cod exemplu poate fi gasit in programele<br />
de testare (redirect.c) in CVS.</p>
<p>Starea lui ip_queue poate fi verificata prin:</p>
<p>/proc/net/ip_queue</p>
<p>Marimea maxima a unei cozi (i.e. numarul de pachete livrata modului utilizator<br />
fara primirea inapoi a unei comfirmari) poate fi controlat prin:</p>
<p>/proc/sys/net/ipv4/ip_queue_maxlen</p>
<p>Marimea default pentru marimea maxima a cozii este 1024. Odata ce aceasta<br />
limita este atinsa, noile pachete vor fi ignorate pana cand marimea cozii<br />
scade sub nivelul limita. Protocoale bine gandite ca TCP interpreteaza<br />
pachetele ignorate ca aglomerare, si din fericire va inceta livrarea de<br />
pachete cand coada este plina. Cu toate acestea, va lua ceva experimente<br />
pentru a determina valoare ideala pentru marimea cozii pentru o situatie data<br />
daca valoarea default este prea mica.</p>
<p>7.5 Operatii asupra unui intreg chain</p>
<p>O foarte folositoare caracteristica a iptables-ului este posibilitatea de a<br />
grupa mai multe reguli intr-un chain. Poti numi chain-urile cum doresti, dar<br />
recomand folosirea literelor mici pentru a evita confuzia cu chain-urile<br />
incluse default si tinte. Numele de chain-uri pot fi pana la 31 de litere in<br />
lungime.</p>
<p>7.5.1 Creearea unui nou chain</p>
<p>Sa cream un nou chain. Pentru ca sunt un tip cu atata imaginatie o sa o<br />
numesc test. Pentru aceasta folosim optiunea &#8220;-N&#8221; sau &#8220;&#8211;new-chain&#8221;:</p>
<p># iptables -N test<br />
#</p>
<p>Este atat de simplu. Acum poti introduce reguli in el cum am aratat mai sus.</p>
<p>7.5.2 Stergerea unui chain</p>
<p>Si sergerea unui chain este deasemenea simpla, prin folosirea optiunilor &#8220;-X&#8221;<br />
sau &#8220;&#8211;delete-chain&#8221;. De ce &#8220;-X&#8221;? Pai toate literele bune au fost luate.</p>
<p># iptables -X test<br />
#</p>
<p>Sunt cateva restricitii la stergerea de chain-uri: acestea trebuie sa fie<br />
goale (vezi &#8220;Stergerea tuturor regulilor unui chain&#8221; dedesubt) si nu trebuie<br />
sa fie tinta nici unei reguli. Nu poti sterge nici unul dintre chain-rile<br />
incluse default.</p>
<p>Daca nu specific numele chain-ului, atunci toate chain-urile definite de catre<br />
utilizator vor fi sterse daca este posibil.</p>
<p>7.5.3 Stergerea tuturor regulilor unui chain</p>
<p>Exista un mod simplu de de sterge toate regulile dintr-un chain, folosind<br />
optiunile &#8220;-F&#8221; (sau &#8220;&#8211;flush&#8221;).</p>
<p># iptables -F FORWARD<br />
#</p>
<p>Daca nu este specificat chain-ul atunci toate chain-urile vor fi sterse de<br />
reguli.</p>
<p>7.5.4 Listarea unui chain</p>
<p>Poti lista toate regulile dintr-un chain prin folosirea optiunii &#8220;-L&#8221; (sau<br />
&#8220;&#8211;list&#8221;).</p>
<p>&#8220;refcnt-ul&#8221;(reference count) listat pentru fiecare chain definit de catre<br />
utilizator  este numarul de reguli care au ca tinta acest chain. Acesta<br />
trebuie sa fie zero (si chain-ul sa fie gol) inainte ca acest chain sa poata<br />
fi sters.</p>
<p>Daca numele chain-ului este omis, toate chain-urile sunt listate, chiar si<br />
cele care sunt goale.</p>
<p>Exista trei optiuni care pot fi adaugate la &#8220;-L&#8221;. Optiunea &#8220;-n&#8221; (numeric)<br />
este foarte folositoare deoarece previne iptables in a incerca sa rezolve<br />
IP-urile in nume, care (daca folosesti DNS ca majoritatea oamenilor) va cauza<br />
mari intarzieri daca DNS-ul tau nu este setat corect, sau ai filtrat cererile<br />
catre DNS. Determina deasemenea ca porturile TCP si UDP sa fie afisate ca<br />
numere in loc de nume.</p>
<p>Optiunea &#8220;-v&#8221; arata toate detaliile regulilor, cum ar fi counter-ele pentru de<br />
pachete si bytes, comparatiile TOS, interfata. Altfel aceste detalii sunt<br />
omise.</p>
<p>Observa faptul urmator: counter-ele pentru pachete si bytes sunt afisate<br />
folosind sufixele &#8220;K&#8221;, &#8220;M&#8221; sau &#8220;G&#8221; pentru 1000, 1,000,000 si respectiv<br />
1,000,000,000. Folosirea lui optiunii &#8220;-x&#8221; (expandare a numerelor) afiseaza<br />
numerele in formatul maxim, fara sa conteze cat sunt de mari.</p>
<p>7.5.5 Resetarea counter-elor</p>
<p>Este folositoare posibilitatea de a putea sa resetezi counter-ele. Aceasta<br />
poate fi facuta cu optiune &#8220;-Z&#8221; (sau &#8220;&#8211;zero&#8221;).</p>
<p>Considera urmatoarele:</p>
<p># iptables -L FORWARD<br />
# iptables -Z FORWARD<br />
#</p>
<p>In exemplul de mai sus, unele pachete au putut sa vina intre cele doua<br />
comenzi. Pentru acest motiv, poti folosi cele doua optiuni &#8220;-L&#8221; si &#8220;-Z&#8221;<br />
impreuna, pentru a reseta counter-ele in timp ce le afisezi.</p>
<p>7.5.6 Setarea policy-ului</p>
<p>Am explicat ce se intampla cand un pachet ajunge la capatul unui chain inclus<br />
default si am discutat mai devreme cum parcurge un pachet chain-urile. In<br />
acest caz, policy-ul chain-ului determina soarta pachetului. Doar chain-urile<br />
incluse default (INPUT, OUTPUT si FORWARD) au policy-uri, deoarece daca un<br />
pachet ajunge la capatul unui chain definit de catre utilizator, traversarea<br />
continua in chain-ul anterior.</p>
<p>Politica poate fi fie ACCEPT, fie DROP, de exemplu:</p>
<p># iptables -P FORWARD drop<br />
#</p>
<p>8. Folosirea ipchains si ipfwadm</p>
<p>Sunt module in distributia netfilter pe nume ipchains.o si ipfwadm.o.<br />
Insereaza unul dintre acestea in kernelul tau ( Observatie: aceste module<br />
sunt incompatibile cu ip_tables.o). Apoi poti folosi ipchains sau ipfwadm  ca<br />
in vremurile de alta data.</p>
<p>Aceasta va fi suportata pentru inca un timp. Cred ca o formula rezonabila<br />
este 2 * [nota inlocuirii - prima versiune stabila], dupa data cand o versiune<br />
stabila a inlocuirii este disponibila.<br />
Asta inseamna ca suportul va fi probabil abandonat in Linux 2.6 sau 2.8.</p>
<p>9. Folosirea impreuna a NAT-ului si a filtrarii de pachete</p>
<p>Este normal sa vrei sa faci NAT (vezi NAT HOWTO) si filtrare de pachete.<br />
Veste buna este ca se pot folosi impreuna extrem de bine.</p>
<p>Faci filtrarea de pachete ingorand total orice NAT ai deja. Sursa si<br />
destinatia vazute de catre filtrul de pachete vor fi sursele si destinatiile<br />
reale. De exemplu daca faci DNAT pentru a trimite orice conexiune pentru<br />
1.2.3.4 portul 80 spre 10.1.1.1 portul 8080, filtrul de pachete va vedea<br />
pachetele ducandu-se catre 10.1.1.1 portul 8080 (adresa reala), nu 1.2.3.4<br />
port 80. In mod similar poti ignora masquerading: pachetele vor parea ca vin<br />
de la adresa lor IP interna reala (sa zicem 10.1.1.1), si replay-urile vor<br />
parea ca se duc inapoi acolo.</p>
<p>Poti folosi optiunea extinsa de potrivire &#8220;match&#8221; fara sa pui filtrul de<br />
pachete sa faca munca in plus, deoarece NAT cere detectarea de conexiuni<br />
oricum. Pentru a dezvolta exemplul simplu de masquerading din NAT HOWTO pentru<br />
a nu permite noi conexiuni pe interfata ppp0, vei face urmatoarele:</p>
<p># masquerading pentru ppp0<br />
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE</p>
<p># refuzarea de pachete NOI sau INVALIDE forwardate sau care vin prin ppp0<br />
iptables -A INPUT -i ppp0 -m state &#8211;state NEW,INVALID -j DROP<br />
iptables -A FORWARD -i ppp0 -m state &#8211;state NEW,INVALID -j DROP</p>
<p># se da drumu la IP forwarding<br />
echo 1 &gt; /proc/sys/net/ipv4/ip_forward</p>
<p>10. Diferente intre iptables si ipchains</p>
<p>o In primul rand, numele chain-urilor predefinite si-au schimbat scrierea din<br />
litere mici in litere mari, deoarece chain-urile INPUT si OUTPUT primesc acum<br />
doar pachete cu destinatie locala si pachete generate local. Ele obisnuiau<br />
sa vada toate pachetele care intrau si respectiv care ieseau.</p>
<p>o Optiunea &#8220;-i&#8221; acum inseamna interfata de intrare si are sens numai in<br />
chain-urile INPUT si FORWARD. Regulile in chain-urile OUTPUT si FORWARD care<br />
foloseau inainte &#8220;-i&#8221; vor trebuie sa fie schimbate cu &#8220;-o&#8221;.</p>
<p>o Porturile TCP si UDP trebuie sa fie precizate folosind optiunile<br />
&#8211;source-port  sau &#8211;sport (sau &#8211;destination-port/&#8211;dport), si trebuie<br />
puse dupa optiunile &#8220;-p tcp&#8221; sau &#8220;-p udp&#8221;, deorece acestea incarca optiunile<br />
disponibile extensiilor TCP si respectiv UDP.</p>
<p>o Argumentul TCP -y a devenit acum &#8211;syn si trebuie pus dupa &#8220;-p tcp&#8221;.</p>
<p>o In cele din urma tinta DENY a deveni DROP.</p>
<p>o Resetarea counter-elor pentru un singur chain in timp concomitent cu<br />
listarea acestuia este acum posibila.</p>
<p>o Resetara counter-elor pentru chain-urile predefinite resetezeaza desemenea<br />
counter-ele policy-ului chain-urilor respective.</p>
<p>o Listarea counter-elor iti arata counter-ele instant.</p>
<p>o REJECT si LOG sunt acum tinte extinse, insemnand ca sunt module de kernel<br />
separate.</p>
<p>o Numele pentru chain-uri pot fi pana la 31 de caractere in lungime.</p>
<p>o MASQ este acum MASQUERADE si foloseste o sintaza diferita. REDIRECT, desi<br />
si-a pastrat vechiul nume, a suferit deasemenea o schimbare de sintaxa.<br />
Citeste NAT-HOWTO pentru mai multe informatii despre cum sa le configurezi.</p>
<p>o Optiunea &#8220;-o&#8221; nu mai este folosita pentru a conduce pachetele in mod<br />
utilizator (vezi -i de mai sus). Pachetele sunt trimise acum in mod utilizator<br />
folosind tinta QUEUE.</p>
<p>o Probabil o gramada de alte lucruri pe care le-am uitat.</p>
<p>11. Sfaturi asupra designului filtrului de pachete</p>
<p>In domeniul securitatii cel mai bun lucru este sa blochezi totul, apoi sa<br />
deschizi gauri acolo unde este necesar. Aceasta este deobicei spus &#8220;ceea ce nu<br />
este in mod explicit permis este interzis&#8221;. Recomand aceasta  daca securitatea<br />
este grija ta cea mai mare.</p>
<p>Nu rula nici un serviciu de care nu ai nevoie, chiar daca ai blocat accesul la<br />
el.</p>
<p>Recomand securitatea in adancime: combina tcp-wrappers (pentru conexiuni catre<br />
insusi filtrul de pachete), proxy-uri (pentru conexiuni ce trec peste filtrul<br />
de pachete), verificarea routei si filtrare de pachete. Verificarea routei<br />
este cand un pachet care vine de la o interfata de la care nu poate veni este<br />
ignorate: de exemplu, daca reteaua ta interna are adresele 10.1.1.0/24, si<br />
un pachet care are ca sursa o adresa apartinand acelei clase vine pe<br />
interfata externa, acesta va fi ignorat. Aceasta verificare a routei poate<br />
fi activate pentru o interfata (ppp0) astfel:</p>
<p># echo 1 &gt; /proc/sys/net/ipv4/conf/ppp0/rp_filter<br />
#</p>
<p>Sau pentru toate interfetele existente si viitoare astfel:</p>
<p># for f in /proc/sys/net/ipv4/conf/*/rp_filter; do<br />
#     echo 1 &gt; $f<br />
# done<br />
#</p>
<p>Debian realizeaza acest lucru &#8220;by default&#8221; cand este posibil. Daca ai routare<br />
asimetrica  (te astepti sa primesti pachete din directii ciudate), vei<br />
dori sa dezactivezi aceasta filtrare pe interfetele respective.</p>
<p>Logarea pachetelor este folositoare cand configurezi un firewall si ceva nu<br />
merge, insa pe un sistem in productie, intodeauna foloseste aceasta in<br />
combinatie cu limitare, pentru a preveni floodarea fisierelor cu log-uri.</p>
<p>Recomand pentru sistemele sigure depistarea conexiunilor (connection<br />
tracking): determina o incarcare a sistemului, deoarece toate conexiunile sunt<br />
depistate, dar este foarte folositoare pentru a controla accesul la retelele<br />
tale. S-ar putea sa trebuiasca sa incarci modulul &#8220;ip_conntrack.o&#8221; daca<br />
kernelul tau nu incarca in mod automat modulele si nu este compilat in<br />
kernel. Daca vrei sa depistezi cu precizie protocoale complexe, va trebui sa<br />
incarci modulul necesar pentru aceasta (ex. &#8220;ip_conntrack_ftp.o&#8221;).</p>
<p># iptables -N no-conns-from-ppp0<br />
# iptables -A no-conns-from-ppp0 -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT<br />
# iptables -A no-conns-from-ppp0 -m state &#8211;state NEW -i ! ppp0 -j ACCEPT<br />
# iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG &#8211;log-prefix &#8220;Bad packet from ppp0:&#8221;<br />
# iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG &#8211;log-prefix &#8220;Bad packet not from ppp0:&#8221;<br />
# iptables -A no-conns-from-ppp0 -j DROP<br />
# iptables -A INPUT -j no-conns-from-ppp0<br />
# iptables -A FORWARD -j no-conns-from-ppp0</p>
<p>Construirea unui bun firewall este peste scopul acestui HOWTO, dar sfatul meu<br />
este ca &#8220;intodeauna sa fii minimalist&#8221;. Citeste Security HOWTO pentru mai multe<br />
informatii privind testarea si examinarea sistemului.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=171</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ce este internetul. Conceptele de retea linux</title>
		<link>http://resurse-educationale.uv.ro/?p=169</link>
		<comments>http://resurse-educationale.uv.ro/?p=169#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:44:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[ppp]]></category>
		<category><![CDATA[retea]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[udp]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=169</guid>
		<description><![CDATA[traducere ver. 0.4 de catre Riddl Multumiri tuturor celor care m-au ajutat, in special lui Gushterul. Observatie f importanta: probabil ca exista unele greseli in acest document. Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de &#8230; <a href="http://resurse-educationale.uv.ro/?p=169">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>traducere ver. 0.4 de catre Riddl<br />
Multumiri tuturor celor care m-au ajutat,  in special lui Gushterul.<br />
Observatie f importanta: probabil ca exista unele greseli in acest document.<br />
Am tradus si eu cum m-am priceput mai bine, daca descoperiti greseli de<br />
traducere si pentru observatii pertinente trimiteti-mi mail pentru Riddl la<br />
&#8220;discutzii at gmx dot net&#8221;. Nu uitati sa precizati numele documentului.<br />
Multumesc anticipat.<br />
Aceasta versiune este  putin modificata fata de original, deorece unii termeni<br />
sunau foarte ciudat in ro.<br />
Pentru ultima versiune a acestui document verifica<br />
&lt;http://www.securityorg.net/docs/&gt;.</p>
<p>Lecturare placuta!</p>
<p>______________________________________________________________________</p>
<p>Linux Networking-concepts HOWTO<br />
HOWTO privind conceptele de retea linux<br />
Rusty Russell<br />
$Revision: 1.3 $ $Date: 2002/06/05 13:21:56 $</p>
<p>Acest document descrie ce este acea o retea (cum ar fi internetul), si foarte<br />
primar cum functioneaza acesta.</p>
<p>______________________________________________________________________</p>
<p>Cuprins</p>
<p>1. Introducere<br />
2. Ce este aceea o &#8220;retea de calculatoare&#8221;?<br />
3. Ce este &#8220;Internetul&#8221;?<br />
3.1. Cum functioneaza Internetul?<br />
4. Aceast lucru numit IP<br />
4.1. Grupuri de adrese IP: Netmask-uri<br />
5. Nume de computere si Adrese IP<br />
6. Servici diferite: Email, Web, FTP, DNS<br />
7. Interfete dialup: PPP<br />
8. Cum arata pachetele<br />
9. Sumar<br />
10. Multumiri<br />
11. Index<br />
______________________________________________________________________</p>
<p><span id="more-169"></span>1. Introducere</p>
<p>Bine ai venit!<br />
Am scris in trecut un numar de howto-uri in ceea ce privesc retelele, si mi-a<br />
venit in minte ca sunt in fiecare o multime de termeni jargonici. Am avut de<br />
ales intre trei variante: celelalte doua ignorau problema si explicau<br />
termenii peste tot. Nici una dintre ele nu era atractiva.</p>
<p>Scopul software-ului liber este faptul ca ar trebui sa ai libertatea sa<br />
explorezi si sa te joci cu software-ul sistemului pe care il folosesti. Cred<br />
ca dandu-le posibilitatea oamenilor sa experimenteze aceasta libertate este un<br />
scop nobil; nu numai fac pe oameni sa se simt puternici printr-o ocupatie (cum<br />
ar fi reconstruirea unui motor de masina) dar prin natura internetului si<br />
software-ului liber ti se pune la dispozitie posibilitatea sa partajezi<br />
experienta ta cu milioane de oameni.</p>
<p>Dar trebuie  sa incepi de undeva, asa ca iata-ne.</p>
<p>(C) 2000 Paul &#8220;Rusty&#8221; Russell.  Sub licenta GNU GPL.</p>
<p>2. Ce este aceea o &#8220;retea de calculatoare&#8221;?</p>
<p>O retea de calculatoare sunt mai multe materiale folosite pentru ca nodurile sa<br />
schimbe informatie intre ele (prin &#8220;noduri&#8221; inteleg computere, imprimante,<br />
masini de gatit si orice alceva doresti). Nu conteaza foarte mult cum sunt<br />
interconectate: pot sa foloseasca fibra optica sau porumbei calatori.<br />
E clar, unele alegeri sunt mai bune decat altele, mai ales daca ai prin casa<br />
pisici. <img src='http://resurse-educationale.uv.ro/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>In mod normal conectarea a doua calculatoare impreuna nu se poate numi<br />
retea, este nevoie de trei sau mai multe pentru a deveni retea. Acest lucru<br />
seamana cu cuvantul &#8220;grup&#8221;: doi oameni inseamna doar doua persoane, pe cand<br />
trei persoane formeaza un grup. Deasemenea, retelele sunt adesea prinse<br />
impreuna, pentru a forma retele mai mari, fiecare retea mai mica  (deobicei<br />
numita o &#8220;sub-retea&#8221;) poate fi parte dintr-o retea mai mare.</p>
<p>De fapt conexiunea intre doua computere este adesea denumita &#8220;legatura de<br />
retea&#8221;. Daca este ceva cablu in spatele computer-ului tau catre alte<br />
computere atunci aceea este legatura ta de retea.</p>
<p>Sunt patru lucruri despre care suntem interesati cand vorbim despre o retea de<br />
calculatoare:</p>
<p>Marimea</p>
<p>Daca pur si simplu conectezi intre ele cele patru calculatoare de<br />
acasa, ai realizat ceea ce se numeste LAN (Local Area Network &#8211; retea<br />
locala). Daca totul este la distanta de mers pe jos, este denumit<br />
deobicei LAN, oricate masini ar fi conectate, si din orice<br />
infrastructura ar fi contruita reteaua.</p>
<p>La celalalt pol se situeaza WAN-ul (Wide Area Network &#8211; retea<br />
intinsa). Daca ai un computer la Bucuresti, Romania, altul in New<br />
York, SUA, si unul in Lhasa, Tibet, si reusesti sa le conectezi,<br />
aceasta este atunci un WAN.</p>
<p>Topologia: Forma</p>
<p>Deseneaza harta unei retele: linile sunt &#8220;legaturile din retea&#8221;,<br />
si fiecare nod este un punct. Poate ca fiecare linie duce intr-un<br />
punct central ca o stea, insemnand ca fiecare vorbeste printr-un<br />
singur punct ( o &#8220;topologie stea&#8221;):</p>
<p>o   o   o<br />
\_ | _/<br />
\|/<br />
o&#8212;&#8211;o&#8212;&#8211;o<br />
_/|\_<br />
/  |  \<br />
o   o   o</p>
<p>Sau poate ca fiecare comunica in linie, astfel:</p>
<p>o&#8212;&#8212;o&#8212;&#8212;o&#8212;&#8212;-o&#8212;&#8212;&#8211;o<br />
|                              |<br />
|                              |<br />
|                              o<br />
|                              |<br />
o                              |<br />
o</p>
<p>Sau poate ca ai trei subretele conectate printr-un singur nod:</p>
<p>o<br />
o           |  o&#8211;o&#8211;o<br />
|           |  |<br />
o&#8211;o&#8211;o&#8211;o&#8211;o  o<br />
\       |<br />
o&#8212;&#8212;o<br />
/       |<br />
o&#8211;o&#8211;o&#8211;o&#8211;o  o<br />
|           |  |<br />
o           |  o&#8211;o<br />
o</p>
<p>Vei vedea multe topologii ca acestea in realitate si multe altele mult<br />
mai complicate.</p>
<p>Fizic: Din ce este facuta reteaua.</p>
<p>Al treilea lucru de care trebuie sa fim interesati este din ce este<br />
constuita reteaua noastra. Cea mai ieftina este &#8220;sneakernet-u&#8221;, erau<br />
oamenii care transportau diskete de la un computer la altul.<br />
Sneakernet-ul este aproape intodeauna un &#8220;LAN&#8221;. Disketele costa mai<br />
putin de 1$ si o pereche de skeakers (incaltaminte care nu face<br />
zgomot) in jur de 20$.</p>
<p>Cel mai obisnuit sistem folosit pentru a conecta reteaua de acasa<br />
catre alte retele mai mari este numit &#8220;modem&#8221;<br />
(MODulator/DEModulator), care transforma o legatura telefonica intr-o<br />
legatura de retea. Transforma ceea ce transmite calculatorul in<br />
sunete, si asculta sunetele venite de la celalalt capat pe care le<br />
transforma iar in informatie pentru calculator. Dupa cum iti<br />
imaginezi acest lucru nu este din cale afara de eficient, deoarece<br />
liniile telefonice nu au fost facute pentru genul acesta de lucruri, dar<br />
este un sistem raspandit deoarece liniile telefonice sunt atat de<br />
obisnuite si ieftine: modemurile costa sub 50$ si linia telefonica<br />
200$ pe an.</p>
<p>Cel mai obisnuit sistem sa conectezi computerele intr-un LAN este sa<br />
folosesti Ethernet. Ethernetul poate fi de trei tipuri (in ordinea<br />
in care au fost realizate): Thinwire/Coax/10base2, UTP/10baseT si<br />
UTP/100baseT. Gigabit ethernet (1000baseT incepe sa sune ciudat)<br />
este in curs de a fi realizat. 10baseT este deobicei un fir coaxial<br />
negru care are din loc in loc T-uri pentru a putea fi conectate la<br />
computere, toti sunt conectati intr-o linie, linie care are la<br />
capete terminatori speciali. UTP este deobicei un cablu de culoare<br />
albastru deschis, care au doua capete prevazute cu terminatori din<br />
plastic similari celor de la telefon, care sunt conectate in<br />
dispozitivele fizice (placa ethernet, hub, etc.). Cablul costa cativa<br />
dolari metrul, si placile de retea 10baseT/10base2 (multe au<br />
connectori pentru ambele tipuri) sunt greu de gasit noi de firma.<br />
100baseT sunt de 10 ori mai rapide decat 10baseT, sunt compatibile si<br />
cu acestea, si costa cam 30$.</p>
<p>Tehnologia de varf este insa fibra optica; un fir de sticla subtire<br />
in camasa protectoare care poate fi folosita pentru a lega in retea<br />
continente. In general costa mii de dolari.</p>
<p>In mod normal numim fiecare conexiune la un nod &#8220;interfata de retea&#8221;<br />
sau pe scurt &#8220;interfata&#8221;. Linux le numeste astfel &#8220;eth0&#8243; pentru<br />
prima interfata ethernet, si &#8220;fddi0&#8243; pentru prima interfata de<br />
fibra. Comanda &#8220;/sbin/ifconfig&#8221; ni le listeaza.</p>
<p>Protocol: Cum comunica.<br />
Ultimul lucru care te intereseaza este limbajul pe care il folosesc<br />
doua noduri interconectate. Cand doua modemuri comunica unul cu altul<br />
printr-o linie telefonica, trebuie sa se puna de acord ce vor insemna<br />
fiecare sunet, astfel pur si simplu nu vor comunica. Aceasta<br />
conventie este denumita &#8220;protocol&#8221;. Pe masura ce oamenii au descoperit<br />
noi posibilitati de codare astfel incat computerele sa spuna mai<br />
multe in sunete mai scurte, noi protocoale s-au inventat; sunt cel<br />
putin o duzina de protocoale diferite, si fiecare modem va incerca<br />
cateva pana cand va gasi unul care sa fie inteles si de celalalt<br />
modem.</p>
<p>Un alt exemplu este reteaua 100baseT mentionata mai sus. Aceasta<br />
foloseste aceeasi legatura fizica  &#8220;UTP&#8221; ca si 10baseT, dar<br />
comunica de 10 ori mai rapid.</p>
<p>Aceste doua protocoale sunt denumite protocoale de nivel de legatura<br />
(link level); care determina cum este transportata informatia intre<br />
doua puncte pe conexiuni de retea individuale. Cuvantul &#8220;protocol&#8221; se<br />
refera si la alte conventii dupa cum vom vedea mai jos.</p>
<p>3. Ce este &#8220;Internetul&#8221;?</p>
<p>Internetul este o retea de tip WAN, care impanzeste intre globul: este cea<br />
mai mare retea de calculatorea existenta. &#8220;Internetworking&#8221; inseamna<br />
conectarea mai multor retele pentru a crea una mai mare, prin urmare<br />
internetul este connectarea a o mare ingramadire de subretele.</p>
<p>Asa ca acum uitandu-ne la lista de mai sus, ne punem intrebarea: care este<br />
marimea Internetului, din ce este formata fizic si care sunt protocoalele<br />
folosite?</p>
<p>Marimea am spus-o deja. Este globala.</p>
<p>Structura fizica este variata, fiecare subretea este conectata intr-un mod<br />
diferit. Incercarea de a creea o harta folositoare este sortita deci esecului.</p>
<p>Protocoalele folosite de fiecare legatura este deasemnea diferita: toate<br />
protocoalele de mai sus pentru nivel de legatura sunt folosite si multe<br />
altele.</p>
<p>3.1. Cum functioneaza Internetul?</p>
<p>Atunci aceasta intrebare se pune: cum functioneaza? Cum poate fiecare nod sa<br />
vorbeasca  altor noduri daca folosesc protocoale de nivel legatura diferite?</p>
<p>Raspunsul este simplu:  avem nevoie de un alt protocol care sa controleze cum<br />
circula informatia prin retea. Protocolul pentru nivel de lagatura descrie<br />
cum sa circule informatia intre doua noduri care sunt legate direct:<br />
protocolul pentru nivel de retea face posibila transportul informatie intre<br />
un nod si un altul peste oricat de mult legaturi de retea.</p>
<p>Pentru internet, protocolul la nivel de retea este INTERNET PROTOCOL<br />
(versiunea 4) sau &#8220;IP&#8221;. Nu este singurul protocol existent (Apple&#8221;s<br />
AppleTalk, Novell&#8221;s IPX, Digital&#8221;s DECNet and Microsoft&#8221;s NetBEUI fiind<br />
altele), dar este cel mai adoptat. A aparut o noua versiune de protocol &#8220;IP&#8221;<br />
numit IPv6, dar inca nu este atat de utilizat.</p>
<p>Asa ca pentru a transmite un mesaj dintr-un punct al globului in altul,<br />
computerul tau foloseste protocolul IP, trimite informatia la modem, care<br />
foloseste protocol pentru nivel de legatura pentru a trimite informatia<br />
modemului din celalalt capat, modem care se afla probabil intr-un rack de<br />
modemuri, care trimite informatia catre un alt nod, nod care la randul sau<br />
trimite catre altul, si tot asa. Un nod care face lagatura intre doua sau<br />
mai multe retele este denumit &#8220;ruter&#8221;: acesta va avea cate o interfata<br />
pentru fiecare retea.</p>
<p>Numim aceast sir de protocoale o &#8220;stiva de protocoale&#8221;, de obicei desenata<br />
asa:</p>
<p>[ Aplicatia: Primeste poze ]      [ Nivelul aplicatie: transmite poze ]<br />
|                                          ^<br />
v                                          |<br />
[ TCP: are grija de trasport ]          [ TCP: are grija de trasport ]<br />
|                                          ^<br />
v                                          |<br />
[ IP: are grija de routare ]          [ IP: are grija de routare ]<br />
|                                          ^<br />
v                                          |<br />
[ Link: doar pentru conexiune directa ]  [ Link: doar pentru conexiune directa ]<br />
|                                          |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>Deci, in diagrama, vedem cum netscape (aplicatia din stanga sus) acceseaza<br />
niste poze de pe un server web (aplicatia din dreapta sus). Pentru a face<br />
acest lucru aplicatia noastra foloseste nivelul TCP, protocol pentru controlul<br />
transportului: peste 90% din din traficul internet foloseste TCP, deoarece<br />
este folosit mai ales pentru serviciile web si mail.</p>
<p>Deci, Netscape-ul trimite o cerere  pentru o conexiune TCP catre serverul<br />
remote: aceasta cerere este preluata la nivel de protocol de transport TCP,<br />
care trimite mai departe cererea nivelului protocolului de retea IP, care la<br />
randul lui transmite informatia mai departe catre nivelul protocolului de<br />
legatura.</p>
<p>La celalat capat nivelul protocolului de legatura inainteaza informatia catre<br />
nivelul protocolului IP, care  vede ca informatia este destinata<br />
computer-ului respectiv (daca nu va inainta informatia nivelului de legatura<br />
pentru ca informatia sa ajunga la urmatorul nod), care inainteaza informatia<br />
nivelului protocolului de transport TCP, care o inainteaza server-ului,<br />
respectiv aplicatiei.</p>
<p>Deci avem urmatoarele trei puncte:</p>
<p>1. Aplicatia (Netscape, sau serveru din capatul celalalt) decide cu cine anume<br />
doreste sa vorbeasca si ce anume doreste sa trimita</p>
<p>2. Nivelul de transport trimite pachete speciale pentru a incepe conversatia<br />
cu celalalt capat si apoi impacheteaza informatia intr-un &#8220;pachet&#8221; TCP: un<br />
pachet este doar un termen pentru o bucata de date care trece printr-o<br />
retea. Nivelul de transport TCP paseaza acest pachet catre nivelul de retea<br />
IP: apoi transmite in continuare pana cand celalat capat la nivel de<br />
transport TCP transmite receptionarea pachetului. Acest mecanism este numita<br />
&#8220;retransmitere&#8221;, si are o multime de reguli complexe care controleaza cand sa<br />
transmita, cat sa astepte, etc. Ii da deasemenea fiecarui pachet o multime<br />
de numere, pentru ca la celalalt capat sa fie sortate in ordinea corecta.</p>
<p>3. La nivel de retea IP  se ia in considerare destinatia pachetului si<br />
se decide urmatorul nod catre care sa se transmita pachetul. Aceasta operatie<br />
este numita in mod simplu &#8220;rutare&#8221;(routing), si difera de la foarte simplu<br />
(daca nu ai decat un singur modem si nici o alta interfata de retea,<br />
pachetele ar trebui sa iasa numai prin acea interfata) pana la extrem de<br />
complex (daca ai 15 retele complexe conectata direct prin tine).</p>
<p>4. Aceast lucru numit IP</p>
<p>Asadar rolul nivelului de legatura IP este sa realizeze cum sa &#8220;ruteze&#8221;<br />
pachetele catre destinatia finala. Pentru ca acest lucru sa fie posibil,<br />
fiecare interfata din retea trebuie sa aiba o &#8220;adresa IP&#8221;. Aceast adresa<br />
este formata din patru numere separate prin puncte, cum ar fi<br />
&#8220;167.216.245.249&#8243;. Fiecare numar trebuie sa fie cuprins intre 0 si 255.</p>
<p>Interfetele in aceeasi retea au tendinta sa aiba adrese Ip vecine. De<br />
exemplu &#8220;1.1.1.19&#8243; sta chiar langa sistemul cu adresa IP &#8220;1.1.1.20&#8243;. Deasemenea<br />
nu uita ca un ruter este un nod cu interfete pentru mai mult de o retea,<br />
asa ca ruter-ul va avea cate o adresa Ip pentru fiecare interfata.</p>
<p>Asa ca nivelul de retea IP al kernelului tine un tabel cu &#8220;rute&#8221; diferite,<br />
punand la dispozitie calea pentru a ajunge la grupuri variate de adrese IP.<br />
Cea mai simpla dintre rute este numita &#8220;ruta default&#8221;: daca nici o alta ruta<br />
nu se potriveste aceasta este calea pe care o iau pachetele. Poti vedea o<br />
lista a acestor rute cu ajutorul comenzii &#8220;/sbin/route&#8221;.</p>
<p>Rutele fie indica o legatura, fie un nod particular care este conectat la o<br />
alta retea. De exemplu, cand suni la ISP, ruta default va fi catre legatura<br />
cu modemul, deorece acolo este punctul de acces catre intreaga lume.</p>
<p>Modemul<br />
Modemul lui          ISP-ului ~~~~~~~~~~~~<br />
Rusty                     {            }<br />
o&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;o { Internetul   }<br />
{            }<br />
~~~~~~~~~~~~</p>
<p>Dar daca ai un sistem care este in permanenta conectat la lumea din afara,<br />
este putin mai complicat. In diagrama de mai jos, sistemul meu poate sa<br />
comunica in mod direct cu computerele lui Paul si Tridge, si cu firewall-ul,<br />
dar este necesar ca sistemul meu sa stie ca pachetele care trebuiesc livrate<br />
restului lumii trebuie sa se indrepte catre firewall care le va pasa mai<br />
incolo. Aceasta inseamna ca vei avea doua rute: una care sa zica &#8220;daca<br />
destinatia este in reteaua mea trimite informatia direct acolo&#8221; si apoi o<br />
ruta default care sa spuna &#8220;in caz contrar, trimite-o catre firewall&#8221;.</p>
<p>o  Masina de lucru<br />
|    a lui Tridge      ~~~~~~~~~~~~<br />
Masina de lucru        |                     {            }<br />
a lui Rusty  o&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;o&#8211;{  Internetul  }<br />
|            Firewall {            }<br />
|                      ~~~~~~~~~~~~<br />
o  Masina de lucru<br />
a lui Paul</p>
<p>4.1. Grupuri de adrese IP: Netmask-uri</p>
<p>Mai este un ultim detaliu: exista o notatie standard pentru grupuri de adrese<br />
IP, uneori numita &#8220;adresa de retea&#8221;. La fel cum un numar de telefon poate fi<br />
impartit in prefix si restul, la fel putem divide o adresa IP intr-un prefix<br />
de retea si restul.</p>
<p>Oamenii obisnuiau sa vorbeasca despre &#8220;reteaua 1.2.3&#8243;, insemnand toate cele<br />
256 de adrese de la 1.2.3.0 la 1.2.3.255. si daca asta nu era o retea destul<br />
de mare ar fi putut sa vorbeasca despre &#8220;reteaua 1.2&#8243; care inseamna toate<br />
adresele de la 1.2.0.0 la 1.2.255.255.</p>
<p>In mod normal nu scriem  &#8220;1.2.0.0-1.2.255.255&#8243;. In loc scriem prescurtat<br />
&#8220;1.2.0.0/16&#8243;. Notatia ciudata &#8220;/16&#8243; (numita netmask) cere o mica explicatie.</p>
<p>Fiecare numar despartit prin puncte intr-o adresa IP este defapt un numar<br />
binar format din 8 cifre (00000000 la 11111111): le scriem in format zecimal<br />
pentru a putea fi mai usor de citit. &#8220;/16&#8243; inseamna ca primele 16 cifre<br />
binare reprezinta adresa retelei, cu alte cuvinte partea &#8220;1.2&#8243; este reteaua.<br />
(tine minte fiecare numar reprezinta 8 cifre binare). Aceasta inseamna ca<br />
orice adresa care incepe cu &#8220;1.2&#8243; face parte din aceasta retea: &#8220;1.2.3.4&#8243; si<br />
&#8220;1.2.5.22&#8243; fac parte din aceasta retea, dar &#8220;1.3.4.2&#8243; nu.</p>
<p>Pentru a face viata mai usoara, in mod normal folosim retele care au<br />
netmask &#8220;/8&#8243;, &#8220;/16&#8243; si &#8220;/24&#8243;. De exemplu, &#8220;10.0.0.0/8&#8243; este o retea imensa<br />
care contine orice adresa de la 10.0.0.0 la 10.255.255.255 (peste 16 milioane<br />
de adrese!). &#8220;10.0.0.0/16&#8243; este mai mica, continand adresele doar de la<br />
10.0.0.0 la 10.0.255.255. &#8220;10.0.0.0/24&#8243; este si mai mica detinand adresele<br />
de la 10.0.0.0 la 10.0.0.255.</p>
<p>Pentru a face lucrurile si mai confuze, mai este un mod prin care putem sa<br />
scriem netmask-urile. Putem sa le scriem ca adrese IP:</p>
<p>10.0.0.0/255.0.0.0</p>
<p>In sfarsit, nu valoreaza nimic faptul ca cea mai mare adresa dintr-o retea<br />
este rezervat ca &#8220;adresa de broadcast&#8221;, care poate fi folosita pentru a<br />
transmite un mesaj catre toate host-urile din retea.</p>
<p>Mai jos este un tabel cu netmask-uri:</p>
<p>Forma       Forma           Numarul de      Comentarii<br />
scurta      lunga           masini maxim</p>
<p>/8      /255.0.0.0         16,777,215  numita in trecut retea de clasa A<br />
/16     /255.255.0.0       65,535      numita in trecut retea de clasa B<br />
/17     /255.255.128.0     32,767<br />
/18     /255.255.192.0     16,383<br />
/19     /255.255.224.0     8,191<br />
/20     /255.255.240.0     4,095<br />
/21     /255.255.248.0     2,047<br />
/22     /255.255.252.0     1,023<br />
/23     /255.255.254.0     511<br />
/24     /255.255.255.0     255         numita in trecut retea de clasa C<br />
/25     /255.255.255.128   127<br />
/26     /255.255.255.192   63<br />
/27     /255.255.255.224   31<br />
/28     /255.255.255.240   15<br />
/29     /255.255.255.248   7<br />
/30     /255.255.255.252   3</p>
<p>5. Nume de computere si Adrese IP</p>
<p>In concluzie orice interfata de pe fiecare nod are o adresa IP. Foarte repede<br />
s-a constatat ca oamenii retin destul de greu numerele, asa ca s-a hotarat<br />
(la fel ca la numerele de telefon) sa avem un director cu nume. Dar cum<br />
folosim computere oricum, este mai simplu sa punem computerele sa gaseasca<br />
numele in mod automat.</p>
<p>Prin urmare avem DNS, sistemul de nume al domeniilor. Sunt noduri cu adrese IP<br />
bine cunoscute pe care programele le pot interoga trimitand nume pentru a<br />
primi adrese IP. Aproape toate programele pe care le folosesti pot realiza<br />
aceasta interogare, de asta poti pune &#8220;www.linuxcare.com&#8221; in Netscape in loc<br />
de &#8220;167.216.245.249&#8243;.</p>
<p>Bineinteles, ai nevoie de adresele de retea a cel putin unuia dintre aceste<br />
&#8220;servere de nume&#8221;: in mod normal aceste adrese se gasesc in fisierul<br />
&#8220;/etc/resolv.conf&#8221;.</p>
<p>Cum interogarile si raspunsurile DNS sunt relativ mici (1 pachet de fiecare),<br />
protocolul TCP nu este folosit: acesta pune la dispozitia retransmisie<br />
automata, ordonare a pachetelor si o siguranta a conexiunii, dar cu costul<br />
trimiterii de pachete in plus in retea. De aceea folosim foarte simplul<br />
protocol UDP (protocol pentru datagrame utilizator), care nu ofera extra<br />
facilitatile pe care le ofera TCP si de care nu avem nevoie.</p>
<p>6. Servici diferite: Email, Web, FTP, DNS</p>
<p>Intr-un exemplu anterior, am arata cum Netscape trimite o cerere TCP catre un<br />
server de web care ruleaza pe un alt nod. Dar sa ne imaginam ca acel nod care<br />
este si server de web ruleaza si server de email, un server de ftp si un<br />
server DNS, cum stie nodul pentru ce server este conexiunea TCP?</p>
<p>Aici TCP si UDP au conceptul de &#8220;port&#8221;. Fiecare pachet precizat in el &#8220;portul<br />
destinatie&#8221; care spune pentru ce serviciu este destinat pachetul. De exemplu,<br />
portul 25 TCP este pentru server-ul de mail, si portul 80 TCP este server-ul<br />
de web (deasemenea cateodata poti sa intalnesti servere web pe porturi<br />
diferite). O lista a porturile poate fi gasita in &#8220;/etc/services&#8221;.</p>
<p>Deasemenea, daca doua ferestre Netscape, amandoua acceseaza parti diferite din<br />
acelasi site web, cum face sistemul linux pe care ruleaza Netscape sa sorteze<br />
pachetele care se intorc de la server?</p>
<p>Aici intervine &#8220;portul sursa&#8221;: fiecarei conexiune noua TCP ii se atribuie un<br />
nou port sursa, asa ca sunt separate, chiar daca se duc spre aceeasi<br />
adresa destinatie IP si acelasi port destinatie. In mod normal primul port<br />
sursa alocat va fi 1024 si creste odata cu trecerea timpului.</p>
<p>7. Interfete dialup: PPP</p>
<p>Cand suni cu modemul tau la un ISP, si se conecteaza la modemul lor, kernelul<br />
nu incepe pur si simplu sa trimita pachete IP prin conexiune. Exista un<br />
protocol numit PPP (point-to-point protocol),  care este folosit pentru a<br />
negocia cu celalalt capat inainte de a se permite trimiterea oricaror pachete.<br />
Acesta este folosit de catre ISP pentru identificarea celui care a sunat: pe<br />
sistemul tau linux, un program numit  &#8220;daemon PPP&#8221; se ocupa cu partea ta de<br />
negociere.</p>
<p>Pentru ca in lume sunt atatia utilizatori de dial-up, de obicei acestia nu<br />
au propria lor adresa IP: cele mai multe ISP-uri iti vor aloca una din<br />
adresele lor cand te vei conecta (daemonul PPP va negocia acest lucru). Aceasta<br />
este adesea numita &#8220;adresa IP dinamica&#8221;, diferita fata de &#8220;adresa IP statica&#8221;<br />
care este cazul normal cand ai propria ta conexiune permanenta. In mod normal<br />
aceasta adresa este determinata de modem, data urmatoare cand te conectezi,<br />
probabil ca vei nimeri alt modem, si astfel vei avea alta adresa IP.</p>
<p>8. Cum arata pachetele</p>
<p>Pentru cei foarte curiosi iata o descriere a structurii unui pachet. Sunt mai<br />
multe aplicatii care captureaza pachetele care intra sau care ies dintr-un<br />
sistem linux: cel mai comun este &#8220;tcpdump&#8221; (care intelege mai multe<br />
protocoale decat TCP), dar unul mai fain este &#8220;ethereal&#8221;. Aceste aplicatii<br />
sunt numite &#8220;snifere de pachete&#8221;.</p>
<p>Inceputul fiecarui pachet contine informatii cum ar fi destinatia, sursa,<br />
tipul pachetului, si alte detalii administrative. Aceasta parte a unui pachet<br />
este numita &#8220;header&#8221;. Restul pachetului, ce contine datele propriu-zise, este<br />
in mod uzual numit &#8220;corpul pachetului&#8221;.</p>
<p>Asa ca orice pachet IP incepe cu un &#8220;header IP&#8221;: in marime de cel putin 20<br />
bytes. Arata cam asa (aceasta diagrama fu furata cu nerusinare din RFC 791<br />
(nu de catre traducator:))):</p>
<p>.&#8212;&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-.<br />
|Version|  IHL  |Type of Service|          Total Length         |<br />
|&#8212;&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|         Identification        |Flags|      Fragment Offset    |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|  Time to Live |    Protocol   |         Header Checksum       |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|                       Source Address                          |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br />
|                    Destination Address                        |<br />
&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;</p>
<p>Campurile importante sunt Protocol, care indica daca pachetul este de tip TCP<br />
(numarul 6), un pachet UDP (numar 17) sau alceva, adresa IP sursa, si adresa<br />
IP destinatie.</p>
<p>Acum, daca acel camp referitor protocolului spune ca pachetul este TCP, atunci<br />
imediat un header TCP va urma imediat header-ului IP: header-ul TCP este<br />
deasemenea de cel putin 20 bytes marime:</p>
<p>.&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-.<br />
|          Source Port          |       Destination Port        |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|                        Sequence Number                        |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;|<br />
|                    Acknowledgment Number                      |<br />
|&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+-+-+-+-+-+-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|  Data |           |U|A|P|R|S|F|                               |<br />
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |<br />
|       |           |G|K|H|T|N|N|                               |<br />
|&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8211;+-+-+-+-+-+-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-|<br />
|           Checksum            |         Urgent Pointer        |<br />
&#8220;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8221;</p>
<p>Cele mai importante campuri sunt aici campurile reprezentand portul sursa si<br />
portul destinatie care determina catre ce serviciu este destinat pachetul<br />
(sau, in cazul pachetelor replica, de la care serviciu provine). Numerele<br />
&#8220;sequence&#8221; si &#8220;acknowledgment&#8221; sunt folosite pentru a tine o ordine in<br />
pachete si pentru a spune celuilalt capat ce pachete au fost primite.<br />
Flag-urile ACK, SYN, RST si FIN (scrise pe verticala) sunt biti unici<br />
folositi pentru negocierea deschiderii (SYN) sau inchiderii (RST sau FIN)<br />
conexiunilor.</p>
<p>Dupa acest header urmeaza mesajul real pe care il trimite aplicatia (corpul<br />
pachetului). Un pachet normal are pana la 1500 bytes: aceasta inseamna ca cel<br />
mai mare spatiu pe care il poate ocupa datele este de 1460 bytes (20 bytes<br />
header-ul IP, 20 bytes header-ul TCP): peste 97%.</p>
<p>9. Sumar</p>
<p>In concluzie internetul modern foloseste pachete IP pentru a comunica, si<br />
cele mai multe dintre aceste pachete folosesc TCP pentru controlul conexiunii.<br />
Noduri speciale denumite &#8220;rutere&#8221; conecteaza micile retele in retele mai<br />
mari, si paseaza pachetele catre destinatia lor finala. Marea majoritatea a<br />
computerelor sunt parte doar dintr-o retea (au doar o singura interfata),<br />
spre deosebire de rutere.</p>
<p>Fiecare interfata are o adresa IP unica, care seamana cu &#8220;1.2.3.4&#8243;:<br />
interfetele in aceeasi retea vor avea adrese IP inrudite, cu acelasi<br />
inceput, la fel cum telefoanele dintr-o anumita zona au acelasi prefix.<br />
Adresele de retea sunt asemanatoare adreselor IP,  urmate insa de semnul &#8220;/&#8221;<br />
si un numar pentru a se specifica portiunea din acea adresa care reprezinta<br />
prefixul, de exemplu &#8220;1.12.0.0/24&#8243; inseamna ca primele 3 grupuri de cifre<br />
reprezinta adresa de retea, fiecare cifra reprezinta 8 biti.</p>
<p>Masinile au asignate nume de catre  serviciul de nume pe domenii: programele<br />
interogheaza serverele de nume adrese IP, furnizand acestora nume de genul:<br />
&#8220;www.lug.ro&#8221;. Aceasta adresa IP este apoi folosita ca adresa IP<br />
destinatie pentru a vorbi cu acel nod.</p>
<p>Rusty este destul de nepriceput pentru a scrie documente, in special pentru<br />
incepatori.</p>
<p>Enjoy!</p>
<p>Rusty.</p>
<p>10. Multumiri</p>
<p>Multumiri lui Alison, pentru ca mi-a spus in cel mai frumos mod posibil ce<br />
tampenii am scris in versiunile de inceput.</p>
<p>11. Index</p>
<p>o  &#8220;100baseT&#8221;</p>
<p>o  &#8220;10base2&#8243;</p>
<p>o  &#8220;10baseT&#8221;</p>
<p>o  &#8220;Broadcast address&#8221; &#8211; adresa de broadcast</p>
<p>o  &#8220;Coax, Coaxial cable&#8221;</p>
<p>o  &#8220;Computer network&#8221; &#8211; retea de computere</p>
<p>o  &#8220;Default route&#8221; &#8211; ruta default</p>
<p>o  &#8220;Destination port&#8221; &#8211; port destinatie</p>
<p>o  &#8220;DNS, Domain Name Service&#8221; &#8211; serviciu de nume pe domenii DNS</p>
<p>o  &#8220;Dynamic IP address&#8221;- adresa IP dinamica</p>
<p>o  &#8220;Ethernet&#8221;</p>
<p>o  &#8220;Fiber&#8221; &#8211; fibra</p>
<p>o  &#8220;Gigabit Ethernet&#8221;</p>
<p>o  &#8220;Hop&#8221;</p>
<p>o  &#8220;Hub&#8221;</p>
<p>o  &#8220;Internet&#8221;</p>
<p>o  &#8220;IP, Internet Protocol&#8221;</p>
<p>o  &#8220;IP address&#8221; &#8211; adresa ip</p>
<p>o  &#8220;IP header&#8221; &#8211; header IP</p>
<p>o  &#8220;IPv4, IP version 4&#8243;</p>
<p>o  &#8220;IPv6, IP version 6&#8243;</p>
<p>o  &#8220;LAN, Local Area Network&#8221; &#8211; retea locala</p>
<p>o  &#8220;Link-level protocol&#8221; &#8211; protocol de nivel de legatura</p>
<p>o  &#8220;Modem&#8221;</p>
<p>o  &#8220;Name server&#8221; &#8211; server de nume</p>
<p>o  &#8220;Netmask&#8221; &#8211; netmask</p>
<p>o  &#8220;Network address, network mask&#8221; &#8211; adresa de retea, mask de retea</p>
<p>o  &#8220;Network interface, interface&#8221; &#8211; interfata de retea, interfata</p>
<p>o  &#8220;Network link&#8221; &#8211; legatura de retea</p>
<p>o  &#8220;Network protocol, protocol&#8221; &#8211; protocol de retea, protocol</p>
<p>o  &#8220;Node&#8221; &#8211; nod</p>
<p>o  &#8220;Packet body&#8221; &#8211; corp al pachetului</p>
<p>o  &#8220;Packet header&#8221; &#8211; header al pachetului</p>
<p>o  &#8220;Packet sniffer&#8221; &#8211; snifer de pachete</p>
<p>o  &#8220;Packet&#8221; &#8211; pachet</p>
<p>o  &#8220;Port, TCP port, UDP port&#8221; &#8211; port, port TCP, port UDP</p>
<p>o  &#8220;PPP, Point-to-Point Protocol&#8221;</p>
<p>o  &#8220;PPP daemon&#8221; &#8211; daemon PPP</p>
<p>o  &#8220;Protocol stack&#8221; &#8211; stiva de protocoale</p>
<p>o  &#8220;Retransmission&#8221; &#8211; retransmitere</p>
<p>o  &#8220;Route&#8221; &#8211; ruta</p>
<p>o  &#8220;Router&#8221; &#8211; ruter</p>
<p>o  &#8220;Routing&#8221; &#8211; rutare</p>
<p>o  &#8220;Sneakernet&#8221;</p>
<p>o  &#8220;Source port&#8221; &#8211; port sursa</p>
<p>o  &#8220;Star-topology&#8221; &#8211; topologie in stea</p>
<p>o  &#8220;Static IP address&#8221; &#8211; adresa IP statica</p>
<p>o  &#8220;Sub-network&#8221; &#8211; sub-retea</p>
<p>o  &#8220;TCP, Transmission Control Protocol&#8221; TCP, protocol cu controlul<br />
transportului</p>
<p>o  &#8220;TCP header&#8221; &#8211; header TCP</p>
<p>o  &#8220;Terminator&#8221; &#8211; terminator</p>
<p>o  &#8220;Topology&#8221; &#8211; topologie</p>
<p>o  &#8220;UDP, User Datagram Protocol&#8221; &#8211; UDP, protocol pentru datagrame<br />
utilizator</p>
<p>o  &#8220;UTP, Unshielded Twisted Pair&#8221;</p>
<p>o  &#8220;WAN, Wide Area Network&#8221; &#8211; retea intinsa</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=169</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurarea modemului dumneavoastra si a pppd-ului pentru a folosi linii inchiriate pe 2 fire</title>
		<link>http://resurse-educationale.uv.ro/?p=167</link>
		<comments>http://resurse-educationale.uv.ro/?p=167#comments</comments>
		<pubDate>Wed, 06 Apr 2011 12:40:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Servers]]></category>
		<category><![CDATA[adsl]]></category>
		<category><![CDATA[fire]]></category>
		<category><![CDATA[linii inchiriate]]></category>
		<category><![CDATA[modem]]></category>
		<category><![CDATA[pppd]]></category>
		<category><![CDATA[robotics]]></category>

		<guid isPermaLink="false">http://resurse-educationale.uv.ro/?p=167</guid>
		<description><![CDATA[Linii inchiriate Mini-HOWTO Rob van der Putten, rob@sput.nl v2.1, 3 August 2000 Traducerea: Victor Plugaru(vuk@go.ro). Cu scuzele de rigoare pentru eventualele greseli si/sau inadvertente. Configurarea modemului dumneavoastra si a pppd-ului pentru a folosi linii inchiriate pe 2 fire. _________________________________________________________________________ Table &#8230; <a href="http://resurse-educationale.uv.ro/?p=167">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Linii inchiriate Mini-HOWTO</p>
<p>Rob van der Putten, rob@sput.nl</p>
<p>v2.1, 3 August 2000</p>
<p>Traducerea: Victor Plugaru(vuk@go.ro). Cu scuzele de rigoare<br />
pentru eventualele greseli si/sau inadvertente.</p>
<p>Configurarea modemului dumneavoastra si a pppd-ului pentru a<br />
folosi linii inchiriate pe 2 fire.</p>
<p>_________________________________________________________________________</p>
<p>Table of Contents</p>
<p>1. Introducere</p>
<p>1.1 Ce este o linie inchiriata<br />
1.2 Presupuneri</p>
<p>2. Modemul</p>
<p>2.1 Configuratia modemului<br />
2.2 Test<br />
2.3 Exemple<br />
2.3.1 Hi-Tech<br />
2.3.2 Tornado FM 228 E<br />
2.3.3 Tron DF<br />
2.3.4 US Robotics Courier V-Everything</p>
<p>3. PPPD</p>
<p>3.1 Configurarea<br />
3.2 Script-uri<br />
3.2.1 Pornirea lui pppd si mentinerea lui in functiune<br />
3.2.2 Configurarea rutelor<br />
3.3 Test</p>
<p>______________________________________________________________________</p>
<p><span id="more-167"></span>Cea mai recenta versiune a acestui document poate fi gasita la:</p>
<p>http://www.sput.nl/software/leased-line/</p>
<p>1. Introducere</p>
<p>1.1. Ce este o linie inchiriata.</p>
<p>Orice legatura de date punct la punct pentru comunicatie, care este<br />
permanenta, fixa, inchiriata de la un operator de telefonie sau organizatie<br />
similara, consituie o linie inchiriata. Linia inchiriata implica cabluri,<br />
ca perechi torsadate , coaxiale sau fibre optice<br />
si poate implica tot soiul de alte echipamente, bobine, transformatoare,<br />
amplificatoare si regeneratoare.</p>
<p>Acest document se ocupa de :<br />
Configurarea modemului si daemonului pppd pentru a utiliza linii<br />
inchiriate pe 2 fire torsadate.</p>
<p>Acest document nu se ocupa de:<br />
SLIP, obtinerea si instalarea lui pppd, comunicatii sincrone de date,<br />
modemuri in banda de baza, xDSL.</p>
<p>1.2. Presupuneri.</p>
<p>Va trebui sa aveti deja daemonul pppd capabil de a functiona in<br />
sistemul dvs. De asemenea, trebuie sa aveti Minicom sau un program similar<br />
pentru a va configura modemul.</p>
<p>2. Modemul</p>
<p>O linie inchiriata nu este conectata la centrala telefonica, nu<br />
transporta curent continuu, ton de apel, ton de ocupat sau semnal de apel.<br />
Asta inseamna ca modemurile dvs. sunt pe cont propriu si vor trebui sa fie<br />
capabile sa functioneze in atare situatie.</p>
<p>Ar trebui sa aveti doua modemuri identice (inclusiv versiunea firmware),<br />
externe, care sa suporte modurile de lucru pentru linie inchiriata<br />
si mod &#8220;orb&#8221;. Asigurati-va ca modemurile dvs. pot functiona astfel. De<br />
asemenea, asigurati-va ca modemurile sunt bine<br />
documentate. Mai aveti nevoie de:</p>
<p>- 2 cabluri RS232 ecranate si cablate complet. Ecranul ar trebui<br />
sa fie conectat la carcasa conectorului la ambele capete (nu la pinul 1 si<br />
nu doar la un capat).</p>
<p>- Un conector RS232 de test poate fi avantajos daca il aveti.</p>
<p>- 2 cabluri cu mufe RJ11, unul la fiecare capat al liniei inchiriate.</p>
<p>- Cunostinte fundamentale privind comenzile AT.</p>
<p>2.1. Configurarea modemului.</p>
<p>O observatie privind configuratia modemului si sirurile de initializare<br />
in general: Configurati-va software-ul de modem (Minicom) sau (m)getty,<br />
pentru a putea folosi cea mai mare viteza posibila: 57600 bps pentru modem<br />
de 14.4 k si 115200 bps pentru modem de 28.8 k sau mai<br />
rapid. Multi utilizatori folosesc siruri de initializare lungi<br />
si complicate, adesea incepand cu sirul AT&amp;F si continand o multime de<br />
siruri specifice anumitor modemuri. Oricum, acestea sunt inutil de<br />
complicate. Majoritatea programelor se descurca bine cu cateva configurari<br />
simple, asa ca de ce sa nu scriem aceste configurari in memoria<br />
non-volatila pentru toate modemurile dvs. si sa folositi doar comanda ATZ<br />
ca sir de initializare in programe. Astfel puteti interschimba sau<br />
imbunatati modemurile fara sa faceti reconfigurari in programe.</p>
<p>Multe programe necesita sa folositi urmatoarele setari:</p>
<p>- Baud-rate fix.</p>
<p>- Contol de flux (flow control) RTS-CTS hardware bidirectional (nu xon-xoff)</p>
<p>- 8 biti, fara paritate, 1 bit de stop</p>
<p>- Modemul va trebui sa genereze starea REALA a semnalului DCD (&amp;C1)</p>
<p>- Modemul va trebui sa NU ignore starea semnalului DTR (&amp;D2 sau &amp;D3)</p>
<p>Verificati acestea cu AT&amp;V sau AT&amp;Ix (consultati documentatia modemului)</p>
<p>Aceste setari nu sunt neaparat implicite din fabrica (&amp;F), asa incat initierea<br />
modemului cu un sir de initializare cu AT&amp;F nu este intotdeauna o<br />
idee buna. Un lucru inteligent este probabil folosirea stringului AT&amp;F<br />
atunci cand avem motive sa credem ca sirul de initializare stocat<br />
in memoria nevolatila a modemului nu este bun. Daca veti crede<br />
ca ati gasit sirul potrivit de initializare a modemului, stocati-l<br />
in memoria nevolatila cu comanda AT&amp;W si testati-l amanuntit cu protocolul<br />
de transfer Z-modem pentru ambele tipuri de fisiere, atat ASCII cat si<br />
binar. Daca toate acestea merg perfect, configurati-va astfel modemurile<br />
pentru linia inchiriata.</p>
<p>Aflati cum sa treceti modemul in modul &#8220;dumb&#8221; (orb, brut) si, si mai<br />
important, cum sa scoateti modemul din acest mod. Modemul poate fi<br />
reconfigurat doar cand nu este in modul &#8220;dumb&#8221;. Asigurati-va<br />
ca ati configurat modemul pentru cea mai mare viteza posibila. Odata<br />
intrat in modul &#8220;dumb&#8221;, modemul va ignora toate comenzile AT, si nu isi va<br />
ajusta viteza dupa cea a portului serial, dar va utiliza viteza pentru<br />
care a fost configurat (aceasta configurare de viteza este stocata intr-un<br />
registru S, datorita sirului stabilit si stocat in memoria nevolatila).</p>
<p>Acum configurati modemul dupa cum urmeaza:</p>
<p>- Resetati DTR-ul (&amp;D3, uneori e vorba de un registru S). Aceasta<br />
setare este ceruta uneori de unele ISP-uri.</p>
<p>- Modul linie inchiriata (&amp;L1 sau &amp;L2, consultati documentatia modemului)</p>
<p>- Modemul corespondent pe auto-raspuns (S0=1), modemul local<br />
pe initiere (S0=0)</p>
<p>- Dezactivati codurile de rezultat (Q1, uneori modul<br />
&#8220;dumb&#8221; inlocuieste aceasta)</p>
<p>- Modul &#8220;dumb&#8221; (\D1 sau %D1, uneori e vorba de un jumper).<br />
In modul &#8220;dumb&#8221;, modemul va ignora comenzile AT (uneori va<br />
trebui chiar sa dezactivati caracterul ESC)</p>
<p>Scrieti configuratia in memoria nevolatila (AT&amp;W)</p>
<p>2.2. Test</p>
<p>Conectati modemurile la doua computere folosind 2 cabluri RS232 si<br />
conectati modemurile intre ele folosind un cablu RJ11. Folositi un program<br />
pentru modem, cum ar fi Minicom-ul din Linux, Procomm sau Telix (DOS) pe<br />
ambele calculatoare, pentru a testa modemurile. Ar trebui sa puteti tasta<br />
si afisa text de pe un calculator pe celalalt si vice-versa. Daca pe<br />
ecrane apar caractere ciudate, verificati viteza portului serial si alte<br />
asemenea configurari. Apoi deconectati si reconectati cablul RJ11. Asteptati<br />
sa se restabileasca conexiunea. Deconectati si reconectati cablurile<br />
RS232, inchideti si deschideti modemurile, opriti si porniti Minicom-ul.<br />
Modemurile vor trebui sa se reconecteze intotdeauna la cea mai mare viteza<br />
posibila (unele modemuri au LED-uri indicatoare a vitezei). Verificati<br />
daca modemurile ignora intr-adevar caracterul ESC (+++). Daca e necesar,<br />
dezactivati caracterul ESC.</p>
<p>Daca toate acestea functioneaza, veti dori poate sa reconfigurati modemurile.<br />
Dezactivati sunetul pentru modemul de la distanta (M0) si setati volumul<br />
la minim pentru modemul local (L1).</p>
<p>2.3. Exemple</p>
<p>2.3.1. Hi-Tech</p>
<p>Acesta este un modem aproximativ &#8220;no name&#8221;. Sirul de initializare este<br />
tipic si ar trebui sa functioneze pentru majoritatea modemurilor.</p>
<p>Initiator (local):<br />
ATL1&amp;C1&amp;D3&amp;L2%D1&amp;W&amp;W1</p>
<p>Raspuns (la distanta):<br />
ATM0L1&amp;C1&amp;D3&amp;L2%D1S0=1&amp;W&amp;W1</p>
<p>2.3.2.  Tornado FM 228 E</p>
<p>Asta ar trebui sa mearga:</p>
<p>Originate (local):<br />
ATB15L1Q1&amp;C1&amp;D3&amp;L2&amp;W&amp;W1</p>
<p>Answer (remote):<br />
ATM0B15M0Q1&amp;C1&amp;D3&amp;L2S0=1&amp;W&amp;W1</p>
<p>Mutati jumperul pentru modul &#8220;dumb&#8221; de la 2-3 la 1-2.</p>
<p>Datorita unui bug in firmware, modemurile se vor conecta abia dupa<br />
un reset hard (alimentare curent oprit si pornit) cand DTR este high.<br />
Am pus la punct un circuit care reseteaza hard modemul la trecerea lui DTR<br />
de pe low pe high. Daemonul pppd din BSD nu e prea &#8220;incantat&#8221; de<br />
aceasta. Combinand setarea &amp;D0 cu un circuit care reseteaza la<br />
trecerea din starea high in low, problema poate fi evitata.</p>
<p>2.3.3.  Tron DF</p>
<p>Caracterul ESC ar trebui dezactivat, setand S2 &gt; 127 ;</p>
<p>Initiator:<br />
ATL1&amp;L1Q1&amp;C1&amp;D3S2=171\D1&amp;W</p>
<p>Raspuns:<br />
ATM0&amp;L2Q1&amp;C1&amp;D3S0=1S2=171\D1&amp;W</p>
<p>2.3.4.  US Robotics Courier V-Everything</p>
<p>USR Sportster si USR Courier-I nu suporta linii inchiriate. Va<br />
trebuie versiunea Courier V-everything pentru aceasta. Exista o pagina WEB<br />
pe site-ul USR care &#8220;explica&#8221; cum se configureaza Courier-ul<br />
pentru linie inchiriata. Daca veti urma aceastei instructiuni veti<br />
sfarsi prin a aduce modemul in &#8220;moarte cerebrala&#8221; , care nu poate fi<br />
controlata sau monitorizata de pppd.</p>
<p>USR Courier poate fi configurat din DIP-switch-uri<br />
(comutatoare). Oricum, trebuie sa ii furnizati sir de initializare<br />
intai. Asigurati-va ca folositi setarea de fabrica potrivita.<br />
Spre deosebire de alte modemuri, acesta are trei setari de fabrica: &amp;F0, &amp;F1<br />
si &amp;F2. Daca ii dati comanda AT&amp;F va incarca setarea &amp;F0. Pentru a<br />
reseta comutarea DTR, trebuie sa setati bitul 0 in registrul<br />
S13. Aceasta inseamna ca trebuie sa setati S13=1. Mai departe, trebuie sa<br />
il setati pentru lucrul pe linie inchiriata cu &amp;L1:  ATS13=1&amp;L1&amp;W .<br />
Microcomutatoarele sunt in starea implicita, cu urmatoarele exceptii:</p>
<p>3  OFF Dezactiveaza codurile de rezultat</p>
<p>4  ON  Dezactiveaza comenzile off-line</p>
<p>5  ON  pentru initiere, OFF pentru raspuns</p>
<p>8  OFF Dumb mode</p>
<p>3. PPPD</p>
<p>Aveti nevoie de daemonul pppd (Point to Point Protocol) si de oarece<br />
cunostinte despre cum lucreaza. Consultati RFC-urile potrivite sau PPP-HOWTO<br />
din Linux daca este necesar. Cum nu veti folosi vreo procedura de login,<br />
nu folositi (m)getty nu veti furniza vreun utilizator fals<br />
pentru autentificare pppd. Nu veti forma numar de telefon, asa ca nu aveti<br />
nevoie nici de script chat. De fapt, configuratia si circuitul de modem pe<br />
care tocmai l-ati pus la punct seamana cu o legatura seriala null-modem.</p>
<p>Pentru o legatura fiabila, ar trebui sa indepliniti urmatoarele criterii:</p>
<p>- Imediat dupa boot-area sistemului de operare, pppd ar trebui<br />
sa &#8220;ridice&#8221; semnalul DTR in portul RS232, sa astepte semnalul<br />
DCD, sa intre in starea &#8220;sus&#8221;, si sa negocieze legatura.</p>
<p>- Daca sistemul de la distanta este oprit, pppd ar trebui sa<br />
astepte pana este pornit din nou.</p>
<p>- Daca legatura functioneaza si intamplator se opreste, pppd<br />
ar trebui sa reseteze modemul (prin &#8220;coborarea&#8221; si &#8220;ridicarea&#8221;<br />
semnalului DTR) dupa care sa incerce sa se reconecteze.</p>
<p>- Daca calitatea legaturii se deterioreaza prea mult, pppd ar<br />
trebui sa reseteze modemul si sa restabileasca legatura.</p>
<p>- Daca pppd &#8220;crapa&#8221;, un program watchdog (&#8220;caine de paza&#8221;) ar<br />
trebui sa il reporneasca.</p>
<p>3.1. Configurarea.</p>
<p>Sa presupunem ca modemul este conectat la COM2, adresa iP locala<br />
este &#8220;Loc_Ip&#8221; si adresa IP distanta este &#8220;Rem_Ip&#8221;. Vrem sa folosim MTU<br />
(Maximum Transmit Unit) cu valoarea 576. Fisierul /etc/ppp/options.ttyS1<br />
ar arata cam asa:</p>
<p>crtscts<br />
mru 576<br />
mtu 576<br />
passive<br />
Loc_Ip:Rem_Ip<br />
-chap<br />
modem<br />
#noauth<br />
-pap<br />
persist</p>
<p>Parametri ca &#8220;Asyncmap 0&#8243;, &#8220;Lock&#8221;, &#8220;Modem&#8221; and &#8220;-detach&#8221; sunt probabil<br />
deja specificati in fisierul /etc/ppp/options. Daca nu sunt , adaugati-i<br />
in fisierul /etc/ppp/options.ttyS1. Asa ca, daca sistemul local este<br />
192.168.1.1 si sistemul de la distanta este 10.1.1.1, fisierul<br />
/etc/ppp/options.ttyS1 este:</p>
<p>crtscts<br />
mru 576<br />
mtu 576<br />
passive<br />
192.168.1.1:10.1.1.1<br />
-chap<br />
modem<br />
#noauth<br />
-pap<br />
persist</p>
<p>Fisierul options.ttyS1 de pe sistemul de la distanta este:</p>
<p>crtscts<br />
mru 576<br />
mtu 576<br />
passive<br />
10.1.1.1:192.168.1.1<br />
-chap<br />
modem<br />
#noauth<br />
-pap<br />
persist</p>
<p>Optiunea &#8220;passive&#8221; limiteaza numarul de incercari de reconectare. Optiunea<br />
&#8220;persist&#8221; va mentine pppd in stare de functionare in caz de deconectare sau<br />
cand nu se poate conecta de prima data. Daca folositi intens telnet in<br />
timp ce faceti transfer de fisiere (FTP sau web), va trebui sa<br />
folositi valori mai mici pentru MTU si MRU, cum ar fi 296. Aceasta va face<br />
sistemul de la distanta sa raspunda mai rapid. Daca nu va pasa<br />
de telnet, puteti folosi valori de 1500 pentru MTU si MRU. Aveti in vedere<br />
oricum ca pachetele UDP nu pot fi fragmentate. Programul Speakfreely<br />
foloseste de pilda pachete UDP de 512 bytes. Deci MTU minim pentru<br />
Speakfreely este 552 bytes. Optiunea &#8220;noauth&#8221; poate fi necesara in<br />
distributiile noi.</p>
<p>3.2. Script-uri</p>
<p>3.2.1 Pornirea lui pppd si mentinerea lui in functiune</p>
<p>Ati putea porni pppd dintr-un script (rc) de boot. Oricum, daca faceti<br />
asta, si pppd moare, ramaneti fara legatura. O solutie mult mai stabila<br />
este aceea de a porni pppd din fisierul /etc/inittab:</p>
<p>s1:23:respawn:/usr/sbin/pppd /dev/ttyS1 115200</p>
<p>Astfel, pppd va fi restartat daca &#8220;moare&#8221;. Asigurati-va ca aveti optiunea<br />
&#8220;-detach&#8221; (&#8220;nodetach&#8221; in distributiile mai noi), altfel inittab<br />
va porni mai multe pppd-uri, &#8220;plangandu-se&#8221; cu mesaje de genul &#8220;respawning<br />
too fast&#8221;.</p>
<p>NOTA: unele sisteme mai vechi nu accepta viteza de 115200.<br />
In acest caz folositi 38400 si parametrul &#8220;spd_vhi&#8221; pentru comanda<br />
&#8220;setserial&#8221;. Unele sisteme se asteapta sa folositi dispozitivul /dev/cua<br />
in loc de /dev/ttySx.</p>
<p>3.3.2. Configurarea rutelor.</p>
<p>Ruta implicita poate fi configurata cu optiunea &#8220;defaultroute&#8221; sau cu<br />
scriptul /etc/ppp/ip-up;</p>
<p>#!/bin/bash<br />
case $2 in<br />
/dev/ttyS1)<br />
/sbin/route add -net 0.0.0.0 gw Rem_Ip netmask 0.0.0.0<br />
;;<br />
esac</p>
<p>ip-up poate fi folosit de asemeni pentru a va sincroniza ceasul calculatorului<br />
cu comanda &#8220;netdate&#8221;.</p>
<p>Bineinteles, ruta setata cu ip-up nu este in mod necesar ruta implicita.<br />
Ip-up seteaza ruta catre reteaua de la distanta in timp ce scriptul ip-up<br />
de la distanta seteaza ruta catre reteaua locala. Daca reteaua dvs<br />
locala este 192.168.1.0 si interfata dvs ppp este 192.168.1.1,<br />
scriptul ip-up de pe masina de la distanta arata cam asa:</p>
<p>#!/bin/bash<br />
case $2 in<br />
/dev/ttyS1)<br />
/sbin/route add -net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0<br />
;;<br />
esac</p>
<p>Bitii &#8220;case $2&#8243; si &#8220;/dev/ttyS1)&#8221; apar in caz ca folositi mai multe conexiuni<br />
ppp. Ip-up va rula ori de cate ori apare o conexiune, dar doar partea<br />
dintre &#8220;/dev/ttySx)&#8221; si &#8220;;;&#8221; va fi executata, stabilind ruta potrivita<br />
pentru fiecare dispozitiv ttySx potrivit. Puteti afla mai multe despre<br />
rutare in documentul Linux Networking HOWTO la sectiunea rutare.</p>
<p>3.3. Test</p>
<p>Testati toata configuratia exact ca in cazul modemurlor.<br />
Daca functioneaza, luati bicicleta si porniti sistemul de la distanta.<br />
Daca nu functioneaza, verificati viteza portului COM. De obicei o greseala<br />
frecventa este de a configura legatura cu Minicom cu o viteza si<br />
apoi configurarea pppd cu alta viteza . Asa NU va functiona.<br />
Folositi aceiasi viteza permanent.</p>
]]></content:encoded>
			<wfw:commentRss>http://resurse-educationale.uv.ro/?feed=rss2&#038;p=167</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
