Differences

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

Link to this comparison view

programare-cc:laboratoare:02 [2020/10/13 02:53]
viorel.mocanu
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ţ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ă ​tipului **int**.+Scriețun program care citește două numere ​naturale (de tip **int**) pe aceeași linieseparate prin câte un spațiuCalculaț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 325: Line 307:
 ---- ----
 ^ Intrare ​     ^ Ieşire ​      ^ ^ Intrare ​     ^ Ieşire ​      ^
-| 10 10 1   | echilateral|+| 10 10 10  ​| echilateral|
 | 4 5 3     | dreptunghic| | 4 5 3     | dreptunghic|
 | 5 10 10   | isoscel |  | 5 10 10   | isoscel | 
 | 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 ?
 +
 +
programare-cc/laboratoare/02.1602546832.txt.gz · Last modified: 2020/10/13 02:53 by viorel.mocanu
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