Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Cap. 1 Introducere
1.1 SCURT ISTORIC AL DEZVOLTRII CALCULATOARELOR
Preocuprile de a construi dispozitive capabile s efectueze calcule i a cror
funcionare s poat fi dirijate conform unor reguli flexibile (programe) sunt destul de vechi.
n continuare prezentm cteva jaloane ale dezvoltrii acestora.
n 1864, la vrsta de 19 ani, Blaise Pascal inventeaz o main mecanic de calculat,
mbuntit de G. W. Leibnitz. Mainile acestea lucrau n sistemul zecimal, folosind roi
dinate cu 10 dini angrenate n diferite moduri. Comanda mainilor era asigurat manual.
Pe linia dirijrii flexibile a funcionrii unei maini se nscrie realizarea lui
J.M.Jackuard(1804): rzboaiele de esut, ce utilizau benzi de hrtie perforat.
Spre mijlocul secolului XIX, matematicianul englez Ch. Babbage, asistat de Ada de
Lavelace, fiica poetului Byron, elaboreaz proiectul unei maini analitice. Gndit a fi
realizat cu mijloace mecanice, aceast main const dintr-o magazie pentru depozitarea
datelor, o moar n care se efectueaz calcule comandate prin benzi de tip Jackuard,
dispozitive pentru intrarea datelor i respectiv extragerea rezultatelor.
n ultimul deceniu al secolului al XIX - lea, Herman Hleritz creeaz, pentru
prelucrarea datelor unui recensmnt din SUA, maini electromecanice cu cartele perforate
care pot efectua o serie de calcule asupra datelor coninute pe cartele pe baza unui
program specificat prin cablaje dinainte pregtite pe un panou.
Dei nc de la nceputul secolului XX sunt cunoscute tuburile electronice, primul
calculator modern pus n funciune de Universitatea Harvard de o echip condus de H.
Aikinn n anul 1944 este realizat cu relee electromagnetice (calculatorul Mark-1). Primul
calculator cu tuburi electronice ENIAC este pus n funciune la Universitatea Pennsylvania n
1946 de I. N. Mauchley i I.P.Eckert.
Tot n 1946 sunt enunate de ctre John von Neumann principiile folosite nc i astzi
n construcia calculatoarelor. Pe lng utilizarea sistemului binar, pentru reprezentarea
informaiilor, este propus utilizarea programelor memorate n locul celor cablate. Printre
primele calculatoare construite conform acestor principii se numr EDSAC la Universitatea
Cambridge (Anglia) n 1949, UNIVAC-1 fabricat de firma Sperry Rand n 1951, EDVAC la
Universitatea Pennsylvania in 1952.
n continuare evoluia constructiv a calculatoarelor este strns legat de dezvoltarea
tehnologiei electronice. Simultan se dezvolt limbajele de programare, sistemul de operare,
se diversific domeniile n care calculatoarele i gsesc aplicaii.
Perioada
1946-1956
1957-1963
II
I 1964-1981
II
I 1982-1989
V
V Din 1990
Principala
tehnologie
hard
Tuburi
electronice
Tranzistori
Alte
tehnologii
hard
Tambur
magnetic
Memorii
din ferit
Limbaje
De
asamblare
De
nivel
nalt
FORTRAN
COBOL
Circuite
Memorii
De nivel
integrate
semicond.
f.nalt
disc magn. PASCAL
LISP
limbaje
grafice
Circuite
Memorii cu De
nivel
integrate pe bule
foarte nalt
scar larg i magnetice
ADA
foarte larg
Discuri
limbaje
optice
orientate
obiect
Circuite
Arhitecturi
Limbaje
integrate pe paralele
concurente
scar extrem
Limbaj
de
larg
natural
(inclusiv
Progr.
tridimensional
funcional
e)
Alte
proprieti
MI=2KO
V=10KIPS
MI=32KO
V=200KIPS
MI= 2 MO
V= 5MIPS
MI=8mo
V=30MIPS
V=100GIPS
Vedere
artificial
Tehnologia
vorbirii
Programe
+ date
Unitatea de
introducere
Memoria
intern
Unitatea de
extragere
Rezultate
UAL
UC
Unitatea central
de prelucrare
numere ncepnd de la zero. Adesea octeii se grupeaz n cuvinte de 2 sau 4 octei. Se mai
ntlnete de asemenea noiunea de dublu cuvnt (sau chiar de cuvnt cuadruplu).
Principalele caracteristici ale memoriei sunt capacitatea i timpul de acces. Capacitatea se
exprim n Kb,Mb sau Gb (1Kb =2 10bytes). Timpul de acces este de ordinul nonosecundelor.
n majoritatea calculatoarelor exist dou tipuri de memorie intern:
a) memorie n care informaiile pot fi alterate sau memorie cu citire/scriere, notate
frecvent cu prescurtarea RAM (Random Access Memory = memorie cu acces aleatoriu);
b) memorie cu informaii nealterabile, numite ROM (Read Only Memory = memorie
exclusiv pentru citire).
Unitatea aritmetic i logic (UAL) realizeaz prelucrarea propriuzis a informaiilor,
prin efectuarea de operaii aritmetice i logice asupra reprezentrilor interne ale informaiei.
Componentele principale ale unui UAL sunt:
a) un set de registre, elemente de memorie rapid, folosite pentru a pstra operaii i
rezultatele operaiilor. Registrele pot fi ncrcate cu informaii din memoria intern, iar
coninutul lor poate fi depus n memoria intern;
b) circuite logice prin care se realizeaz transformarea coninutului registrelor (adesea
acestea sunt desemnate ca UAL propriuzis);
c) magistrale de informaie, prin care se asigur circulaia informaiei n cadrul UAL i
legtura cu exteriorul (n primul rnd cu memoria intern).
UAL mai complexe asigur i efectuarea operaiilor de nmulire i mprire,
complementarea coninutului unui registru, efectuarea operaiilor logice ntre cifrele binare ale
aceluiai rang din dou registre, tergerea coninutului unui registru, compararea coninutului
a dou registre,etc.
n concluzie, UAL realizeaz cele mai simple operaii aritmetice i logice, pentru
operaiile mai complexe trebuind s se recurg la algoritmi care conin operaiile simple.
Unitatea de comand UC formeaz mpreun cu unitatea aritmetic i logic
subansamblul numit unitatea central de prelucrare (UCP) din structura unui calculator. n
cazul microprocesoarelor, UCP apare adesea ca un singur circuit integrat.
Rolul principal al UC este extragerea din memoria intern a instruciunilor consecutive
ale unui program, interpretarea (decodificarea) acestora i elaborarea semnalelor de
comand necesare pentru dirijarea funcionrii tuturor subansamblelor calculatorului.
Fiecare UC este proiectat astfel nct s recunoasc un anumit repertoriu de
instruciuni (lista de instruciuni a calculatorului). O instruciune apare ca o configuraie de
cifre binare (de regul cu lungimea de un cuvnt de memorie). Instruciunile recunoscute de
o UC pot fi clasificate n urmtoarele grupe:
a) transferuri de date (ntre registre cu memoria intern; cu echipamentele periferice:
introducere, extragere, memorie extern)
b) operaii aritmetice i logice;
c) instruciuni de control (salturi condiionate i necondiionate, oprirea execuiei
programului, etc).
Lista de instruciuni precizeaz limbajul mainilor sau codul main al unui calculator.
Memoria extern servete pentru nmagazinarea unor cantiti mai mari de informaie.
Unitatea central nu are acces direct la memoria extern, servindu-se de memoria intern ca
intermediar.
n momentul de fa un calculator compatibil IBM-PC are n structura sa urmtoarele
componente (vzute ca memoria extern): hard disk, floppydisk; unitatea de band, unitatea
CD-ROM.
Hard disk-ul (HDD) discul dur - are uzual capacitatea de memorare cuprinse ntre
40Mb i 2400 Mb (2;4Gb). Acest disk este vzut de calculater ca unitate C (D,E....).
8
10
Cap2.
SISTEME DE NUMERAIE
(1) Np = [ ]anan-1....a1a0 ,
iar pentru numerele care au att parte ntreag, ct i parte fracionar, reprezentarea
poziional este de forma:
(2) Xp =[ ]anan-1....a1a0 ,a-1 a-2 a-3...a-m
unde ai sunt cifre n baza bi i=m,n .
2.3. Reprezentarea algebric a unui numr n baza b
Orice numr care are o reprezentare poziional de forma (1) are reprezentarea
algebric de forma:
(1) Na = [ ] (anbn +an-1 bn-1 +...a1b1+a0b0)
iar numerele a cror reprezentare poziional este de forma (2) au reprezentarea algebric
de forma:
(2) Xa=[ ] (anbn +an-1 bn-1 +...a1b1+a0b0+a-1 b-1+...+a-m b-m)
unde ai sunt cifre n baza bi i=m,n .
Exemplu: Dac n sistemul de numeraie zecimal considerm numerele N=54678 i X=87579,45, acestea se afl n reprezentare poziional, iar reprezentarea algebric a acestor
numere este:
Na = 5 104+4 103+6 102+7101+8 100
respectiv:
Xa = -(8104+7103+5102+7101+9100+410-1+510-2 )
Comentariu:
11
Cea mai simpl generalizare a sistemului de numeraie zecimal se obine cnd facem
ca baza s fie orice numr ntreg mai mare ca 1, iar cifrele s fie cuprinse ntre 0 i (b-1)
inclusiv.
Pentru sistemele de numeraie a cror baz este mai mic dect 10, avem suficiente
simboluri cu care s reprezentm cifrele (simbolurile din sistemul de numeraie zecimal), iar
pentru sistemele de numeraie cu baza mai mare dect 10 trebuie s introducem simboluri
noi, cu care s codificm cifrele mai mari dect 9, pentru a evita unele situaii confuze. n
acest sens se recurge la literele alfabetului latin, A,B,C,D,E,F,G,..., care corespund n ordine
cifrelor 10,11,12,13,14,15,16,... . Deoarece dup scriere nu se poate afirma n mod unic n
ce baz este scris un numr, se va scrie baza ca indice.
Dezvoltarea istoric a reprezentrii numerelor este o poveste fascinant, deoarece ea
merge n paralel cu nsi dezvoltarea civilizaiei. Principalele momente se gsesc expuse n
[9]. O mare parte a istoriei recente privind sistemele de numeraie, este legat de dezvoltarea
mainilor de calcul. Pentru construcia calculatoarelor se folosesc elemente electronice cu
dou stri stabile, stri crora le asociem valorile 0 i 1, motiv pentru care la baza funcionrii
majoritii calculatoarelor st sistemul de numeraie binar (b=2).
n colaborarea omului cu calculatorul, se dovedesc a fi instrumente intermediare
extrem de utile sistemul de numeraie octal (b=8) i sistemul de numeraie hexazecimal
(b=16), deoarece permit utilizarea unui numr mai mic de semne pentru simbolizarea unei
informaii i pentru c exist reguli simple de trecere din binar n octal sau hexazecimal, dar
i invers.
Procedeul de trecere a unui numr dintr-un sistem de numeraie n altul poart numele
de conversie i se face n conformitate cu anumii algoritmi. Precizm c dac numrul k este
negativ se face conversia valorii absolute, iar n faa rezultatului obinut se pune semnul (minus), fapt pentru care, n cele ce urmeaz, vom trece n revist modul n care se face
conversia numerelor pozitive.
2.4. Conversia numerelor ntregi din baza 10 n baza b
Fie x Z+. Dac x<b, atunci x10 = xb, iar dac x b, trecerea de la baza 10 la baza b
se face astfel:
Conform teoremei mpririi cu rest a numerelor ntregi, putem scrie irul de egaliti:
x=bq0+r0
0r0<b
qo=bq1+r1
0r1<b
...
...
qk-1=bqk+rk 0rk<b
oprindu-ne la acel k pentru care qk=0. n acest caz avem:
x10=(rkrk-1......r1r0)b.
Problem. S se converteasc numrul x=843 din baza 10 n bazele 2,8 i 16.
Soluie. Vom avea:
a)b=2 843=2 421+1
b) b=8. 843=8105+3
i deci:
421=2 210+1
105=813+1
105+0
13=81+5 84310=
15138
105=252+1
1=80+1
52=226+0
26=213+0
c) b=16. 843=1652+11
13=26+1
52=163+4
6=23+0
3=160+3
3=21+1
1=20+1
11010010112
34B16
210=2
Fie y (0,1). Conversia lui y din baza 10 n baza b se face prin nmuliri succesive cu
baza, separnd partea ntreag rezultat, dup cum urmeaz:
yb= r-1+y1
0r-1<b
;y1(0,1)
y1b= r-2+y2
0r-2<b
;y2(0,1)
...
...
...
...
ym-1b= r-m+ym
0r-m<b
;ym(0,1)
Procedeul acesta are n general un numr infinit de pai, totui n practic se face
conversia lund n considerare un numr finit de pai, n funcie de precizia aleas. Dac ne
vom limita la m cifre la partea zecimal, avem:
y10= (0,r-1,r-2,....r-m)b.
Problem. S se converteasc numrul y=0,273 din baza 10 n bazele 2, 8, respectiv
16.
Soluie. Vom avea:
a) b=2. 0,2732= 0,546 b) b=8. 0,2738= 2,184 i deci:
0,5462=
1,092
0,1848= 1,472
0,0922=
0,184
0,4728= 3,776
0,1842=
0,368
0,7768= 6,208
0,0100010112
0,3682=
0,736
0,273 10= 0,21368
0,7362=
1,472 c) c=16. 0,27316= 0,368
0,45E16
0,4722=
0,944
0,36816= 5,888
0,9442=
1,888
0,88816= 14,208
0,8882=
1,776
2.6. Conversia numerelor reale din baza 10 n baza b
Fie zR+. Numrul z se poate exprima n mod unic sub forma : z=[z]+{z},unde prin
[z]i {z} am exprimat partea ntreag i, respectiv, partea fracionar a numrului z. Pentru
a realiza conversia lui z din baza 10 n baza b se parcurg urmtoarele etape:
I) -se face conversia prii ntregi;
II) -se face conversia prii fracionare;
III) -se concateneaz cele dou rezultate, plasnd virgula ntre ultima cifr rezultat n
urma conversiei prii ntregi i prima cifr rezultat n urma conversiei prii fracionare.
Dac, de exemplu, [z]=x i{z}=y, unde x i y admit reprezentrile din paragrafele
precedente, atunci:
z10=(rkrk-1...r1r0,r-1r-2...r-m)b
Observaie. Se constat c n urma conversiei din baza 10 n baza b se obine
reprezentarea poziional n baza b.
Problem. S se converteasc numrul z=843,273 din baza 10 n fiecare din bazele
2, 8 i 16.
Soluie. Folosindu-ne de rezultatele din problemele precedente,
1101001011,0100010112
843,27310= 1513,21368
34B,45E16
2.7. Conversia numerelor reale din baza b n baza 10
Pentru a realiza conversia unui numr real din baza 10,se procedeaz astfel:
I) - se trece de la reprezentarea poziional a numrului n baza b la reprezentarea
algebric n baza b;
13
II) - se exprim cifrele nimrului i exponenii care apar n reprezentarea algebric prin
cifre sau numere n baza 10;
III) - se efectueaz calculele n baza 10 i se obine tocmai reprezentarea poziional
a numrului n baza 10.
Problem.S se converteasc n baza 10 numerele:
a) n1=1101001011,0100010112
b) n2=1513,21368
c) n3=24B,45E16
Soluie. Vom avea:
9
n1 1 2
a) 1 2
0
8
1 2
1 2
02
1 2
1
9
02
1 2
1 2
02
02
02
02
512 256 64 8 2 1
02
1 2
1 2
58
512 320 8 3
1 8
38
2 8
1 8
02
6
1 2
1 2
7
1 1
1
1
.
4 64 256 512
38
68
2 1
3
6
.
8 64 512 4096
4 16
768 64 11
B 16
4 16
5 16
E 16
4
5
14
16 256 4096
316=00112
B16=10112
416=01002
C16=11002
516=01012
D16=11012
616=01102
E16=11102
716=01112
F16=11112
n acest caz conversia se face la fel ca n cazul precedent, cu precizarea c se vor lua
n considerare grupe de cte 4 cifre.
Problem. S se converteasc numrul x=1101001011,010001011 din baza 2 n baza
16.
Soluie. x=0011 0100 1011,0100 0101 11002 = 34B,45C16.
Problem. S se converteasc numrul x= 34B,45E din baza 16 n baza 2.
Soluie. x=0011 0100 1011,0100 0101 11002, adic:
34B,45C16 =1101001011,0100010111102.
b) Conversiile binarhexazecimal se fac innd cont c:
016=00002
816=10002
116=00012
916=10012
216=00102
A16=10102
316=00112
B16=10112
416=01002
C16=11002
516=01012
D16=11012
616=01102
E16=11102
716=01112
F16=11112
n acest caz conversia se face la fel ca n cazul precedent cu precizarea c se vor lua
n considerare grupe de cte 4 cifre.
Problem. S se converteasc numrul x=1101001011,010001011 din baza 2 n baza
16.
Soluie. x=0011 0100 1011,0100 0101 11002=34B,45C16 .
Problem. S se converteasc numrul x = 34B,45E din baza 16 n baza 2.
Soluie. x = 0011 0100 1011,0100 0101 11002 , adic:
34B,45E16=001101001011,0100010111002 .
15
+
0
1
2
3
4
5
6
7
*
0
1
2
3
4
5
6
7
0
1
1
1
0
10
1
0
1
2
3
4
5
6
7
2
0
2
4
6
10
12
14
16
*
0
1
0
0
0
1
0
1
3
3
4
5
6
7
10
11
12
4
4
5
6
7
10
11
12
13
5
5
6
7
10
11
12
13
14
6
6
7
10
11
12
13
14
15
7
7
10
11
12
13
14
15
16
3
0
3
6
11
14
17
22
24
4
0
4
10
14
20
24
40
34
5
0
5
12
17
24
31
36
43
6
0
6
14
22
30
36
44
52
7
0
7
16
25
34
43
52
61
16
11101
1011
1011
1110
1011
10,101
1100
1011
10011,1111
1
i deci xy=10011,11112, iar xy=10,1012
2.10. Codificarea informaiilor
Elementele electronice care stau la baza construciei calculatoarelor au un numr finit
de stri stabile. Notndu-se cu b numrul strilor, informaiile se pot reprezenta ca numere
scrise n baza b. n unele cazuri, informaia, care este de fapt un numr scris n baza b, poate
reprezenta i altceva dect numere.
Fie, de exemplu, tabela de coresponden:
00
A
01
B
10
C
o liter fiind codificat cu dou cifre.
S presupunem c dispunem de 8 beculee, marcate cu ptrele puse n linie, i c
unele dintre ele pot fi aprinse (starea 1), iar altele stinse (starea 0). Dac avem, de exemplu,
configuraia:
00010010
prin decodificare, conform tabelei menionate, obinem ABAC, iar dac vom avea
configuraia:
00100011
nu am ti s-o decodificm, deoarece n tabel nu se precizeaz crui caracter i corespunde
combinaia de cifre 11.
17
b1b2b3b6b4b9=s1
b5b3b2b1=s2
...
b1b1b1b1=s2
X1
b6
b5
b4
b3
b2
b1
b0
bitul cel mai puin
semnificativ
b6
b5
...
b1
b0
b22
b21
...
b16
b15
...
b9
b8
b7
...
b1
b0
mari i mici ale alfabetului latin, 10 simboluri pentru cifrele sistemului de numeraie zecimal i
26 de simboluri corespunztoare caracterelor speciale (+,-,*, /,=,<,>,etc.).
Deoarece cu ajutorul cuvintelor de cod formate din n bii se pot codifica 2 n simboluri,
deducem c pentru codificarea acestor caractere sunt necesare cuvinte de cod a cror
lungime trebuie s fie de cel puin 7 bii, pentru c:
64=26<88<27=128.
Deoarece unitatea constructiv de memorie i de msur a memoriei unui calculator
este octetul, n care se pot nregistra 8 bii, fiecare caracter alfanumeric se codific prin 8 bii
i deci se pot codifica de fapt 256 de caractere (cele cu codurile mai mari de 128 se numesc
caractere speciale).
Cele mai utilizate coduri sunt ASCII i EBCDIC. De exemplu, codul ASCII al
caracterului A este 65 i deci octetul n care se nregistreaz acest caracter are valoarea
binar 01000001.
Trebuie precizat c nici un calculator nu face distincie ntre codul unui numr i codul
unui caracter, sarcina revenind programatorului.
2.11. Probleme propuse
Problema 1. S se alctuiasc tabla adunrii i tabla nmulirii n baza 16.
Problema 2. S se alctuiasc tabla adunrii i tabla nmulirii n baza b, pentru
b3,4,5,6,7,8,9.
Problema 3. Se dau numerele : x=1994, 199 i y=579,436. Se cere s se
converteasc n octal i hexazecimal i apoi, n fiecare baz, s se calculeze: x+y,x-y,xy,xy.
Rezultatele obinute s se converteasc n baza 10 i s se verifice corectitudinea calculelor
efectuate.
Problema 4. Se dau numerele a=257,1875 i b=63,25. Se cere s se converteasc n
baza b, b3,4,5,6,7, i apoi, n fiecare baz , s se calculeze: a+b, a-b, ab, ab.
20
Cap. 3. Algoritmi
3.1. Noiuni din teoria algoritmilor
n cele ce urmeaz ne vom limita la introducerea intuitiv, practic a noiunii de
algoritm. O definiie riguroas, matematic, presupune alte noiuni a cror prezentare ar
ngreuna expunerea i ne-ar abate de la scopul urmrit n acest capitol.
Astfel prin algoritm vom nelege un sistem de reguli conform crora o informaie
iniial este transformat ntr-o informaie final trecnd printr-un numr finit de transformri
intermediare. Ca exemple binecunoscute de algoritmi putem aminti:
- algoritmul lui Euclid, pentru calculul c.m.m.d.c. a dou numere ntregi;
- ciurul lui Euratostene pentru determinarea numerelor prime;
- regula lui Cramer pentru rezolvarea unor ecuaii liniare,etc.
Dup cum rezult uor, din exemplele amintite, un algoritm, nu este aplicabil pentru
orice informaie iniial. Astfel algoritmul lui Euclid este aplicabil numai pentru perechi de
numere ntregi.
O informaie iniial pentru care un algoritm dat este aplicabil, se va numi informaie
admisibil algoritmului respectiv. Totalitatea informaiilor admisibile unui algoritm se va
denumi domeniul algoritmului. De exemplu, domeniul algoritmului lui Euclid este mulimea
perechilor de numere ntregi. Determinarea domeniului unui algoritm este, n general o
problem dificil. Astfel, este foarte greu de spus dac unui, sistem de n ecuaii liniare cu n
necunoscute i se poate aplica regula lui Cramer nainte de a se calcula determinantul
matricei sistemului. Cum calculul acestui determinant face parte din algoritm, rezult c n
momentul n care ncepe aplicarea algoritmului nu se tie dac informaia iniial face sau nu
parte din domeniul algoritmului. Dac n urma calculului determinantului se constat c
acesta este nul, algoritmul nu mai poate fi continuat. Dac prin D A se noteaz domeniul
algoritmului A, atunci oricare ar fi funcia A DA ei i corespunde o informaie final, obinut
prin aplicarea transformrilor descrise de algoritmul A. Ca urmare un algoritm A poate fi
definit ca o funcie:
A: DA FA
21
ntr-o prim faz se testeaz condiia ; dac este adevrat se execut secvena. Cnd
condiia este fals se execut instruciunea imediat urmtoare secvenei.
Exemplu: Calculai suma primelor n numere naturale:
Start
Citete n
Atribuie s 0
Atribuie I 1
Ct timp I n execut
Atribuie S S+I
Atribuie I I+ 1
Scrie S=; S
Stop
24
ntr-o prim faz se repet secvena . n continuare se tasteaz condiia, dac aceasta
este ndeplinit se repet din nou secvena pn cnd condiia nu mai este ndeplinit.
Exemplu Scriei pseudocodul pentru calculul produsului primelor N numere naturale.
Start
Citete n
Atribuie I 1
Atribuie P 1
Repet PP+I
Atribuie P P*1
Atribuie I P*1
Pn cnd I n
Scrie P = ;P
Structura cu variabile contor
Pentru Vc=Vi,Vf,P execut
secvena
unde
- Vc = variabila contor
- Vi = valoarea iniial a variabilei contor
- Vf = valoarea final a variabilei contor
- P = pasul cu care se modific variabila contor
ntr-o prim faz Vc=Vi se execut secvena dup care V c=Vc + p. n continuare se
compar Vc cu Vf dac VcVf atunci se repet secvena .a.m.d. Dac V cVf atunci se
continu cu instruciunea imediat urmtoare structurii. Aceast structur poate fi imbricat;
situaia n care se execut prima dat ultima structur .a.m.d.
Dac pasul p lipsete se consider c are valoarea 1.
Exemplu: Iniializai un vector A(50)
Start
Declar A(50)
Pentru I = 1,50
Atribuie A(I) 0
25
26
EDIT
VIEW
SEARCH
RUN
DEBUG
OPTION
File (comenzi
pentru fiiere)
New
Open
Save
Save As
Print
Exit
Fiecare dintre aceste comenzi sunt apelate cu ajutorul tastelor: ALT+ prima liter din
comand . Dac acionm ALT+F obinem :
Unde :
New este utilizat pentru creerea
unui nou program. Dac programul exist el
este deschis. Urmeaz un dialog care
permite
:
Yes salvarea programului existent;
No nu salveaz programul existent;
Cancel se ntoarce din programul existent i
revine la o nou comand.
27
Open: este utilizat pentru ncrcarea n memorie a programului existent n vederea lansrii n
execuie sau pentru al modifica.
Save: este utilizat pentru a salva programul
Save As: este identic cu SAVE dar permite modificarea numelui programului salvat
Print: permite tiprirea programului
Exit: ieirea din QBASIC
Edit (comenzi de
editare)
Cut
Copy
Paste
Clear
New Sub
New Function
Unde:
Cut - permite a muta textul selectat n Clipboard.
Selectarea textului se face plasnd cursorul la nceputul
textului i innd apsat Shift + sgeata dorit. Dac se apas
tasta Del se va terge textul selectat.
cu linie
Trace On
Togg Breakpoint
Set Next Statement
xc =
x
dac x0
0
dacx=0
16
2 +x
dac x0
unde x este ntregul a crui reprezentare se caut, iar x c este reprezentarea n cod
complementar. Dac prima cifr din reprezentarea n cod complementar este 1, numrul x
este negativ, fiind adevrat i reciproca.
Constantele de tip octal sunt numere ntregi scrise n sistemul de numeraie octal
(sistemul de numeraie cu baza 8) i sunt precedate de simbolurile &0. Reprezentarea
intern a acestor numere se face pe doi octei, n convenia cod complementar, fapt pentru
care constantele pozitive sunt cuprinse ntre &00 i &077777, iar cele negative sunt cuprinse
ntre &0100000 i &0177777. Avem:
08=010; 777778=(215-1)10;
1000008= (-215) 10; 1777778= -110.
Constantele de tip hexazecimal sunt numere ntregi scrise n sistemul de numeraie
hexazecimal (sistemul de numeraie cu baza 16) i sunt precedate de simbolurile &H.
Reprezentarea intern a acestor numere se face pe doi octei, n convenia cod
complementar, fapt pentru care constantele pozitive sunt cuprinse ntre &H0 i &7FFF, iar
cele negative sunt cuprinse ntre &HFFFF i &H8000. Avem:
016=010; 7FFF16=(215-1)10;
FFFF16= -110; 800016=( -215)10.
Constantele de tip real n simpl precizie sunt numere reale, n sensul cunoscut,
numai c n loc de virgul se utilizeaz punctul pentru a separa partea ntreag de cea
fracionar. Exemple :3.141592, 2.718182, -52.673 etc. Se poate s lipseasc fie partea
ntreag, fie partea fracionar (de exemplu .5 n loc de 0.5 sau 1., n loc de 1.0). Pe lng
30
acest mod cunoscut de a defini constantele de tip real n simpl precizie, limbajul QBASIC
mai accept i formele: xEn, xE+n sau xE-n, unde x este o constant de tip real n sensul
cunoscut (cu punctul ca marc zecimal), iar n este un numr natural. Valoarea unei astfel
de constante este x10n sau x10-n. Exemplu: 523.672E+4 are valoarea 523,672 104,
-21,36579E-15 are valoare -2.13657910 -16, iar 1234E9 are valoarea 123410 9.
Reprezentarea intern a cestor constante se face pe patru octei n convenia virgul
mobil. Reamintim c forma general a unui numr real este:
r=+xnxn-1..x1x0,x-1x-2...x-m
sau
r=-xnxn-1...x1x0,x-1x-2...x-m
ende xi sunt cifre zecimale, i=-m,n. Prin nmuliri cu puteri ale bazei n care este scris numrul
(b=10), virgula se poate muta (n acest sens numit virgul mobil).
Forma:
r=+0.xnxn-1...x1x0x-1x-2...x-m*10(n+1)=M*10 e
sau
r=-0.xnxn-1...x1x0x-1x-2...x-m*10(n+1)=M*10 e
se numete forma normalizat. n acest caz, M se numete mantis, iar e se numete
exponent. n primii trei octei se reprezint mantisa cu semnul corespunztor, iar n al
patrulea octet se reprezint exponentul cu semnul su.
Constantele de tip real n dubl precizie sunt definite ca i constantele de tip real n
simpl precizie, varianta cu E, locul lui E fiind luat de D. Reprezentarea lor n memoria
central se face pe opt octei n convenia virgul mobil, apte octei pentru mantis, iar al
optulea pentru exponent.
Observaii.
1. n calcule, constantele octale i cele hexazecimale se comport ca i cum ar fi constante
de tip ntreg.
2. n calculele de simpl precizie se memoreaz 7 cifre zecimale i se afieaz 6 cifre
exacte.
3. n calculele de dubl precizie se pot memora 17 cifre zecimale i se pot afia maximum 16
cifre exacte (lundu-le n considerare, att pe cele de la partea ntreaf, ct i pe cele de la
partea fracionar).
4. Domeniul de valori absolute, pentru constantele de tip real, este intervalul [2.9E-39,
1.7E+38].
Constantele de tip alfanumeric (constantele ir) sunt succesiuni formate din
maximum 255 de caractere cuprinse ntre ghilimele. Exemple: Programarea n BASIC,
Strada 1 Decembrie 1918 etc.
Identificatorii
Identificatorii sunt nume asociate constantelor, variabilelor, tipurilor de date,
instruciunilor, comenzilor i fiierelor. Un nume poate fi format din maximum 40 de caractere
(pot fi i mai multe, dar pentru interpretorul QBASIC sunt semnificative numai primele 40), din
care primul trebuie s fie o liter, iar urmtoarele pot fi litere, cifre zecimale sau caracterul
punct. n cadrul unui identificator se pot folosi att literele mici, ct i literele mari,
interpretorul QBASIC considerndu-le identice. n marea majoritate a cazurilor, identificatorii
sunt definii de ctre programator, dar n QBASIC exist i un numr de identificatori
standard prin care se precizeaz: numele instruciunilor, comenzilor, funciilor predefinite,
operatorilor logici, anumite variabile sau tipul unor date.
31
Identificatorii standard sunt cuvinte rezervate i nu pot fi folosii n alt context dect n
cel precizat prin sintaxa limbajului.
Exemple:READ,PRINT,WRITE,FOR,NEXT,GOTO - identificatori standard
X ,ALFA, data.naterii - identificatori definii de utilizator.
Se constat c, utilizarea unor identificatori formai din mai multe cuvinte legate prin
punct ofer o mai bun lizibilitate, dar n acelai timp ridic i unele probleme, deoarece se
tasteaz mai greu i pot constitui o surs de eroare la execuie. Astfel, trebuie fcut un
compromis ntre lungimea i claritatea unui identificator.
Variabilele
Variabilele sunt mrimi a cror valoare se modific n timpul executrii unui program.
Valoarea unei variabile este, la un moment dat, o constant sau un grup de constante, dup
cum variabila este simpl sau indexat. Numele unei variabile simple este un identificator
definit de utilizator, iar numele unei variabile indexate este format dintr-un identificator definit
de utilizator urmat de una sau mai multe expresii indiciale, scrise ntre paranteze rotunde.
Exemple: A(I), B(I,J),C(I+K,J+K), ALFA(I,J,LL)etc.
Variabilele indexate se pun n eviden cu ajutorul instruciunii DIM, plasat, de regul,
la nceputul programului, spaiul de memorie rezervat fiind compact. La rezervare, indicii
variaz de la stnga la dreapta, ceea ce, n cazul matricelor, revine la a rezerva spaiu pe
coloane (nti coloana 1, apoi coloana 2 .a.m.d.). Referirea la valoarea unei variabile simple
se face preciznd numele variabilei, iar referirea la componentele unei variabile indexate se
face preciznd indicii sau expresiile indiciale, ntre paranteze, dup numele variabilei (indicii
sunt separai prin virgul). La fel ca i constantele, variabilele sunt de tip numeric i de tip
alfanumeric (ir). Tipul unei variabile rezult implicit din numele acesteia, mai precis dintr-un
caracter special ce urmeaz numelui. Acest caracter poate fi:
% - pentru o variabil de tip ntreg; exemplu:P%, Q%, beta%, X1%,
PI%
! - pentru o variabil de tip real n simpl precizie; exemplu:a!, AUX!;
# - pentru o variabil de tip real n dubl precizie; exemplu: eps#,B52#
$ - pentru o variabil de tip alfanumeric (ir); exemplu: nume$,
STRADA$.
Dac numele unei variabile nu se termin cu nici unul dintre aceste caractere, tipul ei
implicit este real n simpl precizie.
Este posibil i declararea explicit a tipului variabilelor al cror nume ncepe cu
anumite litere, prin instruciunile DEFINT (ntregi), DEDBL(reale n dubl precizie) i DEFSTR
(ir de caractere).
Alocarea de memorie pentru variabilele simple se face astfel:
2 octei pentru o variabil numeric de tip ntreg;
4 octei pentru o variabil de tip real n simpl precizie;
8 octei pentru o variabil de tip real n dubl precizie;
(n+3) octei pentru o variabil de tip ir format din n caractere.
Pentru variabilele indexate de tip numeric se aloc un numr de octei egal cu
produsul dintre numrul de componente i numrul de octei necesari pentru memorarea
unei componente, care, dup caz, poate fi 2, 4 sau 8.
Observaii.
1. Orice variabil de tip numeric neiniializat are implicit valoarea zero, iar variabilele
de tip ir neiniializate au ca valoare irul vid i deci, n momentul lansrii n execuie a unui
program, toate variabilele numerice sunt puse pe zero, iar cele alfanumerice sunt iniializate
cu irul vid.
2. Unei variabile simple sau unei componente de variabil indexat i se poate atribui o
valoare prin una din instruciunile: LET,INPUT sau READ.
32
3. ntr-un program QBASIC, este posibil s atribuim acelai nume att unei variabile
simple (de orice tip), ct i unei variabile indexate.
Exemple:
A - variabil simpl de tip real n simpl precizie;
A% - variabil simpl de tip ntreg;
A# - variabil simpl de tip real n dubl precizie;
A$ - variabil simpl de tip alfanumeric (ir);
A%(I) - variabil indexat cu un indice, de tip ntreg;
A(I) - variabil indexat cu un indice, de tip real n simpl precizie;
A#(I) - variabil indexat cu un indice, de tip real n dubl precizie;
A$(I) - variabil indexat cu un indice, de tip alfanumeric (ir);
A(I,J) - eroare, deoarece exist deja o variabil indexat cu acest nume.
Variabilele predefinite care pot fi utilizate n QBASIC sunt: CSRLIN, DATE$, ERDEV,
ERDEV$, ERR, ERL, INKEY$ i TIME$. Numele unei variabile predefinite este un
identificator standard i nu poate fi folosit ntr-un program QBASIC n alte scopuri.
Semnificaia acestor variabile este prezentat n tabelul urmtor:
Variabila
Semnificaia
CSRLIN
Are, la un moment dat, o valoare egal cu numrul liniei pe care se
afl cursorul. Poate lua valori cuprinse ntre 1 i 25 (numrul maxim
de linii ce se pot afia pe ecran).
DATE$
Are ca valoare un ir format din 10 caractere, n care este
nregistrat data calendaristic, sub forma ll-zz-aaaa, unde:
ll - reprezint luna curent
zz - reprezint ziua curent
aaaa - reprezint anul curent.
TIME$
Are ca valoare un ir format din 8 caractere, n care este nregistrat
timpul curent sub forma hh:mm:ss, unde:
hh - reprezint ora (de la 00 la 23);
mm - reprezint minutul (dela 00 la 59);
ss - reprezint secunda (de la 00 la 59).
ERDEV
Are ca valoare codul ultimei erori depistate n timpul execuiei unui
program.
ERDEV$ Are ca valoare numele perifericului care a generat eroarea. De
exemplu, dac n timpul funcionrii imprimantei LPT1: a aprut
eroarea Printer out of paper, variabila ERDEV va furniza cifra 9
(codul acestei erori), iar ERDEV$ va furniza numele perifericului,
adic LPT1:.
ERR
Are ca valoare codul ultimei erori depistate n timpul execuiei unui
program.
ERL
Are ca valoare numrul liniei de program n care s-a depistat eroarea
cu codul ERR.
INKEY$
Are ca valoare un ir format dintr-un caracter extras din irul de
ateptare al suportului standard de intrare, care este tastatura
terminalului, sau irul vid, dac nici un caracter nu se afl n
ateptare. Orice caracter tastat este plasat n coada de ateptare a
suportului standard pentru a fi extras prin INKEY$, excepie fcnd
caracterul BREAK, care produce terminarea execuiei programului.
Caracterul tastat nu se afieaz pe ecran. Lungimea irului furnizat
de INKEY$ este unu, dac s-a citit un caracter care face parte din
setul de caractere QBASIC, sau doi, dac s-a citit un cod extins.
33
4.3.Gramatica limbajului
Listele de variabile
O list de variabile este constituit din variabile simple i/sau componente de
variabile indexate desprite prin separatorii: virgul, punct i virgul sau spaiu. Exemplu:
ALFE, BETA, G%(5), Y2, MAX!, NUME$, S2, delta1.
Expresiile
O expresie poate fi o constant, o variabil simpl, o component de variabil
indexat, o funcie sau o succesiune format din dou sau mai multe elemente de tipul celor
precizate mai sus (numite i operanzi), legate prin operatori i, eventual, cuprinse ntre
paranteze rotunde. Dup tipul operatorilor putem avea: expresii aritmetice (numerice),
expresii relaionale, expresii logice i expresii alfanumerice.
Expresiile numerice (aritmetice)
O expresie numeric descrie o formul de calcul n care intervin operanzi de tip
numeric i operatori aritmetici.
Operatorii aritmetici, n ordinea crescnd a prioritii, sunt:
I) - adunarea (+) i scderea (-);
II) - nmulirea (*), mprirea (/),mprirea ntreag (\) i restul mpririi ntregi
(MOD). n cazul efecturii mpririi ntregi sau n cazul n care se determin restul mpririi
ntregi, cei doi operanzi trebuie s fie de tip ntreg, iar dac nu sunt ntregi, nainte de
efectuarea operaiei se face rotunjirea la ntreg.
De exemplu: 234.5\23=10, iar 234.5 MOD 23=5, deoarece nainte de efectuarea
operaiilor 234.5 a fost rotunjit la 235.
III) - ridicarea la putere (^).
La prioriti egale (operaii succesive de aceeai prioritate) se aplic regula stngadreapta. Ordinea executrii operaiilor poate fi modificat folosind parantezele rotunde, (i).
n cazul, expresiilor cu paranteze, evaluarea se face, cu prioritile menionate, ncepnd cu
parantezele cele mai interioare. Mai precizm c operatorii aritmetici + i - sunt operatori
unari, nelegnd prin aceasta c pot precede un operand, caz n care se subnelege c se
face o adunare la zero sau se face o scdere din zero.
innd cont de cele precizate anterior, putem avea, de exemplu:
Expresia
A+B+C
A*B/C
A/B/C
A^B^C
Cum se evalueaz
(A+B)+C
(A*B)/C
(A/B)/C
(A^B) ^C
Valoarea
7
1.333333
.3333334
64
R= {<,<=,=,<>,>=,>}.
Forma general a unei expresii relaionale este:
i) e1re2 - n cazul comparrii de valori numerice, unde e1 i e2 sunt expresii
numerice, iar r este un operator relaional; evaluarea expresiei relaionale, n acest caz, se
face astfel:
- se evalueaz cele dou expresii numerice;
- dac relaia precizat prin operatorul r are loc, i se atribuie expresiei relaionale
valoarea logic adevrat (-1), iar n caz contrar, valoarea logic fals (0);
ii) s1rs2 - n cazul comparrii de valori alfanumerice, unde s1 i s2 sunt iruri de
caractere, iar r este un operator relaional. Evaluarea unei astfel de expresii se face
comparnd codurile ASCII ale caracterelor din primul ir cu cele ale caracterelor din al doilea
ir, compararea fcndu-se caracter cu caracter, dup cum urmeaz.
Fie:
s1=a1 a2..an, ai fiind caractere, i=1,n
s2=b1b2..bn, bi fiind caractere, i=1,m.
Dac ai=bi, i=1,k, cu k min m,n, i:
- ai+1 bi+1, atunci s1 s2
- ai+1 bi+1,atunci s 1s2
Dac m=n i ai=bi, i=1,n, atunci s1=s2
Observaie. Literele mici sunt mai mari dect aceleai litere mari atunci cnd apar
ntr-o constant sau variabil ir.
Exemplu:
Expresia
2+34-7222-10
alfabet ALFABET
alfa ALFABET
alfa alfabet
Valoarea
-1 (adevrat)
-1 (adevrat)
0 (fals)
-1(adevrat)
Expresii logice
Printr-o expresie logic se determin valoarea de adevr a unei propoziii logice.
Operatorii logici sunt: NOT (negaie), AND (conjuncie/i logic), OR (disjuncie/sau logic),
XOR (sau exclusiv), EQV (echivalen), IMP (implicaie logic). Operatorul NOT este unar, iar
ceileli operatori sunt binari. Prioritile operatorilor sunt n ordinea dat atta timp ct
expresia nu conine paranteze. Un operator logic combin deci valori adevrate - false i
determin un rezultat care, la rndul lui, poate fi adevrat sau fals.
Ca valori de adevrat sau fals ce pot fi combinate, se pot utiliza expresiile relaionale,
expresiile logice, dar i valori numerice, cu precizarea c un operand este adevrat dac
este diferit de zero i fals dac este egal cu zero.
35
Dac P i Q sunt dou variabile care pot lua valorile logice adevrat (A) i fals (F),
fiecare operator determin rezultatul dup cum urmeaz:
P
A
A
F
F
Q
A
F
A
F
NOT P
F
F
A
A
P OR Q
A
A
A
F
P AND Q
A
F
F
F
P XOR Q
F
A
A
F
P EQV Q
A
F
F
A
P IMP Q
A
F
A
A
Valoarea
PROGRAMAREA IN
QBASIC
Unu,doi,trei,patru!
4.3 Instruciunile
O instruciune este o informaie care descrie riguros o operaie pe care o poate
executa un calculator.
Instruciunile limbajului QBASIC sunt executabile i neexecutabile. O instruciune
executabil indic sistemul de calcul ce aciune trebuie s ndeplineasc n momentul
executrii programului, iar o instruciune neexecutabil conine unele informaii necesare
procesului de prelucrare sau informaii referitoare la documentarea programului i nu poate
cauza o aciune n timpul executrii acestuia.
Exemple:
Instruciunea
READ A,B,C,D
PRINT a=; A
STOP
4.4. Comenzile
O comand este o informaie care opereaz asupra unui program sau asupra unui
fiier de date.
Exemple:
Comanda
LOADPROG1.BAS
RUN
SAVEPROG2.BAS,P
Efectul
ncarc n memorie programul cu numele
PROG1.BAS, aflat pe dischet
Lanseaz n execuie programul aflat n
memorie.
Salveaz programul curent din memorie i-l
depune pe disc n fiierul PROG2.BAS, ntrun format protejat.
4.5.Funciile
Efectul
Determin valoarea absolut (modulul)
variabilei x.
Furnizeaz numrul de caractere din variabila
X$
Furnizeaz valoarea logaritmului natural din
X.
Comentariu.
Cu ajutorul elementelor limbajului QBASIC se pot scrie programe. Un program este un
ansamblu de instruciuni aranjate ntr-o anumit ordine. Scrierea unui program se face pe
baza unui algoritm fapt pentru care orice program trebuie s conin un set de instruciuni
prin intermediul crora pornind de la datele de intrare ale unei probleme, s se poat obine
soluia acesteia cu ajutorul unui calculator ntr-un timp rezonabil. nainte de a prezenta
structura programelor QBASIC, facem urmtoarea observaie: deoarece comenzile opereaz
asupra progaramelor, pot fi introduse n mod direct, iar instruciunile se introduc n mod
indirect (modul program), ca pri componente ale unui program.
Distincia ntre comenzi i instruciuni este o problem care ine mai mult de tradiie,
deoarece exist i posibilitatea de a introduce comenzile n mod indirect i instruciunile n
mod direct. Referitor la acest ultim aspect, precizm c se recomand introducerea
instruciunilor n mod direct atunci cnd se dorete efectuarea unor calcule rapide, care nu
necesit executarea unui program, caz n care pot fi afiate anumite valori. De reinut c
instruciunile introduse n mod direct nu sunt reinute n memorie dup afiarea rezultatului.
37
Funcii n QBASIC
Funcii aritmetice
y = ex
y = x
y = ln x
y = x
y=
y = [x]
Funcii trigonometrice
y = sin x
y = cos x
y = tg x
y = arcsin x
y = arccos x
y = arctg x
Cu observaia c n cazul funciilor trigonometrice SIN (X) , COS (X) i TAN (X),
variabila X este dat n radiani. Modul de evaluare a unei expresii aritmetice n care apar att
funcii aritmetice ct i funcii trigonometrice se face similar ca n cazul unei expresii
aritmetice obinuite.
Exemplu:
y = ln 2 sin 3 x se va scrie BASIC
10 LET Y = LN (ABS(SQR(2+SIN (X)3)))
4.4 Probleme propuse
1) Scriei BASIC urmtoarele expresii:
x
1 x1
y = ( x a)( x b) ; y = (1+ x ) x ; y = a
y=
2x
3x
2
bc
y= 1e
3 d
y=
xe
ln
; y=
arctgx
2
; y=
ln( a x) ln a
; y=
2x
1 cos 2x
; y ln cos arctg
log cos x
x
; y (1 tg
3x
e
1 x
x)
1
2x
38
LET X = 2
PRINT X; La ptrat este:; x 2;i;
PRINT X;La cub este:; x 3
END
RUN
2 La ptrat este: 4 i 2 la cub este 8
Instruciunea PRINT USING
Afieaz pe ecran iruri sau numere utiliznd un format specificat.
39
LET A$=ABC:D$=DEF
PRINT USING !A$;D$;
PRINT USING \\;A$;D$
END
RUN
AD
ABCDEF
=$specific un cmp ir de lungime variabil; n acest caz irul va fi afiat exact cum
este introdus
Exemplu:
10 LET A$=ABC: LET$
30 PRINT USING $; B$
40 END
RUN
ADEF
Cmpuri numerice
# - semnul este folosit pentru reprezentarea poziiei fiecrei cifre a numrului. Dac
numrul de reprezentat are mai puine cifre dect poziiile specificate se execut automat
alinierea la dreapta (precedat de spaii) a numrului n cmp. Dac este necesar, numerele
sunt rotunjite.
Exemple:
10 PRINT USING + # #. # #; -68.95;15.33
20 END
RUN
-68.95+15.33
10 PRINT USING # # : # # +; -68.95;15.33;
20 END
RUN
68.95-15.33+
Semnul minus la sfritul formatului implic reprezentarea numerelor negative cu
semnul minus dup numrul respectiv.
40
Exemplu:
10 PRINT USING # # : # # -; -68.95,22.449
20 END
RUN
68.95 - 22.45
- un asterix dublu la nceputul formatului face ca spaiile din faa cmpului numeric
s fie umplute cu astericuri. Deasemenea semnul specific poziiile nc dou cifre.
Exemplu:
10 PRINT USING #.#;12.399; - 0.9;765.4
20 END
RUN
12.4 - 0.9765.4
$$ - semnul dolar dublu face ca semnul dolarului s fie afiat n stnga numrului
formatat. El specific poziiile a nc dou cifre, dintre care una este a semnului $. Formatul
exponenial nu poate fi folosit cu semnul $$.
Exemplu:
10 PRINT USING $# # #.# #$ . ;456.78;0.9; - 765.1
20 END
RUN
$456.78 $0.90 - $765.10
$ - acest semn la nceputul formatului combin efectele celor dou simboluri de mai
sus
Exemplu:
10 PRINT USING $# # .# #;2.34
20 END
RUN
$2.34
- , - o virgul plasat la stnga punctului zecimal afieaz o virgul la fiecare grup de
trei cifre semnificative din stnga punctului zecimal. Virgula plasat la sfritul formatului este
tiprit ca parte a irului.
Exemplu:
10 PRINT USING # # # #.# #;1234.5
20 END
RUN
1,234.50
10 PRINT USING # # # # : # #; 12134.5
41
20 END
RUN
1234.50,
- acest semn plasat dup format specific reprezentarea n forma
exponenial.
Exemplu:
10 PRINT USING # #.# # ;234.56
20 END
RUN
2.35E02
10 PRINT USING .# # -; - 88888
20 END
RUN
889E05 Instruciunea LPRINT
Forma este identic cu instruciunea PRINT , dar are ca efect tiprirea la imprimant.
42
PI = 3.14
INPUT Introducei raza ; R
LET A = PIR2
PRINT Aria cercului; A
END
RUN
Introducei raza ?3
Aria cercului este 25,26
Instruciunea INPUT #
Evalueaz un ir de n caractere citite de la claviatur sau dintr-un fiier. Prezentm
numai citirea de la claviatur:
V$= INPUT $ (n)
n - indic numrul de caractere care urmeaz a fi citite (caracterele citite nu vor fi
afiate pe ecran).
LINE INPUT [;][Mesaj]; list variabile ir
Efect: accept o linie (maximum 255 caractere) de la terminal
43
READ a,b,c
PRINT a,b,c
DATA 10,20,30
END
RUN
10
20
30
Pentru a da posibilitatea utilizatorului s-ai selecteze o anumit list de valori, dintr-o
multitudine de liste definite prin instruciuni DATA, s-a prevzut instruciunea RESTORE.
Aceasta are forma:
nr. linie RESTORE nr. linie instr. DATA
cu rol de a specifica numrul listei de valori prin definirea etichetei instruciunii DATA care o
definete, ce urmeaz s fie citite de un READ .
Exemplu:
10
20
30
40
50
60
READ a,b
PRINT a,b
RESTORE 60
READ X,Y,Z
PRINT X,Y,Z
DATA 1,2,3,4,5
n acest program, n urma execuiei liniei 10, variabila a i b primesc valorile, a=1 i
b=2. Execuia n continuare a instruciunii RESTORE 60, specific c lista de variabile ncepe
cu prima valoare din lista definit de DATA cu numrul de linie 60. Ca urmare, n urma
execuiei liniei 40, variabilele x,y i z primesc valorile x=1, y=2 i z=3. Dac instruciunea
RESTORE ar lipsete, poziionarea n cadrul listei se face ncepnd din punctul n care s-a
ajuns cu ultima citire, astfel nct pentru exemplul dat variabilele x, y, z primesc valorile x=3,
y=4, z=5.
10
20
30
40
50
60
READ A,B,C
RESTORE 40
READ D,E,F
DATA 57,68,79
PRINT A;B;C;D;E;F
END
44
57
RUN
68
79
57
68
79
45
DATA 5,7,12
READ R
PRINT R=;R,
LET A=3.14R2
PRINT ARIA=; A
GOTO 10
RUN
R=5 ARIA=78.5
R=7 ARIA=153.86
R=12 ARIA=452.16
46
OUT OF DATA IN 20
n acest exemplu instruciunea GOTO din linia 60 pune programul ntr-o bucl infinit,
ce se va termina n momentul n care nu mai pot fi citite date din instruciunea DATA
O ultim observaie care trebuie efectuat, se refer la faptul c secvena de program
care urmeaz dup GOTO este scurtcircuitat. Acest aspect impune necesitatea ca n cadrul
unitii de program s existe cel puin o instruciune care s dea controlul la instruciunea
imediat urmtoare lui GOTO.
6.2.Operatori i expresii relaionale
n cadrul unui algoritm [vezi capitolul 4], apar frecvent situaii n care este necesar
efectuarea unor comparaii, fie ntre constante, variabile sau expresii aritmetice, situaie care
n BASIC se traduce prin una sau mai multe expresii relaionale. Operatorii relaionali sunt:
strict mai mare
strict mai mic
= mai mare sau egal
= mai mic sau egal
= egal
diferit
Expresiile relaionale de forma a b sau SQR (C) 0 reprezint din punct de vedere
al calculatorului, ntrebri la care acesta va rspunde prin adevrat (DA) sau fals (NU). Este
evident c ambii termeni care intervin n operaia de comparare trebuie s fie de acelai tip:
numeric sau ir de caractere. Nu are sens s se execute o comparaie de forma: a$=0.
Eventual, ns o comparaie de forma: b$=h are sens (ambii termeni sunt ir de caractere).
n BASIC rezultatul comparrii este o valoare numeric. Astfel se asociaz valoarea
numeric 0, dac n urma evalurii expresiei relaionale se obine valoarea logic fals, i se
asociaz valoarea numeric 1, dac n urma evalurii se obine valoarea logic adevrat.
6.3. Operatori i expresii logice
O expresie logic este dat de dou sau mai multe expresii relaionale legate ntre ele
de unul din operatorii logici:
10 NOT
operatorilor logici.
30 OR
nu
20 AND
sau
INPUT a
INPUT b
PRINT (a AND a = b) + ( b AND a b )
GOTO 10
Programul va tipri de fiecare dat numrul cu cea mai mare valoare dintre numerele
a i b. Acest lucru este evident, presupunnd c a=7 i b=5 , atunci evaluarea lui a AND a =
b va da 7 iar b AND a b va da 0 , ceea ce va avea ca efect tiprirea 7+0=7.
48
E
NU
Unde : E este o expresie relaional sau logic iar INSTRUCIUNE este una sau mai
multe instruciuni BASIC.
Instruciunea IF prezint dou moduri de aciune dup cum INSTRUCIUNE este o
instruciune de salt necondiionat sau o instruciune de atribuire.
A) n primul caz IF-ul este de forma:
nr. linie IF E THEN GOTO nr. linie
Execuia acestei instruciuni este:
a) se evalueaz expresia E
b) dac E este adevrat se execut instruciunea GOTO , care are ca efect saltul la
execuia instruciunii cu numr de linie indicat de GOTO
c) dac E este fals se execut instruciunea imediat urmtoare IF-ului.
B) n cazul n care INSTRUCIUNE este o instruciune de atribuire, instruciunea IF
are forma:
nr. linie IF E THEN LET V= EXPRESIE
Execuia acestei instruciuni const din:
a) se evalueaz expresia E
b) dac E este adevrat se execut instruciunea LET V= EXPRESIE dup care se
trece la urmtoarea instruciune care urmeaz imediat n secvena dup IF-ul logic
c) dac este fals, se trece la execuia instruc-iunii care urmeaz dup IF-ul logic.
n dialectele moderne ( pe PC-uri) IF-ul logic prezint urmtoarele formate:
IF E THEN clauz ELSE clauz
IF E THEN GOTO nr.linie ELSE clauz
unde: E este o expresie relaional sau logic
clauz poate fi o instruciune sau o secven de instruciuni (separate prin :). Modul
de execuie al acestor instruciuni a fost prezentat anterior.
49
N=N+1
P=P+1
K=K+1
IF (X 0) THEN GOTO 60
LET N=N+1
GOTO 70
LET P=P+1
LET K=K+1
-10
DA
X25
NU
S=S+X
NU
N=N+1
N=N+1
K=K+1
i n acest caz apar mai multe variante, funcie de modul cum se utilizeaz instruciunea IF-ul
logic. Dac INSTRUCIUNE este o instruciune de salt necondiionat, secvena BASIC este
de forma:
a) 10
20
30
40
50
60
70
O variant care micoreaz numrul de instruciuni din care este compus secvena,
apare atunci cnd este o expresie logic:
2) 10
20
30
40
50
Observaii:
1. Dac pentru INSTRUCIUNE se utilizeaz o instruciune de salt necondiionat i
dac pe ramurile blocurilor de testare sunt prezente blocuri diferite, este obligatoriu
separarea secvenelor prin instruciunea GOTO.
2. INSTRUCIUNE poate fi format din una sau mai multa instruciuni BASIC n care
ultima poate fi o instruciune de salt necondiionat. n acest caz instruciunile care se despart
prin : sunt toate executate dac n urma evalurii expresiei logice sau relaionale se obine
valoarea logic adevrat. Controlul este dat n continuare, primei instruciuni care urmeaz
dup IF-ul logic, dac INSTRUCIUNE este format numai de instruciuni de atribuire, sau la
instruciunea a crei numr de linie apare n argumentul instruciunii GOTO, dac aceasta
este ultima din instruciune.
RECOMANDRI privind modul de construire a secvenelor cu instruciunea IF logic:
1) La ntlnirea blocului de testare, se scrie instruciunea IF urmat de o expresie
logic sau relaional.
2) Se alege una din variantele instruciune , (instruciune de salt de atribuire sau
secven de instruciuni de atribuire).
3) Se recomand nceperea descrierii cu ramura corespunztoare sensului adevrat,
deoarece aceasta conduce n general la cea mai simpl secven de program.
4) Etichetele din instrucinile GOTO utilizate, se completeaz dup scrierea n
totalitate a secvenei de program.
52
6.5.Probleme propuse
1. Cum putei scrie n BASIC clauza:
dac A nu este egal cu B sau C?
2. Scriei n BASIC clauza A nu aparine intervalului (-30,40).
3. Scriei n BASIC programul pentru calculul expresiei:
500
1
( 1)
K 1 2K 1
S 4
K 1
1 1 sin x
lg
2 1 sin x
X
3
5 2! 7 3 ! 9 4 !
53
10 INPUT n
20 I=1
30 S=0
40 S=S+I
50 I=I+1
60 IF (IN) THEN GOTO 40
70 PRINT S;S
80 END
Scrie S=;S
Stop
Se observ c instruciunile cuprinse ntre secvenele 40 i 60 se repet de N ori.
Pentru a rezolva mai economic astfel de cazuri n BASIC
s-au prevzut un numr de dou instruciuni cu rol de programare a structurilor repetitive
(cicluri).
Formatul instruciunii:
< nr. linie>FOR<v>=<e1>TO<e2>STEP<e3>
CORPUL
CICLULUI
< nr. linie>NEXT<v>
e1, e2, e3 sunt constante, variabile sau expresii aritmetice, reprezentnd, respectiv:
- e1 valoarea iniial
- e2 valoarea final
- e3 pasul ciclului
Dac pasul este omis, se presupune implicit 1. Corpul ciclului este format din
instruciuni BASIC cuprinse ntre o instruciune FOR una NEXT.
Programul pentru algoritmul anterior va avea urmtoarea form :
10 INPUT N
20 S=0
30 FOR I=1 TO N
40 S=S+I
50 NEXT I
60 PRINT S=;S
70 END
Reguli de construire i utilizare
1) Instruciunea FOR/NEXT se poate utiliza dac ntr-un algoritm de calcul sunt
prezente structuri repetitive (cicluri) n care o variabil de control trece de o valoare iniial, la
una final cu un pas dat.
2) Numele variabilei de control este dat de o singur liter
54
10 DIM A(50)
20 FOR I=1,50
30 INPUT A(I)
NP=0; NZ=0; NN=0 40 NEXT I
Pentru I=1,50 execut
50 NP=0:NZ=0:NN=0
Dac A(I) >0 Atunci 60 FOR I=1,50
NN=NN+1 70 IF(A(I))>0 THEN NP+1:GOTO 100
Altfel
80 IF(A(I))=0 THEN NZ=NZ+1:GOTO 100
Dac A(I)=0 Atunci
90 NN=NN+1
NZ=NZ+1 100 NEXT I
Altfel
110 PRINT NP=;NP;NZ=;NZ;NN=;NN
120 END
NN=NN+1
Scrie NP=;NP;NZ=;NZ;NN=;NN
STOP
6) Pot exista dou sau, mai multe structuri repetitive incluse n interiorul altei structuri
repetitive. Regulile de construire a instruciunilor FOR corespunztoare i pstreaz
valabilitatea, similar ca n cazul existenei unei singure structuri repetitive. Trebuie avut grij
ca domeniile s nu se intersecteze.
Exemplu:
FOR i=1,50
--------FOR j=1,30
--------FOR k=1,20
--------NEXT K
NEXT J
NEXT I
Pentru a elimina intersecia domeniilor secvena de instruciuni NEXT K, NEXT J, NEXT I
poate fi nlocuit cu:
NEXT K,J,I
55
S= A(i,j)
i1 j1
10
20
30
40
50
LET S=0
FOR I=1 TO 3
FOR J=1 TO 4
LET S=S+A(I,J)
NEXT J,I
5 i=0
10 PRINT VAL lui i la nceputul ciclului;i
15 DO WHILE i < 10
56
i=i+1
20 LOOP
25 PRINT val final a lui i;i
2)
5 i= -10
15 PRINT val lui i la nceputul ciclului; i
20 DO UNTIL i >10
i=i+1
20 LOOP
25 PRINT val final a lui i;i
7.2 Instruciunea WHILE i WEND
Efect: Execut un bloc de instruciuni ntr-o bucl att timp ct o condiie dat este
adevrat.
Format:
WHILE exp
.
.bloc instruciuni
.
.
.
WEND
unde: exp este o expresie numeric.
Dac exp este adevrat (diferit de zero) se execut blocul de instruciuni pn cnd
se atinge WEND. Dac exp este n continuare adevrat, procesul se repet. Dac exp
devine fals (egal cu zero), execuia se continu cu instruciunea imediat urmtoare
instruciunii WEND.
Exemplu
S se sorteze n ordine alfabetic elementele vectorului A; unde A au I elemente.
100
110
120
130
140
150
160
F=1
WHILE F
F=0
FOR I=1 TO J=1
IF A(I)>A(I+1) THEN SWAP A(I),A(I+1):F=1
NEXT
WEND
unde SWAP are ca efect schimbarea ntre cele dou valori a dou variabile. Variabilele pot fi
numerice sau ir. Cele dou variabile care trebuiesc schimbate ntre ele trebuie s fie de
acelai tip.
10 $=UNUL:B $=TOTC $=PENTRU
20 PRINT A$,C$,B$
30 SWAP A$,B$
40 PRINT A$,C$,B$
57
RUN
UNUL PENTRU TOI
TOI PENTRU UNUL
Controlul tastaturii. Funcia INKEY$
Funcia INKEY care nu are nici un argument, are rolul de a citi tastatura sistemului de
calcul. Dac n momentul execuiei funciei, este apsat o tast, aceasta este reinut, n
caz contrar (nici o tast apsat), rezultatul citirii tastaturii este un ir de caractere vid. n
sfrit dac sunt apsate simultan dou sau mai multe taste, n urma funciei INKEY$ se
obine codul rezultat prin aplicarea funciei SAU, ntre codurile tastelor apsate. Este
important de remarcat faptul c, spre deosebire de instruciunea INPUT, funcia INKEY$, nu
ateapt ca utilizatorul s apese pe una sau mai multe taste, funcia refcnd altceva dect
s citeasc tastatura n momentul execuiei.
Exemplu:
10 PRINT Apsai o tast pentru continuare
20 A$= INKEY$:IF A$= THEN GOTO 20
n exemplul urmtor:
10 LET A$=INKEY$
20 IF A$=S THEN GOTO 100
20 IF A$=D THEN GOTO 200
30 GOTO 10
programul rmne n ciclu pn cnd se apas tasta S sau D.
7.3. Probleme propuse
1) Construii subprogramul pentru calculul expresiei:
1 1 z
k 1 2k 1 1 z
13
y 2
2k 1
ln(1 x)
1 x
arctgx
n intervalul [0,1] p = 0.05
x
1
y
n intervalul [2,3] p =0,1
1 ln x
y
2x
1 x
xe
2 sin x
58
( x y )
1 0.1( x y )
x[0,2] p=0.5
y [0.5,1.5] p=0.3
x
1 y
2
2
x[-1,1] p=0.2
y [0,1] p=0.1
59
DIM M(3,4)
FOR I = 1 TO 3
FOR J = 1 TO 4
READ M (I,J)
NEXT J,I
DATA 10,2,5,19
DATA 16,3,7,11
DATA -3,4,20 1
B) 10
20
30
40
50
DIM M(3,4)
FOR I = 1 TO 3
FOR J = 1 TO 4
INPUT M(I,J);M(I,J)
NEXT J,I
Din cele dou exemple se poate observa utilizarea instruciunilor FOR pentru
specificarea indicilor elementelor a cror valoare urmeaz a fi iniializat. n primul caz,
iniializarea s-a efectuat un READ, iar n cel de-al doilea caz cu INPUT. De obicei, operaia
60
de iniializare cu instruciunea READ este utilizat atunci cnd n cadrul unui program pentru
diverse execuii, matricea iniial are aceeai valoare, instruciunea INPUT fiind utilizat atunci
cnd valorile matricei au iniial alte valori de la o execuie la alt execuie.
8.2. Tiprirea matricilor
Scrierea unei matrici n, BASIC, este n general o operaie dificil de executat, datorit
absenei unor descriptori care s permit organizarea informaiei scrise pe ecran. Este
evident c i n acest caz este obligatorie specificarea explicit a fiecrui element care se
scrie, prin definirea indicilor care i caracterizeaz poziia, modul de organizare a informaiei
depinznd de modul n care se modific indicii n cauz. Presupunnd c dorim s scriem
linie cu linie elementele matricei M(3,4) astfel:
10
20
30
40
45
50
FOR i=1 TO 3
FOR j=1 TO 4
PRINT M(i,j); ;
NEXT j
PRINT
NEXT i
Secvena asigur scrierea linie cu linie, lsnd cte dou spaii ntre ele de pe aceeai
linie. Instruciunea cu eticheta 45 are rolul de a asigura trecerea pe linia urmtoare.
8.3. iruri de caractere
Dup cum s-a specificat, un caracter alfabetic urmat de semnul $ definete un ir de
caractere. De fapt, n ultim instan, acesta definete o matrice monodimensional, n care
fiecare element este dat de un caracter al irului, i a crui dimensiune se stabilete n
momentul iniializrii variabilei.
De exemplu, n
10 LET A$=BASIC
variabila A$, definete de fapt o matrice monodimensional, a crei dimensiune este egal
cu 5. Este evident c iniializarea variabilei A$ poate fi fcut i printr-o instruciune de forma:
5 INPTU A$
Datorit acestui mod de tratare a unei variabile ir de caractere, apar imediat dou
aspecte. Primul se refer la faptul c prima operaie de iniializare stabilete dimensiunea
variabilei ir, care n prelucrri ulterioare nu mai poate fi depit. Astfel lund n considerare
o iniializare de forma
10 LET A$=AB12
va fi corect, deoarece dimensiunea irului este de numai 4 caractere (iniial irul a fost
dimensionat la 5 caractere), pe cnd o iniializare de forma:
10 LET A$=ABCDEFG
61
este incorect fiind semnalizat o eroare de depire a dimensiunii iniiale a irului. Cel de-al
doilea aspect se refer la faptul c un caracter al irului poate fi adresat specificndu-se
poziia sa similar ca n cazul elementelor unei matrici numerice. Astfel secvena ce urmeaz
va avea ca efect, scrierea pe ecran a irului de caractere pe vertical:
5
6
7
8
LET A$=BASIC
FOR i=1 TO 5 va tipri pe ecran
PRINT A$(K)
NEXT
B
A
S
I
C
LET a=abcde
FOR n=1 TO 5
PRINT a$(n TO 5)
NEXT n
END
abcde
abcd
abc
ab
a
Un subir poate fi obinut i prin concatenarea a dou sau mai multe subiruri. De
exemplu:
5
6
7
8
LET a$=abc
LET b$=defg
LET c$=a$+b$+hij
PRINT c$
62
RUN
abcdefghij
8.5.Funcii care acioneaz asupra irurilor de caractere
ASC atribuie unei variabile codul ASCII al primului caracter al irului y$. Formatul este:
V=ASC(y$)
y$ poate fi orice expresie ir. Rezultatul funciei ASC este o valoare numeric ce reprezint
codul ASCII al primului caracter din irul y$. Dac y$ este un ir nul se va semnala illegal
function call.
Exemplu:
10 y$=ALFA
20 PRINT ASC(y$)
RUN
65
CHR$ convertete un cod ASCII n caracterul su echivalent
Format:
V$=CHR$(n)
n(0255) CHR$ este utilizat de obicei pentru a trimite un caracter special la imprimant sau
ecran. Complementara ei este funcia ASC.
DATE$ instaureaz sau aloc data calendaristic (ea poate fi variabil sau
instruciune).
ca variabil: V$=DATE$
ca instruciune: DATE$=X$
Pentru variabila (V$=DATE$) este alocat un ir de 10 caractere :
ll-zz-aaaa.
Pentru instruciuni (DATE$=X$); X$ este o expresie ir utilizat pentru instaurarea
datei calendaristice curente, X$ poate lua una din formele:
ll-zz-aa; ll/zz/aa; ll-zz-aaaa; ll/zz/aaaa
Exemplu:
10 DATE$=12/31/1990
20 PRINT DATE$
RUN
12/31/1990
ENVIRON$ recupereaz i afieaz irul specificat din tabelul de referine globale
BASIC
Format:
63
V$=ENVIRON$(param)
sau
V$=ENVIRON$(n)
Ca funcie: V$=MID$(x$,n[,m])
Ca instruciune: MID$(V$,n[,m])=y$
unde:
Exemplu:
100
110
120
130
EXEMPLU
10 X$=ABCDEFGH
20 PRINT LEN(X$)
RUN
8
STRING$ atribuie unei variabile un ir de lungime n ale crui caractere au codul
ASCII m sau primul caracter al irului x$.
Format:
V$=STRING$(n,m)
V$=STRING$(n,x$)
m i n sunt cuprinse ntre 0 i 255; x$ este o expresie ir.
Exemplu:
10 X$=STRING$(10,45)
20 PRINT X$RAPORT LUNARX$
RUN
- - - - - RAPORT LUNAR - - - - - 10 X$=ABC
20 S$=STRING$(5,X$)
30 PRINT S$
RUN
AAAA
VAL atribuie unei variabile valoarea numeric a irului X$.
Format:
V=VAL(X$)
X$ este o expresie ir.
Funcia VAL scoate toate spaiile din irul argument pentru a determina rezultatul. Dac
primul caracter al irului X$ nu este numeric, rezultatul funciei VAL(X$) va fi zero.
VARPTR $ atribuie unei variabile, sub forma de caractere, alfabetul unei variabile din
memorie. Este folosit de obicei cu instruciunea PLAY i DRAW.
V$=VARTPR$(var)
var este numele unei variabile din program.
68
DIM a$(4)
FOR K=1 TO 4
READ a$(K)
NEXT K
DATA 12345
DATA abc
DATA 789
DATA abc123
10
20
30
40
50
60
70
80
DIM A$(4,7)
FOR K=1 TO 4
READ a$(K)
NEXT K
DATA 12345
DATA abc
DATA 789
DATA abc123
DIM a$(3,2)
FOR I=1 TO 3
FOR J=1 TO 2
NEXT J,I
DATA 123,abcdef
DATA ab123,456789
DATA 78ab,cde147
69
fiecare element de matrice va defini un ir. Se observ c acest aspect apare abia dup
iniializarea elementelor matricei. Matricea a$(3,2), putnd reprezenta, imediat dup alocare,
i o matrice de 3 elemente, n care fiecare element reprezint un ir de maximum 2
caractere.
8.7. Probleme propuse
1) Construii un program pentru determinarea mediei aritmetice a elementelor diferite
de zero, din matricea T de dimensiune N.
2) Scriei programul pentru determinarea numrului de elemente din matricea T, de
dimensiunea N, care ndeplinesc condiia ti(A,B].
3) Scriei programul pentru ordonarea cresctoare a elementelor matricei A(50).
4) Scriei programul pentru ordonarea descresctoare a elementelor matricei B(50).
5) Scriei programul pentru determinarea produsului C(i,j)=A(i,k)B(k ,j)
i=50, k=30, j=50
6) Scriei un program pentru determinarea produsului elementelor de pe diagonala
principal a matriei A(50,50).
- suma elementelor de sub diagonala principal
- suma elementelor de deasupra diagonalei principale
7) Scriei programul pentru determinarea elementului maxim de pe fiecare linie a
matrcei A(4,4) i plasati-l pe diagonala principal a matricei.
8) Fiind dat irul a$, a crui elemente se citesc se cere programul pentru ordonarea
alfabetic a elementelor irului.
9) Fiind dat irul a$ care conine o fraz introdus de la tastatur, se
cere construirea elementelor matricii b$(20), cunoscnd c fiecare element al matricii b$,
conine un cuvnt din fraza prezent in a$. irul a$ se citete, elementele matricii b$ se scriu.
70
Cap.9. SUBPROGRAME
Un subprogram reprezint o unitate independent de program care rezolv o
problem n cazul general.
Subprogramul, poate fi apelat dintr-un program, numit program principal, ori de cte
ori este necesar efectuarea calculelor puse la dispoziie de subprogram. n cazul general,
fiecare apelare se efectueaz pentru alte date de intrare, rezultnd, unul sau mai multe
rezultate, care se transmit programului principal. Subprogramele, care reprezint traducerea
unui subalgoritm n BASIC, se caracterizeaz prin:
- se identific prin intermediul unui nume sau a unei etichete de identificare;
- n momentul apelrii este necesar specificarea datelor de intrare(a valorilor necesare
pentru efectuarea calculelor);
- subprogramul returneaz programului principal, una sau mai multe valori rezultate n urma
efecturii calculelor.
Subprogramele, se mpart n dou mari categorii: funcii i subrutine. Aceast
clasificare este determinat de numrul de instruciuni din care este format subprogramul, i
de numrul de rezultate furnizate de programul principal.
9.1.Subprograme de tip funcie
Instruciunile DEF i FN
Funciile definite de utilizator, completeaz setul de funcii aritmetice, trigonometrice i
speciale ale limbajului BASIC. Subprogramul const dintr-o singur expresie aritmetic, fiind
calculat o singur valoare care se transmite, programului principal prin numele care
identific funcia. nainte de a fi utilizat n program, funcia trebuie definit cu ajutorul unei
instruciuni de forma:
nr. linieDEF FN nume( parametri formali)= expresie
unde:
- nume constituie numele funciei. Acesta este format dintr-o singur liter care poate fi
urmat de caracterul $ dac funcia este de tip ir de caractere
- parametri formali reprezint argumentele expresiei care formeaz funcia. Variabilele din
lista parametrilor se separ prin virgul;
- expresie constituie definiia funciei care utilizeaz parametrii formali
n momentul utilizrii, subprogramul de tip funcie este apelat sub forma:
FN nume( parametri actuali)
Ea poate s apar n toate tipurile de instruciuni BASIC. Atunci cnd funcia este utilizat,
parametrii actuali sunt nlocuii prin constante, variabile, expresii aritmetice sau nume de
subprograme de tip funcie, diferite de numele funciei n care apar. n momentul apelrii
subprogramului, se asigur corespondena dintre parametrii formali i cei actuali, primii,
lund valorile specificate de ultimii. Aceasta impune asigurarea corespondenei dintre
numrul parametrilor formali din definiie funcie i numrul parametrilor efectivi pentru care
se cere efectuarea calculelor. Pentru a ilustra modul n care se utilizeaz subprogramele de
tip funcie, ne propunem s construim un program pentru calculul valorii integrale, definite
prin metoda trapezelor.
1
Fie, y=4
0
dx
1 x
71
ba
f
(
x
)
dx
h
f ( a kh)) unde: h
2
n
k 1
a
Programul are urmtoarea form:
10 DEF FN F(X)=4/(1+X12)
20 INPUT A,B,N
30 H=(B-A)/N:S=0
40 FOR K=1 TO N-1
50 S=S+FN F(A+K N)
60 NEXT K
70 S=N((FN F/A)+FN F(B))/2+S
80 PRINT S:S
90 STOP
Se observ c utilizarea unui subprogram de tip funcie pentru calculul integralei, d
posibilitatea utilizrii programului principal (cuprins ntre etichetele 20 i 90), pentru calculul
oricrei integrale, care este definit prin funcia 10 ale crui limite de integrare sunt date de
instruciunea 20.
Reguli de construire i utilizare a subprogramelor de tip funcie, pot fi cumulate n
urmtoarele:
a) subprogramul calculeaz o singur expresie aritmetic care poate utiliza una sau
mai multe variabile. Acestea vor defini parametrii formali ai funciei;
b) subprogramul poate fi definit oriunde n cadrul unui program principal, cu observaia
c instruciunea prin care se definete trebuie s apar naintea primei apelri a funciei n
cauz (se recomand amplasarea funciilor la nceputul programului principal).
c) ntr-un program, pot apare un numr nelimitat de subprograme de tip funcie. Un
subprogram poate face apel la un alt subprogram, dac acesta a fost definit naintea sa.
De exemplu:
5 DEF FN X(A,B)=A+B
6 DEF FN Y(C,D)=FN X(C,D)/(C-D)
7 PRINT FN X(Z,3),FN Y(6,4)
execuia secvenei va avea ca efect, tiprirea valorilor 10 i respectiv 5.
d) parametrii efectivi a unei funcii, pot fi constante, variabile, expresii aritmetice sau
alte nume de funcii BASIC, sau utilizator. De exemplu, lund n considerare funciile 5 i 6,
definite la punctul (c), execuia secvenei care urmeaz,
7 DEF FN Y(A,B)=AB
8 E=16
9 PRINT FN X(7,E-13),FN X(7,SQR(E)),
FN Y(10,FN Z(2,3)), SQR(FN X(16,E-7))
va conduce la scrierea valorilor 10,11, 4 i respectiv 5
e) funcia poate fi de tip ir de caractere, caz n care numele acesteia este urmat de
caracterul $.
72
De exemplu:
5
6
7
8
DEF FN t$(a$)=a$(2TO)
DEF FN i$(a$;n)=a$(TO n)
x$=123abc
PRINT FN t$(x$),FN i$(x$,4)
n!
cn k !(n k )!
Programul se va compune din:
- un program principal
- o subrutin pentru calculul factorialului
10 INPUT n,k
20 L=n: GO SUB 80: A=M
30 L=k: GO SUB 80: B=M
40 L=n-k go sub 80: C=M
50 D=A/(BC)
60 PRINT COMB=; D
70 STOP
80 REM SUBRUTINA PENTRU CALCULUL FACTORIALULUI
90 M=1
100 FOR I=1 TO L
110 M=MI
120 NEXT I
130 RETURN
140 END
Reguli de construire i utilizare a subprogramelor de tip subrutin:
a) subprogramul calculeaz una sau mai multe valori, calculul impli-cnd prezena mai
multor instruciuni BASIC
73
f ( x)dx
a
b a 5
f ( x i)cux
2 i1 Ai
ba ba
t
2
2
74
dx
log(1 x)
e
dx.
1 x;
2 dx;
1
sin x
1
0 1 x
0
3
SCREEN 2
SCREEN 3
SCREEN 4
SCREEN 7
SCREEN 8
SCREEN 9
SCREEN 10
SCREEN 11
SCREEN 12
SCREEN 13
Programele exemplu, care vor urma, sunt scrise n modul 2, ceea ce va fi uor de
convertit n modurile de nalt rezoluie 8 sau 9.
10.1.1 Adaptorul HERCULES
Pentru a utiliza adaptorul Hercules, trebuie lansat mai nti programul MSHERC.COM
livrat pe dischetele de instalare, nainte de a lansa QBASIC. Acest program red posibilitatea
de comutare n modul grafic 3, valabil pentru toate adaptoarele Hercules. Astfel obinem un
mesaj de eroare.
Dac modul grafic este activ, putem desena pe ecran. Dispunem de comenzi grafice
de baz ce permit poziionarea punctelor, trasarea de drepte, de dreptunghiuri sau de elipse.
Tabelul de mai jos prezint o mic recapitulare a instruciunilor existente.
Perechea de coordonate (x,y) corespunde unui punct pe ecran n mod grafic, i a
crui poziie real pe ecran depinde de modul utilizat i de parametrizarea sistemului de
coordonate prin instruciunea WINDOW. n mod obinuit, coordonatele (0,0) corespund
colului superior stng al ecranului.
Coordonatele ultimului punct sunt memorate de
QBASIC. Astfel c se poate continua desenul plecnd din acest punct fr a fi nevoie s
redefinim n mod explicit poziia. Dac avem nevoie ca acest punct s fie un punct de
plecare, putem utiliza coordonatele relative, ceea ce se specific prin cuvntul cheie STEP.
10.1.2. Instruciuni grafice n QBASIC
CIRCLE[STEP](X,Y),<radius>[,<color%>][,<start>,<end>[,<aspect>]]
Traseaz un arc de elips n jurul poziiei (X,Y) de raz <radius>, de culoare <color%>,
plecnd de la unghiul de deschidere <start> pn la unghiul de sfrit <end>, n radiani, cu
forma <aspect> (1=cerc).
DRAW <command strings$>
Traseaz o figur definit de <command strings$>.
LINE [STEP][(X1,Y1)-[STEP](X2,Y2)[,<color%>][,B[F]][,<style>]
Traseaz o linie ntre (X1,Y1) i (X2,Y2) de culoare <color%>. Dac se indic B traseaz
un dreptunghi n loc de o linie, iar dac se indic BF se va colora, <style> indicnd tipul de
linie folosit.
PAINT [STEP](X,Y)[,<color%>|<tile$>][,<bordercolor%>][,<background$>]
Deseneaz zona din jurul punctului (X,Y) n culoarea <color%> sau cu motivul <tile$>
curent sau indicat. Culoarea marginilor se poate defini cu <bordercolor%> i culoarea
fondului cu <backg-round$>
POINT (X,Y)
Returneaz atributul de culoare al punctului specificat.
PSET [STEP](X,Y)[,<color%>]
Traseaz un punct pe ecran n poziia (X,Y) de culoarea indicat sau culoarea curent.
PRESET [STEP](X,Y)[,<color%>]
Traseaz un punct pe ecran n poziia (X,Y) de culoarea fondului sau culoarea indicat.
PALETTE <attribute>,<color>
Atributul de culoare <attribute> primete culoarea <color> (numai pentru EGA i VGA).
PALETTE USING arrayname [(<index>)]
Seteaz atributele ecranului la valorile tabloului arrayname <index> reprezentnd indicele
76
**sfrit!
**comutare
IF ok% THEN
**funcioneaz
GOSUB afiaremod
**afieaz parametrii modului
END IF
SLEEP
**ateapt apsarea unei taste
IF INKEY$ = CHR$(27) THEN EXIT DO **ntrerupere prin <ESC>
LOOP
GOSUB ecran
END
afiaremod:
77
WIDTH cx%,cy%
**cadru
LOCATE 3,3
IF gx% THEN
PRINT USING ##*##grafic,##culori ;gx%;gy%;col%
LINE (80,65)-STEP (30,30), B
**exemplu de ptrat
CIRCLE (190,80), 18
**exemplu de cerc
dg% = (gx% -60) / (col% +2)
FOR i% = 1 TO col% -1
**tablou de culori
LINE (50 + i% * dg%,100)-(50+(i%+1) * dg%, gy% -3),i%,BF
NEXT i%
ELSE
PRINT Non grafic !
END IF
RETURN
ecran:
**ecran standard
SCREEN 0
WIDTH 80,25
CLS
RETURN
imposibil :
**ecran invalid
GOSUB ecran
PRINT SCREEN ;sc%;,;nume$;,imposibil !
ok% = 0
RESUME TEXT
***DATA pentru modurile text i grafice ***
***SCREEN caractere / linie, linii, culori, rezoluie X/Y, nume
DATA 0, 80, 25, 16, 0, 0, mod text
DATA 0, 80, 43, 16, 0, 0, mod EGA
DATA 0, 80, 50, 16, 0, 0, mod VGA
DATA 1, 40, 25, 2, 320, 200,CGA-grafic
DATA 1, 40, 25, 4, 320, 200,CGA/EGA -grafic
DATA 2, 80, 25, 2, 640, 200, CGA-grafic
DATA 3, 80, 25, 2, 720, 348, Hercules-grafic
DATA 4, 80, 25, 2, 640, 400, mod special
DATA 7, 40, 25, 16, 320, 200, EGA-grafic
DATA 8, 80, 25, 16, 640, 200, EGA-grafic
DATA 9, 80, 25, 16, 640, 350, EGA-grafic
DATA 9, 80, 43, 16, 640, 350, EGA-grafic/2
DATA 10, 80, 25, 4, 640, 350, EGA-grafic monocrom
DATA 10, 80, 43, 4, 640, 350, EGA-grafic monocrom/2
78
SCREEN 7
**comutare n modul 7 (EGA/VGA)
FOR i% = 199 TO 100 STEP -2 **trimite o rachet
PSET (250 - i%, i%)
t = TIMER : DO : LOOP UNTIL TIMER >t
PRESET (250 -i%,i%)
NEXT i%
FOR r% = 1 TO 50
**raza de expansiune 1 - 50
FOR i% = 1 TO 10
**10 puncte pe raz
w = RND*7
**unghi aleator
PSET (150 + r% * SIN (w),100 + r% * COS (w)), r% AND 7
SOUND 6000 + 500 * w, 3.1
**sunet...
NEXT i%
NEXT r%
FOR r% = 0 TO 60 **tergerea norului de artificii din interior spre
exterior
CIRCLE (150, 100), r%,0
CIRCLE (151,100),r%,0
t = TIMER : DO : LOOP UNTIL TIMER >t
NEXT r%
tergerea punctelor se obine prin trasarea unui cerc din ce n ce mai mare, de
culoarea fondului. Dar cum toate punctele ce nconjoar cercul nu sunt afectate de trasarea
unui cerc, se vor da dou instruciuni CIRCLE al cror centru este decalat cu un punct. Dac
ncercm s tergem una din aceste linii, vom observa c unele puncte rmn aprinse.
10.3 Desene i curbe
Cu instruciunile grafice prezentate la nceput, putem realiza toate traiectoriile pe care
le dorim, dac ele se compun din figuri geometrice de baz, cum sunt linia i elipsa.
Dimpotriv, traiectoriile oarecare sunt mai dificil de realizat, deoarece trebuie memorat
fiecare punct. Este o problem de matematic de a ti cum putem trasa o linie sau o curb
care nu este format din elemente de baz.
Cea mai simpl i mai cunoscut dintre liniile de acest tip este curba sinusoidal. Ea
este simplu de realizat, deoarece QBASIC dispune de funciile SIN() i COS(). Urmtorul
program permite trasarea unei curbe simple sinus, dup ce selectm n prealabil un mod
grafic.
***Trasarea unei sinusoide***
SCREEN 7
LINE (1,100) - (315,100)
FOR unghi = 0 TO 6.28 STEP.01
**de la 0 la 2 *PI
PSET (unghi * 50, 100 + 50 * SIN (unghi))
NEXT unghi
80
Obinem trasarea unui cerc. Instruciunea QBASIC care furnizeaz acelai rezultat
este:
CIRCLE (110,100),50
Trasarea cercului se face mai rapid. ntotdeauna, n realitate, QBASIC traseaz patru
arce de cerc pentru a reduce timpul de calcul.
Pot fi trasate i alte curbe, cum ar fi de exemplu curba logaritmic:
***Trasarea unei curbe logaritmice***
SCREEN 7
FOR i% = 1 TO 300
PSET (i%,200 - LOG (i%) * 10
NEXT i%
Operaia de scdere 200 - x din formula de calcul a poziiei y folosete la
reprezentarea obinuit n sistemul de coordonate. n QBASIC, punctul de coordonate (0,0)
se gsete n stnga sus, de unde se deduce calculul,
9-3-3.bas.
Dar exist n QBASIC o instruciune ce permite modificarea acestuia, i anume
WINDOW. Aceast instruciune poate converti sistemul de coordonate n sistem virtual, n
care coordonatele
transmise sunt convertite n coordonate fizice, i atunci punctul de
81
coordonate (0,0) se gsete n stnga jos. Dac se adaug cuvntul cheie SCREEN,
inversiunea este anulat, adic ordonata Y rmne situat n partea superioar a ecranului.
Uneori, graficele se compun din coloane. Acestea se realizeaz uor prin instruciunea
LINE. n exemplul care urmeaz se convertete o list de cifre ntr-o histogram. Valorile
sunt citite ntr-o list DATA i apoi sunt trasate n mod grafic 2 ntr-un sistem de coordonate
adaptat cu ajutorul instruciunilor WINDOW i SCREEN.
Dac folosim un adaptor hercules, va trebui ales modul grafic 3 (deci n prealabil este
lansat MSHERC.COM). Putem folosi n acelai mod o definiie mai mare, de exemplu 9, cu
adaptoarele EGA sau VGA. Deci lrgimea i nlimea sunt definite pe acelai tip de afiaj,
histograma folosind totui ntreaga nlime disponibil.
***Program pentru crearea unei histograme***
DECLARE SUB Histograma (tabel%())
DIM valori%(10)
**tablou pentru valori
FOR i% = 1 TO 10
READ valori %(i)
NEXT i%
SCREEN 7
**comutare n mod grafic
WINDOW (0,0) - (940,700) **adaptarea coordonatelor
Histograma valori%()
DATA 10, 30, 35, 20, 7
DATA 26, 13, 32, 28, 4
Acesta este programul principal pentru afiarea diagramei, histograma nsi fiind
trasat prin procedura SUB de mai jos. Vom crea mai nti tabloul n care sunt pstrate
valorile ce vor fi citite apoi din DATA. Procedura Histograma adapteaz dimensiunile,
deoarece ele trebuie s corespund n mod exact numrului de valori de afiat.
Toate valorile ntregi ale tabloului sunt desenate ntr-o histogram cu dou dimensiuni
reprezentat pe ecranul virtual de mrime (0,0)-(940,700), prin procedura Histograma, dup
selectarea modului grafic i definirea sistemului de coordonate.
SUB Histograma (tabel%0)
nb% = UBOND (tabel%)
FOR i% = 1 to nb%
IF tabel %(i%)>max% THEN max% = tabel%(i%)
NEXT i%
coef = 300 / max%
LINE (10,10)-(10,350)
**axele de coordonate
LINE - (630,350)
lrgime%=610 / nb%
FOR i% = 1 TO nb%
LINE (14+(i%-1) *lrgime%,350)-STEP(lrgime% - 4, tabel%(i%) * coef),,B
PAINT STEP (-2,2),CHR$(i%) + CHR$(256 - i%)
NEXT i%
END SUB
Colorarea coloanelor este realizat prin instruciunea PAINT. Dac se utilizeaz
opiunea F n instruciunea LINE, dreptunghiul este colorat n ntregime cu o culoare. Cum
afiarea histogramei trebuie s rmn independent de adaptorul grafic, renunm la
utilizarea culorilor.
Pentru a diferenia totui coloanele, putem indica un motiv de umplere cu PAINT. n
loc de a transmite un numr de culoare, transmitem un ir a crui succesiune de bii
82
reprezint un motiv. Pentru cazul cel mai simplu expus aici, aceast definiie provine din
numrarea coloanelor. Motivele obinute nu sunt n mod obligatoriu foarte estetice.
Dac se dorete folosirea unor motive sofisticate cu diferite unghiuri de haurare sau
cu puncte mai mult sau mai puin dense, trebuie mai nti definite aceste motive deoarece
QBASIC nu dispune de ele.
La nceputul programului se definete un tablou Motiv$() ce va conine motivele de
haurare. Dup aceasta, se va pute utiliza unul dintre aceste motive ntr-o viitoare
instruciune PAINT. Apelul lui PAINT va fi urmtorul:
PAINT STEP (2,2), Motiv$(i%)
Se presupune c nu exist mai multe coloane de haurat dect motivele din tablou.
Altfel, putem evita mesajul de eroare care apare n coloana a 10-a scriind:
PAINT STEP (-2,2), Motiv$(i%MOD 10) **umplerea coloanelor cu
motive
Prin introducerea funciei modulo, se utilizeaz doar restul mpririi lui i% la 10, rest
care este cuprins ntre 0 i 9.
S definim motivele de haurare, Motiv$(0) pn la Motiv$(9), a cror estetic poate fi
modificat dup dorin:
***Motive de umplere***
DIM SHARED Motiv$(9)
Motiv$(0) = CHR$(&HFF)
Motiv$(1) = CHR$(&H44)
Motiv$(2) = CHR$(&HAA)
Motiv$(3) = CHR$(&HFF)+CHR$(0)
Motiv$(4) = CHR$(&HAA)+CHR$(&H55)
Motiv$(5) = CHR$(&HAA)+CHR$(0)
Motiv$(6) = CHR$(&H88)+CHR$(&H44)+CHR$(&H22)+CHR$(&H11)
Motiv$(7) = CHR$(&H11)+CHR$(&H22)+CHR$(&H44)+CHR$(&H88)
Motiv$(8) = CHR$(&H88)+CHR$(&H44)+CHR$(&H22)+CHR$(&H11)+
CHR$(&H11)+CHR$(&H22)+CHR$(&H44)
Motiv$(9) = CHR$(0)+CHR$(&H81)+CHR$(&H42)+CHR$(&H24)+
CHR$(H18)
10.4. Crearea funciilor tridimensionale (3D)
n general, reprezentarea figurilor geometrice se face doar n dou dimensiuni X i Y,
adic o reprezentare n plan. Totui putem crea obiecte tridimensionale pe ecran. Se
observ, c pentru a obine o reprezentare corect, n trei dimensiuni, rezoluia ecranului
trebuie s fie ridicat. Cu adaptoare CGA se pot realiza desene n trei dimensiuni, dar
rezultatul nu va fi deosebit.
Pentru a crea o a treia dimensiune, profunzimea, utilizm o a treia coordonat Z.
Prezentm un mic program de afie a unei funcii tridimensionale. Putem de asemenea
reprezenta parametrii X i Y ai funciei prin FUNCTION YFunc
Y = f (X,Z)
Pentru a vedea efectul tridimensional, aceast curb este reprezentat oblic, ca i
cum am privi din partea stng sus. Vom obine i suprafee ondulate precum valurile mrii.
n mod intenionat programul este scurt, ceea ce permite orice perfecionare a acestei
reprezentri. Pentru a reprezenta o funcie dat se execut urmtoarele etape:
83
Traseaz n sus
Traseaz n jos
Traseaz spre stnga
Traseaz spre dreapta
Traseaz n sus spre dreapta
Traseaz n sus spre stnga
Traseaz n jos spre dreapta
Traseaz n jos spre stnga
Cursorul este deplasat fre trasare
Dup urmtoarea trasare, cursorul revine la
poziia iniial
M<X,Y>
Traseaz pn n punctul (X,Y). X i Y sunt
coordonate absolute dac nu sunt precedate de
un
semn.
C<color>
Definete culoarea pentru instruciunile
urmtoare, <color> lund valori ntre 0 i 3.
P<fond>,<bord>
Coloreaz figura nchis prin <bord> de culoarea
<fond>. Cursorul trebuie s fie poziionat n
interiorul acestei figuri.
A<unghi>
Definete unghiul de rotaie pentru toate
instruciunile urmtoare. Valorile posibile pentru
<unghi> sunt cuprinse ntre 0 i 3, unghiul fiind
obinut prin nmulirea cu 90 (0=0, 1=90, 2=180,
3=270).
TA<unghi>
Funcioneaz ca i A, dar unghiul poate fi ales
ntre -360 i 360.
S<coef>
Definete un coeficient de mrire pentru
instruciunile urmtoare. Toate deplasrile relative sunt mrite cu <coef> /4.
Valoarea implicit pentru <coef> este 4.
Cu ajutorul acestei instruciuni putem transforma anumite probleme care, cu ajutorul
instruciunii LINE, vor fi prea complexe i ocup prea mult spaiu n memorie. Acest lucru
este evident n special la modificrile unghiurilor cu DRAW.
O astfel de problem apare imediat n momentul n care dorim s plasm legende ntrun grafic. Atunci ar trebui s plasm cifre mici sub axe, sau chiar s le rotim, mai ales pentru
liniile verticale.
Din pcate lipsete, din lista de comenzi DRAW, posibilitatea de afiare a caracterelor.
Vom prezenta o posibilitate de afiare a cifrelor la o scar oarecare i care poate suporta o
rotaie de 90, 180 sau 270 grade. Metoda folosit apare ca ocupnd mult spaiu, dar ea
propune totui o extensie foarte supl a mijloacelor grafice ale QBASIC-ului.
Ideea de baz este utilizarea macrourilor DRAW pentru obinerea caracterelor. Dup
ce realizm acest lucru, putem schimba uor scara sau efectua o rotaie cu ajutorul
comenzilor DRAW Sn i An.
85
**punct
**caractere mari
**invers
**caractere foarte mari
**rotire cu 90 grade
**poziia iniial x
87
mingey% = 5
mingedx = 1
mingedy = 1
**i y
**deplasare x
**i y
DO
**bucl...
LOCATE mingey %, mingex%
PRINT *;
**desenarea mingii
FOR i% = 1 TO 300:NEXT i%
**tergerea mingii
**numai EGA/VGA !
88
SCREEN 3
**numai Hercules !
culoare% =14
DIM soare%(493)
CIRCLE (100,100), 10, culoare%
**trasarea soarelui
PAINT (100,100),culoare%
**colorarea soarelui
FOR w=0 TO 6.28 STEP .628
**trasarea razelor
LINE (100,100) - STEP (20 * SIN (w), 20 * COS(w)), culoare%
NEXT w
GET (80,80) - STEP (40,40),soare%
**salvarea imaginii n tabloul
**soare%
CLS
**tergerea imaginii
LINE (1,180) - (320,200),1,BF
**orizontul
FOR w = -1.65 TO 1.65 STEP .05
PUT (150+120*SIN(w), 150 - 100 *COS(w)), soare%, XOR
**afiarea soarelui
t = TIMER : DO : LOOP WHILE t = TIMER
**o mic pauz...
PUT (150+120*SIN(w), 150 - 100 *COS(w)), soare%, XOR
**tergerea soarelui
NEXT w
Derularea programului este urmtoarea: ncepem prin comutarea ntr-un mod grafic.
Culoarea soarelui se poate selecta prin variabila culoare%.
Definim apoi un tablou de variabile ce va conine datele imaginii. Mrimea necesar
pentru acest tablou este n funcie de diferii parametri, cum ar fi modul grafic i dimensiunea
imaginii. Trebuie s mprim totalul de puncte orizontale ale imaginii de extras, la numrul de
bii pe nregistrare i rotunjim rezultatul obinut. n cazul unui tablou INTEGER n care fiecare
nregistrare are 16 bii i al unei imagini de 41 puncte, obinem un numr de nregistrri pe
linie de 41/16=2.2625, deci trei nregistrri INTEGER. Acest numr se nmulete cu numrul
de linii al imaginii, adic cu 41, obinnd valoarea 123. Acum rezultatul obinut se nmulete
cu numrul de bii de culoare. n modul grafic 7, exist 16 culori posibile, deci sunt necesari 4
bii pentru fiecare punct. Numrul total de nregistrri INTEGER devine deci 123*4=492, la
care trebuie s adugm 4 octei, ceea ce nseamn nc 2 nregistrri, pentru gestionarea
datelor. Rezult astfel o dimensiune a tabloului de 493 de elemente (fr a uita elementul 0).
Apoi se traseaz imaginea soarelui i cu ajutorul funciei GET salvm imaginea n
tabloul soare%(). Dup aceasta ecranul este ters, se afieaz orizontul i ncepe bucla de
afiare.
Aceast bucl se deruleaz ntre unghiurile -PI/2 i PI/2, adic o curb de la stnga
spre n sus i apoi ctre dreapta. Instruciunea PUT deseneaz apoi soarele la poziia
calculat cu ajutorul funciilor SIN i COS. Instruciunii PUT i se transmite numai poziia, n
timp ce nlimea i limea sunt memorate n tabloul de ntregi. Trebuie s mai indicm i
numele tabloului, iar culoarea i modul de afiare se pot aduga odat cu parametrii
complementari. n acest caz, culoarea este atribuit n variabila culoare%.
Modul de afiare al instruciunii PUT arat cum imaginea memorat va fi trasat pe
ecran. Se pot utiliza urmtoarele moduri:
PSET
Traseaz imaginea memorat tergnd-o pe cea veche.
PRESET
Traseaz imaginea memorat n culori inverse i
tergnd vechea imagine.
XOR
Traseaz o imagine memorat pstrnd fondul.
89
OR
AND
90
Parametrul pagin, din al treilea argument, este cel n care textele i graficele sunt
scrise, n timp ce pagina specificat n ultimul argument este cea afiat.
Putem testa aceasta foarte uor, chiar i n mod text. n programul urmtor, se vor
completa paginile de la 0 la 3 i nainte de afiare se definete prin instruciunea SCREEN
pagina care va fi modificat dup aceea.
***Exemplu de comutare psgini cu instruciunea SCREEN***
**Se presupune utilizarea unui adaptor CGA/EGA/VGA, avnd 4 pagini**
FOR pag% = 0 TO 3
SCREEN, ,pag%
CLS
FOR i% = 1 TO 100
PRINT pagina ;pag%
NEXT i%
NEXT i%
**paginile de la 0 la 3
**sunt tratate
**scrierea paginilor
**pagina urmtoare
SCREEN , ,0
PRINT Indicai numrul paginii:;
**n pagina 0 se face o cerere
DO
DO
key$ = INKEY$
LOOP UNTIL LEN (key$)
**se ateapt apsarea unei taste
IF key$ = CHR$(27) THEN EXIT DO **ntrerupe prin <ESC>
SCREEN , , , VAL (key$)
**afiarea paginii
LOOP
SCREEN , ,0,0
**reactivarea paginii 0
Acest program nu prezint nici un fel de securitate. Aceasta nseamn c putem utiliza
numerele de pagin i de la 4 la 9. Cu majoritatea adaptoarelor putem activa paginile de la 4
la 7 care vor fi reprezentate printr-un ecran gol. Editarea numerelor de pagin 8 sau 9
antreneaz un mesaj de eroare, deoarece aceste pagini nu exist.
10. 7. Curbe BEZIER
n afar de figurile geometrice obinuite ce formeaz majoritatea imaginilor i
desenelor, exist i forme curbe din calculele matematice. Demonstraia s-a fcut n
paragraful precedent printr-o curb sinusoidal.
O alt posibilitate, mult mai complicat dar foarte util pentru anumite aplicaii, const
n calcularea unei curbe plecnd de la anumite puncte caracteristice i innd cont de pantele
extremitilor, de valorile msurate sau de rotunjirea lor. Pentru aceasta exist numeroi
algoritmi matematici, relativ complicai. Fr a intra n amnunte de ordin matematic, vom
prezenta totui un exemplu de calcul al unei astfel de curbe: curba BEZIER.
Ideea de baz n calcularea acestor curbe este stabilirea unei posibiliti de realizare a
curbelor oarecare fr funcii matematice exacte, ci doar calculnd punctele de sprijin. Astfel,
P. BEZIER a dezvoltat acest procedeu pentru societatea Renault pentru a putea afia i
modifica pe un calculator prile rotunjite ale unui automobil.
O astfel de curb se ntinde ca un elastic n jurul punctelor de sprijin, dnd astfel forma
curbei. n programul care urmeaz i care lucreaz n mod ecran 9 EGA/VGA, sunt indicate
cteva puncte de sprijin sub form de linii de date i la crora le putem atribui i un grad de
importan.
91
ncepem n mod normal prin trasarea poligonului, aceasta reprezentnd doar nceputul
calculrii i trasrii curbelor Bezier.
Numrul de puncte al imaginii de calculat se poate defini prin urmtoarea linie:
s% = nb%*3
Iniial este vorba de un numr de puncte obinut prin triplarea numrului de puncte de
sprijin. Dac mrim acest numr, curba devine mai precis i n consecin mai rotunjit, dar
n acelai timp crete i timpul de calcul !
***Curbe bezier n QBASIC***
DIM xk%(50),yk%(50),g%
SCREEN 9
**comutarea n mod grafic
CLS
PRINT ***CURBE BEZIER***
FOR i% = 1 TO 50
READ xk%(i%),yk%(i%),g%
**citirea punctelor de sprijin
IF xk%(i%) = -1 THEN EXIT FOR
FOR j% = 1 TO g% -1
i% = i% +1
xk%(i%) = xk%(i%-1)
yk%(i%) = yk%(i%-1)
NEXT j%
NEXT i%
nb% = i% -1
DATA 50, 50, 1
DATA 400, 50, 1
DATA 550, 10, 5
DATA 600, 50, 1
DATA 550, 80, 1
DATA 400, 150, 1
DATA 200, 150, 2
DATA 50, 50, 2
DATA -1, -1, -1
PSET (xk%(1),yk%(1)),1
FOR i% = 2 TO nb%
LINE -(xk%(i%),yk%(i%)),1
NEXT i%
**trasarea poligonului
PSET (xk%(1),yk%(1)),2
**primul punct
s% = nb%*3
FOR t% = 1 TO s% -1
u = t%/s%
p1% = xk%(1)
p2% =yk%(1)
FOR i% = 0 TO nb%
v=1
FOR j% =i%+1 TO nb%
v=v * j%
NEXT j%
92
v = v *u ^i%
v = v * (1-u) ^(nb%-i%)
p1% = p1%+xk%(i%) * v
**ajustarea pantei
p2% = p2%+yk%(i%) * v
NEXT i%
LINE -(p1%, p2%)
**trasarea poriunii curbe
NEXT t%
Din acest exemplu rezult lipsa acut a unui coprocesor matematic n QBASIC.
10.8. Exerciii
S se descrie un program care s coloreze n mod ciclic cte unul din cele trei cercuri,
formnd un foc tricolor.
93
94
Exemple:
1. Unele informaii despre angajaii unei societi comerciale pot fi nregistrate n fiierul
PERSONAL.DAT, ca articole de tipul:
PERSOANA
MARCA
I(4)
NUME.PRENUME
A(30)
FUNCIA
A(15)
VECHIMEA
I(2)
SALARIU
RS(9,2)
unde :
PERSOANA - reprezint numele articolului;
MARCA - este un cmp numeric de tip ntreg, format din 4 cifre;
NUME.PRENUME - este un cmp alfanumeric format din maximum 15 caractere;
VECHIMEA - este un cmp numeric de tip ntreg, format din 2 cifre;
SALARIU - este un cmp numeric n simpl precizie, format din 9 caractere numerice cu
dou cifre la partea zecimal.
Structura fiierului PERSONAL.DAT, format din patru articole descris anterior, ar putea
fi de exemplu, urmtoarea:
1001
1097
2049
9999
EOF
VASILIU ION
POPA VASILE
IORGA NICOLAE
AVRAM MIRCEA
INGINER
MAISTRU
CONTABIL
MUNCITOR
15
20
19
24
60000.75
50000.30
64000.05
47000.95
2. Unele informaii referitoare la studenii unei secii dintr-o facultate se pot nregistra n
fiierul STUDENI.DAT, organizat pe disc, cu articole de tipul:
STUDENT
NRMAT
NUMEP RENUME
I(5)
A(30)
AN.STUDIU
I(1)
NR.DISC EX(1)
I(2)
I(2)
EX(NR.DISC)
. . . I(2)
...
unde:
STUDENT - reprezint numele articolului;
NRMAT - este un cmp alfanumeric de tip ntreg, format din 5 cifre, cmp ce va conine,
pentru un student oarecare, numrul matricol;
NUME.PRENUME - este un cmp alfanumeric, format din maximum 30 de caractere, cmp
ce conine numele studentului cu numrul matricol NRMAT;
AN.STUDIU - este un cmp numeric de tip ntrerg, format dintr-o cifr, cmp ce va conine
anul de studiu n care se afl studentul cu numrul matricol NRMAT;
NR.DISC - este un cmp numeric de tip ntreg, format din dou cifre, cmp ce va conine
numrul de discipline prevzute cu examen sau alte forme de verificare la anul AN.STUDIU,
pentru studentul cu numrul matricol NRMAT;
EX(1),...EX(NR.DISC) - sunt cmpuri numerice de tip ntreg, formate din cte dou cifre,
cmpuri ce vor conine notele obinute de studentul cu numrul matricol NRMAT la examene
i verificri.
Structura fiierului STUDENTI.DAT, format din trei articole de tipul descris anterior, ar
putea fi, de exemplu urmtoarea:
12345 ROMAN SEVERIN
23435 VCREANU ION
56710 CMPEANU RICA
EOF
3 12 8 7 9 6 10 8 9 7 9 8 6 5
1 10 7 9 8 8 6 5 9 9 7 6
3 11 4 6 9 3 5 5 5 6 4 6 2
95
Din exemplele prezentate anterior putem constata c articolele unui fiier pot fi cu
format fix (toate sunt formate din acelai numr de cmpuri) sau cu format variabil
(numrul de cmpuri difer de la un articol la altul). Fiierul PERSONAL.DAT este alctuit din
articole cu format fix, iar fiierul STUDENI.DAT este alctuit din articole cu format variabil.
Pentru regsirea articolelor dintr-un fiier, se recurge la identificarea lor prin chei.
Cheia este un cmp din cadrul articolului i reprezint identificatorul acestuia. n exemplele
anterioare, cmpurilor MARCA i NRMAT se pot utiliza drept chei.
Un fiier de date poate fi asimilat cu un tablou bidimensional, dar se deosebete de
acesta prin:
- tabloul are un numr fix de linii, iar fiecare linie este format dintr-un numr fix de elemente
de acelai tip (numeric sau alfanumeric), pe cnd fiierul este format dintr-un numr
neprecizat de articole (putnd fi chiar vid), iar fiecare articol poate fi format dintr-un numr
variabil de cmpuri, cmpurile putnd fi de tipuri diferite (unele numerice, altele
alfanumerice);
- liniile unui tablou bidimensional sunt stocate n memoria intern i se utilizeaz o singur
dat, de ctre un singur program, pe cnd articolele unui fiier se pot stoca pe un suport
extern de informaie (floppy disk sau hard disk) i pot fi utilizate de mai multe ori n programe
diferite.
11.2. Operaii de baz privind prelucrarea fiierelor
Orice fiier trebuie privit ca o structur de date dinamic, avnd o evoluie n timp,
evoluie dictat de operaiile ce pot fi efectuate asupra fiierului. Aceste operaii sunt:
1. Crearea - scrierea de articole n fiier.
2. Consultarea - citirea articolelor din fiier n vederea prelucrrii lor. Operaia de consultare
nu modific starea fiierului.
3. Actualizarea - punerea la zi a fiierului prin:
- modificarea unor articole
- adugarea de noi articole;
- tergerea unor articole.
4. Sortarea - ordonarea articolelor din fiier dup valorile unuia sau mai multor cmpuri,
denumite chei.
5. Extragerea - obinerea mai multor fiiere pornind de la unul singur.
6. Regruparea sau reuniunea - obinerea unui singur fiier, pornind de la mai multe fiiere.
Fiecare operaie de actualizare precum i operaia de sortare, schimb starea
fiierului. Operaiile de actualizare, sortare i regrupare au sens numai pentru fiierele
organizate pe disc.
96
97
98
Fiiere secveniale
Fiierele secveniale se pot organiza pe orice suport, accesul la articole fcndu-se
secvenial. Articolele pot fi cu format fix sau variabil.
ntr-un fiier secvenial, datele care compun un articol se nscriu sub forma unei secvene de
caractere ASCII, cmp dup cmp, n ordinea n care au fost transmise. Regsirea lor este
posibil numai n aceast ordine. Datele care compun un articol al unui fiier secvenial,
organizat pe disc, trebuie separate ntre ele prin caracterul virgul, pentru a pute fi regsite
cu uurin, n vederea unor prelucrri ulterioare. Inserarea virgulelor ntre dou valori
consecutive dintr-un articol rmne n sarcina programatorului, iar dup valoarea ultimului
cmp din articol nu se mai nregistreaz acest caracter pe suport. O valoare de tip
alfanumeric poate fi ncadrat ntre ghilimele sau poate fi nencadrat.
Instruciunile i funciile care opereaz asupre fiierelor secveniale sunt urmtoarele:
OPEN, PRINT#, PRINT# USING, WRITE#, INPUT#, LINE INPUT#, INPUT&, CLOSE, LOC,
LOF i EOF.
Fiiere cu acces direct
Fiierele cu acces direct se pot organiza numai pe disc, accesul la articole putnd fi
direct sau mixt. Articolele unui fiier cu acces direct sunt cu format fix, deci toate au aceeai
lungime, iar informaiile dintr-un articol sunt reprezentate ntr-un cod binar mpachetat.
Deoarece toate articolele au aceeai lungime, s presupunem la, se poate calcula relativ
simplu poziia oricrui articol n fiier. Dac primul articol din fiier se gsete la adresa A,
atunci al doilea articol se va gsi la adresa A+la, al treilea articol va fi la adresa A+2la,
.a.m.d., al n-lea articol se va gsi la adresa A+(n-1)la. innd cont de cele relatate
anterior, constatm c de fapt accesul la un articol se poate face indicnd, ntr-o instruciune
de scriere sau de citire, numrul de ordine al acestuia n cadrul fiierului.
Instruciunile i funciile care opereaz asupra fiierelor cu acces direct sunt
urmtoarele: OPEN, FIELD, LSET, RSET, PUT, GET, CLOSE, LOC, LOF, CVI, CVS, CVD,
MKI$, MKS$ i MKD$.
Observaie. n literatura de specialitate, fiierele cu acces direct mai sunt cunoscute
i sub denumirtea de fiiere aleatoare.
11.3. Instruciuni i funcii utilizate n prelucrarea fiierelor
secveniale
Instruciunea OPEN
Sintaxa:
a)
b)
OPEN tip2,[#]nrfis,numefis[,la]
sau
Efectul:
99
Deschide fiierul cu numele numefis, i atribuie numrul nrfis, precizeaz tipul acestu
fiier i lungimea articolelor din fiier. Semnificaia parametrilor din sintaxa instruciunii este
urmtoarea:
numefis - specificaie de fiier;
nrfis - numrul atribuit fiierului numefis;
tip1 - precizeaz tipul fiierului (de intrare sau de ieire) i deci, n mod implicit
precizeaz ce operaie poate fi efectuat asupra acestuia. Valoarea acestui parametru poate
fi unul din cuvintele rezervate:
OUTPUT - fiier secvenial de ieire (fiier n care se vor scrie articole);
INPUT - fiier secvenial de intrare (fiier din care se vor citi articole);
APPEND - fiier secvenial de ieire cu extensie (fiier n care, dup deschidere,
suntem poziionai la sfrit i avem posibilitatea de a aduga (a scrie) noi articole, n
continuarea celor existente).
tip2 - este o expresie de tip alfanumeric prin care se precizeaz tipul fiierului, iar
primul caracter din expresie trebuie s fie unul din urmtoarele:
O - fiier secvenial de ieire (fiier n care se vor scrie articolele);
I - fiier secvenial de intrare (fiier din care se vor citi articolele);
A - fiier secvenial de ieire cu extensie (fiier n care , dup deschidere, suntem
poziionai la sfrit i avem posibilitatea de a aduga (a scrie) noi articole, n continuarea
celor existente);
R - fiier de intrare-ieire cu acces direct (fiier din care se pot citi unele articole i n
care se pot scrie unele articole);
acces - este un parametru care trebuie utilizat atunci cnd se lucreaz n reea de
microcalculatoare, deoarece este necesar protejarea fiierelor fiecrui utilizator sau uneori
este necesar accesul simultan al mai multor utilizatori la acelai fiier. Valoarea acestui
parametru poate fi unul din cuvintele rezervate:
SHARED - nu exist restricie nici la citire i nici la scriere;
LOCK READ - restricie la citire;
LOCK WRITE - restricie la scriere;
LOCK READ WRITE - restricie att la citire, ct i la scriere.
la - lungimea articolului. Valoarea implicit a acestui parametru este 128, dar poate lua
valori de la 1 pn la 32767. n cazul fiierelor secveniale se neglijeaz, dar trebuie
precizat pentru fiierele cu acces direct.
Observaie. Dac parametrul acces lipsete, fiierul poate fi deschis pentru citire i scriere
ori de cte ori se solicit printr-un anumit program, dar nici un alt program nu mai poate s
aib acces la acest fiier astfel deschis.
Instruciunea CLOSE
Sintaxa:
100
Efectul:
Se utilizeaz pentru a scrie valorile expresiilor din list n fiierul secvenial cu numrul
nrfis. Pentru a spori lizibilitatea programului, se recomand ca lista de expresii s conin
numele cmpurilor componente ale unui articol, separate prin virgul. Deosebirea ntre
instruciunile PRINT# i WRITE# const n faptul c WRITE# insereaz automat o virgul
ntre dou valori consecutive, iar valorile alfanumerice sunt delimitate de ghilimele.
Dup ultima valoare, corespunztoare ultimei expresii din list, se va insera un marcaj de
sfrit de linie, materializat printr-o succesiune de dou caractere (CR i LF). Trebuie
s facem precizarea c, spre deosebire de cazul instruciunii PRINT#, cnd construcia unui
articol se poate face cu ajutorul mai multor instruciuni PRINT#, instruciunea WRITE#
consider articolul ca fiind format doar din attea cmpuri ct expresii sunt n list.
Instruciunea INPUT#
Sintaxa:
INPUT #nrfis, list de variabile
Efectul:
Citete datele din fiierul secvenial cu numrul nrfis i le atribuie variabilelor din list,
deci datele sunt transferate din fiier n memoria intern. Pentru a spori claritatea
programelor, se recomand ca variabilele prezente n list s reprezinte cmpurile unui
articol i s fie desprite prin virgul. Tipul valorilor citite din fiier trebuie s coincid cu tipul
variabilelor din list. Transferul datelor din fiier n memoria intern se ncheie numai la
epuizarea listei de variabile sau la epuizarea fiierului. Precizm c exist posibilitatea de a
citi un articol dintr-un fiier secvenial prin mai multe instruciuni INPUT#, dar nu se
recomand utilizarea acestei practici.
n interiorul unui articol dintr-un fiier secvenial, o dat este individualizat pri
totalitatea caracterelor ASCII cuprinse:
- ntre nceputul articolului i prima virgul sau sfritul articolului;
- ntre dou virgule sau ntre o virgul i sfritul articolului.
Instruciunea LINE PUT#
Sintaxa:
LINE INPUT#nrfis, vir
Efectul:
Citete un articol din fiierul secvenial cu numrul nrfis i l transfer n memoria
intern n variabila alfanumeric precizat prin vir, a crei lungime poate fi de maximum 255
de caractere. Trebuie precizat c, n cazul instruciunii LINE PUT#, caracterul virgul (,),
inserat ntre dou date consecutive, i pierde semnificaia de separator al datelor din articol,
articolul fiind considerat ca format dintr-o singur dat, alctuit din totalitatea caracterelor
situate ntre dou marcaje consecutive de sfrit de linie.
102
LOF(nrfis)
EOF(nrfis)
INPUT$(n,nrfis)
Efectul
n cazul fiierelor cu acces direct, funcia LOC are
ca valoare numrul de ordine al ultimului articol
scris sau citit n/din fiierul cu numrul nrfis, iar n
cazul fiierelor secveniale are ca valoare numrul
de sectoare scrise sau citite n/din fiierul cu
numrul nrfis, din momentul deschiderii acestuia.
Un sector este format din 128 octei.
Are ca valoare un n umr natural ce reprezint
lungimea fiierului cu numrul nrfis, exprimat n
octei.
Se folosete pentru a verifica dac s-a citit marca
de sfrit de fiier pentru fiierul cu numrul nrfis.
Are valoarea 0 (fals) dac nu s-a citit marca de
sfrit de fiier i are valoarea -1 (adevrat) dac a
fost citit aceast marc.
Are ca valoare un ir format din n caractere, citite
din fiierul deschis n prealabil, cu numrul nrfis.
Citirea se face ncepnd de la poziia curent.
11.4. Aplicaii
Problema 1
S se elaboreze un program QBASIC, prin care s se creeze, pe discul din unitatea
implicit ,fiierele secveniale:
ANGAJAI.DAT, PERSONAL.DAT i SALARII.DAT, cu articole de tipul:
MARCA
I(5)
NUME
A(20)
P E R S OAN A
FUNCIA
VRSTA
A(15)
I(2)
VECHIME
I(2)
SALARIU
RS(9,2)
Crearea celor trei fiiere se va face introducnd datele de la tastatur, n regim dialogal, iar
acelai articol se va scrie n fiecare fiier, dup cum urmeaz:
- scrierea n fiierul ANGAJAI.DAT se va face cu instruciunea PRINT#;
- scrierea n fiierul PERSONAL.DAT se va face cu instruciunea PRINT# USING;
- scrierea n fiierul SALARII.DAT se va face cu instruciunea WRITE#.
n final, s se afieze pe monitor numrul de articole din fiecare fiier.
Rezolvare. Pentru a numra cte articole au fost scrise n fiecare fiier,vom folosi o
variabil K, pe care o iniializm cu zero, iar dup scrierea unui articol n fiecare din cele trei
fiiere, valoarea variabilei K se va mri cu o unitate. De asemenea, vom utiliza i o variabil
A$, pe care o iniializm cu irul vid, iar atta timp ct valoarea ei este diferit de N sau n,
vom introduce articole n cele trei fiiere.
De fapt, pentru rezolvarea problemei trebuie s parcurgem urmtorii pai:
P1. Iniializm variabila K cu zero i variabila A$ cu irul vid.
P2. Deschidem cele trei fiiere pentru ieire.
103
REM
REM +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
REM crearea a trei fiiere secveniale pe disc.
REM +- - - - - - - - - - - - - - - - - - - - - - - - - - - - +
REM
104
105
Problema 2
S se nchid sesiunea de lucru n QBASIC i cu comanda TYPE a sistemului de
operare MS-DOS, s se tipreasc pe ecran coninutul fiierelor: ANGAJAI.DAT,
SALARII.DAT i PERSONAL.DAT, n aceast ordine. Ce concluzii se pot trage?
Rezolvare.
SYSTEM <CR>
A>TYPE ANGAJAI.DAT<CR>
1234
1235
1236
2345
2346
2567
A>TYPE SALARII.DAT<CR>
1234,
1235,
1236,
2345,
2346,
2567,
ANDRONACHE EMANUEL,INGINER;46,20,62000.65
BUCLAE SORIN,INGINER EF;46,21,70123.96
BDU CRISTIAN,INGINER,47,20,58987.05
BIL MARIUS,TEHNICIAN PR,45,25,61967.15
BURGHEL MARIA,OPERATOR,40,22,56458.75
CMPEAN CRISTIAN,MUNCITOR,48,26,71900
A>TYPE PERSONAL.DAT<CR>
1234
1235
1236
2345
2346
2567
Concluzii
1. Datele numerice din fiierul ANGAJAI.DAT sunt precedate i urmate de cte un
spaiu, pe cnd datele numerice din fiierul SALARII.DAT nu sunt precedate i urmate de
spaiu.
2. Datele alfanumerice din fiierul ANGAJAI.DAT nu sunt delimitate de ghilimele, pe
cnd datele alfanumerice din fiierul SALARII.DAT sunt delimitate de ghilimele.
3. Fiierele ANGAJAI.DAT i SALARII.DAT au dimensiunea mai mic dect fiierul
PERSONAL.DAT i articolele lor nu au toate aceeai lungime, pe cnd articolele fiierului
PERSONAL.DAT au aceeai lungime.
Din cele constatate, se pune n mod natural urmtoarea ntrebare; care din cele trei
instruciuni este mai recomandat la crearea unui fiier? Dup prerea personal a autorului,
este instruciunea PRINT# USING, deoarece datele sunt nregistrate n fiier ntr-o form mai
ordonat i pot fi urmrite cu mai mult uurin atunci cnd se dorete o verificare a
106
corectitudinii acestora, caz n care fiierul poate fi listat la imprimant, de sub MS-DOS, prin
comanda:
A>TYPE PERSONAL.DAT LPT1:
Problema 3
S se actualizeze fiierul PERSONAL.DAT, n sensul c se vor aduga noi articole la
sfritul fiierului (articolele sunt de aceleai tip cu cele existente n fiier). n final s se
tipreasc numrul articolelor adugate n fiier.
Rezolvare. Pentru a numra cte articole au fost adugate n fiier, vom folosi o
variabil K, pe care o iniializm cu zero, iar dup adugarea unui articol n fiier mrim
valoare variabilei K cu o unitate. i de aceast dat vom utiliza variabila A$, pe care o
iniializm cu irul vid, iat atta timp ct valoarea ei este diferit de N sau n, vom aduga
articole n fiier.
Deci, pentru rezolvarea problemei, trebuie s parcurgem urmtorii pai:
P1. Iniializm variabila K cu zero i variabila A$ cu irul vid.
P2. Deschidem fiierul pentru ieire cu extensie.
P3. Atta timp ct A$ nu este N sau n:
- introducem de la tastatur valorile cmpurilor componente ale unui articol;
- scriem articolul n fiier (n continuarea celor existente);
- mrim valoarea variabilei K cu o unitate i introducem, pentru A$, valoarea N sau n,
dac nu mai avem articole de adugat, sau orice alt valoare n caz contrar (de preferat
ENTER).
P4. nchidem fiierul i afim valoarea variabilei K.
Programul QBASIC.
10 REM
20 REM +- - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - +
30 REM Actualizarea unui fiier secvenial de pe disc
40 REM prin adugarea de noi articole, la sfritul
50 REM fiierului
60 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
70 DEFINT M,V:DEFSTR F,N:DEFSNG S
80 F1 = #### , descriptor pentru cmpul MARCA
90 F2 = \
\ , descriptor pentru
cmpul NUME
100 F3 = \
\ , descriptor pentru
cmpul FUNCIA
110 F4 = ## , descriptor pentru cmpul VRSTA
120 F5 = ## , descriptor pentru cmpul VECHIMEA
130 F6 = ######:## descriptor pentru cmpul SALARIU
140 F = F1+F2+F3+F4+F5+F6 descriptor pentru ntregul
articol
150 K=0:A$=
160 OPEN PERSONAL.DAT FOR APPEND AS #1
170 WHILE NOT (A$=N OR A$=n)
180 INPUT Marca : ;MARCA
190 INPUT Numele : ;NUME
200 INPUT Funcia : ;FUNCIA
210 INPUT Vrsta : ;VRSTA
107
108
Programul QBASIC
10 REM
20 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
30 REM | Consultarea unui fiier secvenial de pe disc |
40 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
50 REM
60 DEFINT M,V:DEFSTR F,N
70 DEFSNG S
80 F1 = ####
descriptor pentru cmpul MARCA
90 F2 = \
\ descriptor pentru
cmpul NUME
100 F3 = \
\ descriptor pentru cmpul
FUNCIA
110 F4 = ## descriptor pentru cmpul VRSTA
120 F5 = ## descriptor pentru cmpul VECHIMEA
130 F6 = ######.## descriptor pentru cmpul SALARIU
140 F = F1+F2+F3+F4+F5+F6 descriptor pentru ntregul
articol
150 K=0
160 OPEN PERSONAL.DAT FOR INPUT AS #1
170 WHILE NOT EOF(1)
180 INPUT 1,MARCA,NUME,FUNCIA, VRSTA,VECHIME,
SALARIU
190 PRINT USING F; MARCA, NUME, FUNCIA, VRSTA
VECHIME, SALARIU
200 K=K+1
210 WEND
220 CLOSE #1
230 PRINT Din fiier s-au citit ;K; articole.
240 END
RUN
1234 ANDRONACHE EMANUEL INGINER
46 20 62000.65
1235 BUCLAE SORIN
INGINER EF
46 21 70123.96
1236 BDU CRISTIAN
INGINER
47 20 58987.05
2345 BIL MARIUS
TEHNICIAN PR
45 25 61967.15
2346 BURGHEL MARIA
OPERATOR
40 22 56458.75
2567 CMPEAN CRISTIAN
MUNCITOR
48 26 71900.00
3456 BUTIC LILIANA
ADMINISTRATOR 44 20 65980.00
3467 IACOBESCU NUCOLAE
CONTABIL
46 22 69876.00
3458 GIURGIULESCU MARIA
ECONOMIST
40 16 69879.55
3459 HELJIU MARIUS
DIRECTOR
45 20 93999.96
Din fiier s-au citit 10 articole
ok
b) Se nchide sesiunea de lucru n QBASIC prin comanda SYSTEM i se revine n
MS-DOS. Pe ecran se va sfia prompter-ul de sistem, de exemplu A>. n continuare se va
introduce comanda:
A>TYPE PERSONAL.DAT LPT1:<CR>
i pe hrtia de imprimant se va tipri:
1234 ,ANDRONACHE EMANUEL ,INGINER
109
,46,20 ,62000.65
,INGINER EF
,46,21 ,70123.96
,INGINER
,47,20 ,58987.05
,TEHNICIAN PR ,45,25 ,61967.15
,OPERATOR
,40,22 ,56458.75
,MUNCITOR
,48,26 ,71900.00
,ADMINISTRATOR ,44,20 ,65980.00
,CONTABIL
,46,22 ,69876.00
,ECONOMIST
,40,16 ,69879.55
,DIRECTOR
,45,20 ,93999.96
111
Programul QBASIC
10 REM
20 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
30 REM Actualizarea unui fiier secvenial
50 REM +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
60 REM
70 DEFINT K,M,V:DEFSTR F,N
80 DEFSNG S
90 F1 = ##### , descriptor pentru cmpul MARCA
100 F2 = \
\ , descriptor pentru
cmpul NUME
110 F3 = \
\ , descriptor pentru cmpul
FUNCIA
120 F4 = ## , descriptor pentru cmpul VRSTA
130 F5 = ## , descriptor pentru cmpul VECHIMEA
140 F6 = ######.## descriptor pentru cmpul SALARIU
150 F = F1+F2+F3+F4+F5+F6 descriptor pentru ntregul
articol
160 KOD=1:KA=0:KM=0:KS=0
170 A$=
180 WHILE NOT (A$=N OR A$=n)
190 IF NOT KOD=1 THEN 230
200 OPEN PERSONAL.DAT FOR INPUT AS #1
210 OPEN PERSONAL.ACT FOR OUTPUT AS #2
220 KOD=0
230 PRINT Tastai : A sau a - pentru adugare.
240 PRINT
S sau s - pentru tergere.
250 PRINT
M sau m - pentru modificare.
260 PRINT
N sau n - pentru stop.
270 INPUT Tip operaie : ;A$
280 IF A$=A OR A$=a THEN K=1:KA=KA+1
290 IF A$=S OR A$=s THEN K=2:KS=KS+1
300 IF A$=M OR A$=m THEN K=3:KM=KM+1
310 IF A$=N OR A$=n THEN K=4
320 ON K GOSUB 390,500,670,950
330 CLS
340 WEND
350 PRINT n fiier s-au adugat ;KA; articole.
360 PRINT
s-au ters ;KS; articole.
370 PRINT
s-au mofificat;KM; articole.
380 END
390 REM + - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - +
400 REM | Procedura pentru adugarea unui articol |
410 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
420 INPUT Marca : ;MARCA
430 INPUT Numele : ;NUME
440 INPUT Funcia : ;FUNCIA
450 INPUT Vrsta : ;VRSTA
460 INPUT Vechime : ;VECHIME
470 INPUT Salariu : ;SALARIU
480 PRINT 2, USING F; MARCA, NUME, FUNCIA, VRSTA,
112
VECHIME,SALARIU
490 RETURN
500 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
510 REM | Procedura pentru tergerea unui articol |
520 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
530 INPUT Marca : ;MARCAW
540 SF=1
550 WHILE SF<>0
560 IF EOF (1) THEN 570 ELSE 620
570 KS=KS-1:PRINT Nu exist articolul cu marca : ;
MARCAW
580 PRINT Tastai ENTER:INPUT A$
590 GOSUB 950
600 SF=0
610 GOTO 650
620 INPUT#1,MARCA,NUME,FUNCIA,VRSTA,VECHIME
SALARIU
630 IF MARCA=MARCAW THEN SF=0:GOTO 650
640 PRINT #2, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME,SALARIU
650 WEND
660 RETURN
670 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
680 REM Procedura pentru modificarea unui articol
690 REM + - - - - - - - - - - - - - - - - - - ----- - --- - - - - -- +
700 INPUT Marca : ;MARCAW
710 SF=1
720 WHILE SF<>0
730 IF EOF (1) THEN 740 ELSE 790
740 KM=KM-1:PRINT Nu exist articolul ;MARCAW
750 PRINT Tastai ENTER:INPUT A$
760 GOSUB 950
770 SF=0
780 GOTO 940
790 INPUT #1,MARCA,NUME,FUNCIA,VRSTA,VECHIME
SALARIU
800 IF MARCA=MARCAW THEN 830 ELSE 810
810 PRINT #2, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME,SALARIU
820 GOTO 930
830 SF=0
840 CLS:LOCATE 1,1:PRINT Dac nu modificai cmpul,
tastai ENTER
850 PRINT USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME,SALARIU
860 INPUT Marca : ; A$:IF LEN (A$)<>0 THEN
MARCA=VAL(A$)
870 INPUT Numele : ; A$:IF LEN (A$) <>0 THEN NUME=A$
880 INPUT Funcia : ; A$:IF LEN (A$)<>0 THEN FUNCIA=A$
890 INPUT Vrsta : ; A$:IF LEN (A$)<>0 THEN
VRSTA=VAL (A$)
113
114
Problema 6
S se consulte fiierul PERSONAL.DAT i s se tipreasc la imprimant un raport de
forma:
STTAT DE PLAT
Luna:ll
Anul:nnnn
Nrc
1
Numele i prenumele
POPA ION
Salariul
90000.96
Impoz
25%
Plata
67500.72
...
JURCAN PETRU
56000.00
20%
44800.00
Semntura
Director,
Contabil ef,
tiind c valorile pentru lun i an se introduc de la tastatur , iar impozitul se calculeaz
astfel:
- dac salariul este mai mic de 40000, impozitul este de 10%;
- dac salariul este cuprins ntre 40001 i 50000, impozitul este de 15%;
- dac salariul este cuprins ntre 50001 i 60000, impozitul este de 20%;
- dac salariul este mai mare de 60000, impozitul este de 25%;
Rezolvare. Programatorul are posibilitatea ca, de sub QBASIC, s se realizeze
setarea grafic a imprimantei i s se editeze unele rapoarte, folosind anumite seturi de
caractere dintr-o anumit pagin de cod, acceptat de aceasta. Aceast facilitate a fost
utilizat i n programul de fa, imprimanta ataat sistemului fiind de tipul PS/1. Pentru au
alt tip de imprimant este necesar s consultai cartea tehnic a acesteia i vei beneficia de
faciliti asemntoare.
Algoritmul care a stat la baza elaborrii programului poate fi deschis prin urmtorii
pai:
P1. Definim variabilele alfanumerice R1, R2, R3 I R4, atribuindu-le ca valori irurile
de caractere care descriu rndurile notate (R1),(R2),(R3) i (R4).
P2. Deschidem fiierul PERSONAL.DAT pentru intrare i iniializm pe K cu zero.
P3. Tiprim antetul i capul de tabel, formate din (R1) i (R).
P4. Atta timp ct nu suntem poziionai pe marca de sfrit de fiier:
- tiprim rndul (R3);
- citim un articol din fiier;
- funcie de valoarea cmpului SALARIU, determinm restul de plat i-l reinem n
SW, iar n variabila IMPOZ reinem impozitul corespunztor;
- mrim pe K cu o unitate (deoarece avem pregtite pentru scriere la imprimant
informaiile referitoare la o persoan);
- scriem la imprimant valorile variabilelor K, NUME, SALARIU, IMPOZ, SW.
P5. nchidem tabelul, tiprind rndul (R4), tiprim subsolul tabelului, afim pe ecran
numrul de articole citite din fiierul PERSONAL.DAT i apoi nchidem fiierul.
Programul QBASIC
10 REM
20 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
30 REM Consultarea unui fiier secvenial de pe
115
50 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
60 REM
70 DEFINT M, V:DEFSTR F,N,R:DEFSNG S,X
80 DEF FNS (A,B,X)=XX-(A+B) X+AB
90 V$=,
100 F1 = CHR$ (179)+###+CHR$ (179)
110 F2 = \
\+CHR$ (179)
120 F3 = ######.## +CHR$ (179)
130 F4 = ##% +CHR$ (179)
140 F5 = ######.## +CHR$ (179)
150 F6 = \
\+CHR$ (179)
160 F = F1 + F2 + F3 + F4 + F5 + F6
170 R1=CHR$ (218) + STRING$ (3,CHR$ (196)) + CHR$ (194) +
STRING$ (21,CHR$ (196)) + CHR (194) +
STRING$ (11,CHR$ (196)) + CHR$ (194) + STRING$ (5,CHR$ (196))
+ CHR$ (194) + STRING$ (11,CHR$ (196)) + CHR$ (194) + STRING
(11,CHR$
(196)) + CHR$ (191))
180 R2=CHR$ (179) + Nrc + CHR$ (179) + Numele i prenumele
+ CHR$ (179) + Salariul +CHR$ (179)+Impoz+CHR$ (179)+
Plata + CHR$ (179)+ Semntura +CHR$ (179)
190 R3=CHR$ (195) + STRING$ (3, CHR$ (196))+ CHR$(197)+
STRING$ (21,CHR$(196))+CHR$(197)+STRING (11,CHR$ (196))+
CHR (197)+STRING$ (5,CHR$(196))+CHR$(197)+STRING$
(11,CHR$(196))
+CHR$(193))+STRING$(11,CHR$(196))+CHR$(217
210 OPEN PERSONAL.DAT FOR INPUT AS #1
220 K=0
230 INPUT Luna : ;A$
240 INPUT Anul : ;AN
250 LPRINT CHR$ (27);CHR$(53);CHR$(1) Seteaz automat <LF>
pe<CR>.
260 GOSUB 500:LPRINT CHR$(243); Selecteaz setul de
caractere cu numrul 243.
270 LPRINT SPC(15);STAT DE PLAT
280 LPRINT CHR$(27);CHR$(53);CHR$(1)
290 GOSUB 500:LPRINT CHR$(244);
300 LPRINT SPC(5);Luna;;A$
310 LPRINT USING Anul:####;AN
320 LPRINTCHR$(27);CHR$(53);CHR(0);:GOSUB 500:
LPRINT CHR$(60)
330 LPRINT SPC(6);R1:LPRINT SPC(6);R2
340 WHILE NOT EOF(1)
350 LPRINT SPC(6);R3
360 INPUT#1,MARCA,NUME,FUNCIA,VRSTA,VECHIME,
SALARIU
370 IF SALARIU <40000! THEN
SW=SALARIU-SALARIU10/100:IMPOZ=10
380 IF FNS(40001!,50000!,SALARIU) <=0 THEN SW=SALARIUSALARIU15/100:IMPOZ=15
390 IF FNS(50001!,60000!,SALARIU) <=0 THEN SW=SALARIUSALARIU20/100:IMPOZ=20
400 IF SALARIU 60000! THEN
SW=SALARIU-SALARIU25/100:IMPOZ=25
410 K=K+1
116
117
STAT DE PLAT
Luna:martie
Anul:1994
Nrc
1
2
3
4
5
6
7
8
9
10
11
12
Numele i prenumele
HANE ADRIAN
IANO DANIEL
ANDRONACHE EMANUEL
BUCLAE SORIN
LAURIAN ALEXANDRU
BDU CRISTIAN
BURGHEL MARIA
CMPEAN CRISTIAN
BUTIC LILIANA
IACOBESCU NICOLAE
GIURGIULESCU MARIA
HELJIU MARIUS
Salariul
56000.00
45000.00
62000.65
70123.00
49000.00
56748.00
56380.00
76000.00
76421.00
77777.00
69876.00
100000.00
Director,
Impoz
20%
15%
25%
25%
15%
20%
20%
25%
25%
25%
25%
25%
Plata
44800.00
38250.00
46500.49
52952.25
41650.00
45398.40
45104.00
57000.00
57315.75
58332.75
52407.00
75000.00
Semntura
Contabil ef,
118
Instruciune PUT
Sintaxa:
PUT [#]nrfis [,nrart]
Efectul:
Scrie un articol n fiierul cu numrul nrfis, adic transfer pe suportul extern
informaia care se afl n zona articol din memoria intern, asociat fiierului cu numrul
nrfis. Scrierea n fiier se face n poziia nrart dac este prezent acest argument, iar n caz
contrar se scrie urmtorul articol din fiier, nelegnd prin aceasta c dac cel mai mare
numr de ordine al unui articol existent n fiier este n, se va scrie articolul cu numrul de
ordine (n+1).
Instruciunea GET
Sintaxa:
GET [#]nrfis [,nrart]
Efectul:
Citete un articol din fiierul cu numrul nrfis i-l transfer n zona articol din memoria
intern, asociat acestui fiier. Dup citire unui articol se realizeaz poziionarea automat pe
articolul urmtor. Argumentul nrart reprezint numrul de ordine al articolului care se citete.
Dac numrul articolului este omis, prima instruciune GET citete primul articol din fiier, a
doua instruciune GET citete al doilea i aa mai departe, adic fiierul se consult
secvenial. Dup execuia unei instruciuni GET, poate fi invocat funcia EOF, pentru a
verifica dac s-a ajuns la sfrit de fiier.
Instruciunea FIELD
Sintaxa:
FIELD [#]nrfis,I1 AS v1[,I2 AS v2,...,In AS vn]
Efectul:
Structureaz zona articol din memoria intern, asociat fiierului cu numrul nrfis, i
rezerv spaiu de memorie variabilelor alfanumerice v1,v2,...vn. Pentru o variabil oarecare
vi se vor rezerva ii octei, oricare i=1,n. Facem precizarea c pentru variabilele care
corespund datelor de tip numeric trebuie rezervai 2, 4, 8 octei, dup cum data numeric
este de tip ntreg, rel n simpl precizie, respectiv real n dubl precizie.
Numrul total de octei rezervai printr-o instruciune FIELD nu trebuie s depeasc
lungimea articolului, precizat n instruciunea OPEN, prin care se deschide fiierul n cauz,
deoarece se produce eroarea Field overflow. Reamintim c lungimea implicit a unui articol
este de 128 de octei.
Instruciunile LSET i RSET
119
Sintaxa:
LSET x$ = e: RSET x$ = e
Efectul:
Transfer n variabila alfanumeric x$ valoarea obinut n urma evalurii expresiei
alfanumerice e. Variabila x$ este un cmp dintr-o zon articol asociat unui fiier aleator,
cmp a crui lungime a fost precizat cu ajutorul instruciunii FIELD.
n funcie de lungimea pe care o are valoarea alfanumeric, obinut dup evaluarea
expresiei e, trensferul se realizeaz astfel:
- dac lungimea valorii calculate este mai mic sau egal cu lungimea variabilei x$, se
face cadrarea la stnga i se completeaz la dreapta cu spaii, dac se folosete
instruciunea LSET, iar dac se folosete instruciunea RSET se face cadrarea la dreapta i
se completeaz la stnga cu spaii;
- dac lungimea valorii alfanumerice este mai mare dect lungimea variabilei x$, se
trunchiaz valoarea ir calculat la lingimea variabilei x$ i se face transferul cu cadrare la
stnga.
Dac se dorete utilizarea valorilor numerice n instruciunile LSET i RSET, acestea
trebuie s fie convertite cu funciile MKI$, MKS$ i MKD$.
Funcii utilizate n prelucrarea fiierelor aleatoare
Numele/Sintaxa
MKI$(x)
MKS$(x)
MKD$(x)
CVI(x$)
CVS(x$)
CVD(x$)
Efectul
Convertete valoarea ntreag a argumentului x
ntr-un ir cu lungimea de 2 octei.
Convertete valoarea argumentului x, de tip real n
simpl precizie, ntr-un ir cu lungimea de 4 octei.
Convertete valoarea argumentului x, de tip real n
dubl prercizie, ntr-un ir cu lungimea de 8 octei.
Convertete irul x$, format din 2 octei, ntr-un
numr ntreg. Este inversa funciei MKI$.
Convertete irul x$, format din 4 octei, ntr-un
numr real n simpl precizie. Este inversa funciei
MKS$.
Convertete irul x$, format din 8 octei, ntr-un
numr real n dubl precizie. Este inversa funciei
MKD$.
Aplicaii
Problema 1
S se elaboreze un program QBASIC prin care s se creeze pe discul din unitatea
implicit fiierul aleator CATALOG.DAT, cu articole de forma:
ELEVI
NRM
I (4)
NUME
A (24)
CLASA
A(8)
MEDIA (1)
RS (5,2)
MEDIA (2)
RS (5,2)
MEDIA (3)
RS (5,2)
121
Programul QBASIC
Comentariu: Dup lansarea programului n execuie, am introdus n fiier un set de
13 articole i, dup ce la ntrebarea Introducei alt articol (Y/N)? am rspuns cu n, pe
ecran s-a afiat numrul de articole introduse i coninutul fiierului creat, sub forma:
NUME
A(24)
CLASA
A(8)
MEDIAG
RS(5,2)
tiind c valoarea cmpului MEDIAG se determin ca fiind media aritmetic a celor trei medii
ale unui elev.
Rezolvare. Algoritmul pentru rezolvarea acestei probleme este destul de simplu i
const n urmtorii pai:
P1. Deschidem cele dou fiiere n acces direct i structurm corespunztor zonele
articol asociate lor, cu ajutorul instruciunii FIELD.
P2. Deschidem i citim din fiierul NRART.SEQ numrul de articole existente n fiierul
CATALOG.DAT. Evident, i n fiierul MEDII.DAT se vor nregistra to attea articole cte au
fost n CATALOG.DAT, adic NRART articole.
P3. Pentru I=1, NRART, efectum urmtoarele operaii:
- citim din fiierul CATALOG.DAT articolul cu numrul de ordine precizat prin variabila
I;
- calculm n variabila MED suma mediilor pentru elevul cu numrul de ordine I i
populm cu informaii utile cmpurile din zona articol asociat fiierului MEDII.DAT;
- scriem articolul astfel construit n fiierul MEDII.DAT n poziia I.
P4. nchidem cele dou fiiere i, opional, putem tipri coninutul fiierului MEDII.DAT
(lucru pe care de fapt l-am realizat n programul de fa).
123
Programul QBASIC
Problema 4
S se elaboreze programul QBASIC prin care s se consulte fiierul aleator
MEDII.DAT i s se creeze fiierul aleator MEDII.SRT, cu articole de aceeai form, dar
ordonate cresctor dup cmpul CLASA, n cadrul aceleiai clase ordonate descresctor
dup medii, iar n caz de medii egale, ordonate alfabetic dup nume.
Rezolvare. Dac soluiile problemelor precedente au fost oarecum mai simple,
constatm c aceast problem este destul de dificil, nainte de a rezolva aceast problem
facem precizarea c sortarea alfabetic este de fapt o sortare cresctoare i deci avem de
sortat un fiier dup trei chei, n urmtoarea ordine:
- cresctor dup prima cheie (CLASA);
- descresctor dup a doua cheie (MEDIAG);
- cresctor dup a treia cheie (NUME).
Se constat cu uurin c, dac vom nmuli cmpul MEDIAG cu -1, putem rezolva
problema efectund o sortare cresctoare dup trei chei, dar nici acest lucru nu pare a fi prea
simplu. n cele ce urmez vom trece n revist un algoritm original, conceput de autor, i care
conduce la o soluie destul de elegant.
Vom presupune c ntr-un fiier avem un numr de n articole, ce urmeaz a fi sortate
cresctor dup (m+1) chei numerice nenegative de tip ntreg, notate cu C 0C1,...Cm . Fie k
numrul maxim de cifre din care este alctuit o cheie oarecare. Vom interpreta o succesiune
de forma C0C1,...Cm ca fiind un numr scris n baza 10 k i deci, corespunztor celor n articole,
avem n numere scrise n baza 10 k, pe care le vom nota:
C iO C 1i ... C im , i 1, n ;
CJj
fiind
cifre
baza10k
j 0, m .
Exemplu: Vom considera un fiier cu 12 articole, care trebuie sortat cresctor dup
trei chei. n tabelul 1 vom pune n eviden, pe prima coloan, numrul de ordine al articolului
n fiier, iar pe ultima coloan numrul natural obinut prin concatenarea cheilor, conform
celor precizate anterior.
Pornind de la aceast structur, n urma ordonrii cresctoare dup cele trei chei, vom
obine datele din tabelul 2, unde pe prima coloan avem poziiile ordonate ale articolelor din
fiierul dat iniial (primul articol din fiierul sortat se afl n poziia 10 n fiierul nesortat, al
doilea se afl n poziia 3, al treilea n poziia 5 .a.m.d., ultimul n poziia 12).
Se constat c numerele din ultima coloan sunt n ordine strict cresctoare, iar cu
ajutorul configuraiei din prima coloan se pot selecta articolele din fiierul dat, n ordinea
cresctoare a celor trei chei de sortare. Concluzia care poate fi tras este destul de simpl:
pentru a obine configuraia din prima coloan trebuie s ordonm cresctor elementele din
ultima coloan, utiliznd i un vector martor, pe care-l iniializm la nceput cu numerele
1,2,3,... i, de fiecare dat cnd schimbm ntre ele dou numere din irul pe care-l sortm,
schimbm i valorile corespunztoare din vectorul martor, iar dup terminareaordonrii,
124
C iO C 1i ... C im , i 1, n ;
CJj
fiind
cifre
baza10k
j 0, m .
introducem urmtoarea relaie de ordine:
Fie Aj=a0ia1i...bmi i B=b0jb1j...bmj dou numere oarecare din mulimea M. Atunci:
AiBj dac ajl=bjl,l= 0,p , pm, i ajl+1 bjl+1
AiBj dac ajl=bjl,l= 0,p , pm, i ajl+1 bjl+1
Ai=Bj dac ajl=bjl, ,l= 0,m ,
Constatm c de fapt nu este necesar s construim elementele mulimii M, ci doar s
facem investigaii asupra celor (m+1) chei de sortare, din toate cele n articole. Algoritmul pe
care-l vom utiliza n cazul general const n consultarea secvenial a fiierului dat i
construirea n memorie a unui vector cu n componente, notat, de exemplu, cu P (de la
poziie), n care vom nregistra iniial numerele de la 1 la n i totodat construirea unei
matrice cu n linii i (m+1) coloane, pe fiecare linie nregistrndu-se valorile cheilor de sortare
n ordinea prioritilor. Vom aplica acestei matrice algoritmul ordonrii lexicografice i, atunci
cnd schimbm dou linii ntre ele, schimbm i valorilie corespunztoare din vectorul P. n
final componentele vectorului P vor indica ordinea sortrii articolelor din fiierul dat. Deci, cu
ajutorul acestui vector vom consulta n acces direct fiierul dat i vom construi noul fiier, n
care articolele vor fi ordonate cresctor dup cale (m+1) chei.
Algoritmul ordonrii lexicografice
Fie A=(aij) nxmo matrice ale crei elemente sunt numere reale. Dac notm cu I 1,I2,...In
cele n linii ale matricei A, ordonarea lexicografic schimb liniile ntre ele, astfel nct s
ajungem la situaia:
I1I2 ....In .
Precizm c dac li=(ai1,ai2,...,aim) i lj=(aj1,aj2,...,ajm), atunci:
li=lj dac aceste dou linii au elementele corespunztoare respectiv egale;
lilj dac ai1=aj1,ai2=aj2,...,aik=ajk,aik+1=ajk+1
Comentariu: Algoritmul de sortare descris anterior este valabil i pentru cazul n care
cheile sunt de tip numeric ntreg (valorile cheilor sunt att pozitive, ct i negative), deoarece,
adunnd la fiecare cheie valoarea minim a acestora, luat n modul, toate vor deveni
pozitive. De asemenea algoritmul este valabil i pentru cazul n care cheile sunt numere
reale, deoarece prin nmuliri cu puteri ale lui 10 pot fi transformate n numere ntregi. Dac
rmnem tot n cazul numeric, aa dup cum s-a precizat la nceput, algoritmul este valabil i
atunci cnd sortarea dup unele chei se face cresctor, iar dup altele se face descresctor,
cu meniunea c acele coloane ale matricei care conin aceste chei trebuie nmulite cu -1.
125
Mai mult dect att, algoritmul este valabil i n cazul n care unele chei sunt de tip
alfanumeric, numai c de aceast dat suntem nevoii s folosim n locul matricei o
combinaie de matrice i vectori, i s aplicm algoritmul ordonrii lexicografice asupra
acestor ansamble, gndindu-le ca un tot unitar.
De fapt rezolvarea problemei formulate anterior tocmai aa se face. n acest sens am
folosit vectorii: P pentru poziie, VCL pentru clas, MEDIA pentru media general i VN
pentru nume.
Paii algoritmului
P1. Deschidem n acces direct fiierele: MEDII.DAT i MEDII.SRT i structurm zonele
articol asociate acestor fiiere, cu ajutorul instruciunii FIELD.
P2. Deschidem fiierul NRART.SEQ i citim din el, n variabila NRART, numrul de
articole existente n primul fiier (tot attea vom avea i n al doilea).
P3. Pentru I=1,NRART, efectum urmtoarele operaii:
- citim un articol din fiierul MEDII.DAT;
- reinem, n poziia I din vectorul P, valoarea lui I;
- reinem, n poziia I din vectorii VCL, MEDIA i VN, valorile cmpurilor referitoare la
clas, medie i nume.
P4. Apelm procedura descris ncepnd din linia [350], prin care se face sortarea
dup cele trei chei i se modific structura iniial a vectorului P.
P5. Pentru I=1,NRART, efectum operaiile:
- citim n acces direct, din fiierul MEDII.DAT, articolul din poziia P(I) i transferm
informaiile din el n zona articol asociat feierului MEDII.SRT;
- scriem articolul astfel construit n poziia I din fiierul MEDII.SRT.
P6. Tiprim coninutul fiierului MEDII.SRT i apoi nchidem cele dou fiiere.
Programul QBASIC
Problema 5
S se elaboreze programul QBASIC prin care s se consulte fiierul aleator
MEDII.SRT e s se creeze fierul secvenial TABELE.LST, care s conin pentru fiecare
clas un tabel de forma:
SITUAIA COLAR LA CLASA: XXXXX
NRC
I(4)
NUMELE I PRENUMELE
A(26)
MEDIA
R(5,2)
P2. Deschidem cele dou fiiere i structurm zona articol asociat fiierului aleator,
cu ajutorul instruciunii FIELD.
P3. Deschidem fiierul NRART.SEQ i citim din el numrul de articole existente n
fiierul MEDII.SRT, numr pe care-l reinem n variabila NRART i l atribuim variabilei I
valoarea 1.
P4. Dac NRART este zero, tiprim mesajul Fiierul MEDII.SRT este vid, iar n caz
contrar citim primul articol din fiier, reinem clasa n WCLASA, iniializm variabila NRC cu
zero i apelm procedura prin care scriem capul de tabel (procedur descris n programm
prin subrutina din linia [360]).
P5. Atta timp ct I este mai mic sau egal cu NRART efectum operaiile:
- citim din fiierul MEDII.SRT articolul din poziia I;
- scriem articolul cotit n fiierul TABELE.LST, verificnd n prealabil dac acest articol
aparine clasei WCLASA. Dac nu aparine, trebuie s nchidem tabelul corespunztor clasei
WCLASA, s reinem n WCLASA valoarea noi clase, s iniializm variabila NRM cu zero,
s scriem noul cap de tabel i apoi articolul citit. nainte de scrierea unui articol n fiierul
TABELE.LST, variabila NRM trebuie incrementat cu o unitate.
- mrim valoarea lui I cu o unitate (trecem la articolul urmtor).
Programul QBASIC
Problema 6.
S se listeze coninutul fiierului TABELE.LST la imprimant.
Rezolvare. Tiprirea se poate face att cu ajutorul unui program QBASIC, ct i de
sub MS-DOS, poziionndu-ne lng fiier i introducnd comanda:
ACOPY TABELE.LST LPT1
SITUAIA COLAR LA CLASA:IX-A
NRC
1
2
3
4
NUMELE I PRENUMELE
POPESU RODICA
POPESU SIMONA
STEPAN NICU
POPESU ELENA
MEDIA
9.33
9.33
9.33
8.00
NUMELE I PRENUMELE
STOICOIU CRISTIAN
PETRE MARIUS
BOLDOR MARIA
GHERMAN DELIA
MEDIA
10.00
8.33
7.67
7,67
NUMELE I PRENUMELE
ADAMESCU ELISABETA
ANTONIE DAN
GHINEA MARIANA
127
MEDIA
8.33
8.33
8.33
4
5
AMZA AURICA
AMZA MARIA
8.00
8.00
NUME
A(30)
N(1)
I(2)
N(2)
I(2)
N(3)
I(2)
N(4)
I(2)
unde:
NRM - numrul matricol al studentului;
NUME - numele studentului;
N(I), I=1,4 - notele obinute la examenele din sesiunea de iarn;
i apoi s se tipreasc e ecran coninutul fiierului.
b) S se consulte fiierul GRUPA.DAT i s se editeze pe ecran un tabel de forma:
NRC
NRM
NUME
N(1)
N(2)
N(3)
N(4)
MEDIA
NRM
I/4)
NUME
A(30)
N(1)
I(2)
N(2)
I(2)
N(3)
I(2)
N(4)
I(2)
unde:
NRM - numrul matricol al studentului;
NUME - numele studentului;
N(I),I=1,4 - notele obinute la examenele din sesiunea de iarn;
i apoi s se tipreasc pe ecran coninutul fiierului.
b) S se consulte fiierul GRUPA.DAT i s se editeze pe ecran un tabel de forma:
NRC
NRM
NUME
N(1)
N(2)
N(3)
N(4)
MEDIA
NUME
A(30)
VP
R(9,2)
MA
R(5,2)
unde:
NRM - numrul matricol al unui student;
NUME - numele studentului;
VP - veniturile prinilor;
MA - media anual a studentului;
i apoi s se tipreasc articolele fiierului pe ecran.
b) S se consulte secvenial fiierul STUDENI.DIR i s se editeze un raport care s
conin toi studenii bursieri. Exist dou categorii de burse, care se acord astfel:
- burse sociale de B1 lei, pentru studenii care au mediile anuale cuprinse ntre 7.50 i
9.50 inclusiv, iar venitul prinilor este mai mic dect V;
burse de merit de B2 lei, pentru studenii care au medii anuale mei mari dect 9.50,
fr a se ine cont de veniturile prinilor.
Valorile pentru B1, B2 i V se introduc de la tastatur, iar situaia cerut va avea structura:
NRC
NRM
NUME
VENIT
MEDIA
BURSA
NUME
A(30)
N(1)
I(2)
N(2)
I(2)
N(3)
I(2)
unde:
NRM - numrul matricol al studentului;
129
N(4)
I(2)
NRM
NUME
N(1)
N(2)
N(3)
N(4)
MEDIA
care s conin toi studenii din grup, care au media mai mic de7.50.
Problema 5
a) S se creeze un fiier aleator, cu numele GRUPA.DIR, care s conin toi studenii
dintr-o grup i care s aib articole de forma:
STUDENT
NRM
I/4)
NUME
A(30)
N(1)
I(2)
N(2)
I(2)
N(3)
I(2)
N(4)
I(2)
unde :
NRM - numrul matricol al studentului;
NUME - numele studentului;
N(I), I=1,4 - notele obinute la examenele din sesiunea de iarn;
i apoi s se tipreasc pe ecran coninutul fiierului.
b) S se consulte n acces direct fiierul GRUPA.DIR i s se editeze pe ecran un
tabel de forma:
NRC
NRM
NUME
N(1)
N(2)
N(3)
N(4)
MEDIA
care s conin toi studenii din grup, aranjai n ordinea descresctoare a mediilor, iar n
final s se afieze media grupei.
130
Problema 6
a) S se creeze fiierul secvenial PRODUSE.DAT, care s conin informaii
referitoare la produsele fabricate lunar n unitatea X, cu articole de forma:
PRODUS
CODP
I(4)
DENP
A(30)
CANT
I(4)
PU
R(9,2)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
CANT - cantitatea fabricat;
PU - preul unitar;
i apoi s se tipreasc articolele fiierului pe ecran.
b) S se consulte fiierul PRODUSE.DAT i s se editeze pe ecran un tabel de forma:
CODP
DENP
CANT
PU
VALP
unde:
VALP = CANT PU
iar n final s se afieze valoarea total a produselor fabricate n acea lun.
Problema 7
a) S se consulte fiierul aleator PRODUSE.DIR, care s conin informaii referitoare
la produsele fabricate lunar n unitatea X, cu articole de forma:
PRODUS
CODP
I(4)
DENP
A(30)
CANT
I(4)
PU
R(9,2)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
CANT - cantitatea fabricat;
PU - preul unitar;
i apoi s se tipreasc articolele fiierului pe ecran.
b) S se consulte secvenial fiierul PRODUSE.DIR i s se editeze pe ecran un tabel
de forma :
CODP
DENP
CANT
PU
VALP
unde:
VALP = CANT PU
iar n final s se afieze valoarea total a produselor fabricate n acea lun.
Problema 8
131
DENP
A(30)
CANT
I(4)
PU
R(9,2)
I
I(1)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
CANT - cantitatea fabricat;
PU - preul unitar;
I - indicator cu valori din 1,2;
i apoi s se tipreasc pe ecran.
b) S se consulte fiierul PRODUSE.DAT i s se editeze pe ecran un tabel de forma:
CODP
DENP
CANT
PU
VALP
tiind c:
VALP = CANT PA, unde PA este preul unitar actualizat astfel: dac I=1, preul unitar
se diminueaz cu 15%, iar dac I=2, se majoreaz cu 15%.
n final s se afieze valoarea total a produselor fabricate n acea lun.
132
Problema 9
a) S se creeze fiierul aleator PRODUSE.DIR, care s conin informaii referitoare la
produsele fabricate ntr-o anumit lun n unitatea X, ale crui articole s fie de forma:
PRODUS
CODP
I(4)
DENP
A(30)
CANT
I(4)
PU
R(9,2)
I
I(1)
tiind c:
CODP - codul produsului;
DENP - denumirea produsului;
CANT - cantitatea fabricat;
PU - preul unitar;
I - indicator de valori din 1,2;
i apoi s se tipreasc pe ecran.
b) S se consulte secvenial fiierul PRODUSE.DIR i s se editeze pe ecran un tabel
de forma:
CODP
DENP
CANT
PU
VALP
tiind c:
VALP = CANT PA, unde PA este preul unitar actualizat astfel: dac I=1, atunci preul
unitar se majoreaz cu 35%, iar dac I=2, se diminueaz cu 25%. n final s se afieze
valoarea total a produselor fabricate n acea lun.
Problema 10
a) S se creeze fiierul secvenial PLAN.DAT, cu articole de forma:
PLANIFICARE
CODP
DENP
I(4)
X(30)
CPA
I(6)
R(1)
I(4)
R(2)
I(4)
...
...
R(12)
I(4)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
CPA - cantitatea planificat pe ntregul an;
R(I), I=1,12 - cantitatea realizat n luna I;
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte fiierul PLAN.DAT i s se tipreasc pe ecran un raport de forma:
CODP
DENP
CPA
R(1)
R(2)
...
R(12)
PROC
CPA
R(1)
133
R(2)
...
R(12)
I(4)
X(30)
I(6)
I(4)
I(4)
...
I(4)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
CPA - cantitatea planificat pe ntregul an;
R(I), I=1,12 - cantitatea realizat n luna I;
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte secvenial fiierul PLAN.DIR i s se tipreasc pe ecran un raport
de forma:
CODP
DENP
CPA
R(1)
R(2)
...
R(12)
PROC
CPA
I(6)
R(1)
I(4)
R(2)
I(4)
...
...
R(12)
I(4)
unde:
CODP - codul produsului;
DENP - denumiorea produsului;
CPA - cantitatea planificat pe ntregul an;
R(I), I=1,12 - cantitatea realizat n luna I.
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte fiierul PLAN.DAT i s se tipreasc pe ecran un raport de forma:
CODP
DENP
CPA
R(1)
R(2)
...
134
R(12)
CR
Problema 13
a) S se creeze fiierul aleator PLAN.DIR, cu articole de forma:
PLANIFICARE
CODP
DENP
I(4)
X(30)
CPA
I(6)
R(1)
I(4)
R(2)
I(4)
...
...
R(12)
I(4)
unde:
CODP - codul produsului;
DENP - denumiorea produsului;
CPA - cantitatea planificat pe ntregul an;
R(I), I=1,12 - cantitatea realizat n luna I.
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte secvenial fiierul PLAN.DIR i s se tipreasc pe ecran un raport
de forma:
CODP
DENP
CPA
R(1)
R(2)
...
R(12)
CR
STOC
I(6)
STOCS
I(5)
PU
R(9,2)
unde:
CODUL - codul produsului;
DENP - denumirea produsului;
STOC - stocul existent;
STOCS - stocul de siguran;
PU - preul unitar al produsului;
i apoi s se listeze toate articolele din fiier pe ecran.
b) S se consulte fiierul STOCURI.DAT i s se editeze pe ecran un raport de forma:
CODP
DENP
STOC
STOCS
PU
NECA
VALOARE
STOCUL
CODP
I(4)
DENP
A(30)
STOC
I(6)
STOCS
I(5)
PU
R(9,2)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
STOC - stocul existent;
STOCS - stocul de siguran;
PU - preul unitar al produsului;
i apoi s se listeze toate articolele din fiier pe ecran.
b) S se consulte fiierul STOCURI.DIR i s se editeze pe ecran un raport de forma:
CODP
DENP
STOC
STOCS
PU
NECA
VALOARE
136
Problema 16
a) S se creeze fiierul STOCURI.DAT, care s conin informaii referitoare la
stocurile existente i stocurile de siguran din depozitele unei ntreprinderi i care s aib
articole de forma:
STOCUL
CODP
I(4)
DENP
A(30)
STOC
I(6)
STOCS
I(5)
PU
R(9,2)
unde:
CODP - codul produsului;
DENP - denumirea produsului;
STOC - stocul existent;
STOCS - stocul de siguran;
PU - preul unitar al produsului;
i apoi s se listeze toate articolele din fiier pe ecran.
b) S se consulte fiierul STOCURI.DAT i s se editeze pe ecran un raport de forma:
CODP
DENP
STOC
STOCS
PU
NECA
VALOARE
137
Problema 17
a) S se creeze fiierul secvenial CONTRACT.DAT, cu articole de forma:
MATERIALE
CODF
CODP
I(4)
I(6)
CANTC
I(6)
CANTF
I(6)
PU
R(9,2)
unde:
CODF - codul furnizorului;
CODP - codul produsului;
CANTC - cantitatea contractat;
CANTF - cantitatea furnizat;
PU - preul unitar;
i apoi s se tipreasc pe ecran coninutul fiierului.
b) S se consulte fiierul CONTRACT.DAT i s se editeze pe ecran un tabel de
forma:
CODF
CODP
CANTC
CANTF
PU
RESTAN
VALOARE
CANTC
I(6)
CANTF
I(6)
PU
R(9,2)
unde:
CODF - codul furnizorului;
CODP - codul produsului;
CANTC - cantitatea contractat;
CANTF - cantitatea furnizat;
PU - preul unitar;
i apoi s se tipreasc pe ecran coninutul fiierului.
b) S se consulte fiierul CONTRACT.DIR i s se editeze pe ecran un tabel de forma:
CODF
CODP
CANTC
CANTF
PU
RESTAN
VALOARE
SCARA
AP
138
VALR
VALC
A(30)
I(3)
I(2)
I(3)
R(9,2)
R(9,2)
unde:
NUME - numele unui locatar;
BLOC - numrul blocului,
SCARA - numrul scrii;
AP - numrul apartamentului;
VALR - valoarea restant pentru ntreinere;
VALC - valoarea de plat pe luna curent;
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte fiierul LOCATARI.DAT i s se editeze pe ecran un raport de forma:
NUME
BLOC
SCARA
AP
VALR
VALC
TOTALD
tiind c TOTALD reprezint totalul datoriilor, calculate innd cont de faptul c dac VALR
1000, se aplic majorri de 5%.
Problema 20
a) S se creeze fiierul aleator LOCATARI.DIR, cu articole de forma:
LOCATAR
NUME
BLOC
A(30)
I(3)
SCARA
I(2)
AP
I(3)
VALR
R(9,2)
VALC
R(9,2)
unde:
NUME - numele unui locatar;
BLOC - numrul blocului,
SCARA - numrul scrii;
AP - numrul apartamentului;
VALR - valoarea restant pentru ntreinere;
VALC - valoarea de plat pe luna curent;
i apoi s se listeze articolele fiierului pe ecran.
b) S se consulte fiierul LOCATARI.DIR i s se editeze pe ecran un raport de forma:
NUME
BLOC
SCARA
AP
VALR
VALC
TOTALD
tiind c TOTALD reprezint totalul datoriilor, calculate innd cont de faptul c dac VALR
1000, se aplic majorri de 5%.
Problema 21
a) S se creeze fiierul aleator STOCURI.DIR, care s conin informaii despre
stocurile existente i stocurile de siguran din depozitele unei ntreprinderi i care s aib
articole de forma:
STOCUL
CODP
I(4)
DENP
A(30)
STOC
I(6)
unde:
CODP - codul produsului;
139
STOCS
I(5)
PU
R(9,2)
DENP
STOC
STOCS
PU
NECA
VALOARE
140
Problema 22
a) S se creeze fiierul secvenial UTILAJE.DAT, cu articole de forma:
UTILAJUL
CODU
I(4)
DENU
A(20)
TN
I(3)
TL
I(3)
TARIF
R(8,2)
unde:
CODU - codul utilajului;
DENU - denumirea utilajului;
TN - timpul normat;
TL - timpul lucrat;
TARIF - tariful orar;
i apoi s se listeze pe ecran.
b) S se consulte fiierul UTILAJE.DAT i s se editeze pe ecran un raport de forma:
CODU
DENU
TN
TL
TARIF
GF
PDN
DENU
A(20)
TN
I(3)
TL
I(3)
TARIF
R(8,2)
unde:
CODU - codul utilajului;
DENU - denumirea utilajului;
TN - timpul normat;
TL - timpul lucrat;
TARIF - tariful orar;
i apoi s se listeze pe ecran.
b) S se consulte fiierul UTILAJE.DIR i s se editeze pe ecran un raport de forma:
CODU
DENU
TN
TL
TARIF
GF
PDN
141
Problema 24
S se creeze un fiier secvenial pe disc, cu numele STUDENI.DTA, ale crui
articole s aib lungimea variabil i structura:
STUDENI
NRM NUME
I(4)
A(30)
AN.STUDI
U
I(1)]
GRUPA
NR.DISC EX(1)
...
A(4)
I(2)
...
I(2)
EX(NR.
DISC)
I(2)
i apoi s se consulte acest fiier i s se listeze toate articolele sale pe monitor (se va afia
numrul de articole citite di fiier).
Problema 25
a) S se consulte secvenial fiierul STUDENI.DTA i, pentru o anumit grup dintrun anumit an de studiu, introduse de la tastatur, s se selecteze toate articolele din
STUDENI.DTA i s se creeze un fiier aleator, al crui nume s fie format din mumele
grupei, iar extensia s fie DIR. Articolele acestui fiier vor conine un cmp n plus, cmp n
care se va reine media notelor obinute la cele NR.DISC discipline.
b) S se consulte fiierul aleator, n acces direct i s se listeze la imprimant un
raport de forma:
CLASAMENTUL GRUPEI:gggg
Nrc.
##
Numele i prenumele
A(32)
Media
##.##
care s conin toi studenii din grup, aranjai n ordinea strict decresctoare a mediilor.
Observaie. S se prevad n program posibilitatea de a crea mai multe fiiere
aleatoare i de a edita mai multe rapoarte.
142
BIBLIOGRAFIE
1. Programarea calculatoarelor, curs 1, curs 2, Colectivul de programare, I.P.Traian
Vuia, Timioara,1989
2. Marinescu Gh i alii, Probleme de analiz numerice rezolvate cu calculatorul,
Editura Academiei, Bucureti 1987.
3. Faure R., Kaufmann A., Denis Papin M., Mathematique nouvelles, DOUNOD,
Paris,1969.
4. Felicia Zvoianu, Constantin Zvoianu, GW-BASIC, Teora,1995.
5. Dos Users Guide - by IBM Corp And Microsoft, Inc.
6. Language Reference - IBM BASIC compiler/2 computer Language Series.
7. Users Reference for PS/1 Printer - IBM, First Edition July 1990
8. Herbert Peckham, Wade Ellis Jr., Ed Ludii, Structured BASIC for the IBM PC,
McGrow-Hill Book Company, 1985.
9. Tudorel Ftu i alii, utilizareaa mediului de programare QBASIC. Aplicaii
economice.
143