Sei sulla pagina 1di 143

CUPRINS

Cap 1. Introducere n domeniul calculatoarelor ..................................


1.1. Scurt istoric al dezvoltrii calculatoarelor ..........................
1.2. Generaii de calculatoare ..................................................
1.3. Structura i funcionarea unui calculator electronic ..........
1.4. Sisteme de operare ...........................................................
Cap2. Sisteme de numeraie ..............................................................
2.1. Noiuni introductive ...........................................................
2.2. Reprezentarea unui numr n baza b ...............................
2.3. Reprezentarea algebric a unui numr n baza b ...............
2.4. Conversia numerelor ntregi din baza 10 n baza b .........
2.6. Conversia numerelor reale din baza 10 n baza b ...........
2.7. Conversia numerelor reale din baza b n baza 10 ...........
2.8. Conversia din binar n octal i hexazecimal i invers ......
2.9. Operaii aritmetice cu numere reprezentate n baza b .....
2.10. Codificarea informaiilor .................................................
2.11. Probleme propuse ..........................................................
Cap. 3. Algoritmi .................................................................................
3.1. Noiuni introductive din teoria algoritmilor ......................
3.2. Caracteristicile algoritmilor ...............................................
3.3. Compunerea algoritmilor ..................................................
3.4. Descrierea algoritmilor .....................................................
3.5. Probleme propuse ............................................................
Cap. 4. Limbajul QBasic .....................................................................
4.1. Introducere .......................................................................
4.2. Vocabularul limbajului Qbasic ..........................................
4.3. Gramatica limbajului Qbasic .............................................
4.4. Probleme propuse ............................................................
Cap. 5. Introducerea i extragerea datelor .........................................
5.1. Instruciunea PRINT ..........................................................
5.2. Instruciunea INPUT ..........................................................
5.3. Instruciunile READ, DATA, RESTORE ............................
5.4. Probleme propuse .............................................................
Cap. 6. Instruciuni de decizie ..............................................................
6.1. Instruciunea de salt necondiionat GO TO .......................
6.2. Operatori i expresii relaionale ........................................
6.3. Operatori i expresii logice ...............................................
6.4. Instruciunea IF logic ........................................................
6.5. Probleme propuse ............................................................

Cap. 7. Instruciuni de ciclare (FOR i NEXT) ....................................


7.1. Instruciunea DO..LOOP ...................................................
7.2. Instruciunea WHILE i WEND ..........................................
7.3. Probleme propuse ............................................................
Cap. 8. Matrici, iruri de caractere .....................................................
8.1. Iniializarea matricilor .......................................................
8.2. Tiprirea matricilor ............................................................
8.4. iruri de caractere ............................................................
8.5. Funcii care acioneaz asupra irurilor de caractere ......
8.6. Matrici cu iruri de caractere ............................................
8.7. Probleme propuse ............................................................
Cap. 9. Subprograme .........................................................................
9.1. Subprograme de tip funcie ...............................................
9.2. Subprograme de tip subrutin..........................................
9.3. Probleme propuse ............................................................
Cap. 10. Grafic .................................................................................
10.1. Instruciunile PLOT i INVERSE .....................................
10.2. Instruciunile DRAW,CIRCLE .........................................
10.3. Instruciunile CLS,POINT ................................................
10.4. Programarea culorilor .....................................................
10.5. Probleme propuse ..........................................................
Cap. 11. Fiiere ..................................................................................
11.1. Noiunea de fiier ............................................................
11.2. Operaii de baz privind prelucrarea fiierelor ................
11.3. Instruciuni i funcii utilizate n prelucrarea
fiierelor secveniale .......................................................
11.4. Aplicaii ............................................................................
11.5. Instruciuni i funcii utilizate n prelucrarea
fiierelor aleatoare ........................................................
11.6. Probleme propuse ..........................................................
Bibliografie ...........................................................................................

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.

1.2 GENERAII DE CALCULATOARE


D.P.V. al logicii interne a tehnologiei, dup trecerea de la prima generaie de
calculatoare, cu TUBURI ELECTRONICE, la generaia a II- a cu TRANZISTORI, dezvoltarea
circuitelor integrate a impus dou generaii de calculatoare electronice: a treia cu CIRCUITE
INTEGRATE i a patra cu circuite integrate pe scar larg i foarte larg. Dac primele patru
generaii au aprut ca urmare a unor salturi tehnologice n domeniul dispozitivelor i
circuitelor electronice, generaia a cincea numai este impulsionat, n principal, de o
tehnologie hard, ci de una soft: aceea a inteligenei artificiale. Totui, se impun noi progrese,
se spune chiar noi strpungeri n domeniile tehnologiilor hard i soft pentru a se realiza un
asemenea calculator.
Dincolo de calculatorul din generaia a cincea se poate prevedea apariia
calculatoarelor moleculare, utiliznd structuri de enzime i proteine sau polimeri organici cu
proprieti speciale.
Dac inem seama de faptul c noua revoluie industrial se bazeaz pe
microelectronic, inteligen artificial i automatizare flexibil intensitatea maxim a acestui
proces revoluionar va urma apariiei calculatorului din generaia a cincea.
Generaia

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

n acelai timp se pregtete unda unei revoluii biochimice la care ar putea


corespunde peste 35 de ani un calculator molecular . Singurul lucru care ar rmne dup
aceea ar fi apariia unui calculator viu cu o inteligen artificial vie, ce ar implica i ataarea
unor structuri de tip ADN i ARN la un calculator molecular.
Dar s nu ne gndim att de departe, rmnnd n cadrul temei propuse, remarcnd c
odat cu calculatoarele din generaia a cincea se produce o schimbare radical n domeniul
4

computerelor, care nu vor mai fi propriu-zis calculatoare, ci sisteme de procesare a


informaiei de cunoatere, adic sisteme create pentru ndeplinirea funciilor de inteligen
artificial.
Dac primele patru generaii de calculatoare electronice au fost construite pentru
calcule, chiar dac au fost utilizate treptat i pentru prelucrri simbolice, generaia a cincea
va fi un procesor de informaie aproape sub orice form util omului (limbaj natural, voce,
imagine) fr a se ridica ns la nivelul unui procesor mental deplin, din momentul n care nu
putem pune semnul egalitii ntre IA i inteligena natural uman.
Proiectul japonez de calculatoare din generaia a cincea
A. Funcii:
- funciunea inteligenei, similar inteligenei omului, utilizabil n raport cu unul sau
mai multe domenii de cunoatere;
- funcii similare simului omului: auz, vz, sim tactil, vorbire, exprimare grafic sau n
imagini;
- funciunea de conversaie n limbaj natural cu omul;
- funciunea de a achiziiona cunoatere i de a colabora cu omul n explorarea unor
domenii noi;
- funciunea de consultant pentru om;
- funciunea de a se adapta i configura la diferite tipuri de activiti;
- funciunea de a scrie (autoscriere) programe informatice pornind de la cerine
specificate;
- funciunea de a se autodepna.
B. Cerine sociale
In primul rnd, creterea productivitii n domeniile care au astzi o productivitate
redus: n birouri, proiectare, agricultur, medicin, educaie, servicii, administraie
guvernamental.
n al doilea rnd a face fa competiiei internaionale; nu este nevoie s mai insistm
asupra inteniei de a se prelua conducerea tehnologic i economic n lume.
n al treilea rnd economisirea resurselor naturale i economisirea de energie.
n al patrulea rnd, a face fa unei societi cu o populaie cu vrsta mrit datorit
creterii vieii medii a omului.
n al cincilea rnd, de a nu lsa ca noile calculatoare s se ntoarc mpotriva omenirii,
deoarece calculatoarele vor fi unelte cu inteligen care vor coexista cu fiinele umane. Pot fi
amintite aici cele trei principii enunate de Asimov cu privire la roboi i cele dou principii pe
care le-am enunat cu privire la IA.
1.Un robot nu poate periclita viaa unui om, sau prin inactivitatea sa, s lase ca
aceast via s fie periclitat.
2. Un robot trebuie s asculte de ordinile primite din partea unei fiine umane, cu
condiia s nu contrazic prima regul.
3.Un robot trebuie s-i apere existena proprie, cu condiia de a nu contraveni regulei
1 i 2.

Reguli privind inteligena artificial.


1.Un sistem de IA nu va accepta sau formula o soluie a unei probleme care ar putea
periclita existena speciei umane, astzi sau n viitor, sau ar putea contrazice principiile
civilizaiei.
2.Un sistem de IA nu are drepturi politice, nu poate vota, i nu poate lua decizii fr o
supraveghere uman.
Reacia mondial fa de proiectul japonez
Proiectul japonez, elaborat sub finanarea guvernamental, a fost urmat rapid de
nfiinarea unui institut special pentru elaborarea calculatorului din generaia a cincea, ICOT
(Institute for New Generation Computer Technology), finanat de opt mari companii.
Reacia cea mai puternic la proiectul japonez s-a manifestat n SUA, apoi n Marea
Britanie i n restul Europei.
Autorii americani remarc cu oarecare nemulumire c programul japonez este privit
de muli ca fiind bazat, n mod esenial, pe rezultatele cercetrii din SUA din ultimii 20 ani,
incluznd domeniul IA. n momentul de fa, guvernul SUA, prin DARPA, finaneaz cercetri
n valoare de 1 miliard de $ pentru realizarea unor noi generaii de calculatoare.
DARPA la rndul ei finaneaz un alt program de 1 miliard de dolari pentru circuite
integrate pe scar larg i ultra larg, de vitez din ce n ce mai mare. Un numr de 11
companii au format mpreun o corporaie de cercetare MCC (The Microelectronics and
Computer Technology Corporation) cu 50 milioane dolari. La cele de mai sus se adaug
consoriul SRC (Semiconductor Reserch Cooperative) care cuprinde grupuri de cercetare ( n
totalul 150 de cercetri din 30 de Universiti), consoriu finanat din 23 companii. n fine
statul mai finaneaz un grup de 5 universiti din Carolina de Nord pentru cercetri n
domeniul microelectronicii.

1.3. Structura i funcionarea unui calculator electronic


Principalele blocuri din componena unui calculator electronic sunt prezentate n figura
1., care indic de asemenea circulaia informaiilor n calculator. Prin informaii vom nelege
n continuare att datele ct i programul pentru rezolvarea unei probleme. n afar de
informaii, n calculator sunt prezente i semnalele de comand elaborate de unitatea de
comand, precum i semnalele de rspuns emise de celelalte blocuri. Aceste semnale nu au
fost reprezentate pentru a nu ncrca figura.
Memoria
extern

Programe
+ date

Unitatea de
introducere

Memoria
intern

Unitatea de
extragere

Rezultate

UAL
UC
Unitatea central
de prelucrare

Fig. 1. Structura unui calculator electronic


Reprezentarea informaiilor n calculator se face n sistemul binar, deoarece
elementele de baz folosite n construcia calculatorului sunt prevzute cu dou stri
fundamentale. n mod convenional, se folosesc pentru cele dou stri simbolurile 0 i 1,
numite cifre binare sau bii.
Unitatea de introducere asigur prelucrarea de ctre calculator a informaiilor furnizate
de utilizatori, n primul rnd a programelor i datelor. Informaiile sunt primite n reprezentare
extern (iruri de caractere: litere , cifre i semne speciale) i convertite n reprezentarea
intern (format binar) sub care vor apare n unitatea de memorie. Introducerea datelor se
face de la tastatura calculatorului.
Unitatea de extragere are ca rol principal conversia informaiilor din reprezentarea
intern n reprezentarea extern convenabil pentru utilizator. Se folosesc ca uniti de
extragere imprimanta sau dispozitive de afiare.
Memoria intern pstreaz informaiile direct accesibile unitii centrale a
calculatorului (programe sau date). Din punct de vedere logic, memoria poate fi privit ca o
secven de cifre binare. Fizic pentru fiecare cifr binar trebuie prevzut un dispozitiv cu
dou stri stabile. Se presupune c informaia dintr-un astfel de dispozitiv se pstreaz, dac
nu este intenionat modificat, cel puin pn la deconectarea calculatorului.
Pentru accesul convenabil la informaiile nregistrate se impune o organizare
corespunztoare a dispozitivelor de memorare. Accesul la memorie este rareori posibil la mai
puin de 8 cifre binare (1 octet).
Se asociaz de obicei o adres cu fiecare octet, adic un numr prin care se
precizeaz localizarea acestuia n memorie. Adresele sunt ntotdeauna exprimate prin
7

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

Unitatea de floppydisk (FDD) - sunt de dou tipuri:


a) unitate de 5,25 cu capacitatea standard de memorare de 1,2 Mb (poate fi i de 360 Kb
sau 720 Kb)
b) unitate de 3,5 cu capacitatea standard de memorare de 1.44M b (poate fi i de 720 Kb).
Tot pentru memorarea unui volum mare de date calculatorul poate fi dotat i cu o
unitate de band cu capacitatea de memorare de 120 Mb sau 24 Mb. n ultima vreme ca
mediu extern de memorare a datelor este folosit tot mai des discul optic CD-ROM cu
capacitatea de memorare de 720 Mb (pn la 1200 Mb). Din punct de vedere al
performanelor (viteza de acces la date i capacitatea de memorare) cele mai bune medii de
memorare sunt hard disk-urile i CD-ROM-urile.Configuraia standard de calculator include n
mod obligatoriu o unitate de hard disk i o unitate de CD-ROM.
Funcionarea calculatoarelor electronice Se prezint n cele ce urmeaz ntr-un mod
extrem de simplificat activitile care au loc ntr-un calculator electronic. La punerea sub
tensiune a calculatorului se produce activarea automat a unui program intern, nregistrat
frecvent n ROM, care fie c ncarc un program memorat pe un suport magnetic, fie este
capabil el nsui s execute diferite comenzi primite de la utilizator. Aceste comenzi vor
conduce la ncrcarea n memorie intern a unui program de aplicaie i lansarea acestuia n
execuie. Execuia programului const n citirea de ctre UC a cte unei instruciuni din
program, decodificarea acesteia, elaborarea semnalelor de comand pentru efectuarea
operaiilor solicitate n instruciune i apoi trecerea la instruciunea urmtoare. De remarcat
c printre instruciuni vor exista i cereri de citire a datelor programului, care se vor introduce
astfel n memoria intern, precum i de tiprire a unor rezultate. Terminarea execuiei unui
program nu nseamn ncetarea funcionrii UCP ci revenirea n programul care poate
interpreta noi cereri de servicii de la utilizatori.

1.4. Sisteme de operare


Acestea sunt programe a cror funcie este direct legat de calculator i nu de vreun
domeniu de aplicaie. Astfel de programe numite programe de sistem, sunt de exemplu,
cele ce efectueaz conversiile ntre reprezentrile interne i externe a datelor, ansambloare,
interpretatoare, compilatoare. Odat cu dezvoltarea calculatoarelor, a crescut i game de
servicii oferite utilizatorilor prin programele de sistem.
Se poate defini un sistem de operare ca mulimea programelor de sistem prin care se
realizeaz gestionarea resurselor unui sistem de calcul i se faciliteaz legtura ntre sistem
i utilizatori.
Conform acestei definiii, principalele componente ale unui sistem de operare sunt
urmtoarele:
a) executivul care realizeaz gestionarea resurselor sistemului: echipamente
periferice, memorie, timp de unitate central, etc. i de regul nu este direct accesibil
utilizatorilor, mai ales celor ce folosesc limbaje de nivel nalt.
b) sistemul de gestionare a fiierelor, prin care se realizeaz inerea evidenei
informaiilor pstrate pe suporturi de memorie extern.
c) translatoare pentru diferite limbaje. n aceast categorie intr ansambloarele,
interpretatoarele i compilatoarele, dar i editoarele de legturi, prezente n majoritatea
sistemelor ca un pas suplimentar ntre compilatoare i lansarea n execuie a programelor.
d) programe utilitare, oferite la fiecare sistem pentru efectuarea unor operaii de rutin.
Un program frecvent utilizat este editorul de texte. Multe dintre programele utilitare sunt
destinate diferitelor operaii asupra fiierelor: copierea de pe un suport pe un alt suport,
listarea coninutului lui, tergerea, obinerea unei liste cu numele tuturor fiierelor, etc.
e) interpretorul de comenzi, care realizeaz citirea i interpretarea cererilor provenite
de la utilizatori i lanseaz n execuie programele necesare pentru ndeplinirea cererilor.
Este o component care determin imaginea unui utilizator despre sistemul de operare. O
parte din programele care compun sistemul de operare trebuie s se gseasc permanent n
memoria intern a calculatorului, pentru a asigura funcionarea corect a acestuia. Aceast
parte a sistemului de operare este nregistrat n memoria ROM.

10

Cap2.

SISTEME DE NUMERAIE

2.1. Noiuni introductive


