Documente Academic
Documente Profesional
Documente Cultură
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.
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 X 1 , X 2 ,...., X n 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 X 1 , X 2 ,...., X n i numrul natural n (lungimea irului X)} {Rezultate: irul Y1 , Y2 ,...., Yk coninnd n ordine descresctoare numerele palindroame din X i numrul natural k (lungimea irului Y)} {Descriere: Se construiete (direct n ordine descresctoare) irul Y1 , Y2 ,...., Yk } @ 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 X 1 , X 2 ,...., X n 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.}
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
repet
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 Y1 , Y2 ,...., Yk ordonat descresctor i numrul natural k (lungimea irului Y)} {Rezultate: irul Y1 , Y2 ,...., Yk 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
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 i i+1 sfdac sfpentru palindromestePalindrom SfFuncie
Subalgoritmul determinaCifre (a, cifre, t) este {Date: a, un numr natural nenul} {Rezultate: irul cifre1 , cifre2 ,...., cifret 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}
k k 1 Y [k ] a
altfel {se caut poziia unde ar trebui inserat a n Y astfel nct s se pstreze ordonarea} i 1 {se ncepe parcurgerea irului Y} {se caut prima poziie i astfel nct a Y [i ] } cttimp ( a Y [i ] ) execut
i i 1
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}
k k 1 Y [k ] a
altfel {se caut poziia unde ar trebui inserat a n Y astfel nct s se pstreze ordonarea} i 1 {se ncepe iterarea irului Y} {se caut prima poziie i astfel nct a Y [i ] } Cttimp ( a Y [i ] ) execut
i i 1
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
Y [ j 1] Y [ j ]
sfpentru
Y [i ] a k k 1
{adaug numrul a pe poziia i n irul Y} {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