Sunteți pe pagina 1din 0

Fi!iere de tip text !

i
prelucr"ri simple

! Exploatarea unui fi!ier de tip text
! Prelucr"ri simple ale datelor citite din fi!iere
! Determinarea elementului minim/maxim
! Implement"ri sugerate
! Probleme propuse
! Solu#iile problemelor
Capitolul
2



Un fi!ier de tip text este o colec"ie de nregistr#ri unde nregistr#rile sunt caractere (sau
!iruri de caractere) structurate pe linii. Liniile sunt separate prin marcaje formate din
caracterele sfr!it de linie (#10#13 adic# LF+CR).
Un astfel de fi!ier se poate crea cu editorul din mediul de programare, prin program
sau cu orice alt editor cu care se pot crea fi!iere ASCII.
Lungimea liniilor fiind variabil#, nu se poate realiza un acces direct la o anumit# li-
nie din fi!ier.

2.1. Exploatarea unui fi!ier de tip text
Variabila de lucru care se asociaz# prin program unui fi!ier de pe suport se declar# n
sec"iunea de declara"ii var:
identificator:Text;

Procedura predefinit# care realizeaz# leg#tura ntre o variabil# de tip fi!ier !i fi!ie-
rul existent pe suport este Assign(identificator, nume_fi!ier) unde nume_fi!ier este o
expresie de tip !ir de caractere (evident poate fi o variabil# sau o constant# de tip !ir
de caractere).

2.1.1. Deschidere/nchidere
Procedurile predefinite create pentru a deschide, respectiv nchide un fi!ier de tip text
identificat prin variabila f sunt:
! ReWrite(f): apelul acestei proceduri are ca efect crearea fi!ierului sau rescrierea
acestuia dac# el exist#; altfel spus, dac# un fi!ier de tip Text este deschis cu Re-
Write, vom putea scrie n acesta;
2. Fi!iere de tip text !i prelucr"ri simple 47

! Reset(f): apelul acestei proceduri are ca efect deschiderea fi!ierului pentru citire,
indicatorul de fi!ier aflndu-se la nceputul fi!ierului, adic#, dup# deschiderea lui,
pozi"ia curent# pentru citire este prima din fi!ier;
! Append(f): provoac# pozi"ionarea indicatorului pe marcajul de sfr!it de fi!ier n
vederea ad#ug#rii de nregistr#ri; preciz#m c# scrierea ncepe din pozi"ia curent#
ceea ce nseamn# suprascrierea marcajului de sfr!it de fi!ier, apoi continuarea
scrierii nregistr#rilor dorite n fi!ier;
! Close(f): realizeaz# nchiderea fi!ierului. Scrierea efectiv# a datelor n fi!ierul de
ie!ire se realizeaz# pe blocuri (pn# la umplerea unui bloc acestea se p#streaz#
temporar n zone tampon de memorie). Ultimele date (adic# blocul nceput !i ne-
umplut n ntregime) se scrie efectiv n fi!ier la nchiderea acestuia. Rezult# c# dac#
nu nchidem fi!ierul de ie!ire s-ar putea ca n fi!ier s# se transfere doar o parte din
rezultate, sau n cazul n care aceste rezultate f#ceau parte dintr-un prim bloc nce-
put !i neumplut, s# avem fi!ier vid.

2.1.2. Intr"ri/Ie!iri
Dintr-un/ntr-un fi!ier de tip text se pot citi sau se pot scrie caractere, !iruri de caracte-
re, numere ntregi !i numere reale. Subprogramele care realizeaz# citirea !i scrierea
sunt:
! Read(f,a
1
,a
2
,...,a
n
): are ca efect citirea a n date din fi!ier;
! ReadLn(f,a
1
,a
2
,...,a
n
): are ca efect citirea a n date din fi!ier, dup# care urm#-
toarea citire se va face de pe linie nou#;
! Write(f,a
1
,a
2
,...,a
n
): se realizeaz# scrierea a n date n fi!ier;
! WriteLn(f,a
1
,a
2
,...,a
n
): se realizeaz# scrierea a n date n fi!ier !i a marcaju-
lui de sfr!it de linie;
! Rename(f,nume_nou): redenume!te un fi!ier la nivel fizic, (adic# pe suport);
! Eof(f): func"ie boolean# care returneaz# valoarea true dac# urm#torul caracter
care ar urma s# fie citit din fi!ier este marcajul de sfr!it de fi!ier !i false altfel.
! EoLn(f): func"ie boolean# care ntoarce valoarea true dac# urm#torul caracter
care ar urma s# fie citit din fi!ier este marcajul de sfr!it de linie sau marcajul de
sfr!it de fi!ier !i false n caz contrar.

2.2. Prelucr"ri simple ale datelor citite din fi!iere
Prin prelucrare simpl# vom n"elege calcularea unor sume, produse, medii (aritmetice
sau geometrice), c"utarea unui element avnd o anumit# proprietate, num"rarea ele-
mentelor avnd o anumit# proprietate.

48 2. Fi!iere de tip text !i prelucr"ri simple

2.2.1. Sume !i produse
Orice sum# trebuie ini"ializat# cu elementul neutru fa"# de adunare !i anume cu 0.
Apoi, cu o prelucrare simpl# se calculeaz# suma. Singura problem# care poate s# apar#
se refer# la faptul c# mediile de programare nu ne aten"ioneaz# cnd o astfel de sum#
sau produs dep#!e!te valoarea maxim# posibil# de reprezentat n cadrul tipului varia-
bilei sum#. n anumite medii de programare exist# totu!i posibilitatea de a cere contro-
larea dep#!irii. De exemplu, dac# n cazul urm#torului program simplu, pozi"ion#m op-
"iunea Options/Compiler/Range checking pe ON, execu"ia acestuia se va ntrerupe cu
un mesaj de eroare: Range check error, altfel se afi!eaz# un rezultat eronat (s = 128)
f#r# nici o aten"ionare.

Program Test;
var x,s:Byte;
Begin
s:=0;
for x:=1 to 255 do s:=s+x; { s nu va ncape pe un octet }
WriteLn(s)
End.

Dar un program care se ntrerupe cu un mesaj de eroare nu ne poate mul"umi. Chiar
dac# nu se poate calcula suma de mai sus, programul nostru trebuie s# se finalizeze ca
un produs func"ional !i s# ne comunice fie rezultatul corect, fie s# ne comunice printr-
un mesaj prev#zut pentru asemenea cazuri c# nu a fost posibil# finalizarea calculelor.
Problema protec"iei fa"# de dep#!iri se poate nl#tura declarnd variabila sum# de
un tip de date sigur. Dar pentru cazurile n care aceast# solu"ie nu este la ndemn#,
ne putem feri cu o decizie simpl#. De exemplu, s# presupunem c# n cazul programu-
lui de mai sus vrem s# !tim care este valoarea cea mai mare a variabilei x care nc# se
mai poate aduna, f#r# s# se produc# dep#!ire. Efectul programului urm#tor va fi
afi!area valorii 23.

Program Test;
var x,s:Byte;
prea_mare:Boolean;
Begin
s:=0; x:=1;
prea_mare:=false;
while not prea_mare and (x<=255) do
if s <= 255 - x then begin
s:=s+x;
Inc(x)
end else prea_mare:=true;
if prea_mare then WriteLn('Ultima data s-a adunat ',x)
else WriteLn(s)
End.
2. Fi!iere de tip text !i prelucr"ri simple 49

2.2.2. Medii
Pentru a calcula o medie aritmetic#, mai nti se calculeaz# o sum#. Dac# num#rul ter-
menilor din sum# se cunoa!te, media se calculeaz# mp#r"ind suma la acest num#r.
Dar se ntmpl# frecvent c# n sum# se adun# doar anumite numere, de exemplu, doar
cele pozitive. Acestea se vor num#ra, n paralel cu calcularea sumei. S# nu uit#m s# n-
treb#m nainte de mp#r"ire, dac# num#rul termenilor din sum# nu cumva este 0,
pentru a evita o mp#r"ire nepermis#. De asemenea, n acest caz, fie afi!#m un mesaj,
fie realiz#m sarcinile specificate n enun"ul problemei.

2.2.3. C"utarea secven#ial"
Putem c#uta un element avnd o valoare cunoscut# sau avnd o anumit# proprietate.
Rezultatul va fi un r#spuns: da, l-am g#sit sau nu l-am g#sit. Referitor la aceast#
subproblem# dorim s# atragem aten"ia asupra faptului c# o valoare c#utat# !i g#sit# nu
trebuie c#utat# n restul datelor. Drept consecin"# nu vom c#uta cu for, ci cu o struc-
tur# repetitiv# cu num#r necunoscut de pa!i. n algoritmul urm#tor presupunem c# se
caut# o valoare dat#, denumit# c"utat, printre date de acela!i tip, citite dintr-un fi!ier.

Algoritm c!utare:
cite!te c!utat
cite!te x
ct timp nu urmeaz" marca de sfr!it de fi!ier !i (x # c!utat) execut":
cite!te x
sfr!it ct timp
{ am ie!it din ciclu fie din cauza c" s-a g"sit elementul c"utat, }
{ fie din cauza c" urmeaz" marca de sfr!it de fi!ier; n concluzie }
{ trebuie s" afl"m care din cele dou" cazuri a condus la p"r"sirea ciclului }
dac" x = c!utat atunci
scrie 'L-am g!sit.'
altfel
scrie 'Nu l-am g!sit.'
sfr!it dac"
sfr!it algoritm

Dac# alegem versiunea n care lucr#m cu o variabil# logic#, compararea elementu-
lui curent cu cel c#utat o facem explicit n corpul structurii repetitive. De asemenea,
dac# dintr-un motiv oarecare vrem totu!i s# lucr#m cu for, n Pascal avem posibilita-
tea s# ntrerupem c#utarea n momentul g#sirii elementului c#utat, apelnd subprogra-
mul Break.


50 2. Fi!iere de tip text !i prelucr"ri simple

2.3. Determinarea elementului minim/maxim
n foarte multe probleme intervine o subproblem# n care se cere determinarea celui
mai mic sau celui mai mare element dintr-o mul"ime de date. Con"inutul unui fi!ier
poate fi privit ca fiind o astfel de mul"ime, binen"eles, ct timp ne referim la un con"i-
nut format din acela!i tip de date.
Prezentarea algoritmului o vom face pentru determinarea valorii minime dintre mai
multe date de tip ntreg care se citesc dintr-un fi!ier de tip text. Variabila desemnat# s#
re"in# valoarea minimului (min) va fi ini"ializat# fie cu prima valoare citit# din fi!ier,
fie cu o valoare str#in#, aleas# cu grij# pentru a nu risca s# fie cea mai mic# n com-
para"ie cu datele din fi!ier. (Aceast# a doua solu"ie se recomand# doar n cazul n care
prima variant# nu este posibil# sau este mult prea anevoioas#.)
n algoritm, n continuare, se citesc pe rnd datele din fi!ier !i fiecare se compar#
cu valoarea curent# a variabilei min care se actualizeaz# dup# caz.

Algoritm Minim:
cite!te nr
min $ nr
ct timp nu urmeaz" marca de sfr!it de fi!ier execut":
cite!te nr
dac" min > nr atunci
min $ nr
sfr!it dac"
sfr!it ct timp
sfr!it algoritm

n cazul maximului vom proceda similar, fiind aten"i la operatorul rela"ional utili-
zat. Este posibil, ca enun"ul s# cear# !i num"rul de ordine al elementului minim (ma-
xim). n acest caz, pe ramura atunci din structura alternativ# vom ad#uga !i actuali-
zarea num#rului de ordine care trebuie ini"ializat# cu valoarea 1 (dac# prelucrarea a n-
ceput cu elementul de indice 1) nainte de a intra n structura repetitiv# ct timp. n
acest fel, chiar dac# n fi!ier se afl# mai multe date egale cu valoarea cea mai mic#, nu-
m#rul de ordine va fi al primului astfel de num#r.
Dac# ni se cere ultimul num#r egal cu valoarea minim#, trebuie doar s# modific#m
operatorul rela"ional > n %.
Dac# trebuie s# afi!#m toate numerele de ordine ale datelor care sunt egale cu mi-
nimul, atunci trebuie s# recurgem la o alt# tehnic#. Imediat dup# ini"ializarea variabilei
min, scriem valoarea lui !i num#rul de ordine 1 n fi!ierul de ie!ire. Urmeaz# compara-
rea celorlalte date cu min. Dac# num#rul curent este mai mare dect min, nu trebuie s#
facem nimic. n caz contrar vom ntreba dac# num#rul curent este egal cu min. n caz
afirmativ, deschidem fi!ierul de ie!ire pentru ad"ugare (n Pascal cu Append) !i scri-
em n el num#rul de ordine al elementului care a avut valoarea egal# cu min. Dac# nu-
2. Fi!iere de tip text !i prelucr"ri simple 51

m#rul curent este mai mic dect min, deschidem fi!ierul pentru scriere (n Pascal cu
ReWrite) !i scriem noua valoarea a minimului !i num#rul de ordine corespunz#tor.
Astfel, practic !tergem vechiul con"inut al fi!ierului scriind n el rezultatul care, con-
form stadiului prelucr#rii, este corect. n final, vom avea unul sau mai multe numere
de ordine care corespund elementelor egale cu valoarea minim# scris# n fi!ier.
*)


2.4. Implement"ri sugerate
Pentru a v# familiariza cu modul n care trebuie rezolvate problemele n care intervin
opera"ii cu fi!ier de tip text, v# suger#m s# ncerca"i s# implementa"i algoritmi pentru:
1. citirea unui num#r dintr-un fi!ier !i scrierea sa n altul;
2. citirea tuturor numerelor dintr-un fi!ier care con"ine cte un num#r pe o linie !i
scrierea lor n alt fi!ier, cte unul pe o linie;
3. citirea datelor dintr-un fi!ier care con"ine numere, mai multe pe o linie, !i scrierea
lor ntr-un alt fi!ier n aceea!i form#;
4. citirea unei secven"e de numere dintr-un fi!ier !i scrierea ei n alt fi!ier;
5. citirea unor nume (!iruri de caractere) dintr-un fi!ier !i scrierea lor ntr-un alt fi!ier;
6. citirea unui num#r natural N dintr-un fi!ier !i scrierea ntr-un alt fi!ier a tuturor nu-
merelor naturale cuprinse ntre 0 !i N, cte unul pe o linie;
7. citirea unui num#r natural N dintr-un fi!ier !i a N nume (aflate pe urm#toarele linii
ale fi!ierului) !i scrierea celor N nume ntr-un alt fi!ier;
8. copierea integral# a con"inutului unui fi!ier ntr-un alt fi!ier;
9. redeschiderea fi!ierelor atunci cnd este necesar.

Pentru a v# familiariza cu prelucr#ri simple, cum sunt calculul sumelor, determina-
rea minimului/maximului, v# suger#m s# ncerca"i s# implementa"i algoritmi pentru:
! calcularea sumei primelor N numere naturale;
! calcularea sumei unor date p#strate ntr-un fi!ier de tip text;
! determinarea minimului/maximului dintr-un !ir de date p#strate ntr-un fi!ier de
tip text;
! ini"ializarea minimului/maximului (cu elementul neutru sau cu primul element);
! citirea unor numere dintr-un fi!ier !i scrierea ntr-un fi!ier a minimului lor precum
!i a primei pozi"ii pe care apare acest minim;
! citirea unor numere dintr-un fi!ier !i scrierea ntr-un fi!ier a minimului lor precum
!i a ultimei pozi"ii pe care apare acest minim;
! citirea unor numere dintr-un fi!ier !i scrierea ntr-un fi!ier a minimului lor precum
!i a tuturor pozi"iilor pe care apare acest minim.


*)
Ace!ti algoritmi se vor trata din nou n cazul n care datele vor fi structurate n tablouri.
52 2. Fi!iere de tip text !i prelucr"ri simple

2.5. Probleme propuse

2.5.1. Num"r par
Stabili"i dac# printre numerele ntregi scrise ntr-un fi!ier de tip text exist# sau nu cel
pu"in un num#r par.

Date de intrare
n fi!ierul de intrare PAR.IN se afl# mai multe numere ntregi.

Date de ie!ire
Dac# n fi!ier exist# cel pu"in un num#r par, n fi!ierul de ie!ire PAR.OUT se va scrie
'DA', altfel se va scrie 'NU'.

Restric#ii !i preciz"ri
! 0 & num"r & 1000000000.

Exemplu
PAR.IN
1 2 3
PAR.OUT
DA

2.5.2. Numere pare p"trate perfecte n fi!ier
ntr-un fi!ier sunt scrise mai multe numere naturale. Alege"i numerele pare care sunt
p#trate perfecte !i scrie"i-le ntr-un alt fi!ier.

Date de intrare
Numerele sunt scrise n fi!ierul de intrare NUMERE.IN pe mai multe rnduri. Pe un
rnd sunt scrise un num#r oarecare de numere, separate prin unul sau mai multe spa"ii.

Date de ie!ire
Numerele pare care sunt p#trate perfecte se vor scrie cte unul pe linie, n fi!ierul de
ie!ire NUMERE.OUT.

Restric#ii !i preciz"ri
! 0 & num"r & 1000000000.

Exemplu
NUMERE.IN
12 4 24
100 25
900
NUMERE.OUT
4
100
900
2. Fi!iere de tip text !i prelucr"ri simple 53

2.5.3. Concatenare de fi!iere
Se consider# dou# fi!iere de tip text F1.IN !i F2.IN. S# se creeze un al treilea fi!ier
de tip text F3.OUT care s# con"in# toate datele din F1.IN, apoi ntreg con"inutul fi!ie-
rului F2.IN.

Date de intrare
Fi!ierele sunt specificate prin numele lor, F1.IN !i F2.IN !i au con"inuturi oarecare
pe care le vom privi ca fiind caractere. Acestea se vor citi ncepnd cu primul !i termi-
nnd cu ultimul, pn# la marca de sfr!it de fi!ier.

Date de ie!ire
Fi!ierul F3.OUT va fi format din datele din fi!ierul F1.IN, apoi o linie vid#, dup# care
urmeaz# datele din fi!ierul F2.IN.

Restric#ii !i preciz"ri
! o linie din fi!ier con"ine cel mult 255 de caractere.

Exemplu
F1.IN
Ana are mere.
23 24
156432
F2.IN
123 c 123
Ast!zi plou!.
F3.OUT
Ana are mere.
23 24
156432
linie vid"
123 c 123
Ast!zi plou!.

2.5.4. Caractere
Se consider# dou# numere naturale a !i b care reprezint# capetele unui interval de nu-
mere ntregi !i un num#r oarecare de caractere. Alege"i dintre aceste caractere pe ace-
lea care au codurile ASCII cuprinse n intervalul [a, b].

Date de intrare
Pe prima linie a fi!ierului CARACTER.IN se afl# numerele a !i b, separate printr-un
spa"iu. Pe fiecare dintre urm#toarele linii sunt scrise mai multe caractere.

Date de ie!ire
Caracterele care corespund cerin"ei problemei se vor scrie n fi!ierul CARACTER.OUT
pe aceea!i linie, separate prin cte un spa"iu.

Restric#ii !i preciz"ri
! 0 & a & b & 255.
54 2. Fi!iere de tip text !i prelucr"ri simple

Exemplu
CARACTER.IN
50 124
Ana are 10 mere
CARACTER.OUT
A n a a r e m e r e


2.5.5. Medii
Cunoscnd mediile semestriale la disciplina informatic" ale unor elevi dintr-o clas#, s#
se determine media semestrial# a clasei la aceast# disciplin#.

Date de intrare
n fi!ierul MEDII.IN sunt scrise mediile elevilor, cte un num#r real pe fiecare linie.

