Breviar 02 - Funcții de citire și scriere

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

  • Compilaţi şi rulaţi programe în C, sub Linux, din linia de comandă
  • Editaţi programe folosind mediul integrat de dezvoltare Code::Blocks
  • Faceţi afişare şi citire formatată
  • Folosiţi corect flag-urile de formatare
  • Folosiţi corect specificatorii de format

Implementarea programelor: editare şi compilare

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:

  • Sub Windows: Notepad, Notepad++, EditPlus
  • Sub Linux: kate, vim, emacs, gedit, mousepad
  • Sub Mac OS: emacs, TextMate

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:

  • Microsoft C (doar pentru Windows)
  • Borland C Compiler (doar pentru Windows si DOS)
  • LCC (disponibil pentru Windows, Linux şi OS X – folosit pentru a compila maşinile virtuale pentru Quake III)

Cerinţă

  • Deschideţi un editor de texte (de exemplu, VS Code sau GEdit) şi scrieţi următorul cod C:
#include <stdio.h>
 
int main()
{
    printf("Programarea Calculatoarelor\n");
    return 0;
}
  • Salvaţi fişierul în directorul $HOME 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 exemplu.c

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

Pentru a putea folosi Code::Blocks pe sistemele Linux, trebuie să îl instalaţi folosind comanda:

  • sudo apt-get install codeblocks

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:

  • Code::Blocks (pentru Windows, Linux şi Mac)
  • DevCpp (preponderent Windows, dar şi Linux)
  • Microsoft Visual Studio (pentru Windows)
  • Eclipse (pentru Windows, Linux şi Mac)
  • KDevelop (preponderent Linux, dar practic Cross-Platform)
  • Anjuta (pentru Linux şi Mac)

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ţă

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).

Copiaţi următorul program:

#include <stdio.h>
 
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

În limbajul C, cele mai utilizate funcţii standard pentru citirea şi afişrea datelor sunt printf şi scanf, definite în biblioteca <stdio.h>

Citirea datelor

Vom ilustra folosirea funcţiei scanf printr-un exemplu:

int a;
float b;
unsigned int c;
scanf("%d%f%u", &a, &b, &c);

Primul parametru al funcţiei scanf este un şir între ghilimele alcătuit dintr-o succesiune de specificatori de forma %_, unde al doilea caracter este o litera. Acest şir de specificatori descrie datele pe care le va citi funcţia. În continuare, urmează o lista de nume de variabile precedate de &, care descrie variabilele în care se vor stoca datele citite.

O greşeală frecventă este să uitaţi să puneţi operatorul & înainte numelor variabilelor ce vor fi citite!

Este foarte important ca numărul de variabile să fie egal cu numărul de specificatori din interiorul şirului! În caz contrar, programul vostru se va comporta imprevizibil!

Este foarte important ca tipul şi ordinea variabilelor să se potrivească, cu tipul şi ordinea specificatorilor! În caz contrar, programul vostru se va comporta imprevizibil!

Atunci când vreţi doar să citiţi date, nu puneţi şi alte caractere în şirul de specificatori. Nu scrieţi apeluri de forma scanf(“Numarul N = %d”, &n);. Folosiţi în schimb:

printf("Numarul N = ");
scanf("%d", &n);

Scrierea datelor

Ca şi la citire, vom ilustra folosirea funcţiei printf printr-un exemplu:

printf("Ana are %d mere. Ele costa %.2f RON/kg.", n, price);

Sintaxa este asemănătoare cu sintaxa pentru funcţia scanf, dar există câteva diferenţe. Şirul dintre ghilimele poate conţine şi alt text pe lângă specificatorii de format. La execuţie, specificatorii vor fi pur şi simplu înlocuiţi cu valorile preluate din lista de parametri.

De asemenea, nu trebuie să precedaţi variabilele din lista de valori cu &, şi nu sunteţi obligaţi nici să specificaţi variabile în acea listă, putând insera şi constante numerice sau valori returnate de apeluri de funcţii. De exemplu:

printf("sin(1 rad) = %f", sin(1));
printf("Codul ASCII al literei 'A' este: %d", 'A');

În continuare, trebuie să verificaţi că ordinea şi tipul specificatorilor corespunde cu ordinea şi tipul valorilor afişate. În caz contrar, programul vostru se va comporta imprevizibil!

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

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

  • flags:
    • - Valoarea afişată va fi aliniată la stânga
    • + (pentru numere: int, float, etc.) Forţează afişarea semnului şi pentru numerele pozitive
    • # Modifică suplimentar afişarea (vezi explicaţie la fiecare specificator)
    • 0 (pentru numere) Completează cu zerouri până la atingerea lăţimii câmpului
  • 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 (aliniat la dreapta). De exemplu, dacă i este egal cu 1000, atunci el va fi precedat de 6 spaţii astfel: __1000.

  • specificatorii de lungime:
    • hh char
    • h short
    • l long
    • ll long long
    • L long double
  • 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/cstdio/printf/

programare-cc/breviar-2.txt · Last modified: 2020/10/29 21:19 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