Differences

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

Link to this comparison view

programare-cc:laboratoare:05 [2020/10/26 18:22]
andreea.nica1602
programare-cc:laboratoare:05 [2023/11/07 10:57] (current)
mihai.nan [Problema 5]
Line 1: Line 1:
 ===== Laboratorul 05 - Definire și utilizare funcții ===== ===== Laboratorul 05 - Definire și utilizare funcții =====
  
-**În acest laborator veţi învăţa să:** +==== Problema 1 (rezolvată) ​====
- +
-  * Definiţi funcţii +
-  * Folosiţi funcţii definite de utilizator +
- +
-==== Probleme ==== +
- +
-=== Problema 1 (rezolvată) ===+
 ---- ----
  
Line 27: Line 20:
 ---- ----
  
-Numarul de cifre ale numarului citit+Numarul de cifre al numarului citit
  
 == Restricţii == == Restricţii ==
Line 54: Line 47:
 { {
  if (n == 0)  if (n == 0)
- return 1;+     return 1; 
 +     
  int nr = 0; /* declar un contor in care sa numar cifrele */  int nr = 0; /* declar un contor in care sa numar cifrele */
 +
  while (n) /* cat timp mai pot obtine o cifra */  while (n) /* cat timp mai pot obtine o cifra */
  {  {
- n = n/10; /* o trunchiez pe ultima */ +     n = n/10; /* o trunchiez pe ultima */ 
- nr++; /* incrementez contorul */+     ​nr++; /* incrementez contorul */
  }  }
 +
  ​return nr; /* functia intoarce numarul de cifre */  ​return nr; /* functia intoarce numarul de cifre */
 } }
Line 76: Line 72:
 Programul C care implementează algoritmul descris mai sus va fi: Programul C care implementează algoritmul descris mai sus va fi:
  
-=== Problema 2 ===+==== Problema 2 ====
 ---- ----
  
Line 111: Line 107:
 | 666013 8| NU|  | 666013 8| NU| 
  
-=== Problema 3 ===+==== Problema 3 ====
  
 ---- ----
Line 117: Line 113:
 //**Ipoteza lui Goldbach**//:​ Orice număr par se poate exprima printr-o sumă de două numere //**Ipoteza lui Goldbach**//:​ Orice număr par se poate exprima printr-o sumă de două numere
 prime, nu neapărat distincte. prime, nu neapărat distincte.
-**A**. Scrieţi o funcţie care să verifice dacă un număr întreg este prim sau nu. Funcţia va returna+ 
 +==Cerința ​A== 
 + 
 +Scrieţi o funcţie care să verifice dacă un număr întreg este prim sau nu. Funcţia va returna
 valoarea 1 dacă **N** este număr prim şi 0 în caz contrar. Si **trebuie** sa aiba urmatorul antet: valoarea 1 dacă **N** este număr prim şi 0 în caz contrar. Si **trebuie** sa aiba urmatorul antet:
  
Line 124: Line 123:
 </​code>​ </​code>​
  
-**B**. Scrieţi un program care verifică //**ipoteza lui Goldbach**//​ prin afişarea tuturor+==Cerința ​B==  
 + 
 +Scrieţi un program care verifică //**ipoteza lui Goldbach**//​ prin afişarea tuturor
 descompunerilor distincte(de ex. nu se vor afişa şi "​5+7"​ şi "​7+5"​) posibile în sumă de descompunerilor distincte(de ex. nu se vor afişa şi "​5+7"​ şi "​7+5"​) posibile în sumă de
 numere prime ale unui număr citit de la tastatură. Programul va apela funcţia prim. numere prime ale unui număr citit de la tastatură. Programul va apela funcţia prim.
Line 156: Line 157:
 | 12 | 1 + 11 \\ 5 + 7 | | 12 | 1 + 11 \\ 5 + 7 |
  
-=== Problema 4 ===+ 
 +==== Problema 4 ====
 ---- ----
  
