Sunteți pe pagina 1din 17

Rudoi Svetlana, profesoar de informatic, gradul didactic I, Liceul Teoretic M. Eminescu, mun.

Chiinu

Aplicaii ale tipurilor de date tablou (Array) n ciclul liceal


Cadrele didactice se confrunt cu problema instruirii optime a tinerilor, pentru a fi prosperi i productivi n viitor. Actualmente volumul de informaii crete ntr-un ritm fr precedent. Incontestabil, informaiile sunt importante. Pentru a face fa exigenelor cotidiene este necesar s se cunoasc multe lucruri. ns ideea c exist un volum de cunotine care -i va pregti pe elevi pentru viitor se bucur de tot mai puin susinere, pe msur ce societatea se schimb tot mai rapid. Se susine prerea c 100% din ceea ce tim astzi constituie doar 10%15% din ceea ce se va tie peste 15-20 de ani. Informaia de care dispunem este valabil nu mai mult de 10 ani, dup care devine inexact sau depit. Deci ar fi imposibil s credem c priceperile i deprinderile, cunotinele formate i acumulate n coal ar putea fi semnificative comparativ cu absolutul. Informaiile pe care le obin elevii nu vor reprezenta dect o fraciune din tot ceea ce se cunoate ntr-un domeniu i o fraciune i mai mic din ceea ce ar trebui s cunoasc pe parcursul vieii. Cunotinele au valoare, doar cnd sunt utile. Ceea ce le va fi necesar elevilor pentru a se ncadra ntr-o lume mobil este abilitatea de a selecta informaii i de a decide ce este i ce nu este important, va trebui ca ei s neleag corelaia dintre diverse informaii, s poat plasa n context idei i cunotine noi, s descopere sensul noiunilor ntlnite pentru prima oar, s resping informaii relevante sau false. Va fi necesar ca ei s dea sens critic, creativ i productiv acelei pri din universul informaional cu care se vor confrunta. Este important ca elevii s tie a efectua diverse operaii de gndire, care le-ar da posibilitatea de a prelucra cu eficien informaia, transformnd-o n sensuri, care la rndul lor, s poat fi materializate n activitatea practic. Deci procesul de nvare trebuie s fie orientat spre formarea personalitii creatoare i independente, adaptabile la condiiile de schimbare inovatoare accelerat a societii. Studierea informaticii n coal are un rol primordial n dezvoltarea creativitii la elevi, printre alte obiecte de studiu. Practica arat c orice elev dezvoltat normal din punct de vedere intelectual este capabil s nsueasc n mod satisfctor materialul de studiu la informatic i s-l aplice n practic. Dar pe cnd unii asimileaz acest material mai repede i mai uor, cu un efort mai mic, alii cu toat perseverena i atitudinea pozitiv manifestat pentru acest domeniu, obin rezultate mai modeste. Deci ne aflm n faa unor aptitudini diferite, fapt important de care trebuie s in cont profesorul. Gradul de nsuire i aplicare a materialului studiat este diferit de la un coninut la altul. Printre temele mai dificile pentru elevi, dar destul de utile se enumer i Tipuri structurate de date. Tipul de date tablou (Array). care este des utilizat n ciclul liceal la rezolvarea problemelor i fr de care nu ne putem imagina leciile de informatic. Despre necesitatea cunoaterii tipului de date tablou i aplicrii ei eficiente ne convinge studiul culegerilor de probleme la informatic, n care putem gsi probleme cu coninut foarte variat la tema propus spre discuie.

