Sunteți pe pagina 1din 18

Afisarea pe terminal - formatare

2016/2017 - Suceava
ž
În limbajul C putem depune în fluxul de ieşire valorile unor expresii
aparţinând unor tipuri primitive şi anume:
• caractere,
• întregi,
• reali şi
• şiruri de caractere.

Funcţia printf( ... ) realizează transferul şi conversia de reprezentare


a valorii expresiei în şir de caractere, sub controlul unui format
de afisare, construit in jurul specificatorilor de format:

nr = printf( format, e1, e2, …, en);


Limbajul C
[ Scrierea cu Pentru fiecare <expesie> ei există în format un descriptor
format ] care începe prin %.
Afişarea fiecărei expresii se face corespunzător
descriptorului de format corespunzator.

Sintaxa descriptorului de format este:

% [ - ][ Lung ][ .frac ][ l ] descriptor

Funcţia furnizează numărul de caractere afişate - nr.


[ date::structuri::functii ]
Afisarea pe terminal - formatare
2016/2017 - Suceava
Descriptor Reprezentare
%c caracter
%d %i intreg in zecimal
%u intreg in zecimal fara semn
%o intreg in octal
%x intreg in hexazecimal
%ld %li %lu
cu semnificatiile de mai sus, pentru intregi lungi
%lo %lx
f - real zecimal de forma [-]xxx.yyyyyy (implicit
6 cifre)
e sau E - real afişat sub forma [-]x.yyyyyye+zz
%f %e %g
g - realizează conversia şi afişarea ca
descriptorul f sau e astfel încât să apară un

C
număr minim de cifre afişate
Limbajul %lf %le double

[ Scrierea cu
%Lf %Le long double

format ] Semnul - după % - aliniere la stânga în câmpul de lungime Lung


Dacă expresia conţine mai puţin de Lung caractere, ea este precedată de
spaţii sau zerouri, atunci cand Lung începe printr-un zero.

Dacă expresia conţine mai mult de Lung caractere, câmpul de afişare


este extins.

frac - indică numărul de cifre după virgulă ( precizia )


l - marchează un long int ( h - un short int ).
( Pentru reali aceştia sunt double )
- precede unul din descriptorii f,e,E,g,G pentru afişarea unei
[ date::structuri::functii ]
L
valori de tip long double
Afisarea pe terminal - formatare
2016/2017 - Suceava
int x;
float y;
char s[20];

/* afisare valoare pe 10 pozitii, aliniata la dreapta si


completata cu blancuri
*/
printf( “%10d\n”, x );

/* afisare valoare pe 10 pozitii, aliniata la stanga si


completata cu blancuri
*/
printf( “%-10d\n”,x );

C
/* afisare valoare pe 10 pozitii, aliniata la dreapta si
Limbajul */
completata cu zerouri

