| Author |
Topic  |
|
|
duci
Forum Admin
 172 Posts |
Posted - 07/19/2005 : 10:06:45
|
Elementele Limbajului Liberty Basic(Just Basic)
Un program în limbajul BASIC consta dintr-un program principal, care se termina cu declaratia END (sfarsit) precum si functii si subrutine care urmeaza dupa programul principal. O instructiune a programului se poate termina prin apasarea tastei <ENTER> (retur de car). Dar linia observata în editor poate contine mai multe instructiuni separate prin ":". O linie poate fi numerotata sau sa aiba o eticheta.
Este recomandat ca într-un program sa se evite utilizarea saltului neconditionat (GOTO), deoarece în cazul aparitiei unor greseli nu mai stim de unde s-a ajuns în acel punct. In locul acestui stil, întotdeauna se pot folosi structuri caracterizate prin început si sfârsit. Acesta este principiul de baza al programarii structurate. Variabile Numele variabilelor este un sir de litere eventual urmate de cifre. Numele poate contine semnul punct.
Pentru tablouri (vectori si matrici) se foloseste o declaratie care sa permita alocarea în memorie a spatiului necesar, deoarece acest spatiu (volum) poate fi foarte mare.
Exemplu:
Tema:
Rezerva spatiu în memorie pentru 100 de numere în variabila A.
Solutie:
DIM A(10,10)
Sau
DIM A(100)
Identificatori
Identificatorii pot fi
- nume de fisiere - nume de functii sau subprograme - etichete (de exemplu [start]) marcate cu [ ] sau numar de linie Operatori
- Atribuirea: semnul folosit este "=". A=1 se citeste ca: A ia valoarea 1 - Inmultirea a doua numere: semnul folosit este "* " - Impartirea a doua numere: semnul folosit este "/ " - Scaderea a doua numere: semnul folosit este "- " - Adunarea a doua numere: semnul folosit este "+ " - Ridicarea la putere foloseste semnul ^ (de exemplu x^y însemna xy) - Testarea egalitatii a doua numere (comparatia) foloseste tot semnul "=" - Testarea inegalitatii: >= mai mare sau egal; <= mai mic sau egal - Operatorii logici: AND înaseamna si, OR înseamna sau iar NOT înseamna negare
Saltul neconditionat
Sintaxa:
GOTO [identificator] ... [identificator] A=1
sau
GOTO 10 ... 10 A=1
Structuri repetitive
Structura FOR:
Sintaxa:
FOR ... TO ... STEP ... ... ... NEXT ...
Exemplu:
Tema:
[Inceput] Pentru variabila NUMAR care ia valoarea initiala 1 pâna la 100 cu pasul 0.1 [Actiune] tipareste numarul NUMAR/2*100 [Sfarsit] Creste NUMAR cu valoarea 0.1. Daca NUMAR este mai mic decât 100 reia tiparirea
Solutie:
FOR NUMAR=1 TO 100 STEP 0.1 PRINT NUMAR/2*100 NEXT NUMAR
Structura WHILE
Sintaxa:
WHILE ... ... ... WEND
Exemplu:
Tema:
[început] Cât timp este îndeplinita conditia, A<10 [actiuni] valoarea variabilei A creste cu o unitate (noua valoare a lui A este A+1) tipareste A [sfârsit] Sfârsitul actiunilor
Solutie:
WHILE A<10 A=A+1 PRINT A WEND
Structura alternativa Sintaxa:
IF ... THEN ... ELSE ...
Exemplu:
Tema:
Daca A>10 atunci tipareste "Maria", altfel tipareste "Ana are mere"
Solutie
IF A>10 THEN PRINT "Maria" ELSE PRINT "Ana are mere"
Aceasta structura poate fi adaptata pentru salt conditionat daca pentru unul din corpurile actiunilor se propune un salt
IF A>10 THEN PRINT "Maria" ELSE PRINT "Ana are mere": GOTO 10
sau
IF A>10 THEN PRINT "Maria" ELSE PRINT "Ana are mere": GOSUB 100
Functii si subrutine
Cea mai utilizata declaratie pentru un corp de instructiuni care se repeta este:
1. Cu salt neconditionat
GOSUB [identificator] ... ... END [identificator] ... ... RETURN
De obicei aceste structuri sunt plasate la sfârsitul programului, dupa declaratia de sfarsit a programului principal, END.
2. Declaratia de functie
... ... END FUNCTION F(x) ... ... F=... ... END FUNCTION
3. Subprogramul (subrutina)
... ... END SUB maria ... ... END SUB
Operatii cu fisiere
Deschiderea si închiderea nunui fisier pe disc:
Sintaxa:
OPEN nume FOR scop AS #numar ... ... CLOSE #numar
Exemplu
Tema:
Deschide fisierul "Maria.dat" pentru scriere ca nr. 1. Inchide fisierul cu nr.1
Solutie:
OPEN "Maria.dat" FOR OUTPUT as #1 ... ... CLOSE #1 Obs: semnul # este o abreviere pentru cuvântul "numar".
Scopul poate fi:
scriere (OUTPUT), citire (INPUT) sau adaugare la un fisier existent (APPEND).
Numarul poate fi de asemenea si o succesiune de litere si cifre, eventual separte prin punct.
Functii de intrare/iesire
Citire:
INPUT variabila scalara
Tiparire (scriere)
PRINT lista de variabile separate prin ;
Pentru citirea dintr-un fisier sau scrierea într-un fisier se foloseste:
INPUT #numar, ...
si
PRINT #numar,...
Functii matematice
ABS( n ) valoarea absoluta a lui n ACS( n ) arccosinus de n ASN( n ) arcsinus de n ATN( n ) arctangenta de n COS( n ) cosinus de n (argumentul în radiani) EXP( n ) exponentiala e^n LOG( n ) logaritmul natural al lui n RND( n ) genereaza un numar aleator între 0 si 1 SIN( n ) sinus de n (argumentul în radiani) TAN( n ) tangenta de n (argumentul în radiani) SORT nume ordoneaza un vector sau o matrice INT( n ) partea întreaga a lui n
Operatii cu siruri de caractere
Sirurile de caractere pot fi declarate între ghilimele si sunt stocate în variabile al caror nume se termina cu semnul $
Exemplu:
Maria$="Ana are mere"
Concatenarea este operatia de compunere a unui sir de caractere din mai multe subsiruri. Se foloseste caracterul "+":
Exemplu:
Maria$="Ana"+" are"+" mere"
Cea mai utilizata functie pentru siruri de caractere este INKEY$, care citeste tastatura în asteptarea unei apasari de tasta:
Exemplu:
1010 IF inkey$="" THEN 1010 ELSE PRINT "GATA"
Alte functii:
ASC( s$ ) codul ASCII al caracterului s$ CHR$( n ) caracterul cu codul ASCII n DATE$( ) sir de caractere care contine data curenta INSTR(a$,b$,n) cauta sirul b$ în a$, pornind de la pozitia n LEFT$( s$, n ) primele n caractere ale sirului s$ LEN( s$ ) lungimea sirului s$ MID$( ) subsir din sir NAME a$ AS b$ redenumeste fisierul a$ ca b$ RIGHT$( s$, n ) cele n caractere de la dreapta din s$ SPACE$( n ) un sir cu n blancuri STR$( n ) transforma un numar, n, în sir de caractere TIME$( ) ora curenta ca un sir de caractere VAL( s$ ) echivalentul numeric al lui s$ WORD$( s$, n ) cuvântul n din s$
Operatii cu ferestre
Deschiderea ferestrelor de tip Windows are aceeasi sintaxa ca si deschiderea unui fisier pe disc însa exista mai multe optiuni.
De un mare ajutor este programul care genereaza interactiv secventa de program, "FreeFormEditor" din meniul "Run".
Exemplu:
Nomainwin Dezactiveaza fereastra de dialog. OPEN "Numele ferestrei: grafice de functii" FOR graphics as #1 print #1, "down" Penita jos print #1, "line ";11;" ";11;" ";111;" ";111 Traseaza o linie de la x=11, y=11pâna la x=111, y=111 print #1, "up; goto 1 50 Penita sus. Du penita la x=1, y=50 print #1, "down" Penita jos print #1, "color blue; goto 190 300" Ia penita albastra si du penita la x=190, y=300 print #1, "up;goto 120 100;\ mesaj" Scrie text la pozitia (x,y)=120,100 print #1, "up;goto 100 150;\ numar "+str$(987.125) print #1, "flush" notice "Mesaj final de terminare normala"+chr$(13)+" end " input r$ close #1
end
Se observa ca instructiunile pentru miscarea penitei sunt scrise folosind conventiile si functiile pentru siruri de caractere.
|
Prof.Dr. D. Ciurchea
|
|
|
duci
Forum Admin

