11
1 CURS 6 6.1.FUNCŢII NUMERICE Notaţiile funcţiilor în limbajul BASIC seamănă cu cele cunoscute din matematică, totuşi există câteva diferenţe: - Funcţiile trigonometrice măsoară unghiurile în Radiani - nu în grade - [Sper că nu aţi uitat : π (adică 3.14) radiani corespund la 180 de grade, deci cade în sarcina programatorului să facă transformările în şi din radiani.] - Funcţia logaritmică lucrează în baza e, şi nu în baza 10, aşa cum s-a învăţat în liceu. [ Şi aici programatorul este obligat să facă transformările -dacă sunt necesare-.] Legat de funcţiile despre care nu s-a invăţat în liceu : - Funcţia SGN (de la cuvântul "SIGNUM" din latină = semn), se defineşte matematic astfel: SGN(x) = 1 dacă x > 0 ; SGN(x) = 0 dacă x = 0; SGN(x) = -1 dacă x < 0 - Sunt o serie de calcule ale căror rezultat trebuie să fie întreg. [La un examen de admitere nu se pot admite 23 şi un sfert de elevi ! ] . Funcţiile INT şi FIX transformă rezultatele în numere întregi, alegând întregul cel mai apropiat. Rotunjirea -operaţia cunoscută din şcoală- poate fi simulată folosind formula: NUMĂR ROTUNJIT = INT (x + 0.5) - Funcţia RND(x) ne permite să modelăm fenomene întâmplătoare (stohastice) cu ajutorul calculatorului. Dacă se apelează repetat funcţia RND(x), el returnează numere la întâmplare între 0 şi 1 (0 poate fi , 1 niciodată). Numerele generate - indiferent câte numere generăm - sunt uniform repartizate pe intervalul 0-1, şi aparent nu există nici-o relaţie matematică care să ne permită să calculăm următorul număr generat din numerele generate anterior. Folosind această funcţie, împreună cu funcţia INT putem obţine un algoritm ce ne va furniza numere întregi la întâmplare între 1 şi 6, exact ca un zar: [Încercaţi să rulaţi de mai multe ori : N = INT( 6 * RND(X)) + 1 : PRINT N ] În tabelul 6.1 se prezintă funcţiile matematice utilzate mai frecvent: FUNCŢIA ARGUMENTUL SEMNIFICAŢIA Obs. SIN(X) < X > = Radiani Sinusul unghiului x COS(x) < X > = Radiani Cosinusul unghiului x TAN(X) < X > = Radiani Tangenta unghiului x ATAN (x) x Re Arctangenta lui x Rez. în radiani LOG(x) x > 0 Logaritmul natural a lui x EXP(x) x Re e [ 2.71828] la puterea x SQR(x) x > 0 Radical de ordinul 2 din x ABS(x) x Re Modul (valoarea absolută) de x SGN(x) x Re Semnul lui x ( -1, 0 , 1 ) INT(x) x Re Ultimul întreg mai mic ca x INT(-2.3) = -3 ! FIX(x) x Re Partea intreagă a lui x FIX(-2.3) = -2 ! RND(X) [ X nu contează] Număr pseudoaleator între [0, 1 ) Tabelul 6.1.Funcţiile numerice din BASIC

Curs

Embed Size (px)

DESCRIPTION

pc

Citation preview

Page 1: Curs

1