Definiia 1. Un sistem de numeraie este format din totalitatea regulilor de
reprezentare a numerelor cu ajutorul unor simboluri numite cifre.
Definiia 2. Numrul total de cifre distincte utilizate ntr-un sistem de numeraie se
numete baza sistemului i se noteaz de obicei cu b. Exist sisteme de numeraie cu baze
diferite, baza fiind un numr natural mai mare dect 1, ia cifrele unui sistem de numeraie cu
baza b sunt cuprinse ntre 0 i (b-1).
Sistemele de numeraie sunt poziionale i nepoziionale, iar n cele ce urmeaz ne
vom ocupa numai de sistemele de numeraie poziionale.
Definiia 3. Un sistem de numeraie se numete poziional dac valoarea unei cifre
este dat de poziia pe care aceasta o ocup n cadrul numrului.
De exemplu, dac n sistemul de numeraie zecimal (b=10) considerm numrul:
n= 1993
numrul de uniti
numrul de zeci
numrul de sute
numrul de mii
constatm c, n funcie de poziia pe care o ocup, cifra 9 are valori diferite.
2.2. Reprezentarea poziional a unui numr n baza b
Pentru numerele care au numai parte ntreag, reprezentarea poziional este de
forma:

(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

2.5. Conversia numerelor subunitare din baza 10 n baza b


12

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

Dup efectuarea calculelor vom obine c:


n1=843,2714844 10.
b)
n2 1 8

38

68

2 1
3
6

.
8 64 512 4096

Dup efectuarea calculelor vom obine c: n2= 843,2729492 10.


c)
n3 3 16

4 16

768 64 11

B 16

4 16

5 16

E 16

4
5
14

16 256 4096

Dup efectuarea calculelor vom obine c: n3=843,2729492 10.


2.8. Conversia din binar n octal i hexazecimal i invers
a) Conversiile binaroctal se fac innd cont c:
08=0002
48=1002
18=0012
58=1012
28=0102
68=1102
38=0112
78=1112
Dac numrul este scris n binar, conversia n octal se face astfel: cifrele de la partea
ntreag se mpart n grupe de cte trei de la dreapta la stnga, iar cifrele de la partea
fracionar se mpart n grupe de cte trei de la stnga la dreapta (prima grup de la partea
ntreag i ultima grup de la partea fracionar se completeaz eventual n fa, respectiv n
spate, cu unul sau dou zerouri) i apoi fiecare grup de trei cifre binare se nlocuiete cu
cifra octal corespunztoare ei.
Invers, dac numrul este scris n octal, conversia n binar se face nlocuind fiecare
cifr octal cu grupul de trei cifre binare corespunztoare ei.
Problem. S se converteasc numrul x=1101001011,010001011 din baza 2 n baza
8.
Soluie. x= 001 101 001 011,010 001 0012=1513,2138 .
Problem. S se converteasc numrul x=1513,2136 din baza 8 n baza 16.
Soluie. x=1513,21368 =1101001011,0100010112 ,adic:
1513,21368=1101001011,0100010112.
b) Conversiile binar hexazecimal se fac innd cont c:
016=00002
816=10002
116=00012
916=10012
216=00102
A16=10102
14

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

2.9. Operaii aritmetice cu numere reprezentate n baza b


Fie R mulimea numerelor reale reprezentate n baza b. Aceast mulime are o
structur algebric de corp. Cele dou legi de compoziie, adunarea i nmulirea, le definim
astfel: se adun sau se nmulesc numerele din baza 10 corespunztoare cifrelor din baza b,
iar rezultatul obinut se convertete n baza b.
Exemple:
1) dac b=2, avem:
+
0
1

+
0
1
2
3
4
5
6
7
*
0
1
2
3
4
5
6
7

0
1
1

1
0
10

2) dac b=8, avem:


0
1
2
0
1
2
1
2
3
2
3
4
3
4
5
4
5
6
5
6
7
6
7
10
7
10
11
0
0
0
0
0
0
0
0
0

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

Observaie.ntr-un mod cu totul analog se alctuiesc tabla adunrii i tabla nmulirii n


orice alt sistem de numeraie. De exemplu, dac n sistemul de numeraie hexazecimal dorim
s aflm ct face DxF, procedm astfel:
- calculm 13x15=195;
- convertim numrul 195 din baza 10 n baza 16 i constatm c DxF=C3.
Problem: Se dau numerele: x=111,012; y=10,112 i se cere s se calculeze :x y, x
y, xy i xy.
Soluie. Operaiile aritmetice n baza 2 (i n general n baza b) se efectueaz dup
aceleai reguli ca i n baza 10, cu precizarea c trebuie s se in cont de tabla adunrii i
tabla nmulirii n baza respectiv.

16

a) Pentru adunare i scdere, vom avea:


111 1transport
mprumut0 10
x=111,01+
x=111,01y= 10,11
y= 10,11
x+y=1010,00
x-y=100,10
Observaie. Dac la adunare ntlnim, de exemplu, 1+1, care face 10, scriem 0 i
pstrm 1 (caz analog cu 3+7 n baza 10,cnd scriem 0 i pstrm 1 pentru poziia imediat
superioar). Cifrele care se pstreaz ( se transport) se vor scrie, pentru comoditatea
efecturii calculelor, n partea de sus,iar dac la scdere trebuie sczut 1 din 0, recurgem la
mprumut din prima cifr 1 a desczutului, ntlnit spre stnga. n acest caz n locul cifrei 1
se pune 0 (deci prima cifr din stnga diferit de zero se decrementeaz cu o unitate) i
toate zerourile consecutive ce urmeaz de la stnga la dreapta dup cifra de mprumut se
nlocuiesc cu (b-1), adic 1, iar ultimul se nlocuiete cu b, adic 10, i apoi se face
scderea.
b) Pentru nmulire i mprire, vom avea:
111,01
10,11
11101
11101
11101

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

Se poate constata c semnificaia unei informaii cifrice depinde de regulile sau de


raionamentele pe baza crora o interpretm i deci o succesiune de cifre binare poate fi
considerat ca fiind un numr sau o succesiune de litere, n conformitate cu codul ales.
ntr-un sens mai larg, putem defini noiunea de codificare astfel:
- fie X={x1,x2,...xp} mulimea simbolurilor primare emise de o surs de informaie;
- fie B={b1,b2,...bn} o mulime de simboluri elementare;
- prin operaia de codificare, se asociaz fiecrui element x i X o secven de simboluri
elementare din b, astfel nct s existe o coresponden biunivoc ntre mulimea X i
mulimea S, format din secvene de simboluri.
De exemplu, corespondena poate fi de forma:
X1
X1

b1b2b3b6b4b9=s1
b5b3b2b1=s2
...
b1b1b1b1=s2

X1

Secvenele de simboluri s1,s2,...,sp se numesc cuvinte de cod i ele formeaz de fapt o


nou mulime S= {s1,s2,...sp}.
Deci codificarea se poate defini ca fiind o aplicaie bijectiv de forma f:XS.
Codul este uniform dac toate cuvintele s 1,s2,...,sp au aceeai lungime i este
neuniform n caz contrar.
Pentru codificarea informaiilor ce urmeaz a fi preluate cu ajutorul unui calculator
electronic, mulimea B este format din elementele 0 i 1 (B={0,1}), iar cuvintele mulimii S
(care constituie codurile pentru informaia primar) sunt cuvinte binare de o anumit lungime,
n general de 8,16,24 sau 32 de bii.
Pentru microprocesorul standard, lungimea cuvntului este de 8 bii, iar suportul fizic
care implementeaz cuvntul este un registru sau o locaie de memorie cu capacitatea de 8
bii (figura 1).
Un cuvnt de 8 bii se numete octet sau byte (pronunat bait).
b7

b6

b5

b4

b3

b2

b1

bitul cel mai semnificativ

b0
bitul cel mai puin
semnificativ

Fig.1. Structura unui cuvnt memorie, cu lungimea de 8 bii.


Informaiile primare, care se codific prin cuvinte n vederea prelucrrii cu ajutorul
unui calculator, pot fi compuse att din date numerice, ct i din date alfanumerice, fapt
pentru care vom avea dou tipuri de coduri: coduri numerice i coduri alfanumerice.
Coduri numerice
Prin intermediul cuvintelor binare se pot codifica numere din sistemul de numeraie
binar, octal, zecimal, hexazecimal etc., rezultnd coduri binare, octal-binare, hexazecimalbinare etc.
Coduri binare
Exist mai multe categorii de coduri binare, dar ne rezumm la prezentarea codurilor
referitoare la reprezentarea numerelor ntregi n cod complementar i reprezentarea
numerelor reale n virgul mobil (flotant).
18

a)Fie x un numr ntreg i n numrul de poziii binare (numrul de bii) pe care se


realizeaz reprezentarea acestuia. Reprezentarea n cod complementar a numrului x, pe
care o notm cu xc, se definete astfel:
x
dac x0
xc=

2n+x dac x<0


unde de regul, n8,16,24,32.
De exemplu:
1) dac x=5 i n=8, atunci xc=000001012;
2) dac x=-5 i n=8,atunci xc=111110112.
Din definiia codului se deduce c, dac numrul este negativ, prima cifr este1, iar
dac numrul este pozitiv, prima cifr binar este 0.
b) Fie x un numr real oarecare. Forma general a unui astfel de numr este:
x=[] xnxn-1...x1x0,x-1x-2...x-m
Prin nmuliri succesive cu puteri ale bazei n care este scris numrul, virgula se poate
muta la stnga (n acest sens este numit virgul mobil), iar forma:
r=[] 0.,xnxn-1...x1x0,x-1x-2...x-m10(n+1)=M10e
se numete form normalizat (m=mantis, e=exponent).
n ceea ce privete reprezentarea n virgul mobil, aceasta se face pe 4 sau 8
octei, n simpl sau dubl precizie. Practic, n memoria unui calculator, reprezentarea unui
numr real n virgul mobil simpl precizie se face astfel: ntr-o succesiune de 32 de bii (4
octei), a crei adres de nceput este multiplu de 4, se reprezint pe primul octet exponentul
i semnul acestuia, iar pe urmtorii 3 octei se reprezint mantisa i semnul acrestuia, ca n
figura 2.
+

b6

b5

...

b1

b0

b22

b21

...

b16

b15

...

b9

b8

b7

...

b1

b0

Fig.2. Reprezentarea unui numr real n virgul mobil simpl precizie


ntr-un mod cu totul analog se face i reprezentarea numerelor reale n dubl precizie,
singura precizare ce trebuie fcut fiind c mantisa se nregistreaz pe 7 octei i deci
precizia este mult mai mare. Trebuie remarcat faptul c punctul zecimal nu se nregistreaz.
Codul octal-binar
Codul octal-binar realizeaz corespondena biunivoc ntre cifrele sistemului de
numeraie octal i cuvintele formate din 3 bii, aa cum s-a precizat anterior.
Codul hexazecimal-binar
Codul hexazecimal-binar realizeaz corespondena biunivoc ntre cifrele sistemului
de numeraie hexazecimal i cuvintele formate din 4 bii, aa cum s-a precizat anterior.
Coduri alfanumerice
Codificarea datelor alfanumerice este necesat pentru a putea memora mesaje, dar i
pentru a prelucra informaii (constante i variabile) de acest tip. n mod normal, este necesar
s se codifice 88 de caractere distincte, n care sunt cuprinse 52 de simboluri pentru literele
19

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

FA -mulimea n care DA ia valori


DA- domeniul de definiie a algoritmului
3.2. Caracteristicile algoritmilor

Orice algoritm trebuie s aib urmtoarele caracteristici importante:


a) Generalitatea. Un algoritm A este aplicabil oricrei informaii din domeniul su D A .
Aceasta nseamn c un algoritm nu rezolv o singur problem ci o clas de probleme de
acest tip.
b) Finitudinea. Numrul transformrilor ce trebuie aplicate unei informaii admisibile
pentru a obine informaia final corespunztoare este finit. De altfel, aceasta este o cerin a
definiiei algoritmului.
c) Unicitatea. Dac informaia iniial aparine domeniului unui algoritm, atunci toate
transformrile prin care acesta trece pn la obinerea informaiei finale sunt univoc
determinate de regulile algoritmului. Aceasta nseamn c dup fiecare pas regulile
algoritmului determin n mod unic pasul care urmeaz. Mai mult, regulile algoritmului
precizeaz n ce cazuri se obine informaia final, dup care algoritmul i nceteaz
aplicabilitatea. Pentru ilustrare s considerm algoritmul lui Euclid pentru determinarea c. m.
m. d. c. a dou numere a i b.

21

Algoritmul const din urmtoarele etape:


Citete a,b
i - mpritor
Atribuie da, ib
d - demprit
Repet
Atribuie rrestul mpririi lui d la i
Atribuie ir
Pn cnd i0
Scrie d.
Din aceast prezentare a algoritmului lui Euclid, se vede c la fiecare pas este univoc
determinat pasul urmtor. Astfel etapa de citire este urmat de etapa de iniializare. n
urmtoarea etap se calculeaz restul mpririi lui d la i, notat prin r. n urmtoarele dou
etape se schimb dempritul d prin actualul mpritor i, iar mpritorul i ia valoarea r. Etapa
de calcul se repet pn cnd i=0. n acest caz d=c.m.m.d.c.
Din punct de vedere structural un algoritm cuprinde, n general, urmtoarele etape:
1) iniializare
2) calcul
3) final
Etapa de iniializare i etape final au rolul de a preciza informaia iniial, respectiv
informaia final. Etapa de calcul este etapa n care se aplic o prelucrare (transformare)
efectiv a informaiei. n general, etapa de calcul conine instruciuni de calcul i instruciuni
de decizie.
3.3. Compunerea algoritmilor
Orice algoritm, orict de complex ar fi, poate fi reprezentat ca o compunere de
algoritmi cu structur mai simpl, adic poate fi descompus n algoritmi mai simpli, numii
subalgoritmi. Compunerea algoritmilor se poate face n dou moduri: prin suprapunere sau
prin succesiune.
Definiie Se numete compunerea prin suprapunere algoritmilor A1 i A2, algoritmul A1
(A2) n care A2 face parte din etapa de calcul a algoritmului A1
Ca un exemplu, s considerm metoda lui Newton pentru aproximarea unei soluii a
ecuaiei algebrice P(X)=0, unde P esteun polinom de gradul n tiind c soluia se afl n
intervalul (a,b). Dac se consider x 0(a,b) ca valoare de pornire, atunci metoda lui Newton
ne furnizeaz irul de aproximare:
x1,x2,...,xn,...
unde
P( xn1 )
xn xn1
, n 12
, ,...
P'( xn1 )
Calculul aproximantelor se continu pn cnd se obine precizia cerut.
Se poate remarca faptul c pentru calculul fiecrei aproximante este necesar s se
calculeze valorile polinoamelor P i P n punctul x n-1. Notnd prin Ap algoritmul de calcul a
valorii unui polinom ntr-un punct i prin An algoritmul metodei lui Newton, rezolvarea
problemei considerate se realizeaz conform algoritmului A n (Ap), obinut n urma compunerii
prin suprapunere a algoritmilor An i Ap .
Definiia 2. Se numete compunere prin succesiune a algoritmilor A1 i A2 i algoritmul
A1A2 n care informaia final a lui face parte din domeniul algoritmului A2 .
22

Pentru exemplificare, considerm dou numere ntregi i pozitive a i b i P un


polinom de gradul n. Se cere construirea unui algoritm pentru calculul lui P(d), unde d este
c.m.m.d.c. a lui a i b. Notnd prin AE algoritmul lui Euclid pentru calculul lui c.m.m.d.c. a lui a
i b i prin AR algoritmul pentru calculul valorii polinomului P ntr-un punct dat, algoritmul
cutat este AEAR , adic nti trebuie determinat d, care se obine ca informaie final n urma
aplicrii algoritmului AE. n continuare trebuie calculat P(d). Acest lucru se face cu ajutorul
algoritmului AR n care d apare ca informaie iniial. Algoritmul compus se va numi algoritm
principal n raport cu algoritmii A1 i A2, iar algoritmii A1 i A2 se vor numi subalgoritmi ai
algoritmului compus. La rndul su un subalgoritm poate fi considerat ca i compunerea altor
algoritmi.
3.4 Descrierea algoritmilor.
Dup ce un algoritm este elaborat, el trebuie prezentat ntr-o form accesibil
utilizatorului sau calculatorului. Aceast operaie poart numele de descrierea algoritmului.
Este important de subliniat c un algoritm se elaboreaz n forma sa universal. n
cosecin, pentru descriere trebuie folosit un procedeu care s reflecte n ntregime structura
algoritmului, dar care s nu efectueze generalitatea i universalitatea lui.
Descrierea algoritmilor se poate face n mai multe moduri:
- pseudocod ( limbaj logico-matematic)
- scheme logice
- cu ajutorul unui limbaj de programare
Fiecare form de descriere are avantajele i dezavantajele sale. n cele ce urmeaz
vom pune accent pe descrierea algoritmilor ntr-un limbaj pseudo-matematic prin cuvinte
cheie (pseudocod). Aceti algoritmi vor fi transpui n Qbasic n capitolele ce urmeaz.
Prin schem logic a unui algoritm se nelege o reprezentare grafic a algoritmului
prin care fiecrei etape din structura sa i se ataeaz un simbol numit bloc, iar modul de
nlnuire a acestor blocuri este reprezentat prin segmente orientate. Deoarece din punct de
vedere structural, un algoritm cuprinde etape de natur diferit i schema logic
corespunztoare va conine mai multe tipuri de blocuri. n continuare vom insista asupra
pseudocodului. Pentru operaiile de declarare a tipului de date, citire i scriere se utilizeaz
cuvintele cheie:
Integer list variabile - pentru date de tip ntreg
Real list variabile
- pentru date reale
Character list variabile - pentru date de tip caracter
Citete list variabile - pentru citire
Scrie list variabile - pentru scriere
Atribuie variabilexpresia - pentru operaia de atribuire
Pentru operaia de decizie se utilizeaz:
Dac condiie atunci
secvena 1
Altfel
secvena 2
unde condiie reprezint o expresie logic sau relaional. ntr-o prim faz se evalueaz
aceast expresie. Dac ea este adevrat se execut secvena1 dup care se trece la
instruciunea imediat urmtoare blocului de decizie. Secvena1 reprezint o secven de
instruciuni Basic. Dac condiia este fals se execut secvena2, dup care se trece la
instruciunea imediat urmtoare blocului de decizie:
23

