Programarea Calculatoarelor, seria CC

Laborator 2

Funcţii de citire-scriere în C

În acest laborator veţi învăţa să:



Despre citirea şi scrierea în C

Descriptorii de formatare au următorul prototip (ce se afla între [ ] este optional):

%[flags][lăţime][.precizie][specificatori de lungime]specificatori de tip

A. flags:

B. lăţime şi precizie sunt specificate fie prin întregi, fie prin caracterul *, caz în care vor fi trimise ca parametri. De exemplu:

printf("%*d", 10, i);

va afişa întregul i pe 10 spaţii

C. specificatorii de lungime:

  • hh char
  • short
  • long
  • ll long long
  • long double

D. specificatorii de tip:

  • d, i întreg
  • o întreg în baza 8
  • x, X întreg în baza 16 (fără 0x la Început - folosiţi # pentru a afişa şi 0x) folosind abcdef sau ABCDEF
  • u întreg fără semn
  • c caracter
  • s şir de caractere
  • f număr real în format cu virgulă (de exemplu, -56.340000)
  • e număr real în format mantisă-exponent (de exemplu -5.634000e+001)
  • g număr real în format %e daca numărul este mai mic de 1e-4 sau decât precizia specficată, altfel în format %f, dar fără 0-uri la sfârşit (de exemplu -56.34)

Pentru formatele f, e şi g, folosirea # forţează afişarea punctului zecimal, chiar dacă numărul afişat nu are cifre zecimale.

Mai găsiţi detalii şi pe http://www.cplusplus.com/reference/clibrary/cstdio/printf.html.


Problema 1.

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 :

  • 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;

Notă: 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)

Problema:

  • Afişati pe ecran 5 rânduri, fiecare 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 afişează 3 numere de tip float folosind, succesiv, descriptorii %f, %e şi %g pentru cele 3 valori. Folosiţi următoarele date de intrare:

1e2 1e2 1e2
23.22e+03 23.22e+3 23.22e+03
21 1201 122234215001

Observaţii:


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.

#include <stdio.h>
#include <math.h>

int main()
{
     double x, PI = M_PI;
     for (x=0;x<=2*PI;x=x+PI/10)
          printf ("%lf \n", sin(x));
     getchar();
     return 0;
}

Modificaţi programul astfel încat pentru fiecare x între 0 şi 2*PI cu pasul PI/20 să fie afişate valorile lui x şi ale funcţiilor sin(x), cos(x) sub formă de tabel. Adăugati apoi un cap de tabel şi modificaţi programul astfel încat fiecare coloană din tabel să aibă 8 caractere, iar numerele să fie afişate cu cel mult 3 zecimale şi semnul + să apară în faţa numerelor pozitive.


Problema 4.

Scrieţi un program care să determine cadranul în care se află un punct dat prin coordonatele sale (întregi sau reale). Se va afişa un număr între 1 şi 4 sau mesajul 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.

Exemplu:

Intrare Ieşire
a=10
b=10
c=20
DA
a=10
b=5
c=30
NU
a=5
b=10
c=10
DA

Problema 6.

Scrieţi un program care citeşte 3 numere date reprezentând lungimile laturilor unui triunghi şi care afişează tipul de triunghi cu aceste laturi: oarecare, isoscel, echilateral, dreptunghic sau dreptunghic isoscel.

Exemplu:

Intrare Ieşire
a=10
b=10
c=10
echilateral
a=4
b=5
c=3
dreptunghic
a=5
b=10
c=10
isoscel

Problema 7.

Scrieţi un program care determină minimul şi maximul dintre 4 numere, folosing doar instructiunea if.


Problema 8.

Se citesc 3 numere de la tastatură. Afişaţi-le în ordine crescătoare, folosind doar instrucţiunea if.


Problema 9.

Scrieţi un program care va citi de la tastatură 3 intregi, h, m, s, reprezentând ora, minutul şi secunda dintr-un anumit moment al zilei. Afişarea se va face sub forma HH:MM:SS (2 cifre pentru fiecare, chiar daca valorile sunt mai mici decat 10).

Exemplu:

Intrare Ieşire
h=15
m=42
s=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 comporta anormal. Încercati să modificaţi programul astfel încat să aveţi protecţie la datele eronate.

HINT: 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.

Exemplu:

Intrare Ieşire
h=1a
m=42
s=3
Date incorect introduse!
h=11
m=4.2
s=3
Date incorect introduse!