This shows you the differences between two versions of the page.
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 naturale, m şi n, ce 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 întregi, ce 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 ^ | ||
- | | 2 1 \\ 1 \\ 2 \\ \\ 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 2 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 x, int n) </code> |
- | Pe a doua linie se vor afla numere întregi ce reprezintă elementele primului vector. | + | |
- | Pe a 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ă N 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 linie, separate printr-un spaţiu, toate elementele de sub diagonala secundară. | + | Valoarea expresiei expuse mai sus pentru **x** şi **n** date, cu precizie de patru zecimale. |
== Restrictii == | == Restrictii == | ||
- | ---- | ||
- | * 0 < N ≤ 100 | + | * 0 < N ≤ 1000 |
== Exemplu == | == Exemplu == | ||
- | ---- | ||
^ Intrare ^ Ieşire ^ | ^ Intrare ^ Ieşire ^ | ||
- | | 4 \\ 1 2 3 4 \\ 5 6 7 8 \\ 9 10 11 12 \\ 13 14 15 16 | 14 11 15 8 12 16 | | + | | 2.5 10 | 12.1817 | |
- | === Problema 7 === | + | ==== 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, N, ce reprezintă dimensiunea vectorului. | + | Un numar natural **n**, urmate de **n** linii, pe 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şa 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 a 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 \\ 5 0 -1 -4 2 8 3 -1 2 -5 -8 4| 5 0 -1 -4 2 8 3 -1 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 ră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 11| crescator| | + | | 19430123 | 94332110| |
- | | 4 \\ 11 2 2 5 | neordonat| | + | | 2534562| 2234556 | |
- | |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 x11, int y11, int x12, int y12, int x21, int y21, int x22, int 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 (2, 3). | + | |
- | + | ||
- | În (3, 5) sunt incluse 3.14, 4.1. | + | |
- | + | ||
- | În (5, 7) sunt incluse 5.2, 5.9, 6.7. | + | |
- | + | ||
- | === Problema 11 === | + | |
- | ---- | + | |
- | + | ||
- | Program pentru calculul valorii unui polinom cu coeficienţi daţi, prin 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 2 zecimale**. | + | Un numar reprezentand aria intersectiei dintre cele 2 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 [0, 1.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 | 0 | | |
- | == Explicaţie == | + | |
- | ---- | + | |
- | + | ||
- | Iniţial: 0 0 0 0 0 | + | |
- | + | ||
- | După (1 2 3): 0 3 3 0 0 | + | |
- | + | ||
- | După (2 4 -1): 0 3 2 -1 -1 | + | |
- | + | ||
- | După (0 1 2): 2 5 2 -1 -1 | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||