Upcoming SlideShare
×

# 68 De Pagini De Probleme Rezolvate Si Teorie In Pascal

73,159 views

Published on

• Full Name
Comment goes here.

Are you sure you want to Yes No
• multumesc cu drag !

Are you sure you want to  Yes  No
• mersi mult

Are you sure you want to  Yes  No
• multumesc

Are you sure you want to  Yes  No

### 68 De Pagini De Probleme Rezolvate Si Teorie In Pascal

1. 1. 5 CUPRINS PREFAŢĂ ..........................................................................................................................................9 Capitolul 1. PROBLEME SIMPLE 1.1. Ghid de lucru.............................................................................................................................11 1.2. Numere pitagorice .....................................................................................................................14 1.3. Probleme propuse ......................................................................................................................15 Capitolul 2. PROBLEME CU ŞIRURI DE NUMERE 2.1. Numere distincte .......................................................................................................................21 2.2. Şir derivat din numerele naturale ..............................................................................................23 2.3. Probleme propuse ......................................................................................................................25 Capitolul 3. PROBLEME REZOLVATE FOLOSIND VECTORI 3.1. Numărul punctelor din cerc ......................................................................................................35 3.2. Interclasare ................................................................................................................................36 3.3. Probleme propuse ......................................................................................................................38 Capitolul 4. PROBLEME CU MATRICE 4.1. Construirea unei matrice ...........................................................................................................41 4.2. Generarea unei matrice dintr-un şir ..........................................................................................42 4.3. Probleme propuse ......................................................................................................................43 Capitolul 5. SUBALGORITMI 5.1. Reuniunea unor mulţimi ...........................................................................................................51 5.2. Numere prime ...........................................................................................................................54 5.3. Probleme propuse ......................................................................................................................55 Capitolul 6. PROBLEME REZOLVATE CU MATRICE 6.1. Relaţii între persoane ................................................................................................................63 6.2. Pătrate magice ...........................................................................................................................64 6.3. Probleme propuse ......................................................................................................................66
2. 2. 6 PREFAŢĂ Culegerea de probleme de faţă se doreşte a fi un ghid şio colecţie de probleme pentru învăţarea programării. Diversitatea problemelor propuse şi gradul diferit de dificultate fac culegerea utilă nu numai studenţilor, ci şi elevilor de liceu. Iniţial ea a fost concepută ca ghid pentru lucrările de laborator ale studenţilor anilor întâi şi doi de la secţia de Informatică a Facultăţii de Matematică şi Informatică. Problemele sunt grupate în 16 capitole, în funcţie de specificul şi gradul lor de complexitate. Succesiunea capitolelor din culegere vizează o abordare graduală a problematicii, atât din punctul de vedere al complexităţii algoritmilor, specificaţi în limbaj Pseudocod, cât şi al învăţării unui limbaj de programare, în particular limbajul Pascal. Fiecare capitol conţine cel puţin două exemple de probleme rezolvate, pentru care sunt precizaţi atât algoritmii de rezolvare, cât şi programele sursă Pascal. Intenţia autorilor este de a sugera un anumit stil de rezolvare a problemelor cu calculatorul, acordându-se o importanţă deosebită etapelor de analiză a problemei şi de proiectare a algoritmilor, etape în care limbajul de programare nu este implicat. Din acest punct de vedere, problemele propuse sunt generale, implementarea soluţiilor putând fi făcută şi în alte limbaje de programare. Problemele de acelaşi tip sunt grupate în acelaşi capitol, iar un capitol acoperă toată gama de probleme pentru tema abordată. Astfel, capitolul I conţine probleme elementare, a căror rezolvare nu cere folosirea vectorilor sau a matricelor. Capitolul doi conţine probleme referitoare la vectori, în timp ce capitolul trei conţine probleme a căror rezolvare cere folosirea vectorilor. Capitolul patru conţine probleme cu matrice. Capitolul cinci cere folosirea subalgoritmilor. Capitolul şase conţine probleme a căror rezolvare cere folosirea matricelor. Urmează un capitol de exemple şi probleme pentru programarea în limbaj maşină. Capitolul opt conţine probleme referitoare la tipurile mulţime şi enumerare din Pascal. Capitolul nouă conţine probleme referitoare la şiruri de caractere. Capitolul zece se referă la recursivitate. Urmează un capitol de probleme privind folosirea fişierelor. Capitolul 12 conţine probleme care cer folosirea tipului referinţă în Pascal. Următorul capitol conţine probleme de grafică cu calculatorul. Capitolul 14 conţine mai multe probleme date la diferite concursuri de programare. Tipurile abstracte de date sunt obiectul capitolului 15. În sfârşit, ultimul capitol conţine probleme despre grafe. Deşi la selectarea problemelor au contribuit toţi autorii, fiecare capitol a fost elaborat de unul sau doi autori, după cum urmează: Cap.1 - Prof. S.Groze şi Prof. M.Frenţiu; Cap.2 - Prof. M.Frenţiu; Cap.3 - Lect. Robu J. şi Prof. M.Frenţiu; Cap.4 - Asist. S. Motogna; Cap.5 - Asist. E.Iacob; Cap.6 - Conf. Kasa Z. şi Asist. S.Motogna; Cap.7 - Conf. F.Boian; Cap.8 - Lect. V.Ciobanu; Cap.9 - Asist. S.Iurian; Cap.10 - Asist. S.Iurian; Cap.11 - Asist. H.Pop; Cap.12 - Lect. V.Prejmereanu; Cap.13 - Lect. V.Prejmereanu; Cap.14 - Asist. S.Motogna; Cap.15 - Conf. B.Prv şi Prof. M.Frenţiu; Cap.16 - Conf. T.Toadere. Eventualele erori nu se pot imputa numai celor de mai sus, toţi autorii participând la corectarea finală a acestei culegeri. Sperăm ca prezentul material să-şi atingă scopul propus, cel de dezvoltare la cititori a gustului de programare într-un limbaj evoluat, în particular în limbajul Pascal. Conştienţi că există posibilităţi de îmbunătăţire a conţinutului prezentei lucrări, autorii mulţumesc anticipat pe această cale tuturor celor care vor face observaţii şi propuneri de îmbunătăţire, de care se va ţine seama la o nouă editare a culegerii de probleme.
3. 3. 7 CAPITOLUL 1 PROBLEME SIMPLE 1.1. GHID DE LUCRU Rezolvarea unei probleme cu ajutorul calculatorului presupune parcurgerea următoarelor faze: - precizarea completă a problemei de rezolvat; - proiectarea algoritmului de rezolvare a problemei; - programarea propriu-zisă (implementarea); - testarea programului obţinut; - exploatarea şi întreţinerea programului. Aceste faze constituie ciclul de viaţă al programului. De foarte multe ori, atunci când beneficiarul discută cu executantul despre problema care trebuie rezolvată, acesta dă un enunţ vag, incomplet, dacă nu chiar inexact sau contradictoriu, pentru problema de rezolvat. Urmează mai multe discuţii, uneori întinse în timp, în urma cărora se ajunge la un enunţ relativ complet şi exact al problemei. Întrucât problemele propuse sunt luate din domeniul matematicii sarcina noastră va fi mult mai uşoară. După enunţarea problemei urmează modelarea matematică şi căutarea unei metode de rezolvare a ei. Uneori sunt posibile mai multe moduri de rezolvare, caz în care se va alege metoda considerată cea mai potrivită scopului urmărit. Modelarea matematică şi alegerea unei metode de rezolvare se îmbină aproape întotdeauna cu conceperea algoritmului, fiind greu să se separe una de cealaltă. Activităţile de mai sus constituie ceea ce numim proiectarea programului. Pe toată durata proiectării trebuie menţionate în scris toate deciziile luate, întrucât este posibil ca ulterior să fie necesară o reproiectare şi deci, să se revină asupra acestor decizii. Documentaţia realizată este necesară în primul rând pentru următoarea fază a ciclului de viaţă al programului, implementarea. De asemenea, în faza de întreţinere a programului este posibilă modificarea unor module, modificare în care sunt necesare să fie cunoscute şi aceste decizii. E bine ca proiectarea să fie astfel făcută încât să permită o întreţinere cât mai uşoară. Faza următoare, implementarea sau codificarea, constă în traducerea algoritmului într-un limbaj de programare. Evident, prima decizie ce trebuie luată constă în alegerea limbajului de programare în care va fi scris programul. În cele ce urmează vom folosi în acest scop limbajul Pascal. De multe ori se vor folosi mai multe limbaje pentru această activitate. De exemplu, pot exista unele module a căror scriere se poate face numai în limbajul de asamblare. Urmează testarea programului elaborat, care uneori pune în evidenţă erori grave de programare, erori care au dus în unele situaţii la refacerea (parţială sau integrală) a activităţilor anterioare. Sigur că este de dorit să nu se ajungă la astfel de situaţii şi, dacă proiectarea şi implementarea au fost făcute corect, în faza de testare nu ar trebui să întâlnim erori. Următoarea fază din viaţa programului constă în exploatarea propriu-zisă a acestuia, fază în care execuţia se face cu date reale. Această activitate se întinde în timp pe mai mulţi ani şi cere adeseori schimbări în program, motiv pentru care este cunoscută sub numele de întreţinerea programului. Este faza cea mai costisitoare şi cea mai importantă din viaţa unui produsul real. Toată activitatea de realizare a programului trebuie să ţină seama de acest fapt şi programul să fie astfel conceput încât să se permită modificări în ceea ce face programul cu un număr minim de modificări în textul acestuia. Documentarea programului presupune elaborarea unor materiale scrise în care se precizează toate informaţiile utile despre programul realizat. Pentru proiectarea algoritmilor vom folosi limbajul Pseudocod. Avantajele folosirii acestui limbaj pentru proiectarea algoritmilor constau în faptul că permit programatorului să-şi îndrepte complet atenţia asupra logicii rezolvării problemei şi să uite de restricţiile impuse de limbajul de programare şi calculatorul folosit. În această fază este necesară o analiză atentă a problemei în vederea găsirii unui algoritm corect proiectat. De asemenea, proiectarea algoritmului permite evitarea duplicării unui grup de instrucţiuni în mai multe părţi ale programului. Identificarea unui astfel de grup permite definirea lui ca un singur subalgoritm şi folosirea acestui subalgoritm ori de câte ori este necesar. În descrierea unui algoritm deosebim următoarele activităţi importante: - specificarea problemei; - descrierea metodei alese pentru rezolvarea problemei; - precizarea denumirilor şi semnificaţiilor variabilelor folosite; - descrierea algoritmului propriu-zis. Astfel, dacă ni se cere să calculăm radicalul de ordinul 2 din x, în partea de specificare a problemei vom
4. 4. 8 menţiona: Se dă un număr real nenegativ, notat prin x. Se cere să găsim un alt număr pozitiv r astfel încât r2 =x. Pentru un informatician este clar că un astfel de număr nu se poate găsi în general prin nici un procedeu finit. Este însă posibil să găsim o aproximare oricât de bună a lui r. Deci specificarea făcută nu este corectă, neputând găsi un algoritm care să rezolve problema în forma enunţată. Vom modifica această specificaţie, cerând să se calculeze aproximativ r cu o eroare ce nu depăşeşte un număr real eps oricât de mic. Specificaţia problemei este: DATE eps,x; {eps,xR, eps>0 şi x0} REZULTATE r; {r-rad(x)<eps} unde prin rad(x) am notat radicalul de ordinul 2 din x definit în matematică. Urmează să precizăm metoda de rezolvare a problemei. Se ştie că există cel puţin două posibilităţi de a calcula pe r: - ca limită a unui şir (definit printr-o relaţie de recurenţă) convergent la r; - prin rezolvarea ecuaţiei r2 =x. Precizăm că-l vom calcula pe r rezolvând ecuaţia r2 =x. Dar şi rezolvarea acestei ecuaţii se poate face prin mai multe metode. Decidem că o vom rezolva prin metoda njumătăţirii. Această metodă constă în njumătăţirea repetată a intervalului [a,b] care conţine rădăcina r la intervalul [a',b'], care este jumătatea stângă, sau jumătatea dreaptă a intervalului [a,b], cea care conţine rădăcina. Variabilele folosite în descrierea algoritmului sunt: - a şi b = capetele intervalului în care se află rădăcina; - m mijlocul intervalului (a,b). În momentul în care b-a<eps, m va fi chiar valoarea căutată pentru r. Algoritmul propriu-zis este descris în continuare: *Iniţializează pe a şi b; REPETĂ FIE m:=(a+b)/2; * Dacă rădăcina se află în [a,m] atunci b:=m altfel a:=m. PNĂCND b-a<eps SF-REPETĂ FIE r:=(a+b)/2; În textul de mai sus apar două propoziţii nestandard care sugerează însă foarte bine ce acţiuni trebuiesc întreprinse. Prima stabileşte intervalul iniţial în care se află rădăcina, care depinde de mărimea lui x: (x,1) când x este mai mic decât 1 sau (1,x) în caz contrar. Deci ea se va transcrie în propoziţia standard DACĂ x<1 ATUNCI ATRIBUIE a:=x; b:=1 ALTFEL ATRIBUIE a:=1; b:=x SF-DACĂ A doua propoziţie înjumătăţeşte intervalul. Condiţia ca rădăcina să se afle în jumătatea stângă a intervalului este (a2 - x)*(m2 -x)<0. Se ajunge la următoarea variantă finală: ALGORITMUL RADICAL ESTE: {Calculează radical din x} DATE eps,x; {eps,xR, eps>0 şi x0} DACĂ x<1 ATUNCI FIE a:=x; b:=1 {Iniţializează pe a şi b} ALTFEL FIE a:=1; b:=x SF-DACĂ REPETĂ DACĂ (a2 -x)*(m2 -x)<0 ATUNCI b:=m {rădăcina în stânga} ALTFEL a:=m {rădăcina în dreapta} SF-DACĂ
6. 6. 10 Sf-pentru Sf-dacă Sf-algoritm. Programul Pascal corespunzător este dat în continuare. PROGRAM NRPITAGORICE; {Programul 1.1.2. Numere pitagorice} VAR n, { nN; a+b+cn } S, { S = a+b+c } a,b,c, {(a,b,c) triplet de numere pitagorice} { 0 < a < b < c } k : integer; { contor } BEGIN WRITELN('Se tipăresc tripletele(a,b,c) de numere pitagorice'); WRITELN('cu proprietatea: a+b+c<=n, pentru n dat'); WRITE('Daţi valoarea lui n:'); READLN(n); For k:=1 to 4 do writeln; k:=0; IF n<12 THEN WRITELN('Nu exista numerele cerute') ELSE FOR S:=12 TO n DO FOR a:=3 TO S DIV 3 DO FOR b:=a+1 TO (S-a) DIV 2 DO BEGIN c:=S-a-b; IF c*c=a*a+b*b THEN BEGIN k:=k+1; WRITELN('Tripletul (a,b,c)',k:3,'= ',a:3, b:3,c:3); END {IF} END; READLN; END. 1.3. PROBLEME PROPUSE 1.1. Fie i,j,k . Să se determine restul împărţirii numărului natural ij la k. 1.2. Să se tipărească toate tripletele (i,j,k) de numere naturale care verifică condiţiile i2 + j2 = k2 1 < i < j < k  n 1.3. Să se verifice dacă numărul n este perfect. (Un număr n este perfect dacă este egal cu suma divizorilor lui diferiţi de n; exemplu: 6=1+2+3). 1.4. Să se determine numerele perfecte din intervalul [a,b], pentru a,b date. 1.5. Două numere întregi x şi y sunt "prietene" dacă suma divizorilor numărului x este egală cu suma divizorilor numărului y. Să se găsească numerele "prietene" din intervalul [a,b]. 1.6. Să se calculeze şi să se tipărească primii n termeni din şirul Fibonacci, şir definit de relaţia de recurenţă i+1 i i-1t = t + t 2, i=1,2,... având 0 1t = t = 13. 1.7. Fie n,k  Z+ , nk. Să se scrie un algoritm pentru calculul numărului combinărilor de n elemente luate câte
7. 7. 11 1.8. Fie a  N. Să se scrie un algoritm pentru calculul mediei aritmetice, geometrice şi armonice a tuturor divizorilor lui a. 1.9. Fie funcţia lui Euler : N  N, unde (n)este numărul numerelor relativ prime cu n şi mai mici ca n. Să se tipărească valorile (k),k=1,2,...,m, pentru mN dat. 1.10. Fie n,k  Z, n  k. Să se scrie un algoritm pentru calculul sumei S = A + C + Pn k n k n 4. 1.11. Să se determine toate numerele întregi de trei cifre abc 5 cu proprietatea abc = a + b + c3 3 3 6. 1.12. Se dau numerele z,l,a   . Să se determine dacă tripletul (z,l,a) reprezintă o dată calendaristică a secolului nostru. 1.13. Se dă o zi (z,l,a) dintr-un an. Se cere să se determine a câta zi din acel an este această zi. 1.14. Se consideră ( z ,l ,a )n n n 7 data naşterii unei persoane şi ( z ,l ,a )c c c 8 o dată curentă. Să se determine vârsta, în zile, a persoanei respective. 1.15. Se dau datele de naştere ( z ,l ,a ) ( z ,l ,a )1 1 1 2 2 2si 9 a două persoane. Se cere să se precizeze care din cele două persoane este mai tânără, prin indicatorul r  {0,1,2} (0 dacă au aceeaşi vârstă, 1 dacă prima persoană este mai tânără). 1.16. Cunoscând în ce zi din săptămână a fost 1 ianuarie, să se scrie un algoritm ce determină ziua din săptămână în care este a n-a zi a anului. 1.17. Anumite numere prime şipăstrează proprietatea de a rămâne prime pentru toate permutările cifrelor lor. Ex. 13 şi 31; 131,113 şi 311, etc.). Să se scrie un algoritm care determină numerele prime "permutabile", mai mici decât un număr m dat. 1.18. O formulă de generare a unui şir de numere (yi) este n 2 y = n - 79n + 160110. Se cere algoritmul care determină pentru un număr n  {1,...,90} câte dintre primele n numere din acest şir sunt prime. 1.19. Să se scrie un algoritm care să exprime orice sumă de lei S, în minimum de monede de 1 leu, 3 lei, 5 lei, 10 lei , 20 lei, 50 lei şi 100 lei. 1.20. Fiind date numerele a,b,c,d  Z, se cere un algoritm care să stabilească cea mai mare dintre fracţiile a/b şi c/d. 1.21. Să se găsească soluţiile întregi şi pozitive ale ecuaţiei ax + by = c, cu proprietatea x+y<n, pentru a,b,c aparţine lui Z şi n>0. 1.22. Se cere valoarea funcţiei f:[-9,9] în punctul x, dacă
8. 8. 12 f x x -x - <x x + , <x x> ( ) = ≤ ≤ ≤        1, pentru , pentru pentru , pentru 1 3 1 0 2 0 0 10 1 2 1.23. Să se determine soluţiile întregi ale sistemului y x y 2 x - 16 2 2 ≤ ≥    11 1.24. Se dă n  . Să se calculeze k=1 n C k n (1+ 1 2 +...+ 1 k )∑ 12 1.25. Fie a,b,c   +. Să se scrie un algoritm pentru rezolvarea ecuaţiei 2 x + dx + p = 0 13 unde d = (a,b) este cel mai mare divizor comun al numerelor a şi b, iar p este probabilitatea ca un număr n   ce verifică condiţia nc, luat la întâmplare, să fie prim. 1.26. Se cere un algoritm pentru determinarea numerelor impare succesive a căror sumă este egală cu n3 , pentru n=1,...,20. (Ex. 3 3 3 1 = 1, 2 = 3+ 5, 3 =7 + 9+11 14, etc). 1.27. Să se scrie un algoritm care citeşte succesiv p perechi de numere întregi (m,n), cu 0  m  n şi care calculează, pentru fiecare pereche coeficientul binomial bn,m definit de relaţia recursivă n,m n-1,m-1 n-1,m b = 1, m=0 m= n, b +b , . daca sau in caz contrar     15 1.28. Să se afle toate punctele de coordonate întregi situate în interiorul pătratului cu diagonala determinată de punctele A(a,b) şi C(c,d). 1.29. Fie a,b   . Să se scrie un algoritm pentru calculul numărului punctelor de coordonate întregi interioare elipsei de ecuaţie 2 2 2 2 x a + y b = 1 16 1.30. Fie dreapta d determinată de punctele A(a1,a2) şi B(b1,b2). Să se determine poziţia punctelor A şi B faţă de dreapta d, prin indicatorul R definit astfel: R=0, dacă punctele A(a1,a2) şi B(b1,b2) se află în acelaşi semiplan determinat de dreapta d ; R=1, dacă punctele A şi B aparţin dreptei d; R=2, dacă punctele A şi B se află în semiplane diferite faţă de dreapta d. 1.31. Se dă un triunghi prin coordonatele vârfurilor sale şi un punct M în planul său. Să se determine poziţia
9. 9. 13 punctului M faţă de laturile triunghiului, marcându-se cu R  {1,2,3} trei situaţii posibile: interior triunghiului, pe una din laturi, exterior triunghiului. 1.32. Se dă un pătrat P1 de latură 1 căruia i se circumscrie un cerc C1. Cercului obţinut i se circumscrie un nou pătrat P2, acestuia un nou cerc C2, etc. Să se calculeze aria pătratului Pn şi aria cercului Cn obţinute după un număr de n paşi, prin metoda de mai sus. 1.33. Se dau trei puncte Mi (xi,yi), i=1,2,3, în plan. Să se determine parametrul k care să ia valoarea 0 dacă punctele sunt coliniare, respectiv 1 în caz contrar. 1.34. Se dau a,b,c,d,e,f   . Să se determine poziţia dreptelor ax + by + c = 0 dx + ey + f = 0    17 şi unghiul dintre ele, exprimat în grade. 1.35. Se cunosc lungimile laturilor unui triunghi. Se cere să se calculeze perimetrul, unghiurile şi aria triunghiului. 1.36. Se consideră segmentele de dreaptă cu extremităţile în punctele A(a1,a2), B(b1,b2), respectiv C(c1,c2), D(d1,d2). Să se determine un algoritm de calcul pentru coordonatele punctului de intersecţie a segmentelor date. În cazul în care acest punct nu există, se va tipări un mesaj. 1.37. O fabrică de mobilă primeşte comenzi pentru producerea unei diversităţi de biblioteci, având: - lungimea cuprinsă între 2-9 m; - înălţimea cuprinsă între 1-3 m; - un număr de 2,4,6,9 sau 12 corpuri. Costul unei biblioteci este de a lei pentru fiecare metru cub de volum, la care se adaugă b lei pentru fiecare corp. Construcţia unei biblioteci trebuie să respecte anumite condiţii impuse de normele de fabricaţie: - lungimea trebuie să fie de 2-3 ori mai mare decât înălţimea; - lăţimea trebuie să fie 1/3 până la 1/2 din înălţime; - numărul de corpuri trebuie să fie în raportul de 1/2 până la 1 faţă de produsul dintre lungime şi înălţime. Se cere algoritmul de acceptare al unei comenzi şi de calcul al preţului. 1.38. Fie funcţia f:[a,b]  , dată de f(x)= ax +bx, a x (a+b)/ 2 ax +bx x+2 , (a+b)/ 2 < x b 2 2 daca daca ≤ ≤ ≤      18 Să se calculeze valoarea lui f pentru x  [a,b]. 1.39. Se cere un algoritm pentru calculul aproximativ al rădăcinii unei ecuaţii f(x)=0, unde f:(a,b)   este continuă şi monotonă, folosind metoda combinată a coardei şi a tangentei. Cu metoda dedusă, să se calculeze Mn 19. Indicaţie. Se va lua f(x) = xn - M, iar intervalul (a,b), se înlocuieşte cu [0,M]. 1.40. Dintr-o urnă cu m bile (m>1), numerotate de la 1 la m, se extrage la întâmplare o bilă. Să se scrie un algoritm pentru calculul probabilităţii ca numărul înscris pe bila extrasă să fie prim. 1.41. Un mobil efectuează o mişcare oscilatorie armonică. Ştiind că pentru elongaţiile x1=2 cm şi x2=3 cm, mobilul are vitezele v1=5m/s şi respectiv v2=4m/s, să se calculeze amplitudinea şi perioada mişcării oscilatorii a
10. 10. 14 mobilului. Indicaţie. Se ştie că PI=3.14 şi se ţine seama că amplitudinea, respectiv perioada mişcării oscilatorie a mobilului sunt date de A= x v - x v v - v ; T = 2PI x - x v - v 1 2 2 2 2 2 1 2 2 2 1 2 1 2 2 2 2 2 1 2 20 1.42. Se dau punctele A, B, C, D prin coordonatele lor în plan. Citindu-se coordonatele acestor puncte, să se stabilească dacă ele sunt vârfurile unui dreptunghi sau nu sunt. 1.43. Se dau punctele A, B, C prin coordonatele lor rectangulare. Să se determine punctul D ştiind că el este piciorul perpendicularei dusă din A pe BC. 1.44. Se dau punctele A, B, C, D prin coordonatele lor în plan. Să se determine punctul E pe segmentul AB şi punctul F pe segmentul CD astfel încât distanţa dintre E şi F să fie minimă. 1.45. Se dau punctele A, B, C, D prin coordonatele lor în plan. Dreapta ce trece prin A şi B, cercul de centru (0,2) şi rază 5 şi parabola de ecuaţie y=x2 +1 determină o împărţire a planului în opt regiuni interioare. Să se determine dacă punctele C şi D se află în aceeaşi regiune sau nu. 1.46. Se dau n  {1,2,...,366} şi a număr de an al secolului nostru. Să se precizeze data corespunzătoare celei de a n-a zi a anului a sub forma (lună, zi). 1.47. Se dă numărul n   . Să se tipărească acest număr în sistemul de numeraţie roman. 1.48. Ştiind că 1 ianuarie 1994 a fost într-o zi de sâmbătă, să se determine în ce zi a săptămânii va fi 1 ianuarie 2020. 1.49. Se consideră trei rezervoare cilindrice care conţin benzină de trei calităţi. Se cere situaţia livrărilor săptămânale, livrările zilnice înregistrându-se secvenţial. Să se precizeze beneficiarul căruia i s-a livrat cantitatea maximă de benzină.
11. 11. 15
12. 12. 17 CAPITOLUL 2 PROBLEME CU ŞIRURI DE NUMERE 2.1. NUMERE DISTINCTE Se dau n   şi numerele întregi x1,x2, ...,xn. Se cere să se reţină într-un vector Y toate numerele, dar fără a repeta vreunul, deci Y are numai componente distincte. Specificarea problemei: DATE n, (xi, i=1,n); { xiZ, pentru i=1,2,...,n } REZULTATE (yj, j=1,k); { X=Y, unde X este } { mulţimea ce conţine toate numerele xi, i=1,n, } { iar Y =mulţimea ce conţine pe yj, j=1,k şi yly j pentru lj} Variabilele intermediare folosite şi semnificaţia lor, precum şi metoda folosită vor fi rezultatul rafinărilor succesive şi vor fi înţelese din textul versiunilor respective. ALGORITMUL DISTINCTE ESTE: { Versiunea 1 } DATE n, (xi, i=1,n); FIE y1:=x1; k:=1; *Examinează celelalte numere şi dacă este cazul pune-le în Y. REZULTATE (yj, j=1,k); SF-ALGORITM Pentru a parcurge celelalte numere avem nevoie de un contor, fie el i, şi de folosirea propoziţiei PENTRU. Ajungem la: ALGORITMUL DISTINCTE ESTE: { Versiunea 2 } DATE n, (xi, i=1,n); FIE y1:=x1; k:=1; PENTRU i:=2,n EXECUTĂ *Verifică dacă xi aparţine lui Y. *Dacă nu aparţine atunci adaugă pe xi la Y. SF-PENTRU REZULTATE (yj, j=1,k); SF-ALGORITM Decizia ce trebuie luată este cum să verificăm apartenenţa unui element u la mulţimea Y. Pentru aceasta vom reţine în indicatorul ind cele două situaţii posibile: 0 pentru apartenenţă şi pozitiv în caz contrar. Acest calcul se poate face folosind următoarele propoziţii: ind:=1; CTTIMP (ind1) şi (ind<=k) EXECUTĂ DACĂ xi=yind ATUNCI ind:=0 ALTFEL ind:=ind+1 SF-DACĂ SF-CTTIMP Cu acestea ajungem la versiunea finală a algoritmului dorit. ALGORITMUL DISTINCTE ESTE: { Versiunea finală }
13. 13. 18 DATE n, (xi, i=1,n); { xiZ, pentru i=1,2,...,n } FIE y1:=x1; k:=1; PENTRU i:=2,n EXECUTĂ {Verifică dacă xi aparţine lui Y} ind:=1; CTTIMP (ind1) şi (ind<=k) EXECUTĂ DACĂ xi=yind ATUNCI ind:=0 ALTFEL ind:=ind+1 SF-DACĂ SF-CTTIMP {Dacă nu aparţine atunci adaugă pe xi la Y} DACĂ ind>0 ATUNCI k:=k+1; yk:=xi SF-DACĂ SF-PENTRU REZULTATE (yj, j=1,k); {X=Y, unde X este mulţimea ce conţine } { toate numerele xi, i=1,n, iar Y este mulţimea } { ce conţine pe yj, j=1,k şi yly j pentru lj } SF-ALGORITM Programul Pascal corespunzător este: PROGRAM DISTINCTE; { Programul 2.1. Retine valorile distincte } VAR n, { numărul numerelor date } i,j, { contor - variabile de lucru } k, { numărul valorilor distincte găsite } ind : integer; { indicator; retine daca x[i] este in Y } X, { Vector cu numerele date } Y : array[1..100] of integer; { Vector cu numerele distincte } BEGIN Writeln('Se da vectorul X cu n componente reale'); Writeln('Se pun in Y toate valorile ce apar in X'); Write(' n='); readln(n); For i:=1 to n do begin write('x(',i,')='); readln(x[i]) end; y[1]:=x[1]; k:=1; For i:=2 to n do begin { Verifica daca } ind:=1; { x[i] aparţine lui Y } While (ind>0) and (ind<=k) do If x[i]=y[ind] then ind:=0 else ind:=ind+1; { Dacă nu aparţine lui Y } IF ind>0 then { atunci adaugă pe x[i] la Y } begin k:=k+1; y[k]:=x[i] end; end; Writeln; { Tipăreşte rezultatele } Writeln(' Numerele distincte sunt'); For j:=1 to k do write(y[j]:5); readln END. 2.2. ŞIR DERIVAT DIN NUMERELE NATURALE
14. 14. 19 Se consideră şirul 1,2,1,3,2,1,4,2,2,5,4,3,2,1,6,2,2,3,3,3,7,6,... obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr natural n printr-un grup de numere, după următoarele reguli: numărul prim p este înlocuit prin numerele p,p-1,...3,2,1, iar numărul compus c este înlocuit prin c urmat de toţi divizorii săi proprii, un divizor d repetându-se de d ori. Dându-se numărul natural n, se cere să se tipărească primele n numere din şirul dat. Specificarea problemei. Se dă un număr natural n şi şirul de numere naturale descris mai sus. Se cere tipărirea primelor n numere din şirul dat. Aparent problema este complet specificată, ceea ce nu e complet adevărat. Ne dăm seama de acest lucru dacă încercăm să precizăm ce rezultate se vor reţine în memoria calculatorului. Este posibil ca în memorie să reţinem toate numerele cerute într-un vector X sub forma Y = ( y , y ,..., y )1 2 n 21, sau să nu le reţinem în memorie ci doar să le afişăm pe ecran. De fapt există o variantă simplificată a problemei de mai sus în care se cere să se obţină doar al n-lea număr din şirul dat. Specificarea problemei, pentru tipărirea celor n numere, fără reţinerea lor în memorie. DATE n; { nN, n>0 } REZULTATE afişarea primelor n numere din şirul menţionat. Pentru a concepe un algoritm de rezolvare, în ambele variante se parcurge şirul dat, reţinând sub numele t termenul curent al şirului, iar sub numele i poziţia acestui termen în vector. Prin k vom nota numărul natural din care se obţine grupul de termeni din care face parte t, iar prin j indicele lui t în acest grup. Indicatorul ind va primi valoarea 1 dacă numărul k este prim şi 0 în caz contrar. Algoritmul pentru rezolvarea problemei este dat în continuare. Algoritmul GENERARE1 este: { varianta1 } DATE n; { nN, n>0 } Fie i:=1; t:=1; tipăreşte t; k:=2; ind:=1; { Pentru cazul k este prim } Câttimp i<n execută * execută t:=termenul următor din şir; i:=i+1; Tipăreşte t sf-câttimp; sf-algoritm Pentru a genera următorul termen din şir va trebui să ţinem seama de valoarea lui ind, prin care ştim dacă numărul k este prim sau nu este prim. Pentru a decide dacă un număr k este prim sau nu, vom verifica dacă k se divide cu un număr mai mic decât el şi diferit de 1. Secvenţa de propoziţii prin care se calculează valoarea lui ind este următoarea: Fie ind:=0; Pentru j:=2,k/2 execută Dacă k mod j = 0 atunci ind:=1 sf-dacă sf-pentru Ţinând seama de cele menţionate mai sus ajungem la următoarea variantă a algoritmului: Algoritmul GENERARE1 este : { varianta finală }
15. 15. 20 DATE n; { nN, n>0 } Fie i:=1; t:=1; Tipăreşte t; k:=2; ind:=1; Cât timp i<n execută t:=k; Dacă ind=1 atunci Cât timp (i<n) şi (t1) execută i:=i+1; Tipăreşte t; t:=t-1 sf-cât timp altfel d:=2; i:=i+1; Tipăreşte k; Cât timp d<k şi i<n execută Dacă k mod d = 0 atunci j:=1; t:=d; Repetă i:=i+1; Tipăreşte t; j:=j+1; până când j>d sf-repetă sf-dacă d:=d+1 sf-cât timp; sf-dacă k:=k+1; Fie ind:=1; Pentru j:=2,k-1 execută Dacă k mod j = 0 atunci ind:=0 sf-dacă sf-pentru sf-cât timp sf-algoritm. Pentru a reţine termenii doriţi într-un şir Y este suficient să înlocuim propoziţia "Tipăreşte t" prin propoziţia " iY 22:=t". Transcriind în Pascal se obţine următorul program: Program SIR; { Programul 2.2. Tipăreşte n termeni dintr-un şir } Var n, { Numărul termenilor ce trebuie tipăriţi } i, { Contor = numărul termenilor tipăriţi } j, { Contor = de cate ori s-a tipărit d ! } k, { Număr natural din care se obţin ultimii termeni } d, { d va lua ca valori divizorii lui k } t, { t = termenul curent din şir } ind : integer; { indicator ce retine daca este k prim } Begin for i:=1 to 20 do writeln; Writeln('Se tipăresc n termeni dintr-un şir'); write('Daţi n='); Readln(n); i:=1; t:=1; write(t); k:=2; ind:=1; While i<n do begin t:=k; If ind=1 then while (i<n) and (t>=1) do begin i:=i+1; write(t:5); t:=t-1; end else begin d:=2;
16. 16. 21 i:=i+1; write(k:5); while (d<k) and (i<n) do begin If k mod d = 0 then begin j:=1; t:=d; Repeat i:=i+1; write(t:5); j:=j+1 until j>d; end; d:=d+1 end; end; k:=k+1; ind:=1; For j:=2 to k-1 do If k mod j = 0 then ind:=0; end {while}; readln(d); end. 2.3. PROBLEME PROPUSE. Pentru problemele propuse mai jos se cere să se descrie în limbajul Pseudocod un algoritm de rezolvare, precizând şi semnificaţia variabilelor folosite. De asemenea, să se scrie programul Pascal corespunzător. 2.1. Se dă numărul natural n > 1. Să se genereze toţi divizorii pozitivi 1 2 md ,d ,...,d 23 ai numărului n. 2.2. Să se genereze toate numerele prime mai mici decât numărul natural n dat. 2.3. Se dau m,n   +. Să se determine primele n cifre din scrierea fracţiei 1/m ca fracţie zecimală. 2.4. Se dă numărul natural m > 1. Să se formeze vectorul ale cărui componente sunt primele m numere din şirul lui Fibonacci, definit prin n1=n2=1 şi nk+1=nk+nk-1 pentru k=2,3,... . 2.5. Se dă numărul natural n > 1. Să se tipărească triunghiul lui Pascal, având în linia m toate combinările C(m,k) de m obiecte luate câte k, k=0,m, pentru m=1,2,...,n. Se va folosi relaţia de recurenţă: C(m,k) = C(m-1,k)+C(m-1,k-1) deci elementele liniei m se calculează din elementele liniei m-1 (precedente). 2.6. Se dau m,k   +. Să se determine numărul n al cifrelor şi cele n cifre din scrierea numărului întreg mk = (c1c2c3...cn)10. 2.7. Se dau numărul natural n > 1 şi X   n . Să se determine indicele componentei minime şi indicele componentei maxime din X. 2.8. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se găsească toate poziţiile 1 2 k p , p ,..., p 24 pe care se află valoarea maximă. 2.9. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se verifice dacă numerele date sunt în progresie aritmetică sau geometrică, calculând indicatorul Ind definit astfel: Ind = 1, dacă numerele sunt în progresie aritmetică, Ind = 2, dacă numerele sunt în progresie geometrică, Ind = 3, în caz contrar. 2.10. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se găsească media numerelor date, numărul valorilor pozitive, produsul valorilor negative şi să se tipărească numerele mai mari decât 100.
17. 17. 22 2.11. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se ordoneze crescător primele k numere şi descrescător celelalte numere, pentru k dat, k{1,2,...,n}. 2.12. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se găsească toate numerele distincte 1 2 m y , y ,..., y 25 din şirul X precum şi frecvenţele acestor numere între numerele date. 2.13. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se calculeze yj=x1*x1+x2*x2+...+xj*xj, pentru j=1,2,...,n şi M = max{xj*yj  j=1,n }. 2.14. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se determine cel mai mare număr negativ şi poziţiile pe care se află el în şirul dat. 2.15. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se calculeze i j j 1 2 i y = {x|x >0,j=1,i}, i (x+x+...+x)/i, i max daca estepar daca esteimpar      26 pentru i=1,2,...,n. 2.16. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se formeze vectorul Y=(y1,y2,...,yn), unde yi ia valoarea 1 dacă xi, xi+1, xi+2 pot fi lungimile laturilor unui triunghi şi 0 în caz contrar, pentru i=1,2,...,n. Numerele xn+1, xn+2 se iau egale cu xn. 2.17. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se determine i j i y = {x|j=i,n}, i m, i max daca estepar daca esteimpar      27 unde mi este numărul componentelor vectorului X egale cu xi, pentru i=1,2,...,n. 2.18. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se calculeze componentele vectorului Y = ( y , y ,..., y ).1 2 n 28 Componenta yi este media aritmetică a componentelor pozitive de rang mai mic sau egal cu i ale vectorului X, în cazul în care există componente pozitive, respectiv -1 în caz contrar. 2.19. Se dau numărul natural n > 1 şi numerele x1, x2, ..., xn. Să se calculeze yi pentru i=1,n, ştiind că y1 = (x1+x2)/2, y2 = (x1+x2+x3)/3, yn = (xn-1+xn)/2, yn-1 = (xn-2+xn-1+xn)/3, iar yk este media numerelor xk-2, xk-1, xk, xk+1, xk+2, pentru k=3,4,...,n-2. 2.20. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se determine numărul k al numerelor negative din şirul X şi mediile vi pentru i=1,2,...,k-1. Prin vi s-a notat media numerelor pozitive cuprinse între al i-lea şi al i+1-lea număr negativ, dacă există numere pozitive, respectiv 0 în caz contrar. 2.21. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se reţină toate numerele distincte y1,y2,...,yk şi să se calculeze frecvenţele de apariţie ale acestor numere în şirul dat.
18. 18. 23 2.22. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se determine vectorul Y=(y1,y2,...,yn), unde yi este egal cu numărul valorilor din şirul dat mai mari decât xi, pentru i=1,n. 2.23. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Dacă yi este numărul termenilor mulţimii {xjxj<xi ,j<i}, să se determine vectorul Y=(y1,y2,...,yn). 2.24. Se dau numărul natural n > 1 şi X   n . Să se determine vectorul Y=(y1,y2,...,yn), unde yi este poziţia valorii minime în secvenţa de numere x1,x2,...,xi (cea mai mică dacă există mai multe poziţii). 2.25. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se calculeze primele k momente m1, m2,..., mk. Prin momentul de ordinul j, notat mj, se înţelege media aritmetică a puterilor de exponent j ale numerelor date. 2.26. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Dacă m1 şi m2 sunt primele două momente (vezi problema 2.25) să se calculeze s, unde s2 =m2-m1*m1 şi fj, j=1,9, dacă fk este numărul elementelor mulţimii {x | m - k* s < x < m +k* s}i 1 i 1 29. 2.27. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Secvenţa xi, xi+1,..., xi+p se numeşte scară (de lungime p) dacă xi<xi+1<...<xi+p. Se cere să se tipărească cea mai lungă scară din şirul dat şi poziţia i din şir la care începe această scară. 2.28. Se dau numărul natural n > 1 şi numerele x1, x2,..., xn. Să se găsească permutarea o1, o2,..., on a indicilor 1,2,...,n astfel încât 1 2 no o ox x ... x .≥ ≥ ≥ 30 2.29. Se dau a   , n   şi numerele reale x1, x2,..., xn. Să se determine cardinalul (numărul elementelor) mulţimii { i | x a }i ≥ 31 şi indicatorul r definit astfel: r = i, dacă există i pentru care a=xi, (cel mai mic i) r = 0, în caz contrar. 2.30. Se dau a   , n   şi numerele reale x1, x2,..., xn. Să se determine indicele i (cel mai mic, dacă există mai mulţi) pentru care valoarea xi este cea mai apropiată de a. 2.31. Se dau a  , n   şi numerele reale x1, x2,..., xn. Să se rearanjeze aceste numere astfel încât toate numerele mai mici decât a să fie înaintea tuturor numerelor egale cu a sau mai mari decât a, cu cât mai puţine schimbări, deci fără a ordona tot şirul. 2.32. Se dau a  , n   şi numerele reale x1, x2,..., xn. Să se determine vectorul Z cu componentele i 1 2 i i i i+1 n i z = x +x +...+x , x > a, {x ,x ,...,x }, x a. daca max daca   ≤    32 2.33. Se dau a  , n   şi numerele reale 1 2 nx , x ,..., x 33. Să se elimine din şirul X toate elementele mai mici decât a. 2.34. Se dau a  , n   şi numerele reale 1 2 nx , x ,..., x 34. Să se ordoneze numerele date crescător după distanţa lor faţă de numărul real a. 2.35. Se dau n   , numerele reale a, b, a<b, şi vectorul X cu componente reale 1 2 nx , x ,..., x 35. Să se determine media aritmetică a componentelor lui X aflate în intervalul [a,b] şi să se listeze perechile (i,x )i 36 pentru care ix 37 [ a,b].
19. 19. 24 2.36. Se dau n  , numerele reale a, b, a<b, şi vectorul X cu componente reale 1 2 nx , x ,..., x 38. Să se reţină în vectorul Y= (y1,y2,...,yk), toate componentele vectorului X care aparţin intervalului [a,b]. 2.37. Se dau n  , numerele reale a, b, a<b, şi vectorul X cu componente reale 1 2 nx , x ,..., x 39. Să se găsească minimul şi maximul numerelor mai mici decât b, apoi să se elimine din vectorul X toate componentele care nu aparţin intervalului [a,b]. 2.38. Se dau n   şi numerele reale i ix , y 40, i=1,n. Să se calculeze d = |x - y |+|x - y |+...+|x - y |1 1 2 2 n n 41 şi v = { { x , y }| i = 1,n}i imax min 42. 2.39. Se dau n   şi numerele reale i ix , y 43, i=1,2,...,n. Să se reţină în 1 2 ki , i ,..., i 44 toate poziţiile p pentru care xp=yp. 2.40. Se dau n   şi numerele reale i ix , y 45, i=1,2,...,n. Să se calculeze i i i i i i i z = {x +y }, x , {x +y }, x , max daca max daca   ≤ >    0 0 46 pentru i=1,2,...,n. 2.41. Se dau n   şi numerele reale i ix , y 47, i=1,2,...,n. Să se calculeze m=( x + x +...+ x ) / n1 2 n 48 şi d = ( x * x + x * x +...+ x * x ) / n1 1 2 2 n n 49 şi să se tipărească toţi indicii i pentru care |x - m|< 3di 50. 2.42. Se dau n   şi numerele reale i ix , y 51, i=1,2,...,n. Să se calculeze i i i 1 2 i z = x+y, i , {x,x,...,x}, i , daca esteimpar max daca estepar      52 pentru i=1,2,...,n şi v = { z , z ,..., z }1 2 nmin 53. 2.43. Se dau n   şi numerele reale i ix , y 54, i =1,2,...,n. Să se calculeze
20. 20. 25 i i i i i i i i i c = x , x < y , 0 , x = y , y , x > y , daca daca daca         55 pentru i=1,2,...,n. 2.44. Se dau n   şi numerele reale i ix , y 56, i=1,2,...,n. Să se calculeze i 1 2 i i i i i i n i i z = (x + x +...+x )/ i, x < y , 0, x = y , {|y |,...,|y |}, x > y , daca daca max daca         57 pentru i=1,2,...,n. 2.45. Se dau n   şi numerele reale i ix , y 58, i=1,2,...,n. Să se calculeze E = {|x |,| y | } + ...+ {|x |,| y |},1 1 n nmin min 59 şi să se determine elementele mulţimii { i | x * x > E}i i 60. 2.46. Se dau n   şi numerele reale i ix , y 61,i=1,2,...,n. Să se calculeze 2.47. s1 = ( y + y + ... + y ), s2 = ( y * x + y * x +...+ y * x ) / s1, s3 = ( y * x * x + y * x * x +...+ y * x * x ) / s1, 1 2 n 1 1 2 2 n n 1 1 1 2 2 2 n n n 62 şi m = cardinalul mulţimii { x | 3(s3- s2* s2) > |x - s2|}i i 63. 2.47. Se dau n   şi numerele reale i ix , y 64, i=1,2,...,n. Să se formeze vectorul Z cu componentele i 1 2 i i i i 1 2 i i z = {x +x +...+x )/i,y }, y 0, {x ,(y +y +...+y )/i}, y < 0, max daca min daca   ≥   65 pentru i=1,2,...,n. 2.48. Se dau n   şi numerele reale i ix , y 66, i=1,2,...,n. Să se calculeze
21. 21. 26 i 1 2 i i i 1 2 i i i i i+1 n i i z = { x , x ,..., x }, x < y , { {x ,x ,...,x }, 0}, x = y , { y , y ,..., y }, x > y , max daca max min daca min daca         67 pentru i=1,2,...,n. 2.49. Se dau n   şi numerele reale i ix , y 68, i=1,2,...,n. Să se calculeze i 1 2 i i i i 1 2 i i i i i+1 n i i i c = (x +x +...+x )/ i, x y < 0, {x ,y ,y ,...,y }, x y = 0, {x ,x ,...,x ,y }, x y > 0, daca max daca min daca         69 pentru i=1,2,...,n. 2.50. Se dau n   şi numerele reale i ix , y 70, i=1,2,...,n. Să se reţină poziţiile 1 2 ki , i , ... , i 71, pe care cei doi vectori coincid. Să se elimine din vectorii X şi Y termenii de pe aceste poziţii. 2.51. Se dau n   şi numerele reale i ix , y 72, i=1,2,...,n. Să se determine vectorul M = ( m ,m ,...,m )1 2 n 73, unde im 74 este poziţia componentei maxime a vectorului ( x ,x ,...,x , y , y ,..., y )1 2 i i i+1 n 75 (dacă există mai multe, poziţia primei valori maxime). 2.52. Se dau n   şi X,Y   n . Să se determine poziţiile i0 şi j0 cu următoarea proprietate: există m componente consecutive din cei doi vectori, începând cu poziţiile i0, respectiv j0, care coincid şi m este cel mai mare posibil. În cazul în care nu există poziţii cu această proprietate, i0 şi j0 vor fi n+1. 2.53. Se dau n   şi numerele reale i ix , y 76, i=1,2,...,n. Să se calculeze E = |x - y | + |x - y | + ... + |x - y |1 1 2 2 n n 77 şi i i i i i i i 1 2 i i i i i+1 n i i i c = x /( y * y +1), |x - y | < E, {x ,y ,y ,...,y }, |x - y | = E, {x ,x ,...,x ,y }, |x - y | > E, daca max daca min daca         78 pentru i=1,2,...,n. 2.54. Se dau n   şi numerele reale i ix , y ,79 i=1,2,...,n. Dacă 1 2 n 1 2 nx < x <...< x si y < y <...< y 80 să se depună direct toate numerele distincte în şirul Z ordonat crescător: 1 2 kz < z < ... < z 81,
22. 22. 27 deci fără a mai fi necesară ordonarea şirului Z. 2.55. Se dau a  , n   şi perechile ( x , y )i i 82, i=1,2,...,n de numere reale. Să se determine numărul punctelor (xi,yi) din plan care se află în interiorul cercului de rază a şi centru (0,0). 2.56. Se dau a   , n   şi perechile ( x , y ),i i 83 i=1,2,...,n de numere reale. Să se determine indicii 1 2 ki ,i ,...,i 84 pentru care punctele ( x , y )i i 85 din plan se află în interiorul cercului de rază a şi centru (0,0). 2.57. Se dau a   , n   şi perechile ( x , y )i i 86, i=1,2,...,n de numere reale. Să se calculeze numărul m al valorilor yi mai mari decât a şi i 1 2 i i i 1 1 2 2 i i z = (x +x +...+x )/ i, i < m, {0, x , y }, i = m, |x - y |+|x - y |+...+|x - y |, i > m. daca max daca daca         87 pentru i=1,2,...,n. 2.58. Se dau m,n   şi cifrele zecimale ia ,88 i=1,2,...,m şi jb ,89 j=1,2,...,n. Dacă numerele întregi A şi B au reprezentările în baza 10 date de aceste cifre, deci A = ( a a ...a ) si B = ( b b ...b ) 1 2 m 10 1 2 n 10 90 să se calculeze cifrele ic ,91 i=1,2,...,r, ale reprezentării numărului întreg C=A+B. 2.59. Se dau m,n   şi cifrele zecimale ia ,92 i=1,2,...,m şi jb ,93 j=1,2,...,n. Dacă A şi B sunt numerele definite în problema 2.58, să se determine indicatorul kod definit astfel: kod = -2, dacă cel puţin o valoare ia 94 nu este corectă, kod = -1, dacă cel puţin o valoare ib 95 nu este corectă, kod = 0 , dacă A = B, kod = 1 , dacă A < B, kod = 2, dacă A > B. 2.60. Se dau m,n   şi cifrele zecimale ia ,96 i=1,2,...,m şi jb ,97 j=1,2,...,n. Dacă numerele reale A şi B au reprezentările în baza 10: A = ( a a ...a ,a ...a )1 2 r r+1 m 10 98 B = ( b b ...b ,b ...b )1 2 s s+1 n 10 99 pentru r<m şi s<n daţi, să se calculeze indicatorul kod egal cu -1 dacă datele iniţiale sunt greşite, 0 dacă A < B, 1 dacă A = B, respectiv 2 dacă A > B. 2.61. Se dă n  , n>1. Dacă X este şirul: 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, ... obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr natural k cu secvenţa de numere 1, 2, 3, ..., k, să se construiască vectorul V = ( v ,v ,...v )1 2 n 100 ştiind că cele n componente ale sale sunt primii n termeni ai şirului X. 2.62. Se dă n  , n>1. Dacă X este şirul:
23. 23. 28 3, 5, 5, 7, 11, 13, 17, 19, ... obţinut prin scrierea tuturor numerelor prime p şi q, unde p şi q sunt gemeni, adică numere prime cu q-p=2, să se construiască vectorul V = ( v ,v ,...v )1 2 n 101 ştiind că cele n componente ale sale sunt primii n termeni ai şirului X. 2.63. Se dă n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 102 ştiind că cele n componente ale sale sunt primii n termeni ai şirului: 3, 4, 5, 5, 12, 13, 6, 8, 10, ... obţinut prin scrierea consecutivă a tuturor tripletelor de numere pitagorice p, q, r, p<q<r, triplete ordonate după suma p+q+r. Numerele p, q, r se numesc pitagorice dacă 2 2 2 p + q = r 103. 2.64. Se dau m,n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 104 ştiind că cele n componente ale sale sunt primii n termeni consecutivi ai şirului X: 1, 2, 3, 4, 2, 5, 6, 2, 3, 7, 8, 2, ... obţinut prin scrierea numerelor naturale şi a divizorilor proprii ai acestor numere, începând cu mx 105 (fără a reţine termenii ix 106 în calculator). 2.65. Se dau m,n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 107 ştiind că cele n componente ale vectorului V sunt termeni consecutivi ai şirului X: 1,1,2,1,2,3,4,4,4,4,1,2,3,4,5,6,6,... obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr natural prim p prin secvenţa 1,2,...,p şi a numărului neprim c prin scrierea lui de c ori, începând cu mx 108 (fără a reţine termenii ix 109 în calculator). 2.66. Se dau m,n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 110 ştiind că cele n componente ale vectorului V sunt termeni consecutivi ai şirului X: 1, 2, 2, 3, 3, 3, 4, 5, 5, 5, 5, 5, 6, 7, ... obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr prim p cu un grup de p numere toate egale cu p, începând cu mx 111 (fără a reţine termenii ix 112 în calculator). 2.67. Se dau m,n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 113 ştiind că cele n componente ale vectorului V sunt termeni consecutivi ai şirului X: 1, 2, 3, 4, 2, 2, 5, 6, 2, 3, 3, 3, 7, 8, 2, ... obţinut prin scrierea numerelor naturale şi a divizorilor proprii ai acestor numere, ultimul divizor d repetându-se de d ori, începând cu mx 114 (fără a reţine termenii ix 115 în calculator). 2.68. Se dau m,n  , n>1. Să se construiască vectorul V = ( v ,v ,...v )1 2 n 116 ştiind că cele n componente ale vectorului V sunt termeni consecutivi ai şirului X: 1, 2, 3, 2, 5, 2, 3, 7, 2, 4, 3, 2, 5, 11, ... obţinut prin scrierea numerelor naturale şi înlocuirea fiecărui număr compus prin toţi divizorii săi proprii, începând cu mx 117 (fără a reţine termenii ix 118 în calculator). 2.69. Se dau n   şi seria n=1 1 3n-2 1 3n-1 1 3n . ∞ ∑ 119 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 120 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 20 i 20+5iv = s , v = s ,121 i=2,3,...,n, unde ks 122 este suma primilor k termeni. 2.70. Se dă n   şi seria
24. 24. 29 n=1 n-1 2n-1 2n-1(-1 ) 4 2n-1 1 2 + 1 3 ∞ ∑       123 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 124 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 20 i 20+5iv = s , v = s ,125 i=2,3,...,n, unde ks 126 este suma primilor k termeni. 2.71. Se dau n   şi se cunoaşte seria 3 3 2 (1+ 1 6 + 1* 2 6* 10 + 1* 2* 3 6* 10* 14 +... ) 127 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 128 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 20 i 20+5iv = s , v = s ,129 i=2,3,...,n, unde ks 130 este suma primilor k termeni. 2.72. Se dau n,m   şi se cunoaşte seria 2 1+ 1 3 + 1* 2 3* 5 + 1* 2* 3 3* 5* 7 +...       131 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 132 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 20 i 20+miv = s , v = s ,133 i=2,3,...,n, unde ks 134 este suma primilor k termeni. 2.73. Se dau n,m   şi se cunoaşte seria ∑ i 2 3u = 1+ 1 3 1 9 + 1 5 1 9 + 1 7 1 9 +...135 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 136 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 20 i 20+miv = s , v = s ,137 i=2,3,...,n, unde ks 138 este suma primilor k termeni. 2.74. Se dau n,m,l   şi se cunoaşte seria 1+ 1 3* 3 + 1* 2 3* 5* 5 + 1* 2* 3 3* 5* 7* 7 + 1* 2* 3* 4 3* 5* 7* 9* 9 +...139 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 140 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 m i m+l*iv = s , v = s ,141 i=2,3,...,n, unde ks 142 este suma primilor k termeni. 2.75. Se dau n,m,l   şi se cunoaşte seria 1+ 1 3* 3 + 1* 2 3* 5* 5 + 1* 2* 3 3* 5* 7* 7 + 1* 2* 3* 4 3* 5* 7* 9* 9 +...143 Să se construiască vectorul V = ( v ,v ,...,v )1 2 n 144 ştiind că cele n componente ale vectorului V sunt sume parţiale ale acestei serii, 1 l i l+miv = s , v = s ,145 i=2,3,...,n, unde ks 146 este suma primilor k termeni. 2.76. Se cunoaşte seria convergentă din problema 2.69. Să se determine suma parţială sn a primilor n termeni
25. 25. 30 pentru care |s - s | <n n-1 ε 147 pentru dat, n fiind cel mai mic număr natural posibil. 2.77. Se cunoaşte seria convergentă din problema 2.70. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 148 pentru dat, n fiind cel mai mic număr natural posibil. 2.78. Se cunoaşte seria convergentă din problema 2.71. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 149 pentru dat, n fiind cel mai mic număr natural posibil. 2.79. Se cunoaşte seria convergentă din problema 2.72. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 150 pentru dat, n fiind cel mai mic număr natural posibil. 2.80. Se cunoaşte seria convergentă din problema 2.73. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 151 pentru dat, n fiind cel mai mic număr natural posibil. 2.81. Se cunoaşte seria convergentă din problema 2.74. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 152 pentru dat, n fiind cel mai mic număr natural posibil. 2.82. Se cunoaşte seria convergentă din problema 2.75. Să se determine suma parţială sn a primilor n termeni pentru care |s - s | <n n-1 ε 153 pentru dat, n fiind cel mai mic număr natural posibil. 2.83. Să se tipărească primii n termeni ai şirului (xk) definit de relaţia de recurenţă k k-1 k-1x = ( x + a / x ) / 2, pentru a şi x0 numere reale date, pentru care |x - x |< 0.00001,n n-1 155 n fiind cel mai mic posibil. 2.84. Să se tipărească primii n termeni ai şirului (xk) definit de relaţia de recurenţă k k-1 k-1 m-1x = 1 m * (m-1)x + a x ,       156 pentru m   şi a, x0   daţi, pentru care |x - x |< 0.00001,n n-1 157 n fiind cel mai mic posibil. 2.85. Să se tipărească primii n termeni ai şirului (xk) pentru care |x - x |< 0.00001,n n-1 158 n fiind cel mai mic posibil, în cazul şirului n 3 5 n 2n+1 x = x - x 3 + x 5 - ...+(-1 ) * x 2n+1 159 pentru x   dat. 2.86. Să se tipărească primii n termeni ai şirului (xk) pentru care |x - x |< 0.00001,n n-1 160 n fiind cel mai
26. 26. 31 mic posibil, în cazul şirului n 2 n x = 1+ x + x 2! +...+ x n! 161 2.87. Să se tipărească primii n termeni ai şirului (xk) pentru care |x - x |< 0.00001,n n-1 162 n fiind cel mai mic posibil, în cazul şirului n 2 n x = 1+ x + x 2! +...+ x n! 163 pentru x   dat. 2.88. Să se tipărească primii n termeni ai şirului (xk) pentru care |x - x |< 0.00001,n n-1 164 n fiind cel mai mic posibil, în cazul şirului n 3 2n+1 2n+1 x = x - x 3! + ... +(-1 ) * x (2n+1)! 165 pentru x   dat. 2.89. Se dă f  C2 [a,b]. Ştiind că ecuaţia f(x) = 0 admite o soluţie unică r în intervalul [a,b] şi că f' şi f" nu-şi schimbă semnul pe [a,b], să se aproximeze r folosind metoda tangentei (a lui Newton), deci folosind faptul că r = lim xn n unde n+1 n n nx = x - f( x ) / f ( x ),′ 166 n=0,1,2,... iar x0 este ales unul din capetele intervalului [a,b], notat cu c, şi anume cel pentru care f(c)*f"(c)>0. 2.90. Fie f:[a,b] -->  o funcţie continuă. Se ştie că ecuaţia f(x) = 0 are o singură rădăcină în intervalul [a,b]. Să se construiască şirul de intervale [ x , y ]i i 167, i =1,2,...,n, definit astfel: 1. [ x , y ] = [a,b]0 0 168 ; 2. [ x , y ]i i 169 se obţine împărţind intervalul [ x , y ]i-1 i-1 170 în trei părţi egale şi luând partea care conţine rădăcina; 3. n este cel mai mic număr natural pentru care n ny - x 171<eps, pentru eps număr pozitiv dat.
27. 27. 32
28. 28. 33 CAPITOLUL 3 PROBLEME REZOLVATE CU AJUTORUL VECTORILOR 3.1. NUMĂRUL PUNCTELOR DIN CERC Se dau n puncte în plan şi un cerc. Se cere numărul punctelor care se află în interiorul cercului. Rezolvare Punctele se dau prin coordonatele (xi,yi), i=1,2,...,n. Variabila nr va conţine numărul punctelor din interiorul cercului, care se dă prin centrul O(a,b) şi raza r. Deci specificarea problemei este: DATE n, { numărul punctelor date } (xi,yi, i=1,n), { coordonatele celor n puncte } a,b, { coordonatele centrului cercului } r; { raza cercului dat } REZULTATE nr; { numărul punctelor aflate în interiorul cercului } Pentru a calcula valoarea lui nr se iniţializează cu 0 acest număr şi se verifică care dintre punctele (xi,yi) au distanţa faţă de (a,b) mai mică decât r, deci se află în cerc. Pentru fiecare răspuns afirmativ valoarea lui nr se măreşte cu 1. Algoritmul pentru rezolvarea problemei este dat în continuare. Algoritmul PUNCTE_IN_CERC este : DATE n, { numărul punctelor date } (xi,yi, i=1,n), { coordonatele celor n puncte } a,b, { coordonatele centrului cercului } r; { raza cercului dat } Fie nr:=0; Pentru i:=1,n execută Dacă 2 i 2 i 2 ( x - a) +( y - b) < r 172 atunci nr:=nr+1 sf-dacă sf-pentru REZULTATE nr; { numărul punctelor aflate în interiorul cercului } sf-algoritm. Programul PASCAL este dat în continuare. Program Nr_Puncte_în_cerc; {Programul 3.1 Nr. puncte într-un cerc} var n, { numărul punctelor date } i, { variabila de lucru - contor } nr : integer; { numărul punctelor aflate in cerc } a,b, { coordonatele centrului cercului } r : real; { raza cercului dat } x, { x[i] = abscisa iar } y:array [1..50] of real; { y[i] = ordonata punctului "i" } begin
29. 29. 34 clrscr; writeln('Programul numără câte dintre n puncte date'); WRITELN('se afla in interiorul unui cerc dat'); for i:=1 to 3 do writeln; repeat write('n='); readln(n) until (n in [1..50]); for i:=1 to n do begin write('x[',i:2,']='); read(x[i]); write(' y[',i:2,']='); readln(y[i]); end; writeln; writeln('Datele privitoare la cerc:'); write('abscisa='); readln(a); write('ordonata='); readln(b); repeat write('raza (>0)=?'); readln(r) until r>0; writeln; { determinarea nr. de puncte interioare cercului } nr:=0; for i:=1 to n do if (x[i]-a)*(x[i]-a)+(y[i]-b)*(y[i]-b)<r*r then nr:=nr+1; { tipărirea rezultatelor } writeln('Nr punctelor din interiorul cercului= ',nr); end. 3.2. INTERCLASARE Se dau m,n   şi vectorii X,Y de componente numere întregi, ordonate nedescrescător. Formaţi vectorul Z de dimensiune m+n, având drept componente toate componentele vectorilor X şi Y, de asemenea ordonate nedescrescător. Rezolvare Specificarea problemei este: DATE m, { numărul componentelor lui X } n, { numărul componentelor lui Y } (xi,i=1,m), {componentele vectorului X: x1  x2  ... xm} (yi,i=1,n); {componentele vectorului Y: y1  y2  ... yn} REZULTATE k, { numărul componentelor lui Z: k=m+n } (zi, i=1,k), { componentele vectorului Z. Ele sunt toate } { componentele din X şi Y. Avem z1  z2  ... zk } Pentru a forma vectorul Z observăm mai întâi că z1 este cel mai mic dintre x1 şi y1. Cât timp mai sunt componente şi în X şi în Y următorul z va fi cel mai mic dintre xi şi yj, i, respectiv j, fiind poziţiile în cei doi vectori până la care componentele au fost deja depuse în Z. Evident se va începe cu i=1 şi j=1, iar k - poziţia curentă în vectorul Z va fi iniţial tot 1. Algoritmul pentru rezolvarea problemei este dat în continuare: Algoritmul INTERCLASARE este : { Z := X interclasat cu Y } Date m, { numărul componentelor lui X } n, { numărul componentelor lui Y } (xi,i=1,m), {componentele vectorului X. Avem x1  x2 ...xm } (yi,i=1,n), {componentele vectorului Y. Avem y1  y2 ...yn }
30. 30. 35 Fie i:=1; j:=1; k:=0; Câttimp im şi jn execută Dacă xi<yj atunci k:=k+1; z[k]:=x[i]; i:=i+1 altfel k:=k+1; z[k]:=y[j]; j:=j+1 sf-dacă sf-câttimp Câttimp (i<=m) execută k:=k+1; z[k]:=x[i]; i:=i+1 sf-câttimp Câttimp (j<=n) execută k:=k+1; z[k]:=y[j]; j:=j+1 sf-cttimp Rezultate k, { k = numărul componentelor lui Z: k=m+n} (zi, i=1,k), { componentele vectorului Z. Ele sunt toate } { componentele din X şi Y şi z1  z2  ... zk } sf-algoritm Programul PASCAL este dat în continuare. PROGRAM INTERCLASARE; { Programul 3.2. Interclasarea } { componentelor vectorilor X si Y } VAR m, { numărul componentelor lui X } n, { numărul componentelor lui Y } i,j, { contori in X, respectiv Y } k: integer; { numărul valorilor găsite in Z } X,Y, { Vectori cu numerele date } Z : array[1..100] of integer; { Vector rezultat-cu } { componentele din X si Y interclasate} BEGIN { Citesc m, X } Writeln('Se dau doi vectori X şi Y'); Write('Nr.comp. lui X='); readln(m); For i:=1 to m do begin write('x(',i,')='); readln(x[i]) end; { Citesc n, Y } Write('Nr.comp. lui Y='); readln(n); For j:=1 to n do begin write('y(',j,')='); readln(y[j]) end; { Interclasarea } i:=1; j:=1; k:=0; While (i<=m) and (j<=n) do If x[i]<y[j] then begin k:=k+1; z[k]:=x[i]; i:=i+1 end else begin k:=k+1; z[k]:=y[j]; j:=j+1 end; While (i<=m) do begin k:=k+1; z[k]:=x[i]; i:=i+1 end; While (j<=n) do begin k:=k+1; z[k]:=y[j]; j:=j+1 end; Writeln; { Tipăreşte rezultatele } Writeln(' Numerele ordonate sunt'); For j:=1 to k do write(z[j]:5); readln
31. 31. 36 END. 3.3. PROBLEME PROPUSE 3.1. Se dă un polinom P(X) cu coeficienţi reali. Să se calculeze valoarea polinomului P(X) într-un punct x0 dat. 3.2. Se dă un polinom P(X) cu coeficienţi reali. Să se verifice dacă un număr dat r este rădăcina acestui polinom. 3.3. Se dă un polinom P(X) cu coeficienţi reali. Să se calculeze derivata acestui polinom. 3.4. Se dă un polinom P(X) cu coeficienţi reali. Să se calculeze derivata de ordinul k a polinomului dat. 3.5. Se dă un polinom de gradul n cu coeficienţi întregi. Să se găsească rădăcinile întregi ale polinomului dat. 3.6. Se dă un polinom de gradul n cu coeficienţi întregi. Să se găsească rădăcinile raţionale ale acestui polinom. 3.7. Se dau două polinoame P(X) şi Q(X). Să se calculeze suma lor. 3.8. Se dau două polinoame P(X) şi Q(X). Să se calculeze produsul lor. 3.9. Se dau două polinoame P(X) şi Q(X).Să se calculeze T(X)=P(Q(X)). 3.10. Se dau m,n   şi mulţimile A= {a , a ,..., a } B = {b , b ,..., b } 1 2 m 1 2 n 173 Să se calculeze C = A  B. 3.11. Se dau m,n   şi mulţimile A= {a , a ,..., a } B = {b , b ,..., b } 1 2 m 1 2 n 174 Să se calculeze C = A B. 3.12. Se dau m,n   şi mulţimile A= {a , a ,..., a } B = {b , b ,..., b } 1 2 m 1 2 n 175 Să se calculeze C = A - B. 3.13. Se dau două numere scrise în baza b. Să se calculeze suma şi diferenţa celor două numere. 3.14. Se dau două numere scrise în baza b. Să se calculeze produsul celor două numere. 3.15. Se dau două numere scrise în baza b. Să se găsească câtul şi restul împărţirii primului număr la al doilea număr. 3.16. Să se transforme un număr din baza p în baza q. 3.17. Se dă o mulţime M de n puncte în plan. Să se găsească punctul cel mai depărtat de origine.
32. 32. 37 3.18. Se dă o mulţime M de n puncte în plan. Să se ordoneze în funcţie de distanţa lor faţă de axa OX. 3.19. Se dă o mulţime M de n puncte în plan. Să se ordoneze în funcţie de distanţa lor la originea axelor de coordonate. 3.20. Se dă o mulţime M de n puncte în plan. Să se găsească triunghiul de arie minimă care are vârfurile în M. 3.21. Se dă o mulţime M de n puncte în plan. Să se găsească numărul triunghiurilor care au vârfurile în mulţimea M. 3.22. Se dă o mulţime M de n puncte în plan. Să se determine submulţimea maximă de puncte coliniare. 3.23. Se dă o mulţime M de n puncte în plan. Să se determine submulţimea maximă de puncte cu proprietatea că oricare trei sunt necoliniare. 3.24. Se dau n puncte în plan, un cerc şi o elipsă. Să se găsească punctele care sunt în interiorul cercului, dar nu se află în interiorul elipsei. 3.25. Se dau n puncte în plan şi un cerc. Să se elimine punctele care se află în interiorul cercului. 3.26. Se dau n puncte P1,P2,...,Pn în plan şi un punct M. Să se găsească câte puncte sunt la o distanţă de punctul M mai mică decât un număr real r dat. 3.27. Se dau n puncte P1,P2,...,Pn în plan şi un punct M. Să se calculeze indicatorul Kod definit astfel: Kod = 0, dacă poligonul P1P2...Pn nu este convex; Kod este pozitiv dacă poligonul este convex: Kod = 1, dacă M este interior poligonului; Kod = 2, dacă M este pe una din laturile poligonului; Kod = 3, dacă M este exterior poligonului. 3.28. Se dau coordonatele vârfurilor unui poligon convex, în ordinea lor. Să se găsească diagonala cea mai lungă. 3.31. Se dau n puncte în plan şi ecuaţia unei drepte. Să se numere câte puncte se află pe dreaptă şi să se afle punctul de distanţă maximă faţă de dreaptă. 3.32. Se dau n cercuri concentrice. Să se găsească inelul de arie maximă delimitat de două cercuri consecutive. 3.33. Se dau n puncte pe un cerc. Să se ordoneze în ordine trigonometrică inversă. 3.34. O funcţie f : {1,2,...,m} ---> {1,2,...,n} se poate reprezenta în calculator printr-un vector F=(F1,F2,...,Fm) cu m componente, unde Fi = f(i). Să se verifice dacă funcţia f, dată prin vectorul F este injectivă. 3.35. Se dă o funcţie f : {1,2,...,m} ---> {1,2,...,n} reprezentată aşa cum se menţionează în problema 3.34. Să se verifice dacă funcţia f, dată prin vectorul F este surjectivă. 3.36. Se dau funcţiile f:{1,2,...,m} --->{1,2,...,n} şi g:{1,2,...,n}---> {1,2,...,p}, reprezentate aşa cum se menţionează în problema 3.34. Să se determine compunerea celor două funcţii date. 3.37. O aplicaţie f : {1,2,...,n} ---> {1,2,...,n} bijectivă se numeşte permutare. Ea se poate reprezenta în calculator aşa cum s-a arătat în problema 3.34. Se dă o permutare f. Să se determine numărul inversiunilor permutării f. 3.38. Se dă o permutare f aşa cum s-a arătat în problema 3.37. Să se determine ordinul permutării date. Prin ordinul permutării f se înţelege cel mai mic întreg k pentru care fk este aplicaţia identică.
33. 33. 38 3.39. Se dă o permutare f aşa cum s-a arătat în problema 3.37. Să se calculeze inversa permutării f. 3.40. Se dau două permutări f şi g aşa cum s-a arătat în problema 3.37. Să se determine compunerea celor două permutări date. 3.41. La un concurs de patinaj artistic se cunosc cele n note obţinute de un concurent. Să se calculeze punctajul lui, ştiind că la calculul mediei nu se ia în considerare nota cea mai mică şi cea mai mare obţinută (o singură dată în cazul că sunt două note egale, deci se face media aritmetică a n-2 note). 3.42. Pentru cei n studenţi ai anului întâi se cunosc notele mi, i=1,n, la primul examen. Se cere să se determine numărul studenţilor cu nota 10, numărul studenţilor cu note de 8 şi 9 şi să se tipărească lista studenţilor nepromovaţi. 3.43. Pentru cele 365 de zile ale unui an se cunosc cantităţile de precipitaţii zilnice pi, i=1,365. Se cere să se determine numărul zilelor fără precipitaţii, mediile lunare şi media anuală a precipitaţiilor şi să se listeze zilele cu precipitaţii ce depăşesc cantitatea a. 3.44. Se dau m,n  , intervalele [ai-1,ai], i = 1,m şi numerele reale x1,x2, ... , xn. Prin frecvenţa fi se înţelege numărul valorilor xj care se află în intervalul [ai-1,ai]. Să se determine frecvenţele f1,f2,... ,fm şi să se listeze indicii j pentru care xj<a1 sau am< xj.
34. 34. 39 CAPITOLUL 4 PROBLEME CU MATRICE 4.1. CONSTRUIREA UNEI MATRICE Se dau numerele naturale m şi n şi un şir de numere reale X(i),i=1,2,...,m x n. Să se genereze matricea A, cu m linii şi n coloane, definită prin : a(i, j)= x (i j - i+1) , (4.1)k=1 i j k • ∑ • 176 pentru i=1,m şi j=1,n. Pentru rezolvarea problemei, algoritmul pe care-l vom descrie foloseşte un tablou unidimensional pentru şirul X şi un tablou bidimensional pentru matricea A. Deci specificarea problemei este: DATE m, {numărul liniilor matricei A} n, (numărul coloanelor matricei A} X; {vector ce conţine cele m*n numere date} REZULTATE A {Matrice de dimensiune m*n definită de (4.1)} Deoarece în expresia ce defineşte elementele matricei A numitorul este întotdeauna nenul (j=1,n este natural şi i>0, natural) nu vom avea probleme la generarea matricei. Pentru a calcula suma elementelor x(k) pentru k de la 1 la i*j vom folosi o variabilă auxiliară sum. Variabilele i,j,k sunt variabile de ciclare. Algoritmul pentru rezolvarea problemei este dat în continuare: Algoritmul MATRICE este : {Se calculează A conform formulei 4.1} Date m, n, {m*n este dimensiunea matricei cerute} X; {X=(X(i),i=1,m*n) este un vector cu m*n componente date} Pentru i:=1 la m execută Pentru j:=1 la n execută sum:=0; Pentru k:=1 la i*j execută sum:=sum+X(k) sf-pentru; A(i,j):=sum/(i*j-i+1) sf-pentru sf-pentru Rezultate A; {Matrice de dimensiune m*n definită de (4.1)} sf-algoritm Programul PASCAL corespunzător este următorul: Program matrice; { Programul 4.1. Construirea unei matrice A } Type sir=array[1..100] of real; mat=array[1..10,1..10] of real; Var m,n, {m*n este dimensiunea matricei cerute} i,j,k:integer; {variabile auxiliare}
35. 35. 40 X:sir; {X este un vector cu m*n componente date} A:mat; {Matrice de dimensiune m*n definită de (4.1)} sum:real; {variabilă auxiliară; va conţine o suma} begin Writeln('Se calculează o matrice A de dimensiune m*n'); writeln('dandu-se un vector X cu m*n componente'); write(' Daţi numărul liniilor matricei : '); readln(m); write(' Dati numărul coloanelor matricei: '); readln(n); writeln(' Daţi termenii şirului X'); for i:=1 to m*n do begin write('x(',i,')=?'); readln(x[i]) end; for i:=1 to m do for j:=1 to n do begin sum:=0; for k:=1 to i*j do sum:=sum+x[k]; a[i,j]:=sum/(i*j-i+1) end; writeln; writeln; Writeln(' Matricea rezultat este:'); writeln; for i:=1 to m do begin for j:=1 to n do write(a[i,j]:8:1); writeln end; readln end. 4.2. GENERAREA UNEI MATRICE DINTR-UN ŞIR Se dau m,n,k   şi numerele întregi x1,x2,...,xk. Se cere să se construiască o matrice A cu m linii şi n coloane astfel încât elementele matricei să fie elementele şirului în următoarea ordine: (considerăm m=3 şi n=4) x1 x6 x7 x12 x2 x5 x8 x11 x3 x4 x9 x10 În cazul în care nu există suficiente elemente în vectorul X, deci matricea nu se poate construi, se va da un mesaj de eroare. Specificarea problemei este: DATE m,n, {dau dimensiunea matricei} k, {numărul componentelor şirului X} X; {vector de dimensiune k} REZULTATE A {matrice de dimensiune m*n} Se observă că elementele şirului sunt puse în ordine pe coloane şi anume pe o coloană de sus în jos, iar pe următoarea coloană de jos în sus. Pentru a deosebi cele două cazuri vom folosi o variabilă de control notată kod care ia două valori posibile 0 şi 1. Dacă valoarea lui kod este 0 atunci pe acea coloană elementele din şir se pun începând cu prima linie şi până la linia a m-a, iar dacă valoarea lui kod este 1 atunci pe acea coloană elementele şirului se pun începând cu linia a m-a şi până la prima linie. Variabile folosite: X - vector ce conţine numerele date, de lungime k; A - matricea cerută; m,n - dimensiunile matricei; l - indice în şir; kod - variabila de control. Algoritmul corespunzător este dat în continuare.
36. 36. 41 Algoritmul MATRICE2 este: DATE m,n, {dau dimensiunea matricei} k, {numărul componentelor şirului X} X; {vector de dimensiune k} Dacă m*n>k atunci Tipăreşte('Prea puţine elemente în şir') altfel Fie j:=1; l:=1; kod:=0; Repetă Dacă kod=0 atunci kod:=1; Pentru i:=1,m execută aij:=xl; l:=l+1 sf-pentru altfel kod:=0; Pentru i:=m,1,-1 execută aij:=xl; l:=l+1 sf-pentru sf-dacă până când j>n sf-repetă REZULTATE A {matrice de dimensiune m*n} sf-dacă Programul Pascal este: Program matrice2; {Programul 4.2. Matrice dintr-un vector} Type sir = array[1..100] of integer; mat = array[1..10,1..10] of integer; Var m, n, {dimensiunile matricei} i, j, {indici linie-coloana in matricea A} k, {număr natural dat} l, {indice în şir} kod : integer; {variabila de control} X : sir; {vector ce conţine numerele date, de lungime k} A : mat; {matricea cerută} Begin Writeln{'Se constuieşte o matrice dintr-un şir de numere'); write('Daţi dimensiunile matricei:'); readln(m,n); write('Daţi dimensiunea şirului:'); readln(k); { Dacă elementele şirului nu } if m*n > k { "umplu" matricea se } then write('Prea puţine elemente in şir') { semnalează eroare } else begin for i := 1 to k do begin write('x(',i,')='); readln(x[i]) end; j:=1; l:=1; kod:=0; repeat if kod = 0 then begin for i:=1 to m do { pe coloană de sus in jos } begin a[i,j]:= x[l]; l:=l+1 end; kod:=1 {se schimba valoarea lui kod} end else begin { pe coloana } for i:=m downto 1 do { de jos in sus } begin a[i,j]:=x[l]; l:=l+1 end; kod := 0 { se schimba valoarea lui kod} end; j := j+1 until j>n; {se repeta pana când s-a completat coloana n} for i:= 1 to m do { tipăreşte linia i a matricei } begin
37. 37. 42 for j := 1 to n do write(a[i,j]:5); writeln end end end. 4.3. PROBLEME PROPUSE În cele ce urmează vom nota prin Mm,n(D) mulţimea matricelor cu m linii şi n coloane având toate elementele din domeniul D. În cazul m=n, deci al matricelor pătrate, vom nota Mn,n(D) = MPn(D). Prin Z vom nota mulţimea numerelor întregi, iar prin R mulţimea numerelor reale. Prin Vn(D) se notează mulţimea vectorilor cu n componente, toate elemente din domeniul D. 4.1. Se dă o matrice A  Mm,n(R+). Să se calculeze raportul dintre cel mai mic element şi cel mai mare element al matricei. 4.2. Se dă o matrice A  Mm,n(R). Să se adauge a (n+1)-a coloană acestei matrice, definită prin: A(i,n+1)= A(i, j) j=1 n ∑ 177 , pentru i=1,m. 4.3. Se dă o matrice A  Mm,n(R+). Să se formeze un vector cu n componente, astfel încât componenta a i-a să fie egală cu elementul maxim din coloana a i-a a matricei. 4.4. Se dă o matrice A  Mm,n(R). Să se determine linia şi coloana care conţin cel mai mic element pozitiv. 4.5. Se dă o matrice A  Mm,n(R+). Dacă vi este valoarea maximă din linia i să se calculeze: w = {v | i=1,m}imin 178. 4.6. Se dă o matrice A  Mm,n(R). Să se tipărească indicii liniilor care conţin elemente negative. Să se formeze apoi matricea B, obţinută din matricea A prin eliminarea acestor linii. 4.7. Se dă o matrice A  Mm,n(R+). Să se schimbe între ele liniile matricei A astfel ca prima coloană să devină ordonată crescător. 4.8. Se dă o matrice A  Mm,n(R+) şi un interval [,]. Să se reţină într-un vector X toate elementele matricei aflate în intervalul [,]. 4.9. Se dă o matrice A  Mm,n(R+). Pentru fiecare linie să se scadă din elementele sale valoarea minimă din acea linie. 4.10. Se dă o matrice A  Mm,n(R). Să se construiască vectorul X = ( x , x , ..., x )1 2 k 179 ce reprezintă indicii liniilor care conţin valori nule. 4.11. Se dă o matrice A  Mm,n(R). Să se tipărească matricea A completată cu o nouă coloană în care elementul din linia a i-a este egal cu cel mai mare număr negativ din linia a i-a, dacă există elemente negative, respectiv cu 10 când nu există elemente negative. 4.12. Se dă o matrice A  Mm,n(R+) şi numerele naturale l şi k (1<l<n, 1<k<m). Prin operaţii de schimbare a două linii între ele să se obţină pe coloana k elementele ordonate crescător până la linia l şi apoi descrescător. 4.13. Se dă o matrice A  Mm,n(R+) şi numerele naturale l şi k (1<k<n, 1<l<m). Prin operaţii de schimbare a două coloane între ele să se obţină pe linia k elementele ordonate descrescător până la coloana l şi apoi crescător. 4.14. Se dă o matrice A  Mm,n(R). Să se împartă elementele fiecărei linii la media aritmetică a elementelor
38. 38. 43 pozitive din linia respectivă. Dacă într-o linie nu există elemente pozitive, linia rămâne neschimbată. 4.15. Se dă o matrice A  Mm,n(R). Să se calculeze media aritmetică a elementelor matricei aflate deasupra diagonalei principale, precum şi media armonică a elementelor pozitive care se găsesc sub diagonala principală. 4.16. Se dă o matrice A  Mm,n(R+). Să se verifice dacă există două linii proporţionale în matricea dată. 4.17. Se dă o matrice A  Mm,n(R+). Să se construiască un vector X de n componente, astfel încât X(i) să fie numărul elementelor distincte din coloana a i-a, pentru i=1,2,...,n. 4.18. Se dă o matrice A  Mm,n(R+). Să se schimbe între ele liniile matricei astfel încât şirul sumelor 1 2 ms , s ,..., s 180 să fie ordonat descrescător, unde i j=1 n ijs = a , i=1,m∑ 181. 4.19. Se dă o matrice A  Mm,n(B2), unde B2 ={0,1} şi se consideră că elementele unei linii sunt cifrele unui număr întreg scris în binar. Să se găsească numerele întregi corespunzătoare liniilor matricei. 4.20. Se dă o matrice A  Mm,n(R+). Poziţia ( i , j )0 0 182 se numeşte punct şa dacă: a) 0 0i , ja 183 este maxim pe coloana j0; b) 0 0i , ja 184 este minim pe linia 0i 185. Să se tipărească toate punctele şa dacă există astfel de puncte sau un mesaj corespunzător în caz contrar. 4.21. Se dă o matrice A  Mm,n(R+). Să se formeze matricea B cu m linii şi n coloane unde ij ij 2 b = ( a - )max , unde max este cel mai mare element al matricei A. 4.22. Se dă o matrice A  Mm,n(R+). Să se formeze matricea B cu m linii şi n coloane unde ij ij i in 1j mj b = a , i< j (a 1+a +a +a )/ 4, . daca altfel     187 4.23. Se dă o matrice A  Mm,n(R+). Se dau numerele x şi y. Să se formeze matricea B cu m linii şi n coloane unde ij ij ij ij b = -1, a (x,y) 0, a {x,y} 1, a [x,y]. daca daca daca    ∈ ∈ ∉      188 4.24. Se dă A  Mm,n(R). Să se formeze matricea B cu m linii şi n coloane unde: ij ik ijb = | {a | k = 1,2,...,n}| - amax 189. 4.25. Se dă A  Mm,n(R+). Să se formeze matricea B cu m linii şi n coloane, în care elementul bij se defineşte ca suma elementelor matricei A aflate pe linia i, mai puţin elementul aflat pe coloana j.
39. 39. 44 4.26. Se dă A  Mm,n(Z). Să se formeze matricele B şi C cu m linii şi n coloane unde ij ij ij b = a , a 0, , daca estepar altfel     190 ij ij ij c = a , a 0, . daca esteimpar altfel     191 4.27. Se dă A  Mm,n(R+). Se dau numerele reale x, y, z, cu x < y < z. Să se formeze matricea B cu m linii şi n coloane, unde ij ij ij ij ij b = 0 , a < x 1 , x a < y 2 , y a < z 3 , a z. daca daca daca daca     ≤ ≤ ≥        192 4.28. Se dă A  Mm,n(R+). Să se determine vectorii B şi C definiţi astfel : i ij j i=1 m ij i b = {a | j =1,2,...,n } , i=1,2,...,m c = a b , j =1,2,...,n. max ∑ 193 4.29. Se dă A  Mm,n(Z). Fiind dat un număr natural p, să se formeze vectorul X cu m componente, unde xi reprezintă numărul elementelor din linia a i-a a matricei A care sunt divizibile cu p. 4.30. Se dă A  MPn(R). Să se determine linia l ce conţine cel mai mare element al diagonalei principale şi apoi să se schimbe linia şi coloana l cu linia, respectiv coloana întâi. 4.31. Se dă A  Mm,n(R+). Să se formeze un vector de n componente, în care componenta vi a vectorului să fie egală cu raportul dintre suma elementelor din linia i şi suma elementelor din coloana i. 4.32. Se dă A  MPn(R). Să se calculeze E=MDP-MDS, unde MDP este maximul dintre sumele elementelor aflate pe diagonale paralele cu diagonala principală, iar MDS este minimul dintre sumele elementelor aflate pe diagonalele paralele cu diagonala secundară. 4.33. Se dă A  MPn(R). Să se ordoneze liniile şi coloanele matricei astfel încât elementele de pe diagonala principală să fie ordonate crescător. 4.34. Se dă A  MPn(R). În fiecare linie să se schimbe între ele elementele care se găsesc pe diagonala principală
40. 40. 45 cu cele care se găsesc pe cea secundară. 4.35. Se dă A  MPn(R). Să se determine vectorii X şi Y cu n componente, unde: X(i) = numărul elementelor pozitive din linia i; Y(i) = numărul elementelor negative din coloana i . 4.36. Se dă AMPn(R). Să se calculeze suma primelor n puteri ale matricei A. 4.37. Se dă A  MPn(R). Să se calculeze matricea P = A*AT , unde AT reprezintă transpusa matricei A. 4.38. Se dă X  Vn(R). Să se genereze o matrice A  MPn(R) astfel încât elementele matricei să reprezinte elementele vectorului X scrise în următoarea ordine: X(1) X(2) ... X(n-1) X(n) X(4n-4) X(4n-3) ... X(.) X(n+1) . . ... . . X(3n-2) X(3n-3) ... X(2n) X(2n-1). 4.39. Se dă X  Vn(R). Să se genereze o matrice pătrată A de ordin maxim posibil, astfel încât elementele matricei să reprezinte elementele vectorului X scrise în următoarea ordine: X(1) X(2) X(5) X(10) ... X(4) X(3) X(6) X(11) ... X(9) X(8) X(7) X(12) ... X(16) X(15) X(14) X(13) ... . . . 4.40. Se dă X  Vn(R). Să se genereze o matrice A pătrată de ordinul m, cu m maxim posibil, astfel încât elementele matricei să reprezinte elementele vectorului X scrise în următoarea ordine: X(1) X(2) X(4) X(7) ... X(3) X(5) X(8) ... X(6) X(9) ... X(10) ... 4.41. Se dă X  Vn(R). Să se genereze o matrice pătrată A de ordinul m, cu m maxim posibil, astfel încât elementele matricei să reprezinte elementele vectorului X scrise în următoarea ordine: X(1) X(2) X(6) X(7) X(15) ... X(3) X(5) X(8) X(14) ... X(4) X(9) X(13) ... X(10) X(12) ... X(11) ... 4.42. Se dau m   şi X  Vn(R) pentru n=m2 . Să se construiască o matrice pătrată de ordinul m, dacă este posibil, astfel: - deasupra diagonalei principale elementele matricei sunt elementele şirului începând cu x1, scrise în ordine pe linii; - elementele de pe diagonala principală sunt ai,i = xi*i; - elementele de sub diagonala principală se calculează astfel: ai,j = max{ xj, ... , xi }. 4.43. Se dă X  V2n(R). Să se construiască o matrice pătratică de ordinul n astfel: se completează diagonala principală de sus în jos cu elemente consecutive din şir începând cu x1; deasupra diagonalei principale se completează matricea paralel cu diagonala principală, de sus în jos, cu elemente succesive din şir, începând cu xn+1, iar sub diagonala principală elementul din linia i şi coloana j a matricei este egal cu elementul xj+i al şirului. 4.44. Se dă X  V2n(R). Să se construiască o matrice pătratică de ordinul n astfel încât:
41. 41. 46 a = {x,...,x}, i {x |x<0,k=1,j}, i . i,j i n k k min daca estepar max daca esteimpar      194 4.45. Se dau m, n  . Să se formeze matricea A  Mm,n(R) din elementele şirului 1,1,2,4,3,9,27,1,4,16,5,25,125,... scrise în ordine pe linii. (Se va observa că şirul este obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr par p cu o secvenţă formată din numerele 1,p,p2 şi a numărului impar i>1 cu o secvenţă formată din numerele i,i2 ,i3 ) . 4.46. Se dau m, n  . Să se formeze matricea A  Mm,n(R) din elementele şirului 1, 2,2, 1,2,3, 4,4,4,4, 1,2,3,4,5, 6,6,6,6,6,6, 1,2, 3,4,5,6,7, 8,8,8,8,8,8,8,8, 1,2,... scrise în ordine pe coloane. (Se va observa că şirul este obţinut din şirul numerelor naturale prin înlocuirea fiecărui număr par p cu o secvenţă formată din p numere toate egale cu p şi a numărului impar i cu o secvenţă formată din numerele 1,2,...,i). 4.47. Se dau m,n   şi X  Vm*n(R). Să se genereze o matrice A  Mm,n(R) definită astfel: a = (x+x +...+x )/(ij-i+1), x > 0 {x,x ,...,x }, x 0 ij i i+1 ij i i i+1 ij i daca max daca   ≤    195 pentru i=1,2,...,m şi j=1,2,...,n. 4.48. Se dau m,n   şi X  Vm*n(R). Să se genereze o matrice A  Mm,n(R) definită astfel: a = xij l=(i-1)n+1 (i-1)n+ j l∑ 196 pentru i=1,2,...,m şi j=1,2,...,n. 4.49. Se dau 2 numere naturale m şi n. Să se construiască matricea AMm,n(R) definită astfel : 0 , dacă i+j este număr prim A(i,j) = 1 , dacă i+j este număr perfect neprim  2 , în caz contrar, pentru i=1,2,...,m şi j=1,2,...,n. 4.50. Fie B o matrice definită astfel: 0 , dacă i+j este număr prim B(i,j) =   1 , altfel, pentru i=1,2,...,m şi j=1,2,...,n şi fie matricea C de aceleaşi dimensiuni, în care linia i reprezintă numărul 2i+1 scris în baza 2. Să se determine matricea A = B + C, adunare modulo 2. 4.51. Să se construiască matricea A definită prin : cos(i*j) , dacă i*j < m*n/2 A(i,j) =   sin(i+j) , în caz contrar, pentru i=1,2,...,m şi j=1,2,...,n. 4.52. Se dă a  R şi fie M(1)=a. Să se formeze matricea pătrată A de ordinul n de forma M(1) M(12) M(11) M(10)
42. 42. 47 M(2) M(13) M(16) M( 9) M(3) M(14) M(15) M( 8) M(4) M( 5) M( 6) M( 7) (în cazul n=4) dacă M(k) = I + 10M(k-1) 2 197 pentru k = 2,3,...,n*n, unde pI 198 reprezintă răsturnatul numărului p (exemplu: răsturnatul numărului 123 este numărul 321) 4.53. Un labirint în care există numai drumuri (poteci, alei) orizontale şi verticale, se reprezintă cu ajutorul unei matrice, în care un şir de zerouri reprezintă un drum, un şir de 1 un zid. Se dă o poziţie iniţială în interiorul labirintului. Să se găsească cel mai scurt drum pe care se poate ieşi din labirint. 4.54. Se dă o matrice cu elemente cuvinte de maximum 30 de litere sau spaţii. Să se afle frecvenţa vocalelor în cuvinte: - pe linii; - pe coloane; - în matrice. 4.55. Se dau vectorii A  Vm(R) şi B  Vn(R). Să se formeze matricea CMm,n(R) dacă c(i, j) = a(k) b(k) k=1 i k= j n ∑ ∑ 199 În cazul în care numitorul este nul, c(i,j)=-1. 4.56. Se dau vectorii A  Vm(R) şi B  Vn(R). Să se formeze matricea CMm,n(R) dacă ij i j 1 m 1 n c = a * b {a ,...,a ,b ,...,b }max 200 În cazul în care numitorul este nul se ia cij = min{ai, bj}. 4.57. Se dau vectorii A  Vm(R) şi B  Vn(R). Să se formeze matricea CMm,n(R) dacă ij i i j jc = {a , b , a + b }, i = 1,2,...,m, j = 1,2,..nmax 201. 4.58. Se dau vectorii A  Vm(R) şi B  Vn(R). Să se formeze matricea CMm,n(R) dacă ij k=1 i k p=1 j pc = a b∑ ∑• 202 4.59. Se dau două matrice A,B  Mm,n(R). Să se determine matricea C  Mm,n(R) unde ij ij ijc = { a ,b } , i = 1,m j = 1,nmax 203. 4.60. Se dau două matrice A,B  MPn(R). Să se determine matricea C  MPn(R) definită prin: ij ik kjc = {a + b | k = 1,2,...,n}.min 204 4.61. Se dau două matrice A,B  Mm,n(R). Să se determine matricea CMm,n(B2) unde
43. 43. 48 ij ij ij ij ij c = 0, a b 1, a = b . daca daca   ≠   205 4.62. Se dau două matrice A,B  Mm,n(R). Să se găsească mulţimea indicilor i pentru care: j=1 n ij j=1 n ija < b .∑ ∑ 206 4.63. Se cere să se genereze matricea A, pătratică de ordinul n, definită astfel: C(j,i), dacă i<j A(i,j) =   C(i,j), în caz contrar. Prin C(n,k) s-a notat "combinări de n luate câte k". Să se verifice dacă matricea este simetrică. 4.64. Se dau n obiecte şi o matrice D = d(i,j) simetrică, d(i,j) > 0 reprezentând distanţa de la obiectul i la obiectul j (măsură a gradului de disimilaritate dintre obiectele i şi j). Să se determine toate mulţimile nevide de perechi de obiecte pentru care k-1 < d(i,j)  k ( k  , 0  k  max{d(i,j) i,j=1,...,n}). 4.65. Să se tipărească toate matricele pătrate de ordinul 4 care au un singur 1 pe fiecare linie şi pe fiecare coloană iar în rest 0. 4.66. Fie A,B,C  MPn(R) trei matrice diagonale, iar D  MP2n(R) o matrice cu structura: D = A B B C       207 X şi P fiind 2 vectori coloană de dimensiune 2n cu componente reale, să se întocmească un algoritm şi să se scrie un program pentru rezolvarea sistemului D X = P. 4.68. Se dau numerele întregi 1 2 n n x , x ,..., x [0,2 ) .∈ 208 Să se tipărească matricea pătrată de ordinul n care are proprietatea că linia a i-a a acestei matrice reprezintă numărul xi în baza doi. 4.69. Se dă A  Mm,n(B2). Să se determine numerele a căror reprezentări în baza 2 sunt date de coloanele matricei. 4.70. Se dă X  Vn(R). Să se formeze matricea A  MPn(R) cu elementele: ij k l k 2 l i i+1 j a = {x |k jsik i}, j i x >0,l= j,j+1,...,i {x |j k i}, j i x 0,l= j,j+1,...,i (x+x +...+x )/(j-i+1), j>i. max daca si min daca si daca ≥ ≤ ≤ ∃ ≤ ≤ ≤ ∃ ≤         209
44. 44. 49 CAPITOLUL 5 SUBALGORITMI 5.1. REUNIUNEA UNOR MULŢIMI Se consideră, trei mulţimi A, B, C. Se cere un program care afişează: - elementele mulţimii A în ordine crescătoare; - elementele mulţimii B în ordine crescătoare; - elementele mulţimii C în ordine crescătoare; - elementele mulţimii A B în ordine crescătoare; - elementele mulţimii B C în ordine crescătoare; - elementele mulţimii C A în ordine crescătoare. Rezolvare. Pentru realizarea programului este necesară construirea a patru proceduri specificate în continuare: - o procedură pentru citirea unei mulţimi: CIT(n,A); REZULTATE n,A {primesc valori prin citire} - o procedură pentru ordonarea unui şir: ORDON(r,X); DATE {de intrare} r, {numărul componentelor vectorului X} X; {vector cu n componente} REZULTATE X {la ieşirea din subalgoritm vom avea: } { x1 < x2 < ... < xn } - o procedură pentru calculul reuniunii a două mulţimi: REUN(n,m,A,B,nm,AUB); DATE {de intrare} n, {numărul elementelor mulţimii A} m, {numărul elementelor mulţimii B} A, {mulţimea {a1, a2, ... , an } } B; {mulţimea {b1, b2, ... , bm } } REZULTATE nm, {numărul elementelor reuniunii } AUB {AUB = A B } - o procedură pentru tipărirea unei mulţimi: TIPAR(n,A,ch); DATE {de intrare} n, {numărul elementelor mulţimii A} A, {mulţimea {a1, a2, ... , an } } ch; {caracter considerat numele mulţimii} REZULTATE afişarea elementelor mulţimii - o procedură pentru ordonarea şi apoi tipărirea unui şir: TIPORDON(r,X,ch); DATE {de intrare} r, {numărul componentelor vectorului X} X, { vector cu n componente arbitrare } ch; {caracter considerat numele mulţimii} REZULTATE *ordonarea componentelor vectorului X şi * afişarea elementelor ordonate crescător - o procedură pentru calculul reuniunii a două mulţimi, cu ordonarea şi tipărirea rezultatului: TIPREUN(n,m,A,B,nm,AUB).
45. 45. 50 aceeaşi semnificaţie ca la procedura REUN, dar, în plus, se tipăreşte AUB. Algoritmul pentru rezolvarea problemei, descris în limbajul PSEUDOCOD, este următorul: Algoritmul Exemplu1 este: Cheamă CIT(n,A); { A e vectorul care conţine în componentele } { sale cele n elemente ale mulţimii A} Cheamă CIT(m,B); { Citeşte mulţimea B} Cheamă CIT(p,C); { Citeşte mulţimea C} Cheamă TIPORDON(n,A); Cheamă TIPORDON(m,B); Cheamă TIPORDON(p,C); Cheamă TIPREUN(n,A,m,B,n1,AB); { Tipăreşte pe AB := A U B} Cheamă TIPREUN(m,B,p,C,m1,BC); Cheamă TIPREUN(p,C,n,A,p1,CA); Sf-algoritm. Subalgoritmii apelaţi mai sus sunt descrişi în continuare: Subalgoritmul ORDON(r,X) este: {Ordonează componentele lui X} Repetă {examinează toate componentele} Fie sch:= 0; {ipoteza că sunt ordonate} Pentru i:= 1, r-1 execută Dacă i i+1x > x 210 atunci Fie xx:= ix ;211 Fie i i+1x := x ;212 Fie i+1x := xx;213 Fie sch:=1; {reţine că n-au fost ordonate} sf-dacă sf-pentru pânăcând sch=0 sf-repetă sf-ORDON Subalgoritmul REUN(n,A,m,B,n1,AUB) este: {AUB := A B} Pentru i:=1, n execută i iAUB := A ; 214 sf-pentru Fie n1:=n; Pentru j=1, m execută Fie i:=1; Câttimp ( B A ) si (i n)j i≠ ≤ 215 execută i:=i+1 sf-câttimp Dacă i>n atunci Fie n1:=n1+1; 216 sf-dacă sf-pentru sf-REUN Subalgoritmul TIPORDON(r,X,ch); {Ordonează şi apoi tipăreşte} { cele n componente ale vectorului X} {ch=numele mulţimii reprezentată în vectorul X} Cheamă ORDON(p,X); Cheamă TIPAR(r,X,ch); sf-REUN Subalgoritmul TIPREUN(n,A,m,B,n1,AUB,ch) este: { AUB:= A B} {Ordonează şi tipăreşte pe AUB} Cheamă REUN(m,B,p,C,m1,BC); Cheamă TIPORDON(r,X,ch); sf-TIPREUN
46. 46. 51 Traducerea algoritmului în limbajul PASCAL este următoarea: Program exemplu1; { Programul 5.1 } {operaţii cu mulţimi reprezentate ca vectori} Type sir = array [1..30] of real; s3 = string[3]; Var n, m, p, n1, m1, p1 : integer; a, b, c, {a,b,c conţin elementele a trei mulţimi de numere } ab, bc, ca : sir; Procedure cit(var n: integer; var a: sir; ch: s3); {Citeşte n si } { mulţimea a cu n elemente} {ch=numele mulţimii citite} var i: integer; begin write('nr. elementelor mulţimii ', ch, ' este:'); readln(n); for i := 1 to n do begin write(ch, '[', i, ']='); readln(a[i]) end; end; Procedure tipar(n: integer; a: sir; {Tipăreşte mulţimea a cu} ch: s3); {numele ch având n elemente} var i: integer; begin writeln('elementele mulţimii ', ch, ' sunt:'); for i := 1 to n do writeln(ch, '[', i, ']=', a[i]); end; Procedure ordon(r: integer; {Ordonează crescător elementele} var x: sir); {vectorului X cu r componente} var xx: real; i, sch: integer; begin repeat sch := 0; for i := 1 to r-1 do if x[i] > x[i+1] then begin xx := x[i]; x[i] := x[i + 1]; x[i + 1] := xx; sch := 1 end; until sch = 0; end; Procedure tipordon(r: integer; var x: sir; nume:string); var xx: real; i, sch: integer; begin ordon(r, x); tipar(r, x, nume); end; Procedure reun(n, m: integer; A,B: sir; {Calculeaza A B} var n1:integer; var AUB:sir);
47. 47. 52 var i, j: integer; begin n1 := n ; for i := 1 to n do AUB[i] := A[i]; for j := 1 to m do begin i := 1; while (B[j]<>A[i]) and (i<=n) do i := i+1; if i > n then begin n1 := n1+1; AUB[n1] := B[j]; end; end; end; Procedure tipreun(n, m: integer; A,B: sir; {Calculează reuniunea,} var n1: integer; {ordonează elementele şi} var AUB:sir; nume:string); {tipăreşte rezultatul} var xx: real; i, sch: integer; begin reun(n, m, A, B, n1, AUB, nume); ordon(n1, AUB); tipar(n1, AUB, nume); end; Begin {programul principal} cit(n, a, 'A'); cit(m, b, 'B'); cit(p, c, 'C'); tipordon(n, a,'A'); tipordon(m, b,'B'); tipordon(p, c,'C'); tipreun(n, m, a, b, n1, ab,'AUB'); tipreun(m, p, b, c, m1, bc,'BUC'); tipreun(p, n, c, a, p1, ca,'AUC'); end. 5.2. NUMERE PRIME Să se scrie un program care determină primele n numere prime (n>3), folosind o funcţie care stabileşte dacă un număr este prim sau nu. Specificarea problemei: DATE n; {nN, n>3} REZULTATE (pj,j=1,n); {p1,p2,...,pn sunt primele n numere prime} Pentru rezolvarea problemei vom utiliza o funcţie de tip boolean "PRIM(n)" care întoarce "true" dacă numărul natural n este prim şi "false" în caz contrar. Algoritmul funcţiei are la bază ideea de a căuta divizori ai lui n între primele n/2 numere naturale. Algoritmul poate fi util în multe probleme, motiv pentru care lvom descrie ca subalgoritm ce poate fi apelat oricând este nevoie de el. Vectorul P va reţine cele n numere prime. În variabila i vom avea următorul candidat, număr natural care uneori este prim. Primele două numere prime fiind 2 şi 3, la început vom iniţializa pe i cu 5. Prin k s-a notat numărul numerelor prime găsite. Subalgoritmul NRPRIME este următorul: Subalgoritmul NRPRIME(n,P) este: {Se caută n numere prime} Fie i:=5; p1:=2; p2:=3; k:=2; Repetă
48. 48. 53 Dacă prim(i) atunci Fie k:=k+1; pk:=i; sf-dacă; Fie i:=i+2; până când k=n sf-repetă sf-NRPRIME Funcţia PRIM(n) este: prim:=true; Pentru i:=2, n/2 execută Dacă n mod i = 0 atunci prim:=false sf-dacă sf-pentru Sf-PRIM Programul PASCAL cerut este următorul: Program exemplu2; {Programul 5.2. Găseşte primele n numere prime } Type vector = array[1..999] of integer; Var n, { numărul numerelor găsite } i : integer; { variabila contor in P } P : vector; { Vectorul numerelor prime } function prim(n: integer): boolean; {Dacă n e prim atunci TRUE} var i: integer; begin prim := true; for i := 2 to n div 2 do if n mod i = 0 then prim := false; end; Procedure NRPRIME(n:integer; { In vectorul P se obţin } Var P:vector); { primele n numere prime } Var k:integer; begin i := 5; k := 2; P[1]:=2; p[2]:=3; repeat if prim(i) then begin k:= k+1; P[k]:=i end; i:= i+2; until k > n; end; begin {programul principal} write('cate numere prime va interesează?'); readln(n); NRPRIME(n,P); writeln('primele ', k, ' numere prime sunt următoarele:'); For i:=1 to n do begin write(P[i]:4); If i mod 5 = 0 then writeln end end. 5.3. PROBLEME PROPUSE