Date de ie!ire
Media clasei se va scrie n fi!ierul de ie!ire MEDII.OUT. Dac#, din nefericire, nu se
poate calcula media, deoarece to"i elevii au r#mas corigen"i, n fi!ier se va scrie
mesajul: 'Nu se poate calcula media.'

Restric#ii !i preciz"ri
! mediile sunt numere reale, cu dou# zecimale exacte;
! 3 & medie & 10;
! mediile mai mici dect 5 nu particip# la calcule.

Exemplu
MEDII.IN
8.95
9.50
4.67
6.88
MEDII.OUT
8.44
Explica#ie
Media 4.67 nu particip# la
calcule. Media aritmetic#
s-a calculat din 3 medii.

2.5.6. Factorial
S# se calculeze produsul primelor N numere naturale (factorialul)!

Date de intrare
n fi!ierul de intrare FACT.IN este scris un singur num#r natural.

Date de ie!ire
Valoarea factorialului se va scrie n fi!ierul de ie!ire FACT.OUT.

Restric#ii !i preciz"ri
! 5 & N & 18
2. Fi!iere de tip text !i prelucr"ri simple 55

Exemplu
FACT.IN
5
FACT.OUT
120

2.5.7. Vrste
Dintr-un fi!ier de tip text se citesc numere naturale, reprezentnd anii de na!tere a unor
persoane. Afi!a"i anul de na!tere !i num#rul de ordine a liniei din fi!ier pe care se afl#
anul na!terii al celei mai tinere persoane. Proceda"i la fel n cazul celei mai vrstnice
persoane.

Date de intrare
Pe fiecare linie a fi!ierului ANI.IN se afl# un num#r ntreg, reprezentnd anul na!terii
unei persoane.

Date de ie!ire
Pe prima linie a fi!ierului de ie!ire ANI.OUT se va scrie anul de na!tere a celei mai ti-
nere persoane. Pe linia a doua se va scrie num#rul de ordine a celei mai tinere per-
soane. Pe a treia linie se va scrie anul de na!tere a celei mai vrstnice persoane. Pe a
patra linie se scrie num#rul de identificare a celei mai vrstnice persoane. Dac# ntr-un
acela!i an s-au n#scut mai multe persoane, se vor furniza toate numerele de ordine co-
respunz#toare, desp#r"ite prin cte un spa"iu.

Restric#ii !i preciz"ri
! 1900 & an & 2003.

Exemplu
ANI.IN
1991
1998
2000
2002
1978
1978
2002
ANI.OUT
2002
4 7
1978
5 6


2.5.8. Caractere
Se consider# un fi!ier de tip text care con"ine caractere. Afi!a"i, n ordinea n care apar
n fi!ier acele caractere care sunt mai mari dect ultimul caracter din fi!ier.

Date de intrare
Pe fiecare linie a fi!ierului de intrare CARACTER.IN se afl# un caracter.
56 2. Fi!iere de tip text !i prelucr"ri simple

Date de ie!ire
Pe prima linie a fi!ierului de ie!ire CARACTER.OUT se va scrie ultimul caracter citit
din fi!ierul de intrare. Pe urm#toarea linie se vor scrie caracterele cerute, separate prin
cte un spa"iu.

Exemplu
CARACTER.IN
f
z
3
s
w
r
t
1
n
j
CARACTER.OUT
j
z s w r t n

2.5.9. Pare, impare
Dintr-un fi!ier de tip text se citesc mai multe numere naturale de pe fiecare linie. Pen-
tru fiecare linie din fi!ier afi!a"i cea mai mic# valoare par# !i cea mai mare valoare im-
par# preciznd !i num#rul de ordine a liniei.

Date de intrare
Fiecare linie a fi!ierului de intrare LINII.IN con"ine numere naturale, separate prin
cte un spa"iu.

Date de ie!ire
Fi!ierul de ie!ire LINII.OUT va avea tot attea linii cte linii exist# n fi!ierul de in-
trare. Pe fiecare linie vor fi scrise dou# numere care reprezint# cel mai mic num#r par
!i cel mai mare num#r impar de pe linia corespunz#toare a fi!ierului de intrare.

Restric#ii !i preciz"ri
! 0 < num"r & 32767;
! pe fiecare linie din fi!ierul de intrare exist# att numere pare, ct !i impare.

Exemplu
LINII.IN
1 2 3 4 5 2 3 4
2 2 2 2 3 3 3
1 3 4 5 66 77 23
12 23 134 1234 12
LINII.OUT
2 5
2 3
4 77
12 23
2. Fi!iere de tip text !i prelucr"ri simple 57

2.6. Solu#iile problemelor propuse

2.6.1. Num"r par
Aceast# problem# cere s# stabilim dac# printre o mul"ime de numere apare cel pu"in
un num#r par.

