Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




UNIT-UL SYSTEM

Informatica


UNIT-UL SYSTEM

Unit-ul standard System implementeaza subprogramele standard ale limbajului Turbo Pascal. Majoritatea subprogramelor sunt definite si in limbajul Pascal standard obisnuit. Pentru utilizarea subprogramelor acestui unit nu trebuie specificata in programul sau unit-ul utilizatoruiui nici o directiva uses, deoarece unit-ul SYSTEM este incarcat automai.



Subprogramele unit-ului SYSTEM pot fi clasificate in felul urmator:

proceduri de iesire si de oprire;

functii de transformare;

functii matematice;

proceduri si functii referitoare la valori ordinale;

subprograme destinate 818d39i tratarii sirurilor;

functii referitoare la pointeri si adrese;

su bp rograme de interes general;

s subprograme aplicabile fisierelor de orice categorie;

intrari/iesiri pentru fisiere text;

intrari/iesiri pentru fisiere cu tip;

intrari/iesiri pentru fisiere fara tip;

subprograme aplicabile fisierelor cu sau fara tip;

proceduri referitoare la directoare;

alocarea dinamica.

Programe care folosesc numai unit-ul SYSTEM

2.1. Descrierea programelor

Acest capitol contine mai multe programe simple explicate in detaliu. Primele doua realizeaza trecerea unui numar din baza 10 intr-o baza oarecare si invers. Urmatoarele sunt programe care folosesc fisiere, efectuand diverse operatii asupra acestora (vizualizarea continutului sau copierea unui fisier). Aceste programe nu au fost grupate pe baza functionalitatii lor, fiind o introducere in modul de conceptie al unui program de mici dimensiuni.

2.1.l. Programul BAZA_01

Se da un numar N baza 10. Sa se scrie un program, care sa converteasca acest numar in baza K ( 2<=B<=36).

Mai intai se citesc de la tastatura numarul N si baza B. Baza este limitata superior de numarul 36 intrucat pentru reprezentarea lui N in baza B se vor folosi B simboluri si anume primele elemente ale multimii ordonate:

Simb = ,

al carei cardinal este 36.

Atentie!

Verificarea faptului ca valorile lui N si B sunt corecte ramane in sarcina utilizatorului.

Sa presupunem ca dorim sa trecem numarul 268 din baza 10 in baza 16. Observam ca 268=16^2*l+16^l*0+16^0*12, unde

16^2*l=256, 16^l=16, 16^0=1

Folosind primele 16 simboluri ale multimii Simb, scrierea iui 268 ia baza 16 este 10 C, C fiind cel de-al 13-lea simbol al lui Simb.

Algoritmul folosit de program consta in efectuarea de impartiri succesive ale lui N la R si retinerea resturilor acestor impartiri, aceste resturi fiind de fapt cifrele rezultatului obtinute in ordine inversa. Algoritmul se opreste cand variabila N devine 0. Pentru a intelege mai bine algoritmulsa urmarim aplicarea acestuia pe exemplul nostru;

Initial:

N=268=16^2*l+16^l*0+16^0*12

Iteratia l :

R=N mod 16 = 12 C (al 13-lea element ai lui Simb)

N=N div 16= 16(= 16^ 1 * 1+16^0* 0)

S-a obtinui ultima cifra R=C.

Iteratia 2 :

R=N mod 16 =0 (primul element al lui Simb)

N=N div l (=16^0*1) S-a obtinut penultima cifra R = 0.

Iteratia 3 :

R = N mod 16 = l (al 2-lea element al lui Simb) N=N div (H= 16^0*0)

S-a obtinut prima ciira R=1

Algoritmul se opreste deoarece N=0.

S-au obtinut cifrele C, 0, l ale rezultatului 10C in ordine inversa,

Rezultatul programului, respectiv lungimea acestuia se retin intr-un sir de caractere S respectiv in variabila i. Iata secventa de instructiuni care calculeaza efectiv rezultatul:

i :- 0;

repeat

r : = n mod b;

in c (i);

if r <=9

then s [i] := chr (r+48)

else s[i] := chr (r + 55);

s[0] := chr(I);

Se observa ca in S se retin codurile ascii ale cifrelor (48= '0' pt. 0, 49 -'1' pt. l, 65 'A' pt. 10 ) pentru a putea fi interpretate ca fiind caractere de catre procedura de afisare WRITE.

In final se afiseaza S in ordinea inversa a caracterelor care il formeaza.

2.1.2. Programul BAZA_02

Se da un numar S in baza B (2 <= B <= 36). Sa se scrie un program care sa converteasca acest numar in baza 10.

Programul descris in continuare realizeaza exact operatia inversa celui de mai inainte.

Se citesc de la tastatura numarul S sub forma unui sir de caractere si baza B in care acesta este scris. Apoi se calculeaza valoarea numerica a lui S si se afiseaza in baza 10 cu ajutorul procedurii WRITE.

Atentie!

Daca unele din cifrele lui S sunt codificate cu ajutorul literelor, atunci la citirea lui S de la tastatura se vor folosi majusculele corespunzatoare.