Exemplu : scriei pseudocodul pentru rezolvarea ecuaiei de gradul 1


Start
Citete a,b
Dac a=0 atunci
Scrie ecuaie imposibil
Altfel
Atribuie x -b/a
Scrie x=;x
Stop
Scriei pseudocodul pentru determinarea maximului dintre trei numere a, b, c, citite.
Start
Real a,b,c, max
Citete a,b,c
Atribuie max b
Dac max b atunci
Atribuie max c
Altfel
Dac max c atunci
Atribuie max c
Altfel

Scrie max= ; max


Stop
Structuri repetitive
a) Structura cu test iniial
Ct timp condiie execut
secven

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

Structura cu test final


Repet
secvena
Pn cnd condiie

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

3.5. Probleme propuse


1) S se scrie pseudocodul pentru ordonarea descresctoare a 3 numere reale.
2) S se scrie pseudocodul pentru ordonarea cresctoare a unui ir de n numere
naturale prin comparri i permutri succesive. Dimensiunea irului i elementele lui se
citesc de la perifericul de intrare.
3) S se scrie pseudocodul pentru calculul ariei unui triunghi (S=
p(p a )( p b )( p cc ) ) , dreptunghi, ptrat, pornind de la laturi, alegerea ramurii pentru
care se face calculul ariei fcndu-se la nceput.

26

Cap. 4. Limbajul QBASIC


4.1.Introducere
Limbajul BASIC a fost creat n anul 1965 la Colegiul Darmanth (SUA), prima versiune
fiind implementat pe un sistem de calcul de tip Electric 225. Numele limbajului este un
acronim, care provine de la cuvintele din limba englez Beginners All - propose Simbolic
Instruction Code.
Scopul declarat al introducerii acestui limbaj, a fost acela de a pune la dispoziia
utilizatorilor un limbaj flexibil i simplu de utilizat, care s permit o abordare eficient a
problemelor de calcul numeric. Dintre principalele caracteristici care au fcut ca acest limbaj
s se impun pot fi amintite:
a) simplitatea limbajului (limbajul nu impune att de multe convenii i restricii ca
limbajele consacrate;
b) prezint faciliti n scrierea, punerea la punct i lansarea programului;
c) este un limbaj conversaional, flexibil, putnd fi utilizat ntr-o gam larg de aplicaii;
Dintre versiunile cele mai noi, pe PC-uri, ale limbajului BASIC putem aminti: BASICA,
GW-BASIC i QBASIC. Aceste variante de BASIC ofer faciliti deosebite de puternice
pentru prelucrarea grtafic i sonor.
Limbajul QBASIC face parte din categoria limbajelor de nivel nalt, conversaional, ce
permite lucrul interactiv.
Modul de lucru n QBASIC se mparte n dou:
- lucrul n mod program ( se execut toate instruciunile secvenial); n fereastra de
deasupra;
- lucrul n mod instruciune; fiecare instruciune se execut dup executarea tastei
ENTER (fereastra de desupt).
A. Lucrul n mod program
File

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.

Copy: permite ca textul selectat s fie copiat n Clipboard.


Paste: nsereaz textul din Clipboard n poziia curent a cursorului
Clear: permite tergerea textului selectat
New Sub: este folosit pentru a crea proceduri de tip subrutin
New Function: permite creerea unor proceduri de tip function

VIEW (comenzi pentru


aranjarea ferestrei pe
ecran)
SUBs
Split
Output Screen
Search (cutri i
nlocuiri)
Find
Repeat Last-Find
Change
RUN (execut un
program)
Start
Restart
Continue
Debug ( Depanare programe)
Step
Procedure Step

SUBs: este utilizat pentru a vizualiza,


edita sau a terge o subrutin.
Split: este folosit pentru a lucra n dou
ferestre (prin mprirea ecranului n dou
zone pe orizontal) n acelai timp.
Output Screen: terge fereastra QBasic
pentru a putea fi vizualizate rezultatele
programului lansat n execuie.
Find: este utilizat pentru a gsi un ir de
caractere.
Repeat Last-Find: repet ultima cutare
Change: nlocuiete un ir de caractere cu
un alt ir.
Start - utilizat pentru lansare n execuie a
unui program
Restart - relansarea n execuie a unui
program nceput
Continue - continu execuia unui program
care a fost oprit
Step: execut o singur linie de program
Procedura Step: execut un program linie

cu linie

Trace On
Togg Breakpoint
Set Next Statement

Trace On: lumineaz mai intens


instruciunea care se execut.
Toggle Breakpoint: pune puncte de oprire
n program.

Clear All Breakpoint: terge punctele de oprire din program.


28

Set Next Statement: schimb starea de execuie a programului.


Display: setarea culorilor, bara de defilare
Optim (comenzi pentru
numrul de spaii ale TAB-ului .
setarea ferestrei i
QBasic)
Help-Pat: specific directorul n care se
Display
afl fiierul QBasic.
Help Pat
Sintax Checking: caut linia cu eroare
Sintax Checking sintax.
Sintax Checking

Taste funcionale i combinaii de taste n operarea sub QBASIC:


- Shift + F1: deschide fereastra de Help
- F6: comut ntre cele dou moduri de operare program i instruciune
- F2: ncrcarea unui program pentru editare
- F5: lansarea programului n execuie
- F8: lansarea n execuie pas cu pas a programului
QBASIC este un limbaj de nivel nalt, conversaional, care are la baz un vocabular i
o gramatic. Vocabularul conine cele mai simple elemente cu semnificaie lingvistic, iar
gramatica este constituit dintr-un sistem de reguli referitoare la modul n care se combin
elementele vocabularului pentru a obine fraze corecte. Structura general a limbajului
QBASIC este urmtoarea:
- litere
- set caractere
- cifre
- caractere speciale
vocabular
- constante
- numerice
- alfanumerice (ir)
- identificatori
- variabile
- simple(neindexate)
- indexate
QW-BASIC
- predefinite
- liste de variabile
- numerice(aritmetice)
- relaionale
--expresii
- logice
gramatic
- ir de caractere
- instruciuni
- comenzi
- funcii

4.2. Vocabularul limbajului QBASIC


Setul de caractere
Setul de caractere este util pentru a construi cele mai simple elemente cu semnificaie
lingvistic. Dup cum rezult din schema dat anterior, exist trei tipuri de caractere, i
anume:
- literele mari i mici ale alfabetului latin. Se pot utiliza att literele mari, ct i
literele mici, deoarece ele sunt echivalente. Diferena ntre literele mici i literele mari se face
numai n cazul n care acestea intr n componena unei constante de tip ir sau n numele
unui fiier;
29

- cifrele sistemului de numeraie zecimal, adic elementele mulimii


M = 0,1,2,3,4,5,6,7,8,9,;
- caractere speciale, recunoscute de QBASIC sunt elementele mulimii
M = +,-,*,/,,^,=,(,),,,!,@,,#,$,%,&,:,;,,_,,<,>,?,., ,
Constantele
Constantele sunt mrimi a cror valoare nu se modific pe parcursul executrii unui
program. Constantele pot fi numerice i alfanumerice. Constantele alfanumerice se mai
numesc i constante ir.
Constantele numerice sunt de cinci tipuri: ntregi, octale, hexazecimale, reale n
simpl precizie i reale n dubl precizie.
Constantele de tip ntreg sunt numere ntregi, n sensul cunoscut. Reprezentarea lor
n memorie se face exact (fr rotunjire), prin trecerea din baza 10 n baza 2. Reprezentarea
se face n cod complementar, pe doi octei, fapt pentru care putem lucra cu numere ntregi
din intervalul [ -215,215-1]. Definiia codului complementar pentru reprezentarea pe doi octei
este:

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

n cazul n care A=2,B=2 I C=3.


Expresiile relaionale
ntr-o expresie relaional se compar dou valori de acelai tip (numeric sau
alfanumeric). Rezultatul comparrii poate fi adevrat (valoarea numeric - 1) sau fals
(valoarea numeric 0).
Operatorii relaionali sunt elementele mulimii:
34

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

Observaie. Asupra numerelor, operaiile logice se efectueaz bit cu bit.


Exemplu.
m
n
NOT m m OR n
m AND n m XOR N m EQV n m IMP n
-11 3
10
-9
1
-10
9
11
4
0
-5
4
0
4
-5
-5
10 -10 -11
-2
2
-4
3
-9
Expresiile alfanumerice
O expresie alfanumeric poate fi o constant de tip alfanumeric, o variabil de tip
alfanumeric sau o combinaie a acestora, care produce o singur valoare de tip alfanumeric.
Singura operaie care se poate efectua asupra datelor de tip alfanumeric este operaia de
concatenare (+).
Exemplu:
Expresia
PROGRAMAREA+IN
QBASIC
Unu+,doi+,trei,+patru!

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

Operaia executat de calculator


Citete din blocul de date cte o valoare
pentru fiecare din variabilele A,B,C i D.
Afieaz pe ecran constanta alfanumeric
a= i valoare variabilei A.
Oprete execuia programului i d controlul
la nivelul de comand.
36

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

O funcie este un subprogram care creeaz o valoare de un anumit tip, valoare ce


poate fi folosit n unele expresii din cadrul diferitelor instruciuni.
Exemple:
Funcia
ABS(X)
LEN(X$)
LOG(X)

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 aritmetice Basic


LET Y = EXP (X)
LET Y = SQR (X)
LET Y = LN (X)
LET Y = ABS (X)
LET Y = PI
LET Y = INT (X)

Funcii trigonometrice
y = sin x
y = cos x
y = tg x
y = arcsin x
y = arccos x
y = arctg x

Funcii trigonometrice BASIC


LET Y = SIN (X)
LET Y = COS (X)
LET Y = TAN (X)
LET Y = ASN (X)
LET Y = ACS (X)
LET Y = ATN (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

2) Scriei n BASIC o instruciune care s calculeze restul mpririi a dou numere M


i N.

38

Cap. 5. Introducerea i extragerea datelor


5.1. Instruciunea PRINT
nr. linie PRINT list elemente
Permite tiprirea datelor pe ecran.
List elemente cuprinde elemente a cror valori trebuiesc tiprite. Astfel de elemente
pot fi :
- variabile
- constante
- expresii
Elementele listei pot fi separate prin virgule, spaiul sau punct i virgul.
Poziiile de afiare:
Poziia fiecrui termen afiat este determinat de punctuaia folosit pentru separarea
termenilor din list. Limbajul divide linia de afiare n zone de cte 14 coloane fiecare. n lista
de expresie:
- tiprind o virgul ntre expresii, determin tiprirea urmtoarei expresii la nceputul
urmtoarei zone libere
- tiprind un punct i virgul determin ca urmtoarea valoare s fie afiat imediat
dup ultima valoare
-tiprind unul sau mai multe spaii ntre expresii are acelai efect ca punct i virgula.
Dac lista se termin cu virgul, urmtoarea instruciune PRINT va ncepe afiarea pe
aceeai linie n urmtoarea zon. Dac se termin cu punct virgul tiprirea urmtorului
PRINT va ncepe din poziia precedent cursorului (adic n zona ultimului PRINT).
Exemplu:
10 x = 5
20 PRINT X+5, X-5, X(-5)
30 END
RUN
10
0
-25
10
20
30
40

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

Format : PRINT USING V $; list de expresii;


V $ - este o constant ir sau variabil constnd din caractere speciale de formatare.
Aceste caractere de formatare determin cmpul i formatul de afiare, separate prin virgul
sau punct i virgul.
Cmpuri ir
Cnd instruciunea PRINT USING este folosit pentru afiarea irurilor, poate fi folosit
unul dintre urmtoarele formate:
! - specific faptul c va fi afiat doar primul caracter din irul dat.
\ n spaii \ - specific faptul c 2+n caractere din irul dat urmeaz a fi afiate.
Exemple:
10
20
30
40

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

5.2. Instruciunea INPUT


Are ca scop primirea informaiilor de la tastatur n timpul execuiei programului.
Format:
INPUT [;] [mesaj;] /variabil/,variabil/
mesaj - este un ir ce urmeaz a fi tiprit
list variabil - este numele variabilelor numerice sau ir sau element al unui vector
sau matrice ce urmeaz a fi citite
n timpul execuiei programului cnd se ajunge la instruciunea INPUT se afieaz pe
ecran un semn de ntrebare (dac nu exist punct virgul dup mesaj) pentru a indica faptul
c programul ateapt introducerea datelor. Dac este inclus un mesaj se va afia acel ir de
caractere. Dac mesajul este urmat de ; dup mesaj se va tipri i un semn de ntrebare.
Dac mesajul este urmat de virgul - semnul de ntrebare nu va fi tiprit . n cazul n care
programul ateapt introducerea a mai mult de un element de la tastatur, elementele vor fi
introduse cu virgul ntre ele.
Tipul elementelor introduse trebuie s coincid cu tipul declarat al variabilelor crora li
se vor atribui. Dac instruciunea INPUT este imediat urmat de virgul, indic faptul c
cursorul rmne pe aceeai linie.
Exemplu:
10
20
30
40
50

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

5.3. Instruciunile READ, DATA RESTORE


Instruciunea READ, permite atribuirea de valori pentru variabile ir i/sau numerice,
valori ce sunt definite sub forma de constante, n instruciunea DATA. Forma general:
nr.linie DATA list constante
nr.linie READ list variabile
Constantele i variabilele din list se separ prin virgul. n timpul
citirii, datele introduse prin DATA, sunt memorate ntr-o zon de date exact n ordinea n care
apar. Instruciunile DATA pot fi amplasate oriunde n cadrul programului, deoarece
interpretorul BASIC le ignor, pn n momentul n care devine executiv o instruciune
READ. n momentul execuiei acesteia, valorile din DATA, sunt atribuite variabilelor din READ
n ordinea n care acestea apar.
De exemplu:
10
20
30
40

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

5.4. Probleme propuse


1) S se scrie programul BASIC pentru calculul ariei unui triunghi pornind de la cele
trei laturi (formula lui Heron).
2) S se scrie programul BASIC pentru afiarea mediei aritmatice, geometrice pentru
4 numere citite de la perifericul de intrare.
3) S se scrie programul BASIC pentru afiarea unei fraze acceptate de la perifericul
de intrare.

45

Cap.6. Instruciuni de decizie


In mod obinuit instruciunile sunt executate n ordinea numrului de linie. Ordinea
secvenial de execuie este ntrerupt n momentul ntlnirii unei instruciuni de control sau
decizie, cnd controlul execuiei este dat sau nu unei alte instruciuni al crui numr de linie
se indic.
6.1. Instruciunea de salt necondiionat GOTO
Are rolul de a transfera necondiionat controlul la o alt instruciune al crei numr de
linie este indicat.
Forma general:
numr linieGOTO expresie; n care expresia poate fi:
- o constant;
- o variabil
- o expresie aritmetic;
toate reprezentnd numrul de linie al instruciunii la care se transfer controlul.
De exemplu:
10 GOTO 70
va transfera necondiionat controlul la instruciunea al crui numr de linie este 70. n schimb
instuciunea:
20 GOTO (I -1)10+K-I
va presupune iniial evaluarea expresiei care apare n partea de argument a lui GOTO, dup
care se va da controlul la instruciunea al crui numr de linie va fi valoarea expresiei
evaluate.
Observaie.
I i K trebuiesc definii anterior.
Exemplu:
10
20
30
40
50
60

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

reprezint ordinea de prioritate al

20 AND

sau

Expresiile logice reprezint deasemenea ntrebri la care rspunsul va fi , fie da


(adevrat), fie nu(fals). Atunci cnd se evalueaz o expresie logic se procedeaz astfel:
a) se evalueaz iniial expresiile de relaie intlnite
b) se aplic n continuare operatorii logici n ordinea descresctoare a prioritii lor.
De exemplu, relaia logic prin care se verific apartenene variabilei x la intervalul [10,25] se scrie:
x > -10 AND X < 25; fiind evaluat astfel:
47

a) se evalueaz expresiile relaionale x > = -10 i x <25


b) se aplic operatorul logic AND ntre cele dou rezultate logice obinute n etapa
anterioar.
Este evident c expresia de mai sus poate fi scris i sub forma:
NOT (X <-10) AND NOT (X >=25)
n care evaluarea se face astfel:
a) se evalueaz expresiile relaionale x <-10 i x > =25
b) se aplic operatorul NOT asupra fiecruia din cele dou expresii relaionale, dup
care se trece la aplicarea operatorului AND.
Ca i n cazul expresiilor relaionale, rezultatul evalurii este o valoare numeric, 0
pentru fals i 1 pentru adevrat.
Exemplu:
20 INPUT X
30 PRINT X > -10 AND X <20
40 END
RUN
va tipri 1 dac x [-10,20] sau 0 dac x este n afara intervalului.
n unele dialecte BASIC, domeniul de utilizare al operatorilor logici este extins,
acestea putnd fi aplicai i ntr-o expresie aritmetic i una relaional. n cadrul acestei
extensii, modul de utilizare (x este o variabil, expresie aritmetic sau ir de caractere, iar y
este o expresie relaional) este urmtorul:
X, dac y sete adevrat
X AND Y =
0, dac y este fals
1 dac y este adevrat
X OR Y =

