IPCHAINS pentru Linux. HOWTO

traducere ver. 0.2 de catre Riddl
Documentul a fost tradus intr-un ritm foarte alert.
Nu este o traducere profesionala. Deasemenea nu este o traducere mot-a-mot.
Am incercat sa respect versiunea originala.
Multumiri lui Gushterul. Daca gasiti greseli sau aveti obervatii dati-mi
un mail pentru Riddl la “discutii at gmx dot net”. Nu uitati sa precizati
numele documentului.
Multumesc anticipat.
Pentru ultima versiune a acestei traduceri verifica
<http://www.securityorg.net/docs/>.

Lecturare placuta!

______________________________________________________________________
Rusty Russell
v1.0.8, Tue Jul 4 14:20:53 EST 2000

Acest document descrie cum sa obtii, instalezi si configurezi software-ul
ipchains pentru realizarea de firewall sub Linux, precum si cateva
posibilitati de folosire al acestuia.
______________________________________________________________________

Cuprins

1. Introducere
1.1. La ce foloseste?
1.2. De ce?
1.3. Cum?
1.4. De unde?
2. Bazele teoretice ale filtrarii de pachete
2.1. La ce foloseste?
2.2. De ce?
2.3. Cum?
2.3.1. Un kernel ce are compilat suport pentru filtrare de
pachete
2.3.2. ipchains
2.3.3. Crearea regulilor permanente
3. Sunt derutat! Rutare, masqueradare, forwardare de pachete, ipautofw….
3.1. Ghidul de trei linii al lui Rusty privind masqueradarea
3.2. Promovare gratuita: regulile WatchGuard
3.3. Firewall-uri obisnuite
3.3.1. Retea privata: Proxy-uri traditionale
3.3.2. Retea privata: Proxy-uri transparente
3.3.3. Retea privata: Masquerading
3.3.4. Retea publica
3.3.5. Servicii interne limitate
3.4. Mai multe informatii despre masquerading

4. Filtrul de pachete
4.1. Cum travereseaza pachetele filtrele
4.1.1. Folosirea ipchains
4.1.2. Ce vei vedea cand porneste computerul
4.1.3. Operatii pentru o singura regula
4.1.4. Optiuni de filtrare
4.1.4.1. Specificarea adreselor IP sursa si destinatie
4.1.4.2. Specificarea inversa
4.1.4.3. Specificarea protocolului
4.1.4.3.1. Specificarea porturilor TCP si UDP
4.1.4.3.2. Specificarea tipului si codului
ICMP
4.1.4.4. Specificarea interfetei
4.1.4.5. Specificarea doar a pachetelor TCP SYN
4.1.4.6. Despre fragmente
4.1.5. Efectele filtrarii de pachete
4.1.5.1. Specificarea unei tinte
4.1.5.2. Logarea pachetelor
4.1.5.3. Schimbarea tos (type of service)
4.1.5.4. Marcarea unui pachet
4.1.5.5. Operatii pentru un chain
4.1.5.6. Crearea unui chain nou
4.1.5.7. Stergerea unui chain
4.1.5.8. Stergerea tuturor regulilor unui chain
4.1.5.9. Listarea regulilor unui chain
4.1.5.10. Resetarea (aducerea la 0) a counter-elor
4.1.5.11. Setarea policy-ului
4.1.6. Operatii pentru masquerading
4.1.7. Verificarea unui pachet
4.1.8. Mai multe reguli dintr-o data si ceea ce se intampla
atunci
4.2. Exemple folositoare
4.2.1. Folosirea ipchains-save
4.2.2. Folosirea ipchains-restore
5. Diverse
5.1. Cum sa iti organizezi regulile firewall-ului
5.2. Ce anume sa nu filtrezi spre afara
5.2.1. Pachete icmp
5.2.2. Conexiunile TCP catre servere DNS (servere de nume)
5.2.3. FTP
5.3. Filtrarea Pingului Mortii
5.4. Filtrarea pentru Teardrop si Bonk
5.5. Filtrarea fragmentelor in masa
5.6. Schimbarea regulilor din firewall
5.7. Cum realizez protectia impotriva spoofarii IP
5.8. Proiecte mai avansate
5.8.1. SPF: filtrare dupa starea pachetului (stateful packet
filtering)
5.8.2. “Hack-ul” ftp-data al lui Michael Hasenstein
5.9. Planuri de viitor
6. Probleme des intalnite
6.1. ipchains -L ingheata!
6.2. Specificarea inversa nu poate fi realizata!
6.3. Masqueradarea/Forwardarea nu se realizeaza!
6.4. Tinta -j REDIR nu merge!
6.5. Specificare mai multor interfete (ex “-i ppp+”) nu merge!
6.6. TOS nu merge!
6.7. ipautofw si ipportfw nu merg!
6.8. xosview este stricat!
6.9. Segmentation Fault din cauza tintei “-j REDIRECT”!
6.10. Nu pot preciza valori de timeout pentru masquerading!
6.11. Vreau sa filtrez IPX!
7. Un exemplu serios
7.1. Topologia retelei
7.2. Scopurile
7.3. Inainte de realizarea filtrarii de pachete
7.4. Filtrarea de pachete pentru pachetele directe
7.4.1. Trecerea spre alte chain-uri din chain-ul forward
7.4.2. Definirea chain-ului icmp-acc
7.4.3. Reguli pentru conexiuni reteaua interna ==> DMZ
(servere)
7.4.4. Reguli pentru conexiuni din reteaua externa ==> DMZ
(servere)
7.4.5. Reguli pentru conexiuni din reteaua interna ==> reteaua
externa
7.4.6. Reguli pentru conexiuni din DMZ ==> reteaua interna
7.4.7. Reguli pentru conexiuni din DMZ ==> reteaua externa
7.4.8. Reguli pentru conexiuni din reteaua externa ==> reteaua
interna
7.4.9. Filtrul de pachete pentru insusi sistemul care este
ruter
7.4.9.1. Interfata catre reteaua externa
7.4.9.2. Interfata catre reteaua de servere (DMZ)
7.4.9.3. Interfata catre reteaua interna
7.5. In final
8. Anexa: Diferente intre ipchains si ipfwadm
8.1. Tabel pentru informare rapida
8.2. Exemple de comenzi ipfwadm translatate in ipchains
9. Anexa: Folosirea scriptului ipfwadm-wrapper
10. Anexa: Multumiri.
10.1. Traduceri

Continue reading

Posted in Servers, Web | Tagged , , , , , , , , , , , , , | Comments Off

CUM SA administrati rapid un DNS. HOWTO

DNS HOWTO
Nicolai Langfeldt (janl@linpro.no), Jamie Norrish and others
Version 3.1, 2001-01-18
Traducerea: Victor Plugaru(vuk@go.ro). Cu scuzele de rigoare
pentru eventualele greseli si/sau inadvertente.

CUM SA administrati rapid un DNS.
______________________________________________________________________

Cuprins

1. Preambul

1.1 Chestiuni legale
1.2 Credit si cereri de suport.
1.3 Dedicatie

2. Introducere.

3. Caching name server.

3.1 Pornirea lui named
3.2 Resolvere
3.3 Felicitari

4. Forwarding

5. Un domeniu simplu

5.1 Intai teorie seaca
5.2 Propriul nostru domeniu
5.3 Zona reverse
5.4 Cuvinte de atentionare
5.5 De ce nu functioneaza interogarile inverse.
5.5.1 Zona reverse nu este investita.
5.5.2 Aveti un subnet fara clase
5.6 Servere slave (sclav)

6. Optiuni de securitate fundamentale.

6.1 Restrictionarea transferurilor pe zone
6.2 Protectia in situatii de spoofing
6.3 Rularea lui named ca non-root

7. Un exemplu real de domeniu

7.1 /etc/named.conf (sau /var/named/named.conf)
7.2 /var/named/root.hints
7.3 /var/named/zone/127.0.0
7.4 /var/named/zone/land-5.com
7.5 /var/named/zone/206.6.177

8. Intretinere

9. Conversia de la versiunea 4 la versiunea 8

10. Intrebari si raspunsuri

11. Cum sa deveniti un administrator DNS la scara mare.

Continue reading

Posted in Servers, Web | Tagged , , , , , , , , , , , , , , , , , , , , | Comments Off

Limbajul JavaScript. Aplicaţii

JavaScript este un limbaj de scriptare simplu, interpretat, orientat spre obiecte, care poate fi folosit pentru a adăuga un comportament interactiv simplu unei pagini HTML prin intermediul unui script de cuvinte-cheie într-o pagină Web.

JavaScript este un limbaj de scriptare a cărei sintaxă seamănă, într-o oarecare măsură, cu cea a limbajelor C, C++, Pascal, Java sau Delphi, dar care are anumite particularităţi care îl fac să se deosebească esenţial de orice alt limbaj de programare. Pentru ca programul de navigare să poată executa instrucţiuni JavaScript, el trebuie configurat în aşa fel încît să nu ignore astfel de instrucţiuni. Totodată programul de navigare trebuie să recunoască instrucţiunile JavaScript;

JavaScript este un limbaj independent de platforma pe care rulează, adică un acelaşi script va putea fi executat sub Unix, MacIntosh sau Windows fără a fi necesară efectuarea anumitor modificări.

Limbajul Java poate fi folosit pentru proiectarea de aplicaţii independente sau pentru proiectarea de microaplicaţii care pot fi incluse în cadrul paginilor Web şi care poartă denumirea de applet-uri şi sunt şi ele independente de platformă.

Script-urile JavaScript sunt incluse prin intermediul marcajului <SCRIPT>, iar applet-urile Java prin intermediul marcajului <OBJECT>; există şi marcajul <APPLET> , dar folosirea lui nu mai este recomandată.

JavaScript foloseşte legarea dinamică, adică referinţele sunt verificate în timpul rulării, în timp ce Java foloseşte legarea statică, adică referinţele trebuie să existe în momentul compilării.

Cu JavaScript se poate îngloba scripturi direct în paginile HTML. Aceste scripturi pot fi folosite pentru a programa pagina Web să răspundă şi să reacţioneze la acţiunule programului de vizualizare. JavaScript ocupă un teren de mijloc între programare şi marcarea HTML, ceea ce îl face accesibil fiecăruia.

Fiind un limbaj interpretat, JavaScript este uşor de utilizat, dar creşte şi şansa de a include un script cu erori. Este nevoie  de verificat toate scripturile înainte de ale plasa pe paginile Web. Limbajul este orientat spre obiecte. Fiecare obiect are proprietăţi, metode şi subrutine de tratare a evenimentelor asociate lui.

Condiţia actuală a limbajulu Java Script

Java Script a fost lansat cu o versiune 1.0 împreună cu Netscape Navigator 2.0. Cu fiecare nouă versiune, alte obiecte au fost adăugate limbajului. În principal, aceste noi obiecte permit verificarea noilor caracteristici din browser. Microsoft  creat o implimentare JavaScript pentru browserul său Intrenet Explorer numită Jscript. Diferenţa dintre JavaScript şi Jscript sunt foarte subtile dar există. Pentru crearea scriptului JavaScript pentru Internet Explorer, mai întîi este nevoie de verificat pagina de informaţii despre Jscript creată de Microsoft la adresa-http://www.microsoft.com/jscript.

Marcajul <SCRIPT>

În interiorul unui document HTML, instrucţiunile JavaScript sunt cuprinse, de obicei, în interiorul marcajului <SCRIPT> care este o extensie a limbajului HTML. Acest marcaj poate apărea atît în antetul documentului HTML (marcajul <HEAD>), cît şi în corpul documentului (marcajul <BODY>), şi deasemenea permite introducerea unui numar arbitrar de funcţii sau secvenţe de instrucţiuni JavaScript şi poate să apară în orice secţiune a documentului . Script-urile definite în antet sunt încărcate înaintea încărcării restului paginii, antetul fiind un loc excelent pentru plasarea funcţiilor JavaScript pentru a fi sigure că acestea vor fi disponibile atunci cînd sunt apelate în alte secţiuni ale documentului HTML. Sintaxa marcajului <SCRIPT> este următoarea (în cazul folosirii limbajului JavaScript):

<SCRIPT language=”JavaScript”>

//cod JavaScript

</SCRIPT>

Marcajul <SCRIPT> are un atribut suplimentar numit src cu ajutorul căruia se poate preciza URL-ul unui fişier care conţine instrucţiunile JavaScript care formează script-ul respectiv. De obicei, fişierele care conţin astfel de instrucţiuni au extensia JS. Limbajul JavaScript oferă multe alte facilităţi în afară de simpla înserare de elemente într-o pagină Web.

Exemplu 1:  Acest exemplu ilustrează o modalitate de a cere utilizatorului să introducă anumite date:

<HTML>

<HEAD>

<TITLE>

Salut!

</TITLE>

<SCRIPT language=”JavaScript”>

var nume=window.prompt