Astfel este necesar ca absolvind ciclul liceal elevii s posede anumite priceperi i deprinderi pentru aplicarea n continuare a tipului de date tablou la rezolvarea diverselor probleme. Avnd experien de lucru n clasele liceale i studiind problema n cauz am constatat c n dependen de contingentul de elevi ai clasei, profesorul poate i trebuie s revin de fiecare dat, cnd este posibil, la rezolvarea diferitor probleme cu aplicarea tipului de date tablou, n scopul pregtirii lor pentru studierea informaticii n continuare. Importana temei const n faptul c ea ofer o gam larg de probleme cu un coninut variat, ceea ce contribuie la dezvoltarea gndirii analitice, a intuiiei i creativitii la elevi, caliti necesare pentru studierea aprofundat n continuare a informaticii n ciclul liceal, ct i pentru studiile universitare. De multe ori se nva mai eficient prin rezolvarea unor probleme rezolvate. Nu este vorba de memorarea rezolvrii (dei i acest lucru este util la o anumit etap de nvare, nu oricine poate rezolva orice, dar oricine poate nva o rezolvare), ci de reluarea rezolvrii pe alt cale. n acest scop profesorul poate propune unor elevi rezolvarea exemplelor mai dificile, urmate ulterior de nite discuii asupra metodelor de rezolvare. S nu uitm de sfatul lui G. Polya Dac vrei s nvai s rezolvai probleme, trebuie s rezolvai probleme. Deci organizarea corect a activitilor pentru studierea temei date va diminua dificultatea nsuirii ei i va face s devin accesibil pentru toi elevii. Noiunea de tip de date tablou se introduce pentru prima dat n clasa X la tema Tipuri de date tablou (Array). n clasa X la tema dat se studiaz tablourile unidimensionale (vectorii) i tablourile bidimensionale (matricile). La leciile teoretice se familiarizeaz elevii cu noiunile respective. E important s artm necesitatea introducerii noiunilor noi prin rezolvarea problemelor, ce necesit utilizarea acestor noiuni. Vom considera urmtoarea problem: E necesar s efectum o analiz a preurilor la diferite articole. Fiecrui articol i se poate pune n coresponden un nume de variabil, valoarea cruia este costul articolului dat. De exemplu: caiete 2.5, stilouri 3.25, creioane -1.15. ns n aa caz, cnd primim o informaie despre un nou articol, vom fi nevoii s introducem n program un nume nou de variabil, ceea ce ar duce la redactarea ntregului program. n locul acestui ir de variabile, noi avem posibilitatea s le ntroducem pe toate ntr-un tablou, le dm un singur nume, iar articolul concret e determinat cu ajutorul indicelui. 2.5 3.25 1.15 Elem(3) Elem(1) Elem(2)

n astfel de situaii e comod de utilizat tablourile. Pentru adresarea la un careva element al tabloului este de ajuns de indicat dup numele tabloului n paranteze indicele lui. Ca indice poate fi nu numai o constant, dar i o variabil, ce ne d posibilitatea s indicm o aciune care se refer la orice element al tabloului. Toate elementele unuia i aceluiai tablou au acelai tip. Tablourile pot avea civa indici.