CURS 6 6.1.FUNCŢII NUMERICE Notaţiile funcţiilor în limbajul BASIC seamănă cu cele cunoscute din matematică, totuşi există câteva diferenţe: - Funcţiile trigonometrice măsoară unghiurile în Radiani - nu în grade - [Sper că nu aţi uitat : π (adică 3.14) radiani corespund la 180 de grade, deci cade în sarcina programatorului să facă transformările în şi din radiani.] - Funcţia logaritmică lucrează în baza e, şi nu în baza 10, aşa cum s-a învăţat în liceu. [ Şi aici programatorul este obligat să facă transformările -dacă sunt necesare-.] Legat de funcţiile despre care nu s-a invăţat în liceu : - Funcţia SGN (de la cuvântul "SIGNUM" din latină = semn), se defineşte matematic astfel: SGN(x) = 1 dacă x > 0 ; SGN(x) = 0 dacă x = 0; SGN(x) = -1 dacă x < 0 - Sunt o serie de calcule ale căror rezultat trebuie să fie întreg. [La un examen de admitere nu se pot admite 23 şi un sfert de elevi ! ]. Funcţiile INT şi FIX transformă rezultatele în numere întregi, alegând întregul cel mai apropiat. Rotunjirea -operaţia cunoscută din şcoală- poate fi simulată folosind formula: NUMĂR ROTUNJIT = INT (x + 0.5) - Funcţia RND(x) ne permite să modelăm fenomene întâmplătoare (stohastice) cu ajutorul calculatorului. Dacă se apelează repetat funcţia RND(x), el returnează numere la întâmplare între 0 şi 1 (0 poate fi , 1 niciodată). Numerele generate - indiferent câte numere generăm - sunt uniform repartizate pe intervalul 0-1, şi aparent nu există nici-o relaţie matematică care să ne permită să calculăm următorul număr generat din numerele generate anterior. Folosind această funcţie, împreună cu funcţia INT putem obţine un algoritm ce ne va furniza numere întregi la întâmplare între 1 şi 6, exact ca un zar: [Încercaţi să rulaţi de mai multe ori : N = INT( 6 * RND(X)) + 1 : PRINT N ] În tabelul 6.1 se prezintă funcţiile matematice utilzate mai frecvent:

FUNCŢIA ARGUMENTUL SEMNIFICAŢIA Obs.

SIN(X) < X > = Radiani Sinusul unghiului x COS(x) < X > = Radiani Cosinusul unghiului x TAN(X) < X > = Radiani Tangenta unghiului x ATAN (x) x ∈ Re Arctangenta lui x Rez. în radiani LOG(x) x > 0 Logaritmul natural a lui x EXP(x) x ∈ Re e [ 2.71828] la puterea x SQR(x) x > 0 Radical de ordinul 2 din x ABS(x) x ∈ Re Modul (valoarea absolută) de x SGN(x) x ∈ Re Semnul lui x ( -1, 0 , 1 ) INT(x) x ∈ Re Ultimul întreg mai mic ca x INT(-2.3) = -3 ! FIX(x) x ∈ Re Partea intreagă a lui x FIX(-2.3) = -2 ! RND(X) [ X nu contează] Număr pseudoaleator între [0, 1 )

Tabelul 6.1.Funcţiile numerice din BASIC

Page 2: Curs

2

Chimia, Biologia, Geografia necesitǎ multǎ matematicǎ: Calcule trigonometrice, calcul matricial, calcule statistice, etc. Funcțiile matematice prezentate în Tab. 6.1 au multiple utilizǎri. Formulele cele mai utilizate în statisticǎ sunt formulele mediei şi a dispersiei: Formula mediei: Formula dispersiei: m = d2 = [ Pt detalii : vezi_f_C şi IptNI_Cap_13 ] 6.2.FUNCTII ŞIR. În tabelul următor sunt trecute în revistă toate funcţiile ce au legătură cu "şiruri" (texte), indiferent că argumentul sau rezultatul este şir. Instrucţiunile ce permit alinierea textelor nu au formă de funcţie, dar ele ca şi funcţionare se incadrează aici. FUNCŢIA ARGUMENTUL SEMNIFICAŢIA REZULTAT

LEN(X$) ŞIR LUNGIMEA ŞIRULUI NUMĂR VAL(X$) ŞIR "VALOAREA" ŞIRULUI NUMĂR STR$(X) NUMĂR ŞIRUL CORESPUNZĂTOR ŞIR CHR$(N) 0 =< N =< 127 CARACTERUL ASCII 1 CARACT. ASC(X$) ŞIR NR. de ORDINE ASCII (A primului) 0 =< N =< 127 STRING$(X,N) NUMĂR, NUMĂR ŞIR CU X CARACTERE IDENTICE ŞIR SPACE$(X) NUMĂR ŞIR CU X SPAŢII ŞIR LEFT$(X$,N) ŞIR, NUMĂR PRIMELE N caractere din ŞIR ŞIR RIGHT$(X$,N) ŞIR, NUMĂR ULTIMELE N caractere din ŞIR ŞIR MID$(X$,N,M) ŞIR, NR1, NR2 M caractere (incepând cu N) ŞIR INSTR(X$,A$) ŞIR1, ŞIR2 CĂUTARE SUBŞIR(A$) ÎN X$ NUMĂR LSET A$=X$ ŞIR ALINIERE LA STÂNGA ŞIR RSET A$=X$ ŞIR ALINIERE LA DREAPTA ŞIR UCASE$ (X$) ŞIR TRANSFORMĂ TEXTUL ÎN

