Skip to content

Latest commit

 

History

History
189 lines (159 loc) · 8.12 KB

FP_22_C_2021-11-11.md

File metadata and controls

189 lines (159 loc) · 8.12 KB

FUNCTIA PRINTF

f = format printf reprezentand o functie de tiparire formatata pe ecran

#include <stdio.h> // standard in out

Functia printf este o functie standard a limbajului C cu numar variabil de argumente. O functie cu lista variablia de argumente trebuie sa aiba cel putin un param. Exista functii standard, dar si definite de noi.

Functia printf are un parametru const char* si 3 puncte

printf(const char*,...);

Parametrul obligatoriu (primul) contine textul ce se afiseaza pe ecran, adica este vorba de un string NULL-terminat. In interiorul acestui text pot sa apara descriptori de tip. Acestia sunt inlocuiti la afisare cu valorile urmatorilor param ai functiei printf. De asemenea, in interiorul textului pot aparea si secvente escape.

ex.

int n=1;
float x=1.7f;
printf("Un intreg: %d, \nunreal: %f.\n",n,x);

%d este inlocuit cu al doilea param din printf, deci cu n %f este inlocuit cu al treilea param din printf, deci cu x \n escape => salt la linie noua

Descriptorii de tip se inlocuiesc de la stanga la dreapta in ordinea intalnirii lor cu valorile param , incepand cu al doilea: in loc de primul descriptor de tip se pune valoarea celui de-al doilea param, al doilea descriptor se inlocuieste cu valoarea celui de-al treilea param. Trebuie avut grija:

  • ca numarul descriptorilor de tip sa fie egal cu numarul de param ce urmeaza dupa primul
  • fiecare descriptor de tip sa fie de acelasi tip de date cu al valorii param ce inlocuieste

Daca nu se respecta aceste reguli, nu este semnalata eroare sau avertizare la compilare, in schimb, afisarea poate fi defectuoasa, rezultand chiar o eroare fatala ce intrerupe executia.

DESCRIPTORI DE TIP

Un descriptor de tip incepe cu caracterul procent % si este urmat de unul sau mai multe caractere ce dau tipul de date si eventual informatii cu privire la formatarea afisarii valorii respective.

ex.

%d -> descriptor de tip pentru afisarea unui numar intreg in baza 10 (d = decimal) %f -> descriptor de tip pentru o valoare de tip float (f = float)

Afisare formatata

Intre caracterul % si litera/literele tipului de date pot aparea informatii de formatare la afisare. ex. %7d -> se afiseaza un numar intreg in baza 10 pe 7 caractere cu aliniere la dreapta cele sase caractere suplimentare afisate cu variabila egala cu 1 sunt spatii

/_/_/_/_/_/_/1/

%-5d -> se afiseaza un numar intreg in baza 10 pe 5 caractere cu aliniere la stanga

/1/_/_/_/_/

%7.2f -> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la dreapta

/_/_/_/1/./7/0/

%-7.2f -> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la stanga %07.2f -> se afiseaza un numar real de tip float pe 7 caractere cu 2 cifre exacte dupa virgula si aliniat la dreapta

/0/0/0/1/./7/0/

%0.2f -> 2 zecimale exacte pe cate caractere incape

/1/./7/0/

%-20s -> afisarea unui string pe 20 de caractere cu aliniere la stanga

Lista descriptorilor de tip

%c -> caracter ASCII %s -> string NULL-terminat %d -> intreg in baza 10 %u -> unsigned int %ld -> long in baza 10 %lu -> unsigned long in baza 10 %o -> int in baza 8 %x -> int in baza 16 (scris cu minuscule) %X -> int in baza 16 (scris cu majuscule) %f -> float forma zecimala fara exponent %e -> float cu exponent (e) %E -> float cu exponent (E) %g -> float (scrierea mai scurta dintre cu exponent sau fara exponent) (e) %G -> float (scrierea mai scurta dintre cu exponent sau fara exponent) (E) %lf - > %le - > %lE - > double ... (vezi mai sus) %lg - > %lG - >

%Lf - > %Le - > %LE - > long double ... (vezi mai sus) %Lg - > %LG - >

%p -> pointer: se afiseaza o adresa de memorie, adica un numar intreg in baza 16

Secvente escape