Tabloul care conine un singur indice ni-l putem nchipui ca o singur linie de valori. Folosirea indicelui al doilea este analog cu introducerea dimensiunii a doua. Fie c e necesar s fixm preul diferitor articole n fiecare sptmn n decursul unui an Pentru aceasta va trebui s folosim 52 de variabile diferite pentru fiecare articol, dar s lucrezi cu un aa numr mare de variabile e destul de incomod. E mai bine de folosit 52 de tablouri unidimensionale, dar i mai convenabil va fi de folosit un tablou bidimensional. Primul indice al acestui tablou ar indica articolul concret, iar al doilea sptmna. Considerm urmtoarea problem: Fie c avem rezultatele campionatului la fotbal. Deci avem N echipe cu rezultatele fiecrui meci. Pentru a gsi din aceast informaie numrul de echipe, ce au mai multe ctiguri dect pierderi, numrul de echipe ce au ncheiat campionatul fr pierderi sau dac exist vre-o echip, care a ctigat mai mult de jumtate din jocuri e destul de greu. Vom fi nevoii s cercetm fiecare echip n parte i apoi s analizm informaia n ntregime. E mult mai comod s ntroducem aceast informaie ntr-un tablou bidimensional i n aa caz reducem problema la careva operaii simple de prelucrare a tablourilor. Pentru nelegerea noiunii de tip de date tablou i formarea depriderilor de aplicare n practic pot fi propuse probleme pentru numrarea elementelor dintr-un tablou cu o anumit proprietate, calcularea sumei, produsului, mediei aritmetice, selectarea componentelor minimale sau maximale, modificarea elementelor tabloului cu analiza algoritmilor respectivi. Pentru o nelegere mai bun a algoritmilor, practic gruparea problemelor conform algoritmului rezolvrii: probleme de numrare; probleme de calcualre a totalurilor; probleme de cutare; probleme de modificare; probleme de sortare. Elevii trebuie s se familiarizeze cu aceti algoritmi i s-i aplice la rezolvarea problemelor. Pentru nceput le propun s rezolve probleme tipice pentru fiecare grup. La urmtoarea etap de studiere, dup ce elevii cunosc aceti algoritmi i i aplic cu succes, le propun diferite probleme, unde snt pui n situaia s aleag singuri algoritmul de rezolvare a problemei din cei deja cunoscui. i doar n final putem trece la rezolvarea problemelor complicate, netipice, la creaie liber. Propun n continuare pentru exemplificare cteva probleme, care prezint interes i pot fi propuse la leciile de informatic la studierea temei respective. 1. Problema Nr. 1. Fie dat tabloul unidimensional Note[1..31] n care au fost nscrise notele elevilor unei clase de la o lucrare de control. Scriei un program care determin numrul de note de 1, 2,...,10. Intrare: valorile notelor pentru fiecare elev se citesc de la tastatur.

Ieire: pe ecran se afieaz numrul de note de 1, 2, ...,10 cte o valoare pe linie n ordine descresctoare a valorilor notelor. Algoritmul: Deoarece notele reprezint numere diferite i numrul lor este cunoscut, vom numra notele fr a efectua vre-o comparare a lor n cadrul instruciunilor de ramificare(If) sau de selectare (Case). Definim un tablou suplimentar cu 10 elemente naturale Num[1..10]; Num[1] reprezint numrul de elevi cu note de 1, Num[2] numrul de elevi cu note de 2, .a.m.d. Iniial tabloul se zerografiaz. Se parcurge tabloul cu notele elevilor de la lucrare i se adun cite o unitate la elementul tabloului Num cu indicele egal cu nota respectiv. Pentru a obine numrul de note n ordine descresctoare a valorilor, se afieaz la ecran elementele tabloului Num parcurgndu-l de la sfrit spre nceput. Programul n limbajul Pascal:
Program Tablou_problema_nr1; Uses CRT; Type Lin=Array[1..31] Of Integer;

Num_note=Array[1..10] Of Byte; Var Note:Lin; Num:Num_note; I:Byte; Begin ClrScr; WriteLn('Introduceti notele de la lucrare'); For I:=1 To 31 Do Begin Write('nota ',I, ' elev este: ');

ReadLn(Note[I]) End; For I:=1 To 10 Do Num[I]:=0; For I:=1 To 31 Do Inc(Num[A[I]]); WriteLn('Numarul de note este :'); For I:=10 DownTo 1 Do WriteLn(I, '-',Num[I]); ReadLn End.

2. Problema Nr. 2. Fie dat tabloul A[1..N], N100, de numere reale. Scriei un program care determin elementul maxim i numrul de elemente maxime printr-o singur parcurgere a tabloului. Intrare: numrul N i elementele tabloului se citesc de la tastatur.

Ieire: pe ecran se afieaz valoarea elementului maxim i numrul de elemente maxime, desprite prin spaiu. Algoritmul:Folosim o variabil Max n care vom pstra valoarea elementului maxim i Num pentru numrul de elemente maxime. Iniializm Max cu valoarea primului element A[1], iar Num cu 1, apoi parcurgem elementele tabloului n cadrul unui ciclu, ncepnd cu al doilea i verificm dac elementul cercetat este egal cu elementul maxim, la variabila contor Num se adun o unitate, dac elementul cercetat mai mare ca maximul curent, atunci elementul respectiv devine noul maxim, iar variabila Num se iniializeaz din nou cu 1. Programul n limbajul Pascal:
Program Tablou_problema_nr2; Uses CRT; Type Lin=Array[1..100] Of Real;

Var A:Lin; Num, N,I:Byte; Max:Real; Begin ClrScr; Write('Numarul de elemente=');ReadLn(N); WriteLn('Introduceti elementele tabloului'); For I:=1 To N Do Begin Write('introduceti elementul ',I, ': '); ReadLn(A[I]) End; Max:=A[1]; Num:=1; For I:=2 To N Do If A[I] >Max Max:=A[I]; Num:=1 End Else If A[I]=Max Then Inc(Num); WriteLn(Max:7:2, ' ',Num ); ReadLn End. Then Begin

3. Problema Nr. 3. Fie dat tabloul A[1..N], N100, de numere reale. Scriei un program care determin indicile primului element pozitiv. Intrare: numrul N i elementele tabloului se citesc de la tastatur.

Ieire: pe ecran se afieaz indicele i valoarea elementului cu indicele dat, desprite prin spaiu, dac aa element exist i mesajul NU EXISTA n caz dac nu exist nici un element pozitiv n tablou. Algoritmul: Pentru a stabili dac n tabloul dat exist mcar un element pozitiv, vom folosi o variabil logic . nainte de a ncepe cutarea, iniializm aceast variabil cu false. Parcurgem ntr-un ciclu poziiile elementelor i=1,...,N. Pentru fiecare valoare a lui i, testm dac elementul A[i] este pozitiv: n caz afirmativ variabila logic primete valoarea true i ntrerupem execuia ciclului. Dac pentru nici o valoare a lui i nu este ndeplinit condiia A[i]>0, atunci valoarea variabilei logice rmne false. La implementarea algoritmului de mai sus vom folosi instruciunea While pentru ca la gsirea primului numr pozitiv ciclul s fie ntrerupt. Programul n limbajul Pascal:
Program Tablou_problema_nr3; Uses CRT; Type Lin=Array[1..100] Of Real;

Var A:Lin; N,I:Byte; V:Boolean; Begin ClrScr; Write('Numarul de elemente=');ReadLn(N); WriteLn('Introduceti elementele tabloului'); For I:=1 To N Do Begin Write('introduceti elementul ' ,I, ': '); ReadLn(A[I]) End; I:=0; V:=False; Repeat Inc(I); If A[I]>0 Then V:=True Until V Or (I=N); If V Then WriteLn(I, ,A[I]:7:2) Else WriteLn( NU EXISTA ); ReadLn End.

4. Problema Nr. 4. S se transforme un numr natural din baza 10 n baza 2, memornd cifrele binare ntrun tablou unidimensional.

Intrare: numrul N se citete de la tastatur. Ieire: pe ecran se afieaz elementele tabloului. Algoritmul:Transformm numrul dat din baza 10 n baza 2,memornd cifrele binare ntr-un tablou unidimensional. Pentru a afia numrul n baza 2, trebuie s tiprim tabloul cifrelor binare n ordine invers: parcurgem ntr-un ciclu poziiile elementelor n ordine invers, i=N,N-1,...,2,1, afind fiecare element. Algoritmul de transformare a unui numr din baza 10 n baza 2 se bazeaz pe mprirea repetat a unui demprit la doi. Iniial dempritul este chir numrul dat, apoi la fiecare pas ctul devine demprit pentru mprirea urmtoare, algoritmul repetndu-se pn cnd dempritul devine 0. Restul fiecrei mpriri este o cifr binar (0 sau 1) iar numrul n baza 2 se obine citind n ordine invers cifrele binare obinute. Programul n limbajul Pascal:
Program Tablou_problema_nr4; Uses CRT; Type Binar=0..1; Lin=Array[1..30] Of Binar; Var A:Lin; K,I:Byte; N:Integer; Begin ClrScr; Write('N='); ReadLn(N); K:=0; Repeat Inc(K); A[K]:=N Mod 2; N:=N Div 2 Until N=0; WriteLn('Numarul in forma binara'); For I:=K DownTo 1 Do Write(A[I]); ReadLn End.