172 Posts |
Posted - 07/19/2005 : 10:42:51
|
Utilizarea mediului de programare
- Dupa apelarea mediului de programare vom obtine urmatoarea fereastra de editare a programului sursa:
- Meniul contine diferite optiuni pentru încarcarea si salvarea fisierelor, editare, depanarea programelor cu greseli, fisiere de ajutor (help), instrumente pentru proiectarea ferestrelor grafice.
-Rularea unui program exemplu
- Pasul 1: Deschiderea optiunii din meniu care permite listarea programelor (File>>Open)
- Pasul 2: Alegerea programului exemplificativ,în sectiunea din stânga, dupa care se alege "OK" în dreapta:
- Pasul 3: Se alege din meniu optiunea (Run>>Run) dupa care apare o fereastra specifica programului ales:
|
Prof.Dr. D. Ciurchea
|
 |
|
|
duci
Forum Admin

172 Posts |
Posted - 07/19/2005 : 10:48:47
|
Superexemplu Fitarea unui spectru Mossbauer prin metoda celor mai mici patrate
 ----- Output grafic ----
130 REPS = 1 'Incepe evaluarea lungimii mantisei masinii. 140 WHILE REPS+1<>1:REPS=REPS/2:WEND 180 REPS = REPS * 2'Lungimea mantisei masinii 220 NPCT = 5 ' Nr. punctelor experimentale. 230 NPAR = 3 ' nr. parametrilor din modelul teoretic. 240 DIM D(NPCT):dim T(NPCT)' Vect. care contin datele experim. 250 DIM W(NPAR):dim V(NPAR):dim VT(NPAR)' Vect.de lucru pt. param. 260 DIM A(NPAR, NPAR):dim X(NPAR):dim B(NPAR) 270 rem DIM AINV(NPAR, NPAR)' Calculul matr. inverse. 271 D(1)=12:D(2)=15.7:D(3)=18.8:D(4)=20.2:D(5)=19.2 272 T(1)=0:T(2)=10:T(3)=30:T(4)=100:T(5)=300 280 NSIG = 5 ' Nr. cifre semnif. in raportarea rez. final. 290 PREC = 10 ^ (-1*NSIG) 300 MAXFN = 5000' Nr. maxim de evaluari ale functiei c.m.m.p. UpperLeftX=4 UpperleftY=-100 WindowWidth=420 WindowHeight= 420 open "grafic final" for graphics as #1 print #1, "fill yellow;color darkblue" print #1, "goto ";11;" ";21 print #1, "backcolor yellow;\D (dimensiunea de graunte)" print #1, "down; goto ";11;" ";300 print #1, "goto ";311;" ";300 print #1, "\ T (timpul)" print #1, "color red;backcolor darkred" for I=1 to 5 print #1, "down; place "+str$(11+T(I))+" "+str$(300-D(I)*100) print #1, "circlefilled 6 " next I print #1, " flush" WindowHeight= 420 UpperLeftX=550 UpperleftY=-100
open "Reprezentarea Experimental-Calculat" for graphics as #2 print #2, "fill blue"
360 ALM = 1 ' Parametrul Levenberg-Marquart. 370 V(1) = 20' Valorile initiale ale parametrilor. 380 V(2) = 0.5 390 V(3) = 0.5 400 EPS = REPS^0.5 '---Constanta folosita la deriv. numerica. 480 '------------------ INITIALIZARE --------------- 490 ' 500 FOR I = 1 TO NPAR ' Incepe initializarea vect. de lucru. 510 W(I) = V(I) 520 NEXT I 530 GOSUB 2180 ' Calculul valorii functiei cu param. initiali. 540 FF = F 550 ' 560 '---------------- INCEPUTUL PROCESULUI ITERATIV --------- 570 ' 580 FOR I = 1 TO NPAR 'Afisaj val. corectiilor la param. calc. 590 PRINT I;" ";V(I) 600 NEXT I 610 ' 620 '======== CONSTRUIREA SISTEMULUI LINIAR DE ECUATII ======= 630 ' 640 FOR I = 1 TO NPAR' Init. mat. Hessian si a term. liberi. 650 FOR J = I TO NPAR 660 A(I, J) = 0 670 A(J, I) = 0 680 NEXT J 690 W(I) = V(I)' Actualizarea vectorului de lucru. 700 B(I) = 0 710 NEXT I 720 ' 730 '------ Calculul derivatelor numerice in fiecare punct ---- 740 ' 750 FOR IP = 1 TO NPCT 760 F1 = V(1) * (1 - V(2) * EXP(-1*V(3)*T(IP)))' Referinta 770 ' pentru calculul derivatei numerice. 780 DIF = D(IP) - F1 790 FOR I = 1 TO NPAR ' Calculul comp. grad. in punctul IP. 800 AA = ABS(V(I)) 810 IF AA>0.1 THEN PAS=EPS*AA ELSE PAS=0.1*EPS' Scalarea pasului in deriv.num. 830 W(I) = V(I) + PAS ' Pasul in derivata numerica. 840 F2 = W(1) * (1 - W(2) * EXP(-1*W(3)*T(IP))) 850 G(I) = (F2 -1*F1) / PAS ' Componenta gradientului. 860 W(I) = V(I) ' Refacerea vectorului de lucru. 870 NEXT I 880 ' 890 '- Calculul matricii Hessian, A si al term. liberi, B --- 900 ' 910 FOR I = 1 TO NPAR 920 FOR J = I + 1 TO NPAR 930 A(I, J) = A(I, J) + G(I) * G(J)'Elem. matr. 940 A(J, I) = A(I, J) ' Hessian, simetrica. 950 NEXT J 960 A(I, I) = A(I, I) + G(I) * G(I) 970 B(I) = B(I) + DIF * G(I) ' Termenii liberi. 980 NEXT I 990 NEXT IP 1000 IFN = IFN + (NPAR * NPAR + NPAR) / 2 1010 GOSUB 2310 ' Rez. sist. liniar de ecuatii A(,)*X()=B(). 1020 ' 1030 '================= AJUSTAREA PASULUI ==================== 1040 ' 1050 IF INEF > 6 OR IFN > MAXFN THEN 1840 1060 ALFA = 1 ' Incercarea cu un pas cit mai mare 1070 GOSUB 3070 1080 F2 = F 1090 IF F2 < FF THEN AL = ALFA: FF = F2: GOTO 1290 1100 ALFA = 0.5 ' Incercarea cu jumatatea pasului maxim 1110 GOSUB 3070 1120 F1 = F 1130 IF F1 < FF THEN AL = ALFA: FF = F1: GOTO 1290 1140 'Ajustarea pasului cu o parabola prin abscisele ALFA=0,0.5,1. 1150 ALFA = (3*FF-4*F1+F2)/(FF-F1-F1+F2)/4 1160 GOSUB 3070 1170 IF F < FF THEN AL = ALFA: FF = F: GOTO 1290 1180 ' 1190 '---------- Decizie pentru cautarea ineficienta ------- 1200 ' 1210 IF FF > F1 AND FF > F2 THEN 1270 1220 ALM = ALM * 1.1 ' Marim val. param. Levenberg-Marquart. 1230 INEF = INEF + 1 1240 GOSUB 2110 ' Schimbam semnul si marimea corectiilor X(). 1250 GOTO 1050 'Reluam cautarea unui progres cu aceste cor. 1260 ' 1270 ' ========= P R O G R E S I N C A U T A R E ======== 1280 ' 1290 ITN = ITN + 1 1300 ALM = ALM / 5 ' Param. Levenberg-Marquart este micsorat. 1310 INEF = 0 1315 PRINT "I v vechi() v nou() " 1320 FOR I = 1 TO NPAR 1330 W(I) = V(I) + AL * X(I) 1360 print I;" "; V(I);" "; W(I) 1370 NEXT I 1380 PRINT " alfa= "; AL; 1390 PRINT " Parametrul Levenberg-Marquart= "; ALM 1400 PRINT " itn= "; ITN; 1410 PRINT " rez= "; FF 1420 NQ = 0' Test pentru cifrele semnif. in param. calculati. 1430 FOR I = 1 TO NPAR 1440 IF ABS(V(I) / W(I) - 1) < PREC THEN NQ = NQ + 1 1450 NEXT I 1460 IF NQ = NPAR AND ITN > 2 THEN 1840 1470 ' 1480 '=========== CAUTAREA DE-A LUNGUL GRADIENTULUI ========== 1580 PRINT "Kantorovici "; KO 1590 FOR I = 1 TO NPAR 1600 VT(I) = W(I) 1610 W(I) = W(I) + X(I) * AL / 2 1620 NEXT I 1630 KO = KO + 1 1640 GOSUB 2180 1645 1650 IF F < FF AND KO<10 THEN FF = F: GOTO 1290 1660 ' 1670 '============== ACTUALIZAREA PARAMETRILOR OPTIMI ========= 1680 ' 1690 GOSUB 3190 1700 FOR I = 1 TO NPAR 1710 V(I) = VT(I) 1720 NEXT I 1730 GOSUB 3310 1750 KO = 0 1760 INEF = 0 1780 GOTO 550'================ RELUAREA CAUTARII 1800 '================ SFIRSITUL CAUTARII ================ 1820 GOSUB 3130 ' Actualizarea param. optimi pt. raportul final. 1830 IFIN = 1 1840 REM notice "TERMINAT" 1890 IF NQ <> NPAR THEN 1940 1900 A$ = "TERMINATIE NORMALA." 1910 A$ = A$ + " S-AU OBTINUT ";NSIG;" CIFRE SEMNIF. IN ";ITN;" ITERATII" 1920 GOSUB 3310 1930 print A$: GOTO 1990 1940 A$ = "TERMINATIE ANORMALA. -> " 1950 B$ = "Datorata cautarii ineficiente" 1960 C$ = " S-a depasit nr. maxim de eval. ale fct." 1970 IF INEF > 0 THEN PRINT A$ + B$: GOTO 1990 1980 IF IFN > MAXFN THEN PRINT A$ + C$ 1990 FOR I = 1 TO NPAR 2010 PRINT "Parametrul "; I;"= ";V(I) 2020 NEXT I 2030 GOSUB 3470 'NOTICE "TERMINAT" INPUT R$
CLOSE #2 CLOSE #1
2040 END 2060 '* SFIRSITUL PROGRAMULUI PRINCIPAL * 2080 ' 2090 '== SUB. PT. SCHIMBAREA SEMNULUI IN CAZUL CAUTARII INEF. == 2110 FOR I = 1 TO NPAR 2120 X(I) = -1*X(I) / 5 2130 NEXT I 2140 RETURN 2150 ' 2160 '==== SUBRUTINA PENTRU CALCULUL FUNCTIONALEI C.M.M.P. === 2170 ' 2180 IFN = IFN + 1 2190 F = 0 2210 FOR I = 1 TO NPCT 2220 AUX = W(1) * (1 - W(2) * EXP(-1*W(3) * T(I))) 2230 AUX = D(I) - AUX 2240 F = F + AUX * AUX 2250 NEXT I 2260 RETURN 2270 ' 2280 '=== SUBRUTINA PENTRU REZOLVAREA SISTEMULUI LINIAR === 2290 ' 2300 ' Procedeul este eliminarea Gaussiana cu pivotare partiala 2310 ' 2320 FOR I = 1 TO NPAR' Initializare 2330 A(I, I) = A(I, I) + ALM' Parametrul L-M este adaugat 2340 ' pe diagonala principala. 2360 NEXT I 2370 FOR K = 1 TO NPAR - 1' Contorizarea eliminarilor. 2380 ' 2390 '--------------- Cautarea liniei pivot --------------- 2400 ' 2410 L = K 2420 I = K 2430 I = I + 1 2440 IF ABS(A(I, K)) > ABS(A(L, K)) THEN L = I 2450 IF I < NPAR - 1 THEN 2430 2460 IF L = K THEN 2590 2470 FOR J = K TO NPAR 2480 T = A(K, J) 2490 A(K, J) = A(L, J) 2500 A(L, J) = T 2510 NEXT J 2520 T = B(K): B(K) = B(L): B(L) = T 2570 '----------- Triunghiularizarea metricii A --------- 2590 FOR I = K + 1 TO NPAR 2600 T = A(I, K) / A(K, K) 2610 A(I, K) = T ' Detaliile transformarii sunt 2620 ' salvate sub diagonala mat. Hessian. 2630 FOR J = K + 1 TO NPAR 2640 A(I, J) = A(I, J) - T * A(K, J) 2650 NEXT J 2660 B(I) = B(I) - T * B(K) 2670 NEXT I 2680 NEXT K 2700 '------- Construirea solutiilor sistemului liniar ------ 2720 X(NPAR) = B(NPAR) / A(NPAR, NPAR) 2730 FOR I = NPAR - 1 TO 1 STEP -1 2740 S = 0 2750 FOR J = I + 1 TO NPAR 2760 S = S + A(I, J) * X(J) 2770 NEXT J 2780 X(I) = (B(I) - S) / A(I, I) 2790 NEXT I 2800 RETURN 3050 '== SUB. PT. INCERCAREA PASILOR IN OPTIMIZAREA PARAM. ==== 3070 FOR I = 1 TO NPAR 3080 W(I) = V(I) + ALFA * X(I) 3090 NEXT I 3100 GOSUB 2180 3110 RETURN 3130 '===== SUBRUTINA PENTRU CONSTRUIREA VECTORULUI DE LUCRU CU 3140 ' VALOAREA FINALA A PASULUI ================= 3150 FOR I = 1 TO NPAR 3160 W(I) = V(I) + AL * X(I) 3170 NEXT I 3180 RETURN 3190 REM 3200 '====== PROCEDURA GRAFICA PENTRU STERGEREA PUNCTELOR === 3220 return
3310 '====== SUBRUTINA PENTRU REPREZENTAREA GRAFICA EXPERIMENTAL-CALCULAT =====
print #2,"cls" print #2, "fill green;up;goto ";18;" ";31 print #2, "color darkred;backcolor green;\Experimental" print #2, "goto ";11;" ";11; print #2,"down;box 311 311;up;goto 11 311;down; line 11 311 311 11" print #2, "up; goto ";201;" ";295 print #2, "\ Calculat" print #2, "up; goto ";50;" ";95 print #2, "backcolor yellow" REM print #2,"\Iteratia "+str$(ITN) print #2, "up; goto ";185;" ";200 REM print #2,"\Reziduu ="+str$(int(F0*10000)/100) print #2, "flush"
for I=1 to NPCT xx=V(1)*(1-V(2)*exp(-1*V(3)*T(I))) y.p=11+D(I)*10 x.p=311-xx*10 print #2, "up;goto "+str$(x.p)+" "+str$(y.p) print #2,"down;color blue;backcolor red;circlefilled 5" next I 3460 RETURN 3470 ' 3480 '====== SUBRUTINA PENTRU REPREZENTAREA GRAFICA FINALA ===== 3490 '
print #1, "fill yellow;color darkblue" print #1, "goto ";11;" ";21 print #1, "backcolor yellow;\D (dimensiunea de graunte)" print #1, "down; goto ";11;" ";300 print #1, "goto ";311;" ";300 print #1, "\ T (timpul)" print #1, "color red;backcolor blue" for I=1 to 5 print #1, "down; place "+str$(11+T(I))+" "+str$(300-D(I)*10) print #1, "circlefilled 6 " next I print #1, "color black; size 2" xx=V(1)*(1-1*V(2)) print #1, "up; place "+str$(11)+" "+str$(300-xx*10) for tt=0 to 300 xx=V(1)*(1-V(2)*exp(-1*V(3)*tt)) print #1, "down; goto "+str$(tt+11)+" "+str$(300-xx*10) next tt
print #1, " flush"
3710 RETURN
|
Prof.Dr. D. Ciurchea
|
 |
|
| |
Topic  |
|
|
|