Professional Documents
Culture Documents
PROGRAMAREA CALCULATOARELOR
I LIMBAJE DE PROGRAMARE
Dumitru Dragomir
PROGRAMAREA CALCULATOARELOR
I LIMBAJE DE PROGRAMARE
Refereni tiinifici
Prof. Dr. Ing. Viorel Mnzu
Prof. Dr. Ing. Leonard Domnioru
www.editura.ugal.ro
editura@ugal.ro
CUPRINS
Introducere ...........................................................................................................................1
Cap.1. Elemente de baz n informatic ............................................................................3
.1.1. Definiii de baz ......................................................................................................3
.1.2. Sisteme de numeraie...............................................................................................3
.1.3. Reprezentarea informaiei n calculator...................................................................5
.1.4. Codificarea informaiei n calculator.......................................................................5
.1.5. Reprezentarea datelor ..............................................................................................6
.1.6. Structura fizic (hardware) a unui calculator ..........................................................9
.1.7. Structura operaional a unui sistem de calcul ......................................................13
.1.8. Organizarea funcional a unui sistem de calcul ...................................................15
.1.9. Dispozitive periferice ............................................................................................17
1.9.1. Dispozitive de intrare........................................................................................17
1.9.2. Dispozitive de ieire..........................................................................................19
1.9.3. Memoriile externe.............................................................................................23
.1.10. Organizarea datelor n memoria extern. Fiiere ................................................25
1.10.1. Structurarea fiierelor .....................................................................................25
1.10.2. Operaii cu fiiere............................................................................................26
1.10.3. Tipuri de fiiere...............................................................................................28
.1.11. Noiuni privind structura software a calculatorului.............................................29
1.11.1. Ierarhia programelor .......................................................................................29
.1.12. Elemente de ingineria programrii ......................................................................30
1.12.1. Generaliti......................................................................................................30
1.12.2. Modularizarea .................................................................................................30
1.12.3. Teorema fundamental a ingineriei programrii ............................................31
1.12.4. Date, tipuri i structuri de date........................................................................32
1.12.5. Structuri de programe. Programare structurat...............................................33
1.12.6. Metode de programare ....................................................................................37
.1.13. Programe i limbaje de programare.....................................................................37
1.13.1. Portabilitatea programelor ..............................................................................38
1.13.2. Fazele de elaborare a unui program executabil. .............................................39
Cap.2. Limbajul C..............................................................................................................43
2.1. Caractere.................................................................................................................43
2.2. Atomi lexicali .........................................................................................................43
2.2.1. Identificatori......................................................................................................43
2.2.2. Numere..............................................................................................................43
2.2.3. Constante ..........................................................................................................44
2.2.4. Delimitatori de comentariu ...............................................................................44
2.2.5. Cuvinte cheie ....................................................................................................44
2.2.6. Operatori ...........................................................................................................44
2.2.6.1. Operatori unari ..........................................................................................44
2.2.6.2. Operatori binari .........................................................................................45
2.2.6.3. Operatorul ternar condiional ....................................................................48
2.2.6.4. Operatorul de atribuire simpl i compus ...............................................49
2.2.7. Precedena operatorilor .....................................................................................50
II
Cuprins
III
IV
Cuprins
7.4.1. Generaliti......................................................................................................147
7.4.2. Controlul prin program al obiectelor aplicaiei suport....................................148
7.4.3. Personalizarea aplicaiei .................................................................................149
Cap.8. Limbajul FORTRAN. Versiunea FTN95...........................................................151
8.1. Prezentare general...............................................................................................151
8.2. Convenii sintactice generale................................................................................151
8.3. Tipuri de date, declarare, iniializare ....................................................................152
8.4. Parametrizarea ......................................................................................................153
8.5. Atribuirea implicit a tipului ................................................................................154
8.6. Tipuri de date definite de utilizator (date structurate) ..........................................154
8.7. Operatori i expresii .............................................................................................155
8.7.1. Operatori unari................................................................................................155
8.7.2. Operatori binari...............................................................................................155
8.7.3. Precedena operatorilor ...................................................................................155
8.7.4. Operatori n expresii numerice .......................................................................155
8.7.5. Conversia de tip ..............................................................................................156
8.7.6. Operatori la nivel de caracter..........................................................................156
8.7.7. Operatori relaionali........................................................................................156
8.7.8. Operatori logici ...............................................................................................156
8.8. Tablouri ................................................................................................................157
8.8.1. Tablouri de mrime fix .................................................................................157
8.8.2. Tablouri de mrime variabil..........................................................................158
8.9. Structuri de control ...............................................................................................158
8.9.1. Instruciunea de salt necondiionat, GO TO ...................................................158
8.9.2. Instruciunea alternativ, IF ............................................................................158
8.9.3. Blocul de alternative IF...................................................................................159
8.9.4. Blocul alternativ multipl SELECT CASE...................................................159
8.9.5. Ciclul repetitiv contorizat DO.........................................................................160
8.9.6. Ciclul DO indefinit .........................................................................................160
8.9.7. Ciclul DO WHILE ..........................................................................................161
8.9.8. Ciclul DO implicit ..........................................................................................161
8.9.9. Etichetarea (numirea) structurilor de control..................................................161
8.10. Uniti de program i proceduri..........................................................................162
8.10.1. Generaliti....................................................................................................162
8.10.2. Programe principale......................................................................................162
8.10.3. Subrutine.......................................................................................................162
8.10.4. Instruciunea STOP.......................................................................................163
8.10.5. Funcii ...........................................................................................................163
8.10.6. Argumente reale i formale. Argumente opionale.......................................163
8.10.7. Conservarea valorilor. Atributul SAVE........................................................165
8.10.8. Module de program.......................................................................................165
8.10.9. Vizibilitatea datelor din module. Atributele PUBLIC i PRIVATE ............166
8.10.10. Fiiere externe. Directiva INCLUDE .........................................................166
8.11. Operaii de intrare/ieire .....................................................................................167
8.11.1. Instruciunea FORMAT................................................................................167
8.11.2. Instruciuni pentru transferul datelor ............................................................169
8.11.2.1. Instruciunea READ ..............................................................................169
VI
Cuprins
VII
10.1.4. Aplicaie........................................................................................................208
10.2. Programe simple n C .........................................................................................209
10.3. Folosirea structurilor ca tipuri de date complexe ...............................................211
10.4. Aplicaii simple n C++ ......................................................................................212
10.5. Aplicaii de utilizare a tablourilor.......................................................................213
10.6. Aplicaii la transmiterea tablourilor ca pointeri..................................................214
10.7. Alocarea dinamic a memoriei ...........................................................................215
10.8. Funcii de acces la ecranul text...........................................................................218
10.9. Accesul la ecranul grafic ....................................................................................220
10.10. Aplicaie grafic pentru construcia diagramelor .............................................223
10.11. Aplicaie grafic la utilizarea claselor ..............................................................227
Cap.11. Aplicaii n mediul de programare Visual Basic sub EXCEL........................232
11.1. Generaliti privind lucrul n EXCEL ................................................................232
11.1.1. Structura documentelor EXCEL...................................................................232
11.1.2. Coninutul celulelor ......................................................................................232
11.1.3. Utilizarea formulelor i funciilor .................................................................233
11.1.3.1. Formule .................................................................................................233
11.1.3.2. Exemplu de utilizare a formulelor. Calculul perimetrului i suprafeei
cercului.................................................................................................................234
11.1.3.3. Funcii EXCEL predefinite ...................................................................234
11.1.4. Formatarea celulelor .....................................................................................234
11.1.5. Macro comenzi i macro funcii ...................................................................235
11.1.5.1. nregistrarea macro-comenzilor ............................................................235
11.1.5.2. Execuia unei macro-comenzi ...............................................................235
11.1.5.3. Definirea unei macro-funcii .................................................................236
11.1.5.4. Asocierea unei macro-comenzi cu un element de interaciune.............236
11.2. Utilizarea programului EXCEL pentru crearea unui document de calcul simplu:
calculul variaiilor unor funcii i crearea unei diagrame centralizatoare .....................237
11.2.1. Intrarea n program .......................................................................................237
11.2.2. Operaii elementare frecvente.......................................................................237
11.2.2.1. Operaii de selectare..............................................................................237
11.2.2.2. Operaia de mutare a unei entiti (foaie, celul, rnd, coloan)...........238
11.2.2.3. Operaia de copiere a unei entiti.........................................................238
11.2.2.4. Operaia de inserare a unei entiti........................................................238
11.2.2.5. Operaia de tergere a unei entiti........................................................238
11.2.2.6. Intrarea n regimul de editare intracelular ...........................................238
11.2.3. Aranjarea convenabil a documentului.........................................................238
11.2.4. Crearea tabelului ...........................................................................................239
11.2.5. Crearea diagramei centralizatoare ................................................................239
11.2.6. Crearea de macrocomenzi prin nregistrare ..................................................241
11.2.6.1. Comutare de la foaie de lucru la foaie de diagram..............................241
11.2.6.2. Comutarea de la foaia de diagram la foaia de lucru ............................242
11.2.7. Crearea de obiecte de interaciune grafic....................................................242
11.2.7.1. Crearea unui buton de comutare din foaia de lucru n foaia cu
diagrama ....................................................................................................... 242
11.2.7.2. Crearea unui buton de comutare din foaia cu diagrama n foaia de
lucru .....................................................................................................................242
VIII
Cuprins
IX
Introducere
Lucrarea de fa i propune s acopere, nevoile programatorului de aplicaie inginereasc
care, spre deosebire de informaticianul de specialitate pur, are de fcut fa unor sarcini
practice izvorte, cel mai adesea, din specificul interdisciplinar al programelor folosite n
activitatea de proiectare.
ntr-o asemenea conjunctur profesional, programatorul de aplicaie este mai puin
solicitat de sarcini de profunzime informatic i mai mult de nevoia de a acoperi o arie
aplicativ cu extindere mare. ntr-adevr, fiind obligat s lucreze cu mai multe programe n
cadrul aceleiai teme de proiectare, una dintre sarcinile mari consumatoare de efort este aceea
de a realiza o serie de aciuni cum ar fi:
- Suplinirea lipsurilor unui produs soft prin crearea de programe de aplicaie n mediul de
dezvoltare integrat oferit de produsul soft respectiv;
- Atunci cnd produsul soft nu conine un mediu integrat de dezvoltare a aplicaiilor,
crearea unui instrument adiional folosind resurse externe produsului soft n cauz;
- Interfaarea diverselor produse soft folosite, prin instrumente de tip import/export de date
ntre aplicaii diferite folosind convertoare de date existente sau create prin aciuni de
programare, transfer de comenzi ntre aplicaii prin tehnici specifice aplicaiilor folosite.
Aciunile enumerate mai sus sunt numai cteva dintre posibilele opiuni de urmat i ele
evideniaz necesitatea cunoaterii mai multor limbaje i tehnici de programare n medii de
lucru diferite.
Din acest motiv autorul i-a propus s expun cteva dintre limbajele mai des folosite de
ctre programatorii de aplicaie inginereasc, optnd pentru limbajele C, C++, Visual Basic
for Applications (VBA) n Excel, Fortran i AutoLISP.
Raiunile acestei alegeri sunt urmtoarele:
- Larga rspndire a limbajului C la acest moment;
- Uurina n manipulare a limbajului Visual Basic n Excel i gradul mare de
compatibilitate a acestuia cu dialectele folosite n AutoCAD i MicroStation V8;
- Tezaurul acumulat de programatorii de Fortran n cei peste 50 de ani de la apariia acestui
limbaj, tezaur concretizat n imense biblioteci de programe, multe dintre ele uor accesibile;
- Flexibilitatea i puterea limbajului AutoLISP ca generator de funcii de comand n
AutoCAD menite s lrgeasc posibilitile acestuia, i posibilitatea interfarii lui uoare cu
dialectul VBA din AutoCAD.
Dumitru Dragomir
n practica informatic nu se mai folosete notaia (2) pentru baza binar, dar pentru baza
16 se folosete postfixarea cu litera H (de la hexazecimal).
Deci, se obinuiete s se scrie:
101101 = 2DH
etc.
= codurile 20H 2FH, 3AH 40H, 5BH 60H, 7BH 7FH semne speciale;
= codurile 30H 39H cifrele 0 9;
= codurile 41H 5AH literele mari ale alfabetului latin;
= codurile 61H 7AH literele mici ale alfabetului latin;
- Codul ASCII pentru setul de caractere extins, folosete toi cei 8 bii ai octetului
realiznd alte 128 de caractere, i anume:
= 48 de caractere strine, cum ar fi:
caracterele strine de limba englez, provenite din alfabetele europene;
simboluri monetare cent, lir, yen, pesetas, franc;
semne speciale de punctuaie;
= 48 de caractere pentru construirea de chenare (caractere semigrafice);
= 32 de caractere pentru grupul caracterelor tiinifice:
litere greceti;
simboluri matematice speciale: integrala, ridicarea la ptrat, rdcina ptrat.
= date numerice reale n dubl precizie (stocate ntr-o zon de memorie de lungime
dubl).
Reprezentarea datelor alfanumerice (caractere)
Pentru reprezentarea datelor alfanumerice se folosete codul ASCII.
De exemplu, caracterul A avnd codul hexazecimal 41H are codul binar 01000001 iar
caracterul a are codul hexazecimal 61H sau n binar 01100001. Toate aceste caractere
necesit un singur octet pentru a fi reprezentate.
Reprezentarea numerelor
n funcie de tipul lor, numerele pot fi reprezentate n cadrul urmtoarelor convenii:
A. Reprezentarea numerelor ntregi fr semn. Aici se pot deosebi urmtoarele cazuri:
= Reprezentarea pe un singur octet. n acest sistem pot fi reprezentate numere ntre
valorile binare 00000000 i 11111111 respectiv de la 00H pn la FFH, adic ntre 0 i
255;
= Reprezentarea pe doi octei, de la 0000H pn la FFFFH, adic de la 0 la 65535.
B. Reprezentarea numerelor ntregi cu semn. Aici se deosebesc dou cazuri:
a. Reprezentarea prin mrime i semn (reprezentare n cod direct). n aceast
convenie se folosete bitul de rang cel mai nalt ca indicator de semn, cu
semnificaiile:
0 nu exist semn, adic numrul este pozitiv, i
1 exist semn, adic numrul este negativ.
Folosind un singur octet (byte), bitul 7 este folosit ca indicator de semn iar biii
6,5,,1,0 sunt folosii pentru reprezentarea direct a valorii numrului.
De exemplu codul binar
11111111 reprezint numrul 127
iar codul binar
01111111 reprezint numrul +127
Dezavantajul acestui sistem este acela c nate o ambiguitate i anume numrul 0 are
dou reprezentri, adic 00000000 pentru + 0 i 10000000 pentru 0.
Din acest motiv, ct i din altele, apar dificulti la modelarea operaiilor matematice
cu ajutorul circuitelor electronice, fiind necesare dou proceduri aritmetice diferite:
una pentru adunare i alta pentru scdere, plus o procedur de identificare a semnului
pentru a se lua decizia privind procedura aritmetic de aplicat.
De aceea se prefer o adoua variant, i anume:
b. Reprezentarea numerelor negative n cod complementar fa de 2.
Fie Nn un numr ntreg nenegativ reprezentat prin n cifre binare.
Complementul fa de 2 al lui Nn este N n :
N n = 2n N n
n
n
n
Semn numr
Semn exponent
Valoarea
exponentului
Valoarea mantisei
CPU
ROM
RAM
Magistral
Module de interfa
cu consola
Tastatur
Display
Module de interfa
cu discurile
Floppy HDD
Module de
interfa paralel
Extensie de
magistral
Module de
interfa serial
CD
Fig.1.6.1
Pe blocuri funcionale principale, calculatorul prezint urmtoarele componente principale:
- CPU (Central Processing Unit) unitatea central de prelucrare, este partea din
calculator care coordoneaz i controleaz toate funciile de transfer i prelucrare a semnalelor
electrice care reprezint comenzi i date. Ea identific instruciunile dintr-un program, execut
operaii aritmetice i activeaz circuitele electronice anex crora le transmite ordine de
activitate prin intermediul magistralei;
- Magistrala, reprezint un fascicol de n8 conductori electrici paraleli (n=1,2,4,8) pe care
circul semnalele electrice care reprezint comenzi i date;
10
11
urmat apoi microprocesorul Intel 8080 avnd un set de instruciuni extins. Curnd dup
aceea, firma ZILOG a realizat microprocesorul Z80 cu un set de instruciuni i mai mare,
circa dublu dect Intel 8080.
Toate aceste microprocesoare erau structurate pe 8 bii i puteau adresa o memorie de 64
KB, iar Z80 putea adresa succesiv mai multe blocuri de memorie de cte 64 KB denumite
pagini de memorie.
n anul 1981 apare microprocesorul 8088 pe 16 bii, eveniment care decalneaz evoluia
microprocesoarelor din familia 80x86, unde x=2, 3, 4, 5 (Pentium).
Au existat microprocesoarele simbolizate astfel:
80386SX fr coprocesor matematic ncorporat, i
80386DX cu coprocesor matematic ncorporat.
Coprocesorul matematic este un circuit separat sau ncorporat n microprocesor care
realizeaz n mod hard operaiile matematice, mult mai rapid dect n cazul realizrii lor n
mod soft (prin program).
Cnd microprocesorul nu coninea coprocesorul matematic, acesta se putea aduga pe
placa de baz a calculatorului ntr-un soclu special prevzut. n acest caz coprocesorul avea
simbolizarea 80x87, de exemplu 80287 adugabil la microprocesorul 80286, sau 80387
adugabil la microprocesorul 80386.
Cnd simbolizarea microprocesorului era postfixat cu o cifr, aceasta semnifica dublarea sau
triplarea frecvenei sale de lucru. De exemplu, 80486SX2 sau 80486DX2 lucrau la frecven
dubl fa de 80486SX sau 80486DX, iar 80486DX4 la frecven tripl fa de 80486DX.
Noua familie de microprocesoare poate accesa o memorie mult mai mare, de exemplu:
8086 pn la 1MB de RAM
80286 pn la 16MB de RAM
80386 i 80486 pn la 4GB de RAM.
Totui, calculatoarele construite cu microprocesoare de acest tip nu fac uz, deocamdat,
dect de o mic parte a posibilitilor lor de accesare de memorie RAM deoarece folosirea
integral a acestei capaciti ar conduce la arhitecturi cu complicaii att n privina gabaritului
ct i a timpului de utilizare a ntregii capaciti de memorie.
Structura (fr detaliere) a microprocesorului este cea din figura 1.6.2.
- UCC este Unitatea de Comand i Control. Ea are funciile:
= extrage din memoria intern a calculatorului o instruciune a programului;
= decodific instruciunea pentru a afla ce operaie trebuie executat i ce date vor fi folosite;
= extrage datele din memoria intern a calculatorului;
= activeaz circuitele corespunztoare din UAL pentru a executa operaia cu datele solicitate.
- UAL este Unitatea Aritmetico Logic. Ea are funciile evideniate n figura 1.6.2.
- Registrele proprii. Acestea sunt circuite de memorie coninute de microprocesor. n
aceste registre sunt pstrate temporar nformaiile care conin datele de prelucrat i
instruciunile de executat.
Exist urmtoarele tipuri de registre:
= registru de date: pstreaz datele de prelucrat i rezultatele prelucrrii;
= registru de instruciuni: pstreaz codul instruciunii n curs de execuie;
= registru contor de program: pstreaz adresa instruciunii care urmeaz s se execute;
= registru contor de date: pstreaz adresa la care se gsesc datele care urmeaz s fie prelucrate.
- UI este Unitatea de Interfa cu celelalte componente ale calculatorului. Ea asigur,
prin intermediul magistralei, legtura dintre microprocesor i celelalte componente ale
calculatorului: memoria intern i sistemul de intrare/ieire. Tot ea realizeaz i funcia de
transfer a datelor de la/ctre microprocesor.
12
Microprocesor
UAL
UCC
Adunare
Extragere de
instruciuni
Decodificarea
instruciunii
Scdere
nmulire
Extragere de date
mprire
Comparare
Memoria
intern
Registre
Fig.1.6.2.
Microprocesorul funcioneaz pe baza impulsurilor (tacturi) primite de la un oscilator
(sau ceas clock). Feacvena impulsurilor poate fi una din valorile standard: 6, 12, 16, 25, 33,
40, 55, 66 MHz (sau mai mari). Cu ct frecvena de tact este mai mare, cu att calculatorul
este mai rapid.
Memoria intern a calculatorului
Memoria intern a calculatorului are structura din figura 1.6.3.
Memoria de baz
640 KB
Memoria
expandat
Extensii de memorie
Fig.1.6.3.
Componentele ei sunt urmtoarele:
- Memoria de baz, de 640 KB, corespunde memoriei maxime de care dispuneau primele
calculatoare compatibile IBM-PC (ncepnd cu microprocesorul 8086) pentru care a fost
dezvoltat sistemul de operare DOS.
Aceasta este memoria de lucru care preia datele i instruciunile din programe pentru
execuie i n care se depun rezultatele;
- Memoria expandat, de 384 KB, care a fost adugat ulterior pentru a mri posibilitile
de lucru;
- Extensii de memorie, care reprezint memoria intern suplimentar celor 1084 KB (1
MB) aflat n configuraia de baz a calculatorului. Ea este folosit pentru stocarea datelor
programelor.
13
14
Memorie
extern
Unitate
central
Relaie tactil
Relaie vizual
Display
Tastatur
Controlere de
cursor grafic
Plotter
Mouse
Joy-stick
Track-ball
Printer
Interceptor
Light-pen
Digitizoare
Tablet grafic
Scanner
Operator
Video
camer
Fig.1.7.1.
15
Structura fizic a unui sistem de calcul este cea reprezentat n figura 1.7.1. Conform
acesteia schimbul de informaii dintre operator i unitatea central se desfoar pe dou
laturi: Relaia tactil i Relaia vizual. Fiecare dintre ele este deservit de o serie de
dispozitive periferice de intrare/ieire. Componentele evideniate sunt descrise mai jos.
Relaia tactil, este cea comandat de operator, prin care acesta introduce informaie n
calculator. Ea se realizeaz prin urmtoarele dispozitive de intrare:
- Tastatura este dispozitivul de intrare minimal, absolut necesar pentru introducerea
textelor comenzilor i a datelor numerice sau de tip ir de text;
- Controlerul de cursor grafic este o denumire generic pentru unul dintre urmtoarele
dispozitive de intrare:
= Mouse este un dispozitiv care controleaz micarea cursorului grafic pe ecran prin
controlul deplasrilor pe direciile x-y ale ecranului. Acest dispozitiv este complementar
tastaturii. Servete i la introducerea poziiilor n care se puncteaz pentru a declana
comenzi dependente de poziia de aplicare a punctrii (clic);
= Joy-stick este un dispozitiv care controleaz direcia i viteza de micare a cursorului
prin unghiul de nclinare al unei manete;
= Track-ball este de fapt un mouse rsturnat, operatorul acionnd direct asupra bilei.
- Interceptorul, concretizat prin creionul optic (light-pen) servete la interceptarea pe ecran
a unei zone de interes;
- Digitizorul, este folosit pentru a transforma o informaie grafic extern n informaie
digital stocabil n memoria calculatorului. Se folosesc n mod curent urmtoarele
dispozitive:
= Tableta grafic servete la transformarea micrii de urmrire manual a unui contur
existent pe hrtie sau de desenare a unui asemenea contur, ntr-o succesiune de puncte
reprezentate prin coordonate x,y exprimate numeric (evident n cod binar) constituind o
informaie de tip vectorial (succesiune de segmente orientate definite prin capetele lor);
= Scannerul i camera video citesc o imagine punct cu punct, primul de pe hrtie iar cea
de a doua n mod direct. Informaia generat este de tip raster (matrice constituit din linii
i coloane de puncte ale imaginii);
Relaia vizual, este cea prin care operatorul primete informaiile prelucrate de
calculator. Ea se realizeaz prin urmtoarele dispozitive de ieire:
- Display este dispozitivul de afiare minimal. Poate fi de diferite tipuri dintre care
menionm tubul catodic sau matircea de afiare cu cristale lichide;
- Plotter este un dispozitiv de desenare cu peni sau de tiere cu cuit (cutter).
Materializeaz desene de tip vectorial, adic compuse din succesiuni de vectori (segmente
orientate);
- Printer este un dispozitiv de imprimare sub form raster (matrice de puncte).
Uneori, prin abuz de limbaj, se folosete termenul de plotter pentru printere de dimensiuni
mari, dar aceast utilizare nu este corect i nu este recunoscut de dicionarele de termeni
informatici.
16
Ieire n format
main
Analiz
Afiare date
Regsire
asociativ
O
Utilizator
Baza de
date
Interaciune
la staia de
lucru
Memorare
asociativ
Introducere date
Post
procesare
Ieire n format
direct citibil
Staie de lucru
Memorare-prelucrare-regsire
Fig.1.8.1.
n cadrul sistemului, n raport cu baza de date care stocheaz datele de o anumit natur
asociate entitilor memorate n baza de date, se evideniaz:
- Funcia de memorare asociativ care introduce datele n baza de date dup ce
efectueaz prelucrrile necesare asocierii dintre datele care descriu entitile stocate n baz i
atributele care caracterizeaz aceste entiti.
Asocierea se face pe baza unei reguli de asociere stabilit n funcie de structura bazei de date,
i n concordan cu necesitile de definire a entitii de stocat n baz. De exemplu, o mingie
de tenis poate fi descris ca o sfer cu o anumit raz, dar aceast informaie nu este
suficient. Ea trebuie asociat cu poziia ei n raport cu un reper (de exemplu solul pe care
eventual se poate lua n considerare proiectarea unei umbre). Dac programul grafic are n
vedere i redarea aspectului fotografic al mingiei, informaia privitoare la geometria i poziia
acesteia trebuie nsoit i de informaia privind materialul din care ea este fcut. Alte
informaii, necesare aspectualizrii fotografice, pot defini o surs de lumin descris ca
punctual la distan finit (bec) sau la distan infinit (soare), cu o anumit intensitate
luminoas i avnd o anumit culoare. Aceste din urm informaii (intensitatea i culoarea)
sunt atributele (la rndul lor date) asociate datelor despre sursa de lumin.
Un alt exemplu este acela al asociaiei care este necesar a fi stabilit ntre denumirea unui
produs ca identificator i costul i cantitatea de produs existent n stoc, pentru ca gestiunea
corect a stocurilor de produse i a valorilor lor s poat fi efectuat
- Funcia de regsire asociativ este ntr-un fel inversul funciei de memorare
asociativ i este necesar pentru a direciona n mod selectiv datele ctre modulul de afiare,
dac sunt cerute acolo informaii despre anumite elemente din baza de date dorite, sau ctre
modulul de analiz care efectueaz calculele reclamate de anumite cerine ale aplicaiei.
Aceast funcie se desfoar pe baza regulilor de dependen din cadrul bazei de date.
- Funcia de analiz const din totalitatea procedeelor de prelucrarea a informaiei din
baza de date, dintre aceste procedee de prelucrare selectndu-se metoda adecvat tipului de
informaie de tratat. De exemplu, un set de date de forma dimensiune-poziie ar putea defini
latura unui ptrat i poziia n plan a centrului acestuia, dar ar putea defini i raza unui cerc i
17
poziia n spaiu a centrului lui. n funcie de atributul de tip asociat care indic dac este
vorba de ptrat sau de cerc, este selectat programul de desenare adecvat.
-Funcia de post-procesare realizeaz conversia datelor de la forma de reprezentare n baza
de date la o form adecvat unei alte utilizri dect cea curente. Ea se aplic cel mai adesea n
situaiile n care informaia stocat n baza de date este necesar altor programe aplicative dect
aceluia care le-a generat. Aa este cazul elaborrii informaiilor necesare pentru comanda
mainilor unelte cu comand program sau dispozitivelor de afiare grafic pe hrtie. Dup caz
ieirea datelor de post-procesare se poate face n format main sub forma unor fiiere cu un
anumit format de scriere, stocate pe suport magnetic (dischete sau band magnetic) sau pe suport
optic (CD-ROM), sau n format direct citibil, adic n form grafic sau text.
Fig.1.9.1.
1 tastatura alfanumeric. Ea conine:
- caracterele numerice: 0, 1, 2, , 9
- caracterele literale: a, , z i A, , Z
- semne de punctuaie i speciale: . , ! ? $ & % etc
- bara spaiu (space bar)
- taste de comand:
= tasta Enter care produce succesiunea de caractere CR (carriage return salt la
nceput de rnd) i LF (line feed nceperea unei linii noi)
= tasta Tab saltul cursorului cu un anumit numr de caractere pe orizontal ctre dreapta
= tasta Backspace pentru tergerea caracterului de la stnga cursorului
2 tastatura de editare. Aceasta conine:
- tastele direcionale simbolizate prin sgeile servind la deplasarea cursorului
n pagina de text cu cte o poziie n sensurile indicate
- tastele Page Up i Page Down pentru deplasarea cursorului cu o pagin de text ecran
n sus i n jos
18
19
Fig.1.9.2.
1
3
5
2
4
6
Faza II
Faza I
Fig.1.9.3.
20
Codificarea ntregii matrici de pixeli este stocat undeva n memoria gestionat direct de
sistemul de operare DOS i nu este de competena programatorului s aib acces la aceast
zon. ntreaga matrice de pixeli a caracterului este privit ca un bloc de date care are asociat
ca identificator codul ASCII al caracterului.
linia 1
caracte
linia 25
coloana 1
pixel
pixel
coloana
Fig.1.9.4.
B
L
BG
C
FG
Fig.1.9.5.
Cnd se emite ordinul de afiare a unui caracter, n asociere cu codul ASCII al caracterului
se mai trimite i un byte (octet) n care este coninut codul de afiare al caracterului, care
determin cum va avea loc afiarea.
Aceast codificare are structura din figura 1.9.5.
Cei 8 bii ai octetului sunt folosii astfel:
Bitul 7 (BL Blinking = clipire) are semnificaiile: 0 caracterul nu clipete i 1
caracterul clipete;
Biii 6, 5 i 4 determin combinaia de culori fundamentale ale fondului BG (BackGround):
R (Red = rou), G (Green = verde) i B (Blue = albastru), fiecare putnd avea valorile 0
component lips sau 1 component prezent;
Bitul 3, notat cu L de la Light (luminos) este rezervat tonalitii culorii caracterului
(simbolizarea FG este pentru ForeGround partea de deasupra fondului): 0 culoare normal
i 1 culoare strlucitoare;
Biii 2, 1 i 0 codific componentele de culoare RGB ale caracterului.
Obs: notaiile BG i FG nu sunt standard. Ele au fost folosite aici pentru economie de
scriere.
n consecin, caracterul poate avea 16 culori iar fondul poate avea numai cele 8 culori
nestrlucitoare, conform tabelului 1.9.1.
Aadar, memorarea caracterului n modul text se face pe 2 octei, ca n figura 1.9.6.
Din aceste considerente, memoria necesar pentru memorarea unui ecran de text se poate
calcula cu relaia:
21
Tabelul 1.9.1
Cod binar
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
Valoare
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
Octet 1 Cod ASCII
Culoare
Negru BLACK
Albastru BLUE
Verde GREEN
Turcoaz - CYAN
Rou RED
Liliachiu MAGENTA
Galben YELLOW
Alb WHITE
Gri Gray
Albastru strlucitor LIGHTBLUE
Verde strlucitor LIGHTGREEN
Turcoaz strlucitor LIGHTCYAN
Rou strlucitor LIGHTRED
Liliachiu strlucitor LIGHTMAGENTA
Galben strlucitor LIGHTYELLOW
Alb strlucitor
Octet 2 Cod de culoare
Fig.1.9.6.
22
23
- Imprimante termice.
Caracteristicile principale ale imprimantelor sunt:
- Rezoluia, adic numrul de puncte afiate pe un ol (se msoar n dpi). De exemplu:
180, 300, 360, 600, 1200 dpi;
- Viteza de imprimare se msoar n cps (caractere pe secund) la imprimantele lente i n
ppm (pagini pe minut) la imprimantele rapide;
- Dimensiunea maxim a hrtiei. Se deosebesc imprimante pentru formatele A3 (420297
mm), A4 (210297 mm), A5 (148210 mm), B5 (182257 mm);
- Memoria proprie. Pentru a elibera calculatorul de o serie de sarcini de coordonare a
funcionrii imprimantei ca i pentru a scuti operatorul de a atepta terminarea lucrului
imprimantei comandat direct de calculator, imprimantele actuale posed un bloc de comand
i o memorie proprie, ele fiind de fapt calculatoare specializate n imprimare. Ca urmare,
informaia este preluat n pachete mari de catre imprimant i apoi imprimarea decurge
independent de calculator. Cu ct memoria proprie este mai mare cu att pachetele de
informaie transmise sunt mai mari i intervenia calculatorului mai rar.
Plotterul
Plotterul este un dispozitiv de desenare (sau de tiere cutter-plotter) vectorial. El
deseneaz trasee bidimensionale n orice direcie a hrtiei. n general plotterele sunt construite
pentru formate de hrtie mai mari dect cele ale imprimantelor, sau chiar foarte mari.
Precizia de desenare este mare, n general de circa 300-800 dpi.
Plotterul este compus dintr-o mas de lucru i un bra sau sistem mecanic de translaie pe
dou direcii a capului de trasare (la unele sisteme o micare de translaie se realizeaz prin
rotirea hrtiei peste un tambur iar cealalt micare de translaie este realizat obinuit, prin
glisarea capului de desenare pe o glisier liniar).
Capul de desenare poate fi prevzut cu un schimbtor de tocuri cu penie, sau cu un
dispozitiv pentru pulverizarea unui jet de cerneal.
1.9.3. Memoriile externe
Discul magnetic
n funcie de suportul magnetic pe care sunt realizate discurile magnetice pot fi:
Disc
Capete
Fig.1.9.7.
de
Fig.1.9.8.
24
25
26
Suport de
memorie
director 1
director 2
director j
fiier 1
fiier 2
subdirector j1 subdirector j2
fiier j1
fiier j2
fiier j21
fiier j22
fiier m
fiier j21
fiier j2k
Fig.1.10.1.
Calculator
A:
B:
floppy discuri
C:
hard disc
D:
CD-ROM
Fig.1.10.2.
1.10.2. Operaii cu fiiere
Pentru manipularea fiierelor trebuie stabilit mai nti o convenie de definire a operaiilor
posibile cu fiierele. Se folosesc urmtoarele denumiri:
- Crearea unui fiier. Aceasta este o operaie efectuat de ctre un program creator de
fiiere, printr-o operaie de scriere a fiierului pe suportul de memorie.
Pentru a putea scrie fiierul, programul creator trebuie s cunoasc urmtoarele elemente:
= suportul de memorie (unitatea de disc) pe care se va face scrierea;
= directorul (subdirectorul) n care va fi inclus fiierul;
= numele fiierului.
Toate aceste elemente compun aa numita "cale" (path) ctre fiier. Sintaxa definirii unei
ci este urmtoarea:
dispozitiv:\director\subdirector\\subdirector\nume_fiier.tip
De exemplu:
D: \CosDocRom\UsrGuide\Pdf-doc\01intro.pdf
n figura 1.10.4 se observ corespondena dintre aceast notaie i modul de accesare al
fiierelor din directorul final corespunztor, cnd se folosete aplicaia Windows Explorer.
27
Fig.1.10.3.
- Consultarea (citire precedat de deschidere) unui fiier existent. Aceasta este o operaie
de extragere de informaie dintr-un fiier, fr modificarea lui.
n figura 1.10.5 se observ fereastra Open a unei aplicaii care este n curs de a deschide
fiierul de pe calea exemplificat mai sus.
- Actualizarea unui fiier. Orice fiier de date este compus din date structurate sub forma
unor nregistrri. nregistrrile pot fi privite ca stocuri de informaie elementare, componente
ale fiierului.
Se deosebesc trei cazuri de actualizare:
= adugarea unei (sau unor) nregistrri, cu consecina lungirii fiierului;
= tergerea unei (sau unor) nregistrri, cu consecina scurtrii fiierului;
= modificarea unei (sau unor) nregistrri. n acest caz consecina poate fi de lungire,
scurtare sau conservare a lungimii fiierului n funcie de modul cum sunt definite
nregistrrile. Dac acestea sunt de lungime fix, fiierul nu i modific lungimea. Dac
ns nregistrarea poate avea lungime variabil, fiierul se lungete sau se scurteaz
dup cum nregistrarea se modific prin lungire sau scurtare.
- Copierea unui fiier. Prin aceast operaie se obine o copie identic a fiierului.
Deoarece nici un sistem de operare nu tolereaz existena n acelai director a mai multor
fiiere cu acelai nume, copia poate avea:
= indiferent ce nume (acelai ca originalul sau diferit), dac fiierul este plasat ntr-un
alt director dect originalul;
= obligatoriu alt nume dect originalul, dac fiierul este plasat n acelai director cu
originalul.
n sistemul Windows 95 (sau superioare) este posibil copierea unui fiier n acelai
director fr specificarea unui nume diferit dar, n mod automat, sistemul de operare va
schimba numele din nume n Copy of nume, pentru a diferenia fiierul nou creat prin
copiere de cel original.
28
Fig.1.10.4.
Fig.1.10.5.
- tergerea unui fiier. Prin aceast operaie fiierul nu este propriu-zis ters de pe suport
deoarece operaia ar putea dura prea mult ci, ntr-un fiier special denumit "Tabel de alocare a
fiierelor" (FAT File Allocation Table) situat la nceputul suportului i invizibil pentru utilizator,
spaiul ocupat de fiier este marcat ca fiind liber. Aceasta permite ca urmtoarele operaii de
creare de fiiere noi sau de actualizare a fiierelor existente, s foloseasc acest spaiu. Din acest
motiv, anumite programe capabile s recupereze un fiier ters din greeal, pot aciona cu succes
numai dac ncercarea de recuperare se face nainte de a efectua prima operaie de scriere pe
suport (creare sau actualizare). Acest procedeu este valabil numai n sistemul de operare DOS i
numai dac ntre timp nu au fost folosite programe care necesit fiiere temporare (care se
reactualizeaz automat, fr intervenia explicit a operatorului). Cum sistemul Windows 95
folosete ntotdeauna un astfel de fiier (denumit swap file) de lungime variabil, pentru
recuperarea fiierelor terse din greeal, n acest sistem a fost prevzut un director special
denumit Recycle Bin (recuperare binar) n care, pentru un anumit timp, sunt pstrate fiierele
terse. Dac ele se terg i din acest director, recuperarea lor nu mai este posibil.
- Mutarea unui fiier. Prin aceast operaie un fiier poate fi mutat dintr-un director n
altul. i aceast operaie este simulat dac mutarea se face pe acelai suport. De fapt fiierul
rmne pe loc dar, n tabela de alocare de fiiere, el este marcat ca aparinnd altui director.
i aici acioneaz regula de a nu se admite mai multe fiiere cu acelai nume n acelai
director. De aceea, mutarea fiierului se poate face:
= pe acelai disc: fiierul va trebui ca anterior s fie redenumit dac n directorul
destinaie mai exist un fiier cu acelai nume. Altfel fiierul mutat l va substitui pe cel
preexistent. Mutarea este fictiv din punct de vedere fizic, operaia avnd loc numai n
FAT ca schimbare de atribut de apartenen;
= pe alt suport: este valabil precauia de mai sus privind denumirea. n plus, mutarea
este real, fiierul fiind scris la destinaie i ters (marcat ca spaiu liber) pe suportul
surs.
- Redenumirea unui fiier const din schimbarea numelui fiierului. Aceast operaie este
efectuat numai n tabela de alocare de fiiere.
1.10.3. Tipuri de fiiere
Se pot distinge urmtoarele tipuri principale de fiiere:
29
- Fiiere executabile care conin programe executabile (cu extensia EXE sau COM) sau
module executabile (de exemplu cele cu extensia DLL Dynamic Link Library);
- Fiiere de date, care conin date de diferite tipuri, eventual compuse din tipurile de mai
jos;
- Fiiere de text, care conin numai caractere ASCII tipribile, eventual i coduri de control
pentru formatarea textelor i aranjarea lor n pagin;
- Fiiere de imagine care conin descrierile necesare afirii sau imprimrii imaginilor.
Acestea pot fi:
= vectoriale, compuse din comenzi sau definiii necesare pentru trasarea de linii;
= raster (matriciale), compuse din descrierea succesiunii de pixeli de afiat.
30
31
automat a datelor;
- modularizarea structural n care se specific structura datelor;
- modularizarea procedural n care se specific ordinea de execuie a modulelor.
1.12.3. Teorema fundamental a ingineriei programrii
Fie P i Q dou probleme pentru care trebuiesc scrise dou programe distincte.
Fie M o msur pentru dimensiunea unei probleme i fie C costul scrierii unui program
pentru acea problem.
Dac M(P) > M(Q) este evident c C(P) > C(Q), adic scrierea unui program pentru o
problem mai mare este mai scump dect scrierea unui program pentru o problem mai mic.
Fie acum dou probleme separate P i Q pe care ne propunem s le tratm ca pe o
problem combinat P+Q pentru care ne propunem s scriem un singur program combinat.
Deoarece problemele sunt independente, programul trebuie s conin i efortul de corelare
ntre cele dou probleme pentru a se evita interferenele nedorite. Aadar:
M(P+Q) > M(P) + M(Q) i, n consecin, relaia deintre costuri va fi asemntoare:
C(P+Q) > C(P) + C(Q)
Fig.1.12.1.
A = curba erorilor comise la manipulare simultan
B = curba erorilor comise la manipulare separat
Acest rezultat poate fi privi i invers, adic este mai ieftin de creat dou programe mici
dect unul mare.
Acest lucru se explic prin faptul c, pe lng altele, efortul de corelare a problemelor
poate avea ca rezultat producerea de erori de programare, pentru a cror eliminare sunt
necesare cheltuieli suplimentare.
ntr-adevr, este demonstrat prin studii statistice c o persoan poate manipula n memoria
sa imediat un numr de circa 7 2 obiecte, entiti sau concepte. Peste acest numr de
elemente distincte utilizabile simultan, numrul de erori comise crete din ce n ce mai rapid
ca n diagrama din figura 1.12.1.
Aadar, este demonstrat c C(P+Q) > C(P) + C(Q)
De aici rezult imediat "Teorema fundamental a ingineriei programrii":
Fie P o problem care poate fi descompus n subproblemele tratabile separat P' i P". Atunci:
C(P) > C(P') + C(P")
adic, costul rezolvrii separate a componentelor unei probleme este mai sczut dect acela
al rezolvrii problemei n bloc.
32
Fig. 1.12.2.
1.12.4. Date, tipuri i structuri de date
Datele sunt informaiile prelucrate de programe. Se deosebesc date elementare i date
structurate.
Tipurile de date elementare sunt urmtoarele:
a. Tipul numeric.
Acest tip include de obicei numerele ntregi, reale i complexe. n cadrul tipurilor numerice
se deosebesc subtipuri n funcie de lungimea de memorie folosit pentru reprezentare i care,
pentru numerele reale determin precizia de reprezentare.
b. Tipul logic (sau Boolean).
Acest tip cuprinde datele care pot avea valorile adevrat sau fals i ntre care sunt posibile
operaiile logice AND, OR i NOT.
c. Tipul ir de caractere.
Acest tip de date conine succesiuni finite de caractere (n cod ASCII), cea mai scurt
succesiune fiind irul vid (de lungime zero). Datele de aceste tip pot suporta operaii de
concatenare (alipire), ordonare, comparare, etc.
Unele limbaje recunosc tipul particular ir de caractere de lungime unitar sau tipul
caracter, din care se formeaz irurile de caractere.
d. Tipul pointer.
Acesta este un tip de dat special care conine adresa ctre o locaie de memorie n care
33
este stocat o dat de unul dintre tipurile de mai sus. Pentru a ajuta la localizarea exact a
datei, tipul pointer din limbajul C conine nu numai adresa datei ci i informaia privind tipul
ei, adic lungimea de stocare.
Pointerii sunt folosite n operaiile de referire a unei date, operaie care nlocuiete
transferul datei prin lista de argumente a unei funcii sau proceduri.
Structuri de date.
Datele individuale nu sunt suficiente pentru nevoile de programare. Adesea nevoile
practice impun manipularea de mulimi de date de un anumit tip sau de tip compus. Se
ntlnesc urmtoarele structuri de date:
a. Tabloul. Acesta este o colecie de date de acelai tip aranjate ntr-o structur
rectangular k-dimensional.
Astfel, deosebim:
- Tabloul unidimensional sau vectorul, constnd dintr-un ir simplu de date de tip numeric
de o anumit lungime (numr de elemente);
- Tabloul bidimensional sau matricea, constnd dintr-o serie de un anumit numr de iruri
de aceeai lungime. Echivalentul grafic este matricea cu n linii i m coloane;
- Tabloul tridimensional, sau masivul;
- etc.
b. irul. Un caz particular este irul de caractere descris mai sus. irul poate fi compus i
din numere (vectorul) dar i din alte iruri.
c. Lista. O list este o niruire de date de orice tip.
1.12.5. Structuri de programe. Programare structurat
Un program descrie un proces de calcul prin instruciuni care descriu operaiile pe care un
calculator le poate efectua ntr-o anumit ordine, succesiv sau, altfel spus, secvenial.
Astfel, dac:
S1, S2, , Si-1, Si, Si+1, ,Sn
este un program secvenial compus din instruciunile Si, i=1, ,n, atunci:
1. S1 este prima instruciune care se execut
2. dup execuia instruciunii Si se transfer controlul la instruciunea Si+1
3. Sn este ultima instruciune de executat
n practic, notaia Si poate fi folosit att pentru a desemna instruciuni separate ct i
secvene ntregi de instruciuni.
S1
S2
Selector
Fig.1.12.3.
Nu
Sn
Secvene
Condiie
ndeplinit
S2
Da
S1
Fig.1.12.4.
34
rezultatul produs fiind y=1 pentru i=1, 2 sau 3, y=2 pentru i=4, i y=0 pentru oricare alt
valoare a lui i.
Structura bialternativ (sau blocul de decizie), figura 10 direcioneaz execuia pe una dintre
dou ci n funcie de rezultatul afirmativ sau negativ (adevrat sau fals) al unui test logic.
Echivalentul n pseudocod al schemei logice din figura 1.12.4 este urmtorul:
dac condiie este adevrat
atunci execut secvena S1;
altfel execut secvena S2;
Un exemplu n limbaj C++ de bloc de decizie este:
if (a<b)
minab=a;
else
minab=b;
ccea ce are ca rezultat stocarea n variabila minab a celei mai mici dintre valorile
variabilelor a sau b.
O variant a structurii din figura 1.12.4 este structura bialternativ cu o ramur vid,
figura 1.12.5. Pseudocodul corespunztor este:
dac condiie este adevrat
atunci execut S
Varianta n C++ a procedurii de mai sus , cu acelai efect, va fi:
minab=b
if (a<b) minab=a;
35
S
Da
S
C
Nu
Fig.1.12.6.
Da
C
Nu
Fig.1.12.7.
La sfritul acestei poriuni de program se obine valoarea factn=120, adic valoarea lui 5!.
Structura repetitiv condiionat posterior, figura 1.12.7. La aceast structur testul
condiiei de continuare a repetiiei se face dup executarea secvenei S.
n pseudocod aceast structur apare astfel:
execut S
ct timp condiia C este adevrat;
Un exemplu de astfel de structur, n limbajul C++, este urmtorul:
n=5;
i=1;
factn=1;
do
{factn=factn*i;
i++;
}while (i<=n);
36
A fost demonstrat faptul c orice program poate fi scris folosind numai trei tipuri de
structuri, denumite structuri fundamentale, i anume:
- structura secvenial;
- structura alternativ cu dou ramuri;
- structura repetitiv condiionat anterior.
Un program scris astfel, se numete program D-structurat (iniiala D provenind de la
numele lui Dijkstra, cel care a introdus denumirea de programare structurat).
Totui, limbajele actuale prevd i alte tipuri de structuri, unele fiind menionate mai sus,
cu scopul de a uura munca programatorului.
Exist astzi un consens general de a evita, dac se poate total, folosirea instruciunii de
salt necondiionat GoTo, care are ca efect distrugerea structurrii. Totui, se accept folosirea
ei pentru cazuri de abandon forat al execuiei, ca ieire de siguran dintr-un program sau
procedur, i numai precedat de un test de condiie adecvat i nsoit de msuri adecvate de
stabilire a valorilor variabilelor care ar mai fi necesare ulterior.
n concluzie, structurarea programelor urmrete realizarea unei cerine de rigurozitate i
anume principiul ncapsulrii (separrii) aciunilor care se poate enuna ca eliminarea
posibilitii ca, prin instruciunile folosite ntr-un modul de program sau zon de modul, s se
declaneze aciuni dificil de controlat ntr-un alt modul sau zon de modul conceput ca
independent. Din acest punct de vedere instruciunea GoTo este deosebit de nefast.
Un alt principiu necesar a fi respectat este principiul ncapsulrii datelor care stipuleaz
limitarea sau blocarea vizibilitii variabilelor ntre diferitele module de program. Din acest
principiu rezult o clasificare a variabilelor n variabile locale care sunt vizibile numai n
interiorul unui modul de program (procedur sau funcie) i variabile globale care sunt
vizibile n tot cuprinsul programului, conform schemei din figura 1.12.8.
n acest scop, limbajele actuale folosesc
Program
instruciuni de declarare care, n funcie de locul
Variabile globale
unde sunt inserate (naintea definirii modulelor
G1Gk
sau n interiorul modulelor) determin
Modul 1
Modul n
vizibilitatea global sau local. n acest mod,
Variabile locale
Variabile locale
chiar dac n modulul n, de exemplu, se
L1,Ln1
L1,Lnn
folosete aceeai denumire pentru variabila L1
ca i n modulul 1, modificarea valorii acelor
variabile ntr-unul din module nu se reflect n
Fig.1.12.8.
cellalt modul.
Cu alte cuvinte, chiar dac cele dou variabile au aceeai denumire, n memoria
37
calculatorului ele sunt stocate la adrese diferite, fiind folosite n funcie de apartenana la
modulul n care sunt definite. Dimpotriv, o variabil global fiind stocat la o adres de
memorie unic va fi vzut la fel de ctre toate modulele.
Scopul principiului ncapsulrii datelor este pe de o parte de a nu fora programatorul s
fac un efort prea mare pentru a crea i manipula denumiri distincte de variabile, iar pe de alt
parte pentru a evita ca o modificare a unei valori a unei variabile dintr-un anumit modul s se
reflecte n mod nedorit ntr-un alt modul independent.
Declaraiile de vizibilitate (local sau global) permit programatorului s controleze cu
exactitate caracterul comun sau izolat al variabilelor folosite.
1.12.6. Metode de programare
Metoda de programare Top-Down (sau de rafinare n pai succesivi)
Aceast metod const n construirea programelor de sus n jos, adic pornind de la blocuri
mari ctre blocuri tot mai mici, pn la nivel de instruciuni simple.
La nceput programul este vzut ca un bloc care rezolv o problem (figura 15 a). Se
analizeaz problema i se descompune n blocuri succesive constituite din mulimi de
secvene (figura 112.9.b). Fiecare bloc sau secven este descompus n structuri coninnd
secvene din ce n ce mai mici care la rndul lor sunt exprimate prin structuri, i aa mai
departe, pn la nivelul simplelor instruciuni. Aceast metod permite programatorului s se
concentreze asupra aspectelor de fond ale problemei de programat, amnnd pentru mai trziu
rezolvarea problemelor de detaliu, legate de implementarea programului cu un limbaj
oarecare. De asemenea, pe msur ce are loc rafinarea problemei, se pot rezolva gradual
problemele de structurare a programului i de ncapsulare a datelor.
Aceasta este cea mai recomandat metod de programare, mai ales pentru programele care
se afl la prima elaborare cnd nu toate problemele sunt lmurite.
Program
Bloc 1
Bloc 2
Bloc n
Fig.1.12.9.
Metoda de programare Bottom-Up.
Aceast metod este contrariul celei de mai nainte. Ea presupune construcia programelor de
la baz la vrf, ncepnd cu elaborarea instruciune cu instruciune a fiecrui modul i apoi
interfaarea modulelor realizate, cu eventualele modificri necesare pentru succesul interfarii.
Metoda a fost folosit intens n epocile timpurii ale activitii de programare i i-a dovedit
din plin ineficiena prin complicaiile pe care le crea i prin marea risip de timp cauzat de
permanentele reconsiderri pe care le impunea practica i care conduceau la reluarea repetat
a procesului de la baz.
n prezent ea mai este folosit numai n msur limitat, pentru asamblarea unor module
existente i verificate, n programe cu problematic foarte clar.
38
Orice instruciune a unui limbaj de programare oarecare este convertit n final n una sau
mai multe instruciuni elementare recunoscute de microprocesor, exprimate n cod binar i
transmise microprocesorului spre execuie.
Exprimarea n cod binar a comenzilor adresate microprocesorului poart denumirea de
limbaj main, i acesta este propriu fiecrui tip (generaie) de microprocesoare.
Cu excepia acestui limbaj, care este situat la nivelul cel mai de jos (cel mai apropiat de
microprocesor) exist i alte moduri de exprimare a comenzilor de execuie denumite limbaje
de programare.
Aceste limbaje reprezint construcii sintactice convenionale, care fac uz de mnemonice
scrise literal, mai inteligibile pentru programator.
Primul limbaj care a folosit tehnica mnemonicelor n locul codurilor binare a fost limbajul
de asamblare care reprezint o coresponden aproape direct n form literal a limbajului
main codificat binar. n acest limbaj fiecrei mnemonice literale i corespunde un cod binar
din limbajul main.
Au urmat o serie de alte limbaje n care o instruciune se traduce printr-un set de
instruciuni n limbajul main. Aceast tehnic a urmrit pe de o parte creterea
productivitii muncii de programare i, pe de alt parte, uurarea efortului de concepere i
manevrare a programelor.
Aceste limbaje sunt denumite limbaje de nivel nalt, de asemenea prin comparaie cu
limbajul de baz, acela al microprocesorului.
Exemple de astfel de limbaje sunt, n ordine cronologic: FORTRAN (RORmula
TRANslator - 1956), COBOL (COmmon Bussines Oriented Language - 1960), ALGOL
(ALGOrithmic Language 1960) din care a derivat limbajul PASCAL, BASIC (Beginer's All
purpose Symbolic Instruction Code- 1964), C (1971) din care deriv mai trziu limbajul JAVA.
Aceste limbaje sunt limbaje "procedurale" sau "algoritmice" deoarece ele descriu
algoritmul sau succesiunea rezolvrii unei probleme. La aceste limbaje ordinea de scriere a
instruciunilor determin strict ordinea n care ele vor fi executate.
Nevoia de flexibilitate a programrii n vederea rezolvrii problemelor lumii reale a condus
la cutarea de alternative la limbajele procedurale.
Astfel au aprut, ntr-o prim etap, limbajele neprocedurale n care ordinea scrierii
instruciunilor nu este n mod obligatoriu i ordinea lor de execuie. n aceste limbaje programatorul
precizeaz problema care trebuie rezolvat i mai puin modul sau algoritmul de rezolvare a ei. Un
exemplu de astfel de limbaj este limbajul LISP (LISt Processor) care are ca structur unic lista.
Lista poate fi att funcie (noiunea de instruciune sau subrutin nu exist n acest limbaj) ct i stoc
de date. Datorit acestei ambivalene a listei, limbajul posed capacitatea de a-i rescrie listele ca i
cum ar rescrie un stoc de date i prin aceasta el i poate rescrie funciile n chiar cursul execuiei.
Limbajul capt n acest fel posibiltatea de a se automodifica n execuie, posibilitate pe care
celelalte limbaje nu o au. Din acest motiv, acest limbaj este foarte mult folosit n problemele de
inteligen artificial care trebuie s aib puterea de autoadaptare la condiii de mediu variabile.
Totui, nici aceast tehnic de programare nu a dat n ntregime satisfacie, motiv pentru
care a aprut programarea orientat pe obiecte. Fr a face uz de limbaje speciale, aceast
tehnic folosete module de program care comunic ntre ele, conform schemelor prezentate
n capitolele anterioare.
1.13.1. Portabilitatea programelor
Portabilitatea este nsuirea unui program scris ntr-un anumit limbaj de a putea fi transpus
pe o alt main i de a putea fi rulat cu mai multe sau mai puine modificri. Se poate vorbi
despre:
39
- Portabilitatea programelor.
Fie cazul unui program pentru care exist un cod surs (succesiune de instruciuni scrise n
form text) asupra cruia nu se mai fac modificri. Acest program poate compilat pe un
anumit calculator obinndu-se codul executabil (succesiunea de coduri binare pentru
microprocesor) i poate apoi s fie rulat pe calculatoare din aceeai familie (construite cu
microprocesoare de acelai tip) fr a mai fi nevoie de nici o modificare a sursei sau
recompilare. Acesta este cazul calculatoarelor din familia PC-urilor pe platforma WINDOWS
sau DOS.
Dac ns se folosesc maini UNIX (calculatoare cu arhitecturi i procesoare diferite
construite pentru sistemul de operare UNIX) poate apare nevoia ca programul surs s fie cel
puin recompilat pentru maina respectiv dac nu chiar rescris, modificnd acele secvene
care apeleaz funcii efectuate n mod diferit n funcie de main.
- Portabilitatea limbajelor (sau portabilitatea programelor surs).
Deoarece microprocesoarele au n general diferene de la tip la tip i de la generaie la
generaie, cel mai neportabil limbaj este limbajul main. Dac se scrie un program ntr-un
astfel de limbaj (lucru foarte frecvent folosit la nivelul firmelor productoare de soft de baz)
el trebuie rescris i recompilat pentru fiecare tip de main n parte.
Pe msur ce se folosesc limbaje de nivel din ce n ce mai nalt portabilitatea acestora
crete, nemai fiind nevoie de rescrierea lor n funcie de main dac compilarea sursei se face
pe maina destinaie. Acest lucru se ntmpl datorit faptului c, compilatorul sau programul
de traducere n cod main, preia sarcina de a ine cont de maina pentru care face traducerea,
scutindu-l pe programator de acest efort.
Legat de problema portabilitii apare problema vitezei de execuie.
Deoarece programele n limbaj main se adreseaz direct microprocesorului, exprimarea
unei sarcini de efectuat printr-un set de instruciuni este cea mai scurt posibil i ca atare
viteza de execuie este cea mai mare posibil. La limbajele de nivel nalt acest mod de
exprimare este unul indirect, o instruciune dintr-un set apelnd nu direct o funcie a
microprocesurului ci un alt set de instruciuni. De aceea o portabilitate mare a unui limbaj se
realizeaz n dauna vitezei de execuie. Exist metode de a ocoli acest inconvenient, i ele
constau n includerea n limbaj a unor posibiliti de folosire direct a limbajului main n
cadrul limbajului de nivel nalt respectiv. Totui aceast rezolvare face programul respectiv
dependent de un anumit microprocesor (cel pentru care se folosesc respectivele instruciuni
main) ceea ce compromite de fapt portabilitatea mrit a limbajului de nivel nalt.
1.13.2. Fazele de elaborare a unui program executabil
Pentru elaborarea unui program trebuie parcurse urmtoarele faze:
A. Stabilirea problemei.
n aceast faz este definit problema de rezolvat, domeniile de definiie ale valorilor
datelor manipulate i metodele matematice i logice de tratare a problemei.
B. Stabilirea algoritmului de rezolvare a problemei
Algoritmul de rezolvare descrie succesiunea etapelor de rezolvare a problemei, nodurile
decizionale care pot interveni i deciziile care trebuie luate, modalitile de introducere a
datelor de intrare i de conservare a rezultatelor.
n fazele A i B nu este necesar cunoaterea unui limbaj de programare. Algoritmul poate
fi descris prin scheme logice sau prin pseudocod.
40
Primete b
Primete c
nceput
primete a;
primete b;
dac c 0
atunci { a = b/c; afieaz a;}
altfel afieaz "EROARE";
sfrit.
c0
Afieaz
EROARE
Calculeaz
a=b/c
void main()
{float a, b, c;
cout << "b="; cin >> b;
cout << "\nc="; cin >> c;
if (c!=0)
{a=b/c; cout << "\na=" << a;}
else cout << "\nNu se poate imparti la 0";
}
C. Implementarea programului.
n aceast faz programatorul trebuie s opteze pentru limbajul care satisface cel mai bine
nevoile algoritmului. O dat opiunea fcut trebuie parcurse urmtoarele etape:
c1. Scrierea fiierului program surs, care conine instruciunile scrise n forma text.
c2. Generarea programului cod obiect executabil. n aceast etap la dispoziia
programatorului stau urmtoarele dou procedee de lucru:
Procedeul interpretor.
Prin procedeul interpretor se genereaz cod obiect executabil n cantitate limitat i anume,
numai pentru linia (sau instruciunea) de program curent. Simplificnd lucrurile, se citete
din fiierul surs cte o linie de program care este convertit n cod obiect executabil care se
ruleaz dac n urma conversiei nu au rezultat erori.
Schema de lucru n procedeul interpretor este cea din figura 1.13.2.
Conform figurii 1.13.2 fazele interpretrii unei linii:
- Analiza instruciunii din punct de vedere sintactic. n aceast faz se analizeaz
folosirea corect a sintaxei limbajului;
- Compilarea liniei. Aceast faz se concretizeaz prin convertirea instruciunii
respective n cod obiect executabil;
41
Execuia liniei, faz n care codul obiect executabil obinut este trimis ctre
microprocesor (via sistemul de operare) care l execut;
Salt la linia urmtoare, dac mai exist.
Fiier surs
Linia 1
Linia 2
eroare sintactic
Analiz
sintactic
Semnalare
eroare
erori de definire
Compilare
Linia i
STOP
erori de execuie
Execuie
Linia i+1
Salt la linia
urmtoare
Interpretare linie i
Linia n
Fig. 1.13.2.
Erorile care pot apare n decursul acestor faze sunt:
- Erori sintactice, cauzate de scrierea incorect a instruciunii sau a parametrilor ei (date
sau variabile);
- Erori de definire, cauzate de date sau variabile nedefinite sau folosire greit a tipurilor
variabilelor;
- Erori de execuie, cauzate de depirea capacitii de reprezentare a numerelor n
calculator n urma unor operaii aritmetice care au produs erori cumulate, folosirea de
operaii aritmetice nepermise (mprire la zero, radical sau logaritm din numr negativ,
etc).
n toate aceste cazuri eroarea este semnalat i programul este oprit.
n afar de aceste erori mai exist i erorile de logic. Pe acestea sistemul nu le semnaleaz
ele innd de concepia greit a programatorului. Consecinele acestor erori pot fi
imprevizibile, de la aparena bunei desfurri a execuiei dar cu rezultate eronate, i pn la
oprirea datorit unor erori de execuie sau, mai grav, blocarea sistemului de operare.
Avantajul programului interpretor este acela c erorile aprute ntr-o linie de program sunt depistate
imediat, ceea ce face depanarea programului mai uoar. n plus, programele scrise n limbaje
interpretoare pot fi rulate i pe pri (cu unele restricii), ceea ce, de asemenea, uureaz depanarea.
Un alt avantaj al unui program scris n limbaj de interpretare este acela de a permite
alocarea dinamic a memoriei, adic variabilitatea n cursul execuiei a zonei de memorie
alocat memorrii variabilelor. Acest lucru are un afect favorabil asupra economicitii
folosirii memoriei.
42
43
Cap.2. Limbajul C
2.1. Caractere
Caracterele folosite la scrierea programelor n limbajul C alctuiesc mulimea de mai jos:
a. Litere mari:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
b. Litere mici:
abcdefghijklmnopqrstuvxyz
c. Caracterul de subliniere:
_
d. Caracterele numerice>
0123456789
Caracterele din categoriile a, b, c, d pot servi la scrierea constantelor, identificatorilor i a
cuvintelor cheie care vor fi descrise mai trziu. Literele mari i mici sunt interpretate distinct.
Astfel, Functie i functie sunt entiti C diferite.
c. Caractere cu destinaii diverse: ! % & | ( ) * + - , . / : ; < = > ? [ ] ^ { } ~ se folosesc
fie cu valoarea recunoscut de limbajul C n scrierea instruciunilor C, a operatorilor, etc, fie,
mpreun cu acelea din categoriile a, b, c, d, n componena irurilor de caractere.
f. Caractere netipribile (secvene ESC). Aceste secvene sunt combinaii speciale de
caractere care, incluse ntr-un ir de caractere delimitat de ghilemele ..., foreaz trimiterea
ctre dispozitivul de ieire de destinaie a unui caracter ASCII care nu are reprezentare grafic
sau care nu poate fi afiat pe ecran prin scrierea obinuit. Ele sunt urmtoarele:
\n pentru salt la linie nou (New Line);
\t pentru tabulare orizontal;
\v pentru tabulare vertical;
\b pentru backspace;
\r pentru revenire la nceput de linie (Carriage Return);
\f pentru avans la pagin nou (Form Feed);
\ pentru tiprirea semnului apostrof ;
\\ pentru tiprirea semnului backslash \ ;
\ddd pentru caracter ASCII n notaie octal, unde d simbolizeaz o cifr (digit);
\xdd pentru caracter ASCII n notaie hexazecimal;
De exemplu, \015 este caracterul ASCII cu codul zecimal 1X8+5=13, acelai cu \x00D,
adic CR (Carriage Return).
Cap.2. Limbajul C
44
partea zecimal i ez este exponentul zecimal de forma Ep sau ep unde p este puterea lui 10,
cu semnul + sau -.
De exemplu: 1.23e+2 este echivalent cu 123.
Observaie: n limbajul C numrul nu are semn. Apariia semnului - n faa unui numr
este deja o aplicare a operatorului de negare aritmetic - aplicat numrului respectiv.
2.2.3. Constante
Constantele sunt de dou tipuri:
a. Constante caracter, de forma caracter. De exemplu A.
b. Constante ir, de forma ir_de_caractere. De exemplu Sir.
Observaie: n cuprinsul unei constante caracter ca i al unei constante ir, pot intra
secvene ESC. De exemplu: \t sau Rezultate:\n.
2.2.4. Delimitatori de comentariu
ncadrarea ntre perechile /* i */ a unui ir de caractere produce ignorarea acestuia de ctre
compilator. n C++ acelai efect se obine i pentru toate caracterele care urmeaz de la
perechea // pn la captul liniei.
2.2.5. Cuvinte cheie
Cuvintele cheie sunt identificatori predefinii care au neles special pentru compilatorul de
C. Aceste cuvinte nu pot fi redefinite iar utilizarea lor trebuie limitat la scopul predestinat.
Iat, mai jos, cteva exemple de cuvinte cheie mai des utilizate:
asm
auto
break
case
char
const
continue
default
do
double
else
extern
far
float
for
goto
huge
if
int
long
near
return
short
sizeof
static
struct
switch
typedef
union
unsigned
void
while
2.2.6. Operatori
Operatorii sunt combinaii de caractere speciale care specific modul de atribuire i de
transformare a valorilor (operanzilor). n funcie de numrul de operanzi asupra crora se
aplic, operatorii pot fi clasificai n operatori unari, binari, ternari i operatori de asignare
combinai.
2.2.6.1. Operatori unari
Un operator unar este aplicat asupra unui singur operand. Asociativitatea operatorilor,
adic ordinea de aplicare a operatorilor consecutivi, pentru aceast categorie, este de la
dreapta la stnga. Aceti operatori sunt:
a. Operatori de complementare:
- Negarea aritmetic (-). Acest operator, aplicabil asupra unui operand ntreg sau n
virgul mobil, produce valoarea negativ a operandului. De exemplu:
short a=122, b;
.....
b=-a;
.....
45
- Negare la nivel de bit (~). Acest operator, aplicabil numai valorilor ntregi, transform
biii 0 n 1 i invers. De exemplu:
unsigned short a=0x0023; /* a=00000000100011 */
.....
a=~a;
/* a=11111111011100 */
.....
n acest exemplu (a<b) este o expresie format cu operatorul relaional <. Ea are ca rezultat
logic 1 dac este adevrat i 0 dac este fals.
b. Operatori de indirectare i adres :
- Operatorul de indirectare (*). Acest operator este folosit la definirea de variabile
pointer prin prefixarea operandului. Pe aceast cale se realizeaz o accesare indirect, prin
intermediul pointerului. Rezultatul este valoarea ctre care puncteaz operandul iar tipul
rezultatului este tipul adresat de operand. De exemplu:
int * pv;
este apelul unei funcii denumit functie care primete ca argumente valoarea a i adresa
lui b. n corpul funciei au loc procese care modific valoarea lui b (b poate fi i o structur).
La ieirea din funcie, orice evaluare a lui b va gsi noua sa valoare.
c. Operatorul de lungime sizeof:
Acest operator, aplicat asupra unui operand oarecare, determin dimensiunea de memorie
alocat operandului respectiv. Forma de aplicare a operatorului este: sizeof(operand), iar
rezultatul returnat este lungimea exprimat n octei necesar memorrii operandului.
Cu
ajutorul operatorului sizeof se poate asigura independena de calculator a lungimii datelor,
calculul acesteia cznd n sarcina compilatorului, ceea ce este deosebit de folositor n cadrul
operaiilor de alocare a memoriei.
2.2.6.2. Operatori binari
Operatorii binari sunt aplicabili asupra a doi operanzi. n acest caz, asociativitatea este de
la stnga la dreapta.
a. Operatori multiplicativi:
- nmulirea (*), specific nmulirea operanzilor. De exemplu:
float x=3.0, y;
int i=2;
.....
y=x*i;
Cap.2. Limbajul C
46
.....
produce rezultatul ntreg 1 convertit n virgul mobil i atribuit lui x, deci x=1.0.
- Modulo (%), specific restul npririi primului operand la al doilea. De exemplu:
int a=8, b=3, r;
.....
r=a%b;
.....
n ambele cazuri pa1 i pb1 reprezint adresa celui de al doilea element al tabloului a i ca
urmare programul va afia:
*pa1=1.000000, *pb1=1.000000
c. Operatori relaionali:
Aceti operatori testeaz valabilitatea relaiei dintre doi operanzi. Rezultatul produs este 1
dac relaia este adevrat, sau 0 dac relaia este fals. Tipurile operanzilor pot fi oricare
dintre tipurile ntreg, virgul mobil sau pointer. Rezultatul produs este de tip ntreg (int).
Comparaiile ntre operanzi de tip pointer ai aceluiai masiv (tablou) de date au sens
deoarece, n acest caz, se compar poziia relativ a adreselor de memorie care cresc n
ordinea de cretere a indicilor n tablou. Comparaia dintre o dat oarecare i una de tip
pointer, n general, poate s nu aib sens deoarece adresele de stocare ale datelor din masive
47
diferite sunt stabilite de ctre compilator dup o lege necontrolabil de ctre programator.
Exist urmtorii operatori relaionali:
< a<b a strict mai mic dect b
> a>b a strict mai mare dect b
<= a<=b a mai mic sau egal cu b
>= a>=b a mai mare sau egal cu b
== a==b a egal cu b
!= a!=b a diferit de b
d. Operatori de deplasare :
Aceti operatori sunt de dou tipuri:
- operatorul de deplasare la stnga <<, i
- operatorul de deplasare la dreapta >>.
Operaiile efectuabile cu aceti operatori au formele: x << n i x>>n. Att x ct i n sunt de
tip ntreg, iar n trebuie s fie pozitiv i mai mic n valoare sau egal cu numrul de bii pe care
este reprezentat x, altfel rezultatul este indefinit. Valoarea n reprezint numrul de deplasri
ale biilor lui x. Dup deplasarea biilor spre stnga sau spre dreapta, se face completarea cu
zero la dreapta, respectiv la stnga.
De exemplu:
#include <conio.h>
#include <stdio.h>
void main()
{unsigned x=65, y;
y=x<<1;
printf(x=%u, y=%u\n,x,y);
}
getch();
n acest program valoarea ntreag fr semn x=65, adic 01000001, este deplasat la
stnga cu o poziie obinndu-se ca rezultat valoarea 10000010, adic 130, atribuit lui y i, ca
urmare, programul va afia:
x=65, y=30
getch();
Cap.2. Limbajul C
48
f. Operatori logici :
n cazul utilizrii operatorilor logici tipurile operanzilor pot fi ntregi, virgul mobil sau
pointer, i pot fi diferii ntre ei.
Evaluarea operanzilor are loc de la stnga la dreapta. Dac evaluarea primului operand este
suficient pentru a determina rezultatul, evaluarea celui de al doilea operand nu mai are loc.
Evaluarea operanzilor se face numai n sensul echivalrii cu zero. Rezultatul operaiei logice
este 0 sau 1.
- I logic (&&), produce ca rezultat valoarea 1 numai dac ambii operanzi sunt diferii de
0.
- SAU INCLUSIV logic (||), produce ca rezultat valoarea 1 dac cel puin unul dintre
operanzi este diferit de 0.
De exemplu:
#include <conio.h>
#include <stdio.h>
void main()
{float x1=1.5, x2=3, x;
printf(x=); scanf(%f, &f);
if(x>x1 && x<x2)
printf(x%f este interior domeniului x1=%f - x2=%f\n,x,x1,x2);
else
printf(x%f este exterior domeniului x1=%f - x2=%f\n,x,x1,x2);
getch();
}
49
Algoritmul de evaluare const, mai nti, din evaluarea lui operand1. Dac acesta este
adevrat (diferit de zero), rezultatul returnat este cel provenit din evaluarea lui operand2, iar
altfel este returnat rezultatul provenit din evaluarea lui operand3. De exemplu:
maxab = a>b ? a : b;
Operandul operand1 este, aici, expresia a>b. Dac aceasta este adevrat, valoarea lui a ca
operand2 va fi returnat ca rezultat i atribuit lui maxab, altfel lui maxab i se va atribui
valoarea lui b ca operand3.
2.2.6.4. Operatorul de atribuire simpl i compus
Operaia de atribuire simpl folosete operatorul = i are forma:
operand1=operand2
Echivalent
a=a*b
a=a/b;
a=a%b;
a=a+b;
a=a-b;
a=a<<n;
Denumire i efect
multiplicare cu atribuire - multiplicare lui a cu b i atribuire lui a
nprire cu atribuire - nprirea lui a la b i atribuire lui a
rest cu atribuire - a modulo b cu atribuire lui a
adunare cu atribuire - a adunat cu b i atribuire lui a
scdere cu atribuire - b sczut din a i atribuire lui a
deplasare la stnga cu atribuire - deplasarea la stnga a lui a cu n bii i
atribuire lui a
a>>=n; a=a>>n; deplasare la dreapta cu atribuire - deplasarea la dreapta a lui a cu n bii
i atribuire lui a
a&=b;
a=a&b;
I la nivel de bii cu atribuire - a I b cu atribuire lui a
a|=b;
a=a|b;
SAU INCLUSIV la nivel de bii cu atribuire - a SAU INCLUSIV b cu
atribuire lui a
a^=b;
a=a^b;
SAU EXCLUSIV la nivel de bii cu atribuire - a SAU EXCLUSIV b
cu atribuire lui a
Tot cu scopul reducerii scrierii programelor surs au fost introdui i operatorii unari de
incrementare ++ i de decrementare --. Ei pot s apar n formele:
a. forma prefixat: operator operand, adic ++operand sau -operand, iar
rezultatul operaiei este operand + 1 sau operand - 1, identic cu starea operandului dup
operaie.
b. forma postfixat: operand operator, adic operand++ sau operand--, iar rezultatul
operaiei este n ambele cazuri operand, identic cu starea operandului nainte de operaie,
starea operandului dup operaie fiind, ca i mai nainte, operand +1 sau operand - 1.
De exemplu:
int x=2, y;
.....
y=++x;
.....
va avea ca rezultat y=x=3, deoarece x este mai nti incrementat i abia apoi rezultatul este
atribuit lui y, pe cnd:
y=x++
Cap.2. Limbajul C
50
va avea ca rezultat y=2 i x=3, deoarece rezultatul lui x++ este starea dinainte de
incrementare, adic valoarea 2 care este atribuit lui y, starea lui x dup incrementarea
postfixat fiind valoarea 3.
2.2.7. Precedena operatorilor
Precedena reprezint prioritatea la evaluare a unui operator. Aceasta este important
numai n prezena altui operator de preceden diferit. Expresiile formate cu operatori de
preceden mai nalt sunt evaluate primele.
n tabelul 2.1.1 operatorii sunt listai astfel: operatorii situai pe aceeai linie au aceeai
preeceden, iar pe vertical operatorii de la nceputul tabelului au precedena cea mai nalt,
cei de la sfrit avnd precedena cea mai sczut.
Dac la un nivel al unei expresii apar mai muli operatori cu preceden egal,
evaluarea se realizeaz, n funcie de asociativitatea operatorului (direcie de evaluare), de la
stnga la dreapta (S D) sau invers (D S), dup caz.
Tabelul 2.2.1.
Tip de operaie
Operator
Asociativitate
( ) [ ] -> .
expresie
(S D)
~
!
*
&(adresa)
++
unar
(D S)
multiplicativ
aditiv
deplasare
relaional (inegalitate)
relaional (egalitate)
I la nivel de bii
SAU EXCLUSIV la nivel de bii
SAU INCLUSIV la nivel de bii
I logic
SAU logic
condiie ternar
atribuire simpl i combinat
evaluare secvenial
* / %
+ << >>
< > <= >=
== !=
&
^
|
&&
||
? :
*= /= %= +=
,
-=
(S D)
(S D)
(S D)
(S D)
(S D)
(S D)
(S D)
(S D)
(S D)
(S D)
(D S)
(D S)
(S D)
51
data propriu-zis. Deoarece datele referite au propriul lor tip, pointerii sunt desemnai printr-o
prefixare cu caracterul * a notaiei entitii pointer, prefixul * i notaia pointerului urmnd
unui cuvnt cheie care desemneaz tipul, ca mai jos:
tip * nume_pointer
Cap.2. Limbajul C
52
unde:
{mulime_enumerativ} este o list de forma:
{definire_constanta_enumerativ_0,..., definire_constant_enumerativ_0}
iar: definire_constant_enumerativ_i are forma:
constant_enumerativ_i [=valoare_atribuit_explicit]
Astfel, se poate defini:
enum meniu {aperitiv, supa, pilaf, placinta};
caz n care valorile atribuite de ctre compilator sunt: aperitiv=0, supa=1, pilaf=2,
placinta=3.
Dac se dorete s se exclud aperitiv din meniu, dar s se pstreze aceleai numere,
trebuie s se defineasc:
enum meniu {supa=1, pilaf, placinta};
Aceast definiie stabilete numai faptul c fel_de_mancare este de tipul meniu, adic
poate lua ca valori numai valorile definite n mulimea enumerativ.
Ulterior se poate scrie:
fel_de_mancare=pilaf;
Dei membrii structurilor nu pot fi iniializai, structurile pot fi iniializate dup ce au fost
definite ca tip.
Astfel, se poate scrie, de exemplu:
struct punct2D r{0,0}, s{2,0}, t{0,2};
struct triunghi {r,s,t};
53
#include <conio.h>
#include <stdio.h>
struct punct2D {float x,y;};
void oglinda_oy(punct2D *pct) {pct->x=-pct->x;}
void main()
{struct punct2D A={5,3};
printf(Punctul original A are x=%f si y=%f\n, A.x, A.y);
oglinda_oy(&A);
printf(Punctul oglindit A are x=%f si y=%f\n, A.x, A.y);
getch();
}
va permite salvarea n variabila tip_data a unei informaii de oricare tip dintre cele
patru tipuri membre ale uniunii orice_tip.
Referirea unui membru al uniunii se face, ca i n cazul structurilor prin operatorul punct
(.) sub forma uniune. membru
Orice dat este stocat n variabila uniune ncepnd de la prima locaie de memorie
rezervat uniunii i este returnat conform tipului referit. Astfel, n exemplul urmtor:
#include <conio.h>
#include <stdio.h>
union tip_dublu {int i; float f;} ddata;
void main()
{ddata.f=1234.56e+5;
printf(ddata.f=%f\n, ddata.f);
printf(ddata.i=%f\n, ddata.i);
getch()
}
ceea ce este corect pentru tipul float dar este greit pentru tipul int. Aceasta se datoreaz
faptului c citirea din memorie are loc numai pentru a parte a octeilor stocai n uniune,
conform tipului ntreg.
Aceasta este o posibil surs de erori i nu poate fi evitat dect prin grija strict a
programatorului de a ine cont de ultimul tip stocat n uniune.
2.3.7. Date nemodificabile. Declaraia const
Pentru a preveni modificarea din greeala programatorului a valorilor anumitor date care
trebuie s fie nemodificabile, se folosete declaraia const, n forma:
Cap.2. Limbajul C
54
are ca efect imposibilitatea de a mai schimba valoarea variabilei pi. n acest caz atribuirea:
pi=2.5;
Observaie: acelai efect l are i directiva preprocesor #define, dar mesajul de eroare este
diferit.
2.3.8. Declaraia typedef
Aceast declaraie are forma:
typedef tip declaraie
i are rolul de a crea denumiri sinonime pentru tipuri.
De exemplu:
typedef int intreg;
/* creaza un sinonim pentru tipul int */
typedef struct punct3D {float x,y,z} p3D;
/* face ca punct3D si p3D
sa fie utilizate cu acelasi rol */
Operaia val_int_2/val_int_3, avnd doi operanzi de acelai tip (ntreg), va avea rezultatul de
tip int i acesta, prin rotunjire, va fi egal cu zero. Ca urmare rezultat_float va cpta valoarea 3.0.
55
Dac cel puin unul dintre operanzii val_int_2 i val_int_3 ar fi fost de tip float, nprirea
lor ar fi fost convertibil la tipul float (cel mai lung dintre tipurile float i int) i ar fi rezultat
0.8, iar rezultatul final ar fi fost cel corect, adic 3.8.
Deci, cnd din diferite motive legate de scrierea programului, nu este posibil schimbarea
tipului iniial al datelor, se poate face uz de conversia explicit de tip folosind operatorul
cast. Acesta are forma:
(tip)
i prefixeaz variabila a crei conversie trebuie realizat.
n consecin, pentru operaia descris mai sus, se poate scrie una dintre variantele:
rezultat_float=val_float_1+(float)val_int_2/val_int_3;
rezultat_float=val_float_1+val_int_2/(float)val_int_3;
rezultat_float=val_float_1+(float)val_int_2/(float)val_int_3;
ceea ce asigur, cel puin pentru unul dintre operanzii val_int_2 i val_int_3 (sau, respectiv,
pentru ambii) conversia n timpul operaiei la tipul specificat de operatorul cast i, n
consecin, producerea unui rezultat corect.
2.5. Instruciuni
Execuia unui program scris n limbajul C este controlat prin instruciuni.
Instruciunile pot fi: instruciuni simple, care vor fi trecute n revist n acest capitol, sau
instruciuni compuse, formate din alte instruciuni.
Instruciunile simple se termin cu caracterul ; iar instruciunile compuse sunt
cuprinse ntre acolade {} i se mai numesc i blocuri.
Pot fi folosite i instruciuni vide care apar sub forma caracterului ;.
Orice instruciune poate fi precedat de o etichet format dintr-un nume urmat de
caracterul :, sub forma:
nume_eticheta:
Eticheta nu este util dect n cazul folosirii instruciunii goto sau switch.
2.5.1. Instruciunea expresie
O expresie apare sub forma general:
expresie;
Ca exemple de expresii se pot cita:
- expresii de atribuire. De exemplu:
x=a+b;
56
Cap.2. Limbajul C
Instruciunile if-else pot fi ncuibate una n alta. n acest caz alternativa else se refer la
ultima condiionare if care nu are alternativ else. De exemplu:
if(a<b)
/* primul if
*/
if(c<a) minabc=c;
/* al doilea if
else minabc=a;
/* primul else
else
/* al doilea else
if(c<b) minabc=c; /* al treilea if
*/
else minabc=b; /* al treilea else */
*/
*/
*/
Se observ din acest exemplu c al doilea else se refer la primuil if, iar al treilea else se
refer la al treilea if.
Pentru ncuibri mai complicate este indicat s se foloseasc acoladele pentru delimitarea
blocurilor dorite fr echivoc, pentru a evita erorile de scriere a schemelor decizionale.
2.5.3. Instruciunea de selecie
Instruciunea de selecie are forma genaral:
switch (expresie_selectoare)
{case i1: secventa_i1 [break;]
.....
case in: secventa_in [break;]
[default: secventa_d]
}
unde: expresie_selectoare trebuie s produc un rezultat de tip ntreg;
etichetele i1,...,in trebuie s fie constante sau expresii cu valoare constant de tip
ntreg i trebuie s aib valori distincte;
secvenele pot fi secvene de instruciuni sau pot fi vide;
eticheta default: i secventa_d asociat ei sunt opionale.
Aciunea de execuie selectiv se desfoar astfel:
1. Se evalueaz expresie_selectoare;
2. Se caut aceea dintre expresiile i1,...,in care are valoarea egal cu rezultatul evalurii lui
expresie_selectoare. Dac o astfel de expresie este ntlnit, se vor executa toate secvenele de
instruciuni din corpul instruciunii switch pn la eticheta default sau pn la primul break ntlnit.
Dac nici una dintre expresiile i1,...,in nu are valoare egal cu rezultatul dat de
expresie_selectoare, este executat secvena de instruciuni asociat etichetei default, dac
aceasta exist.
ntlnirea unei instruciuni break transfer controlul execuiei la prima instruciune care
urmeaz instruciunii switch.
De exemplu:
switch(i)
{case 1:
case 2:
57
rezultatul produs fiind y=1 pentru i=1, 2 sau 3, y=2 pentru i=4, i y=0 pentru oricare alt
valoare a lui i. Sau:
switch (i)
{case 1: y++;
case 2: y++;
case 3: y++;
}
n acest caz rezultatele sunt: pentru i=1 se obine y=y+3, pentru i=2 se obine y=y+2, iar
pentru i=3 se obine y=y+1. Pentru oricare alt valoare a lui i, y rmne neschimbat.
2.5.4. Instruciunea de ciclare for
Forma general a instruciunii for este:
for([iniializare];[condiie];[actualizare]) instruciune;
i are ca efect urmtoarele aciuni:
a. se execut instruciunea iniializare;
b. se testeaz expresia condiie. Dac aceasta este adevrat, se execut instruciune;
c. se execut instruciunea actualizare.
n continuare se reiau numai paii b i c att timp ct condiie este adevrat.
De exemplu:
#include <conio.h>
#include <stdio.h>
void main()
{int i,a;
for(a=1,i=1; i<=5; i++) a*=i;
printf(a=%i\n,a);
getch();
}
Cap.2. Limbajul C
58
are ca efect evitarea executrii mpririi lui y prin x=0. Ca rezultat al rulrii programul va
afia:
z=-1.000000
z=1.000000
ceea ce arat c, din ciclul while, au fost executate numai operaiile corespunztoare valorilor
x=-1 i x=1.
2.5.8. Instruciunea de salt, goto
Aceast instruciune are sintaxa:
goto etichet;
i are ca efect transferul execuiei la instruciunea precedat de etichet.
59
2.6. Tablouri
Tablourile sunt masive de date de acelai tip, memorate ca variabile indexate.
Ca orice variabile, i variabilele tablou sunt referite prin nume, iar o variabil anume din
tablou este identificat prin indicele ei, baza de indexare pornind de la indicele zero considerat
ca identificnd primul element al tabloului.
Astfel, declaraia:
tip nume[numr_total]
definete o variabil tablou denumit nume, avnd numr_total de elemente de acelai tip
i care ocup un numr de locaii de memorie egal cu numr_total*sizeof(tip).
Referirea unui element al tabloului se face sub forma:
nume[indice]
De exemplu:
int a[5];
definete un vector (tablou cu o dimensiune) coninnd 5 elemente de tip int, iar prin
a[2]este referit al treilea element al vectorului.
Abstracie fcnd de faptul c toate elementele tabloului sunt de acelai tip, tipul n sine
poate fi oricare (afar de tipul void), inclusiv structuri.
Tablourile pot fi multidimensionale, n acest caz sintaxa de definire fiind:
tip nume[numr_1][numr_2]...
De exemplu:
float b[3][4];
este un tablou de elemente de tip float, cu dou dimensiuni avnd 3 rnduri i 4 coloane.
Iniializarea unui tablou se poate face n dou moduri:
a. implicit, prin scrierea valorii zero de ctre compilator n toate elementele tabloului.
Astfel, definiia:
float c[3];
Puin altfel stau lucrurile n cazul tablourilor de tip ir de caractere. Astfel, se poate defini:
char mesaj[20]=Apasa orice tasta\n;
60
Cap.2. Limbajul C
mod de definire care este identic cu cel numeric i care, de fapt, este chiar o definire
numeric deoarece fiecare caracter este reprezentat (substituit) prin codul su numeric ntreg
n conformitate cu standardul ASCII.
n sfrit, pentru definirea tablourilor multidimensionale se folosete ncadrarea ntre
acolade incuibate.
De exemplu:
int a[2][3]={{1,2,3},{6,2,5}};
61
float valoare_reala=15.73;
int * pointer_catre_intreg;
pointer_catre_intreg=&valoare_reala;
este ilegal deoarece se ncearc atribuirea unei adrese de tip float unui pointer ctre o valoare
ntreag.
2.7.2. Utilizarea variabilelor pointer
Printr-o variabil pointer se pot prelua i transmite date. De exemplu:
adresa_entitate=&valoare_1;
Prin acest program a fost fcut o atribuire indirect a valorii de tip caracter de la variabila
j la variabila k prin mecanismul de iniializare a pointerului pj cu adresa lui j i apoi de
atribuire a acesteia lui k.
2.7.4. Relaia dintre pointeri i tablouri
Numele unui tablou este o constant a crei valoare reprezint adresa primului element al
tabloului. Din acest motiv, notaiile tablou i &tablou[0] sunt echivalente. Atunci, conform
celor spuse la definirea pointerilor, accesul la primul element al tabloului se poate face fie
prin *tablou fie prin tablou[0].
De la aceast regul fac excepie pointerii ctre tipul void i pointerii ctre funcii.
Cap.2. Limbajul C
62
Instruciunea urmtoare atribuie adresa primului element al tabloului a variabilei pointer ap:
ap=a;
i
&a[0]=ap;
sunt ilegale deoarece o adres este o constant nemodificabil, creia nu i se poate atribui o
alt valoare.
2.7.5. Pointeri ctre pointeri
Limbajul C poate defini variabile pointer care puncteaz ctre alte variabile pointer. n
acest caz prefixarea se face cu dou asteriscuri: **. Generaliznd, numrul de asteriscuri
determin nivelul de indirectare al variabilei pointer.
De exemplu, declaraiile i atribuirile:
int data_intreaga=3;
int *pint_1, **pint_2;
pint_1=&data_intreaga;
pint_2=&pint_1;
Fig.2.7.2.
Desigur, adresele 1293 i 3174 din figur sunt fictive, ele depinznd de aciunea compilatorului,
i sunt date pentru a urmri corespondena dintre adresa i coninutul variabilei pointer.
2.7.6. Aritmetica pointerilor
Limbajul C permite efectuarea numai a dou operaii asupra adreselor reflectate de
pointeri, i anume adunarea i scderea, conform regulilor urmtoare:
a. adunarea unui pointer cu un ntreg i echivaleaz cu a aduna valoarea adresei stocate
de pointer cu valoarea i*sizeof(tip_pointer), unde tip_pointer este tipul ctre care puncteaz
pointerul. De exemplu, secvena:
float tabel[3]={1.1,2.2,3.3};
float *p_tabel=tabel
/* adresa primului element din tabel */
float valoare;
valoare=*(p_tabel+1);
se va atribui variabilei valoare coninutul primului element din tabel. Adic valoarea 1.1.
63
va transfera n variabila caracter valoarea celui de al 6-lea element al irului "Cititor", deci
caracterul o.
2.8. Funcii
Spre deosebire de alte limbaje, limbajul C recunoate ca module componente ale unui
program numai funciile i ele nu pot fi definite n interiorul altei funcii.
2.8.1. Prototipul unei funcii
Prototipul unei funcii este o simpl declaraie, plasat n zona de nceput a programului,
declaraie care are rolul de a ntiina compilatorul asupra numrului i tipurilor de argumente
primite de funcie, precum i asupra tipului de rezultat returnat de ctre funcie.
Forma general a prototipului unei funcii este urmtoarea:
[clasa_de_memorare] tip_rezultat nume_functie([lista_tipuri_argumente]);
unde:
clasa_de_memorare poate fi de tipul static sau extern. Atributul static face ca funcia
respectiv s nu fie vizibil pentru programe definite n alte fiiere. Atributul extern este
opional i implicit i face funcia respectiv vizibil i dintr-un alt fiier surs;
tip_rezultat specific tipul rezultatului returnat de funcie. Din acest punct de vedere
trebuie s existe concordana cu tipul de rezultat referit de instruciunea return. Dac funcia
nu returneaz nici un rezultat, atunci tip_rezultat este tipul void;
nume_functie este numele funciei. El trebuie s fie unic i s nu coincid cu vreunul
dintre numele de funcii standard ale limbajului C;
lista_tipuri_argumente are forma:
tip_arg_1,...,tip_arg_n
unde tip_arg_j este tipul argumentului j, j=1,2,...,n.
Dac funcia nu primete nici un argument, atunci lista_tipuri_argumente va conine
numai meniunea void.
2.8.2. Definirea unei funcii
Definirea unei funcii are forma:
antet
{corp_functie}
unde antet are aproape aceeai form cu prototipul funciei, i anume:
tip_rezultat nume_functie([lista_tipuri_argumente]);
cu deosebirea c lista_tipuri_argumente are acum forma:
tip_arg_1 nume_arg_1,..., tip_arg_n nume_arg_n
unde nume_arg_j este numele intern (din funcie) al argumentului j, j=1,2,...,n;
{corp_functie} este un bloc de program coninnd declaraii de variabile, constante i
instruciuni.
2.8.3. Apelul unei funcii
O funcie se apeleaz sub forma:
64
Cap.2. Limbajul C
nume_functie(nume_arg_1,...,nume_arg_n);
unde: nume_arg_j, j=1,2,...,n, trebuie s desemneze un argument de tipul acceptat de
funcie. Dac funcia nu primete nici un argument, atunci lista de argumente este vid, de
forma ().
2.8.4. Instruciunea return
ntr-o funcie pot exista mai multe instruciuni return sau nici una. Atingerea unei
instruciuni return n cursul execuiei produce ntoarcerea n programul principal. Forma
instruciunii return este:
return rezultat;
unde: rezultat trebuie s fie de tipul tip_rezultat definit de prototipul funciei.
Dac funcia nu produce nici un rezultat, instruciunea return are forma:
return;
Dac acest lucru se produce la sfritul corpului funciei, instruciunea return poate lipsi.
2.8.5. Funcia main
Funcia main reprezint, de fapt, programul principal n limbajul C. Ea nu are nevoie de
prototip ci numai de definiie, care apare n forma:
[void] main([parametri])
{corp_functie}
n versiunile timpurii de C, definiia funciei main era precedat de tipul void, dar la
versiunile recente menionarea lui nu mai este dect opional, fiind meninut pentru
compatibilitatea cu programele surs scrise pentru versiunile anterioare.
De obicei funcia main nu are parametri. Acesta este cazul programelor lansate numai prin
nume, fr parametri n linia de comand. n aceste caz, lista de parametri este vid:
main() {corp_functie}
n sistemul de operare DOS un program poate fi lansat cu parametri n linia de comand, n
forma general:
nume_program param_1, param_2,...,param_n
Parametrii param_1, param_2,...,param_n trebuie preluai de program i prelucrai n
corpul su. n acest caz, funcia main trebuie s apar cu o list format din doi parametri:
main(int numar_par_com, char ** tabl_par){corp_functie}
unde:
numar_par_com este numrul de parametri din linia de comand;
**tabl_par este un pointer ctre un tablou de iruri de caractere care conine
cuvintele liniei de comand, astfel:
tabl_par[0] este numele programului, adic nume_program;
tabl_par[1] este primul pametru al liniei de comand, adic param_1;
.....
tabl_par[n] este ultimul pametru al liniei de comand, adic param_n;
2.8.6. Exemplu de folosire a funciilor ntr-un program C
Cu toate c nu a fost fcut nc o prezentare a structurii unui program C (pentru c mai
este necesar parcurgerea nc a unor noiuni), pentru nelegerea modului de folosire a
funciilor, n continuare este prezentat un exemplu de program C simplu:
#include <conio.h>
#include <stdio.h>
float a=1.0, b=2.5, c;
/*declarare si initializare variabile
globale */
float aduna(float, float); /* declarare prototipuri functii */
65
main()
/* definire functie main */
{c=aduna(a,b);
/* apelul functiei si atribuirea
rezultatului */
printf("c=a+b=%f+%f=%f\n",a,b,c);
/*afisare */
getch();
/* asteptarea apasarii unei taste */
}
float aduna(float u, float v) /* definirea functiei aduna*/
{float w;
/* declarare variabila locala */
w=u+v;
/* operatia de adunare si atribuire */
return w;
/* returnarea rezultatului */
}
Cnd compilatorul ajunge la funcia main, el ntlnete apelul funciei aduna. Pentru a
rezolva corect legturile pe care le are de fcut el trebuie s cunoasc, dac nu chiar funcia
aduna, mcar prototipul ei. De aceea acest prototip trebuie s precead apelul, aadar trebuie
s se gseasc n partea de nceput a programului.
Dac, ns, este mutat definiia funciei aduna naintea definiiei funciei main n care se
gsete apelul funciei aduna, prototipul funciei aduna nu mai este necesar, deoarece datele
necesare efecturii legturilor necesare sunt luate chiar din definiia funciei aduna.
Ca urmare a rulrii programului de mai sus, se va obine afiarea:
c=a+b=1.000000+2.500000=3.500000
adic funcia aduna returneaz suma numerelor argumente, acest rezultat fiind atribuit
variabilei c.
2.8.7. Transferul argumentelor funciilor
Reamintind cele prezentate anterior, definirea unei funcii se prezint sub forma:
tip_rezultat nume_functie(tip_1 arg_formal_1,..., tip_n arg_formal_n)
{...
...
}
unde:
tip_j, j=1,2,...,n este tipul argumentului;
arg_formal_j, j=1,2,...,n este argumentul formal (denumirea din interiorul
funciei);
iar apelul funciei are forma:
nume_functie(arg_efectiv_1,...,arg_efectiv_n);
unde: arg_efectiv_j, j=1,2,...,n este argumentul efectiv (denumirea din blocul de unde se
apeleaz funcia).
ntre arg_formal_j i arg_efectiv_j trebuie s existe concordan de tip,
arg_efectiv_j putnd s fie o constant, o variabil, o expresie sau o funcie cu rezultatul de
tipul tip_j.
Mecanismul de aciune al apelului este urmtorul:
- se atribuie lui arg_formal_j valoarea lui arg_efectiv_j;
- se execut operaiile din corpul funciei;
- se returneaz rezultatul (dac exist o returnare de rezultat).
Ca urmare, dac argumentele nu sunt de tipul adres, indiferent ce s-ar ntmpla n corpul
funciei, valorile argumentelor arg_efectiv_j nu sunt afectate.
n exemplul urmtor:
#include <conio.h>
#include <stdio.h>
typedef struct {float x,y;} punct2D;
66
Cap.2. Limbajul C
Dei n corpul funciei punctele p1 i p2 i-au schimbat ntre ele coordonatele, ele fiind
numai copii ale punctelor a i b, aceast inversare nu are efect n exteriorul funciei
punct_mediu. Dac, ns, se modific programul ca mai jos:
#include <conio.h>
#include <stdio.h>
typedef struct {float x,y;} punct2D;
punct2D punct_mediu(punct2D *p1, punct2D *p2)
{punct2D pm, ptemp;
pm.x=0.5*(p1->x+p2->x);
pm.y=0.5*(p1->y+p2->y);
ptemp=*p1; *p1=*p2; *p2=ptemp;
return pm;
}
main()
{punct2D a={0,0}, b={6,6}, c;
c=punct_mediu(&a,&b);
printf("a(%f,%f)\n",a.x,a.y);
printf("b(%f,%f)\n",b.x,b.y);
printf("c(%f,%f)\n",c.x,c.y);
getch();
}
ceea ce denot acelai efect direct al returnrii rezultatului atribuit punctului c, dar, deoarece
ca parametri ai funciei punct_mediu se transmit adresele punctelor a i b, prelucrrile din
interiorul funciei vor avea loc asupra originalelor i, ca urmare, la ieirea din funcie punctele
originale a i b vor avea coordonatele schimbate reciproc.
Acesta este un exemplu de efect lateral al unei funcii i, dac nu este intenionat, poate fi
o surs de erori.
67
Cap.2. Limbajul C
68
n schimb, n programul:
#include <conio.h>
#include <stdio.h>
void rotire_stanga(float tablou[], int nmax)
{float temp=tablou[0]; int i;
for(i=0;i<nmax-1;i++) tablou[i]=tablou[i-1];
tablou[nmax-1]=temp;
}
main()
{float tabl[]={1,2,3}; int i;
rotire_stanga(tabl,3);
for(i=0;i<3;i++) printf("tabl[%i]=%f\n",i,tabl[i]);
getch();
}
funcia rotire_stanga nu returneaz nici o valoare dar are ca efect, dup ieirea din ea, rotirea
elementelor tabloului cu o poziie ctre stnga. Efectul rulrii programului va fi afiarea:
tabl[0]=2.000000
tabl[1]=3.000000
tabl[2]=1.000000
69
n cazurile a i b s-a efectuat apelul cu numele tabloului iar funcia trebuia s vad mcar
ultima dimensiune a tabloului i faptul c are dou dimensiuni. n cazul c s-a fcut uz de
mecanismele de transfer a pointerilor i de derefereniere a acestora.
Cap.2. Limbajul C
70
va nlocui peste tot textul ZECE prin textul 10, care la compilare va fi interpretat numeric.
Dac, dup aceasta, se scrie:
#define INCRZECE ZECE+1
devine la compilare:
val=(10+1)*2;
Tot astfel:
#define MESAJ EROARE\n
poate servi la utilizarea cuvntului MESAJ ca argument al unei funcii de ieire pentru
scrierea pe ecran a mesajului EROARE urmat de un salt la o linie nou.
Directiva define are i o form parametrizat, denumit macrodefiniie:
#define identificator (lista_de_parametri)
care poate servi la crearea de definiii scurte pentru funcii simple. Un exemplu clasic este
urmtorul:
#define max(a,b) ((a)>(b) ? (a) : (b))
n instruciunea:
if(((u)>(v+1) ? (u):(v+1))>x) u=x;
71
se va obine afiarea
Latura=10
72
73
Fa de aplicaia anterioar noul program este chiar mai scurt i nu produce nici o
complicaie de scriere.
74
tip_var_pointer=new tip_variabil[dimensiune];
unde:
dimensiune este dimensiunea variabilei dinamice de tip tablou. Tabloul poate
fi multidimensional, n acest caz fiind necesar specificarea tuturor dimensiunilor. Tablourile
nu pot fi iniializate valoric.
n toate cazurile, dac alocarea dinamic a reuit, este returnat un pointer de tipul
tip_variabil. Dac alocarea a euat, este returnat un pointer de valoare NULL. Este
recomandabil testarea valorii returnate, nainte de a efectua exploatarea spaiului de
memorie alocat dinamic.
Eliberarea memoriei alocate dinamic se face folosind operatorul delete, cu sintaxa:
delete tip_var_pointer
unde:
tip_var_pointer este valoarea pointer returnat la alocarea anterioar cu new.
De exemplu:
#include <iostream.h>
#include <ctype.h>
main()
{int endprog=0, ls, i; char cont, *sir;
while(endprog==0)
{cout << "Lungime sir="; cin >> ls;
sir=new char[ls+1];
for(i=0;i<ls;i++) sir[i]='*';
sir[ls]='\0';
cout << sir << "\nContinuare(D/N)?"; cin >> cont;
if(toupper(cont)!='D') endprog=1;
delete sir;
}
}
Programul cere lungimea unui ir de caractere, aloc spaiul necesar plus o locaie pentru
caracterul terminator de ir \0, completeaz zona de memorie alocat cu caractere * i o
ncheie cu caracterul terminator de ir. Dup aceea cere confirmarea continurii. La fiecare
sfrit de ciclu elibereaz memoria alocat.
75
76
restul programului rmnnd neschimbat cu excepia nlocuirii numelui svect cu numele cvect.
Dac, ns, se va ncerca accesarea membrilor a i b din program, rezultatul la compilare
va fi un mesaj de eroare avertiznd c aceti membri sunt inaccesibili. Aceeai reacie se va
obine dac, omind cuvntul cheie public n definiia clasei, se va ncerca referirea din
program a vreuneia dintre funciile membre ale clasei. n acest caz funciile devin inaccesibile
din exterior, dar sunt accesibile din interiorul altor funcii membre ale clasei.
Pentru a nltura confuziile din partea unui programator care citete programul, este indicat
s se foloseasc declaraiile explicite complete. Astfel, definiia:
class calc_vect
{private: vect a,b;
public:
float rezs;
void set_vect(vect,vect);
float prod_scal(void);
} cvect;
class calc_vect
{private: vect a,b;
int jinst;
static int nrinst;
public:
calc_vect(vect=v0,vect=v0);
77
/* membru static */
/* constructor de initializare cu
parametri prestabiliti */
calc_vect(calc_vect& cv);
/* constructor de copiere
a unei instante */
~calc_vect();
/* destructor - numai pentru evidentiere */
calc_vect& copie_vect(calc_vect& cv)
{a=cv.a; b=cv.b; return *this;};
/* copiere cu autoreferire */
void set_vect(vect,vect);
vect suma_vect(void);
void print_vect(vect);
static int nrInstante(void){return nrinst;} /* functia statica */
};
calc_vect::calc_vect(vect v1, vect v2)
{a=v1; b=v2; jinst=++nrinst;
cout << "A fost creata instanta nr=" << jinst << "\n";
}
calc_vect::calc_vect(calc_vect& cv)
{a=cv.a; b=cv.b; jinst=++nrinst;
cout << "A fost creata instanta nr=" << jinst << " prin copiere\n";
}
calc_vect::~calc_vect()
{cout << "Distrugerea instantei " << jinst << ". Apasa o tasta\n";
getch();
}
void calc_vect::set_vect(vect v1,vect v2){a=v1; b=v2;}
vect calc_vect::suma_vect(void)
{vect c; c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; return c;}
void calc_vect::print_vect(vect c)
{cout << "c=(" << c.x << ")i+(" << c.y << ")j+(" << c.z << ")k\n";}
int calc_vect::nrinst=0;
main()
{vect u={-2,0,0}, v={0,3,0}, w;
cout << "Inceput de calcul\n";
calc_vect cvect1;
/*parametrii constructorului sunt omisi */
w=cvect1.suma_vect(); cvect1.print_vect(w);
cout << "Instanta cvect1 este initializata cu vectori nuli\n";
calc_vect cvect2(u,v);
/* se dau parametrii u si v
constructorului */
cvect2.print_vect(cvect2.suma_vect());
cout << "Instanta cvect2 este initializata cu vectori u si v\n";
cvect1.set_vect(u,u);
w=cvect1.suma_vect();
cvect1.print_vect(w);
cout << "Instanta cvect1 este modificata cu vectorii u si u\n";
calc_vect cvect3(cvect1);
/* se creaza copia instantei cvect1
in cvect3 */
w=cvect3.suma_vect();
cvect3.print_vect(w);
78
Trebuie observat i notat regula: constructorul nu returneaz nici o valoare (nici mcar
void) i de aceea definiia funciei constructor nu este precedat de nici un nume de tip.
n exemplul dat, la crearea obiectului cvect1, el este iniializat automat cu valorile vectori a
i b ale clasei egale cu vectorul nul. La crearea obiectului cvect2, deoarece sunt menionai
parametrii u i v de valori definite n funcia main, vectorii a i b primesc aceste valori.
Aceasta se poate vedea din efectul funciilor de scriere pe ecran, print_vect ale obiectelor
create. Ulterior, prin funcia set_vect, sunt schimbate valorile vectorilor a i b ai obiectului
cvect1 la valorile vectorilor u i respectiv v. Pe ecran va apare afiarea:
Inceput de calcul
A fost creata instanta nr=1
c=(0)i+(0)j+(0)k
Instanta cvect1 este initializata cu vectori nuli
A fost creata instanta nr=2
c=(-2)i+(3)j+(0)k
Instanta cvect2 este initializata cu vectorii u si v
c=(-4)i+(0)j+(0)k
Instanta cvect1 este modificata cu vectorii u si u
A fost creata instanta nr=3 prin copiere
c=(-4)i+(0)j+(0)k
Instanta cvect1 este copiata in instanta cvect3
c=(-2)i+(3)j+(0)k
Instanta cvect2 este copiata in instanta cvect3
In acest moment sunt create 3 instante
Distrugerea instantei 3. Apasa o tasta
Distrugerea instantei 2. Apasa o tasta
Distrugerea instantei 1. Apasa o tasta
79
/* creaza o instanta
prestabiliti */
sir1.scrie_sir();
sir_car sir2(10);
cu
ambii
*/
*/
*/
*/
parametri
sir2.scrie_sir();
sir_car sir3(15,'$'); /* creaza instanta sir3 cu 15 caractere $ */
sir3.scrie_sir();
sir_car sir4(sir2); /* copiaza instanta sir2 in noua instanta sir4 */
sir4.scrie_sir();
getch();
}
Programul va afia:
*
**********
$$$$$$$$$$$$$$$
**********
Distrugere. Apasa
Distrugere. Apasa
Distrugere. Apasa
Distrugere. Apasa
o
o
o
o
tasta!
tasta!
tasta!
tasta!
n acest caz destructorul definit explicit prin program, elibereaz prin instruciunea delete
memoria alocat n cadrul instanelor cu instruciunea new. Altfel, prin aciunea unui
destructor creat de compilator, ar fi fost distruse numai instanele nsei, nu ns i memoria
alocat n cadrul lor. Aceasta ar fi rmas n evidena sistemului de operare ca fiind ocupat,
80
dei nefolosit. Dac programul ar fi fost folosit n mod repetat, s-ar fi putut ajunge la un
moment dat la situaia ca ntreaga memorie s fie ocupat i nefolosibil, lucru care nu se
poate remedia dect prin restartarea calculatorului.
3.5.4. Autoreferina unui obiect al clasei. Cuvntul cheie this
Analiznd exemplul anterior se observ c se poate crea o instan copie a alteia prin
intermediul constructorului de copiere, la apelul de creare a instanei. Ce este ns de fcut
dac se dorete copierea unei instane ntr-o alta care a fost deja creat?
n exemplul dat la constructori, a fost definit funcia membru copie_vect care primete ca
parametru o instan existent i returneaz prin intermediul cuvntului cheie this o referin
la instana apelat. Ea modific datele membre ale instanei curente (cea apelat) copiindu-le
pe acelea ale instanei date ca parametru.
Prin aceast metod se spune c obiectul (instana) se autorefer.
Exist o restricie, i anume aceea ca expresia *this s fie folosit numai n funciile
membre ale clasei.
3.5.5. Membrii statici ai clasei
Un membru static este un membru care aparine ntregii clase, deci este comun tuturor
obiectelor (instanelor) clasei respective. Membrii statici, date sau funcii, sunt precedai de
cuvntul cheie static.
n exemplul dat la clasa calc_vect se observ existena variabilei statice nrinst care este
iniializat n afara clasei, deoarece un membru static exist separat de instanele clasei i
poate fi accesat nainte de crearea instanelor. Variabila servete la contorizarea numrului de
instane existente i, datorit introducerii membrului jinst nestatic (deci propriu fiecrei
instane) se poate face numerotarea instanelor.
Funciile membre statice, cum este nrInstante, datorit independenei de existena clasei,
nu poate accesa dect membri statici, n cazul de fa numai pe nrinst. De asemenea, din
acelai motiv, funciile membre statice nu pot returna expresia *this.
3.5.6. Funcii prietene
O funcie prieten a unei clase este o funcie extern clasei respective (ea poate fi membr
a unei alte clase) i creia i este permis accesul la membrii clasei cu care este prieten.
Declararea calitii de funcie prieten a clasei se face n cadrul clasei prin prefixarea
declaraiei funciei cu cuvntul cheie friend. Iat urmtorul exemplu, reluare a exemplului
anterior pentru calcul vectorial:
#include <iostream.h>
#include <conio.h>
struct vect{float x,y,z;};
vect v0={0,0,0};
class calc_vect
{private: vect v;
public:
calc_vect(vect a=v0){v=a;}
calc_vect(calc_vect& cv){v=cv.v;}
friend calc_vect se_substituie_cu(calc_vect& cv);
void suma_vect(calc_vect& a, calc_vect& b);
void print_vect();
};
void calc_vect::suma_vect(calc_vect& a, calc_vect& b)
81
n exemplul dat, a fost definit funcia prieten se_substituie_cu care permite substituirea
vectorului dintr-o instan a clasei calc_vect cu un altul.
Singura diferen dintre o funcie membru i una prieten este aceea c, funcia prieten
fiind extern, nu poate returna expresia *this ca referin la o instan,
3.5.7. Supradefinirea operatorilor
n limbajul C++ operatorii pot fi supradefinii n cadrul claselor, fiind tratai ca funcii
membre sau prietene. Supradefinirea operatorilor este valabil numai n contextul clasei n
care este fcut.
Dintre operatorii care se pot supradefini, se pot meniona urmtorii:
+ - * / % = += -= /= %=
== != < > <= >=
| & || &&
[] ()
'
82
83
/* directive preprocesor */
/* definiii de tipuri */
Primele dou linii din program cer compilatorului s caute n fiierele antet conio.h i
stdio.h prototipurile i definiiile funciilor nedefinite dar apelate n program.
A treia linie definete constanta UNU care va fi substituit peste tot n program prin textul
1 interpretat numeric de ctre compilator.
A patra linie definete tipul intreg (ca denumire substitut pentru tipul int).
Dac n program se folosesc variabile globale (vizibile din interiorul oricrei funcii
definit n fiierul surs) ar trebui s urmeze definiii privind tipul i identificatorii acestor
variabile, ceea ce nu a fost cazul n acest program.
Urneaz apoi definiiile de funcii apelate n program, aici funcia mesaj, i apoi definiia
funciei main care constituie programul principal. Trebuie reamintit faptul c orice funcie apelat
dintr-o alta trebuie s fie precedat, dac nu de definiia ei, mcar de definiia prototipului ei.
Variabila de tip ntreg primul este local, fiind vizibil numai din funcia main, unde este
declarat i iniializat. Tot astfel, variabila de tip ntreg numar, definit n lista de parametri
ai funciei mesaj, este vizibil numai n interiorul acestei funcii.
Efectul execuiei acestui program este afiarea:
Acesta este programul nr.=1
urmat de saltul cursorului la nceputul liniei urmtoare i ateptarea apsrii unei taste.
84
O funcie este prezentat prin prototipul su pentru a preciza tipul parametrilor de intrare i
tipul rezultatului returnat.
Este menionat fiierul antet care trebuie inclus pentru ca funcia s poat fi folosit i,
unde este necesar este fcut o scurt prezentare.
Mai multe detalii pot fi obinute consultnd Help-ul mediului pe care se lucreaz.
4.3.1. Funcii de conversie a datelor
double atof(const char *ir);
math.h
Convertete un ir de caractere numerice scris n formatul:
[spaii] [semn] [parte ntreag] [.[parte zecimal]] [e/E[semn]exponent]
ntr-un numr de tip virgul mobil pe care l returneaz ca rezultat.
int atoi(const char *ir);
math.h
long atol(const char *ir);
math.h
Funciile convertesc un ir de caractere numerice scris n formatul
[spaii] [semn] [cifre]
ntr-un numr de tip ntreg pe care l returneaz ca rezultat.
char *itoa(int valoare, char *ir, int baz)
stdlib.h
char *ltoa(long valoare, char *ir, int baz)
stdlib.h
Funciile convertesc un numr de tip ntreg ntr-n ir de caractere pe care l returneaz ca
rezultat sub forma unui pointer ctre ir. Baza de numeraie este indicat de valoarea baz.
Rezultatul conversiei este utilizabil i prin pointerii *ir.
4.3.2. Funcii matematice
int abs(int valoare)
math.h
long labs(long valoare)
math.h
Funciile returneaz o valoare ntreag absolut a argumentului de tip ntreg valoare.
double acos(double valoare)
math.h
long double acosl(long double valoare)
math.h
Funciile returneaz o valoare de tip real ntre 0 i reprezentnd arcul cosinusului de
argument real dat (valoare) care trebuie s fie cuprins ntre -1 i +1 pentru a nu se obine o
eroare.
double asin(double valoare)
math.h
long double asinl(long double valoare)
math.h
Funciile returneaz o valoare de tip real ntre 0 i reprezentnd arcul sinusului de
argument real dat (valoare) care trebuie s fie cuprins ntre -1 i +1 pentru a nu se obine o
eroare.
double atan(double valoare)
math.h
long double atanl(long double valoare)
math.h
Funciile returneaz o valoare de tip real ntre -/2 i -2 reprezentnd arcul tangentei de
argument real dat (valoare).
double atan2(double a, double b)
math.h
long double atan2l(long double a, long double b)
math.h
Funciile returneaz o valoare de tip real ntre -/2 i -2 reprezentnd arcul tangentei de
argumente reale a/b date.
85
double ceil(double x)
math.h
long double ceil(long double x)
math.h
Funciile returneaz rezultatul de tip real al rotunjirii argumentului real x n sensul creterii
pozitive (de exemplu, -1.0250 este rotunjit la -1.0000).
double cos(double unghi)
math.h
long double cosl(long double unghi)
math.h
Funciile returneaz valorea de tip real situat n intervalul -1...1 a cosinusului unghiului
dat ca valoare de tip real n radiani.
double cosh(double x)
math.h
long double coshl(long double x)
math.h
Funciile returneaz o valoare real reprezentnd cosinusul hiperbolic de argument x real.
div_t div(int numarator, int numitor)
stdlib.h
ldivt_t ldiv(long int numarator, long int numitor)
stdlib.h
Funciile primesc ca argumente valorile de tip ntreg numarator i numitor i returneaz ca
rezultat o structur de tipul div_t sau ldiv_t definite ca:
typedef struct{int quot; int rem} div_t;
typedef struct{long int quot; long int rem} ldiv_t;
unde quot i rem sunt ctul i restul npririi celor dou numere ntregi.
double exp(double x)
math.h
long double expl(long double x)
math.h
Funciile returneaz rezultatul de tip real al funciei exponeniale ex de argument real x.
double fabs(double x);
math.h
long double fabsl(long double x);
math.h
Funciile returneaz valoarea absolut de tip double sau long double a argumentului x.
double floor(double x);
math.h
long double floorl(long double x);
math.h
Funciile returneaz o valoare de tip double sau long double a numrului x rotunjit la valoarea
ntreag ctre sensul negativ al axei numerelor. De exemplu, -3,02 devine -4, iar 5.33 devine 5.
double fmod(double numrtor, double numitor);
math.h
long double fmodl(long double numrtor, long double numitor); math.h
Funciile returneaz valoarea de tip double sau long double a mrimii numrtor modulo
numitor, adic restul npririi numrtorului la numitor, conform relaiei
numrtor=ct*numitor+rest, unde ct este ntreg, iar 0<rest<numitor. Cnd numitorul este
egal cu zero, funciile returneaz zero. Semnul restului este acelai cu semnul numrtorului.
double hypot(double cat1, double cat2);
math.h
long double hypot(long double cat1, long double cat2);
math.h
Funciile returneaz ca rezultat, de tipul double sau long double, lungimea ipotenuzei unui
triunghi dreptunghic de catete cat1 i cat2.
double ldexp(double x, int exp)
long double ldexpl(long double x, int exp)
math.h
math.h
86
Funciile returneaz ca rezultat, de tipul double sau long double, valoarea x*2exp.
double log(double x)
math.h
long double logl(long double x)
math.h
Funciile returneaz ca rezultat, de tip double sau long double, logaritmul natural din
argumentul x, cu condiia ca acesta s fie mai mare dect zero.
double log10(double x)
math.h
long double log10l(long double x)
math.h
Funciile returneaz ca rezultat, de tip double sau long double, logaritmul zecimal din
argumentul x, cu condiia ca acesta s fie mai mare dect zero.
double poly(double x, int grad, double coef[ ]);
math.h
long double polyl(long double x, int grad, long double coef[ ]);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, valoarea unui polinom de
gradul grad, care are coeficienii coef[0], coef[1],...,coef[grad], polinomul avnd forma:
coef[grad]*xgrad+coef[grad-1]*xgrad-1+...+coef[0]*x0
double pow(double baza, double exp);
math.h
long double powl(long double baza, long double exp);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, valoarea bazaexp.
double pow10(double exp);
math.h
long double pow10l(long double exp);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, valoarea 10exp.
double sinh(double x);
math.h
long double sinhl(long double x);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, valoarea (ex-e-x)/2.
double sqrt(double x);
math.h
long double sqrtl(long double x);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, rdcina ptrat a
argumentului x, cu condiia ca x s fie pozitiv.
double tan(double arc);
math.h
long double tanl(long double arc);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, tangenta arcului arc
exprimat n radiani.
double tanh(double x);
math.h
long double tanhl(long double x);
math.h
Funciile returneaz ca rezultat, de tip double sau long double, tangenta hiperbolic a argumentului x.
4.3.3. Funcii de intrare/ieire ale consolei
Din mulimea de funcii de intrare/ieire ale consolei (tastatur i ecran), au fost selectate
cteva mai frecvent folosite, referite de fiierul antet conio.h.
4.3.3.1. Funcii de intrare de la tastatur
char *cgets(char *sir);
conio.h
Funcia citete un ir de caractere de la consol. nainte de a apela funcia, sir[0] trebuie
87
fcut s conin numrul maxim de caractere citibile, inclusiv caracterul terminator de ir \0.
Dup apelarea funciei, introducerea irului de la tastatur i apsarea tastei ENTER, sir[1]
conine numrul de caractere citite, iar de la sir[2] ncepe irul de caractere introdus de la
tastatur. Lungimea total a tabloului sir este sir[0]+2. Rezultatul returnat de funcie este un
pointer ctre sir[2].
int getch(void);
conio.h
Funcia preia un caracter de la tastatur i l returneaz ca rezultat de tip ntreg.
int getche(void);
conio.h
Funcia preia un caracter de la tastatur i l returneaz ca rezultat de tip ntreg. n acelai
timp, ca ecou, afieaz caracterul preluat.
4.3.3.2. Funcii de acces la ecranul text
void clrscr(void);
conio.h
Funcia terge ecranul i plaseaz cursorul n poziia iniial (1,1) a ecranului aflat n
modul de afiare text.
void delline(void);
conio.h
Funcia terge toat linia pe care se afl cursorul i mut toate liniile inferioare n sus cu o poziie.
void gotoxy(int x, int y)
conio.h
Funcia poziioneaz cursorul text pe linia y n coloana x. Parametrii x i z sunt ntregi
reprezentnd coordonate n fereastra text curent i sunt diferite de zero.
void insline(void);
conio.h
Funcia insereaz o linie vid n linia pe care se afl cursorul. Toate liniile preexistente,
ncepnd de la linia cursorului sunt npinse n jos cu o poziie. Dac ultima linie de jos se afla
chiar la baza ecranului, ea este eliminat.
int gettext(int colstg, int randsus, int coldr, int randjos, void *stocdest); conio.h
int puttext(int colstg, int randsus, int coldr, int randjos, void *stocsurs); conio.h
Funciile gettext i puttext preiau/aduc de pe/pe ecran toate caracterele aflate n
dreptunghiul de coordonate colstg-coloan stnga, randsus-rnd de sus, coldr-coloan dreapta,
randjos-rndul de jos. Caracterele sunt duse la/aduse din o zon tampon de memorie
stocdest/stocsurs a crui lungime se calculeaz cu formula:
lungime=2*(coldr-colstg+1)*(randjos-randsus+1)
Valorile returnate sunt diferite de zero dac operaiile au decurs cu succes i zero n caz
contrar.
void textbackground(int culfond);
conio.h
void textcolor(int cultext);
conio.h
Funciile selecteaz culoarea pentru fondul textului i culoarea textului propriu-zis cu care
se vor face afirile ulterioare. Culorile se selecteaz din tabela urmtoare:
Constanta
simbolic
BLACK
BLUE
Valoare
textbackground
textcolor
0
1
Da
Da
Da
Da
88
Constanta
simbolic
GREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
BLINK
Valoare
textbackground
textcolor
2
3
4
5
6
7
8
9
10
11
12
13
14
15
128
Da
Da
Da
Da
Da
Da
Nu
Nu
Nu
Nu
Nu
Nu
Nu
Nu
Nu
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Da
Valoarea BLINK face textul s clipeasc dac este adunat la valoarea culorii pentru text.
De exemplu textcolor(BLINK+BLUE) face ca afirile ulterioare de text s fie fcute cu
albastru i s clipeasc.
int wherex(void)
conio.h
int wherey(void)
conio.h
Funciile returneaz o valoare ntreag reprezentnd poziia unde se afl cursorul text pe
direcia x (numrul coloanei) sau pe direcia y (numrul rndului), n momentul apelului
funciei.
void window(int colstg, int randsus, int coldr, int randjos)
conio.h
Funcia definete fereastra text curent, n coordonate ecran, unde colstg este indicele
coloanei din stnga, coldr este indicele coloanei din dreapta, iar randsus i randjos sunt indicii
rndurilor de sus i de jos care definesc noua fereastr text. Dac coordonatele sunt greite,
funcia nu are efect. Mrimea implicit este ecranul ntreg cu coordonatele 1,1,C,R, unde C i
R sunt numrul de coloane i de rnduri ale modului text curent. Dup declararea noii ferestre,
toate funciile care lucreaz cu coordonate de fereastr text se raporteaz la colul din stnga
sus al noii ferestre, considerat a fi de coordonate (1,1).
4.3.4. Funcii de intrare/ieire standard
n acest subcapitol sunt descrise sumar cteva dintre cele mai folosite funcii din fiierul
stdio.h care deservesc intrrile/ieirile standard predefinite stdin - dispozitivul de intrare
standard i stdout - dispozitivul de ieire standard, precum i lucrul cu fiiere.
4.3.4.1. Intrri/ieiri standard
int getchar(void)
stdio.h
Funcia ateapt introducerea unui ir de caractere de la tastatur, pn la apsarea tastei
ENTER.
Rezultatul returnat de funcie este numai primul caracter din irul introdus.
89
90
X
f
e
E
g
G
c
s
91
92
93
este pointerul ctre fiierul deschis pentru citire cu funcia fopen. Blocul de memorie de
stocare trebuie s aib lungimea de minimum lung*nart octei. Valoarea returnat de funcie
este numrul efectiv de articole citite. n caz de eroare sau de ntlnire a sfritului de fiier,
este returnat zero.
int fwrite(void *ptr, size_t lung, size_t nart, FILE *fisier);
stdio.h
Semnificaia parametrilor formali i a valorii returnate este aceeai ca la funcia fread cu
deosebirea c, de aceast dat, este vorba de o operaie de scriere.
int feof(FILE *fisier);
stdio.h
Funcia are ca parametru pointerul ctre fiierul deschis pentru citire cu funcia fopen.
Funcia testeaz dac operaia anterioar de citire din fiier a atins sfritul acestuia i, n acest
caz, returneaz o valoare non zero, sau zero n caz contrar. Returnarea valorii non zero are loc
pn cnd fiierul este redeschis (cu rewind) sau nchis.
int fseek(FILE *fisier, long depl, int reper);
stdio.h
Primul parametru este un pointer ctre fiierul deschis cu funcia fopen. Parametrul depl reprezint
un deplasament n raport cu parametrul reper care poate avea valorile din tabelul urmtor:
Constanta simbolic
SEEK_SET
SEEK_CUR
SEEK_END
Valoarea numeric
0
1
2
Locaia n fiier
nceputul fiierului
Poziia curent n fiier
Sfritul fiierului
Funcia returneaz zero dac repoziionarea afost posibil, i nonzero n caz de eec. n caz
de eec, variabila global errno poate avea una dintre valorile: EBADF - pointer de fiier
greit, EINVAL - argument incorect.
De exemplu, programul:
#include <stdio.h>
#include <conio.h>
main()
{FILE *frd; int i=11; char car;
frd=fopen("HEXAZEC.FIS","r");
fseek(frd,i,SEEK_SET); car=fgetc(frd);
printf("Al %i-lea caracter din fisier este: %c\n",i,car);
fclose(frd); getch();
}
94
unde: lime este numrul de caractere de citit, iar h, l i L sunt modificatori de tip cu
semnificaiile:
h - short int;
l - long int dac tip specific conversia la ntreg;
l - double dac tip specific conversia la virgul mobil;
L - long double, valabil numai pentru conversia la virgul mobil;
tip este specificatorul de tip la care se face conversia caracterelor citite.
Observaie: funcia ncheie citirea nainte de a citi numrul de caractere egal cu lime,
dac ntlnete un spaiu sau un caracter neconvertibil.
Valoarea returnat de funcie este numrul de cmpuri citite, convertite i stocate, eventual
0, i EOF la atingerea sfritului de fiier.
De exemplu, programul:
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{FILE *fwr,*frd; float valcit;
char numfis[]="VALPI.DAT"; char sirscr[]="pi=", sircit[10];
fwr=fopen(numfis,"w");
fprintf(fwr,"%s %7.4f",sirscr,M_PI); fclose(fwr);
frd=fopen(numfis,"r"); fscanf(frd,"%s%f",&sircit,&valcit);
printf("S-au citit: %s si %f\n",sircit,valcit);
fclose(frd); getch();
}
creaz fiierul VALPI.DAT n care scrie irul pi= 3.1416 i l nchide. Fiierul este deschis
din nou, de data aceasta pentru citire, este citit irul de caractere i valoarea i, nainte de a
nchide fiierul din nou, este fcut afiarea:
S-au citit: pi= si 3.141600
Valoarea returnat este 0 n caz desucces sau -1 n caz de eec, cnd variabila global errno
va fi setat pe una dintre valorile: EACCES i ENOENT descrise la funcia remove, sau
ENOTSAM - inexistena dispozitivului indicat.
95
96
97
va produce afiarea:
Directorul curent initial este: \TCLITE\BIN
Acum directorul curent este: \
Revenire la directorul initial: \TCLITE\BIN
int getdisk(void);
dir.h
Funcia returneaz un numr ntreg reprezentnd dispozitivul curent: 0 pentru A, 1 pentru
B, 2 pentru C, etc.
int setdisk(int dispozitiv);
dir.h
Funcia stabilete ca dispozitiv curent unul asociat cu valorile: 0 pentru A, 1 pentru B, 2
pentru C, etc, i returneaz numrul total al dispozitivelor disponibile.
4.3.8. Funcii de alocare a memoriei
Funciile descrise n acest paragraf sunt referite prin intermediul fiierelor antet alloc.h sau
malloc.h.
void *calloc(size_t nrart, size_t mrime);
alloc.h sau malloc.h
Funcia aloc un spaiu (bloc) de nrart*mrime octei n memoria de baz. Blocul nu
poate depi 64K. Parametrul nrart reprezint numrul de articole iar mrime este lungimea
n octei a unui articol.
98
Valoarea returnat este un pointer ctre blocul de memorie alocat, sau NULL dac nu a
fost gsit suficient spaiu pentru alocarea blocului, sau dac unul dintre parametrii nrart sau
mrime este egal cu 0.
void *malloc(size_t mrime);
alloc.h sau malloc.h
Funcia este similar cu calloc dar are un singur parametru reprezentnd mrimea total a
blocului de memorie de alocat. Valoarea returnat este un pointer ctre blocul de memorie
alocat, sau NULL dac nu a fost gsit suficient spaiu pentru alocarea blocului, sau dac
parametrul mrime este egal cu 0.
void *realloc(void *bloc, size_t mrime);
alloc.h sau malloc.h
Funcia realoc memoria de baz, restrngnd sau extinznd blocul reprezentat prin
argumentul bloc care puncteaz ctre o zon de memorie alocat anterior cu calloc, malloc
sau realloc, la o nou mrime. Dac mrime este zero, blocul de memorie este eliberat i se
returneaz NULL. Dac bloc este un pointer NULL, funcia realloc lucreaz exact la fel ca
malloc. Mrimea blocului de realocat este ajustat la noua mrime prin copierea coninutului
la o nou adres, dac este necesar.
Valoarea returnat este adresa blocului realocat care poate fi diferit de adresa iniial a
blocului. Dac blocul nu poate fi realocat, se returneaz NULL.
void free(void *bloc);
alloc.h sau malloc.h
Funcia elibereaz spaiul de memorie alocat anterior pentru bloc cu o funcie calloc,
malloc sau realloc.
void far *farcalloc(unsigned long nrart, unsigned long mrime); alloc.h sau malloc.h
Funcia se aseamn cu calloc dar lucreaz cu memoria ndeprtat. Ea poate folosi toat
memoria RAM disponibil i poate aloca blocuri mai mari de 64K. Pentru a accesa zona de
memorie alocat este necesar s se foloseasc pointeri far sau, dac blocurile alocate sunt mai
mari de 64K, pointeri huge.
Valoarea returnat este un pointer de tip far ctre blocul de memorie alocat sau NULL
dac nu exist spaiu suficient.
void far *farmalloc(unsigned long mrime);
alloc.h sau malloc.h
Funcia este asemntoare cu farcalloc dar are un un singur parametru reprezentnd mrimea
total a blocului de memorie de alocat. Valoarea returnat este un pointer de tip far ctre blocul de
memorie alocat, sau NULL dac nu a fost gsit suficient spaiu pentru alocarea blocului.
void farfree(void far *bloc);
alloc.h sau malloc.h
Funcia elibereaz spaiul de memorie alocat anterior pentru bloc cu o funcie farcalloc
sau farmalloc.
4.3.9. Funcii grafice DOS
Funciile descrise n acest paragraf sunt referite prin intermediul fiierului graphics.h i,
fiind utilizabile numai sub DOS, nu sunt portabile pe WINDOWS
void far arc(int xc, int yc, int ung_init, int ung_final, int raza);
graphics.h
Funcia deseneaz un arc de cerc centrat n punctul (xc,yc), cu raza dat i care ncepe de
la unghiul ung_init i se termin la ung_final, unghiurile fiind msurate n concordan cu
convenia trigonometric. Culoarea de desenare este cea curent. Stilul de linie nu afecteaz
trasarea arcului, ci numai grosimea.
99
void far bar(int stnga, int sus, int dreapta, int jos);
graphics.h
Funcia deseneaz o band plin rectangular bidimensional. Umplerea benzii se face cu
culoarea i modelul de umplere curente. Conturul benzii nu este evideniat. Pentru
evidenierea conturului benzii se folosete funcia bar3d cu grosimea egal cu zero. Parametrii
stnga i sus reprezint coordonatele x,y ale colului din stnga-sus, iar dreapta i jos
reprezint coordonatele x,y ale colului din dreapta-jos ale benzii.
void far bar3d(int stnga, int sus, int dreapta, int jos, int gros, int plafon); graphics.h
Funcia deseneaz o bar plin rectangular tridimensional. Umplerea barei se face cu
culoarea i modelul de umplere curente. Conturul barei nu este desenat cu stilul de linie i
culoarea curente. Parametrii stnga i sus reprezint coordonatele x,y ale colului din stnga-sus,
iar dreapta i jos reprezint coordonatele x,y ale colului din dreapta-jos ale barei. Profunzimea
barei este dat de parametrul gros. Parametrul plafon stabilete dac plafonul barei este desenat
(valoare nonzero) sau nu (valoare zero), permind desenarea de bare supraetajate.
void far circle(int xc, int yc, int raza);
graphics.h
Funcia deseneaz un cerc centrat n punctul (xc,yc), cu raza dat. Culoarea de desenare
este cea curent. Stilul de linie nu afecteaz trasarea cercului, ci numai grosimea.
void far cleardevice(void);
graphics.h
Funcia terge (adic umple cu culoarea fondului) ntregul ecran i mut poziia curent n
punctul (0,0).
void far clearviewport(void);
graphics.h
Funcia terge un port de vedere i mut poziia curent n punctul (0,0) relativ la portul de
vedere curent.
void far drawpoly(int nrnoduri, int far *defnod);
graphics.h
Funcia deseneaz un poligon cu numrul de noduri dat de parametrul nrnoduri, folosind
culoarea i stilul de linie curente. Parametrul *defnod puncteaz ctre o secven de ntregi n
numr de 2*nrnoduri, ordonat pe perechi de coordonate x,y ntregi, exprimate n pixeli,
reprezentnd coordonatele nodurilor poligonului. Pentru a desena o figur nchis cu n noduri
trebuie ca nrnoduri=n+1, astfel nct ultima pereche de coordonate s fie identic cu prima.
void far ellipse(int xc, int yc, int ung_init, int ung_final, int a, int b);
graphics.h
Funcia deseneaz o elips cu culoarea curent de desenare, avnd centrul n punctul xc,yc,
iar semiaxele orizontal i vertical de mrime a i b. Elipsa este desenat de la unghiul de
nceput ung_init pn la unghiul de sfrit ung_final. Dac ung_init este 0 iar ung_final este
360, elipsa este complet. Stilul de linie nu afecteaz trasarea cercului, ci numai grosimea.
void far fillellipse(int xc, int yc, int a, int b);
graphics.h
Funcia deseneaz o elips cu centrul n xc,yc, cu semiaxele orizontal i vertical a i b, i
o umple cu culoarea i modelul curente.
void far fillpoly(int nrnoduri, int far *defnod);
graphics.h
Funcia lucreaz la fel ca drawpoly dar poligonul generat este umplut cu culoarea i
modelul curente.
void getarccoords(struct arccoordstype far *coordarc);
graphics.h
Funcia completeaz structura arccoordstype punctat de pointerul coordarc, cu
100
informaia obinut la ultimul apel al funciei arc. Structura arccoordstype este definit n
fiierul graphics.h astfel:
struct arccoordstype{int x,y; int xstart, ystart, xend, yend;};
Membrii acestei structuri specific centrul arcului (x i y), punctul de nceput (xstart i
ystart) i punctul de sfrit (xend i yend).
void getaspectratio(int far *aspx, int far *aspy);
graphics.h
Funcia extrage valorile aspx i aspy care reprezint factorii de aspect ai pixelilor. La
standardul VGA, unde pixelii sunt ptrai, aspx=aspy=10000, ns, n general, relaia dintre
cele dou valori este aspy=10000, aspx<=10000.
int far getbkcolor(void);
graphics.h
Funcia returneaz culoarea curent a fondului (pentru detalii a se vedea setbkcolor).
int far getcolor(void);
Funcia returneaz culoarea curent de desenare a entitilor grafice lineare.
graphics.h
Valoare
0
1
2
3
4
5
6
7
8
9
10
11
12
Model de umplere
culoarea fondului
umplere solid
haurare orizontal
haurare subire la 45 dreapta
haurare groas la 45 dreapta
haurare subire la 45 stnga
haurare groas la 45 stnga
haurare rar
haurare ncruciat deas
linii ntreesute
puncte rare
puncte dese
model definit de utilizator
void far getimage(int stnga, int sus, int dreapta, int jos, void far *bitmap); graphics.h
Funcia copiaz o imagine de pe ecran n memorie. Parametrii stnga, sus, dreapta i jos
definesc zona dreptunghiular de pe ecran care va fi copiat. Parametrul bitmap puncteaz
101
ctre o zon de memorie unde imaginea este memorat. Primii doi octei ai acestei zone sunt
folosii pentru lungimea i limea ferestrei, iar ceilali pentru stocarea imaginii.
void far getlinesettings(struct linesettingstype far *infolin);
graphics.h
Funcia completeaz structura linesettingstype, punctat de parametrul infolin, cu
informaia despre stilul liniei curente, modelul curent i grosimea curent. Structura
linesettingstype este definit n fiierul graphics.h, astfel:
struct linesettingstype{int linestyle; unsigned upattern; int thickness;};
Membrul linestyle specific tipul de linie cu care se vor desena liniile n continuare.
Stilurile de linie sunt urmtoarele:
Nume
SOLID_LINE
DOTTED_LINE
CENTER_LINE
DASHED_LINE
USERBIT_LINE
Valoare
0
1
2
3
4
Model de umplere
linie continu
linie punctat
linie-punct
linie ntrerupt
linie definit de utilizator
Valoare
1
3
Limea n pxeli
1 pixel
3 pixeli
Membrul upattern este un model pe 16 bii care este aplicat numai dac stilul de linie
(linestyle) este USERBIT_LINE. n acest caz, cnd un bit al modelului este 1, pixelul
corespunztor din linie este desenat cu culoarea curent. Dac linestyle nu este
USERBIT_LINE, dei parametrul upattern este ignorat, el trebuie totui s fie furnizat.
int far getmaxx(void);
graphics.h
int far getmaxy(void);
graphics.h
Cele dou funcii returneaz valorile maxime ale coordonatelor x i y alr ecranului curent
pentru dispozitivul grafic i modul grafic curente. Valorile sunt returnate n coordonate ecran.
unsigned far getpixel(int xpix, int ypix);
graphics.h
Parametrii xpix i ypix sunt coordonatele unui pixel. Funcia returneaz o valoare ntreag
fr semn reprezentnd culoarea pixelului.
void far gettextsettings(struct textsettingstype far *infotiptext);
graphics.h
Funcia completeaz structura textsettingstype, punctat de parametrul infotiptext, cu
informaia despre fontul curent al caracterelor, direcia, mrimea i alinierea lor. Structura
textsettingstype este definit n fiierul graphics.h astfel:
struct textsettingstype{int font; int direction; int charsize; int horiz; int vert;};
A se vedea funcia settextstyle pentru descrierea unora dintre membrii structurii.
void far getviewsettings(struct viewporttype far *portvedere);
graphics.h
Funcia completeaz structura viewporttype, punctat de parametrul portvedere, cu
informaia despre portul de vedere curent. Structura viewporttype este definit n fiierul
graphics.h astfel:
102
struct viewporttype {int left; int top; int right; int bottom; int clip;};
Membrii left, top, right i bottom sunt limitele stnga, sus, dreapta i jos ale portului de
vedere, iar clip, dac este nonzero, semnific decuparea tuturor desenelor la limitele portului
de vedere.
int far getx(void);
graphics.h
int far gety(void);
graphics.h
Funciile returneaz coordonatele x i y ale poziiei curente, n valori relative la portul de
vedere curent.
unsigned far imagesize(int stanga, int sus, int dreapta, int jos);
graphics;
Funcia determin i returneaz mrimea zonei de memorie necesar pentru stocarea unei
imagini cuprins ntr-un dreptunghi avnd limitele stnga, sus, dreapta i jos. Dac mrimea
zonei de memorie necesar stocrii imaginii este mai mare sau egal cu 64K-1, funcia
returneaz valoarea 0xFFFF (-1).
void initgraph(int far *dispgraf, int far *modgraf, char far *cale);
graphics.h
Funcia iniializeaz sistemul grafic prin ncrcarea de pe disc a unui dispozitiv grafic logic
specificat prin dispgraf i trecnd sistemul n modul grafic specificat prin modgraf. Funcia
poate folosi un dispozitiv grafic i un mod grafic anume, specificate, sau poate executa
aciunea prin autodetecie. De asemenea, initgraph reseteaz toate setrile grafice la valorile
lor implicite (poziie curent, palet de culori, porturi de vedere, etc) i reseteaz funcia
graphresult la zero. n mod normal, initgraph ncarc dispozitivul grafic alocnd memorie
pentru el, apoi ncarc fiierul corespunztor cu extensia .BGI de pe disc. Parametrul cale
specific calea spre directorul unde initgraph caut dispozitivele. Iniial initgraph caut pe
calea specificat de cale apoi, dac nu gsete acolo, caut n directorul curent. Cnd cale este
nul fiierul dispozitiv (*.BGI) trebuie s se afle n directorul curent.
Parametrul dispgraf poate avea diferite valori. Multe dintre ele reprezint diferite versiuni
de dispozitive grafice depite de evoluia tehnologic. Ele pot fi aflate consultnd help-ul
mediului de programare C n care se lucreaz. Cel mai frecvent este folosit valoarea
DETECT (0) care produce autodetecia. Dac este folosit valoarea DETECT pentru
dispgraf, valoarea modgraf nu mai are importan, modul grafic fiind stabilit prin
autodetecie.
Funcia nu returneaz valoare dar, prin efect lateral, seteaz codul intern de eroare (care
poate fi determinat cu funcia graphresult) la una din valorile:
grOK
0
Iniializare desfurat cu succes
grNotDetected
-2
Nu se poate detecta placa grafic
grFileNotFound -3
Nu poate fi gsit fiierul dispozitivului grafic logic
grInvalidDriver
-4
Dispozitiv grafic logic invalid
grNoLoadMem
-5
Memorie insuficient pentru ncrcarea dispozitivului
int far graphresult(void);
graphics.h
Funcia returneaz codul de eroare pentru ultima ultima operaie grafic euat i
restabilete nivelul de eroare la valoarea grOK. Codurile de eroare returnate sunt definite n
graphics.h i pot fi consultate prin help-ul mediului de programare C.
char far *grapherrormsg(int coderoare);
graphics.h
Funcia primete argumentul coderoare obinut anterior cu graphresult, i returneaz un
pointer ctre un ir de caractere mesaj de eroare.
103
graphics.h
104
Valoare
0
1
2
3
4
Descriere
Copiere
SAU exclusiv
SAU inclusiv
I
Copierea inversului sursei
0
1
2
3
Nume simb.
BLACK
BLUE
GREEN
CYAN
Val.
Nume simb.
Val.
Nume simb.
Val.
Nume simb.
4
5
6
7
RED
MAGENTA
BROWN
LIGHTGRAY
8
9
10
11
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
12
13
14
15
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
105
predefinit. Parametrul modelutil puncteaz ctre o secven de 8 octei, n care fiecrui octet
i corespund 8 pixeli din model. Pentru fiecare bit din modelutil egal cu 1, este desenat un
pixel corespunztor de pe ecran.
void setlinestyle(int stillinie, unsigned modelutil, int grosime);
graphics.h
Funcia stabilete stilul tuturor liniilor desenate cu funciile line, lineto, rectangle,
drawpoly, etc.
Parametrii stillinie i grosime necesare pentru a defini stilul i grosimea de linie cu care se
lucreaz, sunt cele definite la funcia getlinesettings. Modelul de desenare modelutil trebuie
s fie furnizat, dei el este luat n considerare numai dac stillinie are valoarea
USERBIT_LINE. Dac se introduce un parametru invalid, funcia nu are efect, iar funcia
graphresult va returna codul de eroare grError= -11.
void far settextjustify(int alinoriz, int alinvert);
graphics.h
Funcia stabilete modul de aliniere al textului. Parametrul alinoriz determin alinierea pe
orizontal iar alinvert stabilete alinierea pe vertical, n raport cu un centru de aliniere
considerat n poziia grafic curent. n mod implicit, iniial alinierea orizontal este
LEFT_TEXT iar cea vertical este TOP_TEXT. Valorile predefinite n fiierul graphics.h ale
parametrilor alinoriz i alinvert sunt cele din tabelul de mai jos:
Parametru
alinoriz
alinvert
Nume simbolic
LEFT_TEXT
CENTER_TEXT
RIGHT_TEXT
BOTTOM_TEXT
CENTER_TEXT
TOP_TEXT
Valoare
0
1
2
0
1
2
Aciune
text aliniat la stnga
text centrat pe orizontal
text aliniat la dreapta
text aliniat la baz
text centrat pe vertical
text aliniat la vrf
Valoare
0
1
2
3
4
5
Constanta simbolic
pentru font
SIMPLEX_FONT
TRIPLEX_SCR_FONT
COMPLEX_FONT
EUROPEAN_FONT
BOLD_FONT
-
Valoare
6
7
8
9
10
-
106
Valoare
0
1
Descriere
Scriere de la stnga la dreapta
Scriere de jos n sus
107
UC
RAM
HDD
Mrime variabil
Sistem de operare
Resurse
comune
Aplicaie executabil
Resurse specifice
(proprii)
Schimb de comenzi
Schimb de date
108
incluse n setul de module ale aplicaiei i care execut funcii specifice, proprii numai
aplicaiai respective. Tot n aceast categorie intr o serie de fiiere de date sau care descriu
obiecte grafice de interaciune cum sunt cutiile de dialog, meniurile, cursoarele, etc.
- Resurse comune. Acestea sunt module de program executabile existente n sistemul de
operare i lansate n lucru de ctre sistemul de operare la cererea aplicaiei sau ca urmare a
unei decizii a sistemului de operare n urma apariiei unui eveniment tratabil de ctre sistem.
De exemplu, o serie de fiiere cu extensia .dll (dynamic link library bibliotec cu legare
dinamic) pot fi module de program ale sistemului Windows, dar i resurse proprii ale
aplicaiei. Tot n aceast categorie intr o serie de cutii de dialog standard cum sunt cele de tip
Open sau Save, folosite la deschiderea sau la salvarea fiierelor.
Tendina recomandat este de a se folosi pe ct posibil resurse comune, gestionate de ctre
sistemul de operare. Aceasta asigur pe de o parte robusteea funcionrii sistemului n
ansamblu, mpreun cu aplicaiile, dar i economicitatea muncii de programare a aplicaiilor
efort mai mic i fiiere executabile de dimensiuni mai mici.
Fig.5.2.1.
Fig.5.2.2.
Fig.5.2.3.
Aciunea sarcinilor secveniale se poate descrie ca un ir de sarcini S1, S2, , Sn, figura
5.2.1, care trebuie ndeplinite n ordine pentru a realiza sarcina global Sg. n aceast situaie
109
Fig.5.2.4.
Fig.5.2.5.
Aciunea sarcinilor concurente. Conform figurii 5.2.4 sarcinile S1, S2, , Sn pot fi
ndeplinite n orice ordine pentru a realiza sarcina global Sg, nainte de a se trece la realizarea
sarcinii ulterioare Sn+1.
De exemplu, pentru un segment de linie deja desenat, al crui aspect trebuie modificat i
care trebuie apoi s fie copiat, este indiferent ordinea de aplicare a operaiilor indicate n
figura 5.2.5 pentru modificarea aspectului.
Privite deci sub aspectul interdependenei aciunilor de efectuat, n programarea aplicaiilor
n general i a aplicaiilor grafice n particular, se desprind evolutiv dou tehnici de
programare i de utilizare i anume:
- Tehnica unitasking;
- Tehnica multitasking.
5.2.2. Tehnica unitasking
Tehnica unitasking semnific n principal efectuarea unei lucrri care are n vedere o
sarcin unic din punctul de vedere al finalitii lucrrii respective. Procesul de lucru cu
calculatorul avnd un aspect dual, pe de o parte din punctul de vedere al programatorului i,
pe de alt parte din punctul de vedere al utilizatorului, problemele care caracterizeaz
unitaskingul pot fi privite de pe cele dou poziii.
Din punctul de vedere al programatorului, scrierea unui program de tip unitasking este
caracteristic programelor sistemului vechi de operare DOS, dar i unor module de program
din WINDOWS, i presupune acapararea total a resurselor mainii i controlul total al
acesteia de ctre programul sau modulul de program n curs de execuie. Pentru a se trece la
un alt program sau modul de program, sistemul trebuie s atepte recptarea controlului, deci
terminarea complet a execuiei sarcinii curente.
Din punctul de vedere al utilizatorului, unitaskingul este caracteristic efecturii unei sarcini
care condiioneaz total trecerea la execuia sarcinii urmtoare.
Din ambele puncte de vedere, toate aplicaiile complexe compuse dintr-un numr mare de
sarcini de acest fel necesit secvenializarea execuiei.
n consecin, pot fi evideniate urmtoarele sisteme de module de aciune (de program sau
de a operaii efectuate de utilizator), fiecare modul rezolvnd o anumit sarcin:
a. Structura liniar:
n figura 5.2.6 semnificaia notaiilor este urmtoarea: Mi, i=1,2,,n sunt module de
110
program sau de aciune, Fj, j=1,2,,n-1 sunt fiiere de date. Aa cum se observ, un fiier de
date Fk este rezultatul aciunii unui modul Mk, coninnd datele rezultate din acesta i necesare
unui modul ulterior, cruia i servesc ca date de intrare sau necesare n timpul lucrului.
Fig.5.2.6.
Fig.5.2.7.
Ca exemplu, o lucrare de tehnoredactare efectuat cu un procesor de text i grafic
complex, aa cum este programul WORD, poate necesita n cadrul documentului
tehnoredactat o serie de imagini care trebuie pregtite de alte programe. n figura 5.2.7 este
ilustrat o astfel de situaie.
Generarea imaginii se poate face cu ajutorul unui program de sintez de imagine, cel mai
cunoscut exemplu fiind acela al programului 3D Studio, sau pot fi obinute din scanarea unor
fotografii sau preluate de la o camer video digital.
Prelucrarea imaginii n Corel Photo Paint poate fi necesar pentru a introduce o serie de
efecte grafice speciale.
Tehnoredactarea n Word plaseaz imaginea n cadrul textului documentului, eventual o
scaleaz pentru a permite o bun ncadrare a ei i o coreleaz cu explicaiile din text.
Fig.5.2.8.
b. Structura inelar:
Dac rezultatul final al ultimului modul de aciune (sau de program) necesit ajustri care
impun reluarea de la nceput sau dintr-o anumit faz anterioar a lanului de aciuni, modulul
decizional Reluare, figura 5.2.8 poate decide reluarea ciclului.
Ca exemplu, dac n urma parcurgerii lanului de operaii necesare tehnoredactrii
documentului din exemplul anterior se constat nevoia unor retuuri sau modificri ale
imaginii care necesit reluarea procesului de lucru cu Corel Photo Paint, schema de aciune ar
putea fi cea din figura 5.2.9.
111
Fig.5.2.9.
c. Structura subordonat inelar (supervizat):
Acest tip de structur apare n cadrul unor lucrri mai complexe la care sarcinile de lucru
sunt de naturi diferite i efectuarea uneia sau a alteia dintre ele este decis pe baza unui
complex de condiii diverse.
n general, acest tip de structur poate fi sintetizat prin schema din figura 5.2.10.
Fig.5.2.10.
n cadrul acestei scheme exist un modul supervizor S al crui rol este realizarea
direcionrii execuiei ctre unul dintre modulele supervizate si, i=1,2,,n.
Direcionarea controlului se poate face:
- n cazul controlului programat, pe baza unor criterii de validare a calitii rezolvrii
(obinerea unui anumit efect sau precizie de rezolvare);
- n cazul controlului aciunilor utilizatorului, la cererea acestuia prin autoevaluarea
rezultatelor obinute.
De exemplu, la realizarea unei cri, album, sau pliant publicitar, redactorul n calitate de
factor supervizor, coordoneaz tipurile de lucrri care concureaz la elaborarea crii,
conform schemei din figura 5.2.11.
Fig.5.2.11.
112
d. Structuri combinate.
n funcie de situaiile practice concrete se poate concepe orice combinaie sau ncuibare pe
un anumit numr de nivele a structurilor de la punctele a, b, sau c, prezentate anterior.
5.2.3. Tehnica multitasking
Multitaskingul nseamn posibilitatea unui sistem de a efectua mai multe sarcini care i
mpart ntre ele resursele sistemului. n funcie de resursele pe care le posed sistemul
multitaskingul poate fi organizat diferit.
Resursa critic a sistemului este microprocesorul.
Dac sistemul are un singur microprocesor nu se poate folosi dect multitaskingul
secvenial. n aceast manier de lucru, diferitele sarcini i mpart ntre ele memoria
disponibil n sistem dar capt pe rnd accesul la microprocesorul unic. Aceasta nseamn
c, la un moment dat, numai o singur sarcin (aplicaie) este activ, celelalte fiind
suspendate (nregistrate n memoria disponibil) n starea n care se gseau cnd a survenit
ordinul de suspendare.
Dac sistemul are mai multe procesoare, se pot desfura concomitent un numr de sarcini
cel mult egal cu numrul de procesoare, rezultnd un multitasking simultan sau paralel.
Cu rare excepii, pentru nevoile utilizatorului obinuit, multitaskingul secvenial este
suficient, n ultimul timp el fiind mbuntit cu unele perfecionri legate de lucrul n
subteran (background) care desfoar automat unele activiti de transfer de date la periferice
de ieire (imprimant sau plotter), activiti care nu necesit intervenie i care pot folosi
pauzele de aciune ale utilizatorului. Astfel, dei secvenial, multitaskingul poate prea la
nivelul de precepie temporal al utilizatorului c ar fi paralel.
Fig.5.3.1.
Un program scris numai cu acest gen de instruciuni se numete program D-structurat,
litera D provenind de la Dijkstra, cel care a introdus conceptul de programare structurat.
Dei aceasta a nsemnat o revoluie n programare, i a rezolvat problema organizrii
eficiente a lucrului n nteriorul echipei de programatori, ea nu a rezolvat problema
comunicaiei dintre analist i programatori.
113
Fig.5.3.2.
Fig.5.3.3.
114
Fig. 5.3.5.
Pentru utilizatorul avansat care dorete s scrie programe care fac uz de entiti grafice care
reprezint obiecte din universul problemei, nu este necesar cunoaterea mecanismelor interne
de lucru ale obiectului ci numai denumirile proprietilor i metodelor obiectului. Acestea,
sunt de regul accesibile prin intermediul unor limbaje de programare orientate spre obiecte,
implementate n mediile de dezvoltare de aplicaii incluse n programele aplicative moderne.
Astfel, MicroSoft pune la dispoziia utilizatorilor de produse din pachetul Office un dialect de
Visual BASIC comun tuturor aplicaiilor din acest pachet, fiecare program din pachet avnd
diferite numai obiectele specifice aplicaiei.
Apelul proprietilor i metodelor obiectelor grafice se face folosind apelative a cror
denumire apare de forma obiect.proprietate i, respectiv, obiect.metod.
Obiectele la rndul lor se pot clasifica n obiecte recipient i obiecte coninute, un obiect
coninut putnd s fie, la rndul su, obiect recipient pentru alte obiecte.
Evenimente i mesaje
Un eveniment este o schimbare a strii sistemului. De exemplu:
- mutarea pe ecran a unei ferestre;
- nchiderea unei ferestre;
- acionarea unui meniu;
- apsarea unei taste;
- micarea mouse-ului;
- apsarea unui buton al mouse-ului;
- etc.
Cnd are loc un eveniment, este emis un mesaj. Mesajul este un tip de dat special care
este generat de ctre obiectul asociat cu evenimentul produs.
Mesajul este receptat mai nti de ctre sistem care l plaseaz ntr-o structur de date
denumit "coad de mesaje". Plasarea n coada de mesaje poate fi normal sau prioritar
(mesajul sare peste rnd).
115
Sistemul preia mesajele din coad n ordinea plasrii lor, le analizeaz i le transmite mai
departe obiectelor crora le sunt destinate. Acestea le trateaz conform semnificaiei lor,
genernd efecte sau alte evenimente.
Interaciunea obiectelor
O dat cu lansarea platformelor WINDOWS, s-a generalizat tehnica utilizrii obiectelor.
Deoarece sistemul de operare WINDOWS este un sistem de interfaare grafic cu
utilizatorul (GUI Graphic User Interface), toate elementele unei aplicaii au un corespondent
grafic n fereastra de lucru. Aceste entiti grafice sunt obiecte care interacioneaz aparent cu
utilizatorul prezent n mediul de lucru i cu sistemul de operare care supravegheaz
desfurarea ntregului proces de interaciune, ca n figura 17, proces dependent de caracterul
universului problemei i de configuraia mediului de lucru.
Mediul de lucru este complexul constituit din dispozitivele periferice prin care utilizatorul
interacioneaz cu universul problemei, modulele de program care deservesc aceste periferice
i programul aplicativ care solicit accesul la resursele sistemului.
n acest complex de componente, mediul de lucru genereaz evenimente pe care un anumit
obiect care este subiectul unui astfel de eveniment le transform n mesaje pe care le transmite
sistemului de operare. La nivelul sistemului de operare, mesajele se dispun ntr-o coad de
mesaje, n ordinea sosirii lor. Un analizor de mesaje asigur gestiunea cozii de mesaje
transmindu-le sistemului n ordinea lor normal. Unele dintre evenimente sunt prioritare (de
exemplu un clic pe fereastra altei aplicaii n vederea transferului controlului la aceasta este un
eveniment care, n funcie de tipul aplicaiilor concurente, poate genera un mesaj prioritar).
Astfel de mesaje sar peste rnd fiind trimise de ctre analizorul de mesaje imediat ctre
blocul de tratare a mesajelor. De aici, mesajele sunt interpretate de ctre sistem i, dac ele
conin cereri de natur s fie rezolvate de ctre sistem, sunt ndeplinite de ctre acesta. Dac
mesajele se adreseaz altor obiecte, sunt direcionate ctre obiectele destinaie.
O dat ajunse la obiectul destinaie, mesajele genereaz aciuni care acioneaz asupra
mediului de lucru, producnd din partea acestuia reacii care constituie alte evenimente.
Astfel, n mod indirect, sub controlul sistemului de operare, obiectele comunic ntre ele i
colaboreaz la ndeplinirea unor sarcini complexe.
116
Editor de text
Compilator
Editor de text
Editor de legturi
Interpretor
Depanator
117
118
119
Fig.6.2.1.
Saltul major realizat de dialectele de Visual BASIC actuale este acela de a fi gndit ca un
limbaj de programare orientat pe obiecte. Aceasta face din el un concurent serios pentru
mediile de dezvoltare de aplicaii care permit dezvoltarea aplicaiilor fie n Visual Basic, fie n
C++. Adeseori, i n special utilizatorii cu mai puine, sau de loc, cunotine de programare
avansat, ceea ce este cazul majoritii, prefer limbajul visual BASIC, mai ales dac aplicaia
nu este critic sub aspectul vitezei de lucru.
120
n EXCEL, se definete ca obiect orice entitate controlabil prin limbajul Visual BASIC.
Orice element constitutiv al mediului EXCEL este un obiect. De asemenea, orice construcie
care folosete elemente EXCEL poate deveni un obiect.
Definirea obiectelor se face prin intermediul limbajului Visual BASIC iar manevrarea lor
se face prin intermediul procedurilor din Visual BASIC.
Obiectele EXCEL sunt grupate ntr-o ierarhie, structurat n recipiente i colecii.
Un recipient este un obiect care conine alte obiecte.
O colecie este o grupare de obiecte de acelai tip.
O metacolecie este o grupare de obiecte de mai mult dect un singur tip, aa cum sunt
obiectele desenate (DrawingObjects).
De exemplu, structura general a obiectelor din EXCEL este cea din figura 6.2.1.
6.2.1. Utilizarea obiectelor
Obiectele se caracterizeaz prin:
- proprieti, care descriu aspectul, starea sau comportarea lor. De exemplu, pentru
obiectul Workbook, cteva dintre cele mai semnificative proprieti sunt:
= Name, indicnd numele documentului;
= Precision As Displayed, indicnd modul de considerare a preciziei calculelor
conform modului de afiare a valorilor numerice n celule;
= Read Only, indicnd protecia documentului mpotriva modificrilor;
= Saved, indicnd starea de salvare a documentului, etc.
- metode, care reprezint aciunile pe care obiectele le pot efectua. De exemplu, pentru
obiectul Worksheet, sunt disponibile o serie de aciuni printre care se afl:
= Activate, reprezentnd aciunea de activare a unei foi de lucru;
= Copy, reprezentnd aciunea de a copia o ntreag foaie de lucru;
= Move, reprezentnd aciunea de a muta o foaie de lucru n alt poziie n
succesiunea foilor;
= Protect, reprezentnd aciunea de a proteja o foaie de lucru mpotriva modificrii;
= Select, reprezentnd aciunea de a selecta o foaie de lucru n vederea unor operaii
ulterioare, etc.
6.2.2. Variabile obiect
O variabil obiect este o variabil asociat unui anumit tip (sau clas) de obiect i care adreseaz un
obiect EXCEL anumit. Pentru a fi folosit, o variabil obiect trebuie mai nti s se fac declararea
folosind una din instruciunile Dim, Public, Private, Static sau ReDim i preciznd obiectul asociat.
Folosind instruciunea Dim, un obiect poate fi declarat n trei moduri:
Dim nume_obiect declar variabila nume_obiect de tipul Variant, cel mai general tip de
dat din EXCEL, tip care poate fi i un obiect;
Dim nume_obiect As Object
declar variabila nume_obiect de tipul Object, adic
obiect general care, ulterior poate particulariza orice obiect real;
Dim nume_obiect As obiect_concret declar explicit variabila nume_obiect ca obiect
de un anumit tip.
De exemplu:
Dim ObiectA As Object, ObiectB As Object declar variabilele ObiectA i ObiectB ca
fiind de tipul general Object, iar
Dim domeniuA As Range declar variabila domeniuA ca avnd tipul domeniu de celule.
O variabil obiect trebuie s refere un obiect existent. Asocierea variabilei cu obiectul
referit se face prin instruciunea Set, cu sintaxa:
Set nume_obiect = expresie_obiect
sau:
121
Adreseaz
Aplicaia care a creat obiectul
Celula activ
Diagrama activ
Foaia de dialog n lucru
Foaia de lucru activ
Fereastra activ
Mapa (documentul Excel) activ
Foaia sau celula urmtoare
Obiectul printe al obiectului specificat
Foaia sau celula anterioar
Mapa n care se execut procedura curent
De exemplu, procedura:
Sub Nume_foaie()
Dim celula As Range
Set celula = Worksheets("Sheet1").Range("A1")
celula.Value = ActiveSheet.Name
End Sub
va afia n celula A1 din foaia de lucru Sheet1 numele foii de lucru active n momentul
execuiei procedurii.
6.2.4. Adresarea obiectelor
Pentru adresarea obiectelor, Visual BASIC permite utilizarea a trei sintaxe:
identificator![nume_obiect]
identificator("nume_obiect")
identificator(indice)
unde:
identificator poate fi numele coleciei care conine obiectul, sau numele unui
obiect a crui colecie implicit conine obiectul;
nume_obiect este numele obiectului adresat (eventual n forma ir)
indice este numrul de ordine al obiectului vizat, n colecia din care face
parte.
Astfel, de exemplu, dac n procedura de mai sus se nlocuiete ultima instruciune cu
celula.Value = Application.Worksheets(2).Name
n celula A1 din foaia de lucru Sheet1 va fi afiat numele celei de a doua foi de lucru din
document.
122
va produce colorarea n rou a celului E1 (rndul 1 coloana 5) din prima foaie a documentului.
- Preluarea unei valori a unei proprieti (operaie de citire) se realizeaz cu sintaxa:
variabil=obiect.proprietate
unde
variabil este numele variabilei carea preia valoarea proprietii obiectului.
Exemplul anterior ar putea fi rescris ca:
Sub Coloreaza()
culoare=ActiveWorkbook.Worksheets(1).Cells(1, _
5).Interior.ColorIndex
ActiveWorkbook.Worksheets(1).Cells(2, _
5).Interior.ColorIndex=culoare
End Sub
i, n acest caz, celula E2, ce de sub E1, va primi culoarea preluat de variabila culoare de la
proprietatea ColorIndex a obiectului interior de celul E1.
Observaie: dei, n general sunt posibile ambele tipuri de operaii totui, proprietile
anumitor obiecte sunt de tipul read-only (citibile numai) astfel nct asupra acestor proprieti
se pot efectua numai aciuni de citire.
6.2.6. Activarea obiectelor
n afar de proprieti, obiectele posed metode. Metodele reprezint modul n care
informaia este tratat de obiecte, sau aciunile pe care aceste ale pot efectua i n urma crora
proprietile obiectelor sunt afectate.
Din punct de vedere formal, spre deosebire de proprieti care pot cpta o singur valoare,
metodele pot primi mai multe argumente, deoarece ele sunt de fapt funcii. Pot fi ntlnite
urmtoarele situaii, aceleai ca i la apelul unei funcii oarecare:
a. Metoda nu primete nici un argument. n acest caz se folosete sintaxa:
obiect.metod
De exemplu, instruciunea:
Application.Worksheets("Sheet1").Range("1:1").Delete
123
folosete operatorul de asignare := pentru a specifica foaia Sheet3 drept argument after. n
acest caz, foaia Sheet1 va fi mutat dup foaia Sheet3.
monetar
dat calendaristic
ir de caractere
Double
Currency
Date
String
Memorie
2 octei
2 octei
4 octei
4 octei
Domeniu de valori
True sau False
-32768...32767
-2147483648... 2147483647
-3.402823E38...-1.401298E-45 (val. negative)
1.401298E-45... 3.402823E38 (val. pozitive)
8 octei
-1.79769313486232E308...4.94065645841247E-324 (valori negative)
4.94065645841247E-324...
1.79769313486232E308 (valori pozitive)
8 octei
-922337203685477.5808...
922337203685477.5807
8 octei
1 Ianuarie 100...31 Decembrie 9999
1 octet/caracter 0...~2000000000
Identificator
Object
Variant
Definit
de
utilizator
Conform
definiiei
Tablou
Conform
definiiei
Memorie
4 octei
16 octei + 1
octet/caracter
numrul de
octei cerut de
elemente
ct este necesar
Domeniu de valori
Orice referin la un obiect
Orice valoare numeric sau text
Domeniul
component
fiecrui
element
124
obiectele EXCEL i pot fi reconoscute prin prefixele xl, vb sau db ataate numelui lor. De
exemplu: vbOK, vbCancel, vbNo,...etc.
- constante definite de utilizator, cu sintaxa:
[Public | Private] Const NUME_CONSTANTA [As nume_tip] = expresie
unde: Public sau Private determin domeniul de vizibilitate al constantei. n mod
implicit domeniul de vizibilitate al constantelor este Private;
Const este cuvntul cheie pentru declararea unei constante;
NUME_CONSTANTA este identificatorul constantei. El se formeaz, ca orice
nume de variabil, conform conveniilor Visual BASIC-ului (a se vedea mai jos)
dar, prin convenie, se scrie cu majuscule;
nume_tip este declaratorul de tip i este opional;
expresie este o expresie aritmetic sau logic a crei valoare este atribuit
constantei. Ea nu poate conine variabile, funcii, sau operatorii Is sau &.
Observaie: constantele definite n proceduri sunt locale, adic au vizibilitate numai n
interiorul procedurilor unde sunt definite.
Exemple de declaraii de constante:
Const ZECE As Integer = 10
Const ENAT As Single = 2.7182
Const NUME As String = "Geta"
6.4.2. Variabile
Variabilele sunt acele valori care pot fi modificate n timpul execuiei. Ele se declar cu
sintaxa:
[Public | Private | Static | Dim] nume_variabila [As nume_tip][,...]
unde:
Public sau Private determin domeniul de vizibilitate al variabilelor;
Static se refer la durata de via a variabilelor;
Dim se folosete pentru definirea variabilei si alocarea spaiului de stocare.
Dim este n special folosit pentru tablouri;
nume_tip este unul din numele de tipuri de date prezentate mai nainte. Dac
nume_tip este omis, tipul atribuit implicit este Variant;
nume_variabila trebuie scris conform urmtoarelor reguli valabile n Visual
BASIC:
- primul caracter trebuie s fie o liter;
- numele trebuie s conin numai litere, cifre i caracterul de subliniere "_";
- nu se admit caractere de punctuaie sau spaii;
- nu se face distincie ntre majuscule sau litere mici;
- lungimea maxim a numelui este de 255 de caractere;
- ca nume nu pot fi folosite cuvinte cheie ale limbajului Visual BASIC;
- numele trebuie s fie unice.
Exemple de declaraii de variabile:
Dim ValoareA, ValoareB
' ValoareA i ValoareB sunt declarate ca fiind implicit
' de tipul Variant i sunt iniializate cu valoarea Empty
Dim Indice As Integer
' Indice este declarat ca ntreg
Dim NumReal As Single
' NumReal este declarat ca numr de tip real simpl
' precizie
n cazul variabilelor de tip ir declaraia implicit este:
Dim SirCar As String
ceea ce comunic interpretorului de Visual BASIC s deschid o zon de memorie cu
lungime variabil dinamic, pentru stocarea irului.
125
126
De exemplu:
Redim Preserve TabDinamic(15) As Object
va pstra valorile anterioare ale tabloului, adugnd la ele alte 5 noi elemente iniializate cu
valoarea Nothing.
Variabilele Variant, sunt variabilele cu tipul cel mai general. Dac, la declarare, unei
variabile nu i se specific tipul, ea capt automat tipul Variant.
Tipul Variant poate memora orice alt tip de date (cu excepia tipurilor de date definite de
utilizator).
Tipul efectiv al unei variabile variant este tipul ultimei valori atribuite.
Variabila de tip Variant poate memora i tipurile de informaii speciale, ca:
- valoarea Empty - semnificnd valoarea unei variabile Variant nainte de prima atribuire;
- valoarea Null - adic valoare necunoscut sau valoare lips.
6.4.3. Vizibilitatea constantelor i variabilelor
Domeniul de vizibilitate al unei variabile este zona de program n cadrul creia este
recunoscut numele variabilei, i este definit prin cuvintele cheie Private i Public.
Domeniul de vizibilitate implicit este Private. Aceasta nseamn c, n lipsa altei specificri, o
constant sau variabil este vizibil local, n cuprinsul procedurii n care a fost declarat.
Dac se dorete ca unele variabile sau constante s fie vizibile peste tot, n toate modulele,
acestea se declar n afara oricrei proceduri, n zona de declaraii a oricrui modul de
programe, ca de exemplu:
Public Matrice(5,6) As Double
n consecin, dou sau mai multe variabile pot avea acelai nume dac au domenii de
vizibilitate diferite.
6.4.4. Durata de via variabilelor
Durata de via a unei variabile este timpul ct ea este memorat i, deci, accesibil. Din
acest punct de vedere se deosebesc trei categorii de variabile:
- Variabile permanente care pstreaz valoarea memorat pe toat durata execuiei
Visual BASIC. Acestea sunt variabilele declarate cu declaraia Public;
- Variabile temporare care sunt declarate n cuprinsul procedurilor (deci de tip Private) i
nu sunt memorate dect pe durata execuiei unei proceduri. Cnd procedura este apelat,
respectivele variabile sunt iniializate i folosite, iar la terminarea execuiei ele sunt "uitate",
adic spaiul de memorie alocat lor este eliberat;
- Variabilele statice sunt acelea declarate cu declaraia Static. Aceste variabile i
pstreaz valorile de la o execuie la alta a procedurilor, att timp ct modulul este n execuie.
De exemplu:
Function Functia1(x As Single)
Static y As Single
...
End Function
pstreaz valorile tuturor variabilelor locale ale funciei Functia2, de la o execuie la alta.
127
6.6. Expresii
Expresiile sunt construcii care produc o valoare n urma unui proces de evaluare (proces
de calcul, manevrare a unui caracter, testare a unor date).
O expresie este alctuit din operanzi i operatori, i produce o valoare de un anumit tip.
Operanzii sunt elemente asupra crora acioneaz operatorii. La rndul lor, operanzii pot fi
expresii.
Operatorii indic modul cum se face combinarea operanzilor, adic operaiile care pot fi
efectuate.
Exist urmtoarele tipuri de operatori:
+
*
/
^
\
Mod
Operatori aritmetici
adunare
scdere
nmulire
nprire
ridicare la putere
nprire ntreag
Modulo (restul npririi)
<
>
=
<=
>=
<>
Is
Operatori relaionali
mai mic dect
mai mare dect
egal
mai mic sau egal
mai mare sau egal
diferit
Echivalen
128
&
Like
Operator
And
Eqv
Imp
Semnificaie
i
echivalen
implicaie
Not
Or
Xor
Nu
SAU
SAU exclusiv
Operatori logici
Rezultatul evalurii
True dac ambii operanzi sunt True, altfel False
True dac ambii operanzi au aceeai valoare, altfel False
True, cu excepia cazurilor cnd primul operand este True iar
al doilea False
True dac operandul este False, False dac operandul este True
True dac cel puin un operand este True, altfel False
True dac numai un operand este True, altfel False
129
poate fi executat fr erori, iar celula A1 din foaia de lucru Sheet1 va afia valoarea 500, n
timp ce, modificnd instruciunea a 2-a prin:
C1 = "100 Kg"
preia irul de text din celula A1 i, dac acesta este convertibil numeric, afieaz dedesubt,
adic n celula A2, valoarea numeric multiplicat cu 5. Dac nu este posibil conversia la
tipul numeric, este afiat o cutie de dialog cu mesajul Tip greit!
n general, funciile de test de tip au forma:
IsTest_de_tip(valoare)
unde Test_de_tip este un nume generic care indic tipul sau subtipul de date testat (de
exemplu: Array, Empty, Null, etc).
6.7.2. Conversia de tip explicit
Dac se dorete specificarea tipului de dat la care s se fac conversia, se procedeaz
astfel:
a. Se testeaz mai nti dac valoarea de convertit are tipul adecvat conversiei, folosinr
funcia de test de tip IsTest_de_tip(valoare);
b. Dac rezultatul testului este True se face conversia folosind funcia de conversie de tip,
cu forma general:
CTip_nou(valoare)
unde Tip_nou indic tipul de date la care se face conversia (de exemplu: Sng pentru
conversia la tipul Single, Dbl pentru conversia la tipul Double, Lng pentru conversia la tipul
Long, etc).
De exemplu:
Sub conv_date()
Dim C1 As Integer
C1 = 100
If IsNumeric(C1) Then
Application.Worksheets("Sheet1").Cells(1, 1) = CVar(C1)
Else rasp = MsgBox("Tip gresit!", vbOKOnly, "Avertisment")
End If
End Sub
convertete valoarea variabilei C1 n valoare de tip variant numei dac valoarea este de tip
numeric, i o transfer celulei A1 din foaia de lucru Sheet1.
130
modific aspectul celulei A1 din foaia Sheet1, printr-o secven de instruciuni With
ncuibate.
c. Alte tipuri de instruciuni, pot fi apeluri de proceduri, apeluri de funcii, instruciuni de
decizie, etc., care vor fi discutate mai trziu.
Un enun se poate fi scris prin extindere pe mai multe linii folosind caracterul secvena
identificatoare de ntrerupere compus din caracterul spaiu urmat imediat de caracterul de
subliniere, cu sintaxa:
enun _
continuareenun
De exemplu:
Application.Worksheets("Sheet1").Cells(1, 5) _
= Application.Worksheets("Sheet1").Cells(2, 5)
6.9. Comentarii
Acolo unde se simte nevoia scrierii unor texte nsoitoare, cu simplul scop de adnotare, i
care nu trebuie luate n considerare de interpretorul Visual BASIC, se poate folosi marcatorul
de nceput de comentariu, cu sintaxa:
131
[enun]
'comentariu
unde:
enun este un enun Visual BASIC oarecare;
comentariu este un text oarecare scris de utilizator dup dorin
Apariia caracterului apostrof comunic interpretorului s ignore tot restul liniei.
De exemplu:
a=255
'atribuie lui a valoarea intreaga 255
Din vechiul dialect BASIC, este recunoscut i forma:
Rem comentariu
unde
Rem , este cuvntul cheie care face ca ntreaga linie s fie ignorat de interpretor.
6.10. Proceduri
Procedurile sunt module de program Visual BASIC.
Procedurile sunt de dou tipuri: subrutine i funcii.
6.10.1. Subrutine
O subrutin este un modul de program (procedur) care efectueaz aciuni n baza unei
liste de parametri.
Definirea unei subrutine se face cu sintaxa:
[Private | Public] [Static] Sub nume_subrutin ([list_de_parametri])
[secven_de_instruciuni]
[Exit Sub]
[secven_de_instruciuni]
End Sub
unde:
Private se folosete pentru acele proceduri care trebuie s fie vizibile numai pentru
procedurile aflate mpreun cu ele n aceeai foaie de modul n care se face definiia;
Public se folosete pentru a face procedura vizibil de ctre toate procedurile
din toate modulele;
Static se folosete pentru a pstra valorile variabilelor locale (interne
procedurii) de la un apel la altul;
nume_subrutin este numele procedurii de tip subrutin;
list_de_parametri este lista parametrilor formali (separai prin virgule)
reprezentnd numele variabilelor care recepioneaz valorile datelor de intrare
(transmise la apelul procedurii).
Observaie: numele Public este implicit pentru proceduri.
Exemplu de definire de subrutine:
Sub Calcul_cerc(ByVal Raza As Single)
Dim Arie As Double, Perimetru As Double
If Raza < 0 Then
MsgBox ("Raza gresita")
Exit Sub
End If
Arie = 3.1415 * Raza ^ 2
Perimetru = 6.283 * Raza
Application.Worksheets("Sheet1").Cells(2, 1) = Arie
Application.Worksheets("Sheet1").Cells(3, 1) = Perimetru
End Sub
Sub Tratare_cerc()
Calcul_cerc (Application.Worksheets("Sheet1").Cells(1, 1))
End Sub
132
Scriind o valoare n celula A1 din foaia Sheet1 i apelnd apoi subrutina Tratare_cerc, valoarea
din celula A1 este transmis ca parametru subrutinei Calcul_cerc. Dac aceast valoare este
negativ este afiat o cutie de dialog cu un mesaj de avertizare i execuia se ncheie. n caz
contrar celula A2 primete valoarea ariei cercului iar celula A3 pe aceea a perimetrului lui.
6.10.2. Functii
O funcie este un modul de program (procedur) care primete o list de parametri i, pe
lng posibila efectuare a unor aciuni, returneaz un rezultat.
Definirea unei funcii se face cu sintaxa:
[Private | Public] [Static] Function nume_funcie ([list_de_parametri]) [As nume_tip]
[secven_de_instruciuni]
[nume_funcie=expresie1]
[Exit Function]
[secven_de_instruciuni]
[nume_funcie=expresie2]
End Function
unde: Private, Public i Static au acelai rol ca la definiia subrutinei;
nume_funcie este numele procedurii de tip funcie;
list_de_parametri este lista parametrilor formali (separai prin virgule) reprezentnd
numele variabilelor care recepioneaz valorile datelor de intrare (transmise la apelul procedurii).
nume_tip se folosete cnd funcia returneaz o valoare de un anumit tip.
n cazul listei de parametri, dac tipurile lor nu sunt specificate, Visual BASIC i consider
n mod implicit ca fiind de tipul Variant. Pentru a declara explicit alte tipuri de date ale
parametrilor, se folosete sintaxa:
[Optional][ByVal | ByRef][ParamArray] nume_parametru [As nume_tip]
unde: Optional indic un parametru opional i oblig ca toi parametrii care urmeaz s fie de
asemenea opionali i de tip Variant. Aceast declaraie nu se folosete mpreun cu ParamArray;
ParamArray se folosete numai la sfritul listei de parametri pentru a indica faptul
c ultimul parametru este un tablou opional i de tip Variant. Astfel se pot declara liste cu
numr de parametri arbitrar. Nu se folosete mpreun cu Optional, ByVal sau ByRef;
ByVal precizeaz c parametrii primesc argumente prin valoare. n acest caz, modificarea
valorilor parametrilor n procedur are efect local, adic nu conduce la modificarea valorii
argumentului n procedura apelant, deoarece parametrul din procedura apelat este o copie.
ByRef produce preluarea argumentului de ctre parametru ca referin (adres de
memorie). n acest fel, att parametrul din procedura apelat ct i argumentul din procedura
apelant puncteaz la aceeai adres de memorie i, ca urmare, orice modificare a valorii lui
n procedura apelat se reflect i n procedura apelant.
nume_parametru este numele parametrului;
nume_tip este tipul de dat al parametrului.
De exemplu:
Function Arie_patrat(ByVal Latura As Double) As Double
If Latura < 0 Then
MsgBox ("Latura incorecta!")
Exit Function
End If
Arie_patrat = Latura ^ 2
End Function
133
134
135
va produce colorarea unai matrice de 5X4 celule, fiecare celul cu o alt culoare.
136
va produce un efect similar cu cel din exemplul anterior, dar asupra unor celule selectate
anterior apelului procedurii.
6.12.6. Structura repetitiv condiionat anterior
Aceast structur are sintaxa:
Do [While | Until] condiie
[secven_S1]
[Exit Do]
[secven_S2]
Loop
unde: While, cu semnificaia ct timp, se asociaz cu condiie True;
Until, cu semnificaia pn cnd, se asociaz cu condiie False;
Exit Do produce abandonarea ciclului;
Loop marcheaz sfritul ciclului.
Modul de aciune al ciclului este urmtorul:
- este evaluat condiie i este testat;
- dac:
= pentru While, condiie=False, sau
= pentru Until, condiie=True
ciclul este ncheiat, controlul fiind transferat primei instruciuni de dup instruciunea
Loop;
- altfel, ciclul este reluat.
137
produce completarea celulelor A1 pn la A10 din foaia de lucru Sheet1 cu numerele 1...10
6.12.7. Structura repetitiv condiionat posterior
Aceast structur are sintaxa:
Do
[secven_S1]
[Exit Do]
[secven_S2]
Loop [While | Until] condiie
Semnificaiile elementelor folosite sunt aceleai, dar testarea condiiei are loc la nivelul
instruciunii Loop. De aceea, pe cnd la structura repetitiv condiionat anterior execuia
secvenelor de instruciuni poate s nu aib loc nici o dat, dac condiie nu este de la nceput
valabil, la structura repetitiv condiionat posterior execuia secvenelor va avea loc cel
puin o dat.
6.12.8. Instruciunea de salt
Instruciunea de salt GoTo este o reminiscen a perioadei anterioare introducerii noiunilor
de ingineria programrii i de programare structurat i de aceea folosirea ei nu este
recomandat. Sintaxa ei este:
On expresie GoTo list_de_etichete
unde:
expresie este o expresie a crei evaluare produce un rezultat numeric ntre 0 i 255;
list_de_etichete este o list cu etichete de instruciuni de forma:
etichet1, etichet2,..., etichetn
Etichetele de instruciuni au forma:
etichet:
Modul de aciune al instruciunii este urmtorul:
- se evalueaz expresie;
- dac valoarea lui expresie este 0 sau mai mare dect numrul de elemente ale listei, nu se
obine nici un efect;
- dac valoarea lui expresie este negativ sau mai mare dect 255 se obine o eroare;
- dac valoarea lui expresie se ncadreaz n intervalul 1...255, controlul execuiei este
transferat la instruciunea a crei etichet are, n list_de_etichete poziia de indice egal cu
valoarea lui expresie.
- transferul controlului este definitiv.
Instruciunea GoTo are varianta simplificat:
GoTo etichet
ceea ce produce saltul necondiionat la instruciunea cu eticheta specificat.
138
6.13. Pseudoprocedura
Pseudoprocedura este o secven de instruciuni care ncepe de la o etichet i se termin
cu o instruciune Return. Sintaxa saltului la pseudoprocedur este:
On expresie GoSub list_de_etichete
Mecanismul de aciune este acelai ca la instruciunea On GoTo, cu deosebirea c, la
ntlnirea instruciunii Return, controlul execuiei este transferat la prima instruciune de dup
linia On GoSub.
Varianta simplificat a acestei instruciuni este:
GoSub etichet
i este o reminiscen a versiunilor de limbaj BASIC vechi, nestructurate.
139
140
Fig.7.2.1.
Totui, se nate ntrebarea cum se rezolv problemele care in strict de natura dispozitivului
fizic? Aceasta este o sarcin care cade n seama sistemului de operare care, prelund datele
adresate prin intermediul dispozitivului logic le convertete n comenzile necesare lucrului cu
dispozitivul fizic, folosind un program special, aa numit "driver de intrare", figura 7.2.1.
Alteori, este necesar s existe alternative de accesare a intrrilor, iar programul s poat
accesa un dispozitiv fizic sau altul prin intermediul unor dispozitive logice diferite.
Astfel, o serie de programe de tip CAD pot comanda cursorul grafic de desenare-localizare
a entitilor pe ecran folosind fie micarea mouse-ului, fie micarea dispozitivului de urmrire
al tabletei grafice, fie apsarea tastelor sgei ale tastaturii. Sau, n cazul editoarelor de text
cum este WORD, defilarea n jos sau n sus a paginilor se poate face cu tastele Page Down
sau Page Up sau prin intermediul barei de defilare vertical acionat cu ajutorul mouse-ului.
Din aceste motive, standardele grafice GKS (Graphic Kernel System) i PHIGS
(Programmer's Hierarchical Graphical System) definesc ase clase de dispozitive logice de
intrare, i anume:
7.2.1.1. LOCATOR
Dispozitivul LOCATOR este un subprogram care citete o poziie de la un echipament de
intrare i o furnizeaz (o pune la dispoziie) programului ca valoare exprimat ntr-un sistem de
coordonate logice (de exemplu poziia cursorului grafic pe ecran). Poziiile pot fi determinate cu
mouse-ul, joy-stick-ul, tableta grafic sau folosind tastatura cu simboluri sgei.
Acest tip de dispozitiv este folosit cnd, de exemplu, ntr-un program de grafic se cere
desenarea unui segment de dreapt sau a unei polilinii introducnd succesiv punctele nodurilor.
7.2.1.2. STROKE
Acest tip de dispozitiv are acelai rol cu dispozitivul LOCATOR, dar pune la dispoziie un
set de poziii.
Astfel, dac se cere desenarea unui poligon regulat (triunghi, ptrat, pentagon, etc) setul de
puncte care definesc poziiile nodurilor pot fi introduse printr-o singur comand care
apeleaz dispozitivul STROKE.
141
7.2.1.3. VALUATOR
Acest dispozitiv se folosete pentru introducerea unei valori reale care se poate folosi ca:
- factor de scalare;
- unghi de rotire;
- grad de luminozitate (brightness) al unei imagini;
- grad de contrast al unei imagini;
- etc.
Valorile pot fi introduse fie specificnd valoarea dorit a parametrului, fie acionnd un
poteniometru desenat pe ecran, ca n figura 7.2.2, n care se prezint o parte din cutia de
dialog Format Object din WORD.
Fig.7.2.2.
7.2.1.4. CHOICE
Fig.7.2.3 a.
Fig.7.2.3 b.
Fig.7.2.3 c
Dispozitivul logic CHOICE este folosit la selectarea unei opiuni dintr-o list. Valoarea returnat
de subprogramul dispozitiv logic este un numr care reprezint indicele din list al articolului.
Cnd lista este afiat pe ecran, alegerea se poate face folosind mouse-ul sau defilarea cu tastele
sgei, iar selectarea se poate face prin punctare cu mouse-ul sau prin apsarea tastei ENTER.
n figurile 7.2.3 a, b i c sunt prezentate diferite forme de interfaare prin dispozitiv de tip
CHOICE, acestea fiind un meniul scris Help, lista derulant Font i, respectiv paleta de culori
Shading Color, toate extrase de pe bara de instrumente Formatting din programul WORD.
7.2.1.5. PICK
n aplicaiile grafice evoluate, elementele grafice pot fi grupate (asociate n cadrul unor
submulimi ierarhizate pe nivele). n funcie de nevoile lui utilizatorul poate selecta un grup
sau altul pentru a-l manipula sau pentru a-l modifica. Selectarea se face prin punctare cu
cursorul grafic pe ecran, tehnica curent fiind prin clic cu mouse-ul aplicat pe elementul grafic
dorit. n urma acestei aciuni programul dispozitiv logic PICK returneaz identificatorul
142
elementului grafic punctat, identificatorul grupului din care face parte i o informaie de stare
privind succesul sau insuccesul operaiei.
Insuccesul operaiei poate surveni ca urmare a unei punctri
necorespunztoare, fie n afara elementului grafic fie ntre
dou elemente grafice nvecinate. Dac se puncteaz ntr-o arie
n care se suprapun mai multe elemente grafice, dispozitivul
logic PICK returneaz identificatorul celui mai apropiat
element grafic i anume ultimul afiat. De exemplu, n figura
4, a fost aplicat un clic pentru selectare ntr-un punct n care
conturul dreptunghiului i cel al elipsei se suprapun. Ca urmare
Fig.7.2.4.
a fost selectat cel mai recent desenat element dintre cele dou
i anume elipsa, afiarea fcndu-se n ordinea desenrii dac
nu au fost aplicate comenzi de schimbare a ordinii de afiare.
7.2.1.6. STRING
Dispozitivul logic STRING este destinat furnizrii de iruri de caractere care n aplicaiile
grafice nsoesc reprezentrile grafice. Acest dispozitiv este exploatat prin intermediul tastaturii.
7.2.2. Modurile de operare ale dispozitivelor logice de intrare
Interaciunea dintre programul de aplicaie i echipamentele de intrare se poate realiza n
mai multe moduri. Astfel, datele de intrare pot fi introduse:
- la cererea programului;
PICK
STRING
- la intervenia operatorului, situaie n care programul ateapt
terminarea introducerii datelor dup care i continu execuia.
Sistemele GKS i PHIGS opereaz cu cele ase clase de
dispozitive logice n urmtoarele trei moduri:
7.2.2.1. Modul Cerere
n aceast modalitate de lucru programul solicit
efectuarea unei operaii i trece n ateptare pn cnd, prin
intervenia operatorului, dispozitivul logic apelat produce o
PICK
dat de intrare. n acest mod de lucru, programul controleaz
Fig.7.2.5.
n ntregime dialogul.
De exemplu, o cutie de dialog care cere introducerea unei
valori este un grup grafic compus din dispozitive logice de tipurile indicate n figura 7.2.5.
Programul nu permite utilizatorului s acceseze alte resurse pn cnd nu apas asupra
unuia dintre butoanele care sunt controlate de dispozitivele logice de tip PICK. Mai mult,
dac rezultatul returnat de dispozitivul logic STRING (cmpul de editare Valoare:) nu este
corect ca format (aceasta depinde de interpretarea valorii introduse de ctre un etaj de validare
coninut n dispozitivul logic STRING), programul poate afia o cutie de dialog cu un mesaj
de eroare i se poate formula o cerere nou pn la satisfacerea ei n mod corect.
7.2.2.2. Modul Eantionare
n cadrul acestui mod de operare al unui dispozitiv logic, operatorul poate aciona asupra
dispozitivului n orice moment, indiferent de starea programului. Sistemul grafic testeaz
periodic (extrage eantioane) determinnd i memornd ultima dat produs de dispozitiv i
considerat ca "valoare curent".
Acest mod de operare este propriu afirii pe ecran a cursorului grafic ca rezultat al
micrii mouse-ului.
143
Fig.7.3.1.
Fig.7.3.2.
144
trecerea cursorului grafic peste instrumentul respectiv. n figura 7.3.3 este prezentat o cutie
de dialog care conine o parte din controalele care pot fi create folosind cutia Toolbox.
Mai jos sunt date denumirile acestor butoane scule:
- Select Objects servete la selectarea unui obiect creat anterior, cu scopul modificrii
poziiei, mrimii i proprietilor acestuia;
- Label servete la crearea unei etichete. Eticheta este o inscripie care poate fi plasat n
apropierea unui control pentru a oferi informaii despre rolul acestuia (dac controlul nu este
generat cu propria lui etichet) sau poate fi un simplu text destinat s comunice ceva
utilizatorului;
- TextBox servete pentru a crea o cutie de editare de text. O astfel de cutie servete la
introducerea de ctre utilizator a unei informaii sub form de text, text care va fi apoi
prelucrat de programul asociat conform unei semnificaii specifice destinaiei informaiei
furnizate. Trebuie reinut c la acest tip de control rspunderea scrierii corecte a textului (din
punctul de vedere al informaiei) i a verificrii corectitudinii scrierii cade n seama
programatorului. Astfel dac urmeaz s se indice o valoare numeric, programul trebuie s
verifice mai nti dac textul scris poate fi tratat ca numr i apoi s foreze conversia textului
n dat numeric. n acest caz se poate folosi funcia de test IsNumeric. Mai mult, dac
numrul care va rezulta trebuie s se
ncadreze ntr-un anumit domeniu de
valori, i acest lucru trebuie s fie
verificat de subrutina asociat
controlului;
- ComboBox servete pentru a
crea o cutie combinat pentru listare
de articole i editare a unui text.
Articolele listate constituie un set de
texte asociat controlului. Utilizatorul
poate selecta un articol din list sau
poate scrie un text diferit. i aici
programatorul
aplicaiei
are
rspunderea tratrii corecte a
articolului/textului introdus;
Fig.7.3.3.
- ListBox servete pentru a crea
o cutie de listare din care utilizatorul poate selecta un anumit articol dintr-un set asociat;
- CheckBox servete pentru a crea o caset de opiune neexclusiv. O astfel de caset se
folosete pentru a activa o valoare asociat unei dintre strile bifat/nebifat. Dac exist un grup
care conine mai multe asemenea casete, ele nu se exclud una pe alta, deci pot exista mai multe
casete activate la un moment dat. Este rspunderea programatorului ca valorile asociate strilor
casetelor s nu fie contradictorii, cu consecine nefaste pentru desfurarea programului;
- OptionButton servete pentru a crea o caset de opiune exclusiv sau buton radio.
Asemenea casete se folosesc ntotdeauna cel puin cte dou, grupate mpreun i sunt folosite
pentru activarea de opiuni care se exclud reciproc. Dac se apas un astfel de buton dintr-un
grup, cel care erea activ anterior se dezactiveaz automat;
- ToggleButton - servete pentru a crea un buton bistabil, adic un buton care poate avea
dou stri stabile, apsat sau neapsat. Acest control este destul de asemntor, n ce privete
comportamentul, cu controlul CheckBox;
- Frame - servete pentru a crea un cadru de grup;
- CommandButton - servete pentru a crea un buton de comand. Un astfel de buton,
145
cnd este apsat, lanseaz n lucru subrutina asociat cu el, deci emite o comand al crei
efect este determinat de coninutul subrutinei asociate;
- SpinButton - servete pentru a crea o pereche de butoane pentru
incrementarea/decrementarea (creterea/descreterea) unei valori cu o cantitate fixat;
- Image - servete pentru a crea un buton care afieaz o imagine. El se comport la fel ca
butonul de comand dar, deoarece numele fiierului imagine de afiat este o proprietate variabil a
sa, prin programul (subrutina asociat) el poate afia imagini diferite n funcie de contextul de lucru.
Mai sunt i alte instrumente de creare de controale n cutia TextBox. Detalii suplimentare
asupra folosirii acestora pot fi aflate consultnd help-ul din editorul de Visual BASIC.
7.3.2. Controlul interactiv al proprietilor
obiectelor
Cnd un obiect de control este selectat, fereastra
Properties i schimb automat coninutul conform
naturii obiectului. n figura 7.3.4 este reprezentat o
parte din coninutul aferent situaiei cnd este
selectat cutia de dialog UserForm1.
n fereastr exist o list cu o serie de articole,
dispuse pe rnduri, cte unul pentru fiecare
proprietate, afind la stnga denumirea proprietii,
iar la dreapta valoarea proprietii.
Se pot observa trei tipuri de articole, conform
modului de completare al cmpului valorii
proprietii:
- cmpuri de editare, n care proprietatea se
introduce prin scriere. Acesta este cazul unor
proprieti cum sunt numele (Name) obiectului
Fig.7.3.4.
(nume care poate fi folosit ca identificator de obiect
n program), titlul cutiei de dialog afiat pe bara de captare (Caption), nlimea cutiei de
dialog (Height) sau limea ei (Width), etc;
- cmpuri cu valori selectate din lista de selecie ataat, cum sunt stilul de chenar (Border
Style), stare activat (Enabled), cursor de mouse afiat (Mouse Pointer), etc.;
- cmpuri cu valori selectate dintr-o cutie de dialog asociat, cum sunt corpul de liter
(Font), Imagine de fond (Picture), etc.
Utilizatorul poate folosi modalitile diverse de completare interactiv a cmpurilor
ferestrei Properties pentru a stabili starea iniial a controalelor la afiarea cutiei de dialog.
7.3.3. Controlul programat al proprietilor obiectelor
Pentru ca un obiect de control s execute o aciune trebuie s i se asocieze o subrutin.
Acest lucru se realizeaz ntr-un modul special de proceduri private, astfel:
- se selecteaz obiectul;
- cu obiectul selectat, se acioneaz meniul View>Code. Ca urmare, aria de editare din
dreapta, a editorului de Visual BASIC, va afia o schem de subrutin asociat constnd din
declaraiile de nceput i de sfrit ale subrutinei. De exemplu pentru obiectul
CommandButton1, subrutina privat asociat creat automat va avea forma:
Private Sub CommandButton1_Click()
End Sub
i nimic altceva.
146
Fig.7.3.5.
147
Rosu iar cnd este dezapsat, culoarea cutiei de dialog trece n galben i inscripia butonului
devine Galben. Cutia va avea la un moment dat aspectul din figura 7.3.5. Cnd se apas
butonul Gata! cutia de dialog se nchide.
S discutm acum relaia cauzal dintre evenimentele din timpul rulrii aplicaiei, i
instruciunile scrise n subrutinele create.
- La apsarea butonului Run din cutia de dialog Macros este lansat n lucru subrutina
AfisareDialog. Aceasta, ncarc n memorie obiectul UserForm1 i, prin instruciunea
UserForm1.Show afieaz cutia de dialog Schimbare de culori. Prin crearea cutiei de
dialog, denumirea UserForm1 este recunoscut ca obiect de ctre programele Visual Basic
din documentul curent. Notaia .Show apeleaz metoda Show a obiectului UserForm1,
metod prin care are loc afiarea cutiei de dialog;
- n subrutina ToggleButton1_Click blocul decizional bialternan If, prin analiza
proprietii Value a obiectului ToggleButton1 detecteaz dac acesta este apsat (cnd Value
= True) sau neapsat (cnd Value = False). n consecin sunt modificate corespunztor
proprietatea BackColor (culoare de fond) a obiectului UserForm1 la valoarea rou, (funcia
RGB(rou, verde, albastru) ia valoarea maxim 255 pentru componenta roie) respectiv
combinaia rou = 255 i verde = 255 din care rezult galbenul, i proprietatea Caption
(inscripia) obiectului ToggleButton1 ia valoarea ir de caractere "Rou" respectiv "Galben";
- n subrutina CommandButton1_Click, care este lansat n lucru cnd este apsat
butonul de comand cu inscripie Gata!, instruciunea Unload UserForm1 produce
nchiderea cutiei de dialog i descrcarea ei din memorie pentru eliberarea spaiului ocupat.
148
Fig.7.4.1.
Fig.7.4.2.
Aceast subrutin primete la apel valoarea numeric numr. Se definete variabila Celul
ca avnd tipul de dat domeniu de celule (Range) (s-a verificat anterior ca domeniul s
conin o singur celul). Se convertete valoarea numeric numr n ir de caractere, folosind
funcia de conversie CStr. Prin referirea de deplasare Offset(nunr_de_rnduri,
numr_de_coloane) se plaseaz n celula de dedesubt formula de nmulire cu variabila
numr a coninutului celulei. n final se selecteaz celula de dedesubt.
Acest mod de manipulare a coninutului face operaia independent de poziia celulei
selectate iniial, n sensul c este valabil oricare ar fi celula selectat.
Sub Operare()
If Application.Selection.Count <> 1 Then
Call MsgBox("Selectati o singura celula!", vbExclamation + vbOKOnly, "Eroare!")
Exit Sub
Else
Dim Celula As Range
Set Celula = ActiveCell
If Not IsNumeric(Celula.Text) Then
Call MsgBox("Valoare nenumerica!", vbExclamation + vbOKOnly, "Eroare!")
Exit Sub
Else
UserForm1.TextBox1.Text = Celula.Text
Load UserForm1
149
UserForm1.Show
End If
End If
End Sub
Cu aceast subrutin se verific mai nti dac selecia din foaia de lucru Excel const
dintr-o singur celul. Dac nu, se afieaz o cutie cu un mesaj de avertisment, ca n figura
7.4.2 i execuia se termin forat.
Apoi, se verific dac coninutul celulei selectate (active) este numeric. n caz contrar se
emite un mesaj de eroare i execuia se termin forat.
Dac ambele condiii au fost satisfcute, coninutul celulei selectate este plasat n cutia de
editare TextBox1, se ncarc n memorie cutia de dialog i este afiat.
n modulul aferent cutiei de dialog UserForm1 se genereaz subrutinele urmtoare:
Private Sub CommandButton1_Click()
numar = TextBox2.Text
If Not IsNumeric(numar) Then
MsgBox "Introducere gresita!", vbExclamation + vbOKOnly, "Eroare!"
Else
Multiplicare_cu Val(numar)
End If
Unload UserForm1
End Sub
A doua subrutin este lansat la acionarea butonului CommandButton2 (de anulare). Are
loc numai descrcarea i nchiderea cutiei de dialog fr alt efect.
7.4.3. Personalizarea aplicaiei
La aceast etap se realizeaz o conexiune ntre un meniu sau un buton de comand creat
de utilizator i cutia de dialog pentru preluarea datelor variabile ale lucrrii.
n analiz final, lanul de interaciune este cel din figura 13:
Fig.7.4.3.
Elaborarea acestei scheme de interaciune constituie etapa de concepie top-down (de la
vrf la baz) a unui program modular, vrful fiind considerat interaciunea operator-meniu
150
(sau operator-buton) iar baza fiind constituit din setul de module de program (subrutine)
folosite pentru executarea aciunilor dorite.
Faza a doua a elaborrii unui program este faza down-top (baz vrf) n care, dup ce au
fost detectate problemele mari de rezolvat, se trece la elaborarea modulelor de program
capabile s le realizeze. n aceast faz modulele de program care se realizeaz trebuie s aib
o ct mai strict delimitare a funciilor realizate pentru ca, n cazul nevoii de depanare sau de
modificare a lanului de execuie, lucrrile corespunztoare s fie fcute ct mai uor iar
rezultatul obinut s fie ct mai sigur.
n cazul nostru, pentru simplitate preferm crearea unui buton de comand n foaia
EXCEL.
Pentru aceasta, din foaia Excel, acionm meniul View>Toolbars>Forms. Se va deschide
cutia cu scule Forms din care ne folosim de instrumentul Button pentru a desena un buton de
comand.
Imediat ce desenarea butonului este terminat se deschide cutia de dialog Assign Macro de
unde selectm numele Operare (subrutina definit mai sus).
Exist i faciliti de ajustare a aspectului scrierii de pe buton, de care ne vom servi pentru
a plasa pe buton inscripia Multiplicare.
Prin acest procedeu am realizat integrarea complet a aplicaiei.
Acum este suficient o apsare pe butonul Multiplicare pentru a putea opera cu cutia de
dialog creat mai sus.
n concluzie, execuia lucrrii trebuie s urmeze etapele:
- proiectarea prin metoda Top-down a componenei aplicaiei;
- dezvoltarea componentelor aplicaiei prin metoda Down-top (de la baz n sus) dar
respectnd obiectivele stabilite prin metoda Top-down.
151
Totui, caracterul ! nu iniiaz un comentariu dac el face parte dintr-o construcie standard
a limbajului Fortran 95.
Dac o instruciune nu poate fi complet scris pe lungimea unei linii este permis
continuarea ei pe linia urmtoare dac linia de continuat se termin cu caracterul &.
Exemplul de mai sus se mai poate scrie:
x=
(y z)
/2.0
&
&
152
x=
& (y z)/2.0
&
sau
Exemplu de sir
- tipul de date logice, desemnat prin cuvntul cheie LOGICAL, i ele pot avea numai
valorile .TRUE. sau .FALSE.
153
unde numele de tip poate fi unul dintre cele descrise mai sus iar lista de variabile este o
succesiune de nume de variabile separate prin virgule.
De exemplu:
INTEGER i, j, k
REAL a1, b1
COMPLEX z
LOGICAL stare
CHARACTER(6) sir
8.4. Parametrizarea
Prin parametrizare, se nelege fixarea unui atribut, de valoare sau de tip.
Cuvntul cheie folosit este PARAMETER. El poate fi folosit astfel:
a. Pentru declararea de constante nemodificabile:
REAL, PARAMETER :: pi = 3.14159
Declarat n acest mod, pi nu mai este o variabil ci o constant care nu se mai poate
modifica pe parcursul programului.
b. Pentru declararea parametrului de tip. Legat de acest subiect trebuie spus c pe diferite
platforme (calculatoare, sisteme de operare) lungimea n octei a unui tip de dat, integer sau
real, poate fi diferit. Dac tipul de dat este definit ca n exemplele date mai sus,
compilatorul va folosi lungimea de tip implicit pe calculatorul pe care se face compilarea. Ca
urmare, transferat pe un alt calculator, programul ar putea s funcioneze defectuos sau de loc,
datorit modului diferit de exploatare a memoriei la scrierea/citirea datelor. De exemplu,
pentru tipul integer lungimea de stocare poate fi pe unele calculatoare de 2 octei iar pe altele
de 4. Pentru tipul real aceast lungime poate diferi de la 2 la 4 octei. Pentru a se putea realiza
portabilitatea deplin a programelor trebuie declarat lungimea tipului de date n mod explicit,
astfel:
INTEGER, PARAMETER :: tip_i = SELECTED_INT_KIND(5)
INTEGER, PARAMETER :: tip_r = SELECTED_REAL_KIND(6,99)
INTEGER (KIND=tip_i) i
REAL (KIND=tip_r) r
n acest exemplu, n primele dou instruciuni, se declar constantele de tip tip_i i tip_r
folosite pentru a stoca lungimile n octei folosite la stocarea variabilelor de tip ntreg (tip_i) i
de tip real (tip_r). Aceste lungimi sunt returnate de funciile intrinseci
SELECTED_INT_KIND i SELECTED_REAL_KIND. Folosirea acestor funcii se supune
urmtoarelor reguli:
154
Aa cum se observ n acest exemplu, argumentele funciei KIND sunt o valoare ntreag
i, respectiv, una real.
De asemenea, se pot defini date structurate care refer la rndul lor structuri, ca mai jos:
TYPE punct
REAL :: x,y
END TYPE punct
TYPE triunghi
TYPE(punct) :: a,b,c
END TYPE triunghi
155
Ca urmare, coordonata y a punctului n va putea fi referit sub forma n%y sau sub forma
tr%b%y
Operaia de nmulire are prioritatea cea mai nalt i va fi efectuat prima. Aadar, primul
rezultat parial va fi b * c i abia apoi acesta va fi adunat cu a.
Operaiile cu preceden egal vor fi efectuate n ordinea scrierii operaiilor.
De exemplu, n expresia:
a / b * c
operaiile de mprire (/) i cea de nmulire (*) au acelai nivel de preceden deci, se va
opera mai nti operaia a / b i apoi acest rezultat va fi nmulit cu c.
8.7.4. Operatori n expresii numerice
n expresiile numerice se folosesc urmtorii operatori:
156
Operator
**
*
/
+
-
Semnificaie
Ridicare la putere (ab)
nmulire (ab)
mprire (a/b)
adunare (a+b) sau plus unar (+a)
scdere (ab) sau minus unar (a)
Ar avea ca efect rezultatul n=0 deoarece, dei rezultatul mpririi a fost cel corect, adic
0.5, el a fost convertit la tipul variabilei creia i se atribuie, adic la tipul ntreg, prin
trunchiere.
8.7.6. Operatori la nivel de caracter
Exist numai un singur astfel de operator, concatenarea, notat cu //. De exemplu:
'Tele' // 'fon' produce 'Telefon'
Fiind unul singur, acest operator nu are probleme cu precedena.
8.7.7. Operatori relaionali
Aceti operatori testeaz valabilitatea relaiei dintre doi operanzi numerici. Tipurile
operanzilor pot fi oricare dintre tipurile ntreg sau real. Deoarece expresiile n care intervin
aceti operatori nu conin succesiuni de operanzi, problema precedenei nu se pune.
Exist urmtorii operatori relaionali:
Operator
< sau .LT.
> sau .GT.
<= sau .LE.
>= sau .GE.
== sau .EQ.
/= sau .NE.
Expresie
a < b sau a .LT. b
a > b sau a .GT. b
a <= b sau a .LE. b
a >= b sau a .GE. b
a == b sau a .EQ. b
a /= b sau a .NE. b
neles
a strict mai mic dect b
a strict mai mare dect b
a mai mic sau egal cu b
a mai mare sau egal cu b
a egal cu b
a diferit de b
Operator
.NOT.
.AND.
.OR.
.EQV.
.NEQV.
Semnificaie
Negare logic (.TRUE. trece n .FALSE. i
invers)
i logic (ambii operanzi sunt .TRUE.)
Sau logic (cel puin un operand este .TRUE.)
Echivalen logic (ambii operanzi sunt
.TRUE. sau ambii sunt .FALSE.)
Non-echivalen logic (un operand este
.TRUE. i cellalt este .FALSE.)
157
8.8. Tablouri
Un tablou este o structur rectangular de elemente de acelai tip.
8.8.1. Tablouri de mrime fix
Tablourile de mrime fix se declar folosind instruciunea:
tip, DIMENSION(mrime) :: nume_tablou
De exemplu:
REAL, DIMENSION(3) :: u
are ca efect rezervarea unui spaiu fix de memorie, cu lungimea de 3 poziii de tip real
pentru tabloul unidimensional u, unde se vor putea scrie/citi valorile u(1), u(2) i u(3).
n acest caz, indicierea tabloului este implicit, ncepnd de la elementul cu indicele 1.
Dac se dorete o alt baz de indiciere, declaraia se face prin explicitare, astfel:
tip, DIMENSION(baz:capt) :: nume_tablou
unde capt=baz+mrime-1
n exemplul de mai sus, pentru baz=2 i mrime=3, se poate scrie declaraia:
REAL, DIMENSION(2:4) :: u
cu aceeai regul de calcul a valorilor de capt, pe baza valorilor bazelor i ale mrimilor
mrime_1, ..., mrime_n.
n cazul irurilor de caractere declaraia va avea forma:
CHARACTER, DIMENSION(mrime) :: ir
sau:
CHARACTER(LEN=mrime) :: ir
158
poate servi la stocarea unei pagini de text cu nr_rnduri fiecare avnd un numr de
caractere egal cu valoarea lungime.
8.8.2. Tablouri de mrime variabil
Tablourile de mrime variabil sunt acele tablouri pentru care se cunoate numai numrul
de dimensiuni, nu i mrimile corespunztoare dimensiunilor, acestea urmnd s fie stabilite
mai trziu n decursul derulrii programului. Regulile de lucru cu aceste tablouri sunt legate
de mecanismele de alocare i gestionare dinamic a memoriei.
Pentru un tablou cu n dimensiuni declararea se realizeaz astfel:
tip, DIMENSION(:, ,:), ALLOCATABLE :: nume_tablou
Mai trziu, n cursul programului, trebuie s aib loc alocarea memoriei cu instruciunea:
ALLOCATE(nume_tablou(mrime_1, , mrime_n))
Dup ce memoria folosit nu mai este necesar, ea trebuie dezalocat cu instruciunea:
DEALLOCATE(nume_tablou)
De exemplu, pentru un tablou cu dou dimensiuni se poate scrie:
REAL, DIMENSION(: , :), ALLOCATABLE :: b
ALLOCATE(b(2,3))
DEALLOCATE(b)
Dac expresie_logic este satisfcut se execut instruciune, altfel controlul este transferat
la instruciunea care urmeaz dup IF.
De exemplu:
IF(indicator) GO TO 10
IF (a <= b) minab=a
159
Blocuri IF ncuibate:
IF(expresie logic_1) THEN
secven_da_1
ELSE IF (expresie_logic_2) THEN
secven_da_2
...
ELSE
secven_nu_1
END IF
Execuia decurge prin testarea fiecrei condiii logice n parte pn cnd una din ele este
ndeplinit, executnd alternativa afirmativ sau de tip else corespunztoare, dup care
controlul este transferat la sfritul ciclului.
Este recomandabil alinierea scrierii decalate a instruciunilor blocurilor ncuibate pentru a
se putea distinge uor apartenena lor la alternativele diferite, mai ales n cazul ncuibrii.
8.9.4. Blocul alternativ multipl SELECT CASE
Forma general a blocului alternativ multipl este:
SELECT CASE (expresie)
CASE (selector_1)
secven_1
CASE (selector_2)
secven_2
...
[CASE DEFAULT
secven_prestabilit]
END SELECT
unde:
expresie este o expresie care produce o valoare ntreag, de tip caracter sau de tip logic.
Cel mai adesea expresie este doar o simpl valoare;
secven_j este o succesiune de instruciuni;
selector_j este un set de valori pe care le-ar putea lua expresie. Selectorul poate avea una
dintre formele urmtoare:
- o valoare individual, de exemplu:
CASE (1)
- un domeniu de valori, cu forma general CASE(inferior:superior). Sunt admise formele
subnelese:
CASE(inferior:) toate valorile mai mari dect sau egale cu inferior
160
Forma:
CASE DEFAULT
este opional i este menit s asigure executarea unei alternative, n lipsa selectrii
oricreia dintre cele precedente.
Execuia blocului SELECT CASE are loc prin evaluarea expresiei i testarea succesiv a
corespondenei rezultatului produs de ea cu una dintre valorile coninute de alternativele
CASE oferite. Cnd aceast coresponden este detectat se execut secvena alternativ
corespunztoare, dup care controlul este transferat la sfritul blocului SELECT CASE.
Dac nici o coresponden nu a fost detectat, se execut alternativa CASE DEFAULT,
adic secven_prestabilit.
8.9.5. Ciclul repetitiv contorizat DO
Ciclul repetitiv contorizat DO are forma
DO indice = nceput, sfrit, pas
secven
END DO
n exemplul de mai sus, ori de cte ori condiie este ndeplinit, se execut instruciunea
CYCLE al crei efect este de a se produce incrementarea indicelui i executarea unui nou
ciclu srindu-se peste secven_2 care nu mai este executat.
8.9.6. Ciclul DO indefinit
Ciclul DO indefinit are forma:
161
DO
secven
END DO
Folosit strict n aceast form ciclul DO devine infinit i conduce la blocarea programului
prin executarea la infinit a aceleiai secvene.
Ieirea din el se poate face folosind instruciunea EXIT, ca mai jos:
DO
secven
IF (condiie) EXIT
secven
END DO
Folosirea acestui tip de ciclu trebuie fcut cu deosebit grij pentru a se evita rmnerea
n bucl infinit dac CONDIIE nu este niciodat satisfcut.
8.9.7. Ciclul DO WHILE
Ciclul repetitiv condiionat anterior DO WHILE are forma:
DO WHILE (condiie)
secven
END DO
Ciclul funcioneaz att timp ct expresia logic CONDIIE este ndeplinit. Trebuie avut
grij ca, pe parcursul operaiilor derulate n secvena de instruciuni, expresia CONDIIE s
se modifice la un moment dat, lund valoarea .FALSE., altfel ciclul poate deveni infinit.
8.9.8. Ciclul DO implicit
Ciclul DO implicit este o structur folosit numai la operaiile de intrare/ieire.
De exemplu:
READ(* , *) (X(I), I=1,5)
are efectul de a citi de la dispozitivul de intrare prestabilit (tastatura) valorile X(1), ..., X(5)
n mod succesiv, ceea ce este echivalentul ciclului DO explicit:
DO I = 1, 5
READ (* , *) X(I)
END DO
sau:
nume: DO indice=nceput, sfrit, pas
secven
END DO nume
162
8.10.3. Subrutine
O subrutin este o unitate de program care execut aciuni i poate fi apelat dintr-o alt
unitate de program cu instruciunea:
CALL nume_subrutin (list_de_argumente)
Specificaia RECURSIVE este obligatorie dac subrutina este recursiv adic dac se
autoapeleaz.
Argumentele din lista de argumente sunt transmise prin referin. Aceasta nseamn c sunt
transmise adresele locaiilor de memorie unde se afl argumentele reale i deci orice
modificare a variabilelor corespunztoare din cuprinsul subrutinei se reflect n programul
apelant. Spre deosebire de acest mecanism de transfer, transmiterea argumentelor n C i C++
se face n mod normal prin nume (dac nu se folosesc pointerii), ceea ce nseamn c
argumentele formale din subprogram sunt copii ale argumentelor reale i modificrile lor nu
afecteaz programul apelant. Aadar, mecanismul de transfer al argumentelor din FORTRAN
nu respect principiul ncapsulrii datelor, ceea ce este un dezavantaj din punctul de vedere al
ingineriei programrii i al programrii structurate. Acelai lucru este valabil i pentru
transmiterea argumentelor funciilor, despre care se va vorbi mai jos. Din aceste motive
programatorul de FORTRAN trebuie s acorde o atenie deosebit evitrii efectelor laterale
care ar potea fi produse involuntar, spre deosebire de cei care programeaz n C i C++, unde
efectele laterale se obin n mod voit.
163
8.10.5. Funcii
O funcie o unitate de program care primete o list de argumente i returneaz o valoare.
Funcie poate fi invocat prin simpla utilizare a numelui ei ntr-o expresie, de exemplu:
variabil = funcie(list_de_argumente)
n zona de fiier surs unde se face definirea funciei, numele acesteia este tratat ca o
variabil creia trebuie s i se defineasc tipul, acesta fiind tipul rezultatului returnat de
funcie.
Forma general a unei funcii este urmtoarea:
[RECURSIVE] [tip] FUNCTION nume (list_de_argumente) [RESULT (nume_rez)]
instruciuni USE
[IMPLICIT NONE]
declaraii de tip
instruciuni executabile
END [FUNCTION [nume]]
Declaraia RECURSIVE este obligatorie dac funcia este recursiv (se autoapeleaz).
Declaraia RESULT definete o variabil care preia valoarea funciei pentru utilizare n
interiorul unei funcii recursive deoarece n interior, numele funciei nu poate fi folosit ca
variabil.
De exemplu, pentru a calcula suma primelor n numere se poate scrie funcia:
RECURSIVE INTEGER FUNCTION sum_n(n) RESULT (rez)
INTEGER n
INTEGER rez
if (n==0) then
rez=0
else
rez=n+sum_n(n-1)
end if
END FUNCTION sum_n
Dac se pune problema ca funcia s se ncheie altfel dect prin atingerea instruciunii
END, se va folosi instruciunea RETURN n aceleai condiii ca i instruciunea STOP la
subrutine sau programe principale.
Forma general a instruciunii RETURN este:
[etichet] RETURN
164
pot fi valori sau variabile), altele sunt variabile care recepteaz rezultatele execuiei
procedurii, iar altele pot avea pot avea ambele destinaii.
Argumentele formale sunt cele care apar ca nume n interiorul procedurilor. Aceswte
nume sunt specificate cnd procedura este definit i sunt folosite n calculele din interiorul
procedurii.
Cnd procedura este referit are loc o asociere ntre argumentul real i cel formal pe
principiul poziionalitii. Aceasta nseamn c primul argument real din lista de argumente a
referirii (apel de subrutin sau funcie) este asociat cu primul argument formal al listei din
definiia procedurii, al doilea argument real cu al doilea argument formal, etc. Aceasta impune
corespondea de tip i dimensionalitate (n cazul tablourilor) ntre cele dou tipuri de argumente.
Argumentele opionale sunt acele argumente formale care pot s nu aib un corespondent
ca argument real la referirea unei proceduri, dac ntr-un anume caz de execuie particular
aceasta nu este necesar. n acest caz, la referirea procedurii, argumentele reale
corespunztoare pot lipsi din lista de argumente sau pot fi specificate n alt ordine.
n definiia procedurii opionalitatea argumentului se semnaleaz prin declaraia de atribut
OPTIONAL a crei form este:
OPTIONAL list_de_argumente_opionale
De exemplu:
PROGRAM atribuiri
IMPLICIT NONE
REAL a,b,c
INTERFACE
SUBROUTINE afisare(x,y,z)
OPTIONAL y,z
REAL x,y,z
END SUBROUTINE afisare
END INTERFACE
a=1.0; b=2.0; c=3.0
CALL afisare(a,z=c)
END PROGRAM atribuiri
SUBROUTINE afisare(x,y,z)
IMPLICIT NONE
OPTIONAL y, z; REAL x,y,z,u,v,w
u=x
IF (PRESENT(y))THEN; v=y; ELSE; v=1.0; END IF
IF (PRESENT(z))THEN; w=z; ELSE; w=1.0; END IF
WRITE(*,*)u,v,w
END SUBROUTINE afisare
165
folosesc valori prestabilite pentru argumentele lips. Pentru a realiza acest lucru este util
funcia logic intrinsec (coninut n biblioteca de funcii a compilatorului) PRESENT(arg).
Ea returneaz un rezultat logic (.TRUE. sau .FALSE.) care poate fi folosit pentru a adopta
sau nu valoarea prestabilit, aa cum se vede n exemplul de mai sus.
n acest exemplu a trebuit construit o interfa ntre programul principal i procedura
apelat (subrutina) folosind blocul INTERFACE care repet n corpul programului principal
semntura subrutinei, adic numele (dac este funcie tipul de valoare returnat), lista de
argumente, tipurile argumentelor i proprietile lor.
n afar de aceste msuri mai trebuie luat i msura ca un argument formal opional care
nu este prezent s nu fie invocat. Astfel, se observ c instruciunea WRITE(*,*)u,v,w nu
folosete argumentele y i z deoarece, dup caz, ele ar putea sau nu s fie furnizate. Singura
funcie care poate folosi numele acestor argumente este funcia PRESENT.
n exemplul de mai sus rezultatul afiat dup rulare este:
1.000000
1.000000
3.000000
deoarece lipsind al doilea argument, adic y, el a primit valoarea 1.0 prin intermediul
blocului IF corespunztor.
Argumentele opionale pot fi furnizate i ntr-o alt ordine dect cea din lista
subprogramului dac excepia este semnalat prin menionarea numelor formale.
8.10.7. Conservarea valorilor. Atributul SAVE
n mod normal, la revenirea dintr-un subprogram (subrutin sau funcie) compilatorul
Fortran permite calculatorului s uite valorile variabilelor definite n subprogram. Dac este
necesar conservarea valorilor unora sau altora dintre aceste variabile, ele pot fi asociate cu
atributul de salvare, astfel:
tip, SAVE :: list _de_variabile
Dac declaraia de tip a avut loc anterior, instruciunea SAVE poate fi scris separat:
SAVE :: list _de_variabile
166
- Dac nu se dorete preluarea tuturor variabilelor din modul ci numai a unora, acest lucru
se specific astfel:
USE nume_de_modul, ONLY: variabila_1, ..., variabila_n
unde variabila_1, ..., variabila_n este lista variabilelor de preluat din modul;
8.10.9. Vizibilitatea datelor din module. Atributele PUBLIC i PRIVATE
Una dintre utilizrile cele mai rspndite ale modulelor este de a crea un stoc de date
comun pentru toate unitile de program care l folosesc. Din acest motiv, toate variabilele
unui modul sunt considerate n mod implicit publice.
Dac, din motive care in de separarea datelor comune de cele particulare, evitarea
efectelor laterale, etc, se dorete ca unele variabile s nu fie vizibile n exteriorul modulului,
iar altele da, se va explicita aceasta folosind atributele PUBLIC i PRIVATE, astfel:
tip, PUBLIC :: list_de_variabile
sau
tip, PRIVATE :: list_de_variabile
un atribut PUBLIC sau PRIVATE neurmat de o list de variabile declar toate variabilele
modului ca fiind publice sau private. De exemplu:
PRIVATE
REAL, PUBLIC :: A
167
Fiierul de inclus poate conine orice secven de declaraii i instruciuni valide n contextul
poziiei din fiierul gazd n care vor fi incluse. Efectul directivei este de a compila programul ca i
cum secvena de cod surs ar fi inclus s-ar afla efectiv ncepnd de la linia directivei INCLUDE.
n FTN95 se poate include orice fel de fiier text, cu condiia ca el s fac parte din
structura unui fiier proiect. Cu toate acestea se prefer folosirea fiierelor cu denumirea
avnd forma NUME.INC, deoarece numai acestea beneficiaz de facilitatea de analiz
sintactic constnd din semnalarea corectitudinii scrierii cuvintelor cheie ale limbajului.
Ca exemplu vom restructura aplicaia prezentat mai sus la subcapitolul de funcii,
subiectul recursivitate, astfel:
Se va folosi un proiect care va conine fiierele urmtoare:
Fiierul programului principal CALCUL_SUMA.f95:
PROGRAM calcul
USE suma_de_n
INCLUDE 'date.inc'
INTEGER k
k=sum_n(i)
WRITE(*,*) k
END PROGRAM calcul
168
unde:
etichet este o valoare numeric ntreag i pozitiv. Ea este necesar pentru referirea
formatului n instruciunile de citire/scriere cu format explicit.
list_de_articole_de_format este o list cu articole de forma:
r descriptor_de_format
lungime_de_scriere
E pentru numere reale reprezentate n format cu mantis i exponent zecimal. n acest caz
lungime_de scriere va apare n aceeai form ca i la specificatorul F. De exemplu:
E12.5
X pentru scrierea unui spaiu gol sau ignorarea citirii unui caracter. De exemplu:
6X
169
L pentru valori logice. n acest caz lungime_de scriere este un numr pozitiv ntreg
reprezentnd numrul de poziii rezervate pentru scrierea caracterelor valorii logice (.TRUE.
sau .FALSE.).
Exemple de formate de scriere:
100 FORMAT(I3, F5.2, 2I5, 3E12.5)
200 FORMAT(2(I3, F7.4), I4)
Cel de al doilea exemplu prezint un caz de folosire a listelor de articole de format ncuibate.
8.11.2. Instruciuni pentru transferul datelor
8.11.2.1. Instruciunea READ
Instruciunea READ, poate avea una dintre urmtoarele dou forme:
READ (list_specificatori_control_I/O) list_de_articole_de_citit
sau
READ etichet_de_format , list_de_articole_de_citit
specific citirea unor variabile declarate ca fcnd parte dintr-o list denumit. Citirea se face
n ordinea declarrii lor n list. Instruciunea care creaz lista este NAMELIST i are forma:
NAMELIST /nume_de_list/ list_de_variabile
De exemplu:
NAMELIST /date_personale/ an_nastere, luna_nastere, ziua_nastere
[IOSTAT= variabil_de_stare_I/O]
instruiete programul s sar la eticheta unei ramuri de tratare a erorii survenite prin
apariia unei erori. Aici variabila de stare I/O este util pentru a discerne ntre cazurile de
eroare de intrare/ieire;
[END=etichet]
instruiete programul s sar la eticheta unei ramuri care trateaz cazul de atingere a
sfritului de fiier.
170
Lista de articole de citit este compus din variabilele a cror citire se va efectua, separate
prin virgule.
Dac instruciunea format folosete numai primele dou articole, UNIT i FMT
menionarea acestor dou cuvinte cheie nu este necesar i instruciunea are forma:
READ (unitate, etichet_de_format) list_de_articole_de_citit
De exemplu, instruciunile:
READ (*, 100) i, x
100 FORMAT (I5, F7.3)
iar semnificaiile entitilor menionate sunt aceleai. Dispozitivul implicit este ecranul, iar
notaia pentru acesta este tot caracterul *.
Pentru a se evita ca la scriere s se introduc caracterul de salt la linie nou se poate folosi
n lista de specificatori de control I/O articolul:
ADVANCE = 'NO'
tip_de_acces poate fi unul dintre cuvintele cheie DIRECT sau SEQUENTIAL (implicit);
ACTION = metoda_de_aciune
171
specific eticheta unei ramuri de program care trateaz apariia unei erori de comunicare
descris de specificatorul IOSTAT;
FILE = nume_de_fiier
mod direct, sau lungimea maxim a unei nregistrri dac accesul se face secvenial;
172
STATUS = indicator_de_stare_a_fiierului
indicator_de_stare_a_fiierului poate fi una dintre valorile:
OLD dac se impune ca fiierul s existe
NEW dac se impune ca fiierul s fie unul nou
UNKNOWN dac fiierul are o stare dependent de procesor
REPLACE impune ca, dac fiierul nu exist s fie creat i s i se atribuie starea OLD, iar
dac fiierul exist, s fie ters, creat ca fiier nou i s i se atribuie starea OLD;
SCRATCH dac se cere s se creeze un fiier temporar care va exista numai pn la
executarea instruciunii CLOSE sau pn la ncheierea programului.
Valoarea trebuie s fie nenegativ, i trebuie s fie unic pentru toate unitile de program;
FILE=nume_de_fiier
nume_de_fiier specific numele fiierului ntr-o interogare bazat pe nume de fiier. n
acest caz nu se folosete articolul UNIT. Invers, dac se folosete UNIT nu se folosete FILE;
173
IOSTAT=variabil
variabil stocheaz starea de intrare/ieire (0 nici o eroare, ntreg negativ pentru eroare;
ERR=etichet
etichet este eticheta ramurii de program la care se sare n cazul apariiei unei erori;
EXIST=variabil
variabil specific o variabil logic care va avea valoarea .TRUE. dac fiierul exist
sunt deschise pentru acces direct, sau modul de acces nu poate fi determinat;
DIRECT=variabil
variabil va conine valoarea YES, NO sau UNKNOWN dup cum fiierul sau unitatea
sunt deschise pentru acces direct sau nu, sau procesorul nu cunoate starea accesului;
FORM=variabil
variabil va conine valoarea FORMATTED, UNFORMATTED n raport cu modul de
conectare la fiier sau unitate, sau UNKNOWN dac fiierul sau unitatea nu sunt conectate;
FORMATTED=variabil
variabil va conine YES, NO sau UNKNOWN dup cum fiierul sau unitatea sunt deschise
pentru operaii cu fiier formatat sau neformatat, sau procesorul nu cunoate starea acestuia;
UNFORMATTED=variabil
variabil va conine YES, NO sau UNKNOWN dup cum fiierul sau unitatea sunt deschise
pentru operaii cu fiier neformatat sau formatat, sau procesorul nu cunoate starea acestuia;
RECL=variabil
variabil va conine lungimea de nregistrare maxim pentru un fiier formatat sau
174
NEXTREC=variabil
n cazul fiierelor cu acces direct, variabil va conine cu 1 mai mult dect ultimul numr
de nregistrare citit (indicele iniial este 1), sau va fi nedefinit dac poziia nu este cunoscut;
BLANK=variabil
n funcie de modul de acces pentru citire, variabil va conine 'YES', 'NO' sau
'UNKNOWN' dac procesorul nu poate determina admisibilitatea accesului pentru citire;
WRITE=variabil
variabil va conine 'YES', 'NO' sau 'UNKNOWN' n funcie de modul de acces la
175
Instruciunea REWIND
Instruciunea REWIND are forma general:
REWIND ([UNIT=] numr_unitate &
[,IOSTAT=indicator_de_stare_I/O] &
[,ERR=etichet])
unde:
tip este tipul de dat asociat pointerului
list_de_atribute este o list de alte atribute ale pointerului
list_de_variabile_pointer este lista variabilelor de tip pointer definite de
declaraia curent
Pentru a defini variabile posibile a constitui inte ale unor pointeri se folosete declaraia:
tip, TARGET
[,list_de_atribute] :: list_de_variabile
unde:
tip este tipul de dat al variabilelor int
list_de_atribute este o list de alte atribute ale variabilelor int
list_de_variabile este lista variabilelor int definite de declaraia curent
Observaie: tipurile de dat ale pointerilor i variabilelor int trebuie s fie aceleai pentru
a se asigura citirea corect a datelor din memorie.
Exemple de definiri de pointeri i inte:
REAL, POINTER :: pnt1
REAL, TARGET :: a, b, c
n acest exemplu pointerul pnt1 este destinat s inteasc ctre variabile individuale de tip
176
singur dimensiune, de tip ntreg, aa cum sunt definite ca inte variabilele tablou a i b.
INTEGER, POINTER :: pnt3(:,:)
INTEGER, TARGET, ALLOCATABLE :: a(:,:)
n acest exemplu pointerul pnt3 este destinat s inteasc ctre variabila de tip tablou cu
dou dimensiuni, de tip ntreg, cu atributul ALLOCATABLE, deci cu posibilitatea de alocare
dinamic ulterioar, aa cum este definit ca int variabila tablou bidimensional a.
8.12.2. Asocierea pointerilor cu intele. Dezasocierea pointerilor
Se folosesc doi operatori pentru operarea cu pointerii:
- Primul este operatorul de asociere, folosit sub forma:
variabil_pointer => variabil_int
l'
j
5
5
11
k
7
5
5
l
11
11
11
n prima etap, la asocierea pnt=>j pointerul este fcut s vad ca int variabila j.
n urmtoarele dou etape de operaie pointerul pnt va vedea tot variabila j, deci inta nu se schimb.
La prima atribuire k=pnt variabila k va primi valoarea intei j, adic 5.
La a doua atribuire pnt=l inta j va primi valoarea variabilei l, adic 11.
Urmtorul exemplu ilustreaz folosirea pointerilor pentru variabile indexate (tablouri)
unidimensionale:
177
PROGRAM manipulare_pointeri_catre_tablouri
IMPLICIT NONE
INTEGER, DIMENSION(:), POINTER:: pnt
INTEGER, TARGET :: j(2), k(2), l(2)
j(1)=5; j(2)=7
k(1)=1; k(2)=2
l(1)=11; l(2)=13
write(*,*) 'ante ',j(1),j(2),k(1),k(2),l(1),l(2)
pnt=>j
pnt=k
write(*,*)'post1 ',j(1),j(2),k(1),k(2),l(1),l(2)
pnt=l
write(*,*)'post2 ',j(1),j(2),k(1),k(2),l(1),l(2)
END PROGRAM manipulare_pointeri_catre_tablouri
Acest program este identic ca etape de operare cu programul prezentat anterior, dar
lucreaz cu tablouri. Dup execuie el va afia:
ante
post1
post2
5
1
11
7
2
13
1
1
1
2
2
2
11
11
11
13
13
13
Se poate observa unul dintre avantajele lucrului cu pointerii tablou, i anume transferul
global de valori ale tablourilor printr-o singur atribuire. De altfel acest lucru este valabil i la
lucrul cu tablouri n general, fr a se face uz de pointeri.
Urmtorul exemplu ilustreaz folosirea pointerilor ctre tablouri alocate dinamic:
PROGRAM pointeri_tabl_dinamice
IMPLICIT NONE
INTEGER, DIMENSION(:), POINTER:: pnt
INTEGER, TARGET, allocatable :: k(:), j(:)
INTEGER i
ALLOCATE(k(3),j(3))
DO i=1,3
k(i)=i
END DO
j=2*k
WRITE(*,100) k(1),k(2),k(3),j(1),j(2),j(3)
pnt=>k
pnt=j
WRITE(*,100) k(1),k(2),k(3),j(1),j(2),j(3)
DEALLOCATE(k,j)
100 FORMAT(6I5)
ALLOCATE(k(2),j(2))
DO i=1,2
k(i)=i
END DO
j=k+1
WRITE(*,200) k(1),k(2),j(1),j(2)
pnt=>k
pnt=j
WRITE(*,200) k(1),k(2),j(1),j(2)
DEALLOCATE(k,j)
200 FORMAT(4I5)
END PROGRAM pointeri_tabl_dinamice
178
1
2
1
2
2
4
2
3
3
6
2
2
2
2
3
3
4
4
6
6
Rezultatul returnat de funcia ASSOCIATED este unul logic, adic .TRUE. sau .FALSE.
Dac argumentul int lipsete funcia va returna .TRUE. dac pointerul este asociat cu o
int oarecare, altfel, dac nu este asociat cu inta sau a fost nulificat, va returna .FALSE.
Dac argumentul int este prezent, funcia va returna .TRUE. numai dac toi pointerii
listei sunt asociai cu inta n cauz.
8.12.3. Alocarea dinamic a memoriei pentru tablouri
Aa cu s-a vzut nc din exemplele de mai sus, un pointer poate fi asociat nu numai cu
variabile int simple ci i cu variabile int de tip tablou crora li se specific numai forma
(numrul de dimensiuni) dar nu i mrimea (numerele de elemente pe dimensiunile
respective). Cu alte cuvinte, compilatorul este ntiinat numai asupra structurii generale a
zonei de memorie intit, nu i asupra structurii de detaliu, repectiv a spaiului exact pe care l
va ocupa zona. Mrimea acestei zone de memorie va fi specificat folosind instruciunea
ALLOCATE, ca n exemplul de mai jos:
REAL, POINTER :: pnt, pnt_spre_tablou(:)
INTEGER :: m=20
...
ALLOCATE( pnt, pnt_spre_tablou(m) )
...
DEALLOCATE( pnt, pnt_spre_tablou )
n exemplul de mai sus pointerul pnt este unul simplu care poate inti o variabil simpl,
pe cnd pnt_spre_tablou este un pointer care poate inti spre o variabil tablou cu o
179
la ncrcarea proiectului, sunt ncrcate i deschise mpreun, iar prelucrarea produsului final,
fiierul cod executabil, se face corelat.
8.13.2. Construirea i rularea unui proiect
Crearea unui proiect se realizeaz folosind meniul File/New Project care deschide cutia de
dialog New Project din figura 8.13.1.
Se selecteaz natura proiectului dorit din lista Project Types, se stabilete numele n cutia
de editare Name i directorul de stocare a fiierului proiect folosind butonul Browse.
Dup executarea acestei comenzi fereastra aplicaiei PLATO are aspectul din figura 8.13.2.
Aa cum se observ n fereastra Project Explorer, un proiect poate conine fiiere surs,
fiiere de includere i fiiere referite.
Pentru adugarea de noi componente se poate folosi meniul contextual (clic dreapta pe
articolul nod selectat). Dup aplicarea unui asemenea set de operaii, un proiect poate arta ca
n figura 8.13.3.
Fiierele surs sunt fiiere care conin:
- Fiierul care conine programul principal i un anumit numr de proceduri (subrutine i funcii);
- Fiiere care conin module (uniti de program separate coninnd declaraii i proceduri)
utilizabile n diverse programe gazd prin invocarea lor de ctre instruciunea USE;
Fig.8.13.1.
- Fiiere de includere, care conin secvene de program n form surs (text) care pot fi
invocate i ncrcate din alte uniti din program ca i cum s-ar afla incluse ncepnd de la
instruciunea de includere (INCLUDE);
- Fiiere referite, care conin cod executabil extern cum sunt fiierele DLL (Dynamic Link
Library) sau LIB.
n figura 8.13.3 fiierele componente sunt:
- Programul principal coninut n fiierul Main.f95, coninnd instruciunile:
PROGRAM CALCUL
USE FACT_DE_N
INCLUDE 'DATE.INC'
INTEGER K,N
N=I
K=FACT_N(N)
write(*,*) "K!=",K
END PROGRAM
180
Fig.8.13.2.
Construirea programului se poate face:
- pe etape separate, apelnd comanda Compile separat pe fiecare component, fie din
meniul Build/Compile fie din meniul contextual direct de pe eticheta (Tab-ul) fiecrei ferestre
de component sau de pe articolul de proiect din fereastra Project Explorer, ca n figurile
8.13.4 i, respectiv, 8.13.5, i apoi folosind comanda Build din meniul Build.
- global, prin comanda Build/Build sau cu meniul contextual din fereastra Project explorer
cu articolul nume de proiect selectat.
181
Comanda Rebuild produce i recompilarea componentelor, lucru necesar atunci cnd ele au
suferit modificri.
Fig.8.13.3.
Fig.8.13.4.
Fig.8.13.5.
182
Fig.9.2.1.
Este important de reinut c aceste liste pot fi eterogene (constituite din entiti de tipuri diferite).
De exemplu, fie lista TRIUNGHI coninnd datele care definesc cele trei vrfuri ale unui
triunghi:
TRIUNGHI (V1 V2 V3)
V1, V2 i V3 sunt la rndul lor liste care conin caracterul de notare al vrfului i lista
coordonatelor sale x, y i z:
V1 (A CV1)
V2 (B CV2)
V3 (C CV3)
CV1 (0 0 0)
CV2 (100 0 0)
CV3 (0 100 0)
183
9.2.2. Funcia
Spre deosebire de lista de date, funcia este constituit dintr-un ir de entiti dintre care
primul este numele funciei iar restul sunt argumentele ei. De exemplu:
(command LINE (0 0 0) (100 0 0) (0 100 0) C)
184
Acceptor1 este variabila local c iar donator1 este lista funcie (/ (+ a b) 2);
Acceptor2 este variabila global d iar donator2 este lista lista funcie (+ c 2).
Noiunea de ngheare se refer la blocarea evalurii simbolului acceptorului, astfel nct,
orice valoare ar fi avut anterior, el primete o nou valoare provenit din evaluarea donatorului.
Au fost folosite funciile:
(/ denprit npritor) i (+ numr1 numr2).
Conform conveniei LISP, numele funciilor de mai sus sunt operatorii / i + , celelalte
simboluri din list fiind operanzii.
Modul de utilizare a funciei MID definit mai sus rezult din urmtorul exemplu, extras
dintr-un program:
(setq u 1 v 2 d 0)
(setq f (mid u v))
Dup execuia ultimei funcii setq vom constata c f primete valoarea (1 + 2)/2 =1.5, iar d
nu mai are valoarea 0 ci valoarea (1.5 + 2) = 3.5. Acest lucru se ntmpl deoarece d este
variabil global.
Dac n loc de (setq f (mid u v)) am fi scris numai (mid u v), rezultatul 1.5 ar fi fost pierdut
nefiind preluat de nici un alt simbol, singurul rezultat conservat fiind valoarea 3.5 atribuit lui
d. Ca i n limbajul C acest efect poart denumirea de efect lateral i, dac nu este urmrit n
mod special, este recomandabil s fie evitat prin controlul strict al vizibilitii variabilelor
(programatorul trebuie s tie exact care sunt variabilele locale i care cele globale).
Rmne o ntrebare: de ce, n funcia de definire a funciei MID a fost scris ca ultim
argument simbolul c?
Pentru a nelege, trebuie expus ciclul funcional de baz al limbajului LISP, aa cum urmeaz.
n general, cu riscul risipei de spaiu, preferm scrierea pe linii separate, dei am fi putut
scrie totul pe un singur rnd:
(defun MID (a b /) (/ (+ a b) 2))
185
186
Dac, n loc de o list, al doilea argument al funciei CONS este un atom, funcia
returneaz o pereche cu punct, astfel:
(setq a 1 b 2)
(cons a b)
produce lista (1 . 2)
(CAR list)
Aceast funcie extrage primul element al listei. De exemplu, fie lista l(b c d). Atunci,
funcia:
(car l)
produce ca rezultat b.
(CDR list)
Aceast funcie returneaz o list creia i lipsete primul argument.
De exemplu, fie lista l(b c d). Atunci, funcia:
(cdr l)
Atunci:
(set b 10)
l evalueaz pe 10 prin el nsui, produce a prin evaluarea lui b i atribuie lui a valoarea 10.
Dac acum scriem funcia:
(eval a)
i apoi:
(setq b 10)
187
deoarece s-ar fi ncercat atribuirea valorii constante 10 nu unui simbol care reprezint o
locaie de memorie care poate stoca o valoare ci unei alte valori constante, i anume 2.
(SETQ simbol expresie)
este echivalent cu
(set (quote simbol) expresie)
Aceast funcie evalueaz expresie, blocheaz evaluarea lui simbol i atribuie simbolului
neevaluat valoarea rezultat din evaluarea expresiei. De exemplu:
(setq a 9)
ar rezulta o eroare la fel ca mai sus, deoarece s-ar ncerca atribuirea valorii 9 valorii 1.
n schimb, scriind:
(setq a b)
(setq (eval a) 9)
produce lista
(1 doi d)
va produce lista:
lap(1 W 2.3 SIR (2.3 SIR))
188
(ATOM simbol)
Un atom este o entitate AutoLISP care nu mai refer alte componente (nu este o list, sau,
conform terminologiei grafurilor arborescente este frunz de arbore i nu nod).
Funcia ATOM produce rezultat T dac simbol este un atom AutoLISP i NIL n caz
contrar. De exemplu:
(atom 1)
produce rezultatul T pentru c 1 este o entitate constant;
(atom lap)
produce rezultatul nil pentru c lap este list (a se vedea exemplul de mai sus);
(atom nil)
produce rezultatul T pentru c nil este o constant logic.
(EQUAL e1 e2)
Aceast funcie testeaz dac dou expresii sunt identice. De exemplu, scriind:
(setq e1 (1 2 3) e2 (1 2 3) e3 (1 5 2))
(equal e1 e2) produce rezultat T, iar
(equal e1 e3) produce rezultat nil.
(NULL simbol)
Funcia testeaz lipsa referinei unui coninut de ctre simbol, caz n care produce T, altfel
produce NIL. De exemplu:
(setq a SIR b 1.2 c nil)
(null a)
produce nil
(null b)
produce nil
(null c)
produce T.
i scriind:
(numberp (car lap)) se returneaz T deoarece primul element al listei lap este atomul
numeric 1, pe cnd:
(numberp (cdr lap)) va returna NIL deoarece (cdr lap) este sublista (W 2.3 SIR (2.3
SIR)) i nu un numr.
(ZEROP simbol)
Aceast funcie returneaz T dac rezultatul evalurii lui simbol este o valoare numeric
nul, sau NIL n caz contrar.
De exemplu:
(setq a 1)
(zerop a)
returneaz NIL
(zerop (- a 1)) returneaz T
189
(MINUSP simbol)
Aceast funcie returneaz T dac rezultatul evalurii lui simbol este un numr egal cu
zero, sau NIL n caz contrar.
De exemplu:
(setq a 1)
(minusp a)
(minusp (- a 2))
returneaz NIL
returneaz T.
(LISTP simbol)
Aceast funcie returneaz T dac rezultatul evalurii lui simbol este o list, sau NIL n caz contrar.
De exemplu, considernd lista lap de mai sus:
(listp lap)
returneaz T
(list (car lap)) returneaz NIL.
(AND e1 e2 en)
Aceast funcie returneaz NIL dac n cursul evalurii de la stnga la dreapta a expresiilor
e1, e2, , en, a fost ntlnit o expresie care, prin evaluare, produce un rezultat NIL.
Evaluarea se oprete imediat ce a fost ntlnit prima expresie evaluat prin NIL, fr a le mai
evalua i pe celelalte. Dac toate expresiile sunt diferite de NIL este returnat rezultatul T.
De exemplu, considernd atribuirile de mai sus pentru a i b:
(and a b)
returneaz NIL
(and a (not b)) returneaz T.
(OR e1 e2 en)
Aceast funcie returneaz T dac n cursul evalurii de la stnga la dreapta a expresiilor
e1, e2, , en, a fost ntlnit o expresie care este evaluat prin T. Evaluarea se oprete
imediat ce a fost ntlnit o asemenea expresie, fr a le mai evalua i pe celelalte. Dac, prin
evaluare, nici o expresie nu produce T, este returnat rezultatul NIL.
De exemplu, considernd atribuirile de mai sus pentru a i b:
(or a b)
returneaz T
(or (not a) b) returneaz NIL.
190
De exemplu:
(read (+ 2 1))
returneaz
(+ 2 1)
(EVAL expresie)
Aceast funcie returneaz valoarea evaluat a expresiei.
De exemplu:
(eval (+ 2 1)) returneaz 3
(expresie_de_test_n expresie_n)
)
Aceast funcie evalueaz pe rnd expresiile expresie_de_test_j pn cnd o ntlnete pe
prima care este diferit de nil i evalueaz expresia expresie_j corespunztoare.
Se poate construi o alternativ default (ca n limbajul C la instruciunea switch), astfel:
(COND
(T expresie_prestabilit)
)
Exemplu de folosire a funciilor alternativ:
(setq a 1)
(if (< a 0) t)
(cond ((< a 0) negativ)
((= a 0) zero)
((> a 0) pozitiv)
)
191
192
(CXXXXR list)
n funcia de mai sus avem de a face cu o notaie generic, X putnd fi A sau D, rezultnd
combinaii de funcii CAR i CDR pn la nivelul 4. De exemplu:
(CADR (list a b c d)) produce acelai rezultat ca i (CAR (CDR (list a b c d))) adic
evaluarea simbolului b.
(REVERSE list)
Aceast funcie returneaz o list inversat. De exemplu:
(reverse (list (list a b) c (list d e f) g h)) returneaz lista
(h g (d e f) c (a b))
Se observ din exemplul de mai sus c sublistele interne sunt tratate ca simple argumente
nefiind afectate de inversare.
(ASSOC articol list_asociativ)
Pentru a nelege modul de lucru al acestei funcii reamintim efectul funciei CONS: cnd
ambele argumente sunt atomi funcia returneaz o pereche cu punct.
O list asociativ este o list avnd ca elemente subliste formate din perechi cu punct de
tipul (a . b), sau asociaii.
Dac articol exist n interiorul unei subliste a listei asociative, atunci funcia ASSOC
returneaz prima pereche cu punct ntlnit, care conine argumentul articol, ignornd
celelalte subliste care urmeaz acesteia (chiar dac printre ele se mai gsesc i altele care
conin articolul). De exemplu:
(setq l (list (cons c 1) (cons a 2) (cons a 3) (cons b 2)))
(assoc a l) returneaz sublista (a . 2), aceasta fiind prima ntlnit care conine atomul a.
(LAST list)
Aceast funcie returneaz ultimul element al listei. De exemplu:
(setq l1 (a b c d))
(last l1)
returneaz d.
(LENGTH list)
Aceast funcie returneaz o valoare numeric egal cu lungimea listei (numrul de
argumente ale listei). De exemplu:
(setq l1 (a b c d) l2 ((a b c) d))
(length l1)
returneaz 4
(length l2)
returneaz 2.
193
returneaz 6.
(1- en)
Aceast funcie realizeaz decrementarea valorii expresiei numerice en. De exemplu:
(setq a 5 b (1- a)) returneaz 4 ca valoare atribuit lui b.
(ABS en)
Aceast funcie returneaz valoarea absolut a valorii de evaluare a expresiei en. De exemplu:
(abs 3)
returneaz 3.
(EXPT baz exponent)
Aceast funcie returneaz valoarea bazei ridicat la puterea exponent. De exemplu:
(expt 2 3) returneaz 8
(EXP en)
Aceast funcie returneaz valoarea numrului natural e ridicat la puterea dat de evaluarea
expresiei numerice en.
(SQRT en)
Aceast funcie returneaz rdcina ptrat a valorii expresiei numerice en.
(SIN en)
Aceast funcie returneaz sinusul valorii expresiei numerice en considerat n radiani. De
exemplu:
(sin (/ pi 6.0))
returneaz valoarea 0.5.
Observaie: simbolul pi este recunoscut de AutoLISP ca valoare a numrului .
(COS en)
Aceast funcie returneaz cosinusul valorii expresiei numerice en considerat n radiani.
De exemplu:
194
(cos (/ pi 3.0))
Aceast funcie definete o comand nou cu numele TRI. Scriind acest nume ca linie de
comand AutoCAD, programul va desena un triunghi isoscel cu vrfurile n punctele de
coordonate 0,0, 2,0 i 1,2.
195
Argumentul mod ndeplinete rolul variabilei de sistem AUNITS din AutoCAD, care
stabilete unitile de exprimare a unghiurilor.
Argumentul precizie ndeplinete rolul variabilei de sistem AUPREC din AutoCAD, care
stabilete precizia de exprimare a unghiurilor.
Dac mod i precizie sunt omise, conversia este fcut conform strii variabilelor de sistem
menionate. Dac argumentele sunt menionate, sunt folosite urmtoarele valori i semnificaii:
Pentru argumentul mod
0 grade sexagesimale exprimate cu punct zecimal
1 grade minute secunde
2 grade centesimale
3 radiani
4 uniti de navigaie
De exemplu:
(setq p1 (5.0 1.33) p2 (2.4 1.33) a (angle p1 p2))
(angtos a 0 0)
returneaz 180
(angtos a 0 4)
returneaz 180.0000
(angtos a 1 4)
returneaz 180d00
(angtos a 4 2)
returneaz W.
(ANGTOF ir [mod])
Aceast funcie convertete argumentul de tip ir de caractere ir reprezentnd un unghi ntr-o
valoare real exprimat n radiani. Modul n care este interpretat irul de caractere depinde de
argumentul mod care, ca i la funcia ANGTOS, are aceeai semnificaie. De exemplu:
(angtof 180d00\ 1)
returneaz valoarea 3.14159.
(ATOI ir)
Aceast funcie convertete un ir de caractere ASCII n numr ntreg. De exemplu:
(atoi 2)
returneaz 2
(atoi 2.3)
returneaz 2.
(ATOF ir)
Aceast funcie convertete un ir de caractere ASCII n numr real. De exemplu:
(atof 2)
returneaz 2.0
(atof 2.3)
returneaz 2.3.
(ITOA eni)
Aceast funcie convertete expresia numeric ntreag eni n ir de caractere ASCII. De
exemplu:
(itoa 2)
returneaz 2
(itoa 2.3)
produce mesajul error: bad argument type.
(RTOS enr)
Aceast funcie convertete expresia numeric real enr n ir de caractere. De exemplu:
(rtos 2)
returneaz 2.0000
(rtos 2.3)
returneaz 2.3000.
9.16.2. Funcii de operare asupra irurilor de caractere
Operarea asupra valorilor de tip ir de caractere se realizeaz cu funciile urmtoare:
(STRCAT ir1 ir2 irn)
Aceast funcie leag (concateneaz) ntr-un singur ir de caractere irurile ir1, ir2,
196
irn. De exemplu:
(setq disp C: dir1 Alfa dir2 Beta sep \\)
(setq cale (strcat disp sep dir1 sep dir2)) atribuie simbolului cale valoarea ir de caractere
C:\\Alfa\\Beta.
(STRLEN ir)
Aceast funcie returneaz o valoare numeric ntreag reprezentnd numrul de caractere
din ir. De exemplu:
(strlen Abcd)
returneaz 4.
(STRCASE ir [mod])
Aceast funcie convertete argumentul ir de caractere ntr-o alt form determinat de
valoarea argumentului mod.
Dac mod este prezent i este diferit de nil, caracterele sunt convertite n litere mici, altfel
sunt convertite n litere mari.
(strcase Abcd) sau (strcase Abcd nil) returneaz ABCD
(strcase Abcd t)
returneaz abcd.
(SUBSTR ir nceput [lungime])
Aceast funcie extrage din argumentul ir un subir ncepnd de la caracterul de indice
egal cu valoarea argumentului numeric ntreg nceput i attea caractere cte indic
argumentul numeric ntreg lungime. Dac lungime este omis, sau dac este mai mare dect
restul de caractere rmase, subirul este extras pn la capt. De exemplu:
(substr ABCD 2 2)
returneaz BC
(substr ABCD 2)
returneaz BCD
(substr ABCD 2 5)
returneaz BCD.
9.16.3. Funcii de intrare/ieire
Operaiile de intrare/ieire din AutoLISP se realizeaz cu funciile urmtoare:
(OPEN nume_fiier mod)
Aceast funcie deschide un fiier identificat prin argumentul nume_fiier conform
modului de deschidere specificat prin argumentul mod. Funcia returneaz un descriptor de
fiier care trebuie atribuit unui simbol, altfel rezultatul se pierde i nu se poate face operaia de
nchidere a fiierului.
Numele de fiier trebuie s descrie calea complet ctre fiier conform regulilor sistemului
de operare DOS. Separatorul de cale este perechea de caractere \\ n loc de obinuitul
caracter \, aceasta datorit semnificaiei de prefix pentru caractere speciale acordat
caracterului backslash (a se vedea exemplul de la funcia STRCAT).
Argumentul mod poate avea valorile:
r
deschidere pentru citire. Dac fiierul nu exist se returneaz nil.
w
deschidere pentru scriere. Dac fiierul nu exist este creat unul nou.
a
deschidere pentru adugare. Dac fiierul nu exist este deschis unul nou. Dac
fiierul exist este deschis, iar pointerul de eviden este poziionat la sfritul fiierului, astfel
nct noile date sunt scrise n continuarea celor existente.
Descriptorul de fiier returnat va fi folosit ulterior pentru:
- citire de date cu funcia read-char sau read-line la fiierele deschise pentru citire;
- scriere de date cu funcia write-char sau write-line la fiierele deschise pentru scriere
(modurile w i a);
197
(CLOSE descriptor_de_fiier)
Aceast funcie nchide fiierul specificat de argumentul descriptor_de_fiier obinut
anterior folosind funcia open.
(READ-CHAR [descriptor_de_fiier])
Aceast funcie citete un caracter din fiierul specificat prin argumentul
descriptor_de_fiier. Dac acest argument lipsete citirea se face din bufferul de caractere al
tastaturii. Funcia returneaz o valoare ntreag reprezentnd codul ASCII al caracterului citit.
De exemplu:
(read-char) returneaz 97 dac se apas tasta a sau 65 dac se apas tasta A
Dac se dorete obinerea caracterului citit se va folosi funcia:
(CHR cod)
Aceast funcie returneaz caracterul ASCII al crui cod este furnizat ca argument. De exemplu:
(chr 97)
returneaz a.
(WRITE-CHAR cod [descriptor_de_fiier])
Aceast funcie scrie n fiierul deschis specificat prin argumentul descriptor_de_fiier
caracterul al crui cod este furnizat ca argument. Dac descriptor_de_fiier lipsete scrierea se
face pe ecran n poziia curent a cursorului.
Pentru a se obine codul caracterului de scris se folosete funcia:
(ASCII ir)
Aceast funcie returneaz codul primului caracter din ir. De exemplu:
(ascii abc)
returneaz 97
(write-char (ascii abc)) scrie pe ecran caracterul a deoarece descriptorul de fiier
lipsete.
(READ-LINE [descriptor_de_fiier])
Aceast funcie citete o linie (un ir de caractere terminat cu caracterul ENTER) din
fiierul deschis specificat de argumentul descriptor_de_fiier sau, dac acesta lipsete, de la
tastatur.
(WRITE-LINE ir [descriptor_de_fiier])
Aceast funcie scrie n fiierul deschis specificat de argumentul descriptor_de_fiier irul
de caractere ir ca pe o linie terminat prin caracterul ENTER. Dac descriptor_de_fiier
lipsete scrierea se face pe ecran n poziia curent a cursorului.
(PROMPT mesaj)
Aceast funcie scrie pe ecran irul de caractere constituit de argumentul mesaj.
(TERPRI)
Aceast funcie scrie pe ecran o linie de text goal. Funcia este folosit prin includerea ei
pe ultima linie a unui program AutoLISP ca ieire tcut, pentru a evita afiarea ultimei
evaluri a unei funcii.
(LOAD fiier_lisp)
Aceast funcie servete la ncrcarea unui fiier surs AutoLISP specificat ca argument.
Identificatorul fiierului trebuie s conin dispozitivul i calea ctre fiier, conform
198
conveniei DOS, ca la funcia OPEN. Numele unui fiier AutoLISP are extensia de tip .LSP,
dar aceasta nu este necesar s fie specificat.
9.16.4. Realizarea dialogului dintre AutoCAD i AutoLISP
Exist un numr de funcii care pot fi folosite pentru a construi un dialog ntre interpretorul
de comenzi AutoCAD i un program scris n AutoLISP. Prin utilizarea lor se pot cere sau
introduce informaii din/n baza de date a AutoCAD-ului, sau se pot transmite comenzi ctre
interpretorul de comenzi AutoCAD.
(COMMAND arg1 arg2 argn)
Aceast funcie este cea mai folosit i servete la transmiterea ctre interpretorul de comenzi din
AutoCAD a unei succesiuni de cuvinte de comand rezultate din evaluarea argumentelor arg1, ,
argn. Setul de argumente transmis poate fi incomplet, urmnd o succesiune de alte funcii de naturi
diferite, dar comanda, odat iniiat, trebuie ncheiat, folosind alte funcii command ulterioare.
La scrierea irurilor de caractere ale argumentelor sintaxa comenzii AutoCAD trebuie
respectat, dup exact aceleai exigene ca i n cazul scrierii ei de la tastatur. De exemplu:
(command line (0 0) (1 1) )
adic trasarea unei linii drepte de la punctul de coordonate 0,0 la punctul de coordonate 1,1.
Observaie: simbolul predefinit PAUSE poate fi folosit ca argument al funciei
COMMAND pentru a realiza o pauz n succesiunea transmiterii de argumente ctre
interpretorul de comenzi. La momentul pauzei utilizatorul poate interveni furniznd
argumentul el nsui. De exemplu:
(command circle 5,5 pause)
are ca efect desenarea unui cerc cu centrul n punctul de coordonate 5,5 i raza furnizat de
utilizator.
Observaie: funcia COMMAND returneaz ntotdeauna rezultatul nil.
(ANGLE punct1 punct2)
Aceast funcie returneaz unghiul cu orizontala fcut de linia care trece prin punctele
punct1 i punct2, msurat n radiani. De exemplu:
(angle (0 0) (1 1)) returneaz valoarea 0.785398, adic /4.
(DISTANCE punct1 punct2)
Aceast funcie returneaz distana dintre punctele punct1 i punct2. De exemplu:
(setq p1 (list 0 0) p2 (list 1 1) d (distance p1 p2)) returneaz 1.41421.
(GETANGLE [punct1] [mesaj])
Aceast funcie poate apare n urmtoarele forme:
(getangle)
ateapt plasarea cu cursorul grafic a dou puncte n cmpul de
lucru al AutoCAD i returneaz unghiul cu orizontala al liniei care unete punctele;
(getangle punct1)
ateapt plasarea celui de al doilea punct de ctre utilizator i
returneaz unghiul cu orizontala al dreptei rezultante;
(getangle mesaj)
acelai efect ca i la (getangle) dar n prealabil afieaz irul de
caractere mesaj;
(getangle punct1 mesaj) acelai efect ca i la (getangle punct1) dar n prealabil afieaz
mesaj.
199
200
3 evidenierea entitii;
4 dezactivarea evidenierii entitii.
Dac mod nu se specific are loc redesenarea entitii. Dac nume_de_entitate i mod nu
se specific este redesenat portul de vedere curent. Funcia returneaz ntotdeauna nil.
(INITGET [opiune] [list_de_cuvinte_cheie])
Aceast funcie iniializeaz modul de aciune pentru urmtorul apel al unei funcii de
forma GETXXXX, mai puin GETSTRING i GETVAR, i returneaz nil.
Argumentul opiune poate avea valorile:
1 interzicerea rspunsului nul (binar 00000001);
2 interzicerea valorilor numerice nule (binar 00000010);
4 interzicerea valorilor numerice negative (binar 00000100);
8 ignor ncadrarea n limitele desenului chiar dac variabila LIMCHECK este ON (binar
00001000);
etc, pn la 128 cu semnificaii diferite (a se vedea manualul de utilizare).
Prin nsumarea valorilor de mai sus se pot obine combinaii pentru valoarea opiunii.
Astfel 5=1+4 (00000101) poate fi folosit pentru a specifica simultan opiunile
corespunztoare (nu este permis introducerea ca rspuns a caracterului ENTER i nici
valoare negativ).
Dup iniializarea cu INITGET, dac rspunsul utilizatorului la o cerere a o funcie
GETXXXX este neconform ce cerinele este afiat un mesaj de eroare i este repetat cererea.
Argumentul list_de_cuvinte_cheie este un ir de caractere sau set de iruri de caractere
separate prin spaii i care constituie posibile rspunsuri. De exemplu:
(initget CENtru RAZa)
(getkword Metoda?:)
permite un rspuns prin centru, raza, cen sau raz. Aadar majusculele specific
prescurtrile prin care se poate furniza rspunsul.
Funcia INITGET returneaz nil, iar efectul ei nceteaz dup primul apel al unei funcii
GETXXXX.
(GETKWORD mesaj)
Aceast funcie testeaz introducerea de ctre utilizator a unui cuvnt cheie autorizat de
ctre funcia INITGET folosit anterior i repet aciunea pn la obinerea rspunsului corect
pe care l returneaz ca rezultat.
201
To point:<ENTER>
Command:(setq ent (entsel \nAlegeti o entitate:))
Alegeti o entitate:3,3
(<Entity name: 3180520> (3.0 3.0 0.0))
(8 . "0")
(62 . 1)
stratul entitii
culoarea entitii
punctul iniial al entitii
punctul final al entitii
(ENTLAST)
Aceast funcie returneaz numele ultimei entiti introdus n baza de date. Dac, n
exemplul anterior, linia 1,1-6,6 ar fi fost ultima generat, se putea folosi cu acelai rezultat:
(entget (entlast))
(ENTNEXT [nume_de_entitate])
Aceast funcie are ca efecte:
- dac nume_de_entitate lipsete este returnat numele primei entiti din baza de date;
- dac nume_de_entitate este specificat se returneaz numele entitii urmtoare din baza de date;
- cnd nume_de_entitate reprezint ultima entitate din baza de date funcia returneaz nil.
(ENTDEL nume_de_entitate)
Aceast funcie terge din baza de date entitatea de nume specificat. Dac entitatea a fost
deja tears ea va fi restaurat.
(ENTMOD list_de_entitate)
Acestei funcii i se transmite ca argument o list de entitate n care au fost operate
modificri prin intermediul funciilor prelucrtoare de liste (n special folosind SUBST), dar
fr a se opera asupra asociaiei cu 1 (cea care conine numele de entitate a se vedea
exemplul de mai sus). Funcia modific entitatea conform modificrii operate n list.
De exemplu, pentru linia de mai sus:
(setq oldcul (assoc 62 elist))
returneaz perechea cu punct (62 . 1) coninnd vechea
culoare a entitii
(setq elist (subst (cons 62 5) oldcul elist)) returneaz o list nou de entitate in care
202
203
va reine din toat baza de date numai entitile de tip cerc de culoare roie.
Numrul maxim de seturi de selecie este de 128, orice ncercare de a crea un set n plus se
va solda cu returnarea rezultatului nil.
Pentru a desfiina un set de selecie devenit inutil acesta trebuie asociat cu nil, de exemplu:
(setq cercuri_rosii nil)
(gc)
204
Fig. 10.1.
205
Fig.10.1.2.
Fig.10.1.5.
Fig.10.1.3.
Fig.10.1.4.
Fig.10.1.6.
Fcnd o scurt examinare a figurilor 10.1.2 ... 10.1.8, se observ c unele dintre articolele
de meniu sunt afiate cu negru iar celelalte cu gri. Motivul este acelai ca i n Windows, i
anume contextualitatea comenzilor cu situaia de lucru curent. Dac o comand este
aplicabil ntr-un anumit moment al lucrului ea va fi afiat cu negru, altfel este afiat cu gri.
206
Fig.10.1.7.
Fig.10.1.8.
Meniul Edit (figura 10.1.3) este destinat operaiilor de editare (modificare) n fiierul de
lucru curent i conine articolele:
- Restore line - este echivalentul comenzii Undo din programele Windows, restaurnd
situaia anterioar ultimei modificri;
- Cut, Copy i Paste, au aceleai semnificaii ca i n Windows;
- Copy example. Mediul TcLite pune la dispoziie o serie de exemple care, cu aceast
comand, pot fi copiate n Clipboard n ntregime;
- Show Clipboard - deschide fereastra Clipboard n care se afl stocat textul copiat
anterior cu comenzile Copy sau Cut;
- Clear - terge textul selectat fr a-l mai copia n Clipboard.
Meniul Search (figura 10.1.4) este destinat operaiilor pentru cutare i/sau nlocuire de
secvene de text i conine articolele:
- Find - pentru cutarea unui ir de text selectat;
- Replace - pentru nlocuirea unui ir de text selectat cu un altul specificat;
- Search again - pentru repetarea cutrii unui ir de text;
- Go to line number - pentru poziionarea cursorului la o linie de text de numr indicat;
- Previous error - pentru poziionarea cursorului la eroarea semnalat de compilator
anterioar erorii la care se afl n mod curent cursorul (n timpul operaiilor de depanare a
programelor);
207
208
= Library Directory - directoarele care conin fiiere de bibliotec n cod obiect sau
executabil care trebuie legate cu fiierul de compilat sau sunt apelate de acesta n cursul execuiei;
= Output directory - directorul de ieire, adic acela n care este stocat produsul
compilrii sub form de fiier obiect (OBJ).
- Environment - pentru stabilirea setrilor de lucru ale mediului de programare (preferine
de folosire a ecranului, opiuni privind editorul de text, modul de comportare al mouse-ului);
- Save - comand de salvare a opiunilor de lucru stabilite cu meniul Options.
Meniul Window este destinat lucrului cu ferestrele mediului de programare. Este destul de
explicit i uor de neles, astfel nct, pentru economia acestei lucrri vom renuna la
prezentarea lui, cu att mai mult cu ct meniul Help pune la dispoziia utilizatorului
lmuririle necesare.
10.1.4. Aplicaie
Vom trece acum la un exemplu de program C++, prin care vom ncerca s parcurgem
practic etapele de lucru cu acest mediu de programare.
#include <stdio.h>
/* directive preprocesor */
#include <conio.h>
#include <iostream.h>
void main()
/* functia principala */
{int i;
/* declaratii de tipuri de variabile */
char c;
i=0;
/* urmeaza instructiunile */
while ((c=getchar()) != '\n') {i=i+1;}/* asteapta apasarea tastei
ENTER si numara apasarile
de taste */
cout << "Inainte de a apasa ENTER ati apasat " << i << " taste\n";
getch();
/* asteapta apasarea unei taste */
}
Componena programului:
Programul conine dou blocuri, i anume:
- blocul directivelor preprocesor. n acest bloc apar directivele include. El ntiineaz
compilatorul ca, pentru funciile nedefinite n corpul programului s se efectueze o cutare n
fiierele stdio.h, conio.h i iostream.h. Aceste cutri sunt necesare pentru funciile getchar,
getch i cout, care nu sunt definite n program.
- funcia principal, main. n aceast funcie sunt coninute instruciunile programului.
Textele incluse ntre perechile de caractere /* i */ constituie comentarii i sunt ignorate de
compilator.
Etapele de lucru pentru elaborarea programului sunt:
- Dup lansarea programului compilator, se scrie textul surs (cel prezentat mai sus).
Editorul de text este inclus n mediul de programare i nu necesit accesare separat. Practic,
programatorul se gsete tot timpul n editorul de text;
- nainte de a se trece la urmtoarele etape, pentru a nu se pierde programul surs ca
urmare a unei erori de execuie care ar conduce la blocarea compilatorului (se poate ntmpla
oricnd din diferite motive, legate mai ales de o concepie defectuoas a programului), se
salveaz fiierul surs. La prima salvare se va folosi comanda Save as din meniul File. Se va
alege un director de depozitare a fiierului program surs i i se va atribui un nume. Numele
209
trebuie urmat de extensia C sau CPP dup cum este vorba de folosirea limbajului C standard
sau a versiunii sale extinse, i anume C++.
- Urmtoarea etap este cea de compilare. Pentru aceasta se folosete meniul Compile, din
care se selecteaz comanda Compile to OBJ. Aceasta produce fiierul cod obiect relocabil.
Dac la salvare s-a ales numele DID1.CPP, la compilare va fi produs fiierul DID1.OBJ.
n aceast faz are loc depistarea erorilor de sintax i de definire. Compilatorul nu va
raporta ndeplinirea sarcinii de compilare dact atunci cnd toate erorile vor fi fost eliminate.
Dac apar erori, acestea sunt raportate ntr-o fereastr de mesaje (Message Window) care se
deschide la baza ferestrei compilatorului.
- n cazul unei lucrri mai complexe, pentru crearea unui program din mai multe module,
se folosete un fiier proiect (nume.PRJ) care conine indicaiile privind componena lucrrii.
n cazul nostru, deoarece nu exist un proiect, se pot folosi numai comenzile Compile to
OBJ i Make EXE file. Pentru simplitate, vom folosi numai Compile to OBJ pentru a activa
analiza erorilor. Nu vom mai folosi Make EXE file deoarece comanda Run din meniul Run
ndeplinete funciile cumulate ale comenzilor Compile to OBJ i Make EXE file.
Am putea folosi de la nceput comanda Run dar nu este indicat deoarece nc nu am
eliminat erorile i ne expunem pericolului unei cderi a programului compilator din cauza
erorilor neeliminate.
Obs. O serie de erori greu detectabile sunt cele de execuie, cauzate de vicii de concepie.
Aceste erori nu sunt de tip sintactic, nici de definire, i nu sunt detectabile n faza de
compilare. Ele nu se manifest dect la execuie i pot cauza efecte nedorite dintre cele mai
diverse, de la simple rezultate eronate pn la cderi ale sistemului.
/*directive preprocesor*/
/*definitii de tipuri noi*/
void main(void)
{intreg primul=UNU;
mesaj(primul);
getch();
}
210
Funciile definite de utilizator pot fi definite i dup funcia main. Totui, compilatorul are
nevoie s tie mcar tipurile argumentelor de intrare n funcie i tipul rezultatului returnat de
funcie, altfel, la ntlnirea apelurilor respectivelor funcii n funcia main, nu va putea aloca
spaiile necesare n memorie.
Din acest motiv, dac definirea unei funcii se va face dup funcia main, trebuie ca
inaintea funciei main s se plaseze un "prototip" al respectivei funciei, prototip al crui rol
este de a defini tipurile datelor de intrare i ieire n/din funcie.
Observaie: funcia getch are numai rolul de a conserva starea ecranului pn cnd
utilizatorul apas pe o tast. Altfel, mediul de programare ar prelua imediat controlul
reafind textul surs din editorul de text al mediului TcLite. Pentru un program rulabil direct
de sub sistemul DOS, aceast instruciune nu ar fi necesar.
Exemplul al doilea este o variant a primului exemplu, dar cu folosirea unui prototip de
funcie.
Exercitiul B
#include <stdio.h>
#include <conio.h>
#define UNU 1
typedef int intreg;
/*directive preprocesor*/
/* definitii de tipuri */
void mesaj(intreg)
void main(void)
{intreg al_doilea=UNU+1;
mesaj(al_doilea);
getch();
}
/* programul principal */
Al treilea exemplu ilustreaz folosirea funciilor n scopul simplificrii scrierii unui program.
Funcia intrebare afieaz pe ecran textul unei ntrebri folosind funcia de bibliotec printf.
Funcia raspuns afieaz pe ecran textul preluat de la utilizator prin intermediul funciei de
bibliotec gets.
Exercitiul C
#include <stdio.h>
#include <conio.h>
/*directive preprocesor*/
void intrebare(void)
/* definirea functiilor */
{printf("Cum te cheama?\n");}
void raspuns(char &nume)
{printf("Ma bucur de cunostinta, %s\n",&nume);}
211
void main(void)
{char nume[50];
intrebare();
gets(nume);
raspuns(*nume);
getch();
}
/* programul principal */
/* programul principal */
212
213
214
tiptab(tabl);
increment(tabl);
cout << "Tabloul incrementat\n";
tiptab(tabl);
getch();
}
215
216
dac spaiul este folosit integral sau nu. n plus, ncercarea de a folosi spaiu peste cel alocat,
se soldeaz cu o eroare de execuie si cu abandonarea programului.
Limbajele interpretoare (Basic, LISP, s.a.), nu au, n general, acest dezavantaj, n
schimb au viteza mic de execuie.
Pentru a nltura acest dezavantaj, pstrnd n acelai timp i avantajul vitezei mari de
execuie, limbajul C (i C++) posed funcii de alocare/eliberare de memorie n cursul
execuiei. In acest caz, n loc de a utiliza tablouri, se folosete tehnica de lucru cu pointeri
combinat cu folosirea funciilor de alocare/eliberare a memoriei.
Pentru alocarea memoriei, sub DOS, se folosete funcia calloc care are prototipul:
este lungimea n octei a tipului de date de stocat. Pentru a scuti programatorul de cunoaterea
mrimii tipului n functie de implementarea limbajului C i pentru a asigura portabilitatea
programelor pe diferite platforme, se folosete funcia sizeof(tip) la calculul mrimii n octei
a tipului de date de stocat. Funcia calloc aloc un spaiu (bloc) de memorie de
nrart*marime octei n memoria de baz si returneaza un pointer (void * nseamn
pointer ctre orice tip) ctre blocul de memorie alocat, sau valoarea NULL dac nu a putut fi
gsit disponibil pentru alocare spaiul de memorie cerut sau dac nrart sau marime este 0.
Functia calloc nu poate aloca mai mult de 64 Kbytes de memorie.
O alt funcie de alocare de memorie este malloc cu sintaxa:
void *malloc(size_t marime)
void free(*bloc)
unde *bloc este pointerul ctre un bloc de memorie alocat anterior cu funcia calloc sau
malloc.
217
{int i;
for(i=0;i<n;i++) cout << "a(" << (i+1) << ")=" << *(tablou+i) << "\n";
}
void main()
{int n,i; float *tablou;
cout << "Specificati numarul de elemente ale tabloului, n=";
cin >> n;
tablou=(float *)calloc(n,sizeof(float));
if(tablou!=NULL)
{cout << "\nIntroduceti elementele tabloului\n";
for(i=0;i<n;i++) *(tablou+i)=cere_element(i);
cout << "Elementele tabloului sunt:\n";
afis_tablou(n,tablou);
free(tablou);
}
else cout << "Alocare esuata!\n";
getch();
}
Testarea programului:
1. La cererea Specificati numarul de elemente ale tabloului, n= rspundei
introducnd valoarea 0. Vei obine rspunsul Alocare esuata!
2. Acelai efect l vei obine i introducnd valoarea 20000 (deoarece sizeof(float)=4,
nrart*sizeof(float)=4*20000>64 Kbytes);
3. Rspunznd cu o valoare corespunztoare posibilitilor funciei, de exemplu 5, rularea
programului va decurge normal.
Exemplul 2. Alocarea de spaiu pentru un tablou bidimensional de caractere
n acest exemplu fiecare dintre irurile de caractere SIR DE STOCAT IN MEMORIE
este un tablou unidimensional format din valori de tip caracter. Acest tablou este iniializat ca
pointer. Variabila psir este un pointer ctre un pointer, constituind un tablou bidimensional.
Alocarea de spaiu pentru acest tablou a fost fcuta cu functia malloc astfel: mai nti a fost
alocat un bloc de memorie pentru un tablou care stocheaza pointerii catre pointeri (psir) i
apoi, de nrart ori, n acest tablou au fost stocai pointerii ctre blocurile de memorie n care
se vor stoca ulterior irurile SIR DE STOCAT IN MEMORIE.
Funcia strcpy a fost folosit pentru a copia la adresele coninute de aceti pointeri
irurile de caractere menionate.
Funcia exit(1) produce ncheierea forat a programului.
Eliberarea memoriei se face n ordine invers: mai nti se elibereaz blocurile de
memorie alocate pentru iruri i apoi se elibereaz blocul de memorie n care sunt stocai
pointerii catre iruri.
#include
#include
#include
#include
#include
<iostream.h>
<conio.h>
<alloc.h>
<string.h>
<stdlib.h>
void main()
{char *sirstoc="SIR DE STOCAT IN MEMORIE"; char **psir;
int nrart=5,i;
218
Rezultatul rulrii acestui program este apariia succesiv pe prima linie a ecranului, la
fiecare apsare de tast, a urmtoarelor afiri:
Apasa o tasta_pentru a sterge linia de la cusor pana la capat
Apasa o tastaApasa o tasta pentru a sterge tot ecranul
Apasa o tasta pentru a iesi din program
Aplicaia 2
#include <conio.h>
void main()
{int i,n=9;
clrscr();
for(i=1;i<=n;i++) {gotoxy(i,i); cprintf("*");}
for(i=1;i<=n;i++) {gotoxy(i,n+1-i); cprintf("*");}
getch();
}
219
*_
*
*
*
*
*
*
* *
*
* *
*
*
*
Aplicaia 3
#include <conio.h>
void main()
{char tampon[62]; int i;
clrscr();
gotoxy(10,10);
cprintf("Text de control. Apasa o tasta."); getch();
gettext(10,10,40,10,tampon);
for(i=1;i<=5;i++)
{clrscr(); puttext(10+i,10,40+i,10,tampon); getch();}
}
Rezultatul rulrii acestui program este deplasarea textului afiat cu cte o poziie ctre
dreapta la fiecare apsare a unei taste.
Textul are lungimea de 31 de caractere dar tabloul tampon n care este el stocat are
lungime dubl (62) deoarece, pentru a fi manipulat prin funciile gettext i puttext fiecare
caracter trebuie memorat pe 2 octei, unul pentru codul ASCII al caracterului iar cellalt
pentru codul de culoare.
Funcia gettext culege textul existent pe ecran ntr-un dreptunghi cu coordonatele col
stnga sus - col dreapta jos exprimate n coordonate ntregi indice coloan, indice rnd.
Textul cules este memorat n tabloul tampon.
Funcia puttext pune textul din tampon ntr-un dreptunghi cu coordonatele colurilor
exprimate n acelai mod.
Pentru detalii a se vedea HELP-ul mediului de programare.
Aplicaia 4
Fig.10.8.1.
#include <conio.h>
void main()
{char sir[]="ABCDEFGHIJ"; int i;
clrscr();
for(i=0;i<=7;i++)
{gotoxy(10,10+i);
textbackground(i);
textcolor(i+1);
cprintf(sir);
}
getch();
}
220
<graphics.h>
<stdlib.h>
<stdio.h>
<conio.h>
<string.h>
void main()
{/* parametrii de autodetectare grafica */
int gdriver = DETECT, gmode, errorcode;
/* definirea unor date din program */
int i, maxcolor, maxx, maxy, xmed, ymed;
char dest[40], mesaj[]="Numarul maxim de culori este ", numcolor[3];
/* initializarea tabloului sir de caractere de concatenare */
for(i=0;i<40;i++) dest[i]=0;
/* initializarea modului grafic */
initgraph(&gdriver, &gmode, "");
/* citirea rezultatului initializarii */
errorcode = graphresult();
if (errorcode != grOk) /* daca a survenit o eroare */
{printf("Eroare grafica: %s\n", grapherrormsg(errorcode));
printf("Apasa o tasta pentru oprire:");
getch();
exit(1);
/* iesire in caz de eroare */
}
maxcolor=getmaxcolor();
/* numarul maxim de culori */
maxx=getmaxx();
/* numarul maxim de pixeli pe orizontala */
maxy=getmaxy();
/* numarul maxim de pixeli pe verticala */
xmed=maxx/2;
/* coordonatele centrului ecranului */
ymed=maxy/2;
/* pregatire pentru afisarea unui text grafic */
setcolor(MAGENTA);
settextjustify(CENTER_TEXT,CENTER_TEXT);
settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
/* text cu marime dubla */
itoa(maxcolor+1,numcolor,10); /* conversia din intreg in sir de
caractere exprimat zecimal */
strcat(dest,mesaj);
/* concatenarea sirurilor de caractere */
strcat(dest, numcolor);
outtextxy(xmed,ymed,dest); /* afisarea textului */
getch();
/* pauza pana la apasarea unei taste */
for(i=0;i<=maxcolor;i++) /* ciclare pentru toate culorile */
{setbkcolor(i);
/* stabilirea culorii fondului */
cleardevice();
/* stergerea ecranului grafic */
setfillstyle(SOLID_FILL,maxcolor-i); /* stabilirea stilului si a
culorii de umplere */
bar(maxx/4,maxy/4,0.75*maxx,0.75*maxy); /* desenarea unui dreptunghi
cu interiorul umplut */
getch();
/* pauza pana la apasarea unei taste */
}
closegraph();
/* inchiderea dispozitivului grafic */
}
221
Rezultatul rulrii acestui program este desenarea unui text i a unei succesiuni de fonduri
de ecran i de dreptunghiuri pline.
Urmtorul exemplu ilustreaz modul de compunere a culorilor pe ecranul grafic DOS.
Aplicaia 2
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <alloc.h>
#include <mem.h>
/* definire structuri*/
struct centru {int x, y;};
struct imagine {void * bloc;};
/* functie de generare si stocare a imaginii */
imagine stocare_cerc(int culoare, centru cent, int raza)
{imagine imag_cerc; int marime;
/* stabilirea stilului si a culorii de umplere */
setfillstyle(SOLID_FILL,culoare);
/* stabilirea culorii conturului */
setcolor(culoare);
/* desenarea unui disc umplut */
pieslice(cent.x,cent.y,0,360,raza);
/* determinarea marimii imaginii */
marime=imagesize(cent.x-raza,cent.y-raza,cent.x+raza,cent.y+raza);
/* alocarea spatiului de memorie pentru stocarea imaginii */
imag_cerc.bloc=malloc(marime);
/* stocarea imaginii in spatiul alocat */
getimage(cent.x-raza,cent.y-raza,cent.x+raza,cent.y+raza,
imag_cerc.bloc);
return imag_cerc;
}
void main()
{int gdriver = DETECT, gmode, errorcode;
int maxx,maxy,xc,yc,raza=70,raza1,dist;
centru c1, c2, c3, c4;
imagine imag_cerc;
void * cerc1, * cerc2, * cerc3, * cerc4;
/* initializarea grafica */
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk)
{printf("Eroare grafica: %s\n", grapherrormsg(errorcode));
printf("Apasa o tasta pentru oprire:");
getch();
exit(1);
}
/* calcul parametri geometrici */
maxx=getmaxx(); maxy=getmaxy();
xc=maxx/2; yc=maxy/2;
dist=0.5*raza/cos(M_PI*30/180);
222
c1.x=xc-0.5*raza; c1.y=yc-0.5*raza*tan(M_PI*30/180);
c2.x=xc+0.5*raza; c2.y=c1.y;
c3.x=xc; c3.y=yc+dist;
c4.x=xc; c4.y=yc;
/* stergerea ecranului, stabilirea culorii de fond */
cleardevice(); setbkcolor(0);
/* generarea si stocarea succesiva a imaginilor */
imag_cerc=stocare_cerc(RED, c1, raza);
cerc1=imag_cerc.bloc;
imag_cerc=stocare_cerc(GREEN, c2, raza);
cerc2=imag_cerc.bloc;
imag_cerc=stocare_cerc(BLUE, c3, raza);
cerc3=imag_cerc.bloc;
raza1=0.8*raza;
imag_cerc=stocare_cerc(DARKGRAY, c4, raza1);
cerc4=imag_cerc.bloc;
/* stergerea ecranului si afisarea aditionala a imaginilor */
cleardevice();
putimage(c1.x-raza,c1.y-raza,cerc1,OR_PUT);
putimage(c2.x-raza,c2.y-raza,cerc2,OR_PUT);
putimage(c3.x-raza,c3.y-raza,cerc3,OR_PUT);
putimage(c4.x-raza1,c4.y-raza1,cerc4,OR_PUT);
/* pauza de afisare */
getch();
/* eliberarea memoriei si inchiderea dispozitivului grafic */
free(cerc1); free(cerc2); free(cerc3); free(cerc4);
closegraph();
}
Fig.10.9.1.
Cuvintele simbolice folosite pentru culori n C sub DOS, pentru majoritatea dispozitivelor
grafice mai actuale, sunt date n tabelul de mai jos.
223
Cuvnt simbolic
Culoare
Valoare zecimal
BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
Negru
Albastru
Verde
Turcoaz
Rou
Liliachiu
Brun
Gri deschis
Gri nchis
Albastru deschis
Verde deschis
Turcoaz deschis
Rou deschis
Liliachiu deschis
Galben
Alb
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cod binar
0000LRGB
00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
224
Explicaii
n funcia sir_val_func se calculeaz valorile unei funcii polinomiale ntr-un sir de puncte
x pe baza formulei iterative:
225
f(x)=a0+a1x1+a2x2+a3x3+...+an-1xn-1+anxn=a0+x(a1+x(a2+x(a3+... +x(an-1+x(an))...)))
Derivata polinomului este:
f '(x)=a1+2a2x1+3a3x2+...+(n-1)an-1xn-2+nanxn-1
i este tratat la fel ca i funcia.
Fig.10.10.1.
Funciile valmin i valmax extrag valoarea minim i pe cea maxim dintr-un ir de valori.
Funcia desen diag afieaz diagrama functiei.
Programul permite desenarea diagramelor unui polinom i a derivatei acestuia pentru orice
ordin. Ca rezultat al rulrii lui pentru setul de valori:
ordin = 2
a[0]= -4
a[1]= 0
a[2]= 1
x minim = -3
x maxim = 3
226
227
void main()
{float dx;
int i, dispgr=DETECT, modgr, xmaxecran, ymaxecran, xc, yc;
diagrama diagfunc, diagderiv;
cout << "Introduceti ordinul polinomului: "; cin >> diagfunc.ordin;
for(i=0;i<=diagfunc.ordin;i++)
{cout << "a(" << i << ")="; cin >> diagfunc.termeni[i];}
cout << "Introduceti domeniul de calcul: ";
cout << "x minim="; cin >> diagfunc.xs;
cout << "x maxim="; cin >> diagfunc.xd;
initgraph(&dispgr, &modgr, "");
xmaxecran=getmaxx(); ymaxecran=getmaxy();
setbkcolor(BROWN); clrscr();
dx=(diagfunc.xd-diagfunc.xs)/NINT;
for(i=0;i<NPCT;i++) diagfunc.sir_x[i]=diagfunc.xs+i*dx;
diagfunc.sir_val_func();
cleardevice();
diagfunc.lung=0.4*xmaxecran; diagfunc.inalt=0.8*ymaxecran;
diagfunc.culfond=LIGHTMAGENTA; diagfunc.culdiag=BLUE;
diagfunc.culcadru=LIGHTCYAN; diagfunc.titlu="FUNCTIA";
xc=0.25*xmaxecran; yc=0.5*ymaxecran;
diagfunc.xdiag1=xc-diagfunc.lung/2;
diagfunc.ydiag1=yc-diagfunc.inalt/2;
diagfunc.desen_diag();
diagderiv=diagfunc;
diagderiv.ordin=diagderiv.ordin-1;
for(i=0;i<=diagderiv.ordin;i++)
diagderiv.termeni[i]=(i+1)*diagderiv.termeni[i+1];
diagderiv.sir_val_func();
diagderiv.xdiag1=xmaxecran/2+xc-diagderiv.lung/2;
diagderiv.culdiag=RED; diagderiv.titlu="DERIVATA";
diagderiv.desen_diag();
getch();
}
Au fost folosite dou structuri: diagfunc pentru diagrama funciei i diagderiv pentru
diagrama derivatei.
Deoarece o anumit parte dintre datele diagramei derivatei sunt aceleai ca i pentru
diagrama funciei, instruciunea diagderiv=diagfunc copiaz toate aceste date de la o
structur la alte, ulterior fiind modificate numai datele diferite.
Se observ c scrierea programului principal devine mai explicit i, totodat, mai
flexibil, chiar dac aparent, sunt ceva mai multe instruciuni de scris. Aceast impresie este
fals deoarece aplicaia este de mic amploare. n realitate, n cazul aplicaiilor mari,
programele devin mai scurte, deoarece se manevreaz numai asupra datelor i doar sunt
invocate funciile de tratare din cazul structurilor.
228
numrul de instruciuni de stabilire a caracteristicilor unei diagrame dac ele sunt deja definite
n obiectul diagram surs.
Astfel, dup ce este creat obiectul diafun pentru diagrama polinomului i i sunt definite
caracteristicile, obiectul nou creat diaderiv pentru diagrama derivatei va copia instana
diafun i vor fi stabilite prin declaraiile corespunztoare numai acele caracteristici care
difer de acelea ale diagramei polinomului.
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
#define NINT 100
#define NPCT NINT+1
/* definitii de structuri de date */
struct datefunctie
{int ordin;
float termeni[NPCT], sir_x[NPCT], sir_y[NPCT], xs, xd;
};
struct paramdiag
{int xmaxecran, ymaxecran, xdiag1, ydiag1;
char * titlu;
int lung, inalt, culfond, culdiag, culcadru;
};
/* definirea clasei de obiecte pentru generarea de diagrame */
class diagrama
{public:
/* datele membre ale clasei */
datefunctie dfun; paramdiag pdiag;
/* functiile membre ale clasei */
diagrama& copie_date(diagrama& sursa) /* constructor de copiere cu
autoreferire */
{dfun=sursa.dfun; pdiag=sursa.pdiag; return * this;};
void sir_val_func(void);
/* generarea valorilor funciei */
float valmax(int, float *); /* extragerea valorii maxime dintr-un sir */
float valmin(int, float *); /* extragerea valorii minime dintr-un sir */
229
void desen_diag(void);
};
/* desenarea diagramei */
230
Se observ c prin aceast tehnic programul principal, funcia main, s-a redus la o
succesiune de atribuiri de valori pentru datele membre ale obiectelor clasei diagrama, i la
invocarea funciilor membre.
Diagrama care se obine pentru datele:
ordin = 2
a[0]= -4
a[1]= 0
a[2]= 1
x minim = -3
x maxim = 3
231
Aceasta este o metod de lucru foarte avantajoas. Pe lng uurina manevrrii obiectelor
n cadrul programului, apare i posibilitatea ca, o dat ce un obiect a fost pus la punct, el s fie
stocat n biblioteci de tip fiiere antet (header, cu extensia .h) de unde s poat fi extras prin
instruciunea #include. n programarea orientat pe obiecte folosit n WINDOWS, aceast
tehnic este folosit cu preponderen i, mai mult, chiar limbaje necompilate cum este Visual
BASIC prezent n mediile de dezvoltare integrate din diferite aplicaii, prin conveniile
limbajului reproduc procedeele acestei tehnici.
Fig.10.11.1.
232
Fig.11.1.1.
233
/ pentru fracii;
$ pentru stilul monetar;
% pentru procent;
E sau e pentru exponentul zecimal din notaia tiinific.
Formatele pentru numere pot fi: ntreg, zecimal fracionar i zecimal tiinific;
Dat calendaristic i marc de timp;
Valori logice: TRUE sau FALSE;
Coduri de eroare:
#DIV/0!
mprire cu zero;
#N/A
Valoare lips;
#NAME?
Nume invalid al unei celule referit prin nume;
#NULL!
Intersecie de domenii vid;
#REF!
Referin invalid;
#VALUE!
Valoare incorect;
###....##
Spaiu insuficient pentru afiare;
Referin, caz n care celula gazd a coninutului afieaz coninutul celulei referite;
Formule i funcii, caz n care celula gazd afieaz rezultatul evalurii formulei sau
funciilor.
11.1.3. Utilizarea formulelor i funciilor
11.1.3.1. Formule
O formul este constituit din operatori i operanzi i ncepe ntotdeauna cu caracterul =.
Operatorii pot fi:
Operatori aritmetici: + pentru adunare, - pentru scdere, * pentru nmulire, / pentru
mprire, % pentru procent (dup o valoare), ^ pentru ridicare la putere;
operatorul de concatenare de texte: &. De exemplu, formula =Tasta&tura are ca
rezultat irul de text Tastatura;
Operatori de referine la celule:
: se folosete pentru a indica un domeniu. De exemplu, A2:C4 reprezint celulele cu
tent gri din figura 11.1.2;
spaiul este folosit pentru a indica o interscie de domenii. De exemplu, A3:C2 B2:C4
reprezint celula B3 din figura 11.1.3;
, se folosete pentru la enumerarea elementelor dintr-o uniune. De exemplu,
A2:A4,C2:C4 reprezint uniunea domeniilor marcate cu gri din figura 11.1.4.
Fig.11.1.2.
Fig.3.
Fig.11.1.5.
Fig.11.1.4.
valori constante;
referine la celule sau domenii de celule;
funcii predefinite sau definite de utilizator.
Formulele pot conine paranteze rotunde ( ) pentru separarea
grupurilor de operaii.
234
235
- Text (este ignorat caracterul coninutului care este tratat ca un simplu text).
Alignment. Aceast pagin conine controale de aliniere a afirii rezultatului evalurii
coninutului celulei.
Font. Aceast pagin conine controale de stabilire a tipului de caracter folosit, mrime
culoare i stil de scriere.
Border. Aceast pagin conine controale de stabilire a trasrii chenarului celulei.
Patterns. Aceast pagin conine controale de stabilire a modelului de umplere a celulei.
Protection. Aceast pagin conine controale de protejare a celulei, controale care au
efect numai dac i foaia de lucru este protejat.
Pentru operare rapid, pe bara de scule Formatting exist butoane care asigur o parte
dintre operaiile de formatare accesibile din cutia de dialog Format Cells fr a mai fi
necesar deschiderea acesteia.
O combinaie de atribute de formatare constituie un stil. Stilul poate fi memorat cu o
denumire, folosind cutia de dialog Style care se deschide din meniul Format, articolul Style.
O dat memorat, stilul poate fi aplicat altor celule.
11.1.5. Macro comenzi i macro funcii
Un macro este un grup de aciuni sau de operaii, identificate printr-un nume. Aciunile
i operaiile coninute de macro sunt scrise n limbajul Visual Basic ntr-o anex special a
documentului, denumit modul, gestionat de editorul de macrocomenzi.
Macro-urile sunt de dou tipuri:
macro-comand, constnd dintr-o secven de operaii nregistrate cu ajutorul
nregistratorului de macro-uri. Acesta scrie operaiile nregistrate sub forma unei subrutine n limbaj
Visual Basic. Macro-comenzile pot consta chiar din subrutine scrise direct de ctre utilizator;
macro-funcie, constnd dintr-o funcie n limbaj Visual Basic scris de ctre utilizator.
11.1.5.1. nregistrarea macro-comenzilor
nregistratorul de macrocomenzi este o facilitate EXCEL care permite:
declanarea nregistrrii, din meniul Tools > Macro > Record New Macro;
nregistrarea oricrei aciuni efectuat de utilizator pe durata ct nregistratorul este activ:
oprirea nregistrrii, din meniul Tools > Macro > Stop Recording;
Ca rezultat, este creat acea anex special a documentului care conine module de Visual
Basic. Ca structur, anexa pentru module apare ca un container denumit Modules, n care
sunt coninute modulele denumite Modulej, j=1,2,3,..., n care EXCEL scrie automat o
subrutin coninnd secvena de instruciuni n limbaj Visual Basic corespunztoare aciunilor
nregistrate. Macro-ul scris are structura urmtoare:
'Linii de
'comentariu
Sub nume_de_macro()
secventa de instructiuni
End Sub
Numele nume_de_macro este numele introdus de utilizator n cmpul de editare din cutia de
dialog Record New Macro, sau atribuit automat de EXCEL sub forma Macroj, j=1,2,3...
Accesul la editorul de Visual Basic se face din meniul Tools>Macro>Visual Basic Editor.
11.1.5.2. Execuia unei macro-comenzi
O macro-comand poate fi executat n dou moduri:
Prin declanare explicit din meniul Tools > Macro >Macros cutia de dialog
236
Macro. De aici, din cutia de listare Macro Name se selecteaz numele macro-comenzii dorite
i se apas butonul Run;
Prin asociere cu un element de interaciune grafic (meniu sau buton) definit de
utilizator.
11.1.5.3. Definirea unei macro-funcii
Vom explica acest subiect printr-o aplicaie, relativ la figura 11.1.5, conform urmtoarelor etape:
Ne situm ntr-un modul de Visual Basic, n care scriem funcia:
Function Supraf_cerc(Raza)
Supraf_cerc=3.1418*Raza^2
End Function
237
Sau:
- Dac macrocomanda nu exist n momentul ncercrii de asociere, ea poate fi creat. Pentru
aceasta, n cmpul de editare Macro Name din cutia de dialog Assign Macro, se scrie
numele noii macro-comenzi i apoi se apas butonul Record. n continuare se execut
operaia de nregistrare a aciunilor utilizatorului. La terminarea acesteia butonul este asociat
cu macro-comanda nregistrat.
Prin asociere cu un articol de meniu definit de utilizator.
Pentru a crea un meniu nou, se procedeaz astfel:
- se selecteaz o foaie pentru module;
- din meniul Tools > Customize. Se deschide cutia de dialog Customize;
- se opereaz n cutia de dialog Customize (cum anume, se va vedea la aplicaii).
Un meniu EXCEL este o structur arborescent pe mai multe nivele. El se compune dintrun nume de meniu, submeniuri i articole. Articolele meniului pot fi asociate cu macrocomenzi.
Fig.11.2.1.
11.2.2. Operaii elementare frecvente
11.2.2.1. Operaii de selectare
- Selectare de foaie de lucru unic: clic simplu cu butonul stnga mouse pe eticheta de foaie;
238
- Selectarea unui sir de foi consecutive (de exemplu, foile din irul Sheet3,4,5,6):
= se face clic pe eticheta primei foi din ir (Sheet3);
= se apas tasta SHIFT i se menine apsat;
= se face clic pe eticheta ultimei foi din ir (Sheet6);
= se elibereaz tasta SHIFT.
- Selectarea unui ir de foi neconsecutive (de exemplu irul Sheet3,5,7,9):
= se face clic pe eticheta primei foi din sir (Sheet3);
= se apas tasta CTRL i se menine apsat;
= se face clic pe eticheta urmtoarei foi din sir (Sheet5), apoi Sheet7, etc;
= se elibereaz tasta CTRL.
- Selectarea unui domeniu de celule: regulile sunt asemnatoare cu cele pentru selectarea foilor;
- Selectarea unui domeniu rectangular de celule: se face clic pe un col al domeniului, se menine
apsat butonul stnga mouse, se trage n diagonal pna la colul opus i se elibereaz butonul.
- Selectarea unui ntreg rnd sau coloan de celule: se face clic pe antetul de rnd sau de coloan;
- Selectarea unui ir de rnduri sau coloane: asemanator ca la etichetele de foi, dar pe antete.
11.2.2.2. Operaia de mutare a unei entiti (foaie, celul, rnd, coloan)
- Se selecteaz entitatea;
- Se poziioneaza cursorul pe chenarul seleciei pn la apariia formei de sgeat;
- Se trage n noua poziie.
Sau:
- Se selecteaz entitatea de mutat;
- Cu cursorul poziionat pe entitatea selectat, se selecteaz articolul Cut din meniul
contextual,
- sau din meniul Edit, se selecteaz articolul Cut. Efectul obinut este de a terge entitatea
din fiier transfernd-o n memoria tampon (Clipboard);
- Se selecteaz entitatea n faa creia se va face inplantarea entitii transferate n memoria
tampon;
- Cu ajutorul articolului Paste din meniul Edit sau din meniul contextual se face implantarea.
11.2.2.3. Operaia de copiere a unei entiti
Se face analog cu mutarea, dar cu tasta CTRL apsat n timpul operaiei de tragere, sau
folosind articolul Copy n locul articolului Cut.
11.2.2.4. Operaia de inserare a unei entiti
- Se face selectarea entitii n faa creia se va introduce noua entitate (de acelai tip);
- Din meniul Insert se selecteaz articolul Cells, Rows, sau Columns.
11.2.2.5. Operaia de tergere a unei entiti
- se selecteaz entitatea de ters;
- se apas tasta Delete, sau se selecteaz articolul articolul Delete din meniul Edit sau din
meniul contextual.
11.2.2.6. Intrarea n regimul de editare intracelular
- Se selecteaz celula vizat prin simplu sau dublu clic i se ncepe editarea.
- editarea poate fi facut direct n celul sau pe bara pentru formule.
11.2.3. Aranjarea convenabil a documentului
Deoarece n aceast aplicaie este necesar o singur foaie tabelar, vom pstra numai foaia
239
de lucru Sheet1. Celelalte foi, Sheet2, Sheet3 (i eventual altele) vor fi terse. Pentru aceasta
se face selectarea irului de foi consecutive Sheet2,..., etc (vezi punctul 11.2.2.1), dup care se
opereaz tergerea irului (vezi punctul 11.2.2.5).
11.2.4. Crearea tabelului
Tabelul conine valorile de calcul pentru funciile f ( x) = 1 e x i g( x) = 1 cos( x ) e x
- Se selecteaz domeniul dreptunghiular de celule de la C3 la E14 (vezi punctul 11.2.2.1);
- Se aplic formatele de chenar necesare pentru a desena tabelul din figura 11.2.2, cu
ajutorul butonului scul Borders de pe bara de scule Formatting;
- Se completeaz capul de tabel;
- Se completeaz celulele de tabel de la C4 la C14 cu valorile de la 0 la 10 ale coordonatei x;
- Celulele de la D4 la D14 conin formulele de calcul pentru f(x). De exemplu, celula D4
va conine formula =1-EXP(-C4). Funcia EXP se obine prin apsarea butonului fx de pe
bara cu scule Standard sau de pe bara de editare, cu care se deschide cutia de dialog
Function Wizard. De aici, din categoria Math&Trig se selecteaz funcia EXP.
Argumentele funciilor se introduc prin punctare pe celulele argumente. Formulele celorlalte
celule se completeaz asemntor.
- Celulele de la E4 la E14 conin formulele de calcul pentru g(x). De exemplu, celula D4
va conine formula =1-COS(X)*EXP(-C4). Completarea se face la fel ca mai nainte.
Fig.11.2.2.
11.2.5. Crearea diagramei centralizatoare
O diagram este reprezentarea grafic a unor dependene reciproce ale unor mrimi. n
acest caz, ne propunem s reprezentm grafic dependena mrimilor x, f(x), i g(x).
Etapele de lucru sunt urmtoarele:
- Pe rnd, se selecteaz: domeniul de valori al abscisei x (inclusiv capul de tabel) adic
domeniul $C$3:$C$14, apoi domeniul de valori al funciei f adic domeniul $D$3:$D$14 i
240
Fig.11.2.3.
Fig.11.2.4.
- Din meniul Insert > Chart > As New Sheet, se declaneaz procedura de creare a unei
diagrame ntr-o foaie distinct (nou), care va conine numai diagrama. Aceast procedur
folosete setul de cutii de dialog Chart Wizard Step n of 4, unde n=1...4;
- Este foarte probabil c EXCEL i
va alege singur tipul de diagram
Column. n cazul nostru este necesar
alegerea tipulu Scatter i deci se va
face un clic pe acest tip, pentru a-l
selecta (fig.3.). Ca subtip de diagram
se va alege tipul cu curb continu.
Dup aceasta se apas butonul Next.
Ca urmare se deschide cutia de dialog
Chart Wizard Step 2 of 4 (figura
11.2.4);
- De aici se selecteaz opiunea
Series in Columns. Dup ce se apas
butonul Next se deschide cutia
Fig.11.2.5.
Chart Wizard Step 3 of 4 (figura
11.2.5). Aici se scriu irurile de text
care vor apare ca inscripii pentru titlul diagramei (Diagrame functii), denumirea abscisei x i
denumirile funciilor f,g.
- Dup ce se apas din nou butonul Next este afiat cutia de dialog Chart Wizard Step 4 of 4
unde se selecteaz opiunea As new sheet pentru a se realiza o diagram n foaie separat.
Dac ne aflm la prima ncercare reuit de construcie a diagramei, foaia cu diagrama
capt automat numele Chart1 i va avea aspectul din figura 11.2.6.
241
Fig.11.2.6.
11.2.6. Crearea de macrocomenzi prin nregistrare
EXCEL dispune de o tehnic de mare ajutor, att pentru utilizatori ct i pentru
programatori, care const din scrierea automat de programe n limbaj Visual BASIC prin
simpla nregistrare a aciunilor utilizatorului, fr ca acesta s aib nevoie s cunoasc
limbajul.
Un macro, sau macrocomanda, este o succesiune de aciuni care pot fi executate printr-o
singura activare. EXCEL are posibilitatea de inregistra aciunile efectuate de utilizator ntre o
pornire i o oprire a inregistrarii. Trebuie s fiti atenti pentru ca EXCEL inregistreaza absolut
tot, inclusiv greselile.
Vom nregistra urmtoarele aciuni:
11.2.6.1. Comutare de la foaie de lucru la foaie de diagram
Fig.11.2.8.
Pentru comutare ntre foaia Sheet1 i foaia
Chart1, etapele de lucru sunt urmtoarele:
- Se selecteaz meniul Tools > Macro >
Fig.11.2.7.
Record New Macro. Ca urmare, se deschide
cutia de dialog Record Macro, figura 11.2.7.
n cmpul Macro Name, n loc de numele de macrocomand atribuit automat Macro1, se
scrie numele PrezDiag i se apas butonul OK.
- Ca urmare, apare bara cu scule Stop Recording, figura 11.2.8, coninnd butonul de
242
oprire a nregistrrii (cel cu pictograma de forma unui ptrat negru). nregistrarea poate fi
oprit i cu meniul Tools > Macro > Stop Recording. Toate aciunile efectuate de utilizator
pn la oprirea nregistrrii vor fi transpuse n limbaj Visual BASIC ntr-o foaie special
(foaie de module de program) care, dac ne aflm la prima nregistrare va purta numele de
Module1. Este nevoie de mult atenie pentru a nregistra strict ceea ce este necesar i pentru
a nu uita s fie oprit nregistrarea;
- Din foaia de lucru Sheet1 se apas eticheta de foaie Chart1;
- Se oprete nregistrarea. Ca urmare, n foaia Module1 va apare scris urmtorul modul de
program:
Sub PrezDiag()
Sheets("Chart1").Select
End Sub
Macrocomenzile nregistrate pot fi activate cu meniul Tools > Macro, sau pot fi asociate
ulterior cu un obiect de interaciune grafic.
11.2.7. Crearea de obiecte de interaciune grafic
11.2.7.1. Crearea unui buton de comutare din foaia de lucru n foaia cu diagrama
Dac privii din nou figura 11.2.2 vei observa un buton mare cu inscripia Diagrama.
Pentru a crea un buton se procedeaz astfel:
- Se selecteaz meniul View>Toolbars>Forms. Ca urmare se deschide bara cu
instrumente Forms (fig.11.2.11.);
- Se deseneaz butonul prin tehnica "drag and drop";
- Imediat ce desenarea s-a terminat se deschide cutia de dialog Assign Macro (fig. 11.2.9.)
Se
selecteaz
macrocomanda
PrezDiag i se apas butonul OK;
- Butonul rmne selectat (marcat cu
mnere), sau poate fi selectat pentru
modificare, folosind butonul dreapta al
mouse-ului. Se intr prin clic cu butonul
stnga i se schimb numele atribuit
automat (Button1) cu numele Diagrama.
Fig.11.2.9.
243
Fig.11.2.11.
Fig.11.2.12.
244
7. Se procedeaz la fel
pentru
butonul
Nu,
atribuindu-i-se
ca
tast
acceleratoare caracterul N;
Observaie: nu operai
alte modificri n cutia
Format Object, pentru c se
poate altera specificul de
aciune al butonului selectat.
8. Se selecteaz meniul
Tools > Record Macro >
Record New Macro. n cutia
de dialog Record New
Macro se atribuie numele PrezDialog
macrocomenzii a crei nregistrare se va
efectua. Ca urmare, nregistratorul de
macrocomenzi este pornit;
9. Se apas butonul Run Dialog de
pe bara cu scule Forms. Cutia de dialog
este afiat aa cum apare ea cnd este
folosit n dialogul cu utilizatorul;
10. Se apas butonul Nu al cutiei de
dialog definit de utilizator;
11.
Se
oprete
nregistrarea
macrocomenzii. Ca urmare, n foaia de
module apare modulul de program urmtor:
Sub PrezDialog()
DialogSheets("Dialog1").Show
End Sub
245
246
247
Fig.11.3.3.
= De pe bara de instrumente Standard a foii de lucru, se apas butonul Chart Wizard. Se
procedeaz ca la lucrarea de laborator 11.2: diagram de tip Scatter (perechi x,y
dispersate), dar specificnd subtipul Scatter with data points connected by lines;
= La pasul 2 (Step 2 of 4 - figura 11.3.2) se comut n pagina Series a cutiei de dialog
Chart Wizard i:
~ se schimb denumirea seriei 1 de date din Series1 n y=f(x) prin scrierea noului
nume n cmpul Name;
~ se aplic un clic pe articolul Series2 i se schimb denumirea seriei 2 de date din
Series2 n integrala, la fel ca mai sus;
~ se aplic un clic pe butonul Add pentru a se crea o serie nou de date. Aceasta se
denumete derivata;
~ la seria nou creat se aplic un clic n cmpul X values (eventual se terge
coninutul acestuia dac exist vreunul) apoi, din foaia de lucru cu datele diagramei, se
selecteaz domeniul de celule A3:A6;
~ se aplic un clic n cmpul Y values (eventual se terge coninutul acestuia dac exist
vreunul) apoi, din foaia de lucru cu datele diagramei, se selecteaz domeniul de celule F3:F6;
= Restul operaiilor de construire a diagramelor decurge dup cum se cunoate de la
lucrarea 11.2, cu efectul final de creare a unei diagrame n foaie separat (Chart1), avnd
aspectul din figura 11.3.3 (dup unele ajustri).
11.3.4. Rezolvarea programat. Automatizarea aplicaiei
O automatizare complet, n sensul generrii n ntregime a tabelului, implantrii
formulelor de calcul, i generrii diagramei, n condiiile unui numr variabil de perechi de
puncte x,y este mult mai laborioas.
De aceea, n continuare, ne vom mulumi cu o automatizare parial a aplicaiei n sensul
introducerii datelor i a sortrii lor n ordinea cresctoare a valorilor coordonatelor x.
Pentru a se putea vedea datele introduse anterior, trebuie realizat comutarea n foaia de
lucru Sheet1. Pentru aceasta, ca la lucrarea anterioar, se va comuta n foaia pentru diagram
Chart1 i se va nregistra comutarea n foaia de lucru Sheet1. Va fi creat subrutina
Afisare_date, cu componena de mai jos:
248
Sub Afisare_date()
Sheets("Sheet1").Select
End Sub
Pentru introducerea valorilor putem folosi o cutie de dialog ca aceea din figura 11.3.5. Deoarece
operaiile de introducere sunt simple, putem folosi o cutie de dialog de tip vechi, din categoria MS
Excel 5.0 Dialog (vezi lucrarea 11.2.2, punctul 11.2.7.3). Va fi creat foaia de dialog Dialog1.
n aceast cutie de dialog facem urmtoarele operaii:
- Se redenumete butonul OK cu denumirea Acceptare i i se atribuie tasta acceleratoare A;
- Se redenumete butonul Cancel cu denumirea Revocare i i se atribuie tasta acceleratoare R;
- Folosind instrumentul Label din cutia cu instrumente Forms se creaz etichetele x1...x5 i y1...y5;
- Folosind instrumentul Edit Box din cutia cu instrumente Forms se creaz cmpurile de
editare alturate etichetelor. La creare aceste obiecte primesc denumiri automate de tipul Edit
Box j, unde j are o valoare numeric oarecare. Deoarece este incomod (neintuitiv) s se
foloseasc aceste denumiri, le putem schimba astfel: printr-un clic se selecteaz cmpul de
editare dorit; se aplic un clic pe cmpul Name Box din partea stnga-sus a ferestrei cutiei de
dialog - ca efect denumirea existent va fi selectat i afiat n video negativ; se scrie noua
denumire. Vom folosi denumiri identice cu inscripiile etichetelor;
Pentru a se putea folosi cutia de dialog creat se va utiliza nregistratorul de macrocomenzi
pentru crearea unei subrutine de afiare a cutiei de dialog. Aceasta se realizeaz la fel ca la
.11.2, punctul 11.2.7.3. se va obine subrutina de mai jos:
249
Sub Afisare_dialog_date()
DialogSheets("Dialog1").Show
End Sub
Fig.11.3.5.
- Subrutin de introducere n foaia de lucru Sheet1 a coordonatelor unui punct preluate din
cmpurile corespunztoare ale cutiei de dialog Dialog1:
Sub Introducere_punct(celx, cely, rand)
Application.Worksheets("Sheet1").Cells(rand, 1) = _
Val(DialogSheets("Dialog1").EditBoxes(celx).Text)
Application.Worksheets("Sheet1").Cells(rand, 2) = _
Val(DialogSheets("Dialog1").EditBoxes(cely).Text)
End Sub
- Subrutina de introducere a datelor n foaia de lucru Sheet1. Este apelabil cnd cutia de
dialog Dialog1 este afiat n foaia de lucru Sheet1. Apeleaz subrutina
Introducere_coordonate i apoi sorteaz tabelul prin apelul subrutinei Sortare_Tabel:
Sub Introducere_date()
Introducere_coordonate
Sortare_Tabel
End Sub
250
Fig.11.4.1.
Fig.11.4.2.
Conform figurii 11.4.1, integrala funciei f pe domeniul a-b poate fi scris sub forma
aproximativ a formulei trapezelor:
n 1 f + f
i
i +1 ( x x )
i +1 i
f ( x)dx =
2
=
i
1
a
(11.4.1)
Aceast valoare reprezint mrimea ariei dintre curba funciei f i axa ox. Se observ c
prin acest procedeu aceast arie este divizat n arii elementare cuprinse ntre axa x i arcul de
curb S dintre verticalele de mrime fi i fi+1. La rndul lor aceste arii sunt nlocuite de ariile
251
trapezelor formate prin nlocuirea arcului de curb S cu coarda C a curbei. Eroarea metodei
este dat de mica arie cuprins ntre arcul de curb S i coarda C.
Cu ct diviziunea intervalului a-b este mai fin, cu att eroarea este mai mic.
Pentru a calcula volumul de ap dislocuit de nav se procedeaz n urmtorii pai:
- Se consider volumul de sub ap al navei tiat n "felii" verticale denumite "cuple"
(figura 11.4.2), la anumite intervale pe lungimea navei, lungime msurat pe axa x orientat
de la prova ctre pupa. Fiecare dintre aceste cuple are un contur curb definit prin "semilimi"
msurate pe o ax y orientat de la planul longitudinal vertical central (numit plan diametral)
ctre bord. Abscisa curbei cuplei este msurat dup o ax z orientat pe vertical de la fundul
navei ctre punte;
- Se calculeaz ariile cuplelor prin integrarea funciei contur a fiecrie cuple n parte.
Astfel, rezult o serie de suprafee Ai, i=1,...,n ale cuplelor. Aceste valori Ai pot fi considerate
ca descriind o "funcie a ariilor imerse" (scufundate) de variabil x;
- Se calculeaz volumul de sub ap al navei prin integrarea pe lungimea x a ariilor imerse.
11.4.2. Realizarea aplicaiei sub EXCEL
Se vor parcurge urmtoarele etape de lucru:
- Se deschide un document EXCEL n care se deseneaz tabelul din figura 3. n celulele
marcate cu culoarea gri se vor introduce formule, restul celulelor fiind folosite pentru scrierea
datelor i a inscripiilor;
- Dup introducerea datelor n domeniile de celule C4:N10 i D12:N12 se genereaz
diagrama din figura 11.4.4, numit "transversal al planului de forme al navei". Procedura de
lucru pentru crearea acestei diagrame este urmtoarea:
= Se selecteaz domeniul de celule C4:D10;
= Se apas butonul Chart Wizard de pe bara de instrumente Standard;
= Din cutia de dialog Chart Wizard Step 1 of 4 se selecteaz tipul Scatter, subtipul
Scatter with data points connected by lines without markers;
= Din cutia de dialog Chart Wizard Step 2 of 4 se selecteaz pagina Data Range n
care se bifeaz Series in Columns. Apoi se comut n pagina Series. Dac am lsa datele
aa cum le accept automat Excel, cuplele navei ar apare culcate pe orizontal. De aceea,
trebuie inversate seriile de valori x i y ntre ele. Pentru aceasta, se selecteaz referinele de
celule din cmpul X Values i se mut cursorul, selectnd domeniul de celule D4:D10.
Apoi se selecteaz referinele de celule din cmpul Y Values i se reselecteaz celulele din
domeniul C4:C10. Pentru ca numele de identificare a diagramei astfel construite s nu fie
cel acordat automat (adic Series1) se introduce cursorul n cmpul Name i se scrie C0;
= Se pot introduce acum serii noi de date folosind butonul Add i procednd la
introducerea datelor n cmpurile X Values, Y Values i Name la fel ca mai sus;
= Se apas butonul Next pentru a se trece la pasul 3 al cutiei de dialog Chart Wizard.
Aici, dac se dorete se pot introduce inscripii de identificare a diagramei. n figura 11.4.4
aceste faciliti nu au fost folosite aa nct se poate trece la pasul 4 unde se alege opiunea
As new Sheet.
- Se aplic comanda Tools>Macro>Visual Basic Editor pentru a se deschide editorul
Visual Basic;
- n editorul Visual Basic se creaz o foaie de module n care se scriu funciile de mai jos:
- O funcie pentru calculul ariei imerse a unei cuple. Aceast funcie preia valorile de diviziune
ale axei z prin introducerea domeniului de celule care conine aceste valori i, analog, valorile
semilimilor. Deoarece aceste valori sunt situate pe coloane, se folosete proprietatea Count a
subobiectului Rows a obiectului Range pentru a se determina numrul de rnduri ale domeniului.
252
Fig.11.4.3.
Fig.11.4.4.
Se compar egalitatea lungimii domeniilor abscise - valori ale funciei contur al cuplei.
Dac aceste lungimi nu sunt egale (ca o consecin a unei selectri greite), funcia
returneaz ca rezultat irul de caractere "Eroare".
Dac lungimile sunt egale se efectueaz calculul integralei ntr-un ciclu For. Deoarece aria
astfel calculat este numai jumtate din aria efectiv (considernd i partea din bordul
simetric) valoarea obinut este multiplicat cu 2 i este returnat de funcie ca rezultat.
Function Arie_cupla(Dom_z As Range, Dom_y As Range)
lungz = Dom_z.Rows.Count
lungy = Dom_y.Rows.Count
If lungz = lungy Then
Arie_cupla = 0
For i = 1 To lungz - 1
z1 = Dom_z(i, 1)
253
z2 = Dom_z(i + 1, 1)
y1 = Dom_y(i, 1)
y2 = Dom_y(i + 1, 1)
Arie_cupla = Arie_cupla + 0.5 * (y2 + y1) * (z2 - z1)
Next i
Arie_cupla = 2 * Arie_cupla
Else
Arie_cupla = "Eroare"
End If
End Function
254
- O dat ce prima celul pentru funcia de arie a fost completat, celelalte celule se
autocompleteaz folosind metoda extinderii prin tragere, astfel: se selecteaz celula
completat (D11), se "apuc" cu cursorul mouse de "mnerul de extindere" (din partea din
dreapta-jos a celulei) i se "trage" peste celulele E1:N11;
- n sfrit, pentru a calcula volumul imers, se selecteaz cursorul n celula N13 i se apas
pe butonul fx de unde se selecteaz funcia Volum_imers;
- n cutia de dialog a funciei Volum_imers se introduc domeniile de celule D12:N12
pentru abscisele x i D11:N11 pentru mrimile ariilor transversale imerse.
Observaie: n aplicaia de mai sus valorile au fost exprimate n m pentru lungimi, m2
pentru arii i m3 pentru volum. Din acest motiv deplasamentul navei rezult imediat n tone
din nmulirea volumului cu greutatea specific a apei.
Fig.11.5.1.
Pentru a oferi un suport practic, concret, vom considera funcia parametric de gradul 2
urmtoare:
f (x ) = a x 2 + b x + p
unde p este un parametru variabil, iar pentru constantele a i b vom considera valorile a=5
i b=2.
Se cere construirea diagramei acestei funcii pe intervalul x=0...3 i crearea unei modaliti
de interfaare care s permit variaia interactiv a parametrului p, altfel dect prin scriere n
celula de depozitare a parametrului.
Lucrarea va decurge n etapele descrise mai jos.
11.5.1. Crearea tabelului funciei
- Se selecteaz foaia Sheet2;
- Se deseneaz tabelul din figura 11.5.1 i se completeaz inscripiile acestuia (parametru, x, f(x));
255
256
Cutia de dialog care trebuie creat va avea aspectul din figura 11.5.2 i va conine
urmtoarele instrumente de control:
- O etichet (Label) cu inscripia Valoare=
- O cutie de editare (EditBox) n care se va scrie
valoarea parametrului;
- O caset de opiune neexclusiv (Check Box) cu inscripia
Variaie dinamic. Rolul ei este de a activa modificarea valorii
parametrului direct n foaia de lucru Sheet2, efect vizibil prin
referin i n foaia Sheet1. Cnd aceast caset este nebifat
orice variaie incremental/decremental determinat de apsri
pe
butoanele Creste i Descreste nu va fi vizibil dect n cutia
Fig.11.5.2.
de editare;
- Butonul incremental Creste, care produce majorarea parametrului cu o unitate;
- Butonul decremental Descreste care produce micorarea parametrului cu o unitate;
- Butonul Aplicare provenit din modificarea butonului prestabilit OK. Cnd acest buton este
apsat valoarea scris pentru parametru este aplicat n celula corespunztoare din foaia Sheet2;
- Butonul Iesire provenit din modificarea butonului Cancel, al crui rol este de a nchide
cutia de dialog fra a mai efectua nici o alt aciune.
Crearea cutiei de dialog se face, ca i n lucrrile anterioare, prin inserarea unei foi de
dialog MS Excel 5.0 Dialog (vezi lucrarea 11.2, punctul 11.2.7.3).
Deoarece cutia de editare i caseta de opiune vor trebui s fie accesate de macrocomenzile care
se vor scrie, este indicat s li se schimbe denumirile acordate automat la creare cu denumiri noi.
Pentru aceasta se selecteaz cu un clic obiectul dorit, apoi se aplic un clic n cmpul
Name Box din stnga/sus a ferestrei foii de dialog, dup care se scrie numele dorit. De
asemenea, se poate face uz de meniul Insert>Name>Define, de o manier similar cu cea
folosit ntr-o foaie de calcul tabelar.
Se vor denumi: cutia de editare cu numele ValParam, iar caseta de opiune cu numele vardin.
La creare, obiectele din cuprinsul cutiei de dialog au o serie de atribute prestabilite care le
determin comportamentul. Unele dintre ele vor trebui modificate astfel:
- Se selecteaz obiectul n cauz;
- Se aplic comanda Format>Control;
- Dup deschiderea cutiei de dialog Format Control se selecteaz pagina Control.
Obiectele i atributele de modificat sunt urmtoarele
- Pentru cutia de editare ValParam, din grupul Edit Validation se bifeaz opiunea Number;
- Pentru caseta de opiune vardin, n cmpul Accelerator Key se scrie litera V;
- Pentru butonul cu inscripia Aplicare (iniial denumit OK) se dezactiveaz opiunea
Dismiss (butonul nu va mai nchide cutia de dialog) i se las activ numai opiunea Default.
De acemenea, se atribuie ca tast acceleratoare litera A (n cmpul Accelerator Key);
- Pentru butonul cu inscripia Ieire (iniial denumit Cancel) se atribuie ca tast
acceleratoare litera I;
- Pentru butonul nou creat cu inscripia Creste nu se activeaz nici unul din atributele
Default, Cancel, Dismiss, Help, i se atribuie tasta acceleratoare C;
- Pentru butonul nou creat cu inscripia Descreste nu se activeaz nici unul din atributele
de buton i se atribuie tasta acceleratoare D;
11.5.5. Crearea macrocomenzilor de interaciune
Instrumentele de interaciune create mai sus vor rmne inactive dac ele nu declaneaz
aciuni. Aceste aciuni au loc ca urmare a unor macrocomenzi care trebuie scrise ntr-o foaie
pentru module de program.
257
Pentru a se crea o astfel de foaie trebuie mai nti s se deschid editorul de Visual Basic
folosind comanda Tools>Macro>Visual Basic Editor.
Deoarece nu a fost folosit nregistratorul de macrocomenzi, aplicaia (fiierul EXCEL) nu
conine nici o foaie de module. Ea se ataeaz folosind comanda Insert>Module aplicat din
fereastra editorului.
O dat foaia de module creat (Module1), n ea se vor scrie urmtoarele macrocomenzi:
Sub Afisare_Dialog()
DialogSheets("Dialog1").CheckBoxes("vardin").Value = Unchecked
DialogSheets("Dialog1").EditBoxes("ValParam").Text = _
Application.Worksheets("Sheet2").Range("param")
DialogSheets("Dialog1").Show
End Sub
258
- Dac textul este neconvertibil la valoare numeric este afiat o cutie cu un mesaj de
avertisment i orice aciune este abandonat;
- Dac textul are semnificaie numeric valoarea de tip text este convertit n valoare
numeric folosind funcie Val a limbajului Visual Basic pentru EXCEL i apoi este
incrementat;
- Cutia de editare ValParam primete ca valoare de tip text valoarea curent a variabilei
valparam convertit la forma text;
- Dac caseta de opiune vardin este bifat (Checked) atunci celula param din foaia
Sheet2 primete valoarea parametrului.
Sub Descreste_parametru()
valparam = DialogSheets("Dialog1").EditBoxes("ValParam").Text
If Not IsNumeric(valparam) Then
MsgBox "Introducere gresita!", vbCritical, "Atentie!"
Exit Sub
End If
valparam = Val(valparam) - 1
DialogSheets("Dialog1").EditBoxes("ValParam").Text = CStr(valparam)
If DialogSheets("Dialog1").CheckBoxes("vardin").Value = Checked Then
Application.Worksheets("Sheet2").Range("param") = valparam
End If
End Sub
259
Considernd acum setul de funcii fi(x) definite prin setul de puncte P1i(x1,y1i), P2i(x2,y2i),
P3i(x3,y3i), i=1,...,n, se cere s se construiasc o aplicaie care s afieze la cerere diagrama
unei funcii oarecare de indice i i, mai mult, ca valorile y1, y2, y3 ale unei funcii oarecare din
set s poat fi modificate.
11.6.2. Construirea foii de calcul
Se construiete foaia de calcul Sheet1, incluznd n ea urmtoarele elemente, vizibile n
figura 11.6.1. Se parcurg urmtoarele etape:
11.6.2.1. Atribuiri de nume pentru domenii de celule
- celula F2 capt denumirea indice;
- celula C3 capt denumirea crtf1;
- celula D3 capt denumirea crtf2;
- celula E3 capt denumirea crtf3;
260
Fig.11.6.1.
Aceste denumiri ajut la o mai bun gestionare a celulelor prin programul care se va
construi n Visual BASIC i, totodat, evitnd lucrul cu adrese de celul efective, face
programul insensibil la eventuale modificri ale foii de lucru (adugri/suprimri de
rnduri/coloane).
11.6.2.2. Completarea coninutului celulelor
Cu excepia capetelor de tabel (domeniile B2:B3, C6:E6 i B7:B18) i a celulelor cu date
(domeniile C2:E2, C7:E18) care se scriu aa cum se vd n figura 11.6.1, pentru celelalte
celule se procedeaz astfel:
- n celula F2 se scrie o valoare oarecare (de exemplu 2, dar nu mai mare de 11)
- n celula C3 se introduce formula =INDEX(fun1,indice+1)
- n celula D3 se introduce formula =INDEX(fun2,indice+1)
- n celula E3 se introduce formula =INDEX(fun3,indice+1)
- n celula G2 se scrie formula =C2^2
- n celula G3 se scrie formula =D2^2
- n celula G4 se scrie formula =E2^2
- n celula H2 se scrie formula =C2
- n celula H3 se scrie formula =D2
- n celula H4 se scrie formula =E2
- n celulele I2:I4 se scrie valoarea 1
- n celula J2 se scrie formula =C3
261
262
Fig.11.6.2.
Fig.11.6.3.
Fig.11.6.4.
Fig.11.6.5.
Folosind aceste instrumente se vor crea elementele vizibile n figura 11.6.5, i anume:
- eticheta (Label) cu inscripia Coeficienii funciei;
- un rnd orizontal de trei etichete cu inscripii stabilite prin program care vor afia a=, b=, c= urmate
de valorile coeficienilor funciei calculai n foaia Sheet1 n celulele denumite coef_a, coef_b, coef_c;
- o cutie de listare (ListBox) care va afia denumirile funciilor i coordonatele y ale celor
trei puncte prin care trec curbele lor;
- un cadru de grup (Frame) cu inscripia Set de valori pentru functie;
- trei etichete cu inscripiile y1=, y2=, y3=;
- trei cutii de editare (TextBox) cu rolul afirii/introducerii coordonatelor y1, y2 i y3 ale
funciei selectate din cutia de listare;
- butonul Aplicare cu rolul modificrii coordonatelor y1, y2 i y3 ale funciei selectate;
- butonul Terminare, cu rolul nchiderii cutiei de dialog.
Dup crearea acestor elemente se trece la stabilirea proprietilor lor n fereastra
Properties de sub fereastra Project-VBA Project. n tabelul de mai jos sunt indicate
stabilirile de proprieti necesare.
263
Tip de obiect
Denumire
(Name)
Proprieti i observaii
(Proprietile nemenionate rmn la valorile
prestabilite)
Caption=Functii, Height=210, Width=275
Font=Tahoma, Bold, 10
264
Aceast subrutin trateaz evenimentul de clic pe unul dintre articolele afiate de cutia de
listare i efectueaz urmtoarele aciuni:
- Scrie n celula F2 din foaia Sheet1 valoarea indicelui de list (numrul articolului selectat
din list). Primul indice este zero. Prin modificarea survenit n celula F2, formulele din
celulele C3, D3 i F3 din foaia Sheet1 vor afia valorile coordonatelor y1, y2 i y3 ale
funciei selectat din cutia de listare;
- variabilele vala, valb i valc preiau valorile din celulele M6, M10 i M14 din foaia
Sheet1;
- Se convertesc valorile de tip numeric vala, valb i valc n valori de tip ir de caractere i
se concateneaz (alipesc) cu irurile de text a=, b= i c=, dup care sunt atribuite ca iruri de
afiat de ctre etichetele Coef_a, Coef_b i Coef_c ale cutiei de dialog (prin preluarea
irurilor de ctre proprietile Caption ale acestor obiecte);
- Sunt preluate valorile de tip text ale celulelor C3, D3 i F3 reprezentnd valorile
coordonatelor y1, y2 i y3 ale funciei curente (cea selectat din list) i sunt atribuite ca text
de afiat de ctre cutiile de editare ale cutiei de dialog (prin atribuirea lor ca valori pentru
proprietile Text ale acestor obiecte).
Private Sub Aplicare_Click()
y1 = UserForm1.valy1.Text
y2 = UserForm1.valy2.Text
y3 = UserForm1.valy3.Text
If Not (IsNumeric(y1) And IsNumeric(y2) And IsNumeric(y3)) Then
MsgBox "Date gresite!", vbCritical, "Eroare"
Exit Sub
Else
indfunc = Val(Application.Range("indice"))
Application.Range("fun1").Item(indfunc + 1) = y1
Application.Range("fun2").Item(indfunc + 1) = y2
Application.Range("fun3").Item(indfunc + 1) = y3
End If
End Sub
265
valoarea din celula F2 a foii Sheet1 convertit de la forma text la forma numeric folosind
funcia Val;
- Valorile variabilelor y1, y2 i y3 prelevate din cutiile de editare sunt scrise n celulele
corespunztoare ale domeniului B7:E18 din foaia Sheet1. Valoarea variabilei indfunc este
majorat cu 1 deoarece regula de numerotare a rndurilor unui domeniu presupune c primul
rnd al domeniului are indicele 1.
Private Sub Terminare_Click()
Unload UserForm1
End Sub
266
Se cere aflarea soluiilor ecuaiei f(x)=0 pe un interval dat [xin, xfin]. Dea semenea, se cere
automatizarea rezolvrii prin crearea unor instrumente de interfaare care s permit:
- Modificarea coeficienilor a, b, c i d;
- Modificarea valorilor limitelor intervalului [xin, xfin];
- Reprezentarea diagramei funciei conform valorilor modificate.
11.7.2. Rezolvarea neprogramat
ntr-o prim faz vom efectua lucrarea cu mijloacele simple ale programului EXCEL, n
urmtoarele etape:
11.7.2.1. Crearea fiierului
- Se creaz un fiier nou din care se rein numei
primele dou foi de lucru, Sheet1 i Sheet2, restul
fiind eliminate.
- n foaia Sheet2 se creaz liniatura i capetele de
tabel (cele cu litere groase), conform figurii 11.7.1.
11.7.2.2. Completarea tabelului
Tabelul creat mai sus se completeaz astfel:
- Domeniul de celule A3:A13 se completeaz cu
indicii valorilor de discretizare a intervalului [xin, xfin];
- Folosind comanda Insert>Name>Define celula
B3 se denumete xin;
- Celula B13 se denumete xfin;
Fig.11.7.1.
- Se completeaz celulele xin i xfin cu valorile -2 i 2;
- n celula B4 se introduce formula =xin+(xfin-xin)*A4/10
- Coninutul celulei B4 se extinde prin tragere peste domeniul B5:B12;
- Celulele E2, E3, E4 i E5 se denumesc, respectiv, coefa, coefb, coefc i coefd;
- Se completeaz celulele coeficienilor cu valorile -3, -3, 4, 1;
267
Fig.11.7.2.
11.7.2.3. Crearea diagramei funciei
Diagrama funciei se creaz n mod obinuit, ca i la celelalte aplicaii, prin selectarea
domeniului B3:C13, lansarea comenzii Insert>Chart i selectarea tipului Scatter, subtipul
Compares pairs of values, iar la sfritul procedurii de creare (pasul 4), se selecteaz As
object in Sheet1 (n loc de Sheet2 cum propune EXCEL, deoarece selecia datelor a fost
fcut n foaia Sheet2).
Aa cum a fost creat diagrama afieaz numai punctele date. Pentru a afia i o curb
conform cu ecuaia de gradul trei se procedeaz astfel:
- Se aplic un clic pe unul dintre punctele diagramei;
- Se aplic comanda Chart>Add Trendline;
- n cutia de dialog Add Trendline se selecteaz pagina Type n care se opteaz pentru
tipul Polynomial, Order=3, dup care se selecteaz pagina Options de unde se bifeaz
opiunea Display equation on chart i se apas butonul OK.
Ca urmare, diagrama va cpta aspectul din figura 11.7.2.
11.7.2.4. Determinarea soluiilor din intervalul de definiie
Ca urmare a afirii curbei funciei, devine vizibil modul ei de variaie i se pot observa
locurile n care ea intersecteaz axa ox, deci locurile unde se gsesc soluiile din interval.
Desigur, observaia vizual este aproximativ i se pune problema determinrii soluiilor cu o
aproximaie mai bun.
n acest scop se procedeaz astfel:
- Celula E6 din foaia Sheet2 se denumete x0 iar celula E7 din aceeai foaie se denumete fx0;
- n celula x0 se introduce o valoare oarecare, de exemplu -1;
- n celula fx0 se introduce formula coefa*x0^3+coefb*x0^2+coefc*x0+coefd
- Se selecteaz celula fx0;
- Se aplic comanda Tools>Goal Seek;
- n cutia de dialog Goal Seek se verific dac n cmpul Set Cell este nscris referina
268
celulei fx0, adic E7. Dac nu, se face un clic pe aceast celul pentru a o selecta;
- Se aplic un clic n cmpul To value din cutia Goal Seek, pentru a-l activa, i apoi se
scrie valoarea 0;
- Se aplic un clic de activare n cmpul By changing cell, apoi se selecteaz celula x0
(adic E6);
- Se apas butonul OK. Dup scurt timp apare cutia de dialog Goal Seek Status care
raporteaz gsirea (sau nu) a unei soluii aproximative i valoarea lui f(x) pentru acea soluie.
Pentru a accepta soluia gsit se apas butonul OK.
11.7.3. Automatizarea aplicaiei prin programare
11.7.3.1. Crearea elementelor de control
269
Tip de obiect
Denumire
(Name)
UserForm1
Cutia de dialog
(Userform)
Cadru de grup
Frame1
(Frame)
Etichete (Label) n Label1, Label2,
grupul Coeficienti Label3, Label4
Cutii de editare
(TextBox)
n
grupul Coeficienti
- prima
coef_a
- a doua
coef_b
- a treia
coef_c
- a patra
coef_d
Buton de comand
(CommandButton)
Aplic_coef
n
grupul
Coeficienti
Cadru de grup
Frame2
(Frame)
Etichete (Label)
Label5,
n grupul Limite
Label6,
Cutii de editare
(TextBox)
n
grupul Limite
- prima
x_in
- a doua
x_fin
Buton de comand
(CommandButton)
n grupul Limite
Etichet (Label)
Cutie de editare
(TextBox)
Buton de comand
(CommandButton)
Cadru de grup
(Frame)
Butoane de opiune
(OptionButton) n
grupul
Retine
solutia
- primul
- al doilea
Buton de comand
(CommandButton)
Aplic_lim
Label7
x_start
Rezolvare
Frame3
retine_da
retine_ne
Iesire
Proprieti i observaii
(Proprietile nemenionate rmn la valorile prestabilite)
Caption=Cautare solutii, Height=158, Width=276
Height=16, Width=58
Height=16, Width=58
270
Aceast subrutin are rolul de a pregti cutia de dialog nainte de a fi afiat. Ea efectueaz
urmtoarele aciuni:
- Atribuie obiectului cutie de editare coef_a valoarea de tip text culeas din celula coefa
din foaia Sheet2;
- Atribuie obiectului cutie de editare coef_b valoarea de tip text culeas din celula coefb
din foaia Sheet2;
- Atribuie obiectului cutie de editare coef_c valoarea de tip text culeas din celula coefc
din foaia Sheet2;
- Atribuie obiectului cutie de editare x_in valoarea de tip text culeas din celula xin din
foaia Sheet2;
- Atribuie obiectului cutie de editare x_fin valoarea de tip text culeas din celula xfin din
foaia Sheet2;
- Atribuie obiectului cutie de editare x_start valoarea de tip text culeas din celula x0 din
foaia Sheet2.
Private Sub Aplic_coef_Click()
ca = coef_a.Text
cb = coef_b.Text
cc = coef_c.Text
cd = coef_d.Text
If Not (IsNumeric(ca) And IsNumeric(cb) And IsNumeric(cc) And IsNumeric(cd)) Then
MsgBox "Coeficienti gresiti!", vbExclamation, "Eroare"
Exit Sub
End If
Range("coefa").Value = Val(ca)
Range("coefb").Value = Val(cb)
Range("coefc").Value = Val(cc)
Range("coefd").Value = Val(cd)
End Sub
Aceast subrutin trateaz evenimentul produs prin clic pe butonul cu inscripia Aplicare
Coeficienti i efectueaz urmtoarele aciuni:
- Atribuie variabilelor de tip Variant ca, cb, cc i cd valorile de tip text extrase din cutiile
de editare coef_a, coef_b, coef_c i coef_d;
- Testeaz dac nu toate textele preluate au semnificaie numeric i n acest caz afieaz
un mesaj de eroare i foreaz ieirea din subrutin fr alte efecte;
- Dac toate textele preluate au semnificaie numeric ele sunt convertite n valori numerice
271
(prin funcia Val) i sunt introduse n celulele coefa, coefb, coefc i coefd din foaia Sheet2.
Private Sub Aplic_lim_Click()
xi = x_in.Text
xf = x_fin.Text
If Not (IsNumeric(xi) And IsNumeric(xf)) Then
MsgBox "Limite gresite!", vbExclamation, "Eroare"
Exit Sub
Else
xi=Val(xi)
xf=Val(xf)
If (xi > xf) Or (xi = xf) Then
MsgBox "Limite gresite!", vbExclamation, "Eroare"
Exit Sub
End If
End If
Range("xin").Value = xi
Range("xfin").Value = xf
Range("x0").Value = 0.5 * (xi + xf)
x_start.Text = CStr(Range("x0").Value)
End Sub
Aceast subrutin trateaz evenimentul produs prin clic pe butonul cu inscripia Aplicare
Limite i efectueaz urmtoarele aciuni:
- Atribuie variabilelor de tip Variant xi i xf valorile de tip text preluate din cutiile de
editare x_in i x_fin;
- Testeaz dac nu toate textele preluate au semnificaie numeric i n acest caz afieaz
un mesaj de eroare i foreaz ieirea din subrutin fr alte efecte;
- Dac toate textele preluate au semnificaie numeric, ele sunt convertite la valoare
numeric i se testeaz dac nu cumva, din greeal, s-a introdus xi > xf, situaie n care este
afiat un mesaj de eroare i se foreaz ieirea din subrutin fr alte efecte;
- Dac nu s-a detectat nici una dintre erorile de mai sus, valorile preluate sunt introduse n
celulele xin, i xfin din foaia Sheet2;
- Se calculeaz media valorilor introduse ca limite i rezultatul este introdus n celula x0
din foaia Sheet2;
- Valoarea din celula x0 din foaia Sheet2 este atribuit prin convertire la forma text cutiei
de editare x_start.
Private Sub Rezolvare_Click()
If Not (IsNumeric(x_start.Text)) Then
MsgBox "Valoare gresita!", vbExclamation, "Eroare"
x_start.Text = CStr(Range("x0").Value)
Exit Sub
End If
sol_anter = Range("x0").Value
preciz = Application.MaxChange
Range("x0").Value = Val(x_start.Text)
Range("fx0").GoalSeek Goal:=0, ChangingCell:=Range("x0")
rezult = Abs(Range("fx0").Value)
If (rezult > preciz) Then
MsgBox "Nu s-a gasit solutia!", vbExclamation, "Atentie!"
Else
MsgBox ("Solutia gasita este x=" & Range("x0")), vbOKOnly, "Raport"
272
273
Fig.11.7.4.
11.7.6. Observaii finale
Aa cum a fost definit funcia ca una analitic sub forma unui polinom de gradul al
treilea, funcia aproximat prin facilitatea Trend Line coincide cu cea original i, ca urmare,
curba funciei aproximate trece prin punctele funciei original.
ntr-un caz oarecare, cnd funcia original este definit printr-un set de puncte luate la
ntmplare, sau provenite din msurtori efectuate asupra unei mrimi fizice care, fie nu este
modelabil printr-un polinom de gradul trei, fie este marcat de erori de msurare, curba
funciei aproximate trece printre punctele funciei originale aa cum se vede din figura 11.7.4.
funciei este:
y = f ( x, y ) = 3 x 2 4
Pentru nceput s presupunem c nu se cunoate y i se dorete determinarea lui folosind o
metod de integrare aproximativ pe un interval dat. Aceast metod va determina un set de
valori aproximative y asupra crora vom aplica o metod de aproximare pentru a determina
expresia funciei integrate i a o putea compara cu funcia analitic.
Se reamintesc formulele de integrare:
- Formula Euler simpl: yi = yi 1 + h f ( xi 1, yi 1 ) , h = xi xi 1
274
j
j 1
- Formula Euler predictor-corector: y i = y i 1 + 0.5 h f ( xi 1 , y i 1 ) + f xi , y i
unde i este indicele punctului curent iar j este indicele iteraiei curente.
Deoarece funcia dat f nu depinde de y, procedeul iterativ se rezum la un singur pas iar
formulele de integrare devin:
- Formula Euler simpl: yi = yi 1 + h yi 1 , h = xi xi 1
j
- Formula Euler predictor-corector: yi = yi 1 + 0.5 h[ yi 1 + yi ] , h = xi xi 1
Mersul lucrrii este dat mai jos.
11.8.2. Crearea aplicaiei
n foaia de calcul Sheet1 se creaz tabelul din figura 11.8.1.
Fig.11.8.1.
11.8.2.1. Completarea tabelului
- Se completeaz inscripiile tabelului;
- n domeniul C3:K3 se scriu valorile de discretizare a intervalului de definiie adoptat
(ntre -2 i 2);
- n celula C4 se introduce formula =3*C3^2-4 care, apoi, se extinde prin tragere peste
domeniul C4:K4;
- n celula C5 se introduce valoarea dat de condiia iniial Cauchy, adic 0;
- n celula D5 se introduce formula de intgrare Euler simpl =C5+(D3-C3)*D4 i apoi se
extinde prin tragere peste tot domeniul D5:K5;
- n celula C6 se introduce valoarea dat de condiia iniial Cauchy, adic 0;
- n celula D6 se introduce formula de integrare Euler predictor-corector =C6+0.5*(D3C3)*(C4+D4) care se extinde apoi prin tragere peste tot domeniul D6:K6;
- n celula C7 se introduce formula pentru y analitic, adic =C3^3-4*C3, care se extinde
apoi prin tragere peste tot domeniul C7:K7;
- n celula L7 se introduce formula =ABS(MAX(C7:K7)) pentru extragerea celei mai mari
valori din interval a funciei analitice, n valoare absolut;
- Folosind comanda Insert>Name>Define se atribuie celulei L7 numele maxy;
- n celula C8 se introduce formula =ABS(C5-C7)/maxy i se extinde apoi peste tot
domeniul C8:K8;
- n celula L8 se introduce formula =MAX(C8:K8);
- n celula C9 se introduce formula =ABS(C6-C7)/maxy i apoi se extinde peste tot
domeniul C9:K9;
275
Fig.11.8.2.
Fig.11.8.3.
276
Denumire
(Name)
Proprieti i observaii
(Proprietile nemenionate rmn la valorile
prestabilite)
UserForm1 Caption=Afisare ecuatii, Height=194, Width=221
Frame1
Caption=Ecuatii, Height=133, Width=206
Euler_simp Caption=Euler simplu, Accelerator=s, Height=17,
Width=62
Euler_predcor Caption=Euler predictor-corector, Accelerator=p,
Height=17, Width=108
Ecuatie
Eroare
Terminare
277
- Afieaz cu caractere ngroate ecuaia curbei de aproximare prin metoda Euler simpl;
- Afieaz cu caractere obinuite ecuaia curbei de aproximare prin metoda Euler predictorcorector;
- Atribuie irul de text al ecuaiei curbei Euler simpl din diagrama Chart1 ca valoare a
proprietii inscripie (Caption) a etichetei Ecuatie;
- Atribuie irul de text al celulei ereul0 din foaia Sheet1 ca valoare a proprietii inscripie
(Caption) a etichetei Eroare;
Observaie: numele de obiect ale curbelor pot fi aflate n dou moduri:
- prin clic pe curba vizat n foaia de diagram i inspectarea coninutului cmpului de
afiare Name Box din stnga sus a ferestrei diagramei;
- efectund o nregistrare de macrocomand n care se aplic un clic de selecie pe curba
vizat i, eventual, se opereaz modificri de atribute de afiare, dup care se inspecteaz
textul surs al macrocomenzii n editorul de Visual Basic.
Private Sub Euler_simp_Click()
With Application.Charts("Chart1")
.SeriesCollection(1).Trendlines(1).Border.Weight = xlThick
.SeriesCollection(2).Trendlines(1).Border.Weight = xlThin
.SeriesCollection(1).Trendlines(1).DataLabel.Font.Bold = True
.SeriesCollection(2).Trendlines(1).DataLabel.Font.Bold = False
End With
Ecuatie.Caption = _
Application.Charts("Chart1").SeriesCollection(1).Trendlines(1).DataLabel.Text
Eroare.Caption = "Eroare=" & Application.Worksheets("Sheet1").Range("ereul0").Text
End Sub
278
- Afieaz cu linie subire curba de aproximare prin metoda Euler simpl din diagrama
Chart1;
- Afieaz cu linie groas curba de aproximare prin metoda Euler predictor-corector din
diagrama Chart1;
- Afieaz cu caractere obinuite ecuaia curbei de aproximare prin metoda Euler simpl;
- Afieaz cu caractere ngroate ecuaia curbei de aproximare prin metoda Euler predictorcorector;
- Atribuie irul de text al ecuaiei curbei Euler predictor-corecctor din diagrama Chart1 ca
valoare a proprietii inscripie (Caption) a etichetei Ecuatie;
- Atribuie irul de text al celulei ereul1 din foaia Sheet1 ca valoare a proprietii inscripie
(Caption) a etichetei Eroare;
Private Sub Terminare_Click()
With Application.Charts("Chart1")
.SeriesCollection(1).Trendlines(1).Border.Weight = xlThin
.SeriesCollection(2).Trendlines(1).Border.Weight = xlThin
.SeriesCollection(1).Trendlines(1).DataLabel.Font.Bold = False
.SeriesCollection(2).Trendlines(1).DataLabel.Font.Bold = False
End With
Unload UserForm1
End Sub
279
Fig.12.1.1.
Fig.12.1.2
O plutire dreapt este linia de intersecie dintre un plan orizontal i carena navei. Mrimile
de calculat sunt:
Aria suprafeei plutirii:
Momentele de inerie:
2
= 2 ydx ; Centrul de greutate al plutirii: x =
xydx
F A
L
L
w
2 3
2
I x = y dx i I = 2 x ydx
y
3L
L
A
i 1
x1
j =1
f (x )dx = A j + A i
280
DO i=1,n;
f(i)=y(i)*x(i); END DO
xf=2*INTEGRARE(n,x,f)/aw
DO i=1,n;
f(i)=y(i)*y(i)*y(i); END DO
ix=2*INTEGRARE(n,x,f)/3
DO i=1,n;
f(i)=y(i)*x(i)*x(i); END DO
iy=2*INTEGRARE(n,x,f)
WRITE(*,*)"Aria plutirii
A=",
WRITE(*,*)"Abscisa centrului plutirii Xf=",
WRITE(*,*)"Momentul de inertie
Ix=",
WRITE(*,*)"Momentul de inertie
Iy=",
100 FORMAT(A9,I3,A16,I3,A2)
END PROGRAM PLUTIRI
aw
xf
ix
iy
Dup cum se observ, programul este scris integral ntr-un singur fiier. Vom salva acest
fiier sub numele de Plutiri.f95
Dup comenzile de compilare (Compile) i construcie (Build) se aplic comanda de rulare
(Start Run) i se obine afiarea de mai jos (unde sunt cuprinse i rspunsurile operatorului):
Introduceti numarul de puncte al plutirii 7
Introduceti abscisele si semilatimile
Punctul:
1 Abscisa x(
1)=0
Punctul:
1 Semilatimea y( 1)=0
Punctul:
2 Abscisa x(
2)=10
Punctul:
2 Semilatimea y( 2)=10
Punctul:
3 Abscisa x(
3)=20
Punctul:
3 Semilatimea y( 3)=10
Punctul:
4 Abscisa x(
4)=30
Punctul:
4 Semilatimea y( 4)=10
Punctul:
5 Abscisa x(
5)=40
Punctul:
5 Semilatimea y( 5)=10
Punctul:
6 Abscisa x(
6)=50
Punctul:
6 Semilatimea y( 6)=10
Punctul:
7 Abscisa x(
7)=60
Punctul:
7 Semilatimea y( 7)=0
Aria plutirii
A=
1000.00
Abscisa centrului plutirii Xf=
30.0000
Momentul de inertie
Ix=
33333.3
Momentul de inertie
Iy=
1.100000E+06
Press RETURN to close window ...
281
INTEGER n, i
REAL, DIMENSION(100) :: x, y
CHARACTER(LEN=16) :: s1="Punctul: ", s2=" Abscisa x(", &
s3=" Semilatimea y(", s4=")="
REAL aw, xf, ix, iy
WRITE(*,"(A)",ADVANCE="NO") "Introduceti numarul de puncte al plutirii "
READ(*,*) n
WRITE(*,*) "Introduceti abscisele si semilatimile"
DO i=1,n
WRITE(*,100,ADVANCE="NO") s1, i, s2, i, s4
READ(*,*) x(i)
WRITE(*,100,ADVANCE="NO") s1, i, s3, i, s4
READ(*,*) y(i)
END DO
CALL CALCUL(n,x,y,aw,xf,ix,iy)
WRITE(*,*)"Aria plutirii
A=", aw
WRITE(*,*)"Abscisa centrului plutirii Xf=", xf
WRITE(*,*)"Momentul de inertie
Ix=", ix
WRITE(*,*)"Momentul de inertie
Iy=", iy
100 FORMAT(A9,I3,A16,I3,A2)
END PROGRAM PLUTIRI
SUBROUTINE CALCUL(n,x,y,aw,xf,ix,iy)
INTEGER n
REAL, DIMENSION(n) :: x, y, f
REAL aw, xf, ix, iy, INTEGRARE
DO i=1,n
f(i)=y(i)
END DO
aw=2*INTEGRARE(n,x,f)
DO i=1,n;
f(i)=y(i)*x(i); END DO
xf=2*INTEGRARE(n,x,f)/aw
DO i=1,n;
f(i)=y(i)*y(i)*y(i); END DO
ix=2*INTEGRARE(n,x,f)/3
DO i=1,n;
f(i)=y(i)*x(i)*x(i); END DO
iy=2*INTEGRARE(n,x,f)
END SUBROUTINE CALCUL
REAL FUNCTION INTEGRARE(n, x, f)
INTEGER n
REAL, DIMENSION(n) :: x,f
INTEGRARE=0
DO i=2,n
INTEGRARE=INTEGRARE+(x(i)-x(i-1))*(f(i)+f(i-1))/2
END DO
END FUNCTION INTEGRARE
282
IMPLICIT NONE
INTEGER n, i
REAL, DIMENSION(100) :: x, y, f
CHARACTER(LEN=16) :: s1="Punctul: ", s2=" Abscisa x(", &
s3=" Semilatimea y(", s4=")="
REAL aw, xf, ix, iy
WRITE(*,"(A)",ADVANCE="NO") "Introduceti numarul de puncte al plutirii "
READ(*,*) n
WRITE(*,*) "Introduceti abscisele si semilatimile"
DO i=1,n
WRITE(*,100,ADVANCE="NO") s1, i, s2, i, s4
READ(*,*) x(i)
WRITE(*,100,ADVANCE="NO") s1, i, s3, i, s4
READ(*,*) y(i)
END DO
DO i=1,n
f(i)=y(i)
END DO
aw=2*INTEGRARE(n,x,f)
DO i=1,n;
f(i)=y(i)*x(i); END DO
xf=2*INTEGRARE(n,x,f)/aw
DO i=1,n;
f(i)=y(i)*y(i)*y(i); END DO
ix=2*INTEGRARE(n,x,f)/3
DO i=1,n;
f(i)=y(i)*x(i)*x(i); END DO
iy=2*INTEGRARE(n,x,f)
WRITE(*,*)"Aria plutirii
A=", aw
WRITE(*,*)"Abscisa centrului plutirii Xf=", xf
WRITE(*,*)"Momentul de inertie
Ix=", ix
WRITE(*,*)"Momentul de inertie
Iy=", iy
100 FORMAT(A9,I3,A16,I3,A2)
END PROGRAM PLUTIRI
4. O alt mbuntire posibil a proiectului este includerea datelor de intrare ntr-un fiier
de includere care s poat fi modificat separat de restul aplicaiei. Aceasta nu exclude fazele
de recompilare i reconstrucie. Proiectul va conine acum urmtoarele componente:
Fiierul program principal Plutiri_3.f95 care conine:
PROGRAM PLUTIRI
USE CALCUL
INCLUDE 'DATE_XY.inc'
283
INTEGER i
REAL, DIMENSION(100) :: f
CHARACTER(LEN=16) :: s1="Punctul: ", s2=" Abscisa x(", &
s3=" Semilatimea y(", s4=")="
REAL aw, xf, ix, iy
WRITE(*,*) "Numarul de puncte al plutirii este n=",n
WRITE(*,*) "Abscisele si semilatimile sunt:"
DO i=1,n
WRITE(*,100) s1, i, s2, i, s4, x(i)
WRITE(*,100) s1, i, s3, i, s4, y(i)
END DO
DO i=1,n
f(i)=y(i)
END DO
aw=2*INTEGRARE(n,x,f)
DO i=1,n;
f(i)=y(i)*x(i); END DO
xf=2*INTEGRARE(n,x,f)/aw
DO i=1,n;
f(i)=y(i)*y(i)*y(i); END DO
ix=2*INTEGRARE(n,x,f)/3
DO i=1,n;
f(i)=y(i)*x(i)*x(i); END DO
iy=2*INTEGRARE(n,x,f)
WRITE(*,*)"Aria plutirii
A=", aw
WRITE(*,*)"Abscisa centrului plutirii Xf=", xf
WRITE(*,*)"Momentul de inertie
Ix=", ix
WRITE(*,*)"Momentul de inertie
Iy=", iy
100 FORMAT(A9,I3,A16,I3,A2,F10.3)
END PROGRAM PLUTIRI
284
PROGRAM ORDONARE
INTEGER :: nunit=1,NRECR,STARE,I
REAL VALOARE
LOGICAL :: CITIRE=.TRUE.
REAL, ALLOCATABLE :: V(:)
OPEN(UNIT=nunit,FILE='Numere.txt',ACTION='READ')
NRECR=0
DO WHILE (CITIRE)
READ(UNIT=nunit,FMT='(F20.6)',IOSTAT=STARE)VALOARE
IF(STARE==-1) THEN
CITIRE=.FALSE.
ELSE
NRECR=NRECR+1
END IF
END DO
ALLOCATE (V(NRECR))
REWIND(UNIT=nunit)
DO I=1,NRECR
READ(UNIT=nunit,FMT='(F20.6)')V(I)
END DO
CALL ORD_NUM(NRECR,V)
OPEN(UNIT=nunit,FILE='Num_ord.txt',ACTION='WRITE')
REWIND(UNIT=nunit)
DO I=1,NRECR
WRITE(UNIT=nunit,FMT='(F20.6)') V(I)
END DO
CLOSE(UNIT=nunit)
DEALLOCATE(V)
END PROGRAM ORDONARE
SUBROUTINE ORD_NUM(N,V)
DIMENSION :: V(N)
REAL A
INTEGER I,J
DO I=1,N-1
DO J=I+1,N
IF(V(I)>V(J)) THEN
A=V(I)
V(I)=V(J)
V(J)=A
END IF
END DO
END DO
END SUBROUTINE ORD_NUM
285
sfritului de fiier
V vector (tablou unidimensional) destinat s stocheze valorile reale citite din fiier.
Iniial dimensiunea lui este neprecizat i este declarat alocabil. Dup contorizarea numrului
de nregistrri citite tabloului i se aloc spaiul necesar
n subrutin:
N dimensiunea tabloului V
A variabil real auxiliar necesar interschimbului de valori ntre valoarea anterioar i
cea curent atunci cnd se constat c V(I) este mai mare dect V(J)
I, J indici de contorizare a ciclurilor DO sau indici de tablou
Aciunile efectuate de program sunt urmtoarele:
- se deschide fiierul Numere.txt i este citit cte o nregistrare. De cte ori acest lucru
poate avea loc se incrementeaz variabila NRECR
- se redeschide fiierul Numere.txt i este citit cte o nregistrare, de data aceasta valorile
citite fiind pe rnd memorate n vectorul V
- se nchide fiierul Numere.txt
- se apeleaz subrutina de reordonare a vectorului V
- se deschide fiierul Num_ord.txt
- se scriu una cte una valorile vectorului V n acest fiier
- se nchide fiierul
3. Verificarea rezultatului obinut
Folosind Notepad se deschide fiierul Num_ord.txt
Dac programul a funcionat corect trebuie s vedei urmtorul coninut:
0.120000
3.456000
5.021000
11.200000
253.449997
Observaie: s-a luat precauia de a indica drept format de citire formatul F20.6 care este
acoperitor pentru valorile scrise n fiierul de date de intrare. Altfel citirea ar fi fost
defectuoas.
Observaie: Fortran nu folosete mecanismul de copiere a argumentelor procedurilor
(funcii i subrutine) ci lucreaz direct cu adresele de memorie ale argumentelor. Aceasta
nseamn c orice modificare a valorilor argumentelor transmise se reflect n programul
principal dup revenirea din procedur. n aplicaia de fa acest lucru a fost favorabil
deoarece ne-a permis s reordonm valorile vectorului V i ele s rmn reordonate la
revenirea din subrutina Ord_num fr alte eforturi suplimentare. n mod normal ns aceast
nsuire este considerat o nclcare a principiului ncapsulrii datelor statuat de principiile
ingineriei programrii i trebuie tratat cu precauii suplimentare dac acest efect de
vizibilitate n exterior nu este dorit. n acest scop se va proceda la efectuarea explicit de copii
ale argumentelor n interiorul procedurii.
286
Din nefericire lucrurile sunt mai complicate, n practic existnd posibilitatea citirii din
fiiere cu mai multe date numerice n cadrul aceleiai nregistrri, iar tipurile datelor numerice
pot diferi ntre ele. Mai mult, separaia datelor n cadrul unei nregistrri poate avea loc printrun numr oarecare de spaii (blank-uri).
Pentru a nu complica prea mult lucrurile vom restrnge aplicaia la cazul preluarii de date
dintr-un fiier n care sunt scrise date n format F (real) i I (integer), i care poate avea i
rnduri libere. Datele preluate vor fi scrise ntr-un nou fiier care va realiza separaia datelor
printr-un singur spaiu i va elimina rndurile goale. Se va folosi mediul FORTRAN Salford
PLATO.
12.3.2. Etape de lucru
1. Folosind Notepad se va scrie un fiier denumit Num_div.txt al crui coninut este cel de
mai jos. Acolo unde apar caracterele b se va tasta cte un spaiu pentru fiecare caracter.
bbbbbbbb11bbb-235.2346bb1
1.23b253.45
bbbb3.456bbbbb0.12b0.0
-5.021
bbb0.12bb1.0
!Obs.1
!Obs.2
!Obs.3
!Obs.4
!Obs.5
!Obs.6
!Obs.7
!Obs.8
!Obs.9
!Obs.10
287
CIT_FIS=.TRUE.
!Obs.11
DO WHILE (CIT_FIS)
READ(UNIT=nunit1,FMT='(A)',IOSTAT=stare)rand
!Obs.12
IF(STARE==-1) THEN
CIT_FIS=.FALSE.
!Obs.13
ELSE
CALL EVAL_RAND(rand,nval,sir_frm)
!Obs.14
BACKSPACE(UNIT=nunit1)
!Obs.15
ALLOCATE(vector(nval))
!Obs.16
READ(UNIT=nunit1,FMT=sir_frm,IOSTAT=stare)(vector(i),i=1,nval)
WRITE(UNIT=6,FMT=sir_frm)(vector(i),i=1,nval)
!Obs.17
WRITE(UNIT=nunit2,FMT=sir_frm)(vector(i),i=1,nval)
DEALLOCATE(vector(nval))
!Obs.18
NULLIFY(vector)
END IF
END DO
CLOSE(UNIT=nunit1)
!Obs.19
CLOSE(UNIT=nunit2)
END PROGRAM CONVERSIE
!Obs.20
!Obs.21
!Obs.22
!Obs.23
!Obs.24
!Obs.25
288
rezerva=sir
rand=TRIM@(rand)
sir=""
ncarrand=LEN_TRIM(rand)
ncar=0
i=0
prim=.TRUE.
DO WHILE (ncarrand>0)
i=i+1
c=rand(1:1)
IF(c==' ') THEN
ip=SCAN(sir,'.')
IF(ip==0) THEN
lsir=LEN_TRIM(sir)
ip=lsir+1
sir(1:lsir+1)=sir(1:lsir)//'.'
ncar=ncar+1
END IF
IF(prim) THEN
nct=ncar
ELSE
nct=ncar+1
END IF
frm='F'//CNUM(nct)//'.'//CNUM(ncar-ip+1)
lsir=LEN_TRIM(sir_frm)
sir_frm(lsir+1:)=frm//','
prim=.FALSE.
sir=""
i=0
ncar=0
rand=TRIM(rand)
ncarrand=LEN_TRIM(rand)
ELSE
ncar=ncar+1
sir(1:i+1)=sir(1:i)//c
rand(1:)=rand(2:)
ncarrand=LEN_TRIM(rand)+1
END IF
END DO
lsir=LEN_TRIM(sir_frm)
sir_frm(lsir:)=')'
rand=rezerva
END SUBROUTINE EVAL_RAND
END MODULE EVALUARE
!Obs.26
!Obs.27
!Obs.28
!Obs.29
!Obs.30
!Obs.31
!Obs.32
!Obs.33
!Obs.34
!Obs.35
!Obs.36
!Obs.37
289
i indice de contorizare;
nval variabil reprezentnd numrul de valori cuprinse ntr-o nregistrare citit;
ncr numr de caractere folosit pentru a defini formatul de scriere a unui rnd n fiierul
intermediar (scrierea se face n formatul ir de caractere Ann unde nn este numrul de
caractere);
rand variabil ir de caractere cu lungimea maxim de 100 de caractere care memoreaz
o nregistrare (rand) extras din fiierul de citit i care se va scrie n fiierul intermediar;
sir_frm Descriptor de formate colectiv, este irul de caractere care descrie formatul
datelor numerice ale nregistrrii extrase;
frm_rand irul de caractere care descrie formatul n care nregistrarea extras va scris n
fiierul intermediar;
CNUM numele funciei Fortran Salford de conversie a unui numr ntreg n ir de
caractere;
CIT_FIS variabil logic descriind starea de citire din fiier i care poate fi .TRUE. cnd
poate avea loc citirea i .FALSE. cnd s-a atins sfritul de fiier i citirea trebuie s nceteze;
vector variabil tablou unidimensional destinat stocrii valorilor de tip real citite din
fiier. Iniial ea este declarat de lungime nedefinit dar alocabil, dimensiunea precizndu-se
ulterior dup citirea unei nregistrri, analiza ei i determinarea numrului de valori numerice
pe care le cuprinde;
n subrutina EVAL_RAND:
TRIM@ numele funciei Fortran Salford destinat s elimine spaiile goale (blank-uri)
din faa unui ir de caractere;
TRIM numele funciei Fortran Salford destinat s elimine spaiile goale (blank-uri) din
spatele unui ir de caractere;
rand aceeai semnificaie ca n programul principal. Comunicaia n Fortran dintre
programul principal i subrutine fcndu-se prin adrese aceast variabil este i ca zon de
memorie folosit aceeai cu cea folosit de programul principal;
rezerva variabil ir de caractere destinat s pstreze o copie a unui alt ir;
sir variabil de tip ir de caractere n care se preiau unul cte unul caracterele irului rand
extras din fiierul original, mai puin caracterele spaiu excedentare, cu completarea
numerelor ntregi cu caracterul punct, operaie n urma creia toate numerele citite vor deveni
de tip real;
sir_frm aceeai semnificaie ca n programul principal;
frm variabil de tip ir de caractere de cel mult 10 caractere lungime destinat s
memoreze un subir reprezentnd formatul unei valori (dat) din rndul de date extras.
Variabila sir_frm se va compune din concatenarea (alipirea) mai multor asemenea subiruri;
c variabil de tip monocaracter. Este folosit pentru a memora primul caracter extras din
irul rand, dup care irul rand este reconstruit eliminnd primul caracter. Astfel, rand va
conine tot mai puine caractere, pn la epuizare;
CNUM numele funciei Fortran Salford de conversie a unui numr ntreg n ir de
caractere;
prim variabil logic care are valoarea .TRUE. dac caracterul citit este primul din rand
i .FALSE. n caz contrar;
i indice de contorizare;
ip indicele de ordine al caracterului punct n irul sir. n a doua parte a subrutinei
EVAL_RAND sir va conine numai subirul corespunztor unei singure date din tot irul rand.
Dac ip=0 nseamn c numrul este scris fr punct zecimal (ca valoare ntreag) i i se va
aduga punctul zecimal. Dac ip este mai mare dect zero valoarea memorat n ip va fi folosit
290
ulterior la construirea irului descriptor de format pentru a se calcula numrul de cifre zecimale;
lsir lungimea subirului sir. Servete la calculul lungimii de scriere a formatului F care va
apare n irul descriptor de format;
nval numrul de valori (date) cuprinse de irul rand;
ncar numrul curent de caractere prelucrate la construirea unui subir;
nct numrul total de caractere coninut de un subir;
ncarrand numrul de caractere al irului rand;
Aciunile efectuate de program sunt urmtoarele (vezi observaiile marcate n textul surs):
Obs.1. Se deschide pentru citire fiierul Num_div.txt i pentru citire/scriere fiierul
Num_div.tmp;
Obs.2. Se redeschide fiierul Num_div.tmp pentru forarea plasrii indicatorului de poziie
la nceputul primei nregistrri;
Obs.3. Se iniiaz un ciclu de citire din fiierul Num_div.txt;
Obs.4. Se citete o nregistrare (rand) din fiierul Num_div.txt;
Obs.5. Dac s-a ntlnit sfritul de fiier se schimb valoarea CIT_FIS pe .FALSE.
Obs.6. Dac rndul este gol sau conine numai spaii goale (blank-uri) se trece la urmtorul
pas al ciclului;
Obs.7. Se apeleaz subrutina de evaluare a rndului extras. Ea primete ca argument
adresele irului nregistrrii extrase (rand) ale variabilei nval (numr de valori pe rnd) i
sir_frm (ir descriptor de formate). La terminarea execuiei subrutinei irul rand este curat
de spaiile excedentare iar nval i sir_frm conin datele rezultate din evaluare;
Obs.8. Se formeaz irul (frm_rand) descriptor de format de scriere de tip caracter a
rndului n fiierul intermediar Num_div.tmp. De exemplu, dac s-a extras nregistrarea:
bbbb3.456bbbbb0.12b0.0
291
fiiere. Pentru tastatur se folosete UNIT=5. Aceleai valori sunt scrise i n fiierul rezultat
Num_noi.txt;
Obs.18. Se dezaloc spaiile alocate elementelor tabloului vector ca i adresa de pointer a
tabloului vector;
Obs.19. Se nchide fiierul intermediar Num_div.tmp i fiierul rezultant Num_noi.txt;
Aciunile efectuate de subrutina EVAL_RAND sunt urmtoarele:
Obs.20. Se iniiaz irul descriptor de format sir_frm;
Obs.21. Se cur irul rand de spaiile goale de la nceput i de la sfrit i i se adaug un
singur spaiu gol la capt. Acest spaiu gol va semnaliza terminarea unui subir corespunztor
unei valori numerice;
Obs.22. Se iniiaz o variabil sir n care se vor transfera pe rnd caractere din irul rand.
Se determin ncarrand care reprezint numrul de caractere al rndului rand. Se iniiaz i=0
indicele de parcurgere a citirii caracterelor i nval=0 numrul de valori detectate;
Obs.23. Se iniiaz un ciclu care va dura ct timp vor mai fi caractere neparcurse n irul
rand, ciclu n cuprinsul cruia se analizeaz tot timpul primul caracter din irul rand;
Obs.24. Dac a fost ntlnit caracterul spaiu nseamn c s-a terminat un subir de
caractere care reprezint o valoare numeric, deci nval va fi incrementat, apoi se vor elimina
caracterele spaiu de la nceputul lui rand i se redetermin ncarrand. Dac nu, caracterul
ntlnit se va include n sir pe poziia i+1 iar din rand se elimin primul caracter. Dup
aceast etap sir nu va mai conine caractere spaiu excedentare (dou valori numerice vor fi
separate printr-un singur ir) i se va cunoate numrul de valori din ir, nval;
Obs.25. Se transfer irul sir n irul rand i n irul rezerva. Se elimin spaiile goale de la
nceputul lui rand (dac mai exist);
Obs.26. irul sir este iniializat din nou. Se determin numrul de caractere din irul rand.
Se iniializeaz ncar=0 i i=0. Variabila care indic citirea primului numr de pe rand se
iniializeaz la valoarea .TRUE.
Obs.27. Se iniiaz un ciclu de citire a irului rand, citindu-se mereu primul caracter al
rndului pn la epuizarea tuturor caracterelor. Indicele i este destinat s memoreze numrul
caracterului curent la citire. Caracterul c este primul caracter al lui rand;
Obs.28. Dac c este un spaiu nseamn c s-a terminat un subir numeric;
Obs.29. Indicele ip red poziia n care se gsete caracterul punct n subirul numeric;
Obs.30. Dac ip=0 subirul numeric nu conine caracterul punct i el va fi adugat subirului;
Obs.31. Dac are loc citirea primului subir numeric numrul total de caractere nct este cel
citit adic ncar, altefel este cu 1 mai mare. Aceast convenie este destinat s produc un ir
descriptor de formate care s includ spaiul separator n descriptoarele de formate ale
subirurilor numerice cu excepia primului subir;
Obs.32. Instruciune de formare a unui descriptor de format F. CNUM(nct) produce lungimea
cmpului de format iar CNUM(ncar-ip+1) produce lungimea cmpului rezervat zecimalelor;
Obs.33. Descriptorul de formate colectiv sir_frm este completat cu irul descriptor de
format individual i virgula separatoare de formate;
Obs.34. O dat ce aciunea de adugare a unui descriptor de format individual a avut loc, sa depit situaia de citire a primului subir numeric;
Obs.35. Se reiniiaz sir (un nou subir numeric va fi prelucrat), i=0 i ncar=0, din rand se
eleimin spaiul separator i se recalculeaz ncarrand;
Obs.36. Dac caracterul prim extras din rand nu este un spaiu, deci este un caracter
numeric, se incrementeaz numrul de caractere ncar al subirului sir, se adaug caracterul c
la subirul sir, se elimin primul caracter din rand i se recalculeaz numrul ncarrand de
caractere rmase n rand;
292
Obs.37. Se calculeaz lungimea total lsir a irului descriptor colectiv de formate sir_frm,
se adaug paranteza de nchidere a descriptorului colectiv de formate. Deoarece rand a suferit
transformri se readuce la starea de la citirea din fiierul intermediar prin preluarea
coninutului de la irul rezerva.
3. Verificarea rezultatului obinut
Folosind Notepad se deschide fiierul Num_div.tmp
Dac programul a funcionat corect trebuie s vedei urmtorul coninut:
11 -235.2346 1
1.23 253.45
3.456 -0.12 0.0
-5.021
0.12 1.0
!Obs.1
xfin=10
x0=int(xin)
x1=int(xfin)
a=1
b=1
c=1
col=RGB@(225,125,0)
i=winio@('%ca[Parametri]%bg&',col)
i=winio@('%mn[&Comenzi[I&esire]]&','EXIT')
i=winio@('%fn[COURIER NEW]&')
i=winio@('%nlx0=%dd%il%10rd&',pas,-32000,x1-1,x0)
i=winio@('%nl%nlx1=%dd%il%10rd&',pas,x0+1,32000,x1)
i=winio@('%nl%nl a=%dd%il%10rd&',pas,-32000,32000,a)
i=winio@('%nl%nl b=%dd%il%10rd&',pas,-32000,32000,b)
i=winio@('%nl%nl c=%dd%il%10rd&',pas,-32000,32000,c)
i=winio@('%nl%cn%^bt[&Afisare]',afisare)
END PROGRAM GRAFIC
INTEGER FUNCTION afisare()
INCLUDE <windows.ins>
INTEGER N, i, col, x0, x1, a, b, c
DOUBLE PRECISION x(N),y(N)
REAL xin, xfin,dx
COMMON /PARAM/ N,x0,x1,a,b,c
xin=real(x0)
xfin=real(x1)
dx=(xfin-xin)/(N-1)
DO i=1,N
x(i)=xin+dx*(i-1)
y(i)=a*x(i)*x(i)+b*x(i)+c
END DO
col=RGB@(0,225,225)
i=winio@('%ca[Grafic polinom patratic]%bg&',col)
i=winio@('%pl[x_array]&',400,250,N,x,y)
i=winio@('%ff%nl%cn%bt[I&esire]')
afisare=1
END FUNCTION afisare
293
!Obs.2
!Obs.3
!Obs.4
!Obs.5
!Obs.6
!Obs.7
!Obs.8
!Obs.9
!Obs.10
!Obs.11
!Obs.12
!Obs.13
!Obs.14
!Obs.15
!Obs.16
!Obs.17
294
Fig.12.4.1.
295
Fig.12.4.2.
296
; Obs.1
; Obs.2
; Obs.3
; Obs.4
; Obs.5
; Obs.6
; Obs.7
; Obs.8
; Obs.9
; Obs.10
; Obs.11
; Obs.12
; Obs.13
; Obs.14
; Obs.15
; Obs.16
297
298
; Obs.1
; Obs.2
; Obs.3
; Obs.4
; Obs.5
; Obs.6
; Obs.7
; Obs.8
; Obs.9
; Obs.10
; Obs.11
; Obs.12
; Obs.13
; Obs.14
; Obs.15
; Obs.16
; Obs.17
; Obs.18
; Obs.19
299
incrementeaz x1 i x2 cu dx;
Obs.8. Se traseaz segmentele funciilor;
Obs.9, 10. Se determin punctul de intersecie al segmentelor cu funcia inters i dac
aceasta a detectat un asemenea punct, valoarea coordonatei x a punctului este stocat
(adugat) n coada listei de soluii lsol folosind funcia adent;
Obs.11. Se foreaz evaluarea simbolului lsol pentru ca funcia det_solutii s returneze ca
rezultat lista soluiilor (aceasta fiind ultima evaluare din corpul funciei);
Obs.12. Se creaz o funcie de adugare a unui nou element la coada unei liste;
Obs.13. Se genereaz funcia de comand a calculului interactiv al soluiilor;
Obs.14. Se terge tot desenul;
Obs.15. Se limiteaz posibilitile de rspuns la urmtoarea funcie de tip get la
interzicerea rspunsului vid (apsarea numai a tastei Enter), interzicerea valorii zero i
interzicerea rspunsului printr-o valoare negativ;
Obs.16. Cerere de rspuns printr-o valoare ntreag (se cere numrul de soluii de determinat;
Obs.17. Se apeleaz funcia det_solutii i i se memoreaz rezultatul prin asociere cu
simbolul lsol, apoi se iniializeaz indicele de contor i la zero;
Obs.18. Se face o tiprire vid (rnd gol);
Obs.19. Se ruleaz un ciclu de tiprire a soluiilor;
Fig.13.2.1.
13.2.3. Exploatarea programului
Pentru a putea fi folosit programul trebuie mai nti salvat cu numele solec.lsp.
Se ncarc programul folosind comanda Tools/Load Application.
n linia de comand AutoCAD ar putea avea loc urmtorul dialog:
Command: solutii
Command:
Cate solutii doriti: 4
Command:
Solutia 1=0.5321
Solutia 2=3.183
Solutia 3=6.285
Solutia 4=9.4249
nil
Soluiile sunt cele tiprite de program (ca mai sus) iar desenul realizat de program este cel
din figura 13.2.1.
300
; Obs.1
; Obs.2
; Obs.3
; Obs.4
; Obs.5
; Obs.6
; Obs.7
; Obs.8
; Obs.9
; Obs.10
; Obs.11
; Obs.12
Fig.13.3.1.
Fig.13.3.2.
301
; Obs.1
; Obs. 2
; Obs.3
; Obs.4
; Obs.5
; Obs.6
; Obs.7
302
; Obs.1
; Obs.2
; Obs.3
; Obs.4
; Obs.5
; Obs.6
; Obs.7
; Obs.8
; Obs.9
; Obs.10
; Obs.11
; Obs.12
303
; Obs.13
; Obs.14
Fig.13.5.1.
Bibliografie
304
Bibliografie
[1].
[2].
[3].
[4].
[5].
[6].
[7].
[8].
[9].
[10].
[11].
[12].
[13].
[14].
[15].
[16].
[17].
Cris H. Pappas & William H. Murray, III, "Borland C++ Handbook, Second Edition,
Osborne Mc Graw-Hill, Berkeley, California, USA, 1992.
Dan
Manolea,
Programare
n
AutoLISP
sub
AutoCAD,
Grupul
MicroINFORMATICA, Cluj-Napoca, 1996.
Dan Roman, Ingineria programrii obiectuale, Grupul MicroINFORMATICA, ClujNapoca, 1996.
Dumitru Dragomir, ndrumar de lucrri practice pentru proiectare asistat de
calculator, Editura Evrika, Brila, 1999.
Dumitru Dragomir, Ovidiu Iona, Leonard Domnioru, Ionel Gavrilescu, Lucrri de
tehnici de calcul numeric n ingineria asistat de calculator, Editura Evrika, Brila,
1999.
Dumitru Dragomir, Proiectare asistat de calculator pentru inginerie mecanic, Editura
Teora, Bucureti, 1996.
Gheorghe Curelet-Blan, "Visual BASIC, introducere n programarea uzua a
aplicaiilor Windows", Editura DONE, Bucureti, 1994.
Ioan Salomie, Tehnici orientate pe obiecte, Grupul MicroINFORMATICA, ClujNapoca, 1995.
Michael Metcalf, John Reid, Fortran 90/95 Explained, Second Edition, Oxford
University Press Inc., New York, 1999.
Mihai Anton Cerghizan, "EXCEL 7.0 pentru Windows 95", Editura TEHNIC,
Bucureti, 1996.
Namir C. Shammas, "Curs rapid de Borland C++", Teora, Bucureti, 1996.
Octavian Catrina, Iuliana Cojocaru, Turbo C++, Editura Teora, Bucureti, 1993.
Ovidiu Iona, Leonard Domnioru, Ionel Gavrilescu, Dumitru Dragomir, Tehnici de
calcul n construcii navale, Editura Evrika, Brila, 1999.
Teodor Tiuca, Tudor Precup, Tiberiu Antal, Dezvoltarea Aplicaiilor cu AutoCAD i
AutoLISP, Editura ProMedia Plus, Cluj Napoca, 1995.
Tom Swan, "nvm C... pas cu pas", Editura Tehnic, Bucureti, 1996.
Valentin C., Cristian G., Eugenia K., Alexandru P., "Limbajul C Standard", Teora,
Bucureti, 1992.
Vasile Petrovici, Florin Goicea, Programarea n Limbajul C, Editura Tehnic,
Bucureti, 1993.