Spre exemplu, daca se doreste conversia lui 10C din baza 16 in baza 10 se obtine: N=268=( 16^2* 1+16^1*0+16^0* 12= 16* (l 6* 1+0)+12)

Programul va determina N astfel: Initial:

S='10C' N=0

Iteratie l :

R=S[1]=1

N=N* 16 + R=0* 1 = l

Iteratia 2 :

R=S[2]=0

N=N* I6 + R=1 * 16+

Iteratia 3 :

R=S[3]=C = 12

N=N* 16 + R=16* 16+ 12=268

Secventa de instructiuni care realizeaza aceasta este urmatoarea:

n :

for I := l to length (s) do

begin

if s[i]<='9' then

r : = ord(s[i]) - 48

else r : = ord(s[i]) - 55;

(calculez noua valoare a lui N) n : = n * b + r;

end;

Inainte de incheierea programului se afiseaza pe monitor rezultatul N.

2.1.3. Programul TEXTCHAR

Sa se scrie un program care sa parcurga caracter cu caracter un fisier text si sa ii afiseze continutul pe ecran. Numele fisierului se da in linia de comanda,

In cazul in care programul se executa de la prompterul DOS, dupa numele fisierului executabil TEXTCHAR.EXE se va specifica numele fisierului text. Altfel, daca programul se executa din mediul integrat de dezvoltare oferit de TP, trebuie sa comunicati programului numele fisierului prin intermediul optiunii PARAMETERS a submeniului RUN. Aceasta observatie este valabila pentru toate programele care cer parametri in linia de comanda.

Mai intai se asigneaza unei variabile T numele fisierului ascii transmis programului ca parametru, apoi acest fisier este deschis pentru citire cu ajutorul lui RESET.

Atentie !

Valoarea parametrului se afla cu ajutorul functiei PARAMSTR. Programul nu verifica daca acest parametru a fost transmis corect in linia de comanda.

Sugestie

Va sugerez sa modificati programul in asa fel incat daca linia de comanda este

vida sa se citeasca de la tastatura numele fisierului text. Se va folosi functia PAMAMCOUNT care returneaza numarul de parametrii din linia de comanda,

intorcand valoarea 0 daca aceasta este vida, caz in care se va citi de la. tastatura numele fisierului.

Bucla de instructiuni care parcurge fisierul caracter cu caracter este urmatoarea (CH este o variabila de tip char) :

while not eof (t) do begin

read (t, ch);

write (ch);

end;

Se va iesi din bucla atunci cind EOF (T) returneaza TRUE, adica atunci cand s-a ajuns la sfarsitul fisierului.

In final fisierul se inchide cu ajutorul procedurii CLOSE.

2.1.4 Programul TEXTLINE

Sa se scrie un program care sa parcurga linie cu linie un fisier text si sa ii afiseze continutul pe ecran. Numele fisierului se da in linia de comanda.

Programul urmator este identic din punct de vedere functional cu cel de mai inainte .

Diferenta consta in faptul ca parcurgerea fisierului se face linie cu linie, fiind totodata mai rapida datorita faptului ca numarul de apeluri READ/WRITE din primul program este mult mai mare decit cel de apeluri READLN/WRITELN din cel de-al doilea, numarul de caractere dintr-un fisier fiind mai mare decat numarul de linii ale aceluiasi fisier, pe o linie gasindu-se mai multe caractere.

Corespondenta buclei WHILE din primul program este urmatoarea;

while not eof (t) do begin

readln (t,s);

writeln (s);

end;

Atentie!

In cazul acestui program parcurgerea nu se face complet daca liniile fisierului ascii sunt mai lungi de 255 de caractere (caz rar intalnit in practica), liniile acestuia fiind trunchiate.

Sugestie

Modificati acest program astfel incat parcurgerea sa fie corecta si in acest caz.

2.1.5. Programul DELCOM

Sa se scrie un program care sa elimine comentariile cuprinse intre acolade dintr-un fisier sursa PASCAL. Numele acestuia, precum si cel al fisierului, care va fi creat se dau in linia de comanda.

Programul va folosi doua variabile text, numite T si F. Primeia i se asigneaza valoarea primului parametru din linia de comanda, fisierul cu acest nume fiind deschis pentru citire. Acest fisier trebuie sa existe pe disc si sa fie un fisier sursa PASCAL. Apoi lui F i se asigneaza cel de-al doilea parametru si este creat pe disc un fisier cu acest nume folosindu-se REWRITE. In acest fisier se vor scrie instructiunile cuprinse in primul, sarindu-se peste comentariile cuprinse intre acolade.

Programul foloseste o variabila booleana numita FL care are valoarea TRUE daca ne aflam in afara oricarui comentariu sau FALSE in caz contrar. Se tine seama de faptul ca directivele de compilare se afla cuprinse tot intre acolade folosindu-se '$' imediat dupa '

fl:= true;

d r : = false;

while not eof (t) do

begin

read (t,ch);

case ch of

'': if fl then

write(f, '}')

else fl := true;

if dr then

begin

fi: = true;

write(f,'$');