Line 167: Line 169:
  int cmmmc(int a, int b)  int cmmmc(int a, int b)
 </​code>​ </​code>​
 +
 +<note tip>​Hint:​ cmmmc(a, b) = (a * b) / cmmdc(a, b);</​note>​
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se vor afla două numere ​naturalem şi nce reprezintă dimensiunile matricei A. +Patru numere ​intregi reprezentand **x1****y1****x2****y2** cu semnificatia din enunt
-Urmează m linii a câte n numere întregi, ce reprezintă elementele matricei A. +
-Pe o nouă linie vor fi alte două numere naturale, p şi q, ce reprezintă dimensiunile matricei B. +
-Urmează p linii a câte q numere întregice reprezintă elementele matricei B.+
  
 == Date de ieşire == == Date de ieşire ==
 ---- ----
  
-Pe prima linie se vor afişa două numere naturale reprezentând dimensiunile matricei C, separate printr-un spaţiu. Urmează afişarea elementelor matricei C. +Cele 2 fractii aduse la acelasi numitor 
-În cazul în care nu se poate efectua A * B, se va afişa o singură linie cu mesajul //​imposibil//​.+
  
 == Restrictii == == Restrictii ==
 ---- ----
  
-  * 0 < n, m, p, q ≤ 100 +  * y1 != 0  
-  * Toate numerele din fisierele de intrare sunt cuprinse intre -1000 si 1000.+  * y2 != 0
  
 == Exemplu == == Exemplu ==
Line 192: Line 193:
  
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-\\ 1 \\ \\  ​\\ 1 3 \\ 1 2 3  ​2 3 \\ 1 2 3 \\ 2 4 6 +| 1 2 \\ 1 11 11 22 \\ 2 22 
-2 2 \\  1 0 \\ 0 1 \\ \\ 1 2 \\ 5 5 | //​imposibil// ​|+5 12 \\ 3 14 | 35 84 \\ 18 84 |
  
-=== Problema 5 ===+==== Problema 5 ====
 ---- ----
  
-Program ​pentru ​interclasarea a doi vectori ordonaţi într-un singur vector ordonat.+Să se scrie un program pentru calculul sumei seriei Taylor ​pentru ​funcţia //e^x// până la un 
 +termen dat:
  
-<note tip>​Hint:​ Veţi parcurge cei vectori in paralel şi veţi construi un nou vector, la care veţi adăuga, pe rând, câte un element din primul sau din al doilea vector (în funcţie de care dintre ele este mai mic).</​note>​+$e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + ..+ \frac{x^n}{n!}$
  
-== Date de intrare == +Se vor defini şi utiliza următoarele funcţii: 
----- +  * Funcţie pentru calculul sumei seriei Taylor în punctul x până la un termen n dat: <code c> double taylor(double x, int n) </​code>​ 
- +  * Funcţie pentru calculul factorialului unui număr ​întreg: <code c> int factorial(int n) </​code>​ 
-Pe prima linie se va afla un număr ​natural ​**N1** ce reprezintă dimensiunea primului vector. +  ​Funcţie pentru calculul puterii ​întregi a unui număr ​dat: <code c>  double putere(double xint n) </​code>​
-Pe a doua linie se vor afla numere ​întregi ​ce reprezintă elementele primului vector. +
-Pe treia linie se va afla un număr ​natural **N2** ce reprezintă dimensiunea celui de-al doilea vector. +
-Pe a patra linie se vor afla numere întregi ce reprezintă elementele celui de-al doilea vector. +
- +
-== Date de ieşire == +
----- +
- +
-Se vor afişa elementele vectorului obţinut prin interclasarea celor doi vectori, separate între ele printr-un spaţiu. +
- +
-== Restrictii == +
- +
-  * 0 N1, N2 ≤ 1000 +
- +
-== Exemplu == +
- +
-^ Intrare ​     ^ Ieşire ​      ^ +
-| 4 \\ -3 5 9 12 \\ 7 1 3 5 6 7 13 17  | -3 1 3 5 5 6 7 9 12 13 17 | +
- +
-=== Problema 6 === +
----- +
- +
-Se citeşte o matrice pătratică A de la tastatură. Afişati toate elementele de sub diagonala secundarăpe coloane.+
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se va afla un număr ​natural, N, ce reprezintă ​numărul de linii si numărul de coloane ale matricei. +Fişierul de intrare va avea o singură ​linie, pe care se vor afla un număr ​real **X** şi un număr 
-Urmează ​linii a câte N numere întregi, ce reprezintă elementele matricei. +natural **N**.
  
 == Date de ieşire == == Date de ieşire ==
 ---- ----
  
