This shows you the differences between two versions of the page.
programare-cc:laboratoare:05 [2020/10/06 17:40] 127.0.0.1 external edit |
programare-cc:laboratoare:05 [2023/11/07 10:57] (current) mihai.nan [Problema 5] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 05. ===== | + | ===== Laboratorul 05 - Definire și utilizare funcții ===== |
+ | |||
+ | ==== Problema 1 (rezolvată) ==== | ||
+ | ---- | ||
+ | |||
+ | Scrieţi o funcţie care să calculeze numărul de cifre ale unui număr întreg dat ca parametru, N. | ||
+ | În funcţia main() citiţi un număr de la tastatură şi afişaţi rezultatul apelului funcţiei. Antetul | ||
+ | funcţiei trebuie să respecte următorul format: | ||
+ | |||
+ | <code c> | ||
+ | int nrcf(long n) | ||
+ | </code> | ||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Un numar dat **N** | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Numarul de cifre al numarului citit | ||
+ | |||
+ | == Restricţii == | ||
+ | ---- | ||
+ | |||
+ | * -1,000,000 < N < 1,000,000 | ||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 12345 | 5 | | ||
+ | | 9 | 1 | | ||
+ | | -325 | 3 | | ||
+ | |||
+ | |||
+ | == Rezolvare == | ||
+ | ---- | ||
+ | |||
+ | Programul C care implementează cerinţa problemei de mai sus va fi: | ||
+ | |||
+ | <code c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int nrcf(long n) | ||
+ | { | ||
+ | if (n == 0) | ||
+ | return 1; | ||
+ | |||
+ | int nr = 0; /* declar un contor in care sa numar cifrele */ | ||
+ | |||
+ | while (n) /* cat timp mai pot obtine o cifra */ | ||
+ | { | ||
+ | n = n/10; /* o trunchiez pe ultima */ | ||
+ | nr++; /* incrementez contorul */ | ||
+ | } | ||
+ | |||
+ | return nr; /* functia intoarce numarul de cifre */ | ||
+ | } | ||
+ | |||
+ | int main(void) | ||
+ | { | ||
+ | long N; | ||
+ | printf("N = "); /* afisam un mesaj pentru utilizator */ | ||
+ | scanf("%ld", &N); /* citim numarul introdus de la tastatura */ | ||
+ | printf("Numarul %ld are %d cifre!\n", N, nrcf(N)); /* afisez numarul de cifre */ | ||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Programul C care implementează algoritmul descris mai sus va fi: | ||
+ | |||
+ | ==== Problema 2 ==== | ||
+ | ---- | ||
+ | |||
+ | Scrieţi o funcţie care să verifice dacă un număr întreg **n** conţine cifra **c**. Numerele **n** şi **c** sunt | ||
+ | date ca parametri. Antetul funcţiei trebuie să respecte următorul format: | ||
+ | |||
+ | <code c> | ||
+ | int cifra(int n, int c) | ||
+ | </code> | ||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Programul primeste 2 parametri **n** si **c** ca in antetul de mai sus | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | Se va afisa //DA// sau //NU//. Astfel ca //DA// semnifica existenta cifrei **c** in numarul **n**, sau //NU// in | ||
+ | caz contrar | ||
+ | |||
+ | |||
+ | == Restrictii si Precizari == | ||
+ | ---- | ||
+ | |||
+ | * −2,147,483,648 < n < 2,147,483,647 | ||
+ | * 0 ≤ c ≤ 9 | ||
+ | |||
+ | == Exemplu == | ||
+ | |||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 13584 3 | DA | | ||
+ | | 100111 0 | DA | | ||
+ | | 666013 8| NU| | ||
+ | |||
+ | ==== Problema 3 ==== | ||
+ | |||
+ | ---- | ||
+ | |||
+ | //**Ipoteza lui Goldbach**//: Orice număr par se poate exprima printr-o sumă de două numere | ||
+ | prime, nu neapărat distincte. | ||
+ | |||
+ | ==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: | ||
+ | |||
+ | <code c> | ||
+ | int prim(int n) | ||
+ | </code> | ||
+ | |||
+ | ==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 | ||
+ | numere prime ale unui număr citit de la tastatură. Programul va apela funcţia prim. | ||
+ | <note important>Observaţie: Se va considera pentru această problemă că numărul 1 este prim.</note> | ||
+ | |||
+ | == Date de intrare == | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Un numar **N** par. | ||
+ | |||
+ | |||
+ | == Date de ieşire == | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Afisarea tuturor descompunerilor pentru numarul dat **N** | ||
+ | |||
+ | == Restrictii == | ||
+ | |||
+ | ---- | ||
+ | |||
+ | * 2 ≤ N ≤ 200000 | ||
+ | |||
+ | == Exemplu == | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 12 | 1 + 11 \\ 5 + 7 | | ||
+ | |||
+ | |||
+ | ==== Problema 4 ==== | ||
+ | ---- | ||
+ | |||
+ | Se citesc de la tastatură patru numere întregi reprezentând două fracţii //x1 / y1// şi //x2/ y2//. | ||
+ | Aduceţi fracţiile la acelaşi numitor (cel mai mic posibil) folosind o funcţie care calculează cel | ||
+ | mai mic multiplu comun a două numere întregi. Consideraţi că fracţiile date ca input sunt | ||
+ | deja în formă ireductibilă. Antetul funcţiei trebuie să respecte următorul format: | ||
+ | |||
+ | <code c> | ||
+ | int cmmmc(int a, int b) | ||
+ | </code> | ||
+ | |||
+ | <note tip>Hint: cmmmc(a, b) = (a * b) / cmmdc(a, b);</note> | ||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Patru numere intregi reprezentand **x1**, **y1**, **x2**, **y2** cu semnificatia din enunt | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Cele 2 fractii aduse la acelasi numitor | ||
+ | |||
+ | |||
+ | == Restrictii == | ||
+ | ---- | ||
+ | |||
+ | * y1 != 0 | ||
+ | * y2 != 0 | ||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 1 2 \\ 1 11 | 11 22 \\ 2 22 | | ||
+ | | 5 12 \\ 3 14 | 35 84 \\ 18 84 | | ||
+ | |||
+ | ==== Problema 5 ==== | ||
+ | ---- | ||
+ | |||
+ | Să se scrie un program pentru calculul sumei seriei Taylor pentru funcţia //e^x// până la un | ||
+ | termen dat: | ||
+ | |||
+ | $e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + ... + \frac{x^n}{n!}$ | ||
+ | |||
+ | 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> | ||
+ | * Funcţie pentru calculul puterii întregi a unui număr dat: <code c> double putere(double x, int n) </code> | ||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Fişierul de intrare va avea o singură linie, pe care se vor afla un număr real **X** şi un număr | ||
+ | natural **N**. | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Valoarea expresiei expuse mai sus pentru **x** şi **n** date, cu precizie de patru zecimale. | ||
+ | |||
+ | == Restrictii == | ||
+ | |||
+ | * 0 < N ≤ 1000 | ||
+ | |||
+ | == Exemplu == | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 2.5 10 | 12.1817 | | ||
+ | |||
+ | ==== Problema 6 ==== | ||
+ | ---- | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code c> | ||
+ | float dist(int x1, int y1, int x2, int y2) | ||
+ | </code> | ||
+ | |||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Un numar natural **n**, urmate de **n** linii, pe fiecare linie cate un punct dat prin coordonatele sale | ||
+ | în plan, cu specificatia din enunt. | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Pe primele doua linii perechea de puncte intre care distanta e maxima. Pe a treia linie se va | ||
+ | regasi distanta | ||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 4 \\ 0 0 \\ 0 1 \\ 1 0 \\ 1 1 | 0 0 \\ 1 1 \\ 1.414214 | | ||
+ | |||
+ | ==== Problema 7 ==== | ||
+ | ---- | ||
+ | |||
+ | 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> | ||
+ | |||
+ | <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> | ||
+ | |||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Un numar dat **N** cu specificatia din enunt. | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Cifrele numarului dat, sortate dupa cum se cere in enunt. | ||
+ | |||
+ | |||
+ | == Restrictii == | ||
+ | ---- | ||
+ | |||
+ | * 0 ≤ N ≤ 1000000000 | ||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 19430123 | 94332110| | ||
+ | | 2534562| 2234556 | | ||
+ | |||
+ | ==== Problema 8 ==== | ||
+ | ---- | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <code c> | ||
+ | int arie_intersectie(int x11, int y11, int x12, int y12, int x21, int y21, int x22, int y22) | ||
+ | </code> | ||
+ | |||
+ | == Date de intrare == | ||
+ | ---- | ||
+ | |||
+ | Se vor citi 8 numere intregi, reprezentand coordonatele colturilor celor 2 figuri geometrice. | ||
+ | Ele vor fi date in ordine conform cu antetul functiei pus la dispozitie in enunt. | ||
+ | |||
+ | == Date de ieşire == | ||
+ | ---- | ||
+ | |||
+ | Un numar reprezentand aria intersectiei dintre cele 2 dreptunghiuri. | ||
+ | |||
+ | |||
+ | == Restrictii == | ||
+ | ---- | ||
+ | |||
+ | * Coordonatele sunt numere intregi strict pozitive | ||
+ | * Numerele vor fi in intervalul [0, 1.000.000] | ||
+ | |||
+ | == Exemplu == | ||
+ | ---- | ||
+ | |||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 1 10 5 5 \\ 2 7 4 4| 4| | ||
+ | | 1 3 3 1 \\ 2 4 4 4 | 0 | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||