Programarea Calculatoarelor, seria CC

Laborator 2

Funcţii de citire-scriere în C

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



Implementarea programelor: editare şi compilare

Generalităţi

Atunci când dorim să implementăm un program, primul pas îl reprezintă scrierea instrucţiunilor acestuia într-un limbaj de programare (în acest caz, limbajul C). Pentru a realiza acest lucru se poate folosi orice editor simplu de texte, de exemplu:

Fişierul astfel obţinut este un simplu fişier text şi se numeşte fişier sursă. Conţinutul unui fişier sursă se numeşte cod sursă. Fişierele sursă pentru limbajul C au in mod convenţional extensia .c.

În continuare, pentru a obţine un program executabil, avem nevoie de un compilator specific limbajului care sa "traducă" codul sursă în instrucţiuni specifice procesorului. Conţinutul fişierului executabil rezultat se numeşte cod maşină, iar fişierele compilate (nu neapărat executabile) poartă numele de fişiere binare.

Există numeroase compilatoare pentru limbajul C. Cel mai cunoscut si mai răspândit este de departe gcc (denumirea vine de la GNU C Compiler), care poate fi instalat atât pe Linux, cât şi pe Windows sau Mac OS.

Există, bineînţeles, şi altele:

Cerinţă

Deschideţi un editor de texte (de exemplu, Mousepad sau GEdit) şi scrieţi următorul cod C:

#include <stdio.h>
int main(void)
{
    printf("PC 2010\n");
    return 0;
}

Salvaţi fişierul în directorul /home/student/ cu numele exemplu.c.

Deschideţi un terminal şi introduceţi comanda:

gcc exemplu.c

Executabilul creat se va numi implicit a.out. Pentru a-l rula, folosiţi comanda:

./a.out

Puteţi specifica voi un nume pentru fişierul executabil cu ajutorul opţiunii -o astfel:

gcc -o exemplu.exe exemplu.c

Cu toate acestea, extensia .exe este folosită de obicei pentru executabilele de Windows, iar executabilele de Linux nu au, în mod normal extensie! Este bine sa respectaţi aceste convenţii nescrise pentru a vă face mai uşor înţeleşi.


Folosirea unui mediu integrat de dezvoltare (IDE): Code::Blocks

Generalităţi

Mai ales la început, vi s-ar putea părea mai uşor să folosiţi un mediu de programare care vă permite să editaţi codul sursă şi să compilaţi şi rulaţi programele direct dintr-o interfaţă grafică. Există foarte multe medii integrate de dezvoltare pentru limbajul C, fiecare cu avantajele şi dezavantajele sale. Dintre cele mai cunoscute, amintim doar câteva:

Vă încurajăm să le încercaţi în timpul liber pentru a vă forma o părere despre care vi se potriveşte mai bine :).

Cerinţă

În laborator există instalat mediul Code::Blocks. Folosirea acestuia este intuitivă. Deschideţi Code::Blocks şi creaţi un nou fişier (File -> New -> Empty File).

Copiaţi programul de mai sus şi salvaţi-l. Compilaţi şi rulaţi programul (folosind meniul, iconiţele, shortcut-urile etc).

Pentru depanarea programelor va fi necesar să creaţi un nou proiect (File -> New -> Project). Alegeţi Console Application şi în fereastra următoare, limbajul C. Completaţi numele proiectului şi calea unde doriţi să fie creat (de exemplu, în /home/student/).

Copiaţi următorul program:

int main()
{
    int a, b, rest;
    a = 150;
    b = 84;
    while (b > 0) {
        rest = a % b;
        a = b;
        b = rest;
    }
    printf("cmmdc(150, 84) = %d\n", a);
    getchar();
    return 0;
}

Adăugaţi un breakpoint la linia a = 150; (click la dreapta numărului corespunzător liniei) şi porniţi programul în modul de depanare (debugging) cu ajutorul tastei F8. Pentru a urmări valorile unor variabile pe parcursul execuţiei programului pas cu pas, faceţi vizibilă fereastra watch(Debug -> Debugging Windows -> Watches) şi adăugaţi numele variabilelor pe care vreţi să le monitorizaţi (click dreapta în interiorul ferestrei şi alegeţi Add Watch). Rulaţi programul instrucţiune cu instrucţiune (cu ajutorul tastei F7) şi urmăriţi cum se modifică valorile variabilelor.

Încercaţi să vă familiarizaţi cu editorul şi cu debuggerul şi cereţi explicaţii suplimentare dacă este cazul.


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:

D. specificatorii de tip:

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 :

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:


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!