-Se vor afişa pe o linieseparate printr-un spaţiu, toate elementele ​de sub diagonala secundară.+Valoarea expresiei expuse mai sus pentru **x** şi **n** datecu precizie ​de patru zecimale.
  
 == Restrictii == == Restrictii ==
----- 
  
-  * 0 < N ≤ 100+  * 0 < N ≤ 1000
  
 == Exemplu == == Exemplu ==
----- 
  
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-4 \\ 1 3 4 \\ 6 7 8 \\ 9 10 11 12 \\ 13 14 15 16  ​14 11 15 8 12 16 |+| 2.5 10   ​| 12.1817 |
  
-=== Problema ​===+==== Problema ​6 ====
 ---- ----
  
-Program pentru ​afişarea celei mai lungi secvenţe ​de elemente consecutive ordonate crescător dintr-un vector ​de numere naturale.+Se citesc **n** puncte de la tastatură, date prin coordonatele lor: //x[i], y[i], i=1,n//. Să se afişeze 
 +perechea ​de puncte între care distanţa este maximă (dacă există mai multe astfel ​de perechi, 
 +se poate afişa oricare dintre ele), precum şi această distanţăSe va defini şi folosi o funcţie 
 +pentru calculul distanţei dintre două puncte în plan, care trebuie să respecte următorul antet:
  
-== Date de intrare == +<code c> 
-----+float dist(int x1, int y1, int x2, int y2) 
 +</​code>​
  
-Pe prima linie se va afla un număr natural, N, ce reprezintă dimensiunea vectorului. 
-Pe a doua linie se vor afla N numere întregi ce reprezintă elementele vectorului. 
- 
-== Date de ieşire == 
----- 
- 
- 
-Se va afişa pe o linie secvenţa de elemente consective ordonate crescător, elementele fiind despărţite între ele printr-un spaţiu. 
- 
-== Restrictii == 
----- 
- 
-  * 0 < N ≤ 100 
-  * Dacă există mai multe secvente crescătoare de lungime maximală, se va afişa cea care începe de la poziţia cea mai din stânga 
-  * O secvenţă de numere (i,j) este crescătoare dacă şi numai dacă s(k) ≤ s(k+1), oricare ar fi i ≤ k ≤ j-1. 
- 
-== Exemplu == 
----- 
- 
-^ Intrare ​     ^ Ieşire ​      ^ 
-| 9 \\ 5 3 6 2 4 6 8 4 1 | 2 4 6 8| 
- 
-=== Problema 8 === 
----- 
- 
-Program pentru afişarea secvenţei de elemente consecutive de sumă maximă dintr-un vector. 
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se va afla un număr ​natural, ​Nce reprezintă dimensiunea vectorului. +Un numar natural ​**n**urmate de **n** liniipe fiecare ​linie cate un punct dat prin coordonatele sale 
-Pe a doua linie se vor afla N numere întregi ce reprezintă elementele vectorului.+în plan, cu specificatia din enunt.
  
 == Date de ieşire == == Date de ieşire ==
 ---- ----
  
-Se va afişpe o linie secvenţa de elemente consecutive de sumă maximă din vectorul dat, separînd elementele între ele printr-un spaţiu. +Pe primele doua linii perechea de puncte intre care distanta e maxima. Pe treia linie se va 
- +regasi distanta
-== Restrictii == +
----- +
- +
-  * 0 < N ≤ 100 +
-  * Elementele vectorului au valori cuprinde între -10.000 şi 10.000 +
-  * Dacă există mai multe secvente de elemente de sumă maximă, ​se va afisa cea care începe pe o poziţie cât mai din stânga. +
-  * Dacă în continuare există mai multe secvente de elemente de sumă maximă care încep pe aceeaşi poziţie, se va alege cea mai scurtă dintre ele.+
  
 == Exemplu == == Exemplu ==
Line 310: Line 258:
  
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-12 \\ --4 2 8 3 -2 -5 -8 4--4 2 8 3 -2|+4 \\ 0 0 \\ 0 1 \\ 1 0 \\ 1 1 | 0 0 \\ 1 1 \\ 1.414214 ​|
  
-== Explicatii ​==+==== Problema 7 ====
 ---- ----
  