MAJUSCULE (LITERE MARI) ŞIR

LCASE$ (X$) ŞIR TRANSFORMĂ TEXTUL ÎN LITERE MICI

ŞIR

LTRIM$(X$) ŞIR ELIMINĂ BLANCURILE DE LA ÎNCEPUTUL TEXTULUI

ŞIR

RTRIM$(X$) ŞIR ELIMINĂ BLANCURILE DE LA SFÂRŞITUL TEXTULUI

ŞIR

Tabelul 6.2.Funcţiile şir din BASIC

Page 3: Curs

3

6.3.FUNCŢII LOGICE Funcţiile logice operează asupra variabilelor logice. Chiar dacă nu există definite explicit în limbajul BASIC (ele există definite în limbajele FORTRAN, PASCAL, etc.), aceste variabile sunt folosite în construcţia şi funcţionarea instrucţiunii IF. Dacă ne uităm la structura acestei instrucţiuni (vezi 5.9), evaluarea acelei <condiţii> din instrucţiune, atribuie valoare la o variabilă logică. Orice variabilă logică poată să aibă două valori : ADEVĂRAT (Eng.: TRUE) sau FALS (ENG.: FALSE). [ Deobicei se notează cu T, F , iar în algebra Booleană se folosesc notaţiile 0,1 ]. Asupra variabilelor logice pot acţiona funcţii unare ( funcţia NOT cu un singur argument) şi funcţii binare (cu 2 argumente) rezultatul fiind tot o variabilă logică. FUNCŢIA ARGUMENTUL SEMNIFICAŢIA Obs.

NOT X T, F "NEGAREA LUI X" (T → F, F→ T) X AND Y T, F T, F FUNCŢIA LOGICĂ "ŞI" X OR Y T, F T, F FUNCŢIA LOGICĂ "SAU" X XOR Y T, F T, F F. LOGICĂ "SAU EXCLUSIV" X EQV Y T, F T, F F. LOGICĂ "ECHIVALENŢĂ" X IMP Y T, F T, F F. LOGICĂ "IMPLICAŢIE" X NAND Y T, F T, F FUNCŢIA LOGICĂ "ŞI-NEGAT" X NOR Y T, F T, F FUNCŢIA LOGICĂ "SAU-NEGAT" ..şi alte funcţii negate

Tabelul 6.3. Funcţii logice în BASIC Funcţiile pot fi combinate în expresii complicate, pentru reflectarea deciziilor complexe, multicauză. [O persoană superstiţioasă ce nu iese din casă dacă cumva este Vineri şi 13 sau a trecut o pisică neagră prin preajmă, poate fi modelată de instrucţiunea : IF (ZIUA$="VINERI" AND DATA = 13) OR PE_STRADA ="ESTE_PISICA_NEAGRĂ" THEN PRINT "AZI NU IEŞIM PE STRADĂ! " ] Regulile de compunere a funcţiilor logice sunt descrise în legile Logicii matematice şi în algebra Booleană de către axiomele lui DeMorgan. Un exemplu din aceste axiome : ŞI negat este SAU ; Mergem la cinema dacă: nu avem ore ŞI este timp urât. [Negarea acestei propoziţii ar fi:] Nu mergem la cinema dacă: avem ore SAU este timp frumos. [ Matematic, aceste axiome sunt descrise mai abstract, dar în esenţă e vorba de asemenea reguli. Cei interesaţi vor consulta manualele de specialitate.]

Page 4: Curs

4