[ Scrierea cu printf( “%#010d\n”,x );

format ] /* afisare valoare pe 10 pozitii, aliniata la dreapta si


completata cu 0x
*/
printf( “%#x10d\n”, x );

/* afisare valoare pe 5 pozitii cu 2 zecimale, aliniata


la dreapta si completata cu 0x
*/
printf( “%5.2f\n”, y );
/* afisare sir pe 10 pozitii, aliniat la dreapta
*/
[ date::structuri::functii ] printf( “%10s\n”, s );
Citirea de pe terminal – cu formatare
2016/2017 - Suceava
nr = scanf( format, a1, a2, …, an)

Citeşte valorile de la intrarea standard în formatul precizat şi le


plasează în variabilele cu adresele a1, a2, ….
“Pentru o variabilă simplă sau înregistrare, adresa se obţine
folosind operatorul &”
Sintaxa descriptorului de format este:

% [*] [ Lung ] [ l ] descriptor

Descriptorul indică conversia care se face:


d - întreg în baza 10

C
o - întreg în baza 8
Limbajul x - întreg în baza 16
f - real
[ Citirea cu c - caracter
format ] s - şir de caractere.
* indică faptul că valoarea citită nu se atribuie unei
variabile.

Lung indică lungimea câmpului din care se face citirea. În


lipsa lui citirea se opreşte la primul caracter care nu face parte
din număr.

L indică un întreg long sau un real double; h - indică un


întreg short.
[ date::structuri::functii ] Funcţia scanf() furnizează numărul de câmpuri citite - nr.
2016/2017 - Suceava
ž Citirea de la terminal

int mac[10], a;
float b;
double c;
char s[20];

/* Citire tipuri fundamentale, separate prin SPATIU,


TAB sau ENTER.
*/
scanf( “%d%f%lf”, &a, &b, &c );

/* Citire sir caractere pana la apasarea tastei ENTER.

C
dar memoreaza pana la primul SPATIU, TAB sau ENTER.
Limbajul */
scanf( “%s”, s ); //scanf( “%s”, &s[0] );
[ functii de citire
si scriere ] /* citire sir de intregi (hexazecimal) dupa modelul:
AA:0F:A1:BF:C2:93
*/
scanf( “%x:%x:%x:%x:%x:%x”, &mac[0], &mac[1],
&mac[2],&mac[3], &mac[4], &mac[5], );

[ date::structuri::functii ]
citirea/scrierea la nivel de caracter
2016/2017 - Suceava

Pentru realizarea operaţiilor de transfer între memorie şi fişierele


standard se utilizează următoarele funcţii:

1. getch() - citeşte un caracter, fără ecou de la tastatură; funcţia


returnează valoarea ASCII a caracterului citit. Apelul getch() se
foloseşte pentru a reţine fereastra de ieşire; dacă se introduce un
caracter, se trece în fereastra de editare.
2. getche() - are acelaşi efect cu funcţia getch(), cu deosebirea
că citirea se face cu ecou.
3. putch( <expresie> ) - afişează pe ecran caracterul având
codul ASCII egal cu valoarea expresiei; funcţia returnează codul
caracterului afişat.

Limbajul C Aceste funcţii au prototipurile declarate în fişierul <conio.h>.


[ functii de citire 1. getchar() - nu este o funcţie ci o macroinstrucţiune. Are ca efect
si scriere ] citirea cu ecou a unui caracter de la terminalul standard.
Caracterele introduse de la tastatură sunt puse într-o zonă
tampon, până la acţionarea tastei ENTER, moment în care în zona
tampon se introduce caracterul rând nou. Fiecare apel getchar()
preia următorul caracter din zona tampon.
2. putchar( <expresie> ) - este tot o macroinstrucţiune, care
afişează caracterul având codul ASCII egal cu valoarea parametru
<expresie>.

Macrourile getchar şi putchar sunt definite în fişierul <stdio.h>.


[ date::structuri::functii ]
citirea/scrierea unei LINII
2016/2017 - Suceava
• pointer = gets( <adr_sir_car> ) - introduce de la terminalul standard
un şir de caractere terminat prin acţionarea tastei ENTER.
Funcţia are ca parametru adresa zonei de memorie în care se
introduc caracterele citite.
Funcţia returnează adresa de început a zonei de memorie
(adr_sir_car);
La întâlnirea sfârşitului de fişier ( CTRL Z ) funcţia returnează NULL.

• val = puts( <sir_car> ) – afişează la terminalul standard şirul de


caractere din sirul dat ca parametru, până la caracterul NULL, care va
fi înlocuit prin caracterul linie noua ‘\n’.
Funcţia returnează codul ultimului caracter din şirul de caractere
afisate (-1 în caz de eroare).
Limbajul C Funcţiile gets() şi puts() au prototipurile în fişierul <stdio.h>.
[ functii de citire
si scriere ] REFERAT
Analizand urmatoarele pagini de manual veti realiza un referat (format electronic
doc, pdf, etc), in care veti descrie sintaxa completa pentru familia de functii printf(),
scanf(), exemplificand pentru fiecare caz in parte cu secvente de program C, la care
veti include si efectul obtinut pe consola.
In final veti construi o aplicatie C ce va valorifica la maxim sintaxa celor dou functii.
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
http://www.manpagez.com/man/3/printf/
http://www.manpagez.com/man/3/scanf/
Termen de predare: 12.11.2010
To: remus@eed.usv.ro
[ date::structuri::functii ] From: _____@stud.usv.ro
Expresii
2016/2017 - Suceava
ž
O expresie este compusă din una sau mai multe operaţii.

Operaţiile sunt reprezentate de operatori ce acţionează


asupra operanzilor.

Operatorii care admit un operand sunt numiţi operatori unari,


în timp ce operatorii care implică 2 operanzi sunt numiţi
operatori binari.

Operanzii pentru un operator binar sunt cunoscuţi ca


operand stânga sau dreapta.

Parte din operatori i limbajului C pot reprezenta şi o operaţie


Limbajul C unară şi o operaţie binară.

[ operatori si #include <stdio.h>


expresii ] #define PI 3.14159265
void main( void )
{
float rad, gfr, mfr;
int g, m, s;
printf(“Introduceti numarul de radiani: “);
scanf("%f", &rad);
g = gfr = rad*180/PI;
m = mfr = (gfr-g)*60;
s = (mfr-m)*60;
printf("%5.2f radiani=%4d gr.%02d min %02d sec\n",
rad, g, m, s);
[ date::structuri::functii ] }
2016/2017 - Suceava Tabela Operatorilor limbajului C

Dupa Kernighan & Ritchie [1] tabela


precedentei operatorilor limbajului C este:

Operatori Aociativitate
() [] -> . de la stânga la dreapta
! ~ + - ++ -- de la dreapta la stânga
& * (cast) sizeof
* / % de la stânga la dreapta
+ - de la stânga la dreapta
<< >> de la stânga la dreapta

C
< <= > >= de la stânga la dreapta
Limbajul == != de la stânga la dreapta

[ operatori si & de la stânga la dreapta


^ de la stânga la dreapta
expresii ] | de la stânga la dreapta
&& de la stânga la dreapta
|| de la stânga la dreapta
?: de la dreapta la stânga
(operatorul condiţional)
= *= /= %= += -= de la dreapta la stânga
&= ^= |= <<= >>=
,(operatorul virgulă) de la stânga la dreapta

[1] Brian Kernighan, Dennis Ritchie - prima editie “The C Programming


[ date::structuri::functii ] Language”, 1978
http://www.dipmat.univpm.it/~demeio/public/the_c_programming_language_2.pdf
2016/2017 - Suceava Tabela Operatorilor limbajului C

Odata standardizat ANSI-ISO[2][3][4][5] limbalul C,


precedentei operatorilor este urmatoarea:
Operatori Aociativitate
() [] -> . ++ --(postfixati) de la stânga la dreapta
! ~ + - ++ --(prefixati) de la dreapta la stânga
& * (cast) sizeof
* / % de la stânga la dreapta
+ - de la stânga la dreapta
<< >> de la stânga la dreapta
< <= > >= de la stânga la dreapta
== != de la stânga la dreapta

Limbajul C &
^
de la stânga la dreapta
de la stânga la dreapta
[ operatori si | de la stânga la dreapta
expresii ] && de la stânga la dreapta
|| de la stânga la dreapta
?: (operatorul condiţional) de la dreapta la stânga
= *= /= %= += -= de la dreapta la stânga
&= ^= |= <<= >>=
,(operatorul virgulă) de la stânga la dreapta

[1] K&R C - 1978, Brian Kernighan, Dennis Ritchie -The C Programming Language.
[2] C89, C90 – acelasi standard ISO/IEC 9899:1990.
[3] C99 – noul standard ISO/IEC 9899:1999, aducand multe modificari
[4] C11, C1X – standard modern ISO/IEC 9899:2011, este adaugat multi threading…
[ date::structuri::functii ] [5] C18,– ultimele modificari in iunie 2018, ISO/IEC 9899:2018,
introdus in compilatoarelein GCC 8 and LLVM Clang 6.0
2016/2017 - Suceava Conversii aritmetice
ž
Când un operator binar se aplică între doi operanzi de tip
diferit, are loc o conversie implicită:
{ operandul de tip “mai slab reprezentat” este convertit la tipul
“mai puternic reprezentat” al celuilalt operand. }

Astfel în expresia f + i, operandul int este convertit în float.

Operatorii aritmetici convertesc automat operanzii la un


anumit tip, dacă operanzii sunt de tip diferit.

Se aplică următoarele reguli:

C
1. operanzii char şi short int se convertesc în int; operanzii float
Limbajul se convertesc în double.
[ operatori si 2. dacă unul din operanzi este double restul operanzilor se
expresii ] convertesc în double iar rezultatul este tot double.

3. dacă unul din operanzi este long restul operanzilor se


convertesc în long , iar rezultatul este tot long.

4. dacă unul din operanzi este unsigned restul operanzilor


se convertesc în unsigned , iar rezultatul este tot
unsigned.

5. dacă nu se aplică ultimele 3 reguli, atunci operanzii vor fi


[ date::structuri::functii ] de tip int şi rezultatul de asemeni de tip int.
2016/2017 - Suceava Conversii aritmetice
ž

EXEMPLU

int a=5, b=2, c;


float f=5.0;

c = a / b; //rezulta un int = 2
a = f / b; //rezulta un int = 2, chiar daca
//...impartiera a fost corecta 2.5
f = a / b; //rezulta un float = 2.0, deoarece
Limbajul C //...se face impartiera intreaga

[ operatori si
expresii ]

[ date::structuri::functii ]
2016/2017 - Suceava Conversii de tip CAST
ž
Conversiile explicite de tip (numite şi cast) pot fi forţate în orice
expresie folosind un operator unar (cast) într-o construcţie de
forma:

(tip) expresie

în care expresia este convertită la tipul numit.

Operatorul cast are aceeaşi precedenţă cu a unui operator


unar.

Limbajul C EXEMPLU
[ operatori si
expresii ] int
float
a=5, b=2, c;
f=5.0;

c = a / b; //rezulta un int = 2
f = (float)a / b; //rezulta un float = 2.5
a = (int)f / b; //rezulta un int = 2

[ date::structuri::functii ]
2016/2017 - Suceava Operatorii aritmetici
ž
Operatorii aritmetici binari sunt:

+, -, *, / şi % (modulo = restul impărţirii întregi).

Prioritatea operatorilor aritmetici este:


+, - unari
*, /, % binari
+, - binari

Regula
de asociativitate este de la stânga la dreapta ( la
priorităţi egale operatorii sunt evaluaţi de la stânga la
Limbajul C dreapta ).

[ operatori si 21 / 6; // = 3
expresii ] 21 / 7; // = 3
22 % 6; // = 4
21 / 0 ; //divide overflow

Observatie
Operatorul modulo calculează restul împărţirii a două
valori. Poate fi aplicat doar operanzilor de tip int.

[ date::structuri::functii ]
2016/2017 - Suceava Operatorii de atribuire
ž
Operaţia de atribuire modifică valoarea asociată unei
variabile (partea stângă) la valoarea unei expresii
(partea dreaptă).

<id_variabila> = <expresie>;
Valoarea transmisă din partea dreaptă este convertită
implicit la tipul părţii stângi.

Atribuiri de forma:
a = a op b
se scriu compact
a op= b
Limbajul C în care op poartă numele de operator de atribuire,
acesta putând fi un operator aritmetic:
[ operatori si ( +, -,*,/,% )
expresii ] sau ( >>, <<, &, ^, | ).

O atribuire multiplă are forma:

v1 = v2 = ... = vn = expresie;

şi este asociativă la dreapta.

O operaţie de atribuire terminată prin punct-virgulă


(terminatorul de instrucţiune) se transformă într-o
instrucţiune de atribuire.
[ date::structuri::functii ]
2016/2017 - Suceava Operatorii relationali si logici
ž
Operatorii relaţionali sunt:

>, >=, <, <=, ==, !=

care au toţi aceeaşi prioritate (precedenţă).

Cu prioritate mai mică sunt: ==, !=.

Operatorii relaţionali au prioritate mai mică decât operatorii


aritmetici. Putem deci scrie: a < b -1 în loc de a < (b -1)

Operatorii logici sunt:


Limbajul C - && - SI logic ( TRUE doara daca ambii operanzi
sunt TRUE )
[ operatori si - || - SAU logic ( TRUE cand cel putin un operand
expresii ] este TRUE )
- ! - Negatie ( TRUE daca expresia este FALSA )

Rezultatul unui operator relational sau logic este o valoare


logica. In limbajul C, valoarea:
- FALSE echivalent cu ZERO
- TRUE echivalent cu orice valoare diferita de ZERO

Exemplu
char car;
[ date::structuri::functii ] car >= ‘a’ && car <= ‘z’
2016/2017 - Suceava Operatorii
ž incrementare/decrementare

Operatorii de incrementare (++) şi decrementare (--)


reprezintă o notaţie convenţională, compactă pentru
adunarea şi scăderea valorii 1 dintr-o variabilă.

Fiecare operator are o formă prefix şi alta postfix.


id_var ++; ++ id_var;
id_var --; -- id_var;

int c=0, a, b;
a = ++c; //increment prefix
Limbajul C b = c++; // increment postfix
//a=1; b=1; c=2;
[ operatori si
expresii ] Forma prefix incrementează/decrementează valoarea lui
id_var înainte ca id_var să fie utilizată, iar în cazul formei
postfix, valoarea este incrementată / decrementată
după ce a fost utilizat id_var.

Există şi posibilitatea reţinerii unor valori parţiale, de


exemplu:
a = 2; b = 3;
c = ( d = a++ + 1 ) - b--;
//a=3, b=2, c=0, d = 3
[ date::structuri::functii ]
2016/2017 - Suceava Operatorii binari – pe BITI
ž
În C există 6 operaţii de manipulare a biţilor, aplicate
asupra unor operanzi întregi (char, short, int, long) cu
sau fără semn:
& - ŞI
| - SAU
^ - SAU exclusiv
<< - deplasare stânga
>> - deplasare dreapta
~ - complement fată de 1 (inversare)

Operatorul ŞI se foloseste pentru operaţia de mascare a


unor biţi.
Limbajul C n=n & 0177;
/* pune pe 0 bitii din pozitia 8 in sus */
[ operatori si
expresii ] Operatorul SAU pune pe 1 biţii specificaţi printr-o mască:
x=x | 0x03;
/* sunt 1 bitii ce sunt 1 in MASCA – 0x03*/

Deplasarea dreapta a unui întreg cu semn este


aritmetică, iar a unui întreg fără semn este logică.
x |= 1 << 7;
/* pune pe 1 bitul 0 din octetul x */
x &= ~(1 << 7);
[ date::structuri::functii ] /* pune pe 0 bitul 0 din octetul x */

S-ar putea să vă placă și