x dac y este fals


Pentru a ilustra modul de utilizare al operatorilor logici, n acest caz, considerm
urmtoarul program:
10
20
30
40

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

6.4. Instruciunea IF logic


ntr-o prim etap prezentm intuitiv (cu ajutorul schemelor logice) aceste instruciuni.
O form primar ar avea urmtorul format:
numr linie IF E THEN instruciune
aceasta are drept corespondent n schema logic un bloc de forma:
DA
INSTRUCIUNI

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

Instruciunile IF - THEN - ELSE pot fi interptrunse. Interptrunderea este limitat doar


de lungimea liniei.
IF condiie THEN
bloc-1
ELSE
bloc-2
ENDIF
IF condiie THEN
bloc1
ELSE IF condiie 1 THEN
bloc 2
ELSE
bloc 3
ENDIF
Pentru a putea emite recomandri privind modul de scriere a instruciunilor de decizie
prezentate n urmtoarele scheme logice, lum n considerare urmtoarele exemple:
1) Scriei secvena BASIC corespunztoare urmtoarei scheme logice:
NU
DA
X0

N=N+1

P=P+1

K=K+1

a) n cazul n care INSTRUCIUNE este o instruciune de salt , secvena BASIC este


urmtoarea:
30
40
50
60
70

IF (X 0) THEN GOTO 60
LET N=N+1
GOTO 70
LET P=P+1
LET K=K+1

b) n cazul n care INSTRUCIUNE este o instruciune de atribuire, secvena BASIC


apare sub forma:
10 IF (X 0) THEN LET P=P+1
20 IF (X =0) THEN LET N=N+1
30 LET K=K+1
O variant care combin cele dou moduri anterioare poate fi:
10 IF (X 0) THEN LET P=P+1: GOTO 30
20 LET N=N+1
30 LET K=K+1
50

Se observ, n acest ultim caz, c de data aceastaINSTRUCIUNE care se


execut atunci cnd este format dintr-o instruciune de atribuire i o instruciune de salt
necondiionat.
2) Scriei secvena BASIC corespunztoare urmtoarei scheme logice:
DA
X

-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

IF( X -10) THEN GOTO 30


GOTO 70
IF (X 25) THEN GOTO 50
GOTO 70
LET S=S+X
LET N=N+1
LET K=K+1

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

IF (X -10 AND X 25) THEN GOTO 30


GOTO 50
LET S=S+X
LET N=N+1
LET K=K+1

n cazul n care se urmrete ramura de N4 a blocurilor de testare apare urmtoarea


variant:
10 IF NOT (X -10) OR NOT (X 25) THEN GOTO 30
20 LET S=S+X : LET N=N+1
30 LET K=K+1
Cele trei secvene pot fi combinate n urmtoarea secven:
10 IF NOT (X -10) THEN GOTO 30
20 IF (X 25) THEN S=S+X : N=N+1
30 K=K+1
51

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

4. Scriei programul pentru tabelarea valorilor funciei:


A

1 1 sin x
lg
2 1 sin x

n intervalul [0,3.1415] cnd x se modific cu pasul 0.25


5. Construii programul pentru tabelarea valorilor funciei logice:
f=( A B A C ) A (B C )
A,B,C se citesc; f se tiprete.
6. Scriei programul pentru calculul seriei:
S=X-

X
3

5 2! 7 3 ! 9 4 !

X se citete, iar S se va tipri dup calculul a 8 termeni.

53

Cap.7. Instruciuni de ciclare (instruciunile FOR i NEXT)


n majoritatea algoritmilor de calcul apar frecvent situaii n care secvene formate din
una sau mai multe instruciuni trebuiesc repetate de un anumit numr de ori. Pn n prezent
aceste cicluri s-au rezolvat utiliznd instruciunea IF-ul logic, ca n exemplul de mai jos:
Start
Citete n
I=1
S=0
Repet
S=S+I
I=I+1
Pn cnd I >N

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

3) Pasul dac lipsete are valoarea implicit 1; pasul poate fi negativ


4) Ciclul FOR/NEXT se execut astfel: corpul ciclului va fi executat pn la ntlnirea
instruciunii NEXT, apoi variabila de control va fi incrementat cu valoarea pasului. Dup
incrementare se compar v cu e2 dac este mai mic ciclul se repet; n caz contrar
programul se continu cu instruciunea imediat urmtoare NEXT-ului.
5) n cadrul unui domeniu controlat de instruciunea FOR se permite saltul pe
instruciunea NEXT. Aceasta este echivalent cu trecerea direct la modificarea variabilei de
control cu pasul specificat n definiia instruciunii FOR.
Exemplu: Fie un vector A(50) s se afle cte elemente pozitive , negative i zero sunt.
START
Pentru I=1,50 execut
Citete A(I)

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

De exemplu: Calculul sumei tuturor elementelor din matricea A(3,4):


3

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

7) Nu este autorizat saltul din exterior n interiorul unui domeniu controlat de o


instruciune FOR
8) Corpul unui ciclu poate:
a) s nu fie executat niciodat, dac valoarea iniial este mai mare ca valoarea
final i pasul este pozitiv
b) s fie executat o dat , dac e1=e2
c) s fie executat de un numr infinit de ori, dac pasul este zero sau un numr
negativ, cnd e1> 0 i e2 > 0.
d) un numr imprevizibil de ori, dac n interiorul domeniului controlat de FOR,
are loc modificarea de ctre utilizator a valorii iniiale sau finale, sau a pasului, sau nsi a
valorii momentane a variabilei de control (cnd acestea apar n membrul stng al unei
operaii de evaluare). Ca urmare, aceste expresii sunt strict interzise, pentru c practic scot
de sub control operaia de ciclare.
7.1. Instruciunea DO ...LOOP
Efect: Repet corpul ciclului atta timp ct condiia este adevrat (WHILE) sau pn
cnd condiia devine adevrat (UNTIL).
a) DO [WHILE | UNTIL] < condiie>
bloc instruciuni
LOOP
b) DO
bloc instruciuni
LOOP [WHILE| UNTIL] < condiie>
n cazul a) este vorba despre un ciclu cu contor iniial iar n cazul b) este vorba despre un
ciclu cu contor final.
Exemplu
1)

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

2) Construii cte un program separat pentru tabelarea valorilor:


y

ln(1 x)
1 x

n intervalul [0,1] p = 0.05

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

n intervalul [-1,1] p =0,1

2 sin x

n intervalull [1,20] p=1.5

58

3) Construii cte un program pentru tabelarea valorilor funciei:


z

( 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

Cap.8. Matrici, iruri de caractere


n BASIC, se pot declara matrici cu una sau dou dimensiuni. Pentru aceasta se
folosete instruciunea DIM ce are formatul:
nr. linieDIM declaraie matrice
O declaraie de matrici, const dintr-un nume de matrici (nume de variabil format
dintr-o singur liter, n cazul matricilor a cror elemente sunt numere) urmat, ntre
paranteze, de dimensiunea (sau dimeinsiunile) matricii date sub forma de constante sau
variabile ntregi. n acest ultim caz, este necesar atribuirea n prealabil unei valori variabilei
(sau variabilelor) care definesc dimensiunea matricii. Declararea prin instruciunea DIM a
unei matrici poate fi fcut n cursul unui program, cu condiia de a fi n faa primei linii ce o
utilizeaz. Elementele unei matrici, poart denumirea de variabile indexate, datorit, pe de o
parte, modului n care pot fi adresate, iar pe de alt parte, pentru a le deosebi de variabilele
simple din program. Un element din matrice, deci o variabil indexat, poate fi adresat,
specificnd numele matricei urmat n paranteze de lista de indici ce caracterizeaz poziia
elementului n cadrul matricei. Indicii pot fi constante, variabile ntregi, ca i expresii
aritmetice a cror valoare obinut n urma evalurii se trunchiaz la o valoare ntreag. De
exemplu, presupunnd c este necesar utilizarea unei matrici cu 3 linii i 4 coloane,
denumit M, aceasta se va declara sub forma:
10 DIM M(3,4)
un element al, acestei matrici se va adresa sub forma:
a) M (1,2); specificnd explicit prin constante ntregi, poziia elementului solicitat;
b) M (i,j); specificnd prin variabile ntregi (a cror valoare este necesar s fie n
prealabil dat) poziia elementului;
c) M (a+5, re) specificnd prin expresii aritmetice ntregi, poziia elementului,
expresia fiind evaluat n momentul adresrii elementului.
8.1.Iniializarea matricilor
Operaia de iniializare, impune specificarea explicit a fiecrui element de matrice
cruia urmeaz s i se atribuie o valoare prin citire. Exist dou modaliti de iniializare, n
prima utilizndu-se instruciunea READ, iar n cea de a doua INPUT. Presupunnd c dorim
s iniializm elementele matricii M (3,4), operaia poate fi efectuat astfel:
a) 10
20
30
40
50
60
70
80

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

8.4. Subiruri de caractere


Fiind dat un ir de caractere, un subir, const dintr-un set de caractere consecutive
din acesta, luate n secven. n ideea acestei definiii, un ir va reprezenta ntotdeauna un
subir a unui ir mai mare. Modul curent de a obine un subir dintr-un ir este dat de:
ir (nceput subir TO sfrit subir)
astfel c, de exemplu
abcdef(2 TO 5)=bcde
Dac se omite nceputul subirului, atunci acesta este presupus egal cu 1; iar dac se
omite sfritul subirului, acesta este presupus ca fiind egal cu lungimea irului. Astfel,
abcdef(TO 5)=abcde
abcdef(2 TO)=bcdef
fiind evident n acest caz c:
abcdef(3)=abcdef(3 TO 3)=c
iar dac se solicit obinerea unui subir care nu este inclus n ir, se obine un ir vid. De
exemplu:
abcdef(7 TO 8)=
n continuare, se prezint un exemplu de obinere a unui set de subiruri dintr-un ir
de caractere iniializat printr-o operaie de atribuire.
10
20
30
40
50

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)

unde: - param este o expresie ir coninnd parametrii de recuperat


- n este o expresie ntreag cu valori ntre 1 i 255 dac este utilizat un argument ir,
ENVIRON$ recupereaz un ir coninnd al n-lea parametru din tabelul de referine globale,
pentru tot irul
param=text
Exemplu: n momentul ncrcrii iniiale, DOS atribuie parametru numit COMSPEC
care indic sistemului de operare unde s localizeze fiierul COMMAND.COM i atribuie o
cale de acces nul. Pentru a observa coninutul tabelului de referine globale la momentul
iniializrii se scrie urmtoarea instruciune BASIC:
10 PRINT ENVIRON$(1); care va avea ca efect tiprirea pe ecran:
PATH =
Dac se introduce:
20 PRINT ENVIRON$(2): se va afia
COMSPEC=C:\COMMAND.COM
Dac se introduce
30 PRINT ENVIRON$(COMSPEC): se va afia:
C:COMMAND.COM
Programul urmtor salveaz tabelul de referine globale BASIC ntr-un vector. Acest
tabel poate fi modificat ntr-un proces descedent. Dup ce acest proces este ncheiat,
referinele globale sunt realocate:
10 DIM TABEL$(10)
20 PARAM=1 (nr. iniial de parametri)
30 WHILE LET (ENVIRON$(PARAM))>0
40 TABEL$(PARAM)=ENVIRON$(PARAM)
50 PARAM=PARAM+1
60 WEND
70 PARAM=PARAM-1 (ajusteaz parametrii)
n continuare se salveaz noile referine globale
90 ENVIRON DATAIN=C:\DATAIN\INP.FIL
100 ENVIRON SORT.DAT=SORT.DAT<ENVIRON$
(DATAIN)+>LPT1:
-------------------------------------1000 SHELL ENVIRON$(SORT.DAT)
1010 FOR I=1 TO PARAM
1020 ENVIRON TABEL$(I)
1030 NEXT I
- - -- - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -HEX$ evalueaz un ir de caractere ce reprezint valoarea hexazecimal a
argumentului zecimal.
Format:
V$=HEX$(n)
64

n este o expresie numeric cu valori cuprinse n intervalul -3276865535. Dac n este


negativ este folosit forma complementului fa de 2. Astfel HEX$(-n) este echivalent cu
HEX$(65535-n)
Exemplu:
10 INPUT X
20 A$=HEX$(X)
30 PRINT X ZECIMAL NSEAMNA$HEXAZECIMAL
40 GOTO 10
RUN
232
32 ZECIMAL NSEAMN 20 HEXAZECIMAL
21023
1023 ZECIMAL NSEAMN 3FF HEXAZECIMAL
INPUT$ evalueaz un ir de n caractere citite de la tastatur sau dintr-un fiier.
IOCTL$ citete un ir de date de control de la un driver de periferic care a fost
deschis anterior.
Format:
V$=IOCTL$(#nr. fiier)
nr. fiier este numrul fiierului deschis.
Exemplu: n acest program se verific dac un ir de control a fost recepionat corect.
10 OPEN COM AS#1
20 IOCTL #1, SW132;GW
30 IF IOCTL $(1)=132 THEN
PRINT INSTALAT CORECT
LEFT$ extrage cele mai din stnga n caractere din irul X$.
Format:
V$=LEFT$(x$,n)
x$ este orice expresie ir; n este o expresie numeric ce este cuprins ntre 0 i 255.
Specific numrul de caractere ce urmeaz a fi citite. Dac n este mai mare sau egal cu
LEN(X$), atunci se va extrage ntregul ir x$. Dac n=0 va fi extras irul nul.
Exemplu:
10 A$=MULT/PUIN
20 B$=LEFT$(A$,4)
30 PRINT B$
RUN
MULT
MID$ evalueaz partea dorit a unui ir de caractere dat cnd este folosit ca
instruciune, nlocuiete o poriune a unui ir cu un alt ir.
65

Ca funcie: V$=MID$(x$,n[,m])
Ca instruciune: MID$(V$,n[,m])=y$
unde:

x$ este orice expresie ntreag


n este o expresie ntreag cuprins ntre 1 i 255
m este o expresie ntreag cuprins ntre 0 i 255
Funcia evaluez, din irul x$, un ir de lungime m caractere, ncepnd cu al n-lea caracter.
Dac se omite m sau dac n dreapta se afl mai puin de m caractere ncepnd cu
caracterul n, atunci se vor evalua cele mai din dreapta caractere din irul x$ ncepnd cu
caracterul n.
Pentru instruciunea MID$....=y$
V$ este o variabil ir n care se va opera nlocuirea
n este o expresie ntreag cuprins ntre 1 i 255
m este o expresie ntreag cuprins ntre 0 i 255
y$ este o expresie ir
Caracterele din irul vid V$, ncepnd din poziia n sunt nlocuite cu caracterele din irul y$.
Parametrul opional m se refer la numrul de caractere din irul y$ ce urmeaz a fi nlocuit.
Dac m este omis atunci irul y$ este nlocuit .
Exemplu: Utilizeaz funcia MID$ pentru a selecta poriunea din mijlocul irului B$
10 A$=BUN
20 B$=DIMINEAA ZIUA SEARA
30 PRINT A$; MID$(B$,10,5)
RUN
BUN ZIUA
Urmtorul exemplu ilustreaz instruciunea MID$
10 FISA$=POPESCU - 97.39.66
20 TEL.NOU$=94.15.26
30 MID$(FISA$,11,8)=TEL.NOU$
40 PRINT FISA$
RUN
POPESCU - 94.15.26
MKI$; MKS$; MKD$ convertete valori de tip numeric n valori de tip ir.
Format
V$=MKI$ (expresie ntreag)
V$=MKS$ (expresie simpl precizie)
V$=MKD$ (expresie dubl precizie)
Orice valoare numeric ce urmeaz a fi plasat ntr-o memorie de fiier tampon aleatoriu cu
instruciunile LSET sau RSET trebuie s fie convertite ntr-un ir MKI$ convertete un ntreg
ir de 2 octei, MKS$ convertete un numr n simpl precizie ntr-un ir de 4 octei, iar MKD$
convertete un numr n dubl precizie ntr-un ir de 8 octei. Aceste funcii difer de funcia
STR$ deoarece ele nu schimb n mod real valoarea lor prin conversia n caractere, ci doar
prin modul n care limbajul interpreteaz aceti octei.
66

Exemplu:
100
110
120
130

FIELD #1,4 ASD$, 20 ASN$


LSET D$=MKS$(J)
LSET N$=A$
PUT #1

OCT$ evalueaz un ir ce reprezint valoarea octal a argumentului zecimal.


V$=OCT$(n) n este o expresie numeric cuprins ntre -32678 i 65535. Dac
n este negativ este utilizat forma complementului fa de doi.
OCT$(-n) este identic cu OCT$(65535-n).
RIGHT$ atribuie irului V$ cele mai din dreapta n caractere din irul X$.
Format:
V$=RIGHT$(X$)
X$ este orice expresie ir
n este o expresie ntreag ce specific numrul de caractere ce urmeaz a fi citite.
Exemplu:
10 N$=TIINE ECONOMICE
20 PRINT RIGHT$(N$,9)
RUN
ECONOMICE
SPACE$ are ca rezultat un ir de n operaii.
Format:
V$= SPACE$(n)
unde n este cuprins ntre 0 i 255
Exemplu:
10 FOR I=1 TO 5
20 X$=SPACE(I)
30 PRINT X$;I
40 NEXT I
STR$ transfer o valoare ntr-un ir de caractere ASCII
Format:
V$=STR$(X)
unde x este orice expresie numeric; dac x este pozitiv, irul rezultat va conine n fa un
spaiu (spaiul rezervat pentru semnul plus).
Exemplu:
? STR$(321); LEN(STR$(321))
321
Funcia VAL este complementara funciei STR$.
LEN evalueaz numrul de caractere din irul x.
Format:
V=LEN(x$)
unde x$ este orice expresie ir.
67

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

8.6.Matrici cu iruri de caractere


Dup cum am specificat, un ir de caractere, reprezint de fapt, o matrice
monodimensional a crei elemente conine cte un caracter al irului, i a crei dimensiune
se stabilete n momentul iniializrii irului (printr-o operaie de atribuire, sau printr-o citire).
n ideea acestui mod de tratare a unui ir de caractere vom privi n continuare i matricile cu
iruri de caractere. Matricile monodimensionale cu iruri de caractere se declar sub dou
forme:
< nr. linie>DIM< nume$(d)>
< nr. linie>DIM< nume$(d,l)>
n care nume$, reprezint identificatorul matricei, d dimensiunea acesteia, iar l lungimea
maxim a irului care se admite pentru fiecare element din matrice. Astfel ntre cele dou
moduri de declarare exist o deosebire esenial, n primul caz lungimea unui element de
matrice se stabilete n momentul iniializrii elementelor matricei, n cel de-al dolea caz,
lungimea nu reprezint dect un criteriu de dimensionare a matricei, nefiind obligatorie n
timpul execuiei programului utilizarea unor elemente cu lungimea exact egal cu cea
declarat (pot apare elemente cu lungimea exact egal cu cea declarat, sau pot apare
elemente cu lungimea mai mic, evident ns, nu cu lungime mai mare dect cea declarat).
n continuare prezentm dou exemple:
10
20
30
40
50
60
70
80

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

n primul exemplu, elementele matricei a$ au o lungime de 5,3 i 6 caractere. Aceast


lungime nu mai poate fi depit n prelucrri ulterioare. n cel de-al doilea exemplu, n
momentul alocrii matricei a$ se specific c elementele acestei matrici au o lungime de 7
caractere. Iniializarea elementelor matricei se face similar cu primul caz , dar de data
aceasta ns, o iniializare a elementului cu numrul 2, dat de o instruciune oarecare va fi
permis. Matricile bidimensionale cu iruri de caractere se declar sub forma:
< nr. linie>DIM< nume$(d1,d2)>
n care d1, d2, reprezint numrul de linii, respectiv de coloane din matrice. Din punct de
vedere formal, modul n care este definit matricea, este identic cu cel de definire a unei
matrici monodimensionale, diferena aprnd n momentul iniializrii elementelor matricei i
n continuare, de modul de utilizare (care este impus ns de operaia de iniializare).
n exemplul de mai jos:
10
20
30
40
50
60
70

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

Metoda trapezelor const din:


b
f ( a) f (b) n1

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)

