Documente Academic
Documente Profesional
Documente Cultură
SPORTULUI
COLEGIUL TEHNIC MTSARI
ATESTAT
PROFESIONAL
Prof.Coordonator:
Sceanu Ion
Elev:
Lupu Lcrmioara-Marcela
Profil:
Matematic-Informatic
Colegiul Tehnic Mtsari
2015
1
MINISTERUL EDUCAIEI,CERCETRII,TINERETULUI I
SPORTULUI
COLEGIUL TEHNIC MTSARI
SUBPROGRAME
Prof.Coordonator:
Sceanu Ion
Elev:
Lupu Lcrmioara-Marcela
Profil:
Matematic-Informatic
Colegiul Tehnic Mtsari
2015
2
Cuprins
Subprograme4
Modul.7
Declararea i apelul unui subprogram.8
Funcii i proceduri pascal.11
Dezvoltarea programelor...14
Dezvoltarea ascendent
Dezvoltarea descendent (top down)
Implementri sugerate15
Probleme propuse...16
Soluiile problemelor propuse18
Bibleografie...27
Subprograme
Deseori n practic programrii se ntlnesc situaii de ndeplinire repetat
a unor secvene de program aplicate pe seturi diferite de date. Pentru a evita
aceste repetri i n scopul organizrii mai compacte a programului, n Pascal
exist posibilitatea de a separa aceste secvene de program ntr-un bloc
autonom n cadrul aceluiai program ,sub un anumit nume. Aa set de
instruciuni, ce realizeaz un anumit algoritm, se numete subprogram.
Subprogramele pot fi:
-functie -returneaz ntotdeauna o singur valoare;
-proceduri -pot returna zero, una sau mai multe valori;
Funciile i procedurile pot fi standard(existente deja n limbajul pascal) i
definite de utilizator.
Funcii standard: int, trunc, sqr, sqrt, abs, chr, ord, pred, succ;
Proceduri standard: read, readln, write, writeln, val, str, inc, dec;
Program sub_1
var ma,a,b:real;
begin;
write(a,b:);
readln(a,b);
ma:=(a+b)/2
writeln(ma:,ma:8:2);
readln;
end.
Program sub_1;
var ma,a,b:real;
procedure calcul media
begin
ma:=(a+b)/2
writeln(ma:,ma:8:2);
end;
begin;
write(a,b:);
readln(a,b);
calcul_media
readln;
end.
Deci, o procedur poate s primeasc date din partea modulului apelant,
date numite parametri. n cazul procedurii calcul_media, din exemplul
nostru nu are parametri. Ea folosete valorile a i b citite anterior n
programul principal.
Modul
Noiunea de subprogram a aprut din necesitatea de a diminua complexitatea
unui program prin descompunerea acestuia n subprograme. Aplicarea acestui
concept reflect la un anumit nivel principiul programrii modulare. Conform
acestui principiu al ingineriei programrii, algoritmii se proiecteaz astfel nct
acetia s foloseasc module, unde prin modul nelegem o unitate structural de
sine stttoare (program, subprogram sau unitate de program). Fiecare modul
trebuie s aib un rol bine determinat i s fie conceput astfel nct s poat fi
folosit la nevoie i n cadrul unui alt program, fr a fi modificat. Orice modul
poate fi la rndul su construit din alte module.
Printre avantajele programrii modulare de care beneficiaz i conceptul de
subprogram amintim:
simplitatea i claritatea programului;
modulele sunt mai uor de descris, de testat, de corectat i eventual de
modificat; optimizarea unui program se poate realiza adesea doar prin nlocuirea
unui modul ineficient cu altul mai performant;
se evit rescrierea unui algoritm de cte ori este nevoie de acesta;
un modul o dat pus la punct va funciona la fel de bine i ntr-un alt
program care are nevoie de el;
se creeaz premisele realizrii unor aplicaii mari prin munca n echip a mai
multor programatori.
Subliniem c este important s se urmreasc creterea independenei
subprogramelor pentru a mri ansele reutilizrii lor n ct mai multe programe.
Aplicarea n practic a principiului modularitii implic stabilirea unor
detalii privind:
7
Exemplu
Fie trei variabile a, b i c declarate n programul principal. Aceste variabile
sunt iniializate cu 0 i se apeleaz subprogramul Unu. Dup revenirea din
subprogram se afieaz valorile a, b i c.
Subprogramul Unu are doi parametri formali: x este parametru transmis prin
valoare, iar y este parametru de tip referin. n subprogram se declar variabila
local z. Acest subprogram atribuie celor trei variabile x, y i z valoarea 1.
n urmtoarea figur programul principal este simbolizat prin segmentul vertical de la 1 la 6,
punctul 2 corespunznd apelului de subprogram, iar punctul 5 primei instruciuni de dup apel. Subprogramul este reprezentat de segmentul vertical avnd
la capete punctele 3 (prima instruciune a subprogramului) i 4 (ultima
instruciune). Liniile cu sgei arat ordinea de execuie a instruciunilor din cele
dou uniti de program.
Programul principal:
Subprogram Unu(lista parametrilor formali:
variabile globale: a, b, c
x transmis prin valoare, y prin referin)
*
(T)
(T), variabil
.
...................................................
f
r
x
1
local: z
z1 b 0T
a0
c01 2
u
Apel
Unu
a,b
11
12
1-2 ...
(1 2 ...n k)[l-2 ... (n k)]
{ antetul funciei }
{ variabile locale }
begin
p:=l;
1
2
13
{ iniializarea factorialului }
{ calcularea factorialului }
{ atribuire identificatorului funciei
ReadLn(n,k);
WriteLn(fact(n)/(fact(k)*fact(n-k)))
End.
Exemplul 2
Se consider urmtorul program. Ce afieaz acesta?
Program Exemplu2; var
i:Integer;
function Suma(n:Integer):Integer; var
S:Integer;
begin
S:=0;
for i:=1 to 5 do
S:=S+n;
suma:=S
end;
Begin
for i:=1 to 5 do begin
Write(i,' ');
Write(suma(i),' ');
WriteLn(i)
end
End.
S urmrim variaia variabilelor:
programul principal ncepe cu ciclul for, prima valoare a variabilei i este
1;
se afieaz 1;
se apeleaz subprogramul cu parametrul actual i, a crui valoare se
copiaz n n, deoarece este transmis prin valoare;
n subprogram se calculeaz S, care va avea valoarea 0 + 1 + 1 + 1 + 1 +
1 = 5;
se atribuie valoarea 5 identificatorului de funcie;
se afieaz valoarea 5;
Urmeaz o alt afiare a variabilei i i (surpriz!) se afieaz 5 (ultima valoare a
lui i conform ciclului for din subprogram), ceea ce conduce i la terminarea
instruciunii for din programul principal.
14
Dezvoltarea programelor
Dac, n procesul proiectrii algoritmilor, o problem se descompune n
subprobleme i acestea se descompun la rndul lor n alte subprobleme pn
cnd se obin subprobleme care nu necesit continuarea procesului de divizare
spunem c avem un program dezvoltat descendent (top down). Aceast tehnic
corespunde modului n care uzual se proiecteaz algoritmii, folosind
subalgoritmi. Tehnica de proiectare n care se pornete de la unele programe
iniiale, acestea fiind folosite pentru a construi module din ce n ce mai
sofisticate care, asamblate s rezolve problema, se numete bottom up.
Subprogram C
Instruciunea compus a
programului principal
15
Implementri sugerate
2.
3.
Probleme propuse
Cifre comune
S se afieze cifrele comune a dou numere naturale date.
Date de intrare
Cele dou numere se citesc de pe primele dou linii ale fiierului comun.in.
Date de ieire
Cifrele comune ale celor dou numere se vor scrie n fiierul comun.out,
desprite prin cte un spaiu. n cazul n care nu exist nici o cifr comun, n
fiierul de ieire se va scrie 'Nu exista cifre comune.'.
Restrici
1
<
COMUN.OU
T
23
COMUN.OUT
12345
9877788
17
S se genereze toate perechile de numere prime formate din trei cifre care au
proprietatea de a fi, unul inversul celuilalt. Aici prin invers nelegem numrul
format din cifrele numrului dat, n ordine invers.
Date de ieire
n fiierul de ieire prime.out se vor scrie perechile de numere, cte una pe
fiecare linie, desprite prin cte un spaiu.
Exemplu
PRIME.OUT
101 1 107 701 113 311 131 131102
SIR.OUT
11 133 7 99
culese din text exact n ordinea n care se afl n cuvnt (nu neaprat pe poziii
succesive).
Date de intrare
Pe prima linie a fiierului de intrare cuv.in se afl textul dat.
Date de ieire
Cuvntul determinat, care are lungime maxim se va scrie n fiierul cuv.out.
Restricii i precizri
textul are cel mult 255 de caractere;
n text exist cuvinte formate din litere mici ale alfabetului englez i
spaii.
Exemplu
cuv.in
iarba si iasca
CUV.OUT
abis
Algoritm Prime:
{ algoritmul corespunztor programului principal }
pentru numr=101,997 execut:
dac Prim(numr) i Prim(invers(numr)) atunci scrie
numr,invers
sfrit dac sfrit pentru
sfrit algoritm
n urma executrii programului care implementeaz acest algoritm observm
c fiecare pereche este afiat de dou ori. Dac dorim s evitm afiarea dubl,
este necesar modificarea algoritmului.
21
Dac punem condiia ca prima cifr a primului numr s fie mai mic sau
egal cu ultima cifr a primului numr, vom evita afirile duble. Al doilea
numr se construiete ntotdeauna din primul i deci nu este necesar s punem
condiii asupra lui. Numerele din perechi astfel construite vor fi generate
cresctor. Instruciunea alternativ din structura de tip pentru s-ar putea scrie
astfel: dac [numr/100] < rest[numr/10] atunci...
n acest algoritm, instruciunea pentru se va relua de 997 - 101 + 1 = 897 ori.
ntr-o alt abordare a acestei probleme generm primul numr din cifrele a, b
i c i al doilea din aceleai cifre, dar n ordine invers, innd cont totodat i
de condiia ca prima cifr s fie mai mare sau egal cu a treia. Aceast variant
are i avantajul de a evita generarea dublurilor fr a folosi o condiie
suplimentar. De asemenea, nu vom lua n considerare ca posibil numr avnd
proprietatea solicitat dect numerele impare. Un numr impar are ultima cifr
impar, deci n ciclul for care genereaz a treia cifr se vor construi numere
doar cu cele 5 cifre impare (1, 3, 5, 7, 9).
Astfel, numrul executrilor corpului ciclului este 10 9 5 = 450 (care este
mai mic dect numrul executrilor n cazul primei variante: 897). n plus,
aceast variant nu necesit apelul subalgoritmului invers, deoarece inversul
numrului poate fi construit printr-o simpl atribuire. Subalgoritmul de
verificare a primalitii se va executa doar de 332 de ori, deoarece dac despre
numr se constat c nu este prim, numrul invers nu se mai verific.
Algoritm Prime i inversate prime 2:
pentru a=1,9 execut:
{ prima cifr din numr nu poate fi 0 }
pentru b=0 la 9 execut:
{ ultima cifr trebuie s fie cel puin egal
cu prima cifr }
pentru c=a la 9 execut:
dac c este numr impar atunci { limitm generarea la numere impare }
numr ^ a*100 + b*10 + c invers ^ c*100 + b*10 + a dac Prim(numr) i
Prim(invers) atunci scrie numr,invers sfrit dac sfrit dac sfrit pentru
sfrit pentru sfrit pentru sfrit algoritm.
aciunea principal este de a elimina unul sau dou elemente dintr-un ir, pe
baza unei condiii date.
Subalgoritmul Elimin va elimina elementul avnd indicele poziie din irul a
i va returna irul modificat, precum i dimensiunea actualizat a acestuia.
Subalgoritm Elimin(a,n,poziie):
{ subprogram tip procedur }
pentru i=poziie,n-1 execut:
{ se deplaseaz elementele tabloului }
a[i] ^ a[i + 1]
{ cu o poziie la stnga, ncepnd cu poziie + 1 }
sfrit pentru
{ numrul de elemente scade }
n^n1
sfrit
subalgoritm
Proprietile numerelor care trebuie eliminate:
numr perfect: este egal cu suma divizorilor mai mici dect el nsui;
numere prietene: perechi de numere n care un numr este egal cu suma
divizorilor celuilalt (mai mici dect acesta) i invers.
Se observ c n ambele situaii este nevoie de suma divizorilor proprii (plus
1) ai numrului. Deci, va fi util s scriem un subprogram care calculeaz aceast
sum.
Subalgoritm Suma divizori(numr):
{ subprogram tip funcie }
s^1
{ n aceast sum se adaug i 1 }
pentru d=2,[numr/2] execut: dac
rest[numr/d] = 0 atunci s ^ s + d sfrit dac
sfrit pentru Suma divizori ^ d sfrit
subalgoritm
Cele dou subprograme care verific dac un numr este perfect, respectiv
dac dou numere date sunt prietene vor returna o valoare de adevr (adevrat
sau fals).
Subalgoritm Perfect(numr):
{ subprogram tip funcie }
dac Suma divizori(numr) = numr atunci Perfect ^
adevrat
altfel
Perfect ^ fals
sfrit dac sfrit
subalgoritm
Subalgoritm Prietene(numr1,numr2):
{ subprogram tip funcie }
dac (Suma divizori(numr1) = numr2) i
(Suma divizori(numr2) = numri) atunci Prietene ^ adevrat altfel Prietene ^
fals sfrit dac sfrit subalgoritm.
23
textul a p a
c u r g e
Indice i 2 3 4 5 6 7 8 9 10
L
urm
l i
11 1
2
n
1
31
0
n cele ce urmeaz vom cuta s determinm acel cel mai lung cuvnt n faa
cruia este permis s alipim a i-a liter din textul dat. Evident, aceasta, dac este
permis, nu poate fi la acest pas dect ultima liter. n concluzie L12 va fi egal cu
2 (cel mai lung cuvnt care ncepe cu a 12-a liter din text are lungimea 2), iar
urm12 va fi 13 (dup a 12-a liter urmeaz a 13-a):
24
textul a p a
c u r g e
Indice 1 2 3 4 5 6 7 8 9 10
L
urm
l i
11 1
2
1
3
n
1
1
0
textul a p a
c u r g
Indice i 2 3 4 5 6 7 8
L
urm
e
9
3
1
1
1
0
0
l
11
2
1
3
i
1
2
1
3
n
13
1
0
Litera g nu poate fi pus n faa lui e, n schimb poate fi pus n faa lui l, i i
n. Procedm cu litera g la fel cum am procedat cu e. Literele r i u nu pot fi puse
n faa nici uneia dintre literele luate n considerare pn acum, deci valorile
corespunztoare lor sunt 1 n irul L i 0 n irul urm. Litera c poate fi pus n
faa tuturor caracterelor; alegem acea posibilitate care d natere la un cuvnt
25
textul a P a
c u r
indice 1 2 3 4 5 6 7
L
5 2 5 0 4 1 1
g
8
3
e
9
3
1
0
0
urm
1
1
1
1
0 8 0 0
l
11
2
1
3
i
1
2
2
1
3
n
13
1
0
Dup ce am construit aceste dou iruri, lungimea celui mai lung cuvnt este
egal cu valoarea elementului maxim din irul L. Deoarece noi trebuie s afim
nu lungimea, ci cuvntul, vom proceda n felul urmtor. Afim acel caracter
(din text) care are indicele egal cu indicele elementului maxim din irul L (cu
aceast liter ncepe cel mai lung cuvnt). Elementul irului urm, avnd acest
indice conine indicele literei urmtoare, care se afieaz. Urmrind astfel
coninutul irului urm afim literele celui mai lung cuvnt pn la sfritul
acestuia (valoarea corespunztoare ultimei litere n irul urm este 0).
textul a P a
c u r
Indice
3 4 5
7
1 2
6
L
5 2 5 0 4 1 1
urm
5 6 5 0 8 0 0
g
8
3
1
1
e
9
3
1
1
l
1
0
0
0
n
13
11 12
2 2 1
1 13 0
3
27
BIBLEOGRAFIE
https://www.scribd.com/search?query=grafuri+neorientate
http://www.referat.ro/referate/download/Subprograme_Pascal_2
f86e.html
http://info.mcip.ro/?cap=subprograme
http://www.yandex.com
28