5. Problema Nr. 5. Numrul de zerouri. Fie dat tabloul A[1..N], N100, de numere naturale. Scriei un program care determin numrul de zerouri care apare la sfritul produsului acestor elemente. Intrare: numrul N i elementele tabloului se citesc de la tastatur. Ieire: pe ecran se afieaz numrul de 0 de la sfritul produsului elementelor.

Algoritmul: Ideia algoritmului se bazeaz pe urmtoarea afirmaie: numrul cifrelor 0 aflate la sfritul numrului N este minimul dintre exponenii lui 2 i respectiv 5 din descompunerea lui N n factori primi.
Programul n limbajul Pascal: Program Numarul_de_zerouri; Uses CRT; Type Natural=0..MaxInt; Lin=Array[1..100] Of Natural; Var A:Lin; N,I:Byte; Procedure Citire(Var K:Byte; Var X:Lin); Begin Write(numarul de elemente=);ReadLn(K); For I:=1 To K Do Begin Write(elementul al ,I, este: );ReadLn(X[I]) End End; Function Num(K:Byte; X:Lin):Byte; Var Num_2,Num_5,Num_0:Byte; Begin Num_2:=0; Num_5:=0;Num_0:=0; For I:=1 To K Do If X[I]=0 Then Begin Num_0:=1; Break End Else Begin While X[I] Mod 2=0 Do Begin Inc(Num_2);X[I]:=X[I] Div 2 End; While X[I] Mod 5=0 Do Begin Inc(Num_5);X[I]:=X[I] Div 5 End End; If Num_0=0 Then If Num_2<Num_5 Then Num:=Num_2 Else Num:=Num_5 Else Num:=1 End; Begin

ClrScr; Citire(N,A); WriteLn('Nr zerouri de la sfirsitul produsului=',Num(N,A)); ReadLn End.

6. Problema Nr. 6. Spirala. Se citesc elementele numere ntregi ale unui tablou ptrat de dimensiune N (N20). S se afieze irul format prin parcurgerea tabloului n spiral, din colul din stnga sus ctre dreapta pn n centrul tabloului. Intrare: Fiierul date.dat conine pe prima linie numrul N, iar pe urmtoarele N linii cte N numere desprite prin spaiu. Ieire: Fiierul rez.dat va conine elementele irului, desprite prin spaiu. Algoritmul: Imaginm secvena de 4 cicluri For prin care parcurgem un singur inel al spiralei (cel exterior), apoi generalizm formula pentru toate cele (N+1) Div 2 inele. Programul n limbajul Pascal:
Program Afisare_in_spirala; Uses CRT; Type T=Array[1..20,1..20] Of Integer; Var A:T; K,N,I,J:Integer; F:Text; Procedure Citire; Begin Assign(F,date.dat);Reset(F); ReadLn(F,N); For I:=1 To N Do Begin For J:=1 To N Do Read(F,A[I,J]); ReadLn(F) End; Close(F) End; Procedure Afisare; Begin Assign(F,rez.dat); Rewrite(F); For K:=1 To (N+1) Div 2 Do Begin For I:=K To N-K+1 Do Write(F,A[K,I], ); For J:=K+1 To N-K+1 Do Write(F,A[J,N-K+1], ); For I:=N-K DownTo K Do Write(F,A[N-K+1,I], ); For J:=N-K DownTo K+1 Do Write(F,A[J,K], ) End; Close(F)

End; Begin Citire; Afisare End.