-Secventa 2 8 3 -1 2 are de asemenea suma maximă, dar vom alege ca spuns secvenţa care începe cel mai din stânga.+Scrieţi o funcţie care sortează cifrele unui număr astfel: 
 +  * descrescător, dacă numărul conţine cifra 0 
 +  * crescător, dacă numărul nu conţine cifra 0
  
 +Funcţia trebuie să respecte următorul antet:
 +<code c>
 +int transforma(int n)
 +</​code>​
  
-=== Problema 9 === +<note tip>​HINT! Pentru a sorta cifrele, cea mai simpla metoda este sa folositi un vector cu 10 elemente 
-----+in care sa memorati pentru fiecare cifra, de cate ori apare aceasta in numar. Pentru a afisa 
 +numarul sortat, trebuie sa parcurgeti vectorul si sa afisati cifrele in ordine crescatoare/​des 
 +</​note>​
  
-Scrieţi un program care citeşte un şir de numere şi verifică dacă acest şir este ordonat crescator sau ordonat descrescator sau nu este ordonat sau este un şir constant. Se afişează un mesaj: //"​crescator"//​ , //"​descrescator"//,​ //"​neordonat"//,​ //"​constant"//​ . 
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se va afla un număr natural, ​N, ce reprezintă dimensiunea vectorului. +Un numar dat **N** cu specificatia din enunt.
-Pe a doua linie se vor afla N numere întregi ce reprezintă elementele matricei. +
  
 == Date de ieşire == == Date de ieşire ==
 ---- ----
  
-Se va afişa mesajul specific.+Cifrele numarului dat, sortate dupa cum se cere in enunt. 
  
 == Restrictii == == Restrictii ==
 ---- ----
  
-  * 0 N ≤ 100 +  * 0 ≤ N ≤ 1000000000 
 +  
 == Exemplu == == Exemplu ==
 ---- ----
  
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-5 \\ 2 3 5 7 11crescator+19430123 ​94332110
-4 \\ 11 2 2 5 neordonat| +25345622234556 ​|
-|3 \\ 3 3 3 | constant ​|+
  
-=== Problema ​10 ===+==== Problema ​8 ====
 ---- ----
  
-Scrieţi ​un program ​care citeşte n numere reale //X// şi //m + 1// numere întregi ​//A// şi afişează numărul de valori din //X// situat în fiecare din cele //m// intervale deschise delimitate de valorile din //A//.+Scrieţi ​o funcţie ​care caculează aria intersecţiei a două dreptunghiuri,​ date prin coordonatele 
 +colţurilor stânga-sus ​şi dreapta-jos. Coordonatele sunt numere întregi ​pozitive. Funcţia 
 +trebuie să respecte următorul antet:
  