6.4.3. Instrucţiunea COLOR permite să schimbăm culoarea textului, a fondului, etc., şi prin acesta să atragem atenţia asupra unor texte ce sunt mai importante. Dacă avem un monitor color, în funcţie de calitatea lui, textele pot fi afişate în diferite culori, pe fond de culori diferite, existând şi posibilitatea de a afişa în mod luminos şi clipitor. Modul de afişare deci depinde de monitor, şi este comandat de numerele alese pentru instrucţiunea cu forma: COLOR <nr_cul_cerneală>, <nr_culoare_fond> (6.3) unde: - <nr_cul_cerneală>, precizează culoarea pentru text - <nr_cul_fond> , precizează culoarea pentru fond , iar Câteva exemple: Indiferent de tipul monitorului: COLOR 7,0 este comanda implicită de a scrie cu litere albe pe fond negru, COLOR 0,7 va tipări în "video-invers", adică litere negre pe fond alb. La un monitor color: COLOR 1,7 va tipări cu litere albastre pe fond alb, COLOR 4,7 va tipări cu litere roşii pe fond alb, COLOR 7,1 va tipări cu litere albe pe fond albastru, etc. [Numerele asociate fiecărei culori nu merită să fie memorate, ele depind de tipul monitorului, şi de alte instrucţiuni folosite (SCREEN, PALETTE, etc.), aşa că cel mai bine ca înainte de a le folosi, să scriem un program ce obligă calculatorul să afişeze un text în toate modalităţile posibile şi să ne alegem de pe ecran "variantele simpatice".] Ceea ce e de reţinut în legătură cu folosire instrucţiunii COLOR este că de fiecare dată instrucţiunea modifică modul de afişare şi acesta rămâne aşa, până la o nouă comandă. Deci dacă vreţi ca un text să fie afişat să zicem video invers, dar textul următor iarăşi în mod normal,trebuie să dăm din nou o comandă de modificare a afişării, adică o nouă instrucţiune COLOR, pentru revenire. Porţiunea de program care afisează 3 texte, prima în video normal, a doua în video învers şi a 3-a iarăşi în video normal, va arăta deci astfel: PRINT "PRIMUL TEXT IN VIDEO NORMAL" COLOR 0,7 PRINT "AL DOILEA TEX IN VIDEO INVERS" COLOR 7,0 PRINT " AL TREILEA TEXT, IARĂŞI IN VIDEO NORMAL"

Page 5: Curs

5

6.5. INSTRUCTIUNI GRAFICE Calculatoarele au ajutat inginerii de la început, rezolvând ecuaţii, făcând calcule complicate în timp mult mai scurt. Multă vreme însă ajutorul s-a mărginit la aceste calcule, şi cel mai consumator de timp din activităţile inginereştei - desenatul- nu se bucura de nici un ajutor din partea tehnicii de calcul. Principala piedică a fost inexistenţa dispozitivelor prin care putem povesti calculatorului cum arată un desen şi mai ales a dispozitivelor prin care calculatorul - după ce în memoria lui există informaţiile necesare pentru elaborarea desenului - desenează pe hârtie sau măcar pe ecran. [ Despre aceste dispozitive de desenare vom vorbi mai detailat în cap. 10 -Periferice- ] Tehnicile de descompunere a unei imagini în structuri mai simple datează încă din secolul trecut când pictorii “pointilişti” [ George Seurat(1859 - 1891), Paul Signac(1863-1935), etc.] au realizat nişte picturi din pete mici -practic nişte puncte- colorate. Dacă ne uităm de la distanţă vedem peisajul în ansamblu, dar inspectând picturile de aproape vom vedea că au fost realizate din multe-multe pete colorate. Descompunerea imaginilor în puncte a fost folosit la începutul secolului XX la transmisia imaginilor prin telegrafie (Video-telegraf, Telefax), şi apoi prin televiziune. Acelaşi principiu se aplică la toate sistemele electrice de afişare, cum ar fi "ziarele electrice" şi panourile de afişare din stadioane. O matrice de 8 x 8 becuri permite afişarea unui caracter, după cum becurile sunt aprinse sau nu. E clar că pe măsura creşterii numărului de becuri (în loc de câteva becuri mari, vom folosi mai multe becuri mai mici) posibilitatea de afişare a detaliilor va creşte. Pentru a descrie fineţea unui dispozitiv de afişare construit pe acest principiu vom număra numărul de "puncte grafice" (PIXELI - în informatică) care alcătuesc imaginea respectivă. Pentru un caracter (în cazul cel mai simplu ), vom folosi o matrice de 8 x 8 becuri, adică 64 de PIXELI. Ecranele obişnuite de televizor de azi afişează imaginile descompuse în 625 x 625 de puncte, monitoarele de calculator - în funcţie de tip – vor face acelaşi lucru pe o matrice - în cazul cel mai defavorabil - de 600 x 800 de puncte, dar în cazuri extreme matricea poate fi de 4096 x 4096 de puncte. [ Despre tipuri de monitoare vezi Cursul de periferice ] Intrucât există mai multe tipuri de monitoare pe piaţă, şi acelaşi calculator poate folosi monitoare mai slabe sau mai pretenţioase, la începutul unui program în care vrem să desenăm, trebuie "explicat" calculatorului ce fel de monitor avem. În limbajul BASIC pentru acesta se va folosi instrucţiunea SCREEN de forma: SCREEN <nr_ecran> (6.2) unde <nr_ecran> are valori diferite în funcţie de tipul monitorului folosit, el era egal cu 12 pentru un monitor VGA color de 640 x 480 (cel mai bun de pe vremea S.O. MS DOS ). [ În VISUAL-BASIC (v. cursul 7) se pot realiza desene în obiectele de tip “Picture-Box” cu instrucţiuni asemǎnǎtoare celor prezentate mai jos, limitele desenului fiind în funcţie de parametri obiectului ales pentru desenare. ]