(“Vă rugăm să vă introduceţi numele:”,”");

document.write(“Salut “+nume+”!”);

</SCRIPT>

</HEAD>

</HTML>

tza java

Posted in JavaScript, Programming | Comments Off

68 de pagini de probleme rezolvate si teorie in Pascal


1.1. GHID DE LUCRU

Rezolvarea unei probleme cu ajutorul calculatorului presupune parcurgerea următoarelor faze:

‑ precizarea completă a problemei de rezolvat;

‑ proiectarea algoritmului de rezolvare a problemei;

‑ programarea propriu‑zisă (implementarea);

‑ testarea programului obţinut;

‑ exploatarea şi întreţinerea programului.

Aceste faze constituie ciclul de viaţă al programului.

De foarte multe ori, atunci când beneficiarul discută cu executantul despre problema care trebuie rezolvată, acesta dă un enunţ vag, incomplet, dacă nu chiar inexact sau contradictoriu, pentru problema de rezolvat. Urmează mai multe discuţii, uneori întinse în timp, în urma cărora se ajunge la un enunţ relativ complet şi exact al problemei. Întrucât problemele propuse sunt luate din domeniul matematicii sarcina noastră va fi mult mai uşoară.

După enunţarea problemei urmează modelarea matematică şi căutarea unei metode de rezolvare a ei. Uneori sunt posibile mai multe moduri de rezolvare, caz în care se va alege metoda considerată cea mai potrivită scopului urmărit. Modelarea matematică şi alegerea unei metode de rezolvare se îmbină aproape întotdeauna cu conceperea algoritmului, fiind greu să se separe una de cealaltă. Activităţile de mai sus constituie ceea ce numim proiectarea programului.

Pe toată durata proiectării trebuie menţionate în scris toate deciziile luate, întrucât este posibil ca ulterior să fie necesară o reproiectare şi deci, să se revină asupra acestor decizii. Documentaţia realizată este necesară în primul rând pentru următoarea fază a ciclului de viaţă al programului, implementarea. De asemenea, în faza de întreţinere a programului este posibilă modificarea unor module, modificare în care sunt necesare să fie cunoscute şi aceste decizii. E bine ca proiectarea să fie astfel făcută încât să permită o întreţinere cât mai uşoară.  Faza următoare, implementarea sau codificarea, constă în traducerea algoritmului într‑un limbaj de programare. Evident, prima decizie ce trebuie luată constă în alegerea limbajului de programare în care va fi scris programul. În cele ce urmează vom folosi în acest scop limbajul Pascal. De multe ori se vor folosi mai multe limbaje pentru această activitate. De exemplu, pot exista unele module a căror scriere se poate face numai în limbajul de asamblare. Urmează testarea programului elaborat, care uneori pune în evidenţă erori grave de programare, erori care au dus în unele situaţii la refacerea (parţială sau integrală) a activităţilor anterioare. Sigur că este de dorit să nu se ajungă la astfel de situaţii şi, dacă proiectarea şi implementarea au fost făcute corect, în faza de testare nu ar trebui să întâlnim erori.

Următoarea fază din viaţa programului constă în exploatarea propriu-zisă a acestuia, fază în care execuţia se face cu date reale. Această activitate se întinde în timp pe mai mulţi ani şi cere adeseori schimbări în program, motiv pentru care este cunoscută sub numele de întreţinerea programului. Este faza cea mai costisitoare şi cea mai importantă din viaţa unui produsul real. Toată activitatea de realizare a programului trebuie să ţină seama de acest fapt şi programul să fie astfel conceput încât să se permită modificări în ceea ce face programul cu un număr minim de modificări în textul acestuia. Documentarea programului presupune elaborarea unor materiale scrise în care se precizează toate informaţiile utile despre programul realizat. Pentru proiectarea algoritmilor vom folosi limbajul Pseudocod. Avantajele folosirii acestui limbaj pentru proiectarea algoritmilor constau în faptul că permit programatorului să-şi îndrepte complet atenţia asupra logicii rezolvării problemei şi să uite de restricţiile impuse de limbajul de programare şi calculatorul folosit. În această fază este necesară o analiză atentă a problemei în vederea găsirii unui algoritm corect proiectat.

De asemenea, proiectarea algoritmului permite evitarea duplicării unui grup de instrucţiuni în mai multe părţi ale programului. Identificarea unui astfel de grup permite definirea lui ca un singur subalgoritm şi folosirea acestui subalgoritm ori de câte ori este necesar.

În descrierea unui algoritm deosebim următoarele activităţi importante:

- specificarea problemei;

- descrierea metodei alese pentru rezolvarea problemei;

- precizarea denumirilor şi semnificaţiilor variabilelor folosite;

- descrierea algoritmului propriu-zis.

Astfel, dacă ni se cere să calculăm radicalul de ordinul 2 din x, în partea de specificare a problemei vom menţiona:

Se dă un număr real nenegativ, notat prin x.

Se cere să găsim un alt număr pozitiv r astfel încât r2=x.

Pentru un informatician este clar că un astfel de număr nu se poate găsi în general prin nici un procedeu finit. Este însă posibil să găsim o aproximare oricât de bună a lui r. Deci specificarea făcută nu este corectă, neputând găsi un algoritm care să rezolve problema în forma enunţată. Vom modifica această specificaţie, cerând să se calculeze aproximativ r cu o eroare ce nu depăşeşte un număr real eps oricât de mic.

Specificaţia problemei este:

DATE eps,x;                                                                                                    {eps,xR,  eps>0 şi x0}

REZULTATE r;                                                                                                          {r-rad(x)<eps}

unde prin rad(x) am notat radicalul de ordinul 2 din x definit în matematică.

Urmează să precizăm metoda de rezolvare a problemei. Se ştie că există cel puţin două posibilităţi de a calcula pe r:

- ca limită a unui şir (definit printr-o relaţie de recurenţă) convergent la r;

- prin rezolvarea ecuaţiei r2=x.

Precizăm că-l vom calcula pe r rezolvând ecuaţia r2=x. Dar şi rezolvarea acestei ecuaţii se poate face prin mai multe metode. Decidem că o vom rezolva prin metoda njumătăţirii. Această metodă constă în njumătăţirea repetată a intervalului [a,b] care conţine rădăcina r la intervalul [a',b'], care este jumătatea stângă, sau jumătatea dreaptă a intervalului [a,b], cea care conţine rădăcina.

Variabilele folosite în descrierea algoritmului sunt:

- a şi b = capetele intervalului în care se află rădăcina;

- m mijlocul intervalului (a,b). În momentul în care b-a<eps,

m va fi chiar valoarea căutată pentru r.

Algoritmul propriu-zis este descris în continuare:

*Iniţializează pe a şi b;

REPETĂ

FIE m:=(a+b)/2;

* Dacă rădăcina se află în [a,m] atunci b:=m altfel a:=m.

PNĂCND b-a<eps SF-REPETĂ

FIE r:=(a+b)/2;

În textul de mai sus apar două propoziţii nestandard care sugerează însă foarte bine ce acţiuni trebuiesc întreprinse. Prima stabileşte intervalul iniţial în care se află rădăcina, care depinde de mărimea lui x: (x,1) când x este mai mic decât 1 sau (1,x) în caz contrar. Deci ea se va transcrie în propoziţia standard

DACĂ x<1 ATUNCI ATRIBUIE  a:=x;  b:=1

ALTFEL ATRIBUIE  a:=1;  b:=x

SF-DACĂ

A doua propoziţie înjumătăţeşte intervalul. Condiţia ca rădăcina să se afle în jumătatea stângă a intervalului este (a2-x)*(m2-x)<0. Se ajunge la următoarea variantă finală:

ALGORITMUL RADICAL ESTE:                                                       {Calculează radical din x}

DATE eps,x;                                                                                                     {eps,xR, eps>0 şi x0}

DACĂ x<1 ATUNCI FIE  a:=x;  b:=1                                                   {Iniţializează pe a şi b}

ALTFEL FIE  a:=1;  b:=x

SF-DACĂ

REPETĂ

DACĂ (a2-x)*(m2-x)<0 ATUNCI b:=m                                                   {rădăcina în stânga}

ALTFEL a:=m                                                                       {rădăcina în dreapta}

SF-DACĂ

PNĂCND b-a<eps SF-REPETĂ

FIE r:=(a+b)/2;

REZULTATE r;                                                                                                          {r-rad(x)<eps}

SF-ALGORITM

Programul Pascal corespunzător este dat în continuare.

PROGRAM RADICAL;                                                                {Programul 1.1. Calculează radical din x}

VAR eps,                                                                                               {eps= precizia cu care se calculează}

x,                                                                                                                       {radical din x, eps>0 si x>=0}

r,                                                                                                                                 {valoarea radicalului x}

a,b,                                                                                                   {capetele intervalului ce conţine pe r}

m : REAL;                                                                                                           {mijlocul intervalului [a,b]}

BEGIN

WRITELN(‘Se calculează radical din x cu precizia eps:’);

WRITE(‘eps=’);   READLN(eps);

WRITE(‘ x =’);   READLN(x);

IF x<1 THEN BEGIN a:=x;  b:=1 END                                                                     {Iniţializează pe a si b}

ELSE BEGIN a:=1;  b:=x END;

REPEAT

m:=(a+b)/2;

IF (a*a‑x)*(m*m‑x)<0

THEN b:=m                                                                                                       {rădăcina în stânga}

ELSE a:=m;                                                                                                       {rădăcina in dreapta}

UNTIL b‑a<eps;

r:=(a+b)/2;

WRITELN;  WRITELN;

WRITELN(‘Radical(‘,x:6:1,’) = ‘,r:6:3);                                                                                     {r‑rad(x)<eps}

READLN

END.

1.2. NUMERE PITAGORICE.

Numerele a,b,c, se numesc pitagorice dacă

Specificarea problemei este:

DATE n;                                                                               {nN; pentru n<12 nu există triplete}

REZULTATE toate tripletele de numere pitagorice (a,b,c) cu proprietatea

0<a<b<c şi a+b+cn.

Vom nota prin S suma a+b+c. Se ştie că (3,4,5) este primul triplet de numere pitagorice. În acest caz S ia valori de la 12 la n. Întrucât  3a<S variabila a ia valori de la 3 la S/3. Apoi 2b<S-a deci b va lua valori de la a+1 la (S-a)/2. Algoritmul pentru rezolvarea problemei este dat în continuare :

Algoritmul NRPITAGORICE este :

Date n;                                                                                                {nN; pentru n<12 nu există triplete}

Dacă n<12

atunci Tipăreşte “Nu există numerele cerute”

altfel Pentru S=12,n execută

Pentru a=3,S/3 execută

Pentru b=a+1,(S-a)/2 execută

Fie c:=S-a-b;

Dacă c=a+b atunci Tipăreşte(a,b,c) Sf-dacă

Sf-pentru

Sf-pentru

Sf-pentru

Sf-dacă

Sf-algoritm.

Programul Pascal corespunzător este dat în continuare.

PROGRAM  NRPITAGORICE;                                                         {Programul 1.1.2. Numere pitagorice}

VAR n,                                                                                                                             {    nN;  a+b+cn        }

S,                                                                                                                                   {    S  =  a+b+c          }

a,b,c,                                                                                                   {(a,b,c) triplet de numere pitagorice}

{  0 < a < b < c          }

k     : integer;                                                                                                                                    { contor }

BEGIN

WRITELN(‘Se tipăresc tripletele(a,b,c) de numere pitagorice’);

WRITELN(‘cu proprietatea: a+b+c<=n, pentru n dat’);

WRITE(‘Daţi valoarea lui n:’); READLN(n);

For k:=1 to 4 do writeln;

k:=0;

IF n<12

THEN WRITELN(‘Nu exista numerele cerute’)

ELSE FOR S:=12 TO n DO

FOR a:=3 TO S DIV 3 DO

FOR b:=a+1 TO (S‑a) DIV 2 DO

BEGIN

c:=S‑a‑b;

IF c*c=a*a+b*b THEN BEGIN

k:=k+1;

WRITELN(‘Tripletul (a,b,c)’,k:3,’= ‘,a:3, b:3,c:3);

END {IF}

END;

READLN;

END.

68 de pagini de probleme rezolvate si teorie in Pascal

Posted in Pascal, Programming, Teze | Tagged , , , , , | Comments Off

Utilizarea variabilelor aleatoare la rezolvarea problemelor

Îmbinarea de cuvinte „variabilă aleatoare” în sensul direct se utilizează atunci cînd dorim să subliniem, că nu se ştie dinainte care va fi valoarea acestei variabile. Deasemenea în spatele acestor cuvinte se ascunde şi neştirea cum ar arăta această variabilă.

Însă un matematician utilizează aceleaşi cuvinte – „variabilă aleatoare”, punînd în sensul acestor cuvinte ceva bine determinat. Într-adevăr, spune un matematician, noi nu ştim ce valoare va primi variabila aleatoare în cazul dat concret, dar noi putem determina ce valori poate primi această variabilă, şi putem calcula care este probalilitate de apariţie a evenimentelor.

Pe baza acestor date noi nu putem să anticipăm care ar fi rezultatul unui experiment legat de această mărime, dar noi putem să ştim care ar fi rezultatul unei serii întregi de experimente. Cu cît este mai mare numărul de experimente cu atît mai exact putem să prezicem care va fi rezultatul.

Pentru a defini o variabilă aleatoare, trebuie să indicăm ce valori ar putea lua această variabilă şi care sunt probabilităţile de apariţie ale acestor valori.

Există două tipuri de variabile aleatoare: continue şi discrete.

§1. Variabile aleatoare continue

Variabile aleatoare, valorile căreia aparţin unui interval, se numeşte continuă.

În cazuri particulare acesta poate fi nu un singur interval, dar reuniunea a mai multor intervale. Intervalele pot fi finite, parţial finite sau infinite, de exemplu:  (a; b], (–µ ; a), [b;µ), (–µ; µ).

În general variabila aleatoare continuă este o abstractizare. Вообще непрерывная случайная величина – это абстракция. Obuzul, lansat de un proectil, poate să parcurgă o distanţă cuprinsă între 5 şi 5,3 km, dar nimănui nu-i va veni în gînd să măsoare această distanţă cu exactitatea de pînă la milimetri, nemaivorbind de exactitatea absolută. În practică această distanţă va fi o variabilă aleatoare discretă, la care fiecare valoare a variabilei se deosebeşte de alta cel puţin cu distanţa de un metru.

La descrierea unei variabile aleatoare continue principial nu pot fi scrise şi numerotate toate valorile pe care le poate lua această variabilă, care aparţin unui interval destul de îngust. Aceste valori formează o mulţime nenumărabilă, care se numeşte „”continuu”.

Dacă x este o variabilă aleatoare continuă, atunci egalitatea x = х reprezintă în sine, ca şi în cazul variabilei aleatoare discrete, un careva eveniment aleator, dar pentru variabila aleatoare continuă acest eveniment poate fi legat cu o probabilitate egală cu zero, ceea ce nu indică că evenimentul este imposibil. Aşa de exemplu, putem spune, că obuzul va parcurge distanţa de 5245,7183m cu probabiliatea zero, sau, că diametrului unei piese deviază de la cel ideal cu 0,001059 milimetri. În aceste cazuri este greu să ne dăm seam  - avut loc experimentul sau nu, deoarece măsurarea acestor mărim se efectuiază cu o careva eroare, şi în calitate de rezultat pot fi doare indicate limitele între care se va afla mărimea dată.

Valorilor variabilelor aleatoare le este specifică o careva nedeterminare. De exemplu, nu are sens distingem două valori care se abat de la valoarea matematic ideală cu 0,5mm şi 0,5000025mm. Probabilitatea, diferită de zero, poate fi legată doar cu nimerirea  mărimii în intervalul dat, chiar dacă este destul de îngust.

Fie x – o variabilă aleatoare continuă. Vom cerceta pentru un careva număr х probabilitatea inegalităţii  х < x < х + Dх

P(х < x < х + Dх).

Aici Dх – mărimea unui interval îngust.

Evident, că dacă  Dх ® 0, atunci P(х < x < х + Dх) ® 0. Notăm prin р(х) limita raportului P(х < x < х + Dх) la Dх , cînd Dх ® 0, dacă această limită există:

Funcţia р(х) se numeşte densitatea de repartiţie a variabilea aleatoare. Di for formula (1) rezultă egalitatea, care este adevărată pentru valori foarte mici lae lui Dх şi care poate fi considerată definirea funcţiei  р(х):

P(х < x < х + Dх)

Evident, că funcţia p(x) este o funcţie nenegativă. Pentru definirea probabilităţii, că variabila aleatoare x va lua valori din intervalul [ab] de lungime finită, vom alege pe acest interval numerele arbitrare x1х2,¼,  хn care satisfac condiţiei а=х0<х1<x2<¼<xn<b=xn+1. Aceste numere impart intervalul [ab] în n+1 părţi, care nu sunt altceva decît tot nişte intervale [х0х1), [х1х2), ¼,[хnb]. Introducem notaţiile:

Dх0= х1 х0, Dх1= х2 х1, ¼, Dхn = b – хn,

şi formăm suma

teza_var_aleatoare

Posted in Pascal, Programming | Tagged , , , , , | Comments Off

Sisteme de numeraţie. Congruenţe. Rezolvarea problemelor în limbajul de programare Pascal

În calculatoarele digitale informaţia de orice categorie este reprezentată, stocată şi prelucrată în formă numerică. Numerele se reprezintă prin simboluri elementare numite cifre. Totalitatea regulilor de reprezentare a numerelor împreună cu mulţimea cifrelor poartă denumirea de sistem de numeraţie. Există două tipuri de sisteme de numeraţie: sisteme poziţionale de numeraţie şi sisteme nepoziţionale de numeraţie.

Un sistem de numeraţie poziţional este caracterizat de baza sa. Numărul cifrelor defineşte baza sistemului de numeraţie. Pentru un sistem de numeraţie poziţional este justă următoarea egalitate:

X(q)=anqn+an-1qn-1+…+a1q1+a0q0+a-1q-1+…+a-mq-m,          (1)

unde q – baza sistemului poziţional de numeraţie, un număr întreg; X(q) – un număr arbitrar reprezentat în sistemul de numeraţie poziţional cu baza q; ai – coeficienţii şirului (cifrele sistemului de numeraţie); n, m – numărul de clase întregi şi fracţionare. În practică se utilizează forma prescurtată de reprezentare a numerelor, adică X(q)=anan-1…a1a0a-1…a-m.

Egalitatea (1) se utilizează şi pentru conversia numerelor reprezentate într-un sistem poziţional de numeraţie cu baza q în echivalentul său zecimal.

Conversia numărului zecimal X10 în echivalentul său în baza q se efectuează conform următoarelor reguli:

Întrucât 8=23, conversia binar – octală şi octal – binară se poate face direct. Orice cifră octală se reprezintă prin trei cifre binare, numită triadă:

0 = 000           4 = 100

1 = 001           5 = 101

2 = 010           6 = 110

3 = 011           7 = 111.

Dacă se consideră un număr octal, pentru conversia în binar se va scrie fiecare cifră octală prin trei cifre binare.

Dacă se consideră un număr binar, pentru conversia în octal se vor grupa cîte trei cifre binare, pornind de la poziţia virgulei spre stînga pentru partea întreagă, respectiv dreapta pentru partea fracţionară, găsind corespondentul octal. Pentru completarea unui grup de trei cifre binare, zerourile din faţa numărului, respectiv după ultima cifră a părţii fracţionare nu modifică semnificaţia numărului.

Într-un mod similar se procedează şi în cazul sistemului hexazecimal, baza căruia 16=24. Orice cifră hexazecimală se reprezintă prin 4 cifre binare, numită tetradă:

0 = 0000               8 = 1000

1 = 0001               9 = 1001

2 = 0010               A = 1010

3 = 0011               B = 1011

4 = 0100               C = 1100

5 = 0101               D = 1101

6 = 0110               E = 1110

7 = 0111               F = 1111.

teza_sisteme

Posted in Informatica aplicata, Programming, Teze | Tagged , , , , | Comments Off

Sistem de calcul. Algoritmică. Programare

Dezvoltarea informaticii actuale se datorează cercetărilor, rezultatelor şi experienţelor din domeniile sistemelor de calcul, algoritmicii şi programării, dar mai ales a interdependenţei acestor domenii prin aşa-numita triadă:

sistem de calcul – algoritmică – programare

La baza acestei interdependenţe se află conceptul de algoritm, concept ce a construit  pentru om o nouă filosofie: gândirea algoritmică. Această gândire algoritmică a facut posibilă apariţia şi dezvoltarea Tehnologiei Informaţiei (IT) ce reprezintă de fapt implementarea filosofiei procesării, gestionării şi comunicării informaţiilor.

Întâmplător sau nu, deceniul 7 al sec. XX a fost deceniul marilor schimbări în domeniul informaticii şi al sistemelor de calcul:

Toate aceste aspecte au fost şi sunt într-o interdependenţa continuă ţinând seama de particularitatea informaticii care oferă sisteme de calcul performante şi produse-program competitive în rezolvarea problemelor. Utilizarea eficientă a sistemelor de calcul şi a produselor-program reclamă o instruire continuă, atât pentru informaticieni-programatori, cât şi pentru utilizatori.

Gîndirea algoritmică trebuie să se aiba în vedere în instruire, şi atunci când se invaţă algoritmică (metode şi tehnici), şi atunci când se invaţă programarea (limbaje de programare). Practica instruirii elevilor şi studenţilor a demonstrat că invăţarea unui limbaj de programare este, în general, mai uşoară decat invăţarea elaborarii algoritmilor (algoritmică). Acest lucru se poate justifica prin faptul că elaborarea unui algoritm este echivalentă cu implementarea (reprezentarea) raţionamentelor (procese demonstrative) deduse din metode şi tehnici utilizate în rezolvarea unei probleme. Rezolvarea problemelor necesită nu numai cunoştinţe clare şi precise, dar şi capacitate de sinteză şi control şi mai ales capacitate de creaţie. Dacă vrem să facem o analogie, un programator poate fi compozitorul ce realizează o lucrare muzicală.

Succesele unui programator depind de cunoaşterea foarte bine a programării într-un limbaj de programare modern, dar mai ales depind de bogatia şi stapanirea cunoştinţelor în elaborarea algoritmilor. Şi mai este ceva: experinţa acumulată în activitatea de rezolvare a problemelor prin formarea unei gândiri algoritmice solide şi consistente.

teza_congruenta

Posted in Pascal, Programming | Tagged , , , , , | Comments Off

Aplicaţii ale arborilor în programare.

Dacă oricare două vîrfuri x, yÎV sînt unite printr-un lanţ simplu unic, atunci orice muchie [x, y]ÎU reprezintă  unicul lanţ dintre  x şi y. Suprimînd muchia [x, y], între x şi y nu va mai exista lanţ, deci graful obţinut nu va mai fi conex.

3 Þ 4

Notăm cu n numărul de vîrfuri şi cu m numărul de muchii din graf.

Pentru a demonstra că orice graf conex minimal are n-1 muchii vom demonstra prin inducţie completă după n că  m £ n-1. Cum în orice graf conex m ³ n-1, deducem m = n-1.

P(1)                 Dacă n = 1, atunci m = 0 Þ  m = n-1.

P(2)                 Dacă n = 2, atunci  m =1 Þ  m = n-1.

P(n)                 Presupunem că într-un graf conex minimal cu cel mult n vîrfuri numărul de muchii este strict mai mic decît numărul de vîrfuri.

P(n+1)             Demonstrăm că într-un graf conex minimal cu n+1 vîrfuri, numărul de muchii este cel mult egal cu n.

Fie G conex minimal cu n+1 vîrfuri şi m muchii. Eliminînd o muchie oarecare din graf obţinem un graf G’ cu m-1 muchii şi două componente conexe C1 şi C2 cu n1, respectiv n2 vîrfuri (n1+n2 = n+1) şi m1, respectiv m2 muchii (m1+m2 = m-1). Subgrafurile C1 şi C2 sînt conexe minimale, altfel graful G nu ar fi conex minimal. Din ipoteza inductivă rezultă că m1 £ n1-1, m2 £ n2-1; dar m1+m2 = m-1 £ n1+n2 = n-2 Þ m £ n-1. Deci G conex minimal implică G conex cu n-1 muchii.

4 Þ 5

Fie G un graf conex cu n-1 muchii. Să demonstrăm că G este aciclic.

Presupunem prin reducere la absurd, că graful G conţine un ciclu C format din  vîrfurile v1, v2, …, vk.

Să considerăm subgraful parţial Gk = (Vk, Uk) constînd  din ciclul C. Deci Vk = {v1, v2 ,…, vk}, iar Uk = {[v1,v2)], [v2,v3],…,[vk-1,vk], (vk,v1]} (½Vk½=½Uk½= k). Dacă  ½Vk½<½V½, atunci  $viÎVk şi vk+1ÎV-Vk astfel încît [vi, vk+1]ÎU, graful G fiind conex.