-== Date de intrare == +<code c> 
----- +int arie_intersectie(int x11int y11int x12int y12int x21int y21int x22int y22
- +</​code>​
-Pe prima linie se va afla numărul natural //n//. +
-Pe a doua linie vor fi //n// numere reale. +
-Pe a patra linie se va afla numărul natural //m//. +
-Pe a cincea linie vor fi //m// numere întregi. +
- +
-== Date de ieşire == +
----- +
- +
-Se va afişa numărul de valori din //X// situat în fiecare din cele //m - 1// intervale deschise delimitate de valorile din //A// sau mesajul //Error// dacă valorile din şirul //A// nu sunt sorte în ordine scrict crescătoare. +
- +
-== Restricţii == +
----- +
- +
-  * Se verifică dacă valorile A sunt introduse în ordine crescatoare şi în caz contrar programul se opreşte +
-  * 0 ≤ n ≤ 100 +
-  * 2 ≤ m ≤ 1000 +
- +
-== Exemplu == +
----- +
- +
-^ Intrare ​     ^ Ieşire ​      ^ +
-| 7 \\ 5.2 4.1 1.1 5 5.9 6.7 3.14 \\  \\ 4 \\ 2 3 5 7| 0 2 3| +
-| 7 \\ 5.2 4.1 1.1 5 5.9 6.7 3.14 \\  \\ 4 \\ 2 5 3 7| Error| +
- +
-== Explicaţie == +
----- +
- +
-Nu sunt numere incluse în intervalul ​(23).  +
- +
-În (35) sunt incluse 3.144.1.  +
- +
-În (57) sunt incluse 5.25.96.7. +
- +
-=== Problema 11 === +
----- +
- +
-Program pentru calculul valorii unui polinom cu coeficienţi daţiprin mai multe metode cu următoarea numerotare a coeficienţilor:​ +
- +
-P(x= c0 * xn + c1 * xn - 1 + ... + cn - 1 * x + cn. +
- +
-  * Ca suma de termeni calculaţi separat (cu funcţia pow, din math.h) +
-  * Printr-o relaţie de recurenţă de forma: P(x, k) = P(x, k - 1) * x + c[k] şi P(x, 0) = c[0]] +
- +
-De exemplu: pentru n = 3 şi c = { 1, 2, 3, 4 }, corespunzătoare polinomului P(x) = x3 + 2 * x2 + 3 * x + 4, se poate scrie P(x) = x * (x * (x * 1 + 2) + 3) + 4+
  
 == Date de intrare == == Date de intrare ==
 ---- ----
  
-Pe prima linie se vor afla două numere: un număr real //x// şi un număr natural **n** ce reprezintă gradul polinomului+Se vor citi 8 numere ​intregi, reprezentand coordonatele colturilor celor 2 figuri geometrice
-Pe a doua linie, separate printr-un spaţiu, **n+1** numere întregi ce reprezintă coeficienţii polinomului //( c[0], c[1], ..., c[n] )//.+Ele vor fi date in ordine conform cu antetul functiei pus la dispozitie in enunt.
  
 == Date de ieşire == == Date de ieşire ==
 ---- ----
  
-Se va afişa valoarea polinomului cu o **precizie de zecimale**.+Un numar reprezentand aria intersectiei dintre cele dreptunghiuri.
  
-== Restrictii si precizari == 
----- 
  
-  * 0 < n ≤ 50 +== Restrictii ​==
-  * Pentru reprezentarea numerelor reale se va folosi tipul **double** +
- +
-== Exemplu ​==+
 ---- ----
  
-^ Intrare ​     ^ Ieşire ​      ^ +  * Coordonatele ​sunt numere ​intregi strict pozitive 
-| 0.5 3 \\ 1 2 3 4 | 6.12 | +  * Numerele vor fi in intervalul [01.000.000]
- +
- +
-=== Problema 12 === +
----- +
- +
-Fie un vector de numere întregi (iniţial toate având valoarea 0) de lungime N. Se citesc de la tastatură un set de M tripleţi de forma B E V fiecare având urmatoarea semnificaţie : toate elementele din vector ale căror poziţii (indexate de la 0) sunt cuprinse între B şi E inclusiv vor fi modificate prin adunare cu V. +
- +
-Afişati vectorul obţinut în urma aplicării celor M operaţii. +
- +
-== Date de intrare == +
----- +
- +
-Pe prima linie se vor afla două numere ​naturale: N, ce reprezintă lungimea vectorului şi M, ce reprezintă numărul de tripleţi ce vor fi citiţi de la tastatură. +
-Pe următoarele M linii, câte trei numere naturale, B, E şi V, separate prin câte un spaţiu. +
- +
- +
-== Date de ieşire == +
----- +
- +
-Se vor afişa pe o linie elementele vectorului obţinut în urma aplicării celor M operaţii, separate prin câte un spaţiu. +
- +
-== Restrictii si Precizari == +
----- +
- +
-  * 0 < B(i) ≤ E(i) ≤ N ≤ 1.000.000 +
-  * 0 < M ≤ 100.000 +
-  * -10.000 ≤ V(i) ≤ 10.000+
  
 == Exemplu == == Exemplu ==
Line 455: Line 334:
  
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-| 5 3 \\ 1 2 3 \\ 2 4 -1 \\ 0 1 2 2 5 2 -1 -1 +1 10 5 5 \\ 2 7 4 4| 4
- +1 3 3 1  \\ 2 4 4 4 | |
-== Explicaţie == +
----- +
- +
-Iniţial: 0 0 0 0 0 +
-  +
-După (3): 0 3 0 0  +
- +
-După (2 4 -1): 3 2 -1 -1 +
-  +
-După (0 1 2): 2 5 2 -1 -1 +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
  
  
programare-cc/laboratoare/05.1603729358.txt.gz · Last modified: 2020/10/26 18:22 by andreea.nica1602
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