Page 6: Curs

6

Desenarea se face "aprinzând" câte un pixel. Instrucţiunile ce permit aprinderea şi stingerea pixelilor au forma: PSET (X,Y) pt. aprindere, şi PRESET (X,Y) pt. stingere pixel., unde X,Y reprezintă coordonatele punctului (a pixelului). Spre deosebire de cele învăţate la matematică, unde ne-am obişnuit cu coordonatele carteziene, la desenarea pe ecranul monitorului - dacă nu se specifică în mod special altceva-, se folosesc "coordonatele fizice" (zise şi "coordonate ecran"), ce au originea (punctul cu coordonatele 0,0) în colţul stânga sus. La început, toate desenele se făceu cu ajutorul instrucţiunilor PSET şi PRESET, pentru o linie aprinzând mai multe puncte alăturate, s.a.m.d. Dupǎ un timp sau pus la punct o serie de instrucţiuni ce uşurează elaborarea desenelor. Instrucţiunea ce permite trasarea liniilor, a dreptunghiurilor (goale şi haşurate) are forma: LINE [(x1,y1)] - [STEP](x2,y2) [,attr][,B][F][,stil] (6.5) (Trad.Rom.:LINE = "linie") Figura geometrică cea mai frecventă -după linie- este cercul. Trasarea lui se face cu instrucţiunea: CIRCLE (xc, yc ), R [,CUL,ST,SF,ASP ] (6.14) [Trad.Rom.:CIRCLE = "cerc" ] unde - xc, yc sunt coordonatele centrului, - R este Raza cercului, restul de parametri opţionali ne permit să trasăm cercuri colorate, elipse şi arcuri de cerc. Trasarea figurilor geometrice mai "complicate", cum ar fi parabole, hiperbole şi alte curbe descrise de ecuaţii mai complicate, se va face prin "aproximaţii", Aşa cum un poligon cu foarte multe laturi se apropie de cerc, orice curbă poate fi aproximată printr-o succesiune de segmente atât de scurte încât nu se văd cu ochiul liber şi dau senzaţia de curbă continuă. La folosirea eficientă a suprafeţei de afişare contribuie încă 2 instrucţiuni. Prima permite ca tot desenul elaborat de noi să ocupe doar o porţiune din ecranul folosit, permiţând ca pe ecran să se afişeze în acelaşi timp mai multe desene. El are forma generală: VIEW (x1,y1) - (x2, y2) (6.21) [Trad.Rom.:VIEW = "vedere" ] Instrucţiunea VIEW defineşte porţiunea de ecran folosită pentru desenare. (numită şi "FEREASTRĂ GRAFICĂ" ) [ Implicit,calculatorul presupune că vrem să desenăm pe tot ecranul,- adică fără să ne întrebe- la început de program grafic (dacǎ avem un ecran de 640x480 ) el lansează instrucţiunea: VIEW ( 0,0 ) - (640, 480 ) ]

Page 7: Curs

7

