This shows you the differences between two versions of the page.
programare-cc:laboratoare:02 [2020/10/13 02:25] viorel.mocanu |
programare-cc:laboratoare:02 [2024/10/16 10:02] (current) mihai.nan [Probleme propuse] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 02. ===== | + | ===== 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. | + | |
- | + | ||
- | 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 ? | + | |
- | ===== Problema 2 ===== | + | === 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: | 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: | ||
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/10.** | ||
Line 252: | Line 235: | ||
- | ===== Problema 4 ===== | + | === Problema 4 === |
- | ===== Problema 5 ===== | + | |
- | ===== Problema 6 ===== | + | 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**. |
- | ===== Problema 7 ===== | + | |
- | ===== Problema 8 ===== | + | **Date de Intrare** |
- | ===== Problema 9 ===== | + | ---- |
- | ===== Problema 10 ===== | + | O singură linie pe care se află două numere reale, **X** şi **Y**, reprezentând coordonatele punctului pe axa **Ox**, respectiv **Oy**. |
- | ===== Problema 11 ===== | + | |
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură linie care va conţine numărul cadranului în care se află punctul, sau mesajul "punct pe axe". | ||
+ | |||
+ | **Restricţii şi Precizări** | ||
+ | ---- | ||
+ | * -1000 ≤ X, Y ≤ +1000 | ||
+ | |||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | -23.15 1.2 | 2 | | ||
+ | | 19.2 1 | 1 | | ||
+ | | 0 0 | punct pe axe | | ||
+ | |||
+ | === Problema 5 === | ||
+ | |||
+ | Scrieţi un program care să verifice dacă 3 numere întregi date **a, b, c** pot forma lungimile laturilor unui triunghi. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | O singură linie care va conţine trei numere întregi: **a, b şi c** separate prin spaţii. | ||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură linie care va contine un mesaj din mulţimea { **DA**, **NU** }. Nu afişaţi spaţii sau alte caractere suplimentare. | ||
+ | |||
+ | |||
+ | **Restricţii şi Precizări** | ||
+ | ---- | ||
+ | * -1.000.000.000 ≤ a, b, c ≤ +1.000.000.000 | ||
+ | * a + b + c ≠ 0 | ||
+ | * Se consideră triunghi şi un triunghi cu un unghi de 180 de grade şi două unghiuri de 0 grade. | ||
+ | |||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 5 4 3 | DA | | ||
+ | | -1 2 0 | NU | | ||
+ | | 6 6 0 | DA | | ||
+ | |||
+ | === 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//. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | Trei numere reale: **a, b şi c.** | ||
+ | |||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură **linie** care va contine un mesaj din mulţimea { **oarecare, echilateral, dreptunghic, isoscel, dreptunghic isoscel** }, în funcţie de tipul de triunghi. | ||
+ | Nu afişaţi spaţii sau alte caractere suplimentare. | ||
+ | |||
+ | **Restricţii şi Precizări** | ||
+ | ---- | ||
+ | * Cele trei numere pot forma întotdeauna laturile unui triunghi. | ||
+ | * Două numere reale se vor considera egale dacă diferenţa lor în modul este mai mică decât 0.001. | ||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 10 10 10 | echilateral| | ||
+ | | 4 5 3 | dreptunghic| | ||
+ | | 5 10 10 | isoscel | | ||
+ | | 2.8284 2 2| dreptunghic isoscel| | ||
+ | |||
+ | === Problema 7 === | ||
+ | |||
+ | Scrieţi un program care determină minimul şi maximul dintre 4 numere, folosind doar instructiunea **if**. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | O singură linie care va conţine patru numere întregi, **A, B, C şi D** separate prin spaţii. | ||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură **linie** care va conţine două numere întregi, separate printr-un singur spaţiu, reprezentând în ordine minimul şi maximul dintre cele patru numere. | ||
+ | |||
+ | |||
+ | **Restricţii şi Precizări** | ||
+ | ---- | ||
+ | * 1 ≤ A, B, C, D ≤ 2.000.000.000 | ||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 23 5321 331245 2000000000 | 23 2000000000| | ||
+ | |||
+ | === Problema 8 === | ||
+ | |||
+ | Afişaţi trei numere în ordine crescătoare, folosind doar instrucţiunea **if**. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | O singură linie care va conţine trei numere întregi, **A, B, şi C** separate prin spaţii. | ||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | 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** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 123109 2342 12 | 12 2342 123109 | | ||
+ | |||
+ | === 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. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | O singură linie pe care se află trei numere întregi **H, M şi S**. | ||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură linie care va conţine momentul zilei exprimat în format de ceas digital **HH:MM:SS**. | ||
+ | |||
+ | **Restricţii şi Precizări** | ||
+ | ---- | ||
+ | * 0 ≤ H ≤ 23 | ||
+ | * 0 ≤ M, S ≤ 59 | ||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 15 42 3 | 15:42:03 | | ||
+ | |||
+ | === 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. | ||
+ | <note tip>//**Scanf** returnează numărul de argumente citite, care se potrivesc cu formatul căutat. Astfel, scanf("%d",&a) va returna 1 dacă a citit un întreg sau 0 altfel.//</note> | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | O singură linie pe care se află trei numere întregi **H, M şi S** sau alte caractere eronate. | ||
+ | |||
+ | **Date de Ieşire** | ||
+ | ---- | ||
+ | O singură linie care va conţine momentul zilei exprimat în format de ceas digital **HH:MM:SS** sau mesajul Date incorect introduse! | ||
+ | |||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 1a 42 3 | Date incorect introduse! | | ||
+ | | 11 4.2 3 | Date incorect introduse! | | ||
+ | |||
+ | === Problema 11 === | ||
+ | |||
+ | Scrieţi un program pentru rezolvarea ecuaţiei de gradul 2. | ||
+ | |||
+ | **Date de Intrare** | ||
+ | ---- | ||
+ | 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** | ||
+ | ---- | ||
+ | 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 are o infinitate de soluţii se va afişa mesajul "Infinit". | ||
+ | |||
+ | |||
+ | **Exemplu** | ||
+ | ---- | ||
+ | ^ Intrare ^ Ieşire ^ | ||
+ | | 1 -2 1 | 1.00 | | ||
+ | | 1 1 1 | Nu exista solutii | | ||
+ | | 1 -3 2 | 1.00 2.00 | | ||
+ | |||
+ | === Problema 10 === | ||
+ | |||
+ | 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 ? | ||
+ |