va avea ca efect tiprirea irurilor 23abc i respectiv 123a.


9.2. Subprograme de tip subrutin. Instruciunile GO SUB i RETURN
O subrutin BASIC, se constituie ca o secven obinuit de instruciuni. Ea se
apeleaz n program, folosind instruciunea:
numr linieGO SUB numr linie subrutin
unde : numr linie subrutin reprezint numrul primei linii din subrutin. Din subrutin
controlul este transmis napoi n programul apelat, la instruciunea ce urmeaz imediat dup
GO SUB, printr-o instruciune de forma:
numr linieRETURN [ numr linie1]
unde - numr linie1 reprezint numrul de linie pe care se face returnarea
Pentru a ilustra modul de utilizare a subprogramelor de tip subrutin, vom construi
programul pentru calculul
k

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

b) deoarece modul de apelare a subprogramului i de definire a acestuia nu permite


definirea de parametri formali i efectivi prin intermediul crora s se efectueze schimbul de
informaii, este necesar specificarea explicit a datelor pentru care se dorete efectuarea
calculelor, ca i a variabilelor care vor conine rezultatele calculelor. Din acest motiv, se
recomand ca apelarea unei subrutine (n cazul n care este necesar un schimb de
informaii) s se fac sub forma:
date de intrare: GO SUB n l s: rezultate
n date de intrare, vor apare una sau mai multe instruciuni de atribuire prin care
variabilele ce reprezint datele de intrare n subrutin vor primi valori. n rezultate, vor
apare de asemenea, una sau mai multe instruciuni de atribuire, prin care valorile calculate
se vor atribui variabilelor din programul care a apelat subprogramul.
c) deoarece subrutina nu reprezint o unitate independent de program, n cadrul unui
program principal care face apel la ea, se recomand, pentru a nu modifica nedorit valorile
variabilelor din programul principal, n urma execuiei subrutinei (dac subrutina utilizeaz
aceleai variabile ca programul principal), s se utilizeze variabile care nu apar n programul
principal. Cu alte cuvinte, este recomandabil, ca subrutina s utilizeze variabile proprii de
cele din programul apelant.
d) subrutinele pot fi apelate oriunde, ntr-o unitate de program BASIC.
9.3.Probleme propuse
1. Construii programul pentru determinarea rdcinii reale prezente n intervalul [a,b]
cu o precizie de 10-4 prin metoda njumtirii intervalului pentru ecuaiile:
x4+3x3-9x-9=0; a=1, b=2
x4-4x3+4x2-4=0; a=-1, b=0
x4-10x3-16x+5=0; a=0, b=1
x4-x3-9x2+10x-10=0; a=-4, b=-3
Utilizai un subprogram de tip funcie pentru calculul valorii funciei ntr-un punct x dat.
2) Construii programul pentru calculul unei integrale prin metoda de cuadratur a lui
Gaus. Se cunoate c:
b

f ( x)dx
a

b a 5
f ( x i)cux
2 i1 Ai

ba ba

t
2
2

unde - t1=t5=0.906179846; A1=A5=0.236926885


- t2=t14=0.5384
A2=A4=0.478628670
- t3=0
A3=0.568888889
Utilizai un subprogram de tip funcie, pentru calculul funciei de integrat. Aplicai
programul pentru calculul urmtoarelor integrale:

74

dx
log(1 x)
e
dx.
1 x;
2 dx;
1
sin x
1
0 1 x
0
3

10. GRAFIC N QBASIC


Programarea grafic n QBASIC este foarte simpl. Toate adaptoarele grafice CGA,
HERCULES, VGA, au fiecare specificul lor, programatorul fiind astfel obligat s adapteze
programele sale n funcie de adaptorul utilizat.
10.1 Elemente de baz n grafic
Exist comenzi grafice QBASIC pentru toate adaptoarele existente. Presupunem c n
exemplele urmtoare un adaptor grafic CGA, EGA sau VGA. Indicaiile pentru utilizatorii de
adaptoare HERCULES vor fi furnizate de fiecare dat.
n mod normal, ecranele calculatoarelor lucreaz n mod text, adic un mod n care se
afieaz numai caractere. Acest mod se numete mod text sau mod grafic 0. Pentru a putea
realiza grafic pe calculator trebuie comutat, din modul text n alt mod grafic, care permite
manevrarea fiecrui punct al ecranului.
Desigur c un adaptor VGA are un numr mare de posibiliti. Modul grafic poate fi
activat cu instruciunea SCREEN, ntotdeauna n funcie de adaptorul grafic disponibil.
Codurile grafice sunt definite de la 0 la 13, fiecare avnd particularitile lui. Vom prezenta o
list de moduri grafice pentru SCREEN, indicnd rezoluia, numrul de caractere i, desigur
tipul de adaptor necesar. Dac se ncearc trecerea ntr-un mod neadecvat adaptorului
folosit, QBASIC indic un mesaj de eroare.
SCREEN 0
SCREEN 1

SCREEN 2
SCREEN 3

SCREEN 4
SCREEN 7
SCREEN 8
SCREEN 9

SCREEN 10

SCREEN 11
SCREEN 12

Mod text, toate adaptoarele. Conform adaptorului, instruciunea


WIDTH permite definirea numrului de linii i coloane.
Rezoluie 320*200, CGA/EGA/VGA/MCGA.
Text cu 40*25 caractere, grafic cu 2 (CGA) sau 4 (EGA/VGA)
culori.
Rezoluie 640*200, CGA/EGA/VGA/MCGA.
Text cu 80*25 caractere, grafic monocrom.
Rezoluie 720*348, plac HERCULES monocrom.
Text cu 80*25 caractere, alb-negru.
ATENIE: QBHERC i MSHERC trebuie lansate nainte de
QBASIC.
Rezoluie 640*200, plac special (exemplu Olivetti).
Text cu 80*25 caractere, grafic color pe negru.
Rezoluie 320*200, EGA/VGA.
Text cu 40*25 caractere, grafic cu 16 culori.
Rezoluie 640*200, EGA/VGA.
Text cu 80*25 caractere, grafic cu 16 culori.
Rezoluie 640*350, EGA/VGA.
Text cu 80*25 sau 80*43 caractere (depinde de memoria
adaptorului), grafic cu 4 sau 16 culori.
Rezoluie 640*350, EGA/VGA numai pe monitor monocrom.Text
cu 80*25 sau 80*43 caractere (depinde de memoria
adaptorului), grafic cu 4 atribute.
Rezoluie 640*480, VGA.
Text cu 80*30 sau 80*60 caractere, grafic monocrom.
Rezoluie 640*480, VGA.
75

SCREEN 13

Text cu 80*30 sau 80*60 caractere, grafic cu 16 culori.


Rezoluie 320*200, VGA.
Text cu 40*25 caractere, grafic cu 256 culori.

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

primului element al tabloului (numai pentru EGA i VGA).


PMAP (<startcoordinate>,<mod>)
Conform cu <mod> convertete valoarea <start coordinate> fizic n coordonate logice i
invers:
<mod>=0 x logic convertit n fizic
=1 y logic convertit n fizic
=2 x fizic convertit n logic
=3 y fizic convertit n logic
VIEW[SCREEN](X1,Y1)-(X2,Y2)[,<color>][,<border>]
Definete o fereastr de afiare ntre coordonatele (X1,Y1) i (X2,Y2), de culoarea <color>
i ncadrat de culoarea <border>.
WINDOW [SCREEN](X1,Y1)-(X2,Y2)
Definete un sistem de coordonate propriu din poziia de coordonate virtuale (X1,Y1) pn
la (X2,Y2). n mod normal (X1,Y1) se gsete n stnga jos, dac este utilizat SCREEN
,coordonatele se gsesc n stnga sus.

10.2. Modurile grafice


La prima vedere, marea varietate de moduri grafice complic programarea, deoarece
trebuie bine precizat modul folosit. Dar astfel se ofer posibilitatea de adaptare la cea mai
bun rezoluie grafic a exigenelor unui program.
Vom prezenta un program care testeaz toate modurile grafice i care, dac este
posibil, realizeaz comutarea pentru a prezenta particularitile fiecruia.
***Testarea modurilor grafice n QBASIC***
ON ERROR GOTO imposibil
GOSUB ecran
DO
READ sc%,cx%,cy%,col%,gx%,gy%,nume$
**citete parametrii
IF sc% = -1 THEN EXIT DO
ok sc% = 1
SCREEN sc%

**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

**restaurare imagine normal

END
afiaremod:
77

WIDTH cx%,cy%

**definirea numrului de linii

LOCATE 3,3 :PRINT SCREEN ;sc%;,;nume$


LOCATE 4,3 :PRINT USING # *# caractere alfanumerice ;cx%;cy%
FOR i% = 5 TO cy%
LOCATE i%,2 :PRINT i%
**numrarea liniilor
NEXT i%
IF gx% THEN LINE (0,0)-(gx% -1,gy% -1),,B

**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

DATA 11, 80, 30, 2, 640, 480, VGA-grafic monocrom


DATA 11, 80, 60, 2, 640, 480, VGA-grafic monocrom/2
DATA 12, 80, 30, 16, 640, 480, VGA-grafic
DATA 12, 80, 60, 16, 640, 480, VGA-grafic/2
DATA 13, 40, 25, 256, 320, 200, VGA-grafic
DATA -1, 0, 0, 0, 0, 0, SFRIT!
Dac lansm acest program, el va comuta n toate modurile grafice. Cnd acest lucru
nu este posibil, mesajul de eroare este dirijat spre rutina de eroare imposibil, care afieaz
un mesaj corespunztor. Altfel se afieaz toate datele acestui mod, liniile sunt numerotate,
se traseaz un cerc i un ptrat i este prezentat o palet de culori disponibile. Dup
apsarea unei taste, se editeaz modul urmtor i apoi urmtorul, pn la terminarea
modurilor din lista DATA sau pn se apas <ESC>.
Cu ajutorul acestor dou elemente de baz, cercul i ptratul, se vor verifica uor
precizia monitorului. Unele moduri deformeaz aceste figuri, astfel nct ptratul devine
dreptunghi i cercul o elips. Acest lucru este vizibil atunci n modul 2, unde deformarea
patrulaterelor i cercurilor este foarte diferit.
screen 1, CGA-grafic
%40 * %25 caractere alfanumerice
screen 1, CGA/EGA - grafic culori
%40 * %25 ca
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Pentru aprofundarea programrii grafice, realizm un program ce va afia un
foc de artificii multicolor pe ecran.

***Foc de artificii n QBASIC***


79

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

Se observ c unghiul transmis funciilor trigonometrice SIN() i COS() sau TAN() nu


este n grade, ci n radiani. Un cerc nu este definit de la 0 la 360, ci de la 0 la 2 *PI radiani
Conversia se face simplu prin regula: gradele sunt multiplicate cu (PI/80):
y = x * 2 * PI / 360 adic y = x * 3.1415926 / 180
Un unghi de 90 grade se obine astfel
y = 90 * 3.1415926 / 180
y = 1.5707963

10.3.1.Program de trasare a cercului


Plecnd de la funciile SIN i COS putem trasa un cerc, ceea ce se poate realiza i
prin instruciunea CIRCLE. Vom folosi un mic artificiu n scopul de a reduce timpul de calcul,
trasnd n realitate patru arce de cerc:
***Trasarea unui cerc***
SCREEN 11
FOR unghi = 0 TO 1.57 STEP .01**de la 0 la 2 * PI
cs% = 50 * COS (unghi)
sn% = 50 * SIN (unghi)
PSET (100 + cs%, 100 + sn%)
PSET (100 - cs%, 100 + sn%)
PSET (100 + cs%, 100 - sn%)
NEXT unghi

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%)

**umple coloanele cu un motiv

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

- plasm funcia YFunc = f(X,Z) n YFunc;


- lansm programul pentru o prim testare;
- modificm eventual coeficientul de afiare din coef;
- modificm eventual pasul ntre X i Z;
- relansm i privim graficul n 3D.
Programul pare dificil de neles la prima abordare, dar funcioneaz n realitate dup
un principiu simplu. n interiorul a dou bucle imbricate, dintre care prima definete
profunzimea (poziia Z) i a doua orizontala (poziia X), calculm valorile nlimii
corespunztoare (poziia Y) n FUNCTION YFunc().
Pentru a adapta curba la ecran, valoarea este multiplicat printr-un factor predefinit. n
funcie de modul grafic folosit, putem modifica acest factor n mod corespunztor.
Plecnd de la valoarea Y calculat, calculm poziia imaginii XP% i YP% care
reprezint punctul. Acest punct este apoi adugat la cele precedente printr-o linie i partea
situat dedesubt este tears, ceea ce permite obinerea unui nivel netrasparent.
***Desen n 3D n QBASIC***
***Funcia Y = f(X,Z) trebuie s se gseasc n FUNCTION YFunc
DECLARE FUNCTION YFunc!(X!,Z!)
coef = 18
SCREEN 8
**EGA/VGA
SCREEN 3
**Hercules
PRINT ***Curb n 3D ***
YMax% = 0
FOR Z = 1 TO 120
FOR X = 1 TO 400 STEP 5
Y = YFunc(X,Z) * coef
**determin Y
YP% = 50 + Z - Y
**calcularea poziiei imaginii
XP% = X + Z *2
IF YP% >YMax% THEN YMax% = YP ** punctul cel mai de jos este
ters
IF X>1 THEN LINE -(XP%,YP%),7
**se traseaz linia (1)
LINE (XP%,YMax%) - (XP%,YP%),0
**terge partea de jos
IF X >1 THEN PSET (XP%,YP%),7
**poziionarea punctului (2)
NEXT X
NEXT Z
Constatm c sunt dou variante disponibile numerotate (1) i (2). n varianta (1),
este trasat o linie de la fiecare punct calculat n planul Z, pn la punctul urmtor, n timp ce
n varianta (2), este plasat un singur punct. Varianta (1) are dou avantaje: curbele sunt
realmente trasate i pasul buclei X poate fi crescut, ceea ce reduce n mod evident timpul de
calcul. Dezavantajul este acela c tergerea liniilor ascunse nu este complet, dar aceasta
poate fi considerat ca fiind un efect de transparen !
Prezentm i rutina YFunc, n care este reprezentat grafic funcia
Y= f(X,Z). Se propun spre studiu dou funcii:
FUNCTION YFunc (X,Z)
YFunc = SIN (X / 30) + COS (Z / 10) * COS (X / 100)
YFunc = SIN (X /30 + Z / 5)
END FUNCTION
84