Cealaltă instrucţiune, foarte utilă în programele de desenare, care permite să alegem cât de mult din desen se afişează la un moment dat în fereastra grafică aleasă, este instrucţiunea : WINDOW [SCREEN] (x1,y1) - (x2, y2) (6.23) [ Trad.Rom.: WINDOW = "fereastră" ] - unde - x1, y1 sunt coordonatele colţului stânga-sus, iar - x2, y2 sunt coordonatele colţului dreapta-jos, a porţiunii dreptunghiulare de desen afişate în fereastra grafică. Astfel modificând parametrii instrucţiunii WINDOW, din acelaşi desen putem afişa pe ecran zone mai mari (având o privire de ansamblu) sau zone mai mici (observând detaliile ). La laborator veti desena un stadion, de mai multe ori, modificând parametri instrucţiunii WINDOWS, astfel afişând pe ecran diferite porţiuni ale stadionului. [ Ca şi "efect secundar", utilizând instrucţiunea WINDOWS, calculatorul trece de la coordonate fizice la coordonate carteziene.] Dacă nu specificăm altceva, - la un monitor de 640x480 - calculatorul presupune că pe ecran se va afişa porţiunea de desen (0,0) - (640,480), adică la început el lansează inplicit instrucţiunea: WINDOW SCREEN (0,0 ) - ( 640, 480 ) (6.24) Toate instrucţiunile prezentate până acum erau destinate inginerilor, pentru desenare pe ecran. Pentru a uşura comanda instalaţiilor de desenare (PLOTTER: vezi cap.10 -PERIFERICE-), s-a creat instrucţiunea DRAW, mai uşor de manipulat ca cele descrise până acum, inzestrat şi cu nişte facilităţi inexistente până acum. Instrucţiunea are forma: DRAW <expresie şir> (6.26) [Trad.Rom.: DRAW= "a desena" ] Cele prezentate pânǎ aici despre limbajul BASIC (versiunea QUICK-BASIC) ne permit sǎ construim programe destul de complexe, ce pot ajuta mult disciplinele ştiinţifice ca şi Chimia, Biologia, Geografia, şi multe alte discipline, fǎrǎ a fi necesarǎ un efort deosebit. La laborator veţi avea ocazia sǎ vǎ convingeţi de aceasta, rulând programe scrise în acest limbaj ce rezolvǎ de la probleme – de la cele mai simple legate de operaţii matematice (ADUN) pânǎ la cele ce rezolvǎ probleme matematice mai complicate (Rezolvarea Ec_grad_2 , Operaţii cu Matrici ) de satisticǎ ( calculul Mediei şi a Dispersiei). De o utilitate deosebitǎ sânt programele ce apeleazǎ la posibilitǎţile grafice oferite de limbaj: de la cele ce ne ajutǎ la reprezentare graficǎ a funcţiilor, la reprezentǎri de Histograme, la cele ce apeleazǎ la Interpolarea polinomialǎ, la Regresie , la diferite metode de Clasificarea, etc. Metodele grafice au o importanţǎ deosebitǎ pentru Geografi, pentru a înţelege modul în care informaţiile grafice (Diagrame, hǎrţi, etc.) pot fi memorate, afişate şi manipulate cu ajutorul tehnicii de calcul.

Page 8: Curs

8

