CAPITOLUL 8
Limbaje de programare
Un limbaj de programare este un ansamblu de simboluri, cuvinte, instrucţiuni şi semnificaţii atribuite acestora, utilizat pentru descrierea algoritmilor. Limbajul de programare este astfel un mijloc prin care programatorul comunicã cu calculatorul.
Programul este o succesiune de intrucţiuni aparţinând unui limbaj de programare, prin care se descriu operaţiile la care sunt supuse datele şi ordinea de execuţie a acestora, pentru rezolvarea automatã a unei probleme date. Un program reprezintã o alta modalitate de descriere a unui algoritm de rezolvare a unei probleme date.
Pentru a înlãtura acest mare dezavantaj au apãrut limbajele simbolice şi apoi limbajele de programare evoluate care prin intermediul ansambloarelor şi compilatoarelor de care dispun, permit traducerea automatã a instrucţiunilor scrise într-un limbaj apropiat de limbajul curent de limbajul binar. Limbajele de programare reprezinta principalele mijloace de comunicare om-masina, evolutia lor fiind nemijlocit legatã de cea a calculatoarelor electronice, a caror era a inceput prin anii 1944.
Dintre limbajele de programare evoluate utilizate pe toata gama sistemelor de calcul menţionãm:
-
Basic
-
Algol
-
Fortram
-
Cobol
-
Pascal
-
C
-
PL/1
În ultimul timp s-au impus tot mai multe limbaje de inteligenţã artificialã şi sisteme expert cum sunt:
precum şi programarea pe obiecte ( Basic, C, etc. ).
Orice limbaj de programare presupune definirea urmatoarelor elemente componente:
-
alfabetul
-
vocabularul
-
gramatica
-
punctuatia
-
semantica
Rezultatul activitãţii de programare îl constituie programul scris ca text într-un limbaj de programare. Un astfel de program se numeşte program sursa. El este scris printr-un editor de texte acceptat de limbajul de programare respectiv.
Fiind scris ca format text, programul sursã nu este înţeles de cãtre şistemul electronic de calcul. Pentru aceasta este necesara traducerea lui intr-un cod intern, accesibil calculatorului. Aceastã operaţie se realizeazã cu un program translator numit compilator. Compilatorul este componenta software care realizeazã traducerea programului sursa în cod intern, rezultand aşa numitul program cod obiect. Lucrul cu un anumit limbaj de programare presupune existenta compilatorului pentru acel limbaj. Ansamblul format din limbajul de programare şi programul translator asociat, formeaza sistemul de programare.
Limbajul de programare pascal face parte din categoria limbajelor de programare evoluate de nivel inalt. Un program structurat este constituit din unitati functionale bine definite, ierarhizate conform naturii specifice a problemei de rezolvat. În interiorul unei astfel de unitati functionale, structurarea se manifesta atât la nivelul operaţiilor de executat cât şi la cel al datelor de prelucrat.
Programarea structurata este o metoda independenta de limbajul de programare utilizat. Limbajul Pascal include conceptele programarii structurate în ambele sensuri ale efortului de abstractizare presupus de realizarea unui program: ogranizarea datelor şi conceperea succesiunii de operaţii.Limbajul Pascal a fost implementat pânã în prezent pe o mare varietate de calculatoare, având un inalt grad de portabilitate comparativ cu implementarea altor limbaje de programare.
Un program reprezintã o mulţime ordonatã de instrucţiuni, asociatã unui algoritm de rezolvare a unei probleme care comandã operaţiile de prelucrare a datelor.
Instrucţiunea reprezintã exprimarea intr-o forma riguroasa a unei operatii şi precizeaza functia şi adresele operanzilor.Relaţia dintre cele 3 elemente: algoritm, limbaj şi program poate fi exprimatã astfel:
Blocul executabil constituie lanţul de instructiuni prin care este codificat programul în limbajul pascal, deci prin care se descrie algoritmul de prelucrare. Acestea sunt cuprinse între Begin şi End.
Este interzis sa dam nume diverselor obiecte care sa coincida cu acele cuvinte rezervate. În partea declarativa orice declaratie careia nu i se asociaza obiectele legate de programul în cauza se poate omite.
Toate obiectele manipulate în pascal poarta un nume. Acest nume se numeste identificator. Identificatorii sunt denumiri prin care se desemneaza datele, procedurile, functiile, programele.
Un tip de date reprezintã setul de valori pe care le poate lua elementul respectiv, împreunã cu mulţimea operaţiilor care se aplica asupra acestora. Orice variabila utilizata în program trebuie sa apartina unui tip. Tipul de date poate fi: predefinit şi construit pe baza celor predefinite.
Din punct de vedere al posibilitatii de modificare a valorii în faza de executie a programului, datele se pot clasifica în:
-
date variabile
-
date constante
Tipurile intregi de date sunt:
-
Byte
-
Word
-
Shortint
-
Integer
-
Longint
Tipul real reprezintã un numãr real cuprins între douã limite care diferã de la un compilator la altul şi de la un tip la altul.
Astfel tipurile reale pot fi:
-
real
-
single
-
double
-
extended
-
comp
Funcţiile SUCC şi PRED nu functioneazã, tipul REAL nefiind ordinal.
Tipul Caracter ( CHAR )
O variabilã de tip caracter poate avea drept valoare un caracter. O constanta de tip caracter poate fi:
`a` `:` literele mari au alte valori decat cele mici
x:char se reprezinta în memorie pe un octet, adica 255 coduri.
x:=`a` sau x:=a
Existã funcţii care permit trecerea de la caracter la codul ASCII şi invers.
CHR ( cod ) este o funcţie care intoarce ca rezultat caracterul respectiv.
x:=chr(64)
ORD ( caracter ) este o funcţie care intoarce codul ASCII al caracterului respectiv.
Tipul Boolean este un tip ordinal, enumerativ, care ocupã un octet memorie şi poate lua 2 valori logice: adevarat şi fals.
Declaraţia de tip se face :
Type boolean = ( True, False )
Tipul Declarat ( Enumerativ ) este definit de utilizator ca o lista ordonatã, prin enumerarea valorilor posibile astfel:
TYPE identif tip = ( lista elemente )
TYPE zi-sapt= ( luni, marti, ... , duminica )
Tipul Subdomeniu se mai numeste tip interval şi se defineste ca submultime a unui tip ordinal prin precizarea intervalului inchis de valori. Toate caracteristicile tipului parinte ( Integer , Char ) se regasesc în tipul subdomeniului, singura deosebire dintre ele constand în multimea valorilor pe care le poate lua.
Declararea constantelor:
CONST ident = valoare;
Pot fi numai de tip standard ( scalar ) şi se declarã în sectiunea CONST
Valoarea constantei nu poate fi modificatã în timpul rulãrii programelor.
Orice încercare de a atribui constantelor o valoare, chiar dacã este egalã cu cea iniţialã, va genera un mesaj de eroare.
Se asigurã astfel protecţia valorilor.
Declaraţia de tip
TYPE Identif_tip=definiţie tip;
Declaraţia de variabile
Var identif var: spaţiu tip var
Dacã sunt mai multe variabile de acelasi tip, se inşirã separate cu `,`
Declaraţia de funcţii şi proceduri
function nume_funcţie (declaraţie de var): tip rez;
function fact (n: integer):integer;
Mai multe variabile se separã prin `;`
Instrucţiuni pascal: Limbajul pascal este puternic orientat spre programarea structuratã, fiind conceput astfel încât sa implementeze corect conceptele proiectãrii şi realizãrii structurate şi modularizate a programelor. Progamul scris într-un limbaj de programare evoluat deci în pascal, se numeste progream sursã.
Instrucţiuni simple:
-
de atribuire
-
apeluri de procedura
-
instrucţiunea de salt necondiţionat(goto)
-
instrucţiunea vidã
Instrucţiuni simple
Prin instructiuni simple se realizeazã o mare parte din operatiile de bazã a algoritmilor de prelucrare. Instructiunea vidã descrie acţiunea vidã, ea este definitã prin lipsa în contextul unor construcţii pascal, fãrã a avea o mnemonica explicitã.
Se prezintã ca o linie goala urmatã de `;`
i:=1 ; 2 instrucţiuni vide
If x>0 then
x:=x+1
else;
Instrucţiunea de atribuire evalueazã o expresie şi atribuie rezultatul obtinut unei variabile sau functii.
Are formatul general:
Identificator:=valoare;
Prioritatea operanzilor în Pascal:
NOT
|
* / DIV MOD AND
|
+ - OR ( *, +, -, pe multimi )
|
= , > , < ,<= , >= , <> , şi operatori relationali pe multimi
|
Expresii logice sunt cele care în urma evaluarii produc un rezultat logic de TRUE sau FALSE ( Boolean ). Ele se prezintã fie sub forma unor condiţii simple, fie sub forma unor conditii compuse, formate din mai multe conditii simple legate prin operatorii logici: AND, OR, NOT.
Dacã nu suntem siguri de prioritatea anumitor operatori este necesara utilizarea parantezelor.
Apelul de procedurã:
Orice rutinã scrisã de noi, pentru a efectua anumite operaţii, se numeşte procedurã.
Procedurile întâlnite în program ca simple instrucţiuni genereazã o serie de operaţii:
-
compilatorul cautã numele de procedurã în biblioteca sa; dacã nu este gãsit acolo procedura e cautatã în lista de declaraţii de proceduri a programului; dacã nu este nici acolo se afiseazã un mesaj de eroare.
-
dacã este gãsitã procedura e apelatâ.
Instructiunea de salt neconditionat GOTO
Format : GOTO eticheta;
La intalnirea ei se executa un salt la linia care este precedata de eticheta urmata de `:`
IF delta >= 0 THEN
GOTO 30
ELSE
WRITE (` ecuatia nu are solutii`);
30: x1:=(-b+sqrt(delta))/(2*a);
x2:=(-b-sqrt(delta))/(2*a);
write ( x1, x2 );
end.
Instructiuni structurate
Instructiunea compusa este o secventa de instructiuni delimitata de cuvintele rezervate BEGIN, END.
Format :
BEGIN lista-instr END;
Efectul executiei instructiunii IF:
Se evalueaza conditia specificata.
Instructiuni pentru realizarea structurilor repetitive
Instructiunea WHILE realizeaza structura repetitiva conditionata anterior.
Format:
WHILE conditie DO instructiune; este echivalenta cu o constructie formata din urmatoarele instructiuni:
IF conditie THEN
BEGIN
instructiune
GOTO 1
end.
Instructiunea WHILE se mai numeste instructiune cu test initial.
Instructiunea Repeat
Realizeaza „structura repetitiva conditionata posterior”.
Format:
REPEAT instructiune UNTIL conditie ;
REPEAT
instructiune
UNTIL
conditie;
Ca şi ELSE, inainte de UNTIL mi se pune `;`.
Instructiunea FOR ( ciclu cu contor )
Realizeaza structura repetitiva cu numarator ( contor de numarare ).
Format:
1) FOR contor:=val initiala TO val finala
DO instructiunea;
2) FOR contor:=val initiala DOWNTO val finala
DO instructiunea
Instructiuni de citire şi scriere a datelor
În pascal, citirea şi scrierea nu se realizeaza prin instructiuni, ci prin proceduri specializate în acest sens, proceduri standard ale limbajului.
Aceste fişiere în Turbo Pascal sunt asociate tastaturii şi respectiv ecranului.
Fisierele INPUT şi OUTPUT conţin excusiv şiruri de caractere organizate pe linii. Liniile sunt încheiate de caracterul special standard EOL introdus automat la apasarea tastei ENTER.
Citirea datelor din fişierul INPUT
Existã doua proceduri standard predefinite în Pascal:
-Read
-Readln
Procedura READ
Format:
READ ( variabila{,variabila});
-
variabilele pot fi doar de tip CHAR, INTEGER, REAL sau STRING.
Procedura READLN
Format:
READLN ( variabila{,variabila});
Scrierea datelor:
-Write
-Writeln
Instrucţiuni de selectie multiplã ( CASE )
Format:
CASE expresie OF
lista etichete CASE:instructiune;
END;
Structura de tablou (Vector, Matrice): structura de tablou în Pascal este mai flexibilã decât în alte limbaje de programare, fiind rezultatul compunerii a douã tipuri:
-
tipul de baza al tabloului
-
tipul de indexare al tabloului
Setul de caractere : Acestea sunt entităţi formate din caractere :
-
Literele mari şi mici ale alfabetului limbii române: A-Z, a-z;
-
Cifrele sistemului de numerotaţie zecimal: 0-9;
-
Caractere speciale: =-/^(){}[].,;:_!@#$%&etc;
-
Caractere speciale perechi: <=,>=,=,<>;
-
Separatorii : spaţiu, tab, Enter.
Identificatorii : Pot fi o variabilă, o contantă, un tip definit de utilizator, o enumerare, o procedură, o funcţie, un obiect, o metodă, o proprietate, un control, o formă, un modul sau chiar proiectul însuşi. Un proiect Basic poate să conţină maxim 32000 identificatori.
Comentariile sunt şiruri de caractere care au în faţă caracterul apostrof (‘) şi servesc pentru a face mai lizibil textul programului , pntru a documenta programul.
Fiecare tip de dată permite o serie de operaţii. Astfel pentru valorile unui tip întreg se pot face următoarele operaţii : +, -, *, împărţirea întreagă, împărtirea reală, restul împărţirii întregi, ridicarea la putere.
Constantele : reprezintă o valoare fixă care nu se schimbă în timpul execuţiei programului sau de la o execuţie la alta. Pot fi de 2 tipuri : intrinseci şi simbolice.
Variabilele : reprezintă o locaţie de memorie internă care serveşte pentru stocarea temporară a datelor şi care se identifică printr-un nume. Tipul variabilelor din Basic sunt : variant, byte, boolean, integer, long, single, double, currency, date şi object.
Variabilele din Basic sunt caracterizate prin :
-
nume
-
tip de data
-
domeniu.
Utilizatorul poate defini în cadrul modulului său şi tipuri de date proprii, deci tipuri de date predefinite. Pentru aceasta, declaraţia de tip se face de către programatori în prima parte a modului de cod cu ajutorul instrucţiunii :
-
TYPE – definire variabilă
-
END TYPE
Operatorii : Reprezintă comenzi speciale pentru operaţiile ce pot fi executate cu datele din program. Basic pune la dispoziţie 4 tipuri de operatori : aritmetici, logici, de comparare şi de concatenare.
O funcţie este o procedură care efectuează o anumită sarcină într-un program.
-
Dialogul standard cu utilizatorul
Funcţia INPUT- apelul funcţiei INPUT permite preluarea de date de la tastatură.
-
Funcţii matematice şi statistice : ABS, EXP, INT, LOG, RND, SQR, ATN, SIN, COS, TAN ;
-
Funcţii pentru şiruri de caractere : LCASE$, UCASE$, LTRIM$, RTRIM, CHR, ASC, LEN, VAL, LEFT$, RIGHT$, MID$, INSTR,
-
Funcţii pentru conversia întregilor : INT, CINT ;
-
Funcţii pentru conversia tipului de dată : CDBL, CLNG.
-
Funcţii pentru lucrul cu date calendaristice : TIME$, DATE$ ;
O procedură este o secvenţă de instrucţiuni executate ca un tot unitar sau partajabile. Există trei tipuri de proceduri : SUB, FUNCTION, Tip de proprietate. Sintaxa generală a unei proceduri este : Private/Public/Static/Sub
…………………………….
End Sub.
Instrucţiuni de atribuire – atribuirea se poate efectua prin instrucţiunile :
Let - pentru valori atribuite variabilelor şi proprietăţilor ;
Set – pentru atribuirea de obiecte la o variabilă de tip obiect ;
Lset şi Rset – pentru atribuiri speciale de şiruri sau tipuri definite de utilizator
Terminarea execuţiei unui program sau oprirea temporară a acestuia sepot realiza prin instrucţiunile : DoEvents, End, Exit, Stop.
Se ştie că în cadrul algoritmilor de rezolvare a problemelor se întâlnesc, în afara unor secvenţe de operaţii care se execută liniar, în mod necondiţionat, o serie de operaţii care necesită testarea unor condiţii, funcţie de care se o succesiune de operaţii sau alta, sau o serie de operaţii care se execută în mod repetat. Avem de a face cu cele trei tipuri de structuri fundamentale :
-
secvenţială /liniară ;
-
alternativă/de decizie ;
-
repetitivă.
Limbajul de programare Basic implementează aceste structuri de control ale programului prin comenzi corespunzătoare, deci :
-
comenzi pentru structuri alternative ;
-
comenzi pentru structuri repetitive.
Comenzile pentru structurile alternative : If…. Then, If…Then…Else, Select Case.
Comenzile pentru structurile repetitive : While…Wend, Do….Loop, For….Next, For Each… Next.
Fişierele conţin colecţii de date omogene ca natură şi criterii de prelucrare, memorate pe discul magnetic .
CAPITOLUL 9
Algoritmi speciali
1. Sortarea unui vector
Prin sortare se înţelege aranjarea elemntelor unei mulţimi , în ordine crescătoare/descrescătoare a valorilor acestora. Există mai multe variante de sortare : sortarea prin interschimbare, prin selecţie, prin inserţie,
2. Interclasarea a doi vectori de dimensiuni variabile.
Prin interclasare se înţelege procesul de obţinere din două sau mai multe mulţimi ordonate, o nouă mulţime, ordonată după acelaşi criteriu. Există mai multe variante de interclasare :
-
Varianta 1 :
Presupune compararea a două elemente , câte unul din fiecare vector iniţial, cu scrierea celui mai mic dintre ele în vectorul rezultant şi trecerea la următorul element al vectorului iniţial din care s-a preluat.
-
Varianta 2 :
Presupune obţinerea vectorului rezultant într-un proces unic de comparare. Pentru a continua procesul în cazul în care se epuizează unul din vectorii iniţiali, ultimul element al acestuia va primi o valoare mai mare decât oricare din valorile regăsite, de regulă, în vectorii iniţiali.Această valoare poartă denumirea HIGH-VALUE (HV) . Procesul se încheie când ambii vectori iniţiali au fost parcurşi integral, deci elementele finale au valoarea HV.
CAPITOLUL 10
Tehnici de programare
1. Programarea modulară. Tabele de decizie
Programarea modulară are ca obiectiv reducerea empirismului artizanal folosit în elaborarea programelor şi instaurarea principiilor ingineriei programării, vizând obţinerea unor programe corecte şi fiabile, reducerea costului elaborării, documentării, testării, întreţinerii şi dezvoltării produselor software.
Modularizarea programelor.
Algoritmii de rezolvare a problemelor complexe se întocmesc şi/sau pot fi descompuşi în manieră sistematică, după criteriul funcţional, în mod ierarhic, până la nivel de subalgoritm/funcţie elementară, ca element terminal în structura unităţii funcţionale(UF).
Un modul funcţional se caracterizează prin :
-
Nume extern şi/sau intern;
-
Funcţie logică perfect definită;
-
Punct de intrare şi punct de ieşire unice;
-
Relaţia cu modulele din aval şi amonte-interfată;
-
Posibilitatea elaborării şi testării independente (în cadrul contextului său);
Tipuri de module funcţionale :
-
Module directoare sau de comandă sau monitoare;
-
Module de prelucrare sau module-funcţie;
-
Module mixte;
-
Module comune;
-
Module speciale;
-
Module nefuncţionale;
-
Module monitor.
2 Monitorizarea modulelor.
Tipul de monitorizare poate varia în limite relativ largi, în funcţie de filozofia de realizare a sistemului, de facilităţile de utilizare puse la dispoziţia beneficiarului său şi de deciziile de proiectare adoptate, astfel :
-
Monitoare pure
-
Monitoare complexe
-
Monitoare foarte complexe.
3. Interconectarea modulelor.
În mod ideal , modulele trebuie să fie cât mai independente pentru a reduce gradul de cuplare a acestora. Gradul de interconectare poate fi :
Coeziunea modulelor.
Se disting mai multe nivele de coeziune :
-
Întâmplătoare
-
Logică
-
Temporală
-
Procedurală
-
Comunicaţională
-
Secvenţială
-
Functională.
.4. Tehnici de modularizare
Construirea unor programe modularizate implică utilizarea unor tehnici şi procedee foarte diversificate :
-
Utilizarea tabelelor de decizie şi a diagramelor de optimizare
-
Utilizarea parametrilor simbolici
-
Asigurarea şi definirea centralizată şi standardizată a parametrilor statici, a datelor comune, a tabelelor de decizie, a listelor.
-
Separarea funcţiilor de intrare/ieşire
-
Evitarea reutilizării zonelor de memorare temporară intermodule
-
Nealterarea valorii constantelor.
5. Tabele de decizie (TD)
Tabele de decizie reprezintă un procedeu de reprezentare a algoritmilor cu număr mare de decizii bazate pe condiţii complexe sau dinamice, fiind astfel un mijloc eficient de modularizare. TD conţin două tipuri d intrări :
-
Condiţii elementare simple sau compuse aplicate unor variabile cu valori alternatil-exclusive de tip alfanumeric sau logic;
Condiţii compuse aplicate asupra condiţiilor elementare prin conjuncţie.
CAPITOLUL 11
Tehnici de programare structuratã
Cele mai utilizate tehnici de programare structurată sunt :
-
Recursivitatea ;
-
Metoda Backtracking;
-
Metoda Divide et impera;
-
Metoda Greedy;
-
Metoda Branch and Bound;
-
Metode euristice;
-
Metoda programării liniare;
-
Metoda programării dinamice.
1. Recursivitatea
Este o tehnică de programare utilizată frecvent , în implementarea funcţiilor şi procedurilor . La baza recursivităţii stă stiva, care este gestionată în mod implicit, în această zonă de memorie salvându-se automat, la fiecare la fiecare apel de funcţieurmătoarele informaţii :
-
Valorile parametrilor de tip valoare;
-
Adresele parametrilor de tip variabilă;
-
Variabilele locale ale subprogramului;
-
Adresa de întoarcere la instrucţiunea aflată după instrucţiunea de apel.
2. Tehnica “Backtracking”
Această tehnică se foloseşte în rezolvarea unor probleme cum ar fi :
-
Generarea permutărilor de n elemente;
-
Generarea aranjamentelor;
-
Generarea combinărilor;
-
Generarea partiţiilor unei mulţimi;
-
Problema celor N dame;
-
Produsul cartezian a N mulţimi;
-
Problema Comis-voiajorului;
-
Problema plăţii unei sume S utilizând N tipuri de monede;
3. Metoda “ Divide et Impera”
Exemple de probleme rezolvate cu această metodă : căutare binără.
4. Metoda Greedy
Caracteristicile acestei metode sunt :
-
La intrare avem o mulţime A cu N elemente
-
Se cere selectarea unei submulţimi B a lui A sau o ordine de prelucrare a elementelor lui A care să optimizeze o funcţie obiectiv dată . Se cere deci o singură soluţie.
Elementele mulţimii A se parcurg pe rând, după o eventuală rearanjare a lor, în vederea testării lor pentru adăugarea acestora la B.
Dostları ilə paylaş: |