10.5. Comanda de desenare DRAW


DRAW este o instruciune grafic foarte interesant. n irul pe care l transmitem ca
parametru pot fi coninute una sau mai multe comenzi DRAW. Aceste iruri se mai numesc i
macrouri. Trasarea se efectueaz conform indicaiilor din ir. Majoritatea acestor comenzi
sunt formate dintr-o liter urmat de un numr. Dac nu se precizeaz nici un numr, se
consider n mod implicit valoarea 1.
U[nr]
D[nr]
L[nr]
R[nr]
E[nr]
H[nr]
F[nr]
G[nr]
B
N

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

10.5.1. Caractere n diferite mrimi


Definirea caracterelor sub forma macrourilor DRAW este un lucru foarte laborios.
Fiecare caracter se traseaz pornind din poziia curent a cursorului, tiind c punctul de
plecare se gsete n colul superior stng al ecranului. Dup trasarea fiecrui caracter,
cursorul va trebui repoziionat n dreapta sus lng cifr. Cursorul se aduce n aceast
poziie fr a desena, cu ajutorul opiunii B.
***Caractere modificabile n QBASIC***
***Tablou pentru Drawchar***
DIM SHARED c$(11)
c$(0)=r2d4l2u4r2br2
c$(1)=brr1d4u4br2
c$(2)=r2d1g2d1r2bu4br2
c$(3)=r2d4l2bu2r2u2br2
c$(4)=d2r2d2u4br2
c$(5)=r2l2d2r2d2l2r2u2bu2br2
c$(6)=r2l2d4r2u2l2r2bu2br2
c$(7)=r2d1g2d1bu4br4
c$(8)=r2d4l2u4d2r2u2br2
c$(9)=r2d2l2u2r2d4l2r2u4br2
c$(10)=bd2r2bu2br2
**minus
c$(11)=bd4r1brbu4br
**punct
S vedem cum funcioneaz: considerm caracterul 7, coninut n macroul DRAW
c$(7). Acest macrou lucreaz astfel:
DRAW r2d1g2d1bu4br4
r2
2 puncte spre dreapta
d1
1 punct n jos
g2
2 puncte n jos spre stnga
d1
1 punct n jos
bu4
4 puncte n sus, fr a trasa
br4
4 puncte spre dreapta, fr a trasa.
Rezultatul este un caracter care seamn cu cifra 7. Trasarea este realizat printr-o
subrutin SUB avnd numele Drawchar , ce are trei argumente: valoarea cifrei de scris i
coordonatele X i Y.
SUB Drawchar (v#,xp, yp)
PSET (xp, yp),0:DRAW c7
IF v# = 0 THEN
DRAW c$(0)
ELSE
IF v# < 0 THEN DRAW c$(10) END IF**semnul minus
c$ = STRS (v#)
86

FOR i% = 2 TO LEN (c$)


w$ = MID$ (c$,i%,1)
IF w$ = . THEN w$ = 11 END IF
DRAW c$ (VAL(w$))
NEXT i%
END IF
END SUB

**punct

Derularea este urmtoarea:


Se ncepe prin plasarea unui punct de culoarea fondului, la poziia curent. Culoarea
alb este apoi definit pentru trasarea prin DRAW c7. Urmeaz un test pentru a verifica dac
valoarea este 0. Dac da, se traseaz un zero i se termin. Dac se transmite o valoare, se
verific mai nti dac este negativ. Dac da, atunci se afieaz semnul minus definit n
c$(10). Apoi valoarea este convertit n ir de caractere i trasat caracter cu caracter.
Punctul zecimal este trasat prin macroul c$(11).
Cu ajutorul acestei subrutine SUB i a macrourilor ce definesc cifrele este acum
posibil plasarea legendei sub orice grafic. Exemplul urmtor prezint cteva aplicaii, dup
ce comutm ntr-un mod grafic oarecare.
SCREEN 2
FOR i% = 1 TO 30
Drawchar (i%), 10, i%*6
NEXT i%
valoare# = -12345.6789#
DRAW S12
Drawchar valoare#,100,200
DRAW A2
Drawchar valoare#, 220,50
DRAW A0S40
Drawchar valoare#, 60,80
DRAW A1S30
Drawchar valoare#,480,180
END

**caractere mari
**invers
**caractere foarte mari
**rotire cu 90 grade

Este evident ct de uor se adnoteaz grafice cu aceast funcie. Dac trasm


graficul ntr-un mod grafic de nalt rezoluie, cum sunt de exemplu modurile 11 sau 12, vom
remarca ct de mici devin caracterele. Pe de alt parte, ntr-un mod precum 2, se constat
c semnele sunt deformate sau se suprapun. n acest caz, trebuie s renunm la
reprezentarea vertical sau la creterea unitii.
10.6. Animarea imaginilor
Pe lng elaborarea imaginilor statice, se pune tot mai mult problema obinerii
imaginilor animate, nu numai n jocuri. O imagine pe calculator nu se poate deplasa n
adevratul sens al cuvntului i atunci iluzia de micare este creat prin tergerea vechii
imagini i crearea uneia noi la o alt poziie.
Un exemplu foarte simplu este cel al unei mingi care se deplaseaz i sare dup ce
atinge marginea ecranului. Acest lucru este realizat n programul urmtor:
***Animarea unei mingi n QBASIC: n mod text***
mingex% = 5

**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%

**o mic pauz

LOCATE mingey%, mingex%


PRINT ;

**tergerea mingii

mingex% = mingex%+mingedx% **noua poziie


mingey% = mingey%+mingedy%
IF mingex% <2 OR mingex%> 78 THEN **sritur stnga/dreapta
mingedx% = mingedx%
**inversarea direciei x
SOUND 800, .1
**mic sunet
END IF
IF mingey% <2 OR mingey%>23 THEN **sritur sus/jos
mingedy% = -mingedy%
**inversarea direciei y
SOUND 800, .1
**mic sunet
END IF
LOOP UNTIL LEN(INKEY$)
**repetare pn cnd se apas 0
**tast
Derularea programului este simpl. nti definim poziia iniial i deplasarea mingii. n
bucla DO-LOOP care urmeaz, mingea este afiat rapid, dup care este tears. Apoi se
calculeaz noua poziie a mingii, i n cazul n care mingea depete marginile ecranului, se
inverseaz direcia corespunztoare.
Dac tergem linia de program n care se folosete un spaiu, pentru a terge mingea,
atunci pe ecran se va vizualiza traiectoria mingii.
Acest nou traseu poate deveni foarte lung n cazul imaginilor foarte complexe i poate
fi o metod neadecvat. n acest caz, QBASIC ne propune dou instruciuni care permit
copierea unui fragment dintr-o imagine, ntr-o variabil, n scopul unei restaurri ulterioare la
o poziie oarecare:GET i PUT. Cum nu este vorba de un desen propriu-zis ci de o copiere
de octei aceast metod este foarte rapid i chiar indicat pentru animaie.
Se remarc imediat i un incovenient al acestei metode: dac ecranul este convertit
ntr-un sistem de coordonate virtuale prin WINDOW, aceste dou instruciuni nu se aplic
noilor coordonate, ci doar punctelor reale. Acest lucru implic o conversie a sistemului de
coordonate pentru extragerea unui fragment al unei imagini virtuale, ceea ce se realizeaz
simplu prin intermediul funciei PMAP().
ncepem prin definirea unui tablou suficient de mare astfel nct s conin, n ordine,
toate datele imaginii grafice pentru utilizarea instruciunii GET. Dac dimensiunea este prea
mic, QBASIC afieaz un mesaj de eroare. Apoi va fi suficient s indicm coordonatele
imaginii de extras i tabloul pentru memorarea fragmentului.
Pentru o mai bun nelegere, prezentm mai jos un mic program care deseneaz un
soare i pe care l copie, ntr-un tablou, prin instruciunea GET. Instruciunea PUT afieaz
imaginea acestui soare, apoi se terge i se afieaz la o nou poziie puin mai departe, dea lungul unui arc de cerc, astfel nct creaz impresia unui rsrit i apus de soare.
***Rsrit i apus de soare***
SCREEN 7

**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

Suprapune imaginea memorat peste o alta.


Furnizeaz imaginea memorat.

Avantajul modului XOR, utilizat n exemplul precedent, const n faptul c fondul


imaginii i linia orizontului rmn memorate, ceea ce permite producerea efectului de
deplasare.
Exist i o a doua soluie pentru a realiza o animaie, ce utilizeaz posibilitatea
adaptoarelor grafice de a memora simultan mai multa imagini. Explicaiile urmtoare se
aplic i modului text normal, dar nu i adaptoarelor Hercules !
Pentru nregistrarea imaginii afiate, o plac grafic dispune de propria sa memorie.
Cel mai adesea este vorba de un multiplu al spaiului de memorie necesar pentru salvarea
unui ecran. Se ofer posibilitatea memorrii uneia sau mai multor imagini, numite pagini.
Astfel putem manevra aceste imagini invizibile.
Dac am creat n aceast manier o imagine n memorie, este posibil o afiare
brusc utiliznd instruciunea PCOPY.
Prin instruciunea PCOPY, QBASIC-ul ofer posibilitatea copierii paginilor logice de
ecran, o pagin oarecare putnd fi copiat prin instruciunea:
PCOPY pagin_surs, pagin_destinaie
Dac calculatorul dispune de un adaptor CGA sau de unul superior acestuia (EGA sau
VGA), atunci nseamn c dispunem de 4 pagini (numerotate de la 0 la 3).
Instruciunii i se transmit doi parametri: pagina surs i pagina destinaie. Pagina 0
este cea vizibil n mod normal pe ecran.
Dup ce producem o imagine pe ecran i executm instruciunea PCOPY 0,1 aparent
nu se ntmpl nimic. Dar n realitate, coninutul ecranului a fost recopiat n pagina 1 intern.
Dac modificm acum imaginea, i utilizm apoi instruciunea PCOPY 1,0 imaginea salvat
n momentul precedent este restaurat.
Schimbarea copiilor ecranului poate fi utilizat ntr-un mod foarte interesant, de
exemplu, pentru tergerea unui mesaj dat pe ecran, fr a fi necesar reconstruirea imaginii.
Pentru aceasta, putem proceda n modul urmtor:
***Afiarea unui mesaj i tergerea lui***
PCOPY 0,1 **copierea imaginii n pagina 1
PRINT Acesta este un mesaj...
SLEEP
PCOPY 1,0 **restaurarea vechii imagini
n acest exemplu imaginea este nregistrat n pagina logic 1 nainte de afiarea
mesajului care modific prezentarea sa. Dup afiarea mesajului pe ecran i dup
confirmarea sa, vechea imagine este restaurat prin cea de-a doua instruciune PCOPY i
mesajul dispare.
Aceast procedur nu funcioneaz n mod text, cu un adaptor Hercules, care nu
dispune dect de o singur pagin de ecran.
Instruciunea SCREEN deja cunoscut, ofer o alternativ comenzii PCOPY. Ea
permite definirea, n afar de modul grafic utilizat, a paginii de afiat i de modificat. Aceasta
permite n sfrit posibilitatea manevrrii n interior a unei pagini invizibile.
Sintaxa complet a instruciunii SCREEN este urmtoarea:
SCREEN [mod_grafic][,[tip_afiare]][,[pagin_activ][,pagin
afiare]]

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%

**punctele individuale de calculat


**originea
**calcularea pantei

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

Cap. 11. Fiiere


11.1. Noiunea de fiier
Prin fiier se nelege o mulime de date, format din una sau mai multe componente
de acelai tip nregistrate pe un suport extern de informaie. Componentele se mai numesc i
nregistrri. Este posibil ca un fiier s nu conin nici o nregistrare, caz n care se spune c
fiierul respectiv este vid.
Suporturile de informaie pot fi secveniale (tastatura, ecranul, imprimanta) i
adresabile (floppy disk i hard disk). n funcie de suportul utilizat, sub QBASIC putem avea
fiiere disc n cazul n care nregistrrile sunt scrise sau citite pe/de pe un suport magnetic
(floppy disk sau hard disk - i fiiere standard - asociate perifericelor standard de intrareieire (tastatur, ecran, imprimante) sau perifericelor de comunicaie. Orice fiier organizat pe
un suport magnetic poate fi regsit n vederea prelucrrii lui ulterioare.
n ceea ce privete numrul de nregistrri dintr-un fiier, acesta este variabil, fiind
limitat numai de capacitatea de memorare a suportului utilizat. fapt pentru care este necesar
o nregistrare special care s marcheze sfritul fiierului (End Of File).
Sub QBASIC pot fi tratate att fiiere program, ct i fiiere de date. Un fiier program
este de fapt un program surs scris n QBASIC. nregistrrile unui astfel de fiier sunt liniile
programului. Liniile consecutive sunt separate printr-un marcaj de sfrit de linie (End Of
Line). De regul acest marcaj este reprezentat printr-o pereche de caractere de control,
Enter(CR) i Line Feed (LF). n contextul afirii programului pe ecran sau listrii lui
la imprimant, aceste caractere au semnificaia: revenire la nceput de rnd i avans la
rndul urmtor. Pentru tratarea fiierelor program se pot utiliza comenzile: LIST, RUN,
SAVE, BSAVE, LOAD, BLOAD, MERGE, FILES, KILL i NAME.
Un fiier de date este format din unul sau mai multe articole nregistrate pe un suport
extern informaie. Un articol este format dintr-o mulime de informaii care caracterizeaz total
sau parial un anumit obiect. Informaiile dintr-un articol sunt structurate n cmpuri. Un cmp
este specificat prin nume i tip. Numele unui cmp este un identificator QBASIC iar tipul
poate fi numeric sau alfanumeric. n etapa de formulare a problemei se recomand ca orice
articol s fie descris printr-o machet n care se vor preciza numele articolului, numele
cmpurilor componente, tipul fiecrui cmp n parte , precum i lungimea maxim a fiecrui
cmp, exprimat n numr de caractere ASCII. Pentru a preciza tipul i lungimea unui cmp
vom folosi urmtoarele notaii:
I(n) - cmp numeric de tip ntreg, format din n cifre zecimale;
RS(n,m) - cmp numeric de tip real n simpl precizie, format din n caractere
numerice, dintre care m cifre sunt la partea zecimal;
RD(n,m) - cmp numeric de tip real n dubl precizie, format din n caractere numerice,
dintre care m cifre sunt la partea zecimal;
A(n) - cmp alfanumeric, format din n caractere.

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

Tipuri de acces la fiier


Exist trei tipuri de acces la articolele unui fiier, secvenial, direct i mixt (direct i
secvenial).
Accesul secvenial este permis pe orice tip de suport i se caracterizeaz prin faptul
c accesul la un articol nu poate avea loc dect dup ce a fost realizat accesul la articolul
precedent.
Accesul direct este permis numai pe suporturile adresabile (floppy disk / hard disk) i
se caracterizeaz prin faptul c accesul la orice articol este independent de celelalte articole
din fiier.
Accesul mixt este, de asemenea, permis numai pentru suporturile adresabile i se
caracterizeaz prin faptul c, accesul la un articol se face fie direct, fie dup realizarea
accesului la articolul precedent.
Identificarea unui fiier de date
Pentru a avea acces la informaiile dintr-un fiier, este necesar deschiderea acestuia
cu ajutorul instruciunii OPEN, iar programatorul trebuie s cunoasc:
- coninutul fiierului (structura articolului);
- tipurile de acces permise la un articol;
- modul de identificare a fiierului;
Identificarea unui fiier n QBASIC se face printr-o specificaie de fiier, care trebuie s
fie n conformitate cu conveniile DOS. SINTAXA specificaiei de fiier este urmtoarea:
[d:] [cale] numef[.ext]
unde:
d: - este o specificaie de periferic;
cale - este o secven de directoare;
numef - este numele fiierului, format din maximum 8 caractere;
ext - este extensia, format din maximum 3 caractere;
Lungimea maxim a unei specificaii de fiier este de 128 caractere. Din sintaxa
descris anterior se deduce c specificaia de periferic, dac exist, trebuie s fie prima din
specificaia complet de fiier. Dac nu se specific perifericul, se consider implicit cel
curent.

97

Specificaiile de periferic pot fi:


KYBD: - claviatura (se folosete ca fiier de intrare):
SCRN: - ecranul (se folosete ca fiier de ieire);
LPT1: - prima imprimant )se folosete ca fiier de ieire);
LPT3: - a treia imprimant, dac exist (se folosete ca fiier de ieire);
COM1: - primul adaptor de comunicaie asincron cu alt calculator (se folosete
pentru intrare/ieire);
COM2: - al doilea adaptor de comunicaie asincron cu alt calculator (se folosete
pentru intrare/ieire);
A: - prima unitate de floppy disk (se folosete pentru intrare/ieire);
B: - a doua unitate de floppy disk (se folosete pentru intrare/ieire);
C: - primul hard disk (se folosete pentru intrare/ieire);
D: - al doilea hard disk (se folosete pentru intrare/ieire);etc.
Observaie. Att ecranul ct i imprimanta sunt considerate implicit suporturi de informaie
orientate pe articol (o linie = un articol), o linie fiind divizat n zone de afiare de cte 14
poziii fiecare.
Pentru a realiza o ct mai mare flexibilitate n prelucrarea datelor, limbajul QBASIC
ofer posibilitatea realizrii operaiilor de intrare - ieire ntr-un mod independent de periferic
(sintaxa instruciunilor ce acioneaz un periferic este independent de acesta). Acest lucru
este posibil deoarece, n momentul n care se deschide un fiier, acestuia i se atribuie un
numr de fiier, iar limbajul QBASIC execut operaiile de intrare-ieire utiliznd acest numr,
care poate fi o constant numeric de tip ntreg, o variabil sau o expresie de tip ntreg din
intervalul [1,n], unde n este numrul maxim de fiiere de date ce pot fi deschise simultan.
Valoarea implicit a acestui numr este 3, dar ea poate fi modificat n momentul deschiderii
sesiunii de lucru n QBASIC, cu ajutorul opiunii [/F:n]. De exemplu, prin comanda:
AQ BASIC2 /F:5 ENTER
avem posibilitatea de a deschide simultan 5 fiiere de date.
n mod normal (implicit), pentru fiecare fiier se aloc n memoria intern a
calculatorului 190 de octei, distribuii asfel: 62 de octei pentru blocul de control al fiierelor
(BCF) i 128 de octei pentru zona tampon de date, zon pe care o numim zon articol. Din
zona articol se face transferul datelor din memoria intern n fiier, n urma unei operaii de
scriere, sau transferul datelor din fiier n memoria intern, n urma unei operaii de citire.
Dimensiunea zonei articol poate fi modificat, dup necesiti, n momentul deschiderii
unei sesiuni de lucru n QBASIC, cu ajutorul opiunii [/S:m], unde prin m se va indica
dimensiunea acesteia, exprimat n mumr de octei, dimensiune ce nu poate fi mai mare de
32767 octei. Dup cum se va preciza n cele ce urmeaz, dimensiunea zonei articol poate fi
modificat i cu instruciunea OPEN, prin care se face deschiderea unui fiier.
Clasificarea fiierelor de date
Limbajul QBASIC permite crearea i accesarea a dou tipuri de fiiere de date: fiiere
secveniale i fiiere cu acces direct. Fiierele secveniale se creaz mai uor dect cele cu
acces direct, dar sunt mai puin flexibile i au o vitez de acces la articole mai sczut.

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)