7. Problema Nr.7. Problema despre nuni. Se consider K fete i K biei. Fiecare din ei este ndrgostit de exact doi reprezentani de sex opus, iar dragostea e mprtit. Indicai modurile de cstorie a acestor persoane din dragoste, poligamia i poliandria fiind interzis. Intrare: Fiierul date.dat conine pe prima linie numrul K, iar pe urmtoarele K linii cte 2 numere ce reprezint numrul de ordine a fetelor adorate biatul cu numrul de ordine egal cu numrul liniei respective. Ieire: Fiierul rez.dat va conine modurile de cstorie din dragoste, perechile biat-fat fiind scrise pe rnduri aparte, iar modurile desprite printr-un rnd liber. Algoritmul: Soluia este de tip backtracking. Memorm soluia ntr-o structur de date de tip stiv, implementat cu ajutorul unui tablou unidimensional. Utilizm un tablou bidimensional cu 2 coloane. Fiecare linie a tabloului bidimensional va conine numrul de ordine al fetelor, adorate de biatul cu numrul de ordine egal cu numrul liniei respective. Aceste valori vor fi utilizate la construirea soluiei. Condiia de validare ce trebuie s fie respectat e ca persoana dat s nu fie inclus pn la momentul dat n soluie. Programul n limbajul Pascal:
Program Problema_nunti; Uses CRT; Type Bin=Array[1..30,1..2] Of Byte; Lin=Array[1..30] Of Byte; Var A:Bin; St:Lin; F:Text; K:Byte; Procedure Citire; Var I:Byte; Begin Assign(F, date.dat);Reset(F); ReadLn(F,K); For I:=1 To K Do ReadLn(F,A[I,1],A[I,2]); Close(F) End; Procedure Tipar; Var I:Byte; Begin For I:=1 To K Do WriteLn(F,I, ,St[I]);

WriteLn(F) End; Function Valid(L:Byte):Boolean; Var I:Byte; V:Boolean; Begin I:=1; V:=True; While V And (I<L) Do If St[I]=St[L] Then V:=False Else Inc(I); End; Procedure BkTr(L:Byte); Var Val:1..2; Begin For Val:=1 To 2 Do Begin St[L]:=A[L,Val]; If Valid(L) Then If L=K Then Tipar Else BkTr(L+1) End End; Begin Citire; Assign(F, rez.dat); Rewrite(F); BkTr(1); Close(F) End. Valid:=V

8. Problema Nr. 8. Fotografia. Se d o fotografie specificat printr-o matrice ptratic care conine 0 i 1 (0 pentru punctele albe, 1 pentru punctele negre). Se consider fondul alb, obiectele negre, iar dac dou puncte negre sunt vecine pe linie, coloan sau diagonal, atunci aparin aceluiai obiect. S se numere cte obiecte distincte apar n fotografie. Intrare: Fiierul date.dat conine pe prima linie numrul N dimensiunea matricei, iar pe urmtoarele N linii cte N numere ce reprezint matricea-imagine. Ieire: Rezultatul se va afia la ecran. Algoritmul: Se caut un punct negru nemarcat, se marcheaz cu 2, apoi marcajul se repet recursiv pentru fiecare dintre vecinii si negri. n urma acestui procedeu obiectul din care face parte punctul, este complet marcat cu 2. n continuare este cutat urmtorul punct negru, i metoda de marcare este repetat. De fiecare dat cnd este gsit un punct negru nemarcat este incrementat contorul de obiecte.

Programul n limbajul Pascal:


Program Fotografia; Uses CRT; Type T=Array[1..20,1..20] Of 0..2; Var A:T; K,N,I,J:Integer; Procedure Citire; Var F:Text; Begin Assign(F,date.dat);Reset(F); ReadLn(F,N); For I:=1 To N Do Begin For J:=1 To N Do Read(F,A[I,J]); ReadLn(F) End; Close(F) End; Procedure Marcheaza(X,Y:Byte); Begin A[X,Y]:=2; If (X>1) And (A[X-1,Y]=1) Then Marcheaza(X-1,Y); If (X<N) And (A[X+1,Y]=1) Then Marcheaza(X+1,Y); If (Y>1) And (A[X,Y-1]=1) Then Marcheaza(X,Y-1); If (Y<N) And (A[X,Y+1]=1) Then Marcheaza(X,Y+1); If (X>1) And (Y>1) And (A[X-1,Y-1]=1) Then Marcheaza(X-1,Y-1); If (X>1) And (Y<N) And (A[X-1,Y+1]=1) Then Marcheaza(X-1,Y+1); If (X<N) And (Y>1) And (A[X+1,Y-1]=1) Then Marcheaza(X+1,Y-1); If (X<N) And (Y<N) And (A[X+1,Y+1]=1) Then Marcheaza(X+1,Y+1) End; Begin Citire; K:=0; For I:=1 To N Do For J:=1 To N Do If A[I,J]=1 Then Begin Inc(K); Marcheaza(I,J) End; WriteLn(Nr de obiecte distincte=,K); ReadLn End.

