Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:laboratoare:lab05 [2018/10/29 14:54]
george.pirtoaca [Tablouri. Particularizare - vectori. Aplicaţii]
programare:laboratoare:lab05 [2021/11/08 18:27] (current)
marius.vintila [Noţiuni teoretice]
Line 1: Line 1:
 ===== Tablouri. Particularizare - vectori. Aplicaţii ===== ===== Tablouri. Particularizare - vectori. Aplicaţii =====
  
-**Responsabil:** [[andrei.parvu@cti.pub.ro|Andrei Pârvu]] ​+**Responsabili:*
 +  * [[neatudarius@gmail.com|Darius Neațu (CA 2019-2020)]] 
 +  * [[ion_dorinel.filip@cti.pub.ro|Dorinel Filip (CA 2019-2020)]] 
 +  ​* [[andrei.parvu@cti.pub.ro|Andrei Pârvu]] ​
  
-**Teste:** [[https://we.tl/t-p70L42CpHc|Link]]+**Teste:** [[https://drive.google.com/​file/​d/​11NU3wwFm7CAlkjqNBpWrYDTWqoRqEoqe/view?​usp=sharing|Link]]
 ==== Obiective ==== ==== Obiective ====
  
Line 34: Line 37:
 #define MAX 100 #define MAX 100
 ... ...
-unsigned long numbers[MAX]+unsigned long numbers[MAX];
 </​code>​ </​code>​
  
Line 43: Line 46:
 int a[3] = {1, 5, 6};                     // Toate cele 3 elemente sunt initializate ​ int a[3] = {1, 5, 6};                     // Toate cele 3 elemente sunt initializate ​
 float num[] = {1.5, 2.3, 0.2, -1.3}; ​     // Compilatorul determina dimensiunea - 4 - a vectorului float num[] = {1.5, 2.3, 0.2, -1.3}; ​     // Compilatorul determina dimensiunea - 4 - a vectorului
-unsigned short vect[1000] = {0, 2, 4, 6}; // Sunt initializate doar primele 4 elemente+unsigned short vect[1000] = {0, 2, 4, 6}; // Sunt initializate doar primele 4 elemente, iar toate celelalte sunt initializate cu valoarea 0
 </​code>​ </​code>​
  
Line 337: Line 340:
 **Următoarele două probleme vă vor fi date de asistent în cadrul laboratorului.** **Următoarele două probleme vă vor fi date de asistent în cadrul laboratorului.**
  
-[[https://​drive.google.com/​drive/folders/1qB6EZLGVubKbuTXMtMue06egH_8fo25M|Checker laborator 5]]+[[https://​drive.google.com/​file/d/16vwYGOWmvHDvj6F83lRFXXXtjbKo5ENl/​view?​usp=sharing|Checker laborator 5]]
 [[ https://​ocw.cs.pub.ro/​courses/​programare/​checker | Tutorial folosire checker laborator ]] [[ https://​ocw.cs.pub.ro/​courses/​programare/​checker | Tutorial folosire checker laborator ]]
  
Line 358: Line 361:
  
 ===== Exerciţii de Laborator ===== ===== Exerciţii de Laborator =====
-  ​[4 x 1pSe consideră ​un vector ​x cu n < 100 componenteSă se determine+  ​* **Exercitiul 1 [1 pct]:** Citiți ​un vector ​de întregi strict mai mari ca 0 de la tastaturăVă veți opri din citit elemente ale vectorului într-una din situațiile următoare
-    ​- valoarea componentei minime;​\\ ​ +    ​* Ați citit deja N = 20 de elemente 
-    ​- poziţia componentei maxime;​\\ ​  +    ​* Ațcitit de la tastatură ​valoarea 0 sau o valoare negative ​(aceasta NU trebuie adăugată în vector) 
-    - media aritmetică a componentelor;​\\ ​  +Afișați la consolă, pe câte o linie nouă, indicele fiecărei valori impare din vector împreună ​cu valoarea propriu-zisă sub forma „<​indice> ​: <valoare>La final, pe o linie nouă, afișați numărul total de elemente impare din vectorConsiderați că primul element din vector se află pe poziția 0
-    - numărul componentelor mai mari ca media aritmetică.\\ Dimensiunea vectorului, n, şelementele vectorului se citesc ​de la tastatură (cu scanf()).\\ Programul se va testa cu fişierul de intrare de mai jos (in.txt), utilizând comanda: <code bash> +<​code>​ 
-./pb1 <in.txt >out.txt +Exemplu
-</code>\\ Fişierul de intrare, in.txt<​code>  ​ + 
-50 +Input: 3 5 2 7 10 5 0 
-95 59 50 15 53 44 91 7 86 16 73 57 27 54 97 62 59 98 61 99 22 22 84 17 96 13 96 5 50 62 53 61 12 68 14 8 59 74 95 27 47 52 54 53 68 13 19  +Output: 0 3 
-</​code>​\\ Fişierul de ieşire asociat, out.txt<​code>​ + 1 : 5 
-min = 2 + 3 : 7 
-poz_max = 20 + 5 : 5 
-ma = 49.22 + Numar elemente impare: 4
-gt_ma = 30+
 </​code>​ </​code>​
-  ​[2pSă se implementeze sortarea prin selecție pe un vector citit de la tastatură. +  ​* **Exercitiul 2 [1 pct]:** Pentru ​un vector citit similar cu citirea ​de la Execițiul 1, afișdoar acele elemente din vector pentru care elementul este mai mare decât indicele ​(păstrați ordinea din vectorul inițial). Considerați că primul element din vector se află la indicele 0. 
-  - [2p] Citindu-se doi vectori ''​A'' ​și ''​B'' ​să calculeze diferența lor (elementele care sunt în ''​A'',​ dar nu sunt în ''​B''​).\\ Exemplu: ​<​code>​ +<​code>​ 
-a = [6, 4, 2, 17] +Exemplu: 
-b = [4, 6, 3, 1]+ 
 +Input: 3 5 1 7 10 5 0 
 +Output: 5 7 10
  
-Rezultat = [2, 7] 
 </​code>​ </​code>​
-  - [2p] Având un vector de N elemente să se determine subsecvența sa de suma maximă. O subsecvență a unui vector reprezintă un subșir de elemente ale acestuia aflate pe poziții consecutive. \\  
-<​hidden>​ 
-Atentie! Nu vrem soluția optimă. Se punctează cu maxim și O(n^2). 
-</​hidden>​ 
  
-Exemplu: <​code>​ +  * **Exercitiul 3 [1 pct]:** Pentru un vector citit similar cu citirea de la Execițiul 1, afișați doar acele elemente din vector cu vecinii având valori mai mici decât el (păstrați ordinea din vectorul inițial). Prin vecini pentru elementul de pe poziția i se înțelege elementul de pe poziția i – 1, respectiv i + 1, cu două excepții: primul și ultimul element din vector (care au doar câte un vecin) – pentru aceste două elemente se va considera doar vecinul existent care trebuie să întrunească condiția pentu a afișa elementul. Atenție la ultimul element din vector (care nu este 0 sau valoarea negativă citită la final ci elementul anterior) 
-4 +<​code>​ 
--4 2 3 // raspuns ​+Exemplul 1: 
-4 + 
--3 -3 4 // raspuns 8 +Input: 3 5 1 7 10 5 0 
-3 +Output: 5 10 
--1 -2 -// raspuns -1+ 
 +Exemplul 2: 
 + 
 +Input: 5 10 7 11 50 0 
 +Output: 7 10 50 
 + 
 +Exemplul ​3
 + 
 +Input: 7 0 
 +Output: 7
 </​code>​ </​code>​
 +  * **Exercitiul 4 [1 pct]:** Pentru un vector citit similar cu citirea de la Execițiul 1, calculați media aritmetică a valorilor pare din vector. Dacă toate elementele vectorului sunt impare, afișați la consolă mesajul „Niciun element par in vector!”. Folosiți 2 variabile pentru calculul mediei aritmetice: sum pentru suma elementelor și counter pentru a număra căte elemente intră în calculul mediei. Veți afișa la consolă, rezultatul folosind instrucțiunea printf(“%f\n”,​ sum / counter); Studiați și explicați ce se afișează în fiecare din situațiile următoare pentru vectorul: 3 5 4 7 2 4 0
 +    * **int sum; int counter;**
 +    * **float sum; int counter;**
 +  * **Exercitiul 5 [2 pct]:** Pentru un vector citit similar cu citirea de la Execițiul 1, implementați algoritmul de sortare Bubble Sort și afișați vectorul sortat crescător
 +<​code>​
 +Exemplu:
  
-== BONUS ==  +Input 3 5 1 7 10 5 
-- [2p] Implementați adunarea a două numere mari. Un număr mare va fi reprezentat ca un vector ''​A'',​ unde A[0] va fi numărul de cifre ale numărului, iar elementul A[i] va conține a ''​i''​-a cea mai nesemnificativă cifră. \\ Exemplu<​code>​ +Output: 1 3 5 5 7 10
-9420 // -> A[] = {4, 0, 2, 4, 9} +
-845 // -> B[] = {35, 4, 8} +
-// Suma +
-10265 // -> C[] = {5, 5, 6, 2, 0, 1}+
 </​code>​ </​code>​
 +  * **Exercitiul 6 [2 pct]:** Pentru doi vectori aflați în memorie (în scopul acestui exercițiu, puteți hardcoda în memorie cei doi vectori fără să fie nevoie de citirea lor de la tastatură),​ implementați algoritmul de interclasare. Interclasarea presupune existența a doi vectori sortați (NU uitați să apelați algoritmul de sortare de la Exercițiul 5 pe cei doi vectori inițiali dacă aceștia nu sunt sortați) care ulterior vor fi reuniți într-un singur vector de lungime egală cu suma lungimilor celor doi vectori inițiali (declarați voi acest vector rezultat), vector ce este de asemenea sortat. Soluția trebuie implementată astfel încât fiecare din cei doi vectori inițiali este parcurs o singură, iar vectorul rezultat este construit deja sortat – NU copiați elementele celor doi vectori în vectorul soluție după care să apelați vreun algoritm de sortare, generați vectorul rezultat direct sortat.
 +<​code>​
 +Exemplu:
  
-- [2p] Se citește de la tastatură un vector ''​V''​ sortat crescator de lungime ''​N''​ și apoi un șir de perechi ''​(x,​ y)''​ de numere naturale terminat cu ''​-1''​. Pe măsura citirii acestor numere, să se determine **eficient** numărul de elemente din ''​V''​ cuprinse între ''​x''​ și ''​y''​ (''​x < y''​). Folosiți o căutare binară modificată. \\ Exemplu<​code>​ +Vector ​1:  1 3 3 6 7 
-+Vector ​2: 2 3 4 4 8 
-10 20 50 80 +Output: 1 2 3 3 3 4 4 6 7 8 
-15 +</code> 
-// output +  * **Exercitiul 7 [2 pct]:** Fie N = 20. Afișați toate numere prime mai mici sau egale cu N folosind metoda ciurului lui Eratostene (https://www.pbinfo.ro/articole/2540/ciurul-lui-eratostene). 
-10 20 +<​code>​ 
-// output +Exemplu:
-19 91 +
-// output +
--1 +
-</code>\\ +
-===== Referinţe =====+
  
 +Output: 2 3 5 7 11 13 17 19
 +</​code>​
 +
 +== BONUS == 
 +  * **Bonus 1 [2 pct]:** Se dă un vector de numere naturale (hardcodat sau citit de la tastatură, la alegerea voastră). Reordonați vectorul astfel încât fiecare element par se află înaintea tuturor elementelor impare: vectorul reordonat va conține toate elementele pare din vectorul initial (în ordinea din vector) urmate de toate elementele impare (în orice ordine). NU folosiți un vector adițional pentru implementare și parcurgeți vectorul dat o singură dată pentru a genera rezultatul, iar apoi îl mai puteți parcurge o dată pentru afișare.
 +<​code>​
 +Pentru vectorul: 3 5 1 7 10 5 0
 +O soluție validă: 10 0 1 7 3 5 5
 +O soluție invalid: 0 10 1 7 3 5 5
 +</​code>​
 +  * **Bonus 2 [2 pct]:** Se dă un vector de numere naturale de lungime N în care se regăsesc toate numerele de la 1 la N - 1 (fiecare număr o singură data, cu excepția unui singur număr care apare de 2 ori; elementele NU sunt sortate). Găsiți elementul duplicat eficient. Pentru implementare,​ puteți hardcoda un vector în cod, având caracteristicile descrise în enunț. (Indiciu: suma elementelor).
 +===== Referinţe =====
 +  * [[https://​github.com/​cs-pub-ro/​ComputerProgramming/​blob/​master/​Laboratories/​Lab5/​Lab5.pdf| Cheatsheet vectori]]
   * [[http://​en.wikipedia.org/​wiki/​Binary_search | Wikipedia - Căutare binară]]   * [[http://​en.wikipedia.org/​wiki/​Binary_search | Wikipedia - Căutare binară]]
   * [[http://​en.wikipedia.org/​wiki/​Sorting_algorithm |Wikipedia - Algoritmi de sortare]]   * [[http://​en.wikipedia.org/​wiki/​Sorting_algorithm |Wikipedia - Algoritmi de sortare]]
Line 420: Line 441:
 <​hidden>​ <​hidden>​
 ===== Soluții ===== ===== Soluții =====
-{{:​programare:​laboratoare:​5-solutions.zip|}}+
 </​hidden>​ </​hidden>​
 +
 +
programare/laboratoare/lab05.1540817642.txt.gz · Last modified: 2018/10/29 14:54 by george.pirtoaca
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0