OPEN numefis [FOR tip1 ] [acces] AS [#]nrfis [LEN=la]

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

CLOSE [ [[#]nrfis1], [[#]nrfis2],...,[[#]nrfisk]]


Efectul:
nchide fiierele specificate prin nrfis1, nrfis2,..., nrfisk, iar dac nu este urmat de
nici un parametru, nchide toate fiierele de date. n cazul fiierelor secveniale, instruciune
CLOSE are ca efectsecundar i scrierea ultimului articol (buffer) construit. Precizm c sub
QBASIC, unele comenzi i instruciuni, diferite de instruciunea CLOSE, realizeaz i
nchiderea automat a tuturor fiierelor deschise. Acestea sunt: SYSTEM, CLEAR, NEW,
RESET i END.

Instruciunile PRINT# i PRINT# USING


Sintaxa:
PRINT #nrfis, [USINGvf cf;] list de expresii [, ;]
Efectul:
Se utilizeaz pentru a scrie un articol n fiierul secvenial cu numrul nrfis, deci
pentru a transfera valorile cmpurilor componente din memoria intern a calculatorului pe
dispozitivul periferic. Din sintaxa instruciunii se deduce c aceasta se poate utiliza i la
efectuarea unor calcule, dar pentru a spori lizilibilitatea programului se recomand ca lista de
expresii s fie format din numele cmpurilor componente ale unui articol. Elementele din
list pot fi separate prin ;sau ,, iar n list poate fi prezent chiar i funcia TAB, cu
aceeai semnificaie ca i n cazul instruciunii PRINT. n cazul n care suportul extern de
informaie este un suport orientat pe articol, acesta se consider mprit n cmpuri cu
lungimea de 14 caractere i aceeai mprire pe cmpuri poate fi realizat i n cazul n care
articolele sunt plasate ntr-un fiier pe suport magnetic, dar folosirea n acest caz a
separatorilor ;, , i a funciei TAB duce la utilizarea neraional a memoriei externe.
Terminarea unei instruciuni PRINT# cu ; sau , duce la conservarea poziiei pe articolul
curent construit, fapt pentru care construirea unui articol se poate face prin execuia mai
multor instruciuni PRINT#. Dac instruciune PRINT# se termin cu spaiu sau CR, n
poziia curent din articol se va insera un marcaj de sfrit de linie (End Of Line), materializat
prin CR i LF, i apoi se va lansa operaia de transfer al articolului din memoria intern a
calculatorului pe suportu extern (memoria extern).
Deosebire ntre PRINT# i PRINT# USING const n faptul c, n timp ce prin PRINT#
datele sut extrase folosind formatul implicit de editare, prin instruciunea PRINT# USING,
datele sunt extrase conform unui format explicit, precizat prin variabila de formatare vf sau
constanta de formatare cf.
Reamintim c ntre dou valori consecutive dintr-un articol trebuie inserat n mod
obligatoriu o virgul i aceast sarcin revine programatorului.
Instruciunea WRITE#
Sintaxa:
WRITE #nrfis, list de expresii
101

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

Funcii utilizate n prelucrarea fiierelor secveniale


Numele/Sintaxa
LOC(nrfis)

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

P3. Atta timp ct A$ nu este n sau N,


- introducem de la tastatur valorile cmpurilor componente ale unui articol;
- scriem articolul n fiecare fiier, conform cerinelor formulate n enun;
- mrim valoarea variabilei K cu o unitate i introducem pentru A$ valoarea N sau n
dac nu mai avem articole de introdus, sau orice alt valoare n caz contrar (de preferat
ENTER).
P4. nchidem cele trei fiiere i afim valoarea variabilei K.
Observaii. nainte de a prezenta programul QBASIC facem urmtoarele precizri:
1. Presupunem c suntem pe unitatea A i, deoarece avem de creat trei fiiere, n
instruciunea OPEN, cu care le deschidem, trebuie s precizm numele acestora. Numele
fiierului ANGAJAI.DAT l vom introduce de la tastatur, n variabila FDISC, iar numele
celorlalte dou fiiere le vom introduce direct n program, sub forma unor specificaii de fiier.
2. Scrierea datelor n fiierul ANGAJAI.DAT se face n formatul implicit de editare, iar
ntre dou date consecutive trebuie s inserm o virgul. Pentru o exprimare mai comod,
vom iniializa variabila V& cu caracterul , i atunci cnd scriem un articol n fiier, vom
intercala ntre dou cmpuri consecutive aceast variabil. Datele alfanumerice nu vor fi
delimitate de ghilimele.
3. Scrierea datelor n fiierul SALARII.DAT se va face n formatul implicit de editare, iar
ntre dou date consecutive nu trebuie inserat caracterul virgul, deoarece lucrul acesta l
face instruciunea WRITE#. Preciuzm c datele alfanumerice vor fi delimitate de ghilimele.
4. Scrierea datelor n fiierul PERSONAL.DAT se va face n format explicit, precizat
prin variabila de formatare F, variabil care este obinut prin concatenarea variabilelor F1,
F2, ..., F6, care conin descriptorii cmpurilor componente din macheta articolului, fiecare
descriptor fiind urmat de un spaiu i de caracterul virgul (se recomand s se procedeze
astfel pentru a evita unele eror). Deci, i de aceast dat, un articol din fiierul disc va
conine, n afar de informaiile propriu-zise, care caracterizeaz fiecare cmp n parte, i
cte un separator ntre dou cmpuri consecutive, separator format din caracterele spaiu i
virgul.
5. Introducerea datelor n cele trei fiiere se va face de la tastatur (a nu se face
confuzii; datele introduse de la tastatur ajung mai nti n unitatea de memorie intern, unde
sunt atribuite variabilelor MARCA, NUME, FUNCIA, VRSTA, VECHIME, SALARIU, i apoi
printr-o instruciune de scriere, sunt transferate ntr-un fiier).
6. La mesajul Introducei numele fiierului disc: se va tasta ANGAJAI.DAT, iar la
mesajul Introducei un articol (Y/N)? se va tasta N sau n dac nu mai sunt articole de
introdus, sau se va aciona orice alt tast (de preferat ENTER) dac mai sunt articole.
7. n momentul n care nu mai sunt articole de introdus s se nchid cele trei fiiere
cu ajutorul instruciunii CLOSE. La nchiderea fiecrui fiier se adaug marca de sfrit de
fiier (End Of File), care poate fi invocat, cu ajutorul funciei EOF, la o deschidere ulterioar
a unui fiier.
Programul QBASIC
10
20
30
40
50

REM
REM +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
REM crearea a trei fiiere secveniale pe disc.
REM +- - - - - - - - - - - - - - - - - - - - - - - - - - - - +
REM
104

60 DEFINIT M, V:DEFSTR F,N:DEFSNG S


70 V$=,
80 F1 = #### , despriptor 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 INPUT Introducei numele fiierului disc:;FDISC
170 OPEN FDISC FOR OUTPUT AS #1
180 OPEN PERSONAL.DAT FOR OUTPUT AS #2
190 OPEN ORA, #3,A:SALARII.DAT
200 WHILE NOT (A$=N OR A$=n)
210 INPUT Marca : ;MARCA
220 INPUT Numele : ;NUME
230 INPUT Funcia : ;FUNCIA
240 INPUT Vrsta : ;VRSTA
250 INPUT Vechimea : ;VECHIME
260 INPUT Salariu : ; SALARIU
270 PRINT #1, MARCA;V$;NUME;V$;FUNCIA;V$;VRSTA;
280 PRINT #1, V$;VECHIME;V$;SALARIU
290 PRINT #2, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME, SALARIU
300 WRITE#3,MARCA,NUME;FUNCIA,VRSTA,VECHIMEA;
SALARIU
310 K=K+1 : CLS
320 INPUT Introducei un alt articol (Y/N)?;A$
330 WEND
340 PRINT In fiecare fiier s-au introdus cte ;K;
articole.
350 CLOSE #1,2,#3
360 END

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

,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 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

,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 ,45 ,25 ,61967.15
,BURGHEL MARIA
,OPERATOR ,40 ,22 ,56458.75
,CMPEAN CRISTIAN
,MUNCITOR ,48 ,26 ,71900.00

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

220 INPUT Vechime : ;VECHIME


230 INPUT Salariu : ;SALARIU
240 PRINT #1, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME, SALARIU
250 K=K+1 : CLS
260 INPUT Adugai un alt articol (Y/N)?;A$
270 WEND
280 CLOSE #1
290 PRINT n fiier s-au mai introdus ;K; articole.
300 END
Problema 4
S se listeze la imprimant coninutul fiierului PERSONAL.DAT n dou moduri:
a) - cu ajutorul unui program scris n QBASIC, preciznd i numrul de articole
existente n fiier;
b) - cu ajutorul comenzii TYPE a sistemului de operare MS-DOS.
Rezolvare.
a) Scrierea programului QBASIC se va face n conformitate cu paii urmtorului
algoritm:
P1. Iniializm variabila K cu valoarea zero (valoarea final a acestei variabile
reprezint numrul articolelor citite din fiier).
P2. Deschidem fiierul, preciznd c este un fiier secvenial de ieire.
P3. Atta timp ct nu suntem poziionai pe marca de sfrit de fiier:
- citim un articol din fiier;
- tiprim la imprimant valorile cmpurilor citite.
P4. nchidem feierul i afim valoarea variabilei K.

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

1235 ,BUCLAE SORIN


1236 ,BDU CRISTIAN
2345 ,BIL MARIUS
2346 ,BURGHEL MARIA
2567 ,CMPEAN CRISTIAN
3456 ,BUTIC LILIANA
3467 ,IACOBESCU NICOLAE
3458 ,GIURGIULESCU MARIA
3459 ,HELJIU MARIUS

,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

Observaie. Dup efectuarea acestei operaii, programatorul are posibilitatea s-i


confrunte datele din documentele primare cu cele care au fost nregistrate n fiier. Dac n
fiier s-au strecurat informaii eronate, articolele care conin astfel de informaii trebuie s fie
identificate, pentru ca, ulterior, printr-un program de actualizare, s se efectueze corectarea
lor.
Problema 5
S se actualizeze fiierul PERSONAL.DAT, avnd la dispoziie o list (document
primar) care conine:
- articolele ce urmeaz a fi adugate n fiier;
- mrcile articolelor ce urmeaz a fi terse din fiier;
- mrcile i cmpurile articolelor care trebuie modificate n fiier.
Tipul unei operaii se va preciza introducnd n prealabil, pentru variabila A$, una din
valorile:
A sau a - pentru adugare;
S sau s - pentru tergere;
M sau m - pentru modificare;
N sau n - pentru stop.
n final s se afieze o statistic, prin care s se precizeze numrul de articole
adugate, numrul de articole terse i numrul de articole modificate.
Rezolvare. Operaia de actualizare modific starea fiierului PERSONAL.DAT i
deoarece acest fiier poate fi deschis numai pentru intrare sau ieire cu extensie, suntem
nevoii s utilizm acest fiier n intrare i s crem un fiier de ieire, cruia i vom da
numele PERSONAL.ACT i care va conine de fapt imaginea fiierului actualizat. n final,
fiierul PERSONAL.DAT va fi ters, iar numele fiierului PERSONAL.ACT se va schimba n
PERSONAL.DAT.
Pentru a evita unele situaii confuze, se recomand ca adugrile s se fac ori la
nceputul, ori la sfritul fiierului, iar tergerile i modificrile s se efectueze respectnd
ordinea distribuirii articolelor n fiier dup cmpul MARCA. Totui, pentru a elimina orice
inconvenient, algoritmul pe care-l vom descrie n cele ce urmeaz nu ine cont de aceste
restricii i const din urmtorii pai:
P1. Iniializm: variabila A$ cu irul vid, variabila KOD cu 1 , iar variabilele KA, KS I
KM cu zero (variabila KOD are valoarea 1 cnd cele dou fiiere nu sunt deschise i zero n
caz contrar, iar valorile finale ale variabilelor KA, KS I KM vor preciza numrul de articole
adugate, terse, respectiv modificate, n fiierul PERSONAL.DAT).
P2. Atta timp ct A$ este diferit de N sau n:
- deschidem cele dou fiiere n cazul n care KOD=1;
- introducem tipul operaiei n variabila A$;
- n funcie de valoarea acestei variabile vom apela una din cele patru subrutine prin
care se face adugarea unui articol, tergerea unui articol, modificarea unui articol sau
110

tergerea fiierului PERSONAL.DAT (vechiul fiier) i schimbarea numelui fiierului


PERSONAL.ACT (noul fiier) n PERSONAL.DAT.
P3. Afim cte articole au fost adugate, cte au fost terse i cte au fost modificate
n fiierul PERSONAL.DAT.
Observaii.
1. Algoritmul care st la baza subrutinei prin care se face adugarea unui articol nu
ridic nici un fel de probleme, dar de fapt un anumit articol nu se adaug n fiierul
PERSONAL.DAT, ci n fiierul PERSONAL.ACT.
2. Algoritmul care st la baza subrutinei prin care se face tergerea fiierului
PERSONAL.DAT i schimbarea numelui fiierului PERSONAL.ACT ine cont de faptul c,
atunci cnd nu mai avem de efectuat nici o operaie de adugare, tergere sau modificare, sar putea ca n fiierul vechi s mai existe articole. Prin urmare, atta timp ct nu suntem
poziionai pe marca de sfrit de fiier, citim articolele din PERSONAL.DAT i le scriem n
fiierul PERSONAL.ACT, iar dup aceea nchidem cele dou fiiere, tergem vechiul fiier,
schimbm numele noului fiier n PERSONAL.DAT i i atribuim variabilei KOD valoarea 1
(fiierele sunt nchise).
3. Atunci cnd avem de ters sau de modificat un articol, se ivesc dou situaii:
articolul n cauz poate fi gsit n fiierul PERSONAL.DAT ncepnd de la poziia curent
ncolo sau se poate s nu fie gsit. S presupunem c poate fi gsit. n acest caz, trebuie s
citim articolele din PERSONAL.DAT i s le scriem n PERSONAL.ACT pn n momentul n
care valoarea mrcii introduse de la tastatur i reinute n variabila MARCAW coincide cu
valoarea mrcii unui articol, citit din fiier i reinut n variabila MARCA. Operaia de
tergere const n faptul c articolul n cauz nu se mai scrie n PERSONAL.ACT, iar
modificarea se va face tastnd ENTER pentru un cmp corect i introducnd noua valoare
pentru un cmp eronat. n cazul n care articolul nu se gsete pn la sfritul fiierului, se
trec eventualele articole din PERSONAL.DAT n PERSONAL.ACT, se nchid cele dou
fiiere, se terge fiierul PERSONAL.DAT i se schimb numele fiierului PERSONAL.ACT
n PERSONAL.DAT.
Analiznd cu atenie subrutinele prin care se face tergerea i modificarea unui articol,
putei descoperi semnificaia variabilei SF.

111

Programul QBASIC
10 REM
20 REM + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
30 REM Actualizarea unui fiier secvenial

35 REMde pe disc prin tergerea, modificarea sau


40 REMadugarea de noi articole

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

900 INPUT Vechime : ; A$:IF LEN (A$)<>0 THEN


VECHIME=VAL (A$)
910 INPUT Salariu : ; A$:IF LEN (A$)<>0 THEN
SALARIU=VAL (A$)
920 PRINT #2, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME,SALARIU
930 WEND
940 RETURN
950 REM + - - - - - - - - - - - - - - - - - - - - - - - ---- -- - - -+
960 REM Procedura pentru tergerea vechiului

970 REM fiier i schimbarea numelui noului fiier


980 REM + - - - - - - - - - - - - - - - - - - -- - - - - - - - -- - -+
990 WHILE NOT EOF (1)
1000 INPUT#1,MARCA,NUME,FUNCIA,VRSTA,VECHIME,
SALARIU
1010 PRINT #2, USING F; MARCA, NUME, FUNCIA, VRSTA,
VECHIME,SALARIU
1020 WEND
1030 CLOSE #1,2
1040 KILLPERSONAL.DAT
1050 NAMEPERSONAL.ACT AS PERSONAL.DAT
1060 KOD=1
1070 RETURN
Comentariu.
Dup ce s-a fcut operaia de actualizare, se poate lista din nou imaginea fiierului
PERSONAL.DAT, iar n cazul n care mai exist articole eronate, acestea se rein i fiierul se
supune din nou operaiei de actualizare. Pentru a nu se face risip de hrtie, articolele
fiierului se pot lista pe monitor cte unul pe o linie i trebuie inut cont de faptul c pe ecran
se pot vizualiza cel mult 25 de linii (dac se terg valorile afiate ale tastelor funcionale F1F10, cu KEY OFF). Lsm, ca exerciiul pentru cei interesai, problema consultrii fiierului
PERSONAL.DAT i afiarea articolelor sale pe ecran n grupe de cte 25, ultima grup
putnd avea eventual articole mai puine.
Din momentul n care avem certitudinea c datele din fiier sunt corecte, putem
efectua asupra lor diverse prelucrri.

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

40 REM disc i editarea unui raport la imprimant

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

420 LPRINT SPC(6) ; :LPRINT USING F; K, NUME, SALARIU,


IMPOZ,SW,S$
430 WEND
440 LPRINT SPC(6) ;R4
450 GOSUB 500:LPRINT CHR$(185)
460 LPRINT SPC(20);Director,;SPC(35);Contabil ef,
470 PRINT Din fiier s-au citit ;K;articole.
480 CLOSE #1
490 END
500 REM Starea paginii de cod 850 (multilingv)
510 LPRINT CHR$(27);CHR$(91);CHR$(73):
520 LPRINT CHR$(3);CHR$(0); ;CHR$(0);
530 RETURN
Dup lansarea programului n execuie, vom obine la imprimant urmtorul raport:

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,

11.5. Instruciuni i funcii utilizate n prelucrarea fiierelor aleatoare


Scrierea unui articol ntr-un fiier aleator (fiir cu acces direct) se face cu instruciunea
PUT citirea se face cu instruciunea GET.
Scrierea unui aricol n fiier se face dintr-o zon special de memorie, numit zon
articol, iar n urma citirii unui articol din fiier, informaiile sunt transferate n zona articol. Zona
articol are o lungime fix, iar informaiile din ea sunt structurate n cmpuri de tip alfanumeric.
Denumirile i lungimile cmpurilor din zona articol se precizeaz cu instruciunea FIELD.
nainte de scrierea unui articol, cmpurile componente din zona articol s fie
iniializate cu valori de tip alfanumeric, folosind una din instruciunile LSET sau RSET.
Informaiile de tip numeric ce urmeaz a fi plasate n zona articol trebuie s fie convertite n
alfanumeric cu ajutorul funciilor MKI$,
MKS$ i MKD$. Dup citirea unui articol, informaiile sunt regsite n zona articol, care este
format, aa cum s-a precizat anterior, numai din cmpuri de tip alfanumeric. Valorile care
corespund unor date de tip numeric trebuie convertite n numere cu ajutorul funciilor CVI,
CVS i CVD.

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)