9. Problema Nr. 9. Mingea. Este dat un teren de dmensiunea nxn, mprit n careuri. Fiecare careu are o anumit nlime. ntr-un careu dat se plaseaz o minge. tiind c mingea se poate deplasa ntr-unul din cele maximum 8 careuri vecine dac acesta are o nlime strict mai mic, s se genereze toate traseele pe care le poate urma mingea pentru a prsi terenul. Intrare: Fiierul de intrare conine pe prima linie numrul N, iar pe urmtoarele N linii cte N numere desprite prin spaiu. Ieire: Fiierul de ieire conine traseele pe care le poate urma mingea pentru a prsi terenul. Algoritmul: Soluia este de tip backtracking, ncercnd toate variantele posibile, ncepnd din punctul de plecare. Pentru a marca traseul parcurs de minge vom folosi o matrice de marcaje cu elemente de tipul Boolean, avnd aceleai dimensiuni cu matricea care memoreaz nlimile careurilor de pe teren. Se consider c s-a gsit o soluie n momentul n care mingea ajunge la marginea terenului, deci poate s l prseasc imediat. Deoarece un traseu poate s conin mai multe puncte aflate la marginea terenului, dup gsirea i afiarea unei soluii trebuie continuate ncercrile de deplasare n alte careuri de pe teren. Programul n limbajul Pascal:
Program Mingea; Uses CRT; Const D_Max=20; (* dimensiunea maxima a terenului *) Type Coordonate=Record L,C:Byte End; Tab=Array[1..D_Max,1..D_Max] Of Integer; M=Array [1..D_Max,1..D_Max] Of Boolean; Lin=Array[1..D_Max*D_Max] Of Coordonate; Var A:Tab; B:M; Sol:Lin; N,I,J,loc:Integer; (* N-dimensiunea terenului *) L,C:Integer; (* coordonatele punctului de plecare *)

T:Text; Nume_iesire:String[12]; Procedure Citire; Var Nume_intrare:String[12]; F:Text; Begin Write(numele fisierului de intrare: );ReadLn(Nume_intrare); Assign(F,Nume_intrare); Reset(F); ReadLn(F,N); For I:=1 To N Do Begin For J:=1 To N Do Read(F,A[I,J]); ReadLn(F)

End; ReadLn(F,L,C); Close(F) End; Procedure Initializare; Begin For I:=1 To N Do For J:=1 To N Do End; Procedure Afisare(L:Byte); Begin For I:=1 To L Do Write(T, (,Sol[I].L, , ,Sol[I].C, ) ); WriteLn(T) End; Procedure Miscare(H,X,Y:Integer); Var Hc:Integer; Begin If (X in [1..N]) And (Y in [1..N]) Then Begin If (H> Hc) And Not B[X,Y] Then Begin Hc:=A[X,Y]; B[I,J]:=False

B[X,Y]:=True;Inc(Loc);Sol[Loc].L:=X; Sol[Loc].C:=Y; If (X=1) Or (X=N) Or (Y=1) Or (Y=N) Then Afisare(Loc); Miscare(Hc,X,Y-1); Miscare(Hc,X-1,Y); Miscare(Hc,X,Y+1); Miscare(Hc,X+1,Y); Miscare(Hc,X-1,Y-1); Miscare(Hc,X-1,Y+1); Miscare(Hc,X+1,Y+1); Miscare(Hc,X+1,Y-1);