6.6. INSTRUCŢIUNI DE GENERAREA SUNETULUI. Calculatorul nu a fost inventat ca instrument muzical, dar din când în când avem nevoie ca el să scoată sunete. În primul rând când - la introducerea datelor, de exemplu - nu suntem atenţi şi calculatorul poate sesiza greşeala. (Dacă într-un program introducem un număr care reprezintă numărul de ordine a unei zile din săptămână, se ştie că acesta nu poate fi mai mare ca 7, iar dacă ceea ce introducem e numărul de ordine a zilei dintr-o lună, acesta nu poate fi mai mare ca 31, Dacă în aceste cazuri, din neatenţie, încercăm să "păcălim" calculatorul, el ne poate atenţiona nu numai printr-un mesaj pe ecran ci şi printr-un mesaj sonor. (Această atenţionare e moştenirea din timpul telegrafiei, când operatorul trebuia trezit noaptea printr-un semnal sonor - transmiţând caracterul ASCII : BEL). În limbajul BASIC, pentru a auzi un sunet se avertizare (frecvenţa = 800 Hz, durata 1/4 secunde ) se foloseşte instrucţiunea : BEEP (6.27) [Trad.Rom.: BEEP ="piuit" ] În calculatoarele de azi există posibilitatea să generăm sunete de diferite frecvenţă, şi de diferită durată ( nu numai sunetul de avertizare ), folosind instrucţiunea: SOUND <frecvenţă>, <durată> (6.28) [Trad.Rom.:SOUND="sunet"] - unde: <frecvenţă> - reprezintă frecvenţa sunetului în Hz, cu valori în intervalul de (37, 32767) Hz. <durată> - este durata în multipli de 0.0549 secunde (pt. 1 secundă, durata trebuie să fie în jur de 18.2 ) Durata maximă are valoarea de 65635 6.7. .SUBRUTINE În cazul în care anumite instrucţiuni se folosesc în mod repetat, dar de fiecare dată diferă mai multe valori nu numai valoarea unei singure variabile, respectiv valorile variabilelor nu se modifică "monoton" subrutinele ne pot ajuta. Programul poate fi scurtat şi făcut mai clar, dacă rescriem programul astfel: - Instrucţiunile care se repetă se scot din textul programului şi un exemplar din ele se poziţionează la sfârşit, incluzând la capăt instrucţiunea RETURN şi creându astfel o SUBRUTINĂ. - În locul instrucţiunilor scoase (poziţionate acum într-un singur exemplar la capăt) se include instrucţiunea GOSUB <etichetă>, unde <etichetă> este eticheta instrucţiunii de la începutul subrutinei. De fiecare dată când un program ajunge la o instrucţiune GOSUB, calculatorul memorează adresa instrucţiunii imediat următoare ("adresa de revenire"), după care sare la subrutină şi începe executarea instrucţiunilor memorate acolo. În momentul în care subrutina este terminată şi s-a ajuns la instrucţiunea RETURN se citeşte adresa anterior memorată şi se sare înapoi la această adresă.

Page 9: Curs

9

Astfel se asigură ca după saltul la subrutină, execuţia să continue unde e logic, adică la instrucţiunea imediat următoare de după GOSUB. Programul din care instrucţinile înglobate în subrutine au fost eliminate se numeşte acum programul principal (sau programul "apelant"), subrutinele se mai numesc şi subprograme, proceduri, sau rutine. Folosirea subrutinelor face munca de programare mai eficientă pentru că programul devine mai scurt, mai clar şi dacă instrucţiunile care acum sunt încluse în subrutine trebuiesc modificate, aceste modificări se vor face doar o singură dată, doar asupra instrucţiunilor din subrutină şi nu de atătea ori de câte ori existau ele în program ( dacă lucram fără subrutine). Valorile ce nu sunt identice la apelările repetate ale subrutinelor se numesc parametrii subrutinelor, "se comunică" subrutinelor înainte de apelare. Transmiterea acestor valori se poate face prin mai multe metode. Cel mai uşor se transmit parametri dacă folosim parametri globali, ( folosit şi în cazul exerciţiilor de mai sus - cele cu "căsuţe"-). La parametri globali variabilele au aceeaşi denumire şi în programul principal şi în subrutină. [ Metoda e simplă dar periculoasă, subrutina poate modifica accidental valorile unor variabile importante. Această formă de subrutine se utilizează azi doar in secvenţele de tratare a erorilor în diferitele versiuni de BASIC şi în VISUAL BASIC. Programul apelant şi secvenţa de cod din subrutinǎ este afişat de program în aceeaşi fereastrǎ ] Versiunile noi de BASIC şi VISUAL BASIC utilizează subrutinele cu parametrilor formali unde aceeaşi variabilă poate avea denumiri diferite în programul principal şi în subrutină. Astfel un subprogram care rezolvă ecuaţia de gradul doi va fi declarat: SUB ECGRD2 (A,B,C,X1,X2,MESAJ$) (6.29) (Subrutina are 6 parametri: 3 de intrare -cei 3 coeficienţi-, şi 3 de ieşire - cele 2 pentru rădăcinile rezultate şi o variabilă text pentru eventualele mesaje de eroare. ) De fiecare dată când vom apela această subrutină din programul principal, se vor preciza valorile parametrilor - sau indicând valoarea lor, sau precizând variabilele care memorează aceste valori- . Astfel putem apela subrutina (6.29), folosind instrucţiunile: CALL ECGRD2 (1,-3, 2, U1, U2, TEXT$) sau (6.30.a) CALL ECGRD2 (M, N, P, R1, R2, TEXT$) (8.30.b) [Se vede că ceea ce în subprogram este notat cu A, în programul principal va fi notat cu M, ceea ce în subprogram e B, afară este N, ş.a.m.d. ] În primul caz - cea din 6.30.a - metode transmitere a valorilor pentru coeficienţi este denumită “referinţă prin valoare”. În acest caz valoarea variabilelor din programul principal nu se modifică. Cea de a 2-a metodă pentru transmiterea acestor valori este denumită “referinţă prin adresă” şi subrutina va opera asupra variabilelor din programul principal transmitându-se subrutinei adresele acestor variabile . Această “transmisie de adrese” se poate referi la variabile memorate în: memorie, registre, sau în stivă

Page 10: Curs

10

[ În cazul subrutinelor cu parametri formali, interpretorul sau compilatorul va afişa pe ecran programul apelant şi subrutinele în ferestre diferite. ] Stiva (descrisă în cap 8.2 Structuri de date) are aplicaţii multiple în cazul subrutinelor. În primul rând adresa de revenire din subrutină se memorează intr-o stivă (STIVA-GOSUB). Stiva se poate folosi nu numai pentru memorarea adresei de revenire ci şi pentru transmiterea parametrilor formali a subrutinelor. Acesta aduce o posibilitate nouă, cea de "autoapelare" a subrutinelor. Dacă parametri formali se transmit printr-o locaţie de memorie fixă, la prima apelare a subrutinei, aceste locaţii de memorie se ocupă de datele depuse la prima apelare, şi dacă am apela aceeaşi subrutină (înainte ca să se termine subrutina şi să se golească zona de memorie alocată parametrilor) datele din această zonă s-ar pierde scriind parametrii noi peste datele vechi. În matematică există o serie de probleme - formulele de recurenţă - unde pentru a calcula valoarea unei funcţii cu parametrul "N" este necesară calculul lui cu parametrul "N-1": FACT(N) = N * FACT(N-1) , FIBONACCI(N) = FIBONACCI(N-1) + FIBONACCI(N-2), etc. În aceste cazuri se cunoaşte valoarea funcţiei pentru 1, şi plecând de la această valoare, pe baza formulelor de recurenţă se calculează valorile următoare. Invers se poate spune că pentru a calcula valorile pentru "N" se apeleazá funcţia pentru "N-1", ceea ce apelează funcţia cu "N-2", s.a.m.d., până ce se ajunge la ceva cunoscut, simplificând treptat problema. În QUICK-BASIC, limbaj care ştie să construască subrutine ce memorează parametri formali în stive, se pot construi asemenea subrutine, astfel pentru calcul factorialului se poate folosi subrutina cu structura: SUB FACTORIAL (N) IF N=1 THEN FACTORIAL=1: RETURN ELSE FACTORIAL = N*FACTORIAL(N-1) ' Instrucţiunea de recurenţă ENDIF RETURN Dacă se apelează această subrutină cu parametrul 4, [ REZ = FACTORIAL(4) ] calculatorul depune numărul 4 în stivă şi se apucă de lucru. Ajungând la instrucţiunea de recurenţă, calculatorul apelează din nou subrutina factorial, dar acum cu parametrul 3, deci se pune 3 în vârful stivei, şi se apucă de lucru. Iar ajunge la instrucţiunea de recurenţă, şi depune numărul 2 în stivă, apelând subrutina cu parametrul N = 1. În acest moment subrutina ştie deja rezultatul, factorialul este egal cu 1, la părăsirea subrutinei citindu-se numărul 1 din stivă. Stiva se va goli acum treptat, inmulţind pe rând valoarea funcţiei cu numerele memorate acolo. Subrutinele recursive- cele ce permit autoapelarea - permit ca o serie de probleme să se reducă la probleme mai simple, uşor solubile. Informatica e plină de probleme ce se rezolvă mult mai uşor dacă sunt definite recursiv. (Ex.: parcurgerea unei arbore, -vezi. Capitolul 8. despre structuri de date -, analiza lexicală -vezi cap 2-, etc.)

Page 11: Curs

11

Subrutinele au un rol important în VISUAL BASIC. În mod analog cu versiunile de BASIC ele se vor utiliza în momentul în care o secvenţǎ de instrucţiuni este utilizată de mai multe ori, şi ele se vor apela în mod analog cu cele văzute la BASIC. (Aceste subrutine se pot memora şi în fişiere separate de tip *.bas, numite “Module” …. ) Cel mai frecvent subrutinele sunt utilizate la apariţia unor “evenimente” (cel mai frecvent la evenimentul “CLICK”) ele vor fi apelate automat după ce “ evenimentul “ a avut loc. Aceste subrutine se memorează în modulele ce descriu interfaţa grafică de utilizator (fişierele de tip *.frm ) Detalii vezi la prezentarea limbajului VISUAL BASIC (Cap 7).