This shows you the differences between two versions of the page.
|
programare-cc:laboratoare:02 [2020/10/22 14:23] bogdan.nutu [Problema 6] |
programare-cc:laboratoare:02 [2025/10/15 11:38] (current) carmen.odubasteanu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ===== Laborator 02 - Funcții de citire și scriere ===== | ===== Laborator 02 - Funcții de citire și scriere ===== | ||
| + | |||
| + | ==== Breviar ==== | ||
| **În acest laborator veţi învăţa să:** | **În acest laborator veţi învăţa să:** | ||
| Line 186: | Line 188: | ||
| Mai găsiţi detalii şi pe: [[http://www.cplusplus.com/reference/cstdio/printf/]] | Mai găsiţi detalii şi pe: [[http://www.cplusplus.com/reference/cstdio/printf/]] | ||
| - | ===== Problema 1 ===== | + | ==== Probleme propuse ==== |
| - | Problema generării unor numere aleatoare poate fi considerată iniţial una complicată, dar limbajul C ne pune la dispoziţie biblioteca **stdlib**, cu ajutorul căreia lucrurile vor deveni foarte simple. Funcţiile şi constantele acestei biblioteci sunt declarate în header-ul **stdlib.h** pe care va trebui să-l includeţi la începutul programului pe care îl scrieţi. | + | === Problema 1 === |
| - | Utilizând funcţia **rand()** veţi genera numere aleatoare cu valori cuprinse între **0** si **RAND_MAX**, unde **RAND_MAX** este o constanta definită în **stdlib.h**, având în general valoarea maximă a tipului **int**. | + | Scrieți un program care citește două numere naturale (de tip **int**) pe aceeași linie, separate prin câte un spațiu. Calculați suma și produsul pentru aceste numere și afișați rezultatele obținute. |
| - | Valorile returnate de această funcţie sunt de fapt termenii unui şir de numere generat după o anumită formula ce foloseşte ca punct de plecare o valoare dată. Din cauza acestui aspect, pentru aceeasi valoare iniţială fixată, programul va genera la fiecare rulare aceleaţi numere aleatoare. Pentru a evita acest lucru, biblioteca pune la dispozitie funcţia **srand()** care primeşte ca parametru un număr întreg reprezentând valoarea iniţiala utilizată în calcularea şirului de numere aleatoare. | + | === Problema 2 === |
| - | Astfel, paşii pentru rezolvarea problemei noastre sunt următorii : | + | Scrieţi un program care citeşte 3 numere de tip **float** pe aceeaşi linie, separate prin câte un spaţiu, şi apoi afişeaza pe trei linii, toate cele 3 valori pe cate o linie, folosind, succesiv, descriptorii **%f**, **%e** şi **%g**. Folosiţi, pe rând, următoarele date de intrare: |
| - | + | ||
| - | <code c> | + | |
| - | + | ||
| - | // fixarea valorii utilizate în generarea numerelor: | + | |
| - | srand( seed ); // unde seed este o valoare de tip intreg; | + | |
| - | // obţinerea unui număr pseudoaleator: | + | |
| - | n = rand(); // unde n este numarul intreg generat aleator; | + | |
| - | + | ||
| - | </code> | + | |
| - | + | ||
| - | <note important>Pentru a garanta că la fiecare rulare a programului valoarea seed este unică, recomandăm apelarea funcţiei srand cu ora locală a calculatorului în secunde. (Acest lucru va fi prezentat în laboratoarele următoare)</note> | + | |
| - | + | ||
| - | Afişati pe ecran o linie conţinând 3 numere întregi, separate prin spaţiu, generate în mod aleator. | + | |
| - | Rulaţi programul de mai multe ori cu aceeasi valoare seed. Ce observaţi ? | + | |
| - | Schimbaţi valoarea seed şi rulaţi din nou. Ce observaţi ? | + | |
| - | + | ||
| - | ===== Problema 2 ===== | + | |
| - | + | ||
| - | Scrieţi un program care citeşte şi apoi afişează 3 numere de tip **float** pe aceeaşi linie, separate prin câte un spaţiu, folosind, succesiv, descriptorii **%f**, **%e** şi **%g** pentru cele 3 valori. Folosiţi, pe rând, următoarele date de intrare: | + | |
| * 1e2 1e2 1e2 | * 1e2 1e2 1e2 | ||
| * 23.22e+03 23.22e+3 23.22e+03 | * 23.22e+03 23.22e+3 23.22e+03 | ||
| - | * 21 1201 122234215001 | + | * 21 1201 12223333444 |
| Line 225: | Line 208: | ||
| </note> | </note> | ||
| - | ===== Problema 3 ===== | + | === Problema 3 === |
| - | Programul următor afişează valorile funcţiei **sin(x)** pentru valori ale lui x între **0** şi **2*PI**, cu pasul **PI/10.** | + | Programul următor afişează valorile funcţiei **sin(x)** pentru valori ale lui x între **0** şi **2*PI**, cu pasul **PI/20.** |
| <code c> | <code c> | ||
| Line 236: | Line 219: | ||
| { | { | ||
| double x, PI = M_PI; | double x, PI = M_PI; | ||
| - | for (x = 0; x <= 2 * PI; x = x + PI / 10) { | + | for (x = 0; x <= 2 * PI; x = x + PI / 20) { |
| printf("%lf \n", sin(x)); | printf("%lf \n", sin(x)); | ||
| } | } | ||
| - | getchar(); | ||
| return 0; | return 0; | ||
| } | } | ||
| Line 249: | Line 231: | ||
| ^ Intrare ^ Ieşire ^ | ^ Intrare ^ Ieşire ^ | ||
| - | | Programul nu are date de intrare. \\ Observaţie: punctele mediane din exemplul \\ alăturat sunt doar pentru a vă ajuta să \\ număraţi spaţierea! \\ Ele nu trebuie afişate! | ¦·······x¦··sin(x)¦··cos(x)¦ \\ ¦==================¦ \\ ¦··+0.000¦··+0.000¦··+1.000¦ \\ .......................................... | | + | | Programul nu are date de intrare. \\ Observaţie: punctele mediane din exemplul \\ alăturat sunt doar pentru a vă ajuta să \\ număraţi spaţierea! \\ Ele nu trebuie afişate! | ¦·······x¦··sin(x)¦··cos(x)¦ \\ ¦==================¦ \\ ¦··+0.000¦··+0.000¦··+1.000¦ \\ samd... | |
| - | ===== Problema 4 ===== | + | === Problema 4 === |
| Scrieţi un program care să determine cadranul în care se află un punct dat prin coordonatele sale reale. Se va afişa un număr între **1** şi **4** sau mesajul **punct pe axe**. | Scrieţi un program care să determine cadranul în care se află un punct dat prin coordonatele sale reale. Se va afişa un număr între **1** şi **4** sau mesajul **punct pe axe**. | ||
| Line 276: | Line 258: | ||
| | 0 0 | punct pe axe | | | 0 0 | punct pe axe | | ||
| - | ===== Problema 5 ===== | + | === Problema 5 === |
| Scrieţi un program care să verifice dacă 3 numere întregi date **a, b, c** pot forma lungimile laturilor unui triunghi. | Scrieţi un program care să verifice dacă 3 numere întregi date **a, b, c** pot forma lungimile laturilor unui triunghi. | ||
| Line 291: | Line 273: | ||
| **Restricţii şi Precizări** | **Restricţii şi Precizări** | ||
| ---- | ---- | ||
| - | * -1.000.000.000 ≤ a, b, c ≤ +1.000.000.000 | + | * -1.000.000 ≤ a, b, c ≤ +1.000.000 |
| * a + b + c ≠ 0 | * a + b + c ≠ 0 | ||
| * Se consideră triunghi şi un triunghi cu un unghi de 180 de grade şi două unghiuri de 0 grade. | * Se consideră triunghi şi un triunghi cu un unghi de 180 de grade şi două unghiuri de 0 grade. | ||
| Line 303: | Line 285: | ||
| | 6 6 0 | DA | | | 6 6 0 | DA | | ||
| - | ===== Problema 6 ===== | + | === Problema 6 === |
| Scrieţi un program care citeşte 3 numere reale reprezentând lungimile laturilor unui triunghi şi care afişează tipul de triunghi cu aceste laturi: //oarecare, isoscel, echilateral, dreptunghic sau dreptunghic isoscel//. | Scrieţi un program care citeşte 3 numere reale reprezentând lungimile laturilor unui triunghi şi care afişează tipul de triunghi cu aceste laturi: //oarecare, isoscel, echilateral, dreptunghic sau dreptunghic isoscel//. | ||
| Line 330: | Line 312: | ||
| | 2.8284 2 2| dreptunghic isoscel| | | 2.8284 2 2| dreptunghic isoscel| | ||
| - | ===== Problema 7 ===== | + | === Problema 7 === |
| Scrieţi un program care determină minimul şi maximul dintre 4 numere, folosind doar instructiunea **if**. | Scrieţi un program care determină minimul şi maximul dintre 4 numere, folosind doar instructiunea **if**. | ||
| Line 345: | Line 327: | ||
| **Restricţii şi Precizări** | **Restricţii şi Precizări** | ||
| ---- | ---- | ||
| - | * 1 ≤ A, B, C, D ≤ 2.000.000.000 | + | * 1 ≤ A, B, C, D ≤ 2.000.000 |
| **Exemplu** | **Exemplu** | ||
| ---- | ---- | ||
| ^ Intrare ^ Ieşire ^ | ^ Intrare ^ Ieşire ^ | ||
| - | | 23 5321 331245 2000000000 | 23 2000000000| | + | | 23 5321 31245 32000 | 23 32000| |
| - | ===== Problema 8 ===== | + | === Problema 8 === |
| Afişaţi trei numere în ordine crescătoare, folosind doar instrucţiunea **if**. | Afişaţi trei numere în ordine crescătoare, folosind doar instrucţiunea **if**. | ||
| Line 363: | Line 345: | ||
| ---- | ---- | ||
| O singură **linie** care va conţine numerele în ordine crescătoare, separate printr-un singur spaţiu. | O singură **linie** care va conţine numerele în ordine crescătoare, separate printr-un singur spaţiu. | ||
| - | |||
| - | **Restricţii şi Precizări** | ||
| - | ---- | ||
| - | * 1 ≤ A, B, C ≤ 2.000.000.000 | ||
| **Exemplu** | **Exemplu** | ||
| ---- | ---- | ||
| ^ Intrare ^ Ieşire ^ | ^ Intrare ^ Ieşire ^ | ||
| - | | 123109 2342 12 | 12 2342 123109 | | + | | 12109 2342 12 | 12 2342 12109 | |
| - | ===== Problema 9 ===== | + | === Problema 9 === |
| Scrieţi un program care citeşte trei numere întregi, **H, M şi S** reprezentând ora, minutul şi secunda dintr-un anumit moment al zilei, şi le afişează în format de ceas digital. | Scrieţi un program care citeşte trei numere întregi, **H, M şi S** reprezentând ora, minutul şi secunda dintr-un anumit moment al zilei, şi le afişează în format de ceas digital. | ||
| Line 395: | Line 373: | ||
| | 15 42 3 | 15:42:03 | | | 15 42 3 | 15:42:03 | | ||
| - | ===== Problema 10 ===== | + | === Problema 10 === |
| În programul anterior observaţi că dacă în loc de a introduce o valoare numerică tastaţi altceva (o literă, de exemplu) programul se va comporta anormal. Încercati să modificaţi programul astfel încat să aveţi protecţie la datele eronate. | În programul anterior observaţi că dacă în loc de a introduce o valoare numerică tastaţi altceva (o literă, de exemplu) programul se va comporta anormal. Încercati să modificaţi programul astfel încat să aveţi protecţie la datele eronate. | ||
| Line 407: | Line 385: | ||
| ---- | ---- | ||
| O singură linie care va conţine momentul zilei exprimat în format de ceas digital **HH:MM:SS** sau mesajul Date incorect introduse! | O singură linie care va conţine momentul zilei exprimat în format de ceas digital **HH:MM:SS** sau mesajul Date incorect introduse! | ||
| - | |||
| **Exemplu** | **Exemplu** | ||
| Line 415: | Line 392: | ||
| | 11 4.2 3 | Date incorect introduse! | | | 11 4.2 3 | Date incorect introduse! | | ||
| - | ===== Problema 11 ===== | + | === Problema 11 === |
| Scrieţi un program pentru rezolvarea ecuaţiei de gradul 2. | Scrieţi un program pentru rezolvarea ecuaţiei de gradul 2. | ||
| Line 421: | Line 398: | ||
| **Date de Intrare** | **Date de Intrare** | ||
| ---- | ---- | ||
| - | Fişierul de intrare lab-02-11.in va conţine trei numere reale a, b, c ce reprezintă coeficienţii ecuaţiei de gradul 2 în ordine descrescătoare după puterile lui x. | + | Trei numere reale a, b, c ce reprezintă coeficienţii ecuaţiei de gradul 2 în ordine descrescătoare după puterile lui x. |
| **Date de Ieşire** | **Date de Ieşire** | ||
| ---- | ---- | ||
| - | În fişierul de ieşire lab-02-11.out se vor afla soluţiile reale ale ecuaţiei în ordine crescătoare, cu 2 zecimale. | + | Soluţiile reale ale ecuaţiei în ordine crescătoare, cu 2 zecimale. |
| În caz că ecuaţia nu are soluţie se va afişa mesajul "Nu exista solutii". | În caz că ecuaţia nu are soluţie se va afişa mesajul "Nu exista solutii". | ||
| În caz că ecuaţia are o infinitate de soluţii se va afişa mesajul "Infinit". | În caz că ecuaţia are o infinitate de soluţii se va afişa mesajul "Infinit". | ||
| Line 437: | Line 414: | ||
| | 1 1 1 | Nu exista solutii | | | 1 1 1 | Nu exista solutii | | ||
| | 1 -3 2 | 1.00 2.00 | | | 1 -3 2 | 1.00 2.00 | | ||
| + | |||
| + | === Problema 12 === | ||
| + | |||
| + | Problema generării unor numere aleatoare poate fi considerată iniţial una complicată, dar limbajul C ne pune la dispoziţie biblioteca **stdlib**, cu ajutorul căreia lucrurile vor deveni foarte simple. Funcţiile şi constantele acestei biblioteci sunt declarate în header-ul **stdlib.h** pe care va trebui să-l includeţi la începutul programului pe care îl scrieţi. | ||
| + | |||
| + | Utilizând funcţia **rand()** veţi genera numere aleatoare cu valori cuprinse între **0** si **RAND_MAX**, unde **RAND_MAX** este o constanta definită în **stdlib.h**, având în general valoarea maximă a tipului **int**. | ||
| + | |||
| + | Valorile returnate de această funcţie sunt de fapt termenii unui şir de numere generat după o anumită formula ce foloseşte ca punct de plecare o valoare dată. Din cauza acestui aspect, pentru aceeasi valoare iniţială fixată, programul va genera la fiecare rulare aceleaţi numere aleatoare. Pentru a evita acest lucru, biblioteca pune la dispozitie funcţia **srand()** care primeşte ca parametru un număr întreg reprezentând valoarea iniţiala utilizată în calcularea şirului de numere aleatoare. | ||
| + | |||
| + | Astfel, paşii pentru rezolvarea problemei noastre sunt următorii : | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | // fixarea valorii utilizate în generarea numerelor: | ||
| + | srand( seed ); // unde seed este o valoare de tip intreg; | ||
| + | // obţinerea unui număr pseudoaleator: | ||
| + | n = rand(); // unde n este numarul intreg generat aleator; | ||
| + | |||
| + | </code> | ||
| + | |||
| + | <note important>Pentru a garanta că la fiecare rulare a programului valoarea seed este unică, recomandăm apelarea funcţiei srand cu ora locală a calculatorului în secunde. (Acest lucru va fi prezentat în laboratoarele următoare)</note> | ||
| + | |||
| + | Afişati pe ecran o linie conţinând 3 numere întregi, separate prin spaţiu, generate în mod aleator. | ||
| + | Rulaţi programul de mai multe ori cu aceeasi valoare seed. Ce observaţi ? | ||
| + | Schimbaţi valoarea seed şi rulaţi din nou. Ce observaţi ? | ||
| + | |||
| + | |||