B[X,Y]:=False; Dec(Loc) (* excluderea careului din traseu *) End End End; Begin Citire; Write(numele fisierului de iesire: );ReadLn(Nume_iesire); Assign(T,Nume_iesire); Rewrite(T); Loc:=0; Miscare(A[L,C]+1,L,C); Close(T) End.

10. Problema Nr.10. Jocul de-a mijatca. N copii cu numerele de ordine 1,2,...,N sunt aranjai pe o circumferin ncepnd cu copilul cu numrul de ordine M (M<=N) se numr pn la K i se exclude din joc copilul la care s-a terminat enumerarea. Procesul se repet ncepnd cu urmtorul copil dup cel exclus i se ncheie cnd rmne un singur copil. Determinai ordinea de excludere a copiilor din joc. Intrare:fiierul date.dat conine trei numere, desprite prin spaiu, ce reprezint valorile N, M i K. Ieire:fiierul rez.dat va conine ordinea de excludere a copiilor din joc, numerele de ordine a fiecrui copil fiind scrise n acelai rnd, desprite printr-un spaiu. Algoritmul:Construim un tablou unidimensional cu elemente de tip record, incluznd n el numerele de ordine ale copiilor i un indicator pentru maracarea copiilor ce au fost exclui din joc, care iniial se zerografiaz. Determinm elementul cu numrul de ordine M. Numrnd din K n K doar acei copii care nu au fost nc exclui, excludem din joc copiii prin marcarea lor, contoriznd numrul de copii exclui. Oprim procesul cnd rmne un singur copil n joc, deci un singur element al tabloului este nemarcat. Programul n limbajul Pascal:
Program Jocul_de_mijatca; Uses CRT; Type Copil=Record NumOrd,X:Byte End; T=Array[1..100] Of Copil; Var A:T; (* nr. ordine al copiilor *) N,M,K,I:Byte; (* N - nr. copii, M - cu care incepe num., K - din cit in cit are loc num. *) Intrare,Iesire:String[12]; Procedure Citire; (* citirea datelor din fisier *) Var F:Text; Begin Write(Fisierul de intrare: );ReadLn(Intrare); Assign(F,Intrare);Reset(F); End; Procedure Initializare; Begin For I:=1 To N Do Begin A[I].NumOrd:=I; A[I].X:=0 End ReadLn(F,N,M,K); Close(F)

End; Procedure Afisare;(* scrierea rezultatelor in fisier *) Var F:Text; Begin Write(Fisierul de iesire: );ReadLn(Iesire); Assign(F,Iesire);Rewrite(F); For I:=1 To N Do Write(F,A[I].NumOrd, );Close(F) End; Procedure Numarare; Var P,Num,J:Byte; Begin P:=M; Num:=0; (* numarul de copii ce au iesit din joc *) While Num<N Do Begin J:=1; (* determinarea jucatorului ce iese din joc *) Repeat If P<N Then Inc(P) Else P:=1; If A[P].X=0 Then Inc(J) Until J=K; Inc(Num); A[P].X:=Num; (* daca mai exista jucatori,se determina jucatorul ce continua numararea *) If Num<N Then While A[P].X<>0 Do If P<N Then Inc(P) Else P:=1; End End; Procedure Sortare; (* ordonarea dupa nr. de iesire din joc - metoda bulelor *) Var V:Boolean; C:Copil; Begin V:=True; While V Do Begin V:=False; For I:=1 To N-1 Do If A[I].X>A[I+1].X Then Begin V:=True; C:=A[I]; A[I]:=A[I+1];A[I+1]:=C End End End; Begin ClrScr; Citire; Initializare; Numarare; Sortare; Afisare End.

Studiind de mai muli ani tema abordat m-am convins c o condiie important pentru nsuirea temeinic a noiunii de tip de date tablou este utilizarea tipului de date tablou la rezolvarea diverselor probleme. Organiznd mai multe lecii la tema pus n discuie, m-am convins c elevii lucreaz cu un viu interes i fr semn de plictiseal, dac exemplele propuse pentru rezolvare sunt bine selectate i sunt folosite formele adecvate de lucru la lecie.

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