end;

else if fl then

write (f,ch);

end;

if ch<> '', un caz fiind si programul DELCOM, acoladele fiind interpretate ca fiind delimitatori de comentarii,

Sugestie

Modificati programul astfel incat aceste interpretari gresite sa nu mai apara. Ati putea folosi o a treia variabila booleana care sa indice daca in procesul de parcurgere caracterele citite din fisier se afla intre apostrofuri (apartin unui sir) sau nu. Bineinteles trebuie modificat si algoritmul

Sugestie

O ultima modificare pe care ati putea-o face este de a adapta programul astfel incat sa elimine si comentariile cuprinse intre '(*' si '*)'.

2.1.6. Programul FILECOPY

Sa se scrie un program care copiaza un fisier al carui nume este dat in linia de comanda, urmat de numele fisierului destinatie.

Se folosesc doua variabile de tip file numite SOURCE si DEST, un vector de aproximativ 10 k numit BUFFER si doua variabile CITIT si SCRIS de tip word al caror rol va fi explicat in continuare.

Primul fisier este deschis cu RESET pentru a fi citit, iar celalalt este creat cu REWRITE pentru a se scrie in el aceleasi informatii care se gasesc in fisierul sursa.

Succesiv se incearca citirea a 10000 de octeti din SOURCE in BUFFER folosind BLOCKREAD, retinindu-se in CITIT numarul de octeti efectiv cititi. E posibil ca CITIT sa fie mai mic decat 10000 in cazul in care s-au citit chiar ultimii octeti ai lui SOURCE. Apoi se incearca scrierea datelor citite in fisierul DEST cu ajutorul procedurii BLOCKWRITE, retinandu-se in SCRIS numarul de octeti efectiv scrisi. Daca CITIT <> SCRIS inseamna ca a aparut o eroare la scrierea datelor in DEST, spre exemplu nu mai exista spatiu liber pe discul pe care a fost creat fisierul destinatie. Procesul se termina cand s-a ajuns la sfarsitul fisierului sursa.

Bucla de instructiuni care face copierea fisierelor este urmatoarea:

while not eof (source) do begin

blockread (source, buffer, 10000, citit);

blockwrite (dest, buffer, citit, scris);

if citit<>scris then

begin

writeln ('Eroare la scriere'); halt;

end;

end;

Atentie!

Cu cat dimensiunea lui BUFFER este mai mare cu atat performantele programului cresc, insa aceasta crestere nu este liniara. Daca se va incerca copierea octet cu octet a fisierelor, programul va fi extrem de lent, iar pentru valori mari ale dimensiunii lui BUFFER variatia performantei este mica, programul ruland suficient de rapid.

2.2. Sursele programelor

2.2.1. Sursa programului BAZA_01

program baza_01;

var

n : longint;

s : string;

i,b,r : byte; begin

write ('n = ');

readln (n);

write ('b = ');

readln (b);

inc (i);

if  r <= 9

then s[i] := chr (r + 48) else s[i] := chr (r + 55);

n : = n div b;

until n = 0;

s[0] := chr (i);

write ('s= '

for l := length(s) downto 1 do

write (s[i]); writeln;

end.

2.2.2. Sursa programului BAZA_02

program baza_02;

var

n : longint;

s  ; strmg;

i,b,r : byte; begin

wrtte ('s = ');

realn (s);

write ('b = ');

readln (b);

n : = 0;

for i: = 1 to length (s) do

begin

if s[i]<= '9' then r : = ord (s[I]) - 48

else r : = ord (s[ij) - 55;

n := n * b + r;

end;

writeln ('n =', n); end.

2.2.3. Surse programului TEXTCHAR

program textchar;

var

t : text;

ch : char;

begin

assign (t, paramstr(1));

reset (t);

while not eof(t) do

begin

read (t, ch); write (ch);

end;

clo se (t );

end.

2.2.4. Sursa programului TEXTLINE

program textline;

var

t : text;

s : string; begin

assign (t, paramstr(i)),

reset (t);

while not eof (t) do

begin

readln (t, s); writeln (s);

end;

close(t); end.

2.2.5. Sursa programului DELCOM

program delcom;

var

t, f ; text;

fl  : boolean;

dr  : boolean;

ch : char;

begin

assign (t, paramstr(1));

reset (t);

assign (f, paramstr(2));

rewrite (f);

fl  : = true;

dr  : = false;

while not eof (t) do

begin

read (t, ch);

case ch of

'' :if fl

then write (f,'}')

else fl:=true;

:if dr then

begin

fl:= true;

write(f,' program filecopy;

var

source,dest : file;

buffer : array [l..10000] of byte;

citit,scris  : word;

begin

assign (source, paramstr (1)); reset (source, 1);

assign(dest,paramstr(2)); rewrite(dest,1);

while not eof (source) do begin

blockread (source, buffer, 10000, citit); blockwrite (dest, buffer, citit, scris);

if citit <> scris then

begin

writeln ('Eroare la scriere');

halt;

end;

end;

close(source); close(dest);

end..


Document Info


Accesari: 1100
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )