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 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

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 i i+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 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

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