Intoducnd datele de la tastatur, n regim dialog.


120

MEDIA (2)
RS (5,2)

MEDIA (3)
RS (5,2)

Rezolvare. n afar de fiierul CATALOG.DAT, vom mai crea i fiierul secvenial


NRART.SEQ, fiier n care vom reine numrul de articole care au fost introduse iniial n
fiierul aleator. Dup crearea fiierului CATALOG.DAT vom tipri pe monitor coninutul su,
dar facem precizarea c el poate fi listat i la imprimant, nlocuind, n programul ce va fi
descris mai jos, instruciunea PRINT cu instruciunea LPRINT. Se recomand o astfel de
practic deoarece este posibil ca la introducerea datelor s se strecoare ntmpltor i unele
erori, care pot fi ulterior eliminate cu ajutorul unui program de actualizare.
De fapt pentru rezolvarea problemei parcurgem urmtorii pai:
Deschidem fiierul aleator CATALOG.DAT i structurm zona articol asociat acestuia
cu ajutorul instruciunii FIELD.
P2. Iniializm variabila A$ cu irul vid i variabila NRART cu zero (nc nu am introdus
articole n CATALOG.DAT.
P3. Rspundem la mesajul Introducei un articol (Y/N)? acionnd orice tast n caz
afirmativ sau tastnd unul din caracterele N sau n n caz contrar.
P4. Atta timp ct A$ nu este egal cu N sau n, efectum operaiile urmtoare:
- introducem de la tastatur valorile cmpurilor dintr-un articol;
- transferm aceste valori n zona articol corespunztoare fiierului CATALOG.DAT,
innd cont c datele numerice trebuie convertite n date de tip alfanumeric, folosind funciile
MKI$ i MKS$.
- adunm o unitate la variabila NRART, scriem articolul n fiierul aleator i rspundem
la ntrebarea Introducei alt articol (Y/N)?;
P5. Tiprim valoarea variabilei NRART (numrul de articole introduse n fiier);
P6. Deschidem fiierul NRART.SEQ i scriem n el valoarea variabilei NRART.
P7. Tiprim pe ecran imaginea fiierului CATALOG.DAT.

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:

Observaie. Constatm c acelai nume a fost introdus de dou ori (n poziia 4 i n


poziia 12) i deci undeva exist o eroare, deoarece numerele matricole sunt distincte. Apare
evident necesitatea elaborrii unui program prin care s putem efectua corectarea acestei
erori, fr a fi nevoii s relum introducerea datelor de la nceput.
Problema 2
S se actualizeze fiierul CATALOG.DAT, n sensul c se vor modifica unele articole
deja introduse n fiier i c se vor aduga noi articole n continuarea celor existente. n final
s se tipreasc numrul de articole adugate, precum i imaginea fiierului actualizat.
Rezolvare. Actualizarea fiierului CATALOG.DAT se va face n acces direct,
introducnd mai nti numrul de ordine al articolului pe care dorim s-l modificm sau s-l
adugm i apoi valorile cmpurilor componente, dac este cazul. Din fiierul NRART.SEQ
vom citi numrul de articole existente n fiier nainte de a ncepe operaia de actualizare i l
vom reine n variabila TOTAL.ART. Vom considera c articolele cu numerele de ordine mai
mari dect TOTAL.ART se adaug n fiier, iar pentru a numra cte articole au fost
adugate n fiier vom folosi variabila K, pe care la nceput o iniializm cu zero i atunci
cnd vom avea NRART>TOTAL.ART, mrim valoarea lui K cu o unitate.
Paii algoritmului
P1. Deschidem fiierul CATALOG.DAT i definim structura zonei articol asociat
acestui fiier, cu ajutorul instruciunii FIELD.
P2. Deschidem fiierul NRART.SEQ i citim den acesta numrul de articole existente
n CATALOG.DAT, numr e care l reinem n variabila TOTAL.ART.
P3. Iniializm variabila A$ cu irul vid i variabila K cu zero.
P4. Atta timp ct A$ este diferit de n sau de N, efectum operaiile:
- introducem n variabila NRART numrul de ordine al articolului pe care dorim s-l
modificm sau s-l adugm n fiier, citim acest articol din fiier i-l tiprim pe ecran;
- introducem noile valori pentru cmpurile eronate i rescriem articolul n fiier n
aceeai poziie;
- dac numrul de ordine al articolului este mai mare dect numrul de articole din
fiier, adunm o unitate K.
P5. nchidem fiierul CATALOG.DAT, deschidem fiierul NRART.SEQ i scriem n el
valoarea expresiei (TOTAL.ART+K), adic numrul de articole din CATALOD.DAT dup
actualizare, i nchidem acest fiier.
P6. Tiprim coninutul fiierului CATALOG.DAT cu scopul de a depista eventualele
erori strecurate la introducerea datelor. Evident, dac sunt erori, operaia de actualizare
trebuie efectuat din nou.
Programul QBASIC
Comentariu. n exemplul de fa, operaia de actualizare a constat doar n
modificarea cmpului referitor la numele persoanei din poziia 12, dar precizm c se pot
122

introduce i noi articole n fiierul CATALOG.DAT i nu neaprat n ordinea 14,15,16,.., ci i


ntr-o ordine absolut ntmpltoare, dar n acest caz exist riscul s obinem articole vide n
fiier, De exemplu, dac n fiierul precedent se va aduga un articol n poziia 16, articolele
din poziiile 14 i 15 sunt vide, fapt pentru care se recomand totui ca adugrile s se fac
respectnd ordinea natural.
Problema 3
S se consulte fiierul CATALOG.DAT i s se creeze un nou fiier aleator, cu
numele MEDII.DAT,cu articole de forma:
MEDII
NRM
I(4)

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

parcurgnd n ordine secvenial elementele acestui vector, selectm articolele fiierului ce


trebuie sortat, tocmai n ordinea cerut.
ntr-un mod cu totul analog stau lucrurile i atunci cnd avem de efectuat sortarea
dup mai multe chei, singura dificultate care poate s apar constnd n faptul c s-ar putea
ca numrul exprimat n baza10k s nu se poat nregistra n memoria calculatorului (s fie
mai mare dec-t 32767, n cazul utilizrii limbajului QBASIC). Pentru a elimina acest
inconvenient, pe mulimea:
M=Ni/N

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)

i s se afieze coninutul acestui fiier pe ecranul alfanumeric.


Rezolvare. Vom defini unset de variabile alfanumerice cu ajutorul crora vom putea
construi capul de tabel, dup cum urmeaz:
- variabila RT este o variabil de formatare, cu care scriem titlul;
- variabila R1 o folosim pentru a scrie primul rnd al capului de tabel;
- variabila R2 o folosim pentru a scrie al doilea rnd din capul de tabel;
- variabila R3 o folosim pentru a scrie al treilea rnd din capil de tabel;
- variabila RG este o variabil de formatare, cu care scriem un rnd generic;
variabila RF o folosim pentru a scrie rndul final al unui tabel .
Paii algoritmului
P1. Iniializm variabilele RT, R1, R2, R3, RG i RF.
126

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

SITUAIA COLAR LA CLASA: X-B


NRC
1
2
3
4

NUMELE I PRENUMELE
STOICOIU CRISTIAN
PETRE MARIUS
BOLDOR MARIA
GHERMAN DELIA

MEDIA
10.00
8.33
7.67
7,67

SITUAIA COLAR LA CLASA: XII-A


NRC
1
2
3

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

Observaie. Toate problemele formulate anterior pot fi rezolvate cu ajutorul unui


singur program de dimensiuni mai mari,structurat pe module, fiecare modul rezolvnd de fapt
o problem. Pentru a realiza acest lucru procedm astfel:
- renumerotm liniile primului program, astfel nct numrul primei linii s fie, de
exemplu, 1000,i l salvm n fiierul CREFISAL.BAS n format ASCII;
- renumerotm liniile celui de-al doilea program, astfel nct numrul primei linii s fie
2000, i l salvm n fiierul ACTFISAL.BAS n format ASCII;
- renumerotm liniile celui de-al treilea program, astfel nct numrul primei linii s fie
3000, i l salvm n fiierul CONFISAL.BAS n format ASCII;
- renumerotm liniile celui de-al patrulea program, astfel nct numrul primei linii s
fie 4000, i l salvm n fiierul STRFISAL.BAS n format ASCII;
- renumerotm liniile celui de-al cincilea program, astfel nct numrul primei linii s fie
5000 i l salvm n fiierul TABFISAL.BAS n format ASCII;
- introducem urmtoarea secven de program:
i apoi, cu comanda MERGE, ncrcm cele 5 programe salvate anterior i nlocuim toate
instruciunile END cu RETURN. Procednd astfel obinem programul descris n continuare,
program despre care avem certitudinea c este corect, deoarece fiecare modul n parte a
fost testat i verificat n prealabil. Facem precizarea, foarte important de altfel, c ntr-un
mod cu totul analog trebuie procedat de fiecare dat cnd avem de rezolvat o problem mai
complex.
Probleme propuse
Problema 1
a) S se creeze fiierul secvenial GRUPA.DAT, 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 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

iar n final s se afieze media grupei.


Problema 2
a) S se creeze fiierul secvenial GRUPA.DAT, care s conin toi studenii dintr-o
grup i care s aib articole de forma:
STUDENT
128

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

care s conin toi studenii din grup care au o singur restan.


Problema 3
a) S se creeze fiierul aleator STUDENI.DIR, cu articole de forma:
STUDENT
NRM
I(4)

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

n final s se afieze numrul studenilor cu burse sociale, numrul studenilor cu


burse de merit i numrul studenilor nebursieri.
Problema 4
a) S se creeze fiierul aleator 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)

unde:
NRM - numrul matricol al studentului;
129

N(4)
I(2)

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 secvenial 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, 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

a) S se creeze fiierul secvenial PRODUSE.DAT, care s conin informaii


referitoare la produsele fabricate ntr-o anumit lun n unitatesa 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)

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

tiind c PROC reprezint procentul de realizare a planului anual.


Problema 11
a) S se creeze fiierul aleator PLAN.DIR, cu articole de forma:
PLANIFICARE
CODP
DENP

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

tiind c PROC reprezint procentul de realizare a planului anual.


Problema 12
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 - 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)

...

unde CR reprezint cantitatea restant la sfritul anului.

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

unde CR reprezint cantitatea restant la sfritul anului.


Problema 14
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
DENP
I(4)
A(30)

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

tiind c NECA reprezint necesarul de aprovizionare pentru a se ajunge la stocul de


siguran, iar VALOAREA = NECA PU. Afiarea se face numai cnd STOC STOCS. n
final s se tipereasc i suma total necesar efecturii aprovizionrii.
Problema 15
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:
135

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

tiind c NECA reprezint necesarul de aprovizionare pentru a se ajunge la stocul de


siguran, iar VALOARE = NECA PU. Afiarea se face numai cnd STOC STOCS.
n final s se tipreasc i suma total necesar efecturii aprovizionrii.

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

tiind c NECA reprezint necesarul de aprovizionare pentru a depi stocul de siguran cu


15, iar VALOARE = NECA PU. Afiarea se face numai cnd STOC STOCS + 15 PU.
n final s se tipreasc i suma total necesar efecturii aprovizionrii.

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

tiind c RESTANA=CANTC-CANTF, iar VALOARE=RESTANPU. Se vor lista numai


articolele pentru care CANTFCANTC.
Problema 18
a) S se creeze fiierul aleator CONTRACT.DIR, 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.DIR i s se editeze pe ecran un tabel de forma:
CODF

CODP

CANTC

CANTF

PU

RESTAN

VALOARE

tiind c RESTANA=CANTC-CANTF, iar VALOARE=RESTANPU. Se vor lista numai


articolele pentru care CANTFCANTC.
Problema 19
a) S se creeze fiierul secvenial LOCATARI.DAT, cu articole de forma:
LOCATAR
NUME
BLOC

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 - 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

tiind c NECA reprezint necesarul de aprovizionare pentru a depi stocul de siguran cu


15, iar VALOARE = NECA PU. Afiarea se face numai cnd STOC STOCS + 15
STOCS/100.
n final s se tipreasc i suma total necesar pentru efectuarea aprovizionrii.

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

tiind c GF reprezint gradul de folosire (GT=TL/TN100), iar PDN reprezint pierderile


datorate neutilizrii (PDN=(TN - TL)TARIF).
Problema 23
a) S se creeze fiierul aleator UTILAJE.DIR, 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.DIR i s se editeze pe ecran un raport de forma:
CODU

DENU

TN

TL

TARIF

GF

PDN

tiind c GF reprezint gradul de folosire (GT=TL/TN100), iar PDN reprezint pierderile


datorate neutilizrii (PDN=(TN - TL)TARIF).

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

Potrebbero piacerti anche