Algoritm Exist!_Pare_1:
g!sit $ fals
ct timp nu am ajuns la sfr!itul fi!ierului !i nu g!sit execut":
cite!te nr { citim alt num"r }
g!sit $ g!sit sau nr este par
sfr!it ct timp
dac" g!sit atunci
scrie 'DA'
altfel
scrie 'NU'
sfr!it algoritm

Dac# vrem s# evit#m folosirea variabilei logice g!sit, putem proceda n felul ur-
m#tor:

Algoritm Exist!_Pare_2:
cite!te nr
ct timp nu am ajuns la sfr!itul fi!ierului !i num"rul este impar execut":
cite!te nr { citim alt num"r }
sfr!it ct timp
dac" nu am ajuns la sfr!itul fi!ierului sau nr este par atunci
{ dac" nu urmeaz" marca de sfr!it de fi!ier, nseamn" c" am g"sit un num"r }
{ par, altfel mai este posibil ca nr din fa#a m"rcii de sfr!it de fi!ier s" fi fost par }
scrie 'DA'
altfel
scrie 'NU'
sfr!it algoritm

2.6.2. Numere pare p"trate perfecte n fi!ier
Variabilele f !i g de tip Text se vor asocia fi!ierelor NUMERE.IN, respectiv NUME-
RE.OUT. Numele fi!ierelor precizate n enun" sunt declarate sub forma unor constante
simbolice la nceputul programului. Binen"eles, aceste constante de tip !ir de caracte-
re s-ar fi putut scrie ca parametri actuali n apelul procedurilor Assign. Primul fi!ier
se deschide cu Reset(f), ceea ce nseamn# c# se va parcurge de la nceput n scopul
citirii datelor scrise n el. Al doilea fi!ier se deschide cu ReWrite(g) pentru scriere.
58 2. Fi!iere de tip text !i prelucr"ri simple

Se parcurge primul fi!ier ct timp acesta con"ine date (pn# la sfr!itul fi!ierului).
Pentru fiecare num#r citit din fi!ier se verific# dac# este p#trat perfect !i dac# este par.
Dac# aceste condi"ii sunt ndeplinite, num#rul se va scrie n fi!ierul de ie!ire.

Algoritmul care realizeaz# aceste opera"ii este:

Algoritm Numere_pare_p!trate_perfecte:
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
cite!te n { din fi!ier }
dac" n este num"r par atunci
nr $ 2
ct timp nr*nr < n execut":
nr $ nr + 2
sfr!it ct timp
dac" nr*nr = n atunci
scrie n { n fi!ier }
sfr!it dac"
sfr!it dac"
sfr!it ct timp
sfr!it algoritm

Verificarea propriet#"ii de p#trat perfect se realizeaz# genernd, pe rnd p#tratele
numerelor naturale, ncepnd de la 2, deoarece nu are rost s# gener#m p#tratele unor
numere impare, acestea fiind !i ele impare. Ct timp un astfel de p#trat este mai mic
dect num#rul, gener#m urm#torul p#trat. Dac# acesta nu este mai mic, poate fi egal cu
num#rul dat sau poate fi mai mare dect el. n caz de egalitate, scriem num#rul n fi!i-
erul de ie!ire.

2.6.3. Concatenare de fi!iere
Principalele obiective pe care ni le propunem n rezolvarea acestei probleme sunt:
! folosirea corect# a subprogramelor predefinite pentru fi!iere: Assign, Reset,
ReWrite, Append, Close;
! parcurgerea corect# a unei linii !i citirea marcajului de sfr!it de linie;
! citirea !i scrierea corect# din !i respectiv ntr-un fi!ier de tip text;
! realizarea scrierii unei linii vide n fi!ier.
Se parcurg pe rnd con"inuturile celor dou# fi!iere, caracter cu caracter. Fiecare ca-
racter citit se scrie n fi!ierul F3.OUT. Cnd se ntlne!te marcajul de sfr!it de linie n
fi!ierul de ie!ire se va face salt la linie nou#. Dup# ce primul din cele dou# fi!iere de
intrare a fost parcurs n ntregime, se scrie o linie vid# n fi!ierul de ie!ire.
Prezent#m citirea datelor din fi!ierul F1.IN !i scrierea acestora n F3.OUT, precum
!i scrierea liniei vide. Variabila c este de tip caracter.
2. Fi!iere de tip text !i prelucr"ri simple 59

Algoritm concatenare:
ct timp nu urmeaz" marca de sfr!it de fi!ier n f1 execut":
ct timp nu urmeaz" marca de sfr!it de linie n f1 execut"
cite!te c { se cite!te un caracter din fi!ierul f1 }
scrie c { se scrie caracterul n f3 }
sfr!it ct timp
cite!te marcajul de sfr!it de linie n f1
scrie marcaj de sfr!it de linie n f3
sfr!it ct timp
scrie marcaj de sfr!it de linie n f3 (se las" o linie vid")
Se copiaz" n aceea!i manier" con#inutul fi!ierului F2.IN n F3.OUT.
sfr!it algoritm

2.6.4. Medii
Problema cere determinarea unei medii aritmetice. n paralel cu citirea vom num#ra
termenii sumei pe baza c#reia se va determina media aritmetic#, deoarece nu cunoa!-
tem num#rul datelor. Nu este suficient s# num#r#m pur !i simplu datele, deoarece
eventualele medii mai mici dect 5, nu intr# n calcule. n final suma se mparte la
num#rul termenilor, dac# acest num#r este diferit de 0.

Algoritm Medii:
s $ 0 { element neutru pentru adunare }
nr $ 0 { num"rul termenilor }
ct timp nu urmeaz" marca de sfr!it de fi!ier execut":
cite!te medie { media curent" n fi!ier }
dac" medie % 5 atunci{ doar mediile mai mari sau egale cu 5 intereseaz" }
nr $ nr + 1 { cre!te num"rul termenilor }
s $ s + medie { adun"m termenul curent }
sfr!it dac"
sfr!it ct timp
dac" nr # 0 atunci { dac" avem cel pu#in o medie mai mare sau egal" cu 5 }
scrie s/nr { afi!"m media aritmetic" }
altfel
scrie 'Nu se poate calcula media.'
sfr!it algoritm

2.6.5. Factorial
n aceast# problem# vom citi valoarea lui n !i pe baza lui, cu ajutorul unei instruc"iuni
pentru, vom genera toate numerele naturale.

60 2. Fi!iere de tip text !i prelucr"ri simple

Algoritm Fact: { n p vom ob#ine valoarea factorialului }
p $ 1 { element neutru pentru nmul#ire }
cite!te n
pentru i=1,n execut":
p $ p * i { nmul#im cu factorul curent }
sfr!it pentru
sfr!it algoritm

Dar s# facem abstrac"ie pentru moment de precizarea din enun" cu privire la limite-
le lui n. S# verific#m programul de mai sus pe rnd pentru valorile 5, 8, ..., 25, ... 40,
poate !i 50. n func"ie de tipul variabilei p se pot ntmpla lucruri interesante. De
exemplu, dac# rezultatul este declarat ca fiind de tipul Byte, vom ob"ine 6!=208, iar
8!=128. Dar 8! ar trebui s# fie egal cu 720. Dac# modific#m tipul lui p din Byte n
Longint !i rul#m programul pentru n = 20, ob"inem 20!=-2102132736 (num#r
negativ!), iar pentru n = 50, 50!=0. Dac# o declar#m pe p de tip Real, programul se
ntrerupe pentru n > 33 cu mesajul de eroare: Floating point overflow!
S# lu#m n considerare situa"ia n care se prefer# ca rezultatul s# fie de tip Long-
int. Evident, ncerc#rile ne-au convins, c# ncepnd cu o anumit# valoare a lui n se
produce dep#!ire. Mai ales atunci cnd trebuie calculat factorialul unui n care constitu-
ie un rezultat calculat n program, ne trebuie un instrument care s# ne protejeze de
nepl#ceri, cum ar fi ob"inerea unui rezultat fals. Cel mai mare num#r de tipul Long-
int, posibil de reprezentat n calculator este 2147483647, re"inut de constanta sim-
bolic# a unit-ului System, numit# n Pascal MaxLongint. Ar urma s# putem pune o n-
trebare de genul if p > MaxLongint then... Dar este absurd s# ntreb#m dac#
un num#r este mai mare dect cel mai mare num#r posibil...
n consecin"#, vom pune ntrebarea cu un pas nainte de efectuarea nmul"irii curen-
te care ar putea produce o dep#!ire n felul urm#tor:

...
p:=1;
i:=1;
while (p<>0) and (i<=n) do begin
if p > MaxLongint div i then
p:=0
else begin
p:=p*i;
Inc(i)
end
end
...

Valoarea lui p se va testa n blocul apelant pentru a decide dac# s-a putut calcula
factorialul cerut, sau nu, deoarece s-ar fi produs o dep#!ire.
2. Fi!iere de tip text !i prelucr"ri simple 61

2.6.6. Caractere
n aceast# problem# n fi!ierul de intrare avem caractere ASCII care pot fi cifre, litere
sau alte semne. Avnd n vedere c# dintre acestea trebuie s# culegem caracterele
avnd codul ASCII n intervalul [a, b], vom analiza fiecare caracter citit din fi!ierul de
intrare !i dac# acesta are codul ASCII n intervalul dat, l copiem n fi!ierul de ie!ire.
Fie, de exemplu, con"inutul fi!ierului de intrare CARACTER.IN:
50 125
Ana are 10 mere
Intervalul este [50, 125]. Se parcurg caracterele de pe a doua linie !i se compar#, pe
rnd, codurile ASCII ale caracterelor citite cu capetele intervalului. Codul ASCII al
unui caracter c se poate ob"ine (n Pascal) folosind func"ia Ord(c). De exemplu,
Ord('A')=65, Ord('n')=110 etc.
Pentru fi!ierul dat ca exemplu, doar caracterele '0', '1' !i caracterul spa"iu care
au codurile ASCII 48, 49, respectiv 32 nu se afl# n intervalul cerut. n concluzie, n
fi!ierul de ie!ire vom avea urm#toarele caractere, separate prin cte un spa"iu:
A n a a r e m e r e

Algoritm Caractere:
cite!te a,b
ct timp nu urmeaz" marcajul de sfr!it de fi!ier n CARACTER.IN execut":
ct timp nu urmeaz" marcajul de sfr!it de linie n CARACTER.IN execut":
cite!te c
dac" codul ASCII al caracterului c % a !i
codul ASCII al caracterului c & b atunci
scrie c,' ' { scriem n fi!ierul de ie!ire }
sfr!it dac"
sfr!it ct timp
cite!te marcajul de sfr!it de linie din CARACTER.IN
sfr!it ct timp
sfr!it algoritm

2.6.7. Vrste
Obiectivele propuse n aceast# problem# sunt:
! aflarea valorii minime !i maxime dintre valorile p#strate ntr-un fi!ier de tip text;
! c#utarea acestor valori n fi!ier !i raportarea pozi"iilor pe care valoarea minim#,
respectiv maxim# apare n fi!ier;
! parcurgerea fi!ierului text de mai multe ori, ceea ce presupune nchiderea !i deschi-
derea lui n mod repetat.

Aflarea celei mai tinere persoane se reduce la aflarea maximului din fi!ier !i se
realizeaz# n algoritmul urm#tor:
62 2. Fi!iere de tip text !i prelucr"ri simple

Algoritm Maxim:
cite!te n
max $ n
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
cite!te n
dac" max < n atunci
max $ n
sfr!it dac"
sfr!it ct timp
scrie max
sfr!it algoritm

Dup# ce s-a scris pe prima linie a fi!ierului de ie!ire valoarea maximului, urmeaz#
s# se reg#seasc# aceast# valoare n fi!ierul de intrare. Reg#sirea se realizeaz# prin re-
deschiderea fi!ierului de intrare pentru parcurgere !i c#utarea valorii maxime. La fie-
care apari"ie a maximului n fi!ierul de intrare se scrie valoarea num#rului de ordine a
liniei pe care se afl# o valoare egal# cu valoarea maxim# !i un spa"iu separator pentru
cazul n care se va mai scrie un num#r de ordine n fi!ier. Dup# epuizarea elementelor
din fi!ierul de intrare se scrie marcajul de sfr!it de linie n fi!ierul de ie!ire pentru ca
scrierea valorii minime s# se realizeze pe rnd nou.

Algoritmul este:

Algoritm ScrieMaxim:
i $ 1 { num"rul de ordine al liniei n fi!ierul de intrare }
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
cite!te n
dac" n = max atunci
scrie i,' '
sfr!it dac"
i $ i + 1
sfr!it ct timp
sfr!it algoritm

Algoritmul pentru minim este analog cu cel descris mai sus, dar se poate proiecta
un algoritm care determin# valoarea minim# !i maxim# cu o singur# parcurgere a fi!i-
erului de intrare. Dac# vom lucra astfel, structura repetitiv# ct timp va con"ine pre-
lucr#rile aferente minimului !i maximului, urmnd ca reg#sirea lor s# se realizeze se-
parat, deoarece numerele de ordine corespunz#toare maximului, respectiv minimului
trebuie s# le afi!#m grupate.


2. Fi!iere de tip text !i prelucr"ri simple 63

2.6.8. Caractere
Etapele rezolv#rii acestei probleme sunt:
! citirea integral# a fi!ierului de intrare !i scrierea ultimului caracter citit n fi!ierul
de ie!ire;
! deschiderea fi!ierului de intrare pentru o a doua parcurgere;
! scrierea n fi!ierul de ie!ire a tuturor caracterelor din fi!ierul de intrare care sunt
mai mari dect ultimul caracter citit (p#strat n variabila c).

Pentru g#sirea caracterelor mai mari dect c n fi!ierul de intrare, acesta se deschide
pentru parcurgere. Se citesc pe rnd cte un caracter b de pe fiecare linie !i se compar#
cu c. Dac# b este mai mare dect c, atunci acesta se scrie pe a doua linie n fi!ierul de
ie!ire, urmat de caracterul spa"iu.

Algoritm Caracter:
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
cite!te c
sfr!it ct timp
scrie c { n c avem ultimul caracter citit din fi!ierul de intrare }
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
cite!te b
dac" c < b atunci
scrie b,' ' { n fi!ierul de ie!ire scriem caracterele mai mari dect c }
sfr!it dac"
sfr!it ct timp
sfr!it algoritm

2.6.9. Pare, impare
Problema const# n tratarea separat# a fiec#rei linii din fi!ierul de intrare n ideea g#si-
rii valorii minime pare !i a valorii maxime impare.

Algoritm MinMax:
ct timp nu urmeaz" marcajul de sfr!it de fi!ier execut":
min $ Maxint { suntem siguri c" vom g"si unul mai mic }
max $ 0 { suntem siguri c" vom g"si unul mai mare }
ct timp nu urmeaz" marcajul de sfr!it de linie execut":
cite!te n
dac" n este par atunci
dac" n < min atunci
min $ n
sfr!it dac"
altfel
64 2. Fi!iere de tip text !i prelucr"ri simple

dac" n > max atunci
max $ n
sfr!it dac"
sfr!it dac"
scrie min,' ',max
sfr!it ct timp
sfr!it ct timp
sfr!it algoritm

S-ar putea să vă placă și