In exemplul de mai sus am folosit de doua ori secventa escape \n care introduce in string practic caracterul cu codul ASCII 13, care la afisare are efectul de a se trece la linie noua (n = new line)

Lista secventelor escape acceptate este:

\n

\r ("return") se introduce caracterul ASCII 10 si are ca efect revenirea la inceputul liniei, fara a incepe o noua linie. \t ("tab") se insereaza un caracter TAB \b ("backspace") are ca efect mutarea cursorului cu o pozitie la stanga, fara a sterge caracterul \f ("form feed") se introduce un caracter care are ca efect trecerea pe linie noua atunci cand folosim o imprimanta \' caracterul ' apostrof \" caracterul " ghilimele \\ ("backslash") aceasta secventa escape este folosita mai ales atunci cand specificam cai Windows \%xcc se afiseaza caracterul avand codul ASCII in baza 16 dat dupa x (adica codul ASCII al cc in baza 16)

ex.

%x4A -> se va afisa 'J'

printf("Un test\r14\b ");

Un test 14 => 1 test

FUNCTIA SCANF

Functia scanf este o fuctie standard din stdio.h cu lista varianta de argumente folosita pentru citire de la tastatura a unor valori. Antetul functiei: scanf(const char*,...); Primul param al functiei scanf este tot un string NULL-terminat care trebuie sa contina NUMAI descriptori de tip fara formatari sau alte caractere. Daca se introduc alte caractere decat cele pentru descriptori nu optinem eroare la compilare, ci executia este defectuoasa. Numarul descriptorilor de tip trebuie sa fie egal cu numarul param de dupa primul. De asemenea, tipurile descriptorilor trebuie sa fie compatibile cu cele ale valorilor citite de la tastatura si depuse in param de dupa primul.

ex.

int n;
float f;
printf("Dati un int si un float:\n);
scanf("%d%f",&n,&f);

%d inseamna un descriptor de tip int , deci var n trebuie sa fie de tip int. %f inseamna descriptor pentru tipul float, deci var f trebuie sa fie de tip float. &var este un operator unar, care pus in fata unei variabile returneaza adresa de memorie alocata pentru var

La apelul functiei scanf se intalneste prima data descriptorul %d. De la tastatura se preiau primele caractere pana la intalnirea spatiu, tab sau enter. Cf lui %d, aceste caractere trebuie sa reprezinte forma text a unui numar intreg in baza 10. In consecinta, caracterele se convertesc la un numar intreg int pe 4 octeti si se depun la adresa data de al doilea param, adica se depun la adresa lui n. Acelasi lucru se intampla pentru urmatoarele caractere intalnite pana la tab, spatiu sau enter. Acestea sunt convertite la float si valoarea obtinuta este depusa la adresa variabilei f.

RAM: /_________/_/_/_/_/_______/_/_/_/_/____________/
              &n              &f

Este important de retinut ca spatiu, tab si enter sunt delimitatori de tokeni cititi de la tastatura.

ex.

for(unsigned char c=0;c<256;c++)
printf("%c %d\n",c,c); //ciclu infinit, unsigned char nu depasaseste 255


for(int c=0;c<256;c++)
printf("%c %d\n",c,c); //se afiseaza tabela ASCII

FLUXURI STANDARD ALE LIMBAJULUI C

stdout -> ecran stdin -> tastatura stderr -> erori (mesajele de erori ajung tot pe ecran pe alta cale) stdaux -> COM1 (serial) stdprn -> LPT1 (paralel)

Pentru a trimite un text intr-un flux de iesire avem functia fprintf care are doi param obligatorii, fluxul, stringul si altele...

fprintf(flux,str,...);

Functia fprintf este asemanatoare cu printf, cu deosebirea ca mesajul din al doilea param ajunge in fluxul dat in primul param.

ex.

fprintf(stdout,"un int%d",n);
se afiseaza pe ecran: un int ... ( unde ... reprezinta valoarea lui n)
fprintf(.......,"un int%d",n);
        stderr
        stdaux
        stdprn

Functia fscanf(flux,str,...) este similara cu scanf , doar ca datele sunt luate cf fluxului

fscanf(......,str,...)
       stdin
       stdaux
       stdprn

TPA: scdlt numele si varsta unor persoane se cere sa se afiseze tabelar aceste date. La sfarsit se va afisa varsta medie cu 2 zecimale exacte.