Sunteți pe pagina 1din 6

UNIVERSITATEA BABE-BOLYAI CLUJ-NAPOCA

FACULTATEA DE MATEMATIC I INFORMATIC


Indicaii metodice privind abordarea subiectelor de Informatic (n exemplificarea de mai jos
ne vom referi la rezolvarea Subiectului III din modelul propus pentru proba de Informatic)
I. Observaie importan
Acest material nu vrea s sugereze candidailor c redactarea rezolvrii
problemei trebuie s respecte ad-litteram etapele i modul de lucru descrise mai jos.
Textul de fa descrie modalitatea de rezolvare a problemei de programare folosind
metoda detalierii n pai succesivi, avnd n primul rnd un caracter didactic,
explicativ. Prin citirea lui, candidaii pot nelege mai bine att cerina din enun
privind subprogramele folosite, ct i modul n care este gndit baremul de rezolvare.
II. Indicaii metodice i schi de rezolvare
Pentru o rezolvare bine apreciat sunt importante urmtoarele:
folosirea subalgoritmilor/subprogramelor la soluia unei probleme de
programare
explicarea semnificaiei parametrilor subprogramelor i a tipului lor (date:
parametri de intrare, rezultate: parametri de ieire)
explicarea prin comentarii a deciziilor importante i a semnificaiei variabilelor
locale
respectarea cerinelor problemei.
Prin enumerarea subprogramelor cerute n enunul problemei se dorete uurarea
muncii candidailor. Dac n soluia realizat de un candidat sunt subprograme cu alt
implementare dect cea sugerat (cum e cazul funciei palindrom n exemplul de mai
jos), ns modul de rezolvare este corect i bine explicat, ea va fi notat corespunztor.
n programare sunt rare situaiile n care o problem are o singur soluie.
n cele ce urmeaz vom descrie, folosind limbajul Pseudocod, o modalitate de proiectare a
algoritmului de rezolvare a problemei propuse, care explic detaliat att cerinele problemei
(folosirea de subalgoritmi), ct i baremul de rezolvare.
Lsm n seama cititorului implementarea algoritmului si a subalgoritmilor ntr-un limbaj
de programare (Pascal, C++, etc).
Algoritmul de rezolvare va fi obinut prin detalierea pas cu pas a enunului problemei, proces
denumit i proiectare descendent sau rafinare/detaliere n pai succesivi. Primul algoritm de
descris corespunde problemei de rezolvat. Pe parcursul proiectrii sale se identific ali
subalgoritmi.
Pentru fiecare algoritm/subalgoritm identificat, vor exista cel puin dou versiuni: versiunea iniial
(numit specificare), coninnd propoziii Pseudocod nestandard (precedate prin caracterul @ i
exprimate n limbaj natural), care precizeaz numele i parametrii subalgoritmului i versiunea
final, coninnd numai propoziii Pseudocod standard. De regul, fiecare propoziie nestandard
detaliat devine comentariu. Comentariile sunt puse n acolade.
Detalierea n pai succesivi produce versiuni din ce n ce mai detaliate i mai precise ale
algoritmilor/subalgoritmilor. Proiectarea unui algoritm/subalgoritm este complet cnd descrierea
sa conine numai propoziii Pseudocod standard. Soluia problemei este complet cnd toi
algoritmii/subalgoritmii identificai sunt proiectai complet.
Algoritmul de rezolvare a problemei Versiunea 1:
Algoritmul SUBIECTIII este
@ Citete irul X
@ Construiete irul Y
@ Tiprete irul Y
SfAlgoritm
Fiecare dintre cele trei propoziii nestandard de mai sus conduce natural cte un subalgoritm, cu
numele sugestive: citire, construire i tiprire.
Subalgoritmul citire (X, n) este
{Rezultate: irul
n
X X X ,...., ,
2 1
i numrul natural n (lungimea irului X)}
{Descriere: Se citete un ir X de numere naturale pozitive, citirea terminndu-se la introducerea
valorii 0}
@ Se citesc repetat numere pn la citirea valorii 0 i se adaug n irul X
SfSubalgoritm
Subalgoritmul construire (X, n, Y, k) este
{Date: irul
n
X X X ,...., ,
2 1
i numrul natural n (lungimea irului X)}
{Rezultate: irul
k
Y Y Y ,...., ,
2 1
coninnd n ordine descresctoare numerele palindroame din X i
numrul natural k (lungimea irului Y)}
{Descriere: Se construiete (direct n ordine descresctoare) irul
k
Y Y Y ,...., ,
2 1
}
@ Examineaz elementele din irul X i pune n irul Y cele care sunt palindroame,
@ n aa fel nct s se pstreze ordinea descresctoare a elementelor din Y
SfSubalgoritm
Subalgoritmul tiprire (X, n) este
{Date: irul
n
X X X ,...., ,
2 1
i numrul natural n (lungimea irului X)}
{Descriere: Se tipresc elementele irului X}
@ Se parcurge irul X i se tiprete fiecare element
SfSubalgoritm
n acest moment, fiecare dintre cei trei subalgoritmi este specificat complet, ceea ce permite
obinerea versiunii finale a algoritmului, prin rescrierea Versiunii 1 (nlocuirea propoziiilor
nestandard cu apelurile corespunztoare de subalgoritmi):
Algoritmul de rezolvare a problemei Versiunea 2
Algoritmul SUBIECTIII este
citire (X, n)
construire (X, n, Y, k)
tiprire (Y, k)
SfAlgoritm
Urmeaz ca n continuare s fie detaliai subalgoritmii citire, construire i tiprire.
Subalgoritmii citire i tiprire sunt simpli:
Subalgoritmul citire (X, n) este:
{Se citesc repetat numere pn la citirea valorii 0 i se adaug n irul X. Deoarece se
citete cel puin o valoare, se folosete structura repetitiv repet}
n0 {Iniial irul X nu are nici un element.}
repet
nn+1
citete X[n]
pncnd X[n]=0
nn-1 {Ultima valoare citit, numrul 0, nu este element al irului, de aceea se
decrementeaz valoarea lui n}
SfSubalgoritm
Subalgoritmul tiprire (X, n) este:
{Se verific dac irul X are cel puin un element. Dac X are 0 elemente, se va afia un
mesaj corespunztor}
daca n=0 atunci
tiprete Sirul este vid
altfel
{Se parcurge irul X i se tiprete fiecare element}
pentru i1, n executa
tiprete X[i]
sfpentru
sfdaca
SfSubalgoritm
Subalgoritmul construire este unul mai complex, necesitnd mai muli pai de detaliere, descrii n
continuare. Primul pas de detaliere pleac de la propoziia nestandard din specificarea
subalgoritmului:
Subalgoritmul construire (X, n, Y, k) este
{iniial irul Y nu are elemente}
k0
{parcurge pe rnd elementele din irul X}
pentru i1,n execut
@ dac elementul X[i] este palindrom, adaug-l la Y astfel nct Y s rmn
@ ordonat descresctor
sfpentru
SfSubalgoritm
Aceast versiune conine tot o singur propoziie nestandard. Examinnd-o cu atenie, se identific
dou subprobleme de rezolvat / doi subalgoritmi de descris:
verificarea unui numr dac este sau nu palindrom;
inserarea unui numr ntr-un ir ordonat descresctor astfel nct s se pstreze ordonarea
irului.
Primul subalgoritm returneaz un rezultat boolean, fiind exprimat natural printr-o funcie.
Specificrile subalgoritmilor identificai sunt:
Funcia palindrom (a) este
{Date: numrul natural a}
{Rezultat: adevrat dac a este palindrom, fals n caz contrar}
{Descriere: Se verific dac numrul a este sau un palindrom}
@ Verific dac irul cifrelor numrului este palindrom (este acelai parcurs de la stnga la
@ dreapta sau de la dreapta la stnga)
SfFuncie
Subalgoritmul inserare (a, Y, k) este
{Date: numrul natural a, irul
k
Y Y Y ,...., ,
2 1
ordonat descresctor i numrul natural k (lungimea
irului Y)}
{Rezultate: irul
k
Y Y Y ,...., ,
2 1
ordonat descresctor n care a fost inserat a i numrul natural k
(noua lungime a irului Y)}
{Descriere: Se insereaz valoarea a n irul Y astfel nct s se pstreze ordonarea irului}
@ Caut poziia pe care ar trebui inserat a n Y i apoi insereaz-l n Y pe poziia
respectiv
SfSubalgoritm
Cu specificrile de mai sus, versiunea final a subalgoritmului construire devine:
Subalgoritmul construire (X, n, Y, k) este
k0
pentru i1,n execut
{verific dac elementul X[i] este palindrom}
dac palindrom(X[i]) atunci
{insereaz X[i] n irul ordonat Y }
inserare(X[i], Y, k)
sfdac
sfpentru
SfSubalgoritm
Rmn a fi detaliate funcia palindrom i subalgoritmul inserare.
Pentru a verifica dac un numr este palindrom, trebuie mai nti s se determine irul cifrelor
numrului, iar apoi s se testeze dac elementele egal deprtate de capetele irului sunt egale:
Funcia palindrom (a) este
@Construiete irul cifrelor numrului a, numit cifre, avnd lungimea t
@ Verific dac irul cifre este sau nu palindrom, testnd elementele egal deprtate de
@ capetele irului
SfFuncie
Din prima propoziie nestandard se identific un nou subalgoritm, determinCifre(a, cifre, t) pentru
determinarea cifrelor unui numr. A doua propoziie nestandard se poate transpune direct n
propoziii standard. Se obine astfel varianta final a funciei palindrom:
Funcia palindrom (a) este
{Construiete irul cifrelor numrului a, numit cifre, avnd lungimea t}
determinaCifre(a,cifre, t)
estePalindrom adevrat {Se presupune c numrul a este palindrom}
i1 { Se vor testa cifrele de pe pozitiile i i t-i+1 }
{ Deoarece se testeaz elemente egal deprtate de capete, irul cifre se va parcurge
numai pn la jumtate }
cttimp (it div 2) i (estePalindrom=adevrat) execut
dac cifre[i] cifre[t-i+1] atunci {exist n ir dou elemente/cifre egal deprtate de
capete care sunt diferite }
estePalindromfals
altfel
ii+1
sfdac
sfpentru
palindromestePalindrom
SfFuncie
Subalgoritmul pentru determinarea cifrelor unui numr este descris n continuare.
Subalgoritmul determinaCifre (a, cifre, t) este
{Date: a, un numr natural nenul}
{Rezultate: irul
t
cifre cifre cifre ,...., ,
2 1
i numrul natural t (lungimea irului cifre)}
{Descriere: Determin cifrele numrului natural a i le depune n irul cifre}
t0
cttimp a>0 execut
tt+1
cifre[t]a mod 10 {restul mpririi numrului a la 10}
aa div 10 {ctul mpririi numrului a la 10}
sfcttimp
SfSubalgoritm
A mai rmas de detaliat subalgoritmul inserare. Primul pas de detaliere pleac de la propoziia
nestandard din specificarea acestuia. Este tratat separat cazul cnd a este mai mic sau egal dect
orice element din Y (sau cnd Y nu conine nici un element).
Subalgoritmul inserare (a, Y, k) este
{verific dac a trebuie adugat pe ultima poziie n Y }
dac (k=0) sau (aY[k]) atunci
{se adaug la sfrit}
1 k k
a k Y ] [
altfel
{se caut poziia unde ar trebui inserat a n Y astfel nct s se pstreze ordonarea}
1 i {se ncepe parcurgerea irului Y}
{se caut prima poziie i astfel nct ] [i Y a }
cttimp ( ] [i Y a ) execut
1 i i
sfcttimp
{ i este poziia pe care ar trebui inserat a n irul Y pentru a pstra ordinea
descresctoare a elementelor}
@ deplaseaz elementele din Y de pe poziiile i,i+1,...,k cu o poziie spre dreapta i
apoi adaug pe a pe poziia i
sfdac
SfSubalgoritm
Versiunea final a subalgoritmului inserare se obine prin detalierea ultimei propoziii nestandard,
folosind structura repetitiv pentru :
Subalgoritmul inserare (a, Y, k) este
{verific dac a trebuie adugat pe ultima poziie n Y }
dac (k=0) sau (aY[k]) atunci
{se adaug la sfrit}
1 k k
a k Y ] [
altfel
{se caut poziia unde ar trebui inserat a n Y astfel nct s se pstreze ordonarea}
1 i {se ncepe iterarea irului Y}
{se caut prima poziie i astfel nct ] [i Y a }
Cttimp ( [ ] a Y i ) execut
1 i i
Sfcttimp
{ i este poziia pe care ar trebui inserat a n irul Y pentru a pstra ordinea
descresctoare a elementelor}
{deplaseaz elementele din Y de pe poziiile i,i+1,...,k cu o poziie spre dreapta }
pentru j k, i, -1 execut
] [ ] 1 [ j Y j Y
sfpentru
a i Y ] [ {adaug numrul a pe poziia i n irul Y}
1 k k {se incrementeaz numrul de elemente din irului Y}
sfdac
SfSubalgoritm
Observaie
Menionm faptul c funcia palindrom admite o implementare alternativ fa de cea descris
anterior, n care nu este necesar memorarea cifrelor numrului.

Funcia palindrom (a) este
{Construiete numrul invers format din cifrele numrului a luate n ordine invers i apoi
verific dac acest numr este egal cu a }
numra
invers0
{Ia cifrele numrului a ncepnd cu cifra unitilor i construiete numrul invers}
cttimp (numr>0) execut
inversinvers*10 + numr mod 10 {se actualizeaz numrul invers }
numrnumr div 10 {ctul mpririi numrului numr la 10}
sfcttimp
{Dac numrul este egal cu inversul su, atunci este palindrom}
dac a=invers atunci
palindromadevrat
altfel
palindromfals
sfdac
SfFuncie

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