Construim Gk+1 = (Vk+1, Uk+1) în modul următor: Vk+1 = Vk È{vk+1};     Uk+1=UkÈ{[vi,vk+1]} şi ½Uk+1½=½Vk+1½=k+1.

Cît timp k+1 < n, aplicăm acelaşi procedeu pînă cînd obţinem un graf  Gn = (V, Un), cu ½Un½= n, Un Í U; deci ½U½ ³ n, contradicţie cu ipoteza ½U½= n-1.

5 Þ 6

Presupunem că graful G este aciclic cu n-1 muchii, să demonstrăm că G este aciclic maximal.

Fie C1, C2,…, Cp cele p componentele conexe ale grafului G, avînd respectiv n1, n2,…, np vîrfuri şi m1, m2,…, mp muchii fiecare. Evident că n1+n2+…+np = n  şi m1+m2+…+mp = n-1.

Cum graful G este aciclic, deducem că fiecare componentă conexă este un arbore. Deoarece am demonstrat că 1 Þ 5, rezultă că m i= ni-1, “iÎ{1, 2, …, p}. Înlocuind în relaţia de mai sus, obţinem  n-p = n-1 Þ  p = 1, deci G conex. Dacă G este conex şi aciclic, conform definiţiei G este arbore. Dar am demonstrat că 1 Þ 2, deci oricare două vîrfuri din G sînt unite printr-un lanţ simplu. Astfel, adăugînd orice muchie obţinem un ciclu.

6 Þ 1

Presupunem că graful G este aciclic, dar dacă am mai adăuga o muchie s-ar obţine un ciclu. Să demonstrăm că G este conex.

Fie u şi v două vîrfuri neadiacente din graf, arbitrar alese. Deoarece adăugînd muchia [u, v] se obţine un ciclu, rezultă că u şi v sînt unite printr-un lanţ ale cărui muchii aparţin grafului G. Cum u,v au fost alese arbitrar, deducem că graful G este conex.

Q.E.D.

Teorema 2

Numerele întregi 0 < d1 £ d2 £ …£ dn (n ³ 2) sînt gradele vîrfurilor unui arbore dacă şi numai dacă d1+d2+…+dn = 2n-2.

Demonstraţie:

Necesitatea Condiţia este necesară, deoarece orice arbore cu n vîrfuri are n-1 muchii, iar suma gradelor vîrfurilor oricărui graf este de două ori numărul de muchii. Deci d1+d2+…+dn = 2n-2.

Suficienţa Fie 0 < d1 £ d2 £…£ dn astfel încît d1+d2+…+dn = 2n-2.

Să demonstrăm că există un arbore cu gradele vîrfurilor d1, d2,…, dn. Vom proceda prin inducţie.

P(2)                 Dacă d1+d2 = 2, atunci d1 = d2 = 1 , arborele fiind cel din figura de mai jos:

Fig. 3

P(n)                 Presupunem acum că proprietatea este adevărată pentru orice secvenţă de n numere naturale 0 < d1 £ d2 £ …£ dn, astfel încît d1+d2+…+dn = 2n-2.

P(n+1)             Să demonstrăm că pentru orice secvenţă 0 < d’1 £ d’2 £…£ d’n £ d’n+1 astfel încît d’1+d’2+…+d’n+1 = 2n, există un arbore cu n+1 vîrfuri cu secvenţa gradelor d’1, d’2, …, d’n+1.

Observăm că există măcar un nod terminal x1 cu gradul d’1=1, altfel dacă  di ³ 2,”iÎ{1, 2,…, n+1} Þ d’1+d’2+…+d’n+1 ³ 2(n+1), ceea ce contrazice ipoteza. În mod analog, observăm că există măcar un nod neterminal  xn+1, cu gradul d’n+1 > 1, altfel dacă d’i = 1,”iÎ{1, 2, …, n+1} Þ d’1+d’2+…+d’n+1 = n+1 < 2n .

Să considerăm următoarea secvenţă de n numere întregi d’2,…, d’n, d’n+1-1 cu proprietatea că d’2+…+d’n+d’n+1 = 2n-2. Din ipoteza inductivă există un arbore An cu n vîrfuri şi secvenţa gradelor d’2,…, d’n, d’n+1-1. Adăugăm la arborele An un vîrf pe care îl unim printr-o muchie cu vîrful avînd gradul d’n+1-1. Obţinem un arbore An+1 cu gradele vîrfurilor d’1, d’2,…, d’n+1.

Q.E.D.

Demonstraţia acestei teoreme oferă şi o soluţie constructivă pentru obţinerea unui arbore cu secvenţa gradelor dată.

Vom reţine gradele vîrfurilor într-un vector d de dimensiune n, ordonat crescător, cu suma componentelor egală cu 2n-2.

Arborele va fi reprezentat prin matricea muchiilor, o matrice a cu două linii şi n-1 coloane, în care pentru fiecare muchie din arbore vom reţine extremităţile.

Spre deosebire de ideea din demonstraţie, pentru a conserva ordinea în vectorul d, la fiecare pas al algoritmului gradul care va fi decrementat va fi primul grad mai mare ca 1 şi nu ultimul.

Capit1

Capit2_partea1

Capit2_partea2

Posted in Grafuri, Pascal, Programming | Tagged , , , , | Comments Off

Analiza timpului de calcul.

Ne propunem să lămurim modul în care se estimează timpul de calcul necesar unui program pentru a furniza rezultatul.

Să considerăm, una din cele mai simple probleme. Se dă un vector cu n componente. Se cere sa se calculeze maximul dintre componentele sale.

Reamintim, pe scurt algoritmul:

Timpul de calcul depinde, în primul rînd, de lungimea(mărimea) datelor de  intrare, pe care o vom nota cu n.

Exemple:

Pentru a calcula timpul de calcul ar trebui inventariem toate instrucţiunile programului şi să ştim d cîte ori se execută fiecare din ele(în funcţie de n).Mai mult, ar trebuie să cunoaştem cît durează execuţia fiecărui tip de instrucţiune.

Observaţie 1.

Exemplu. Pentru calculul maximului, nu putem şti de cîte ori se execută atribuirea max:=v[i]. Cu toate acestea putem considera că există o proporţionalitate între valoarea n şi numărul de execuţii.

Observaţia 2.

Datorită acestor considerate vom proceda astfel.

Se alege o operaţie numită operaţie de bază, şi se vede de cîte ori se execută aceasta. Cerinţa pentru operaţia de bază este ca aceasta să se execute de un număr de ori, numărul care să poată calcula de la început pornind de la n.

Exemplu.

În astfel de cazuri(cînd avem de ales între mai multe operaţii de bază), vom alege acea operaţie care corespunde cît mai bine scopului propus.

Astfel, dacă analizăm un algoritm de generare a permutării comparativ cu altele de aceeaşi natură vom alege ca operaţie de bază comparaţia.

În cazul în care analizăm un algoritm oarecare, în care soluţia este sub formă de permutare, putem considera ca operaţie de bază permutarea. Problema se spune în felul următor: dacă căutăm soluţia printre toate permutările pe care se pot genera vom avea n! căutări(un număr imens !), oare nu se poate altfel?

Exemple de probleme la care se foloseşte un astfel de raţionament: problema comis voiajorului, problema celor n dame.

Timpul estimat de calcul se trece sub formă aproximativă astfel:

O(număr estimat de execuţii ale operaţiei de bază)

Exemplu de exprimare a timpului.

Dacă un algoritm efectuiază 3n2+7n+5 operaţii de bază, vom spune că aceasta este un algoritm cu O(n2).

Exemple.

În cazul de faţă operaţia aleasă este cea de comparare. Pentru un vector cu n componente se fac n-1 comparaţii. Aceasta înseamnă că dacă vectorul are o sută de componente se fac 99 de comparaţii ş.a.m..d.. Se poate demonstra faptul că un algoritm mai bun nu există!

2.  Pentru generarea permuntărilor(în cazul în care se consideră ca operaţie de bază generarea unei permutări) timpul estimat de calcul este O(n!).

În anumite cazuri nu putem preciza nici macar numărul de execuţie ale operaţiilor de bază.

Exemplu. Sortarea prin interschimbare(vezi 6.2.1). În cazul în care vectorul este sortat se execută n-1 comparaţii (se parcurge vectorul o singură dată), dacă vectorul este sortat invers se execută n(n-1)/2 operaţii de bază (se parcurge vectorul de n ori).

În astfel de cazuri se poate considera:

De fiecare dată cînd se trece timpul estimat se precizează despre care este vorba (minim, mediu, maxim). În practică, prezintă interes timpul madiu sau maxim.

Dacă timpul estimat este sub forma O(nk), k=N*, spunem că algoritmul este în timp polinomial.

Exemlu. Sortarea prin interschimbare are timpul (mediu, maxim) polinomial şi anume O(n2).

Un algoritm în O(n) se numeşte algoritm liniar.

Dacă un algoritm are un timp estimat O(2n), O(3n).. spunem că algoritmul este în timp exponenţial.

Un algoritm în timp O(n!) este asimilat unui algoritm în timp exponenţial.

n!=1x2x…n<2x2x….x2=2n-1.

În practică nu sunt admişi decît algoritm în timp polinomial, deşi nu este deloc indiferent gradul polinomului.

Şi totuşi pentru ce tot acest efort de estimare a timplui de calcul? Oare viteza de lucru a unui calculator nu este atît de mare, în cît abstracţie făcînd de cîteva minute de calcul, în plus sau în minus, să renunţăm la estimarea lui? Răspunsul la această la această întrebarea este categoric negativ. Mai mult timpul de calcul este esenţial dacă este prea mare algoritmul nu are nici un fel de valoare practică. Să ne imaginăm un algoritm care are un timp de calcul O(2n). Dacă n este de 10, calculatorul va efectua aproximativ 1024 operaţii elementare. Dacă n este 100 acesta va trebui să efectueze 1024*1024**1024 operaţii elementare, adică un număr mai mare decît 1000*1000**1000 adică 1000000…0000 (de treizeci de ori). Aceasta este un număr imens. Dar dacă n este 1000? pentru un n nu foarte mare, nici cel mai modern calculator din lume nu scoate rezultatul decît în sute sau în mii de ani. De astfel ce înseamnă în asemenea cazuri un calculator modern? Să presupunem că un sistem PENTIUM are o viteză de circa 25 de ori mai mare decît un sistem XT. Să presupunem că avem un program care are un timp de calcul de ordinul O(2n). Se cere să rezolvăm o problemă pentru n=30. Fie că timpul necesar rulării acestei probleme pe un XT. Această problemă va fi rulată pe PENTIUM în timpul t/25. Dorim să rezolvăm problema pe PENTRIUM pentru n=35 (n a crescut numai cu 5). Dar 235=230*25=32*230. Deci dacă n a crescut cu 5, vom avea nevoie de mai mult timp de lucru să rezolvăm problema pe PENTIUM decît timpul pentru rezolvarea ei pentru n=30 pe XT.

Vă daţi seama ce înseamnă un timp de calcul de ordinul O(2n)? Sporul lui n cu o singură unitate duce la dublarea timpului de calcul.

Ce concluzie tragem de aici? De cîte ori avem de rezovat o problemă căutăm pentru aceasta un algoritm în timp polinomial (polinomul va avea gradul minim). Mai mult căutăm un algoritm care să rezovle problema în timp polinomial de grad minim.

analiza timpului de calcul

Posted in Pascal, Programming, Teze | Tagged , , , , , , | Comments Off

Iniţializare grafică în Pascal.

Placa grafică sau adaptorul de ecran este componenta hard a calculatorului care asigură gestiunea memoriei şi controlul monitorului video. Driver-ul grafic este componenta soft-ului care comandă placa grafică. Placa grafică tratează ecranul în două moduri:

În regimul text fiecare caracter ce apare la ecran este păstrat în memoria calculatorului în doi octeţi, unul cuprinde codul ASCII al caracterului, iar al doilea culorile, iluminarea, culoarea fonului şi clipirea. În regimul grafic memoria ecranului are un cod pentru fiecare pixel prin care se determină culoarea pixelui.

Zona de memorie ecran pentru memorarea unui ecran se numeşte pagină video. Pagina video care apare la un moment dat pe ecran se numeşte pagină vizibilă. Prelucrarea informaţiei grafice în Pascal este susţinută de modulul Graph.

Modulul Graph pune la dispoziţie circa 90 de proceduri şi funcţii păstrate în fişierul graph.tpu. Utilizarea procedurilor şi funcţiilor grafice este posibilă dacă în partea declarativă uses vom declara modulul graph. Fiecare regim grafic are driver-ul său specific. Tabelul  următor conţine lista regimurilor grafice posibile pentru diferite adaptoare grafice. În prima coloniţă sunt indicare  tipurile de drivere, în a doua – numărul de pixeli de pe ecran, în coloniţa a treia este indicată palitra de culori a regimului dat, în ultima coloniţă sunt indicate numărul de pagini video care se pot încărca simultan în memoria videoadaptorului.

Orice program Turbo Pascal ce conţine prelucrarea informaţiei grafice trebuie să cuprindă:

Iniţializarea regimului grafic se relizează prin procedura InitGraph cu formatul:

InitGraph(var GraphDriver:integer; {tipul adaptorului}

var GraphMode:integer; {regimul grafic}

var DriverPath:string); {calea spre driver}

De exemplu:

procedure ini;

var gd, gm:integer;

begin

gd:=detect;

initgraph(gd,gm,’c:\tp\bgi’);

if graphresult<>grok then halt(1);

end;

2. Detecţia rezoluţiei

Funcţia GetMaxX întoarce un numar întreg reprezentând numărul maxim de pixeli (rezoluţia), după direcţia orizontală.

Function GetMaxX:integer;

Funcţia GetMaxY determină numărul maxim de pixeli (rezoluţia), dupa direcţia verticală.

Function GetMaxY:integer;

Funcţia GetMaxColor determină numărul maxim de culori cu care se poate desena pe ecran. În mod convenţional, “culoarea” 0 este cea neagră, astfel încât numărul de culori “de lucru” se află în gama 1..GetMaxColor.

Function GetMaxColor:word;

Cele 3 funcţii sunt necesare pentru scrierea de programe ce folosesc modul grafic şi care pot rula pe orice calculator, indiferent de tipul monitorului şi a placii grafice.

3. Ecranul în modul grafic

Dimensiunea unui element de imagine (pixel) pe direcţia orizontală diferă, în general, de dimensiunea lui pe verticală. Doar adaptoarele mai noi (cum ar fi VGA, VESA) consideră pixelul că având dimensiunile egale pe cele două direcţii.

Raportul între dimensiunea pe orizontală şi dimensiunea pe verticală a unui pixel se numeşte “aspect ratio” (factor/raport de forma).

Procedura prin care se poate afla factorul de forma este GetAspectRatio.

PROCEDURE GetAspectRatio(Var xasp,yasp:word );

Parametrii xasp şi yasp reprezintă numărul de pixeli pe direcţie orizontală şi verticală necesari pentru a obţine o dimensiune “reală”.

Procedura complementară cu GetAspectRatio este SetAspectRatio, ce modifică factorul de forma la valorile dorite. Parametrii xasp, yasp au semificaţie identică cu cei ce apar în procedura GetAspectRatio.

Function SetAspectRatio(xasp,yasp:word):word;

4. Noţiunea de cursor grafic

O noţiune specifică modului grafic este cursorul grafic sau “curent pointer”, notat CP. El este similar cu conceptul de cursor din modul text, dar, spre deosebire de acesta, cursorul este invizibil în mod grafic. Poziţia acestui cursor este importantă la trasarea liniilor, scrierea de text etc.

Pentru a determina poziţia curentă a cursorului grafic se folosesc funcţiile GetX pentru coordonata orizontală şi GetY pentru coordonata verticală.

Initializare_grafica_pascal

Posted in Pascal, Programming, Teze | Tagged , , , , | Comments Off