Sunteți pe pagina 1din 57

Curs 2.

Elemente de bază în C/C++ (I)


Plan

 Alfabetul, vocabularul, sintaxa și semantica unui limbaj de programare


 Forma unui program simplu în C++, directive de preprocesare
 Tipuri fundamentale de date
 Caractere, cuvinte rezervate
 Variabile, expresii, asignări
 Operatori
 Expresii booleene
 Constante
 Tipul întreg
 Tipul flotant
 Reprezentarea în memorie
 Conversii
 Instrucțiuni
 Intrări și ieșiri

Alfabetul și vocabularul unui limbaj de programare


Setul de caractere
Orice limbaj de programare are la bază un anumit alfabet. În majoritatea cazurilor setul
de caractere este format din:

 literele alfabetului englez (de la A la Z, de obicei și majusculele, și literele mici, în


total 52 de caractere);
 cifrele arabe (de la 0 la 9, în total 10 caractere);
 unele caractere speciale (. , ; = < > # $ % + – * / ” ‘ ( ) etc.) , a căror semnificație
poate sa difere de la un limbaj la altul.

Secvențe Escape / Caractere speciale în C++


\b Backspace, \t Tab orizontal, \v Tab vertical, \n Linie nouă, \f Pagina nouă –
formfeed

\r Început de rând, \” Ghilimele, \’ Apostrof, \\ Backslash, \? Semnul întrebării, \a


Alarmă

Standarde de codificare a seturilor de caractere

 EBCDIC (Extended Binary Coded Decimal Interchenge Code), un cod pe 8 biți,


introdus de IBM;
 ASCII (American Standard Code for Information Interchange), introdus de ANSI
(American National Standard Institute), este un cod pe 7 biți și permite
codificarea a 128 de caractere (95 de caractere afișabile și 33 de caractere
1
Curs 2. Elemente de bază în C/C++ (I)
neafișabile, numite caractere de control). Ulterior, setul ASCII a fost extins la o
codificare pe 8 biți, fiind disponibile astfel 256 de caractere.

Primele 128 sunt din setul ASCII standard, iar următoarele 128 sunt coduri de
caractere afișabile pentru caracterele unor alfabete naționale europene (francez,
spaniol, român etc.), o parte din literele alfabetului grecesc, unele simboluri
matematice, caractere speciale pentru desenat tabele etc.

Ordonarea caracterelor alfabetului se face pe baza codurilor numerice corespunzătoare


caracterelor respective.

Cuvinte cheie / cuvinte rezervate


Pe baza caracterelor ce alcătuiesc alfabetul limbajului se alcătuiesc cuvintele care
formează vocabularul sau lexicul limbajului și cu ajutorul cărora se construiesc
expresiile și instrucțiunile limbajului. Există doua categorii de cuvinte și anume:

1. cuvinte cheie – acestea au un înțeles explicit într-un context precizat (de ex., în
unele limbaje de programare cuvintele ce desemnează instrucțiuni pot fi folosite
și ca nume de variabile, neexistând restricții; asemenea situații nu sunt însă
indicate deoarece pot ascunde erori în logica programului și îl fac mai greu de
înțeles);
2. cuvinte rezervate – acestea nu pot fi folosite decât în scopul pentru care au fost
definite (de ex., în limbajul C++). Avantajele utilizării acestei categorii de cuvinte
sunt următoarele:

 programul devine mai ușor de înțeles;


 se mărește viteza de compilare (analiza lexicală, sintactică și semantică este mai
simplă la căutarea în tabele de simboluri);
 erorile sunt mai ușor de depistat.
 Pe de alta parte, în cadrul unui limbaj de programare se vor utiliza cuvinte ale
limbajului (rezervate) si cuvinte definite de utilizator pentru a referi diverse
elemente (variabile, fisiere, nume de proceduri, nume de functii, etc.).

2
Curs 2. Elemente de bază în C/C++ (I)

Sintaxa unui limbaj de programare


Și în cazul limbajelor de programare succesiunile de cuvinte construite după anumite
reguli, formează propoziții, numite instrucțiuni. Sintaxa unui limbaj de programare
reprezinta ansamblul de reguli prin care se determină dacă o anumită instrucțiune este
alcătuită corect sau nu. Sintaxa unui limbaj de programare poate fi descrisă în diverse
moduri, unul dintre acestea fiind notația BNF (Backus-Naur Form).

3
Curs 2. Elemente de bază în C/C++ (I)
Notatia BNF
Notatia BNF (Backus-Naur Form) a fost utilizata prima data la descrierea sintaxei
limbajului ALGOL (în cadrul raportului ALGOL60 aparut în 1963) si este numita dupa
doi dintre autorii acestui raport. În cadrul BNF sunt folosite metasimboluri, simboluri
terminale si simboluri neterminale.

Metasimboluri sunt simbolurile <, >, ½ si ::= si ele fac parte din mecanismul de
descriere a limbajului. Simbolul ½ semnifica o alternativa, simbolul ::= inseamna „se
definește astfel”.

Simbolurile terminale sunt cuvinte care apar acolo unde se specifica în productii (de
ex., for, while, do, +, ; etc.).

Simbolurile neterminale sunt încadrate în < si > si sunt definite prin productii ale
limbajului (de ex., <variabila>, <identificator>, <instructiune if> etc.).

Exemplu: în limbajul C++ sintaxa unui identificator se descrie în BNF astfel:

<identificator>::=<litera>|<identificator><cifra>|<identificator><literă>|

unde

<litera>::=a|b|...|z|A|B|...|Z|_

<cifra>::=0|1|2|...|9

Simbolul _ este considerat <litera> în acest context.

Conform acestei reguli, identificatorul are 3 definiții alternative: un identificator este fie o
<litera>, fie un <identificator> urmat de o <cifra> sau o <litera> (definitie recursiva).
Semnificatia acestei definitii este urmatoarea: un identificator poate sa contina o
singura litera, sau o litera urmata de oricâte litere si/sau cifre. Conform acestei definitii,
sunt corecte sintactic urmatorii identificatori: a, t1, sec12a1.

Descrierea sintaxei instructiunii conditionale if-else din limbajul C++ în notatie BNF
este:

<instructiune if>::= if (<conditie>)

4
Curs 2. Elemente de bază în C/C++ (I)
<instructiune1>

else

<instructiune2>

Semantica unui limbaj de programare


Semantica unei instrucțiuni reprezintă înțelesul pe care îl are acea instrucțiune, adică
ce va executa calculatorul când o întâlnește.

Astfel, pentru instrucțiunea if-else de mai sus, se evalua condiția <conditie>, iar dacă
aceasta este adevărată (în momentul evaluării), atunci se va executa o singură dată
instrucțiunea <instructiune1>, respectiv, dacă este falsă, se va executa o singură dată
instrucțiunea <instructiune2>.

Primul program în C++, folosind Code::Blocks


Instalare Code::Blocks și scrierea primului program
Etapele realizării unui program în C
se parcurg următoarele etape pentru obținerea unui cod executabil:

1. editarea codului sursă – salvarea fișierului cu extensia .c


2. preprocesarea – efectuarea directivelor de preprocesare (#include, #define) și, ca
un editor, modifică și adaugă la codul sursă
3. compilarea: verificarea sintaxei, codul este tradus din cod de nivel înalt în limbaj
de asamblare
4. asamblarea: transformare în cod obiect (limbaj mașină) cu extensia .o, .obj; nu
este încă executabil!
5. link-editarea (editarea legăturilor): combinarea codului obiect cu alte coduri obiect
(al bibliotecilor asociate fișierelor header); transformarea adreselor simbolice în
adrese reale

5
Curs 2. Elemente de bază în C/C++ (I)

Exemplu de program simplu în C++


/*

* primul program in C++

*/

#include <iostream>

int main ()

6
Curs 2. Elemente de bază în C/C++ (I)
std::cout << "Primul test 1, 2, 3. ";

std::cout << "functioneaza.. \n";

return 0;

SAU

/*

* primul program in C++

*/

#include <iostream>

using namespace std;

int main ()

cout << "Primul test 1, 2, 3. ";

cout << "functioneaza.. \n";

char c;

cout << "Pentru a iesi, apasati orice tasta!!\n";

cin >> c;

return 0;

Rezultatul va fi:

Primul test 1, 2, 3. functioneaza..

7
Curs 2. Elemente de bază în C/C++ (I)
Forma unui program simplu în C++
/*comentariu; el nu influențează programul */

//directive preprocesare

#include <biblioteci> (Input/output, math, strings, …)

#define

//declarații ale variabilelor

tipuri utilizator;

Variabile;

Funcții;

....

// definirea funcțiilor utilizator ..........

//funcția principală

int main()

..........

return 0;

} //aici se încheie programul

Preprocesarea în limbajul C

 preprocesarea apare înaintea procesului de compilare a codului sursă (fișier text


editat într-un editor și salvat cu extensia .c).
 preprocesarea codului sursă asigură:
 includerea conținutului fișierelor (de obicei a fișierelor header)
 definirea de macro-uri (macrodefiniții)
8
Curs 2. Elemente de bază în C/C++ (I)
 compilarea condiționată
 constă în substituirea simbolurilor din codul sursă pe baza directivelor de
preprocesare

Directive preprocesare
Directiva preprocesare #include
copiază conținutul fișierului specificat în textul sursă

Sintaxa:
#include <nume_fisier>

#include "nume_fisier"

#include <nume_fisier> caută nume_fisier în directorul unde se află fișierele din librăria
standard instalată odată cu compilatorul

#include “nume_fisier” q caută nume_fisier în directorul curent

Exemple:

#include <iostream>

#include <math.h>

#include <stdlib.h>

#include “biblioteca_mea.h”

#include “t1.h”

Directiva preprocesare #define


Este folosită pentru definirea (înlocuirea) constantelor simbolice și a macro-urilor

 definirea unei constante simbolice este un caz special al definirii unui macro
(fragment de cod care primeste un nume)

Sintaxa:

#define nume

9
Curs 2. Elemente de bază în C/C++ (I)
#define nume text

 în timpul preprocesării nume este înlocuit cu text


 text poate să fie mai lung decât o linie, continuarea se poate face prin caracterul \
pus la sfârșitul liniei

Exemple:

#define infinit 1000

#define pi 3.1415926

#define then

#define si &&

#define daca if

#define altfel else

#define max(x,y) x > y ? x : y

#define min(x,y) x < y ? x : y

#include <stdio.h>

int main()

float a,b,c;

printf("Dati lungimile laturilor:\n");

scanf("%f %f %f",&a,&b,&c);

daca ((a>=0) si (b>=0) si (c>=0) si (a<b+c) si (b<a+c) si (c<a+b))

printf("%4.2f, %4.2f si %4.2f formeaza triunghi.", a,b,c);

altfel

printf("Nu formeaza triunghi.");

10
Curs 2. Elemente de bază în C/C++ (I)
return 0;

Compilarea condiționată

 facilitează dezvoltarea dar în special testarea codului


 directivele care pot fi utilizate: #if, #ifdef, #ifndef

11
Curs 2. Elemente de bază în C/C++ (I)

Directivele #ifdef și #ifndef sunt folosite de obicei pentru a evita incluziunea multiplă a
modulelor în programarea modulară

fișier antet “a.h”


12
Curs 2. Elemente de bază în C/C++ (I)
fișier antet “b.h”

la începutul fiecărui fișier header se practică de obicei o astfel de secvență:

#ifndef _MODUL_A_

#define _MODUL_A_

...

#endif /* _MODUL_A_ */

13
Curs 2. Elemente de bază în C/C++ (I)

Există o serie de macrouri predefinite

14
Curs 2. Elemente de bază în C/C++ (I)
Date
Variabile și constante. Expresii
În cadrul programului, datele pot fi declarate ca fiind constante sau variabile.

O constantă este o dată a cărei valoare nu se poate modifica pe parcursul execuţiei


programului, deci rămâne constantă.

O variabilă este o dată a cărei valoare se poate modifica pe parcursul execuţiei


programului, deci ea poate varia, dar acest lucru nu este obligatoriu. Astfel, se poate
declara o dată ca fiind variabilă în cadrul unui program, apoi ea să primească o
anumită valoare, iar această valoare să rămână asociată respectivei variabile până la
terminarea programului.

Evident, atunci când se va declara o dată constantă, se va preciza şi valoarea ei, iar
când se va declara o dată variabilă, se subînţelege că ulterior, pentru a putea fi folosită,
această variabilă va primi o anumită valoare.

Majoritatea limbajelor de programare asignează o valoare iniţială variabilelor, o dată cu


declararea lor. Astfel, şirurile de caractere sunt iniţializate la şirul vid, iar numerele sunt
considerate cu valoarea zero.

Fireşte, atât constantele cât şi variabilele au o anumită structură, mai simplă sau mai
complicată, şi o anumită natură, dată de mulţimea valorilor posibile pentru o dată. Cu
ele se pot face anumite operaţii, în funcţie de natura şi structura lor. Astfel, vom spune
că o dată are un anumit tip.

Există anumite convenții lexicale pentru scrierea constantelor și variabilelor:



 ALL_CAPS pentru constante
 lowerToUpper pentru variabile, cu nume cât mai sugestive

Expresii
Majoritatea limbajelor de programare definesc expresiile după un sistem de reguli
sintactice, care, în general sunt următoarele:

1. orice constantă este expresie;


2. orice variabilă este expresie;

15
Curs 2. Elemente de bază în C/C++ (I)
3. dacă E este expresie, atunci şi (E), -E, +E, F(E) sunt expresii, unde F este
numele unei funcţii aplicabile expresiei E;
4. dacă E1 şi E2 sunt expresii, atunci şi E1+E2, E1-E2, E1*E2, E1/E2 sunt expresii.

Acum, pe baza regulilor de mai sus putem construi expresii foarte complexe, pornind
de la constante şi variabile. Astfel, să considerăm entitatea (3+A)*(5/(-B+C)) şi să
verificăm dacă ea este expresie sau nu. Să presupunem că A, B şi C sunt variabile
numerice întregi. Cum 3 este constantă, conform regulii 1, ea este şi expresie. A, fiind
variabilă este, conform regulii 2 expresie. Acum, conform regulii 4, 3+A este expresie,
iar (3+A) este tot expresie, conform regulii 3. După simbolul înmulţirii (reprezentat
adesea prin *), avem: 5 este expresie, fiind constantă, B, C, apoi -B şi -B+C sunt
expresii. În fine, conform regulii 3, (-B+C) este tot expresie, apoi şi (5/(-B+C)) este
expresie, în conformitate cu regula 4, şi, tot după această regulă, şi (3+A)*(5/(-B+C))
este expresie.

Datele sunt caracterizate de

 Tip
 Nume
 Valoare
 Domeniu de vizibilitate
 Timp de viaţă
 Operatori
 Apeluri de funcții

Variabile în C++
Declararea variabilelor
tip variabila;
tip var1, var2, …, varn;

tip variabila = expresie_constanta;

Variabile globale și variabile locale


Variabile globale: declararea lor se face la începutul programului, în afara oricărei
funcţii.

Variabile locale: declararea se face în corpul funcţiei, la început.

Exemplificare
char c;

16
Curs 2. Elemente de bază în C/C++ (I)
signed char sc;

int a, b;

a = b = 5;

int i;

int suma = 0;

long j;

float x1,,x2, x3;

float pi = 3.14;

double y;

int patrat(int y)

int x; x=y*y;

return x;

Variabila x este caracterizata de

 Tip = int
 Nume = x
 Valoare = 4
17
Curs 2. Elemente de bază în C/C++ (I)
 Domeniu de vizibilitate: funcția patrat
 Timp de viaţă = pe durata unui apel al funcției

Atribuirea (Asignarea) variabilelor


variabila = expresie;

SAU

Lvalues (left-side) = Rvalues (right-side)

 Lvalues sunt variabile


 Rvalues sunt expresii

Exemplu

În atribuirea

distance = rate * time;

avem: Lvalue: „distance” și Rvalue: „rate * time”

Contraexemple pt Lvalue: 5+5, “str”, const int i

În atribuiri apar alte două probleme, despre care vom vorbi mai târziu:

 Compatibilitate
 Conversii

18
Curs 2. Elemente de bază în C/C++ (I)
Tipuri de variabile și vizibilitatea lor

Tip de date
Prin tip de date vom înţelege o mulţime de valori, împreună cu operaţiile ce se pot
executa cu ele. Fiecărei variabile, la declarare, i se va asocia un anumit tip. Tipul unei
constante poate fi determinat implicit din valoarea constantei, sau poate fi precizat
explicit ca în cazul variabilelor. Astfel, dacă constanta K are valoarea numerică 7,
putem trage concluzia că ea este de tip întreg, sau de tip real, nu şi logic sau şir de
caractere.

Totuşi, există şi limbaje în care se fac anumite convenţii, de pildă că orice număr diferit
de zero este considerat ca fiind cu valoarea de adevăr adevărat, iar numărul zero are
valoarea de adevăr fals.
19
Curs 2. Elemente de bază în C/C++ (I)
Unele limbaje de programare permit declararea unor variabile fără a se preciza tipul lor,
considerându-se astfel ca având un anumit tip general. Astfel, atunci când va fi folosită,
variabila respectivă va fi considerată ca având cel mai adecvat tip cu putinţă, în situaţia
concretă respectivă. De pildă, dacă este declarată o variabilă X, iar la un moment dat i
se atribuie valoarea 3,. atunci ea poate fi considerată ca având un tip numeric. Dacă
ulterior, variabila X va primi valoarea „abc”, adică un şir de caractere, se poate
considera că X este de tip şir de caractere.

Pe baza constantelor şi variabilelor se formează expresii. Bineînţeles, în formarea


expresiilor se vor folosi acei operatori, precum şi acele funcţii, permise de tipurile
valorilor asupra cărora se operează. Expresiile mici pot conduce la elaborarea de
expresii mai mari, din ce în ce mai complexe

Domeniul tipului (colecţia de obiecte) – mulțime de valori pentru care s-a adoptat un
anumit mod de reprezentare în memorie

Operaţiile tipului = operațiile ce se pot executa cu valorile de acel tip de date

Categorii de tipuri de date:

 Tipuri de date standard


 Tipuri de date structurate de nivel jos – operaţiile se desfășoară la nivel de
componentă
 Tipuri de date de nivel înalt – operaţiile sunt implementate de algoritmi utilizator

Tipuri de date standard în C++

 Tipuri caracter: tipurile char, signed char, unsigned char


 Tipuri întregi: tipurile caracter, întregi cu semn, întregi fără semn, tipurile
enumerare
 Tipuri reale: tipurile întregi şi tipurile flotante reale
 Tipuri aritmetice: tipurile întregi şi cele flotante
 Tipuri de bază: caracter, întregi cu şi fără semn, flotante
 Tipul void: desemnează o mulţime vidă

(32 biți)

20
Curs 2. Elemente de bază în C/C++ (I)
Reprezentarea în memorie

21
Curs 2. Elemente de bază în C/C++ (I)

Există 10 tipuri de studenți la FII: cei care înțeleg sistemul binar și cei care nu îl
înțeleg.

22
Curs 2. Elemente de bază în C/C++ (I)
Modificatori de tip

 signed
 modificatorul implicit pentru toate tipurile de date
 bitul cel mai semnificativ din reprezentarea valorii este semnul
 unsigned
 restricționează valorile numerice memorate la valori pozitive
 domeniul de valori este mai mare deoarece bitul de semn este liber și
participă în reprezentarea valorilor
 short
 reduce dimensiunea tipului de date întreg la jumătate
 se aplică doar pe întregi
 long
 permite memorarea valorilor care depășesc limita specifică tipului de date
 se aplică doar pe int sau double: la int dimensiunea tipului de bază se
 dublează, la double se mărește dimensiunea de regulă cu doi octeți (de la
8 la 10 octeți)
 long long
 introdus in C99 pentru stocarea unor valori întregi de dimensiuni foarte
mari

23
Curs 2. Elemente de bază în C/C++ (I)

Signed vs unsigned

24
Curs 2. Elemente de bază în C/C++ (I)

25
Curs 2. Elemente de bază în C/C++ (I)

Echivalențe între tipurile de date


signed short int ≡ short

unsigned short int ≡ unsigned short

signed int ≡ int

unsigned int ≡ unsigned

signed long int ≡ long

unsigned long int ≡ unsigned long

Tipuri de date derivate


Acestea se construiesc din obiecte, funcţii şi tipuri incomplete:

 tipul tablou de T (elementele de tip T)


 tipul structură
 tipul uniune
 tipul funcţie, derivat din tipul returnat T şi numărul şi tipurile parametrilor (funcţie
ce returnează T)

26
Curs 2. Elemente de bază în C/C++ (I)
 Tipul pointer, derivat dintr-un tip referenţiat (tip funcţie, tip obiect, tip incomplet).
Valorile tipului pointer sunt referinţe la o entitate de tipul referenţiat (pointer la T)
 Tipuri scalare: tipurile aritmetice şi tipul pointer
 Tipuri agregat: tablouri şi structuri
 Un tablou de dimensiune necunoscută, o structură sau uniune cu conţinut
necunoscut sunt tipuri incomplete

Tipuri întregi
Constante întregi

 Octale: au prefixul 0 (zero), de exemplu: 032 = 26 și 077 = 63


 Hexazecimale: au prefixul 0x sau 0X, de exemplu: 0x32 = 50 și 0x3F = 63
 Întregi „long”: au sufixul l sau L, de exemplu: 2147483647L și 0xaf9Fl = 44959
 Întregi „unsigned” au sufixul u sau U, de exemplu: 345u și 0xffffu = 65535
 Caractere între apostrof: ‘A’, ‘+’, ‘n’
 Caractere în zecimal: 65, 42
 Caractere în octal: ’\101’, ‘\52’
 Caractere în hexazecimal: ‘\x41’, ‘\x2A’
 Caractere speciale – secvențe escape

Operații și funcții pentru tipurile întregi


Operaţii pentru tipurile întregi: + – * / % == != < <= > >= ++ —

Funcţii:

 cele de la tipul flotant


 cele din bibliotecă: tolower, toupper, isalpha, isalnum, iscntrl, isdigit, isxdigit,
islower, isupper, isgraph, isprint, ispunct, isspace

Operatori

27
Curs 2. Elemente de bază în C/C++ (I)

Operatorii ++ și —

Se aplică doar unei expresii ce desemnează un obiect din memorie (L-value):

Alte exemple:

++5 –(k+1) ++i++ nu au sens


(++i)++ are sens

28
Curs 2. Elemente de bază în C/C++ (I)
Tipul flotant (real)
float

 Numere reale în simplă precizie


 sizeof(float) = 4
 10^-37<=abs(f)<=10^38
 6 cifre semnificative

double

 Numere reale în dublă precizie


 sizeof(double) = 8
 10^-307<=abs(f)<=10^308
 15 cifre semnificative

long double

 Numere reale în „extra” dublă precizie


 sizeof(long double) = 12
 10^-4931<=abs(f)<=10^4932
 18 cifre semnificative

Limitele se găsesc în <float.h>

Operaţii: + – * / == != < <= > >=

Constante reale

 Constantele reale sunt implicit double:


 125.435 1.12E2 123E-2 .45e+6 13. .56

 1.12E2 = 1.12 x 102 = 112

 123E-2 = 1.12 x 10-2 = 1.23

 .45e+6 = 0.45 x 106 =450000

13. = 13.00 şi .56 = 0.56

 Pentru a fi float trebuie sa aiba sufixul f sau F


 .56f 23e4f 45.54E-1F

29
Curs 2. Elemente de bază în C/C++ (I)
23e4f = 23 x 104 = 230000.00

 Pentru long double trebuie sa aibă sufixul l sau L


123.456e78L

Funcţii (în biblioteca math.h):

sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, exp, log, log10, pow, sqrt, ceil,
floor, fabs, ldexp, frexp, modf, fmod.

Date booleene (logice)


Tipul bool

 Domeniul de valori: {false, true}


 false = 0
 true = 1, dar şi orice întreg nenul
 Operaţii: ! && || == !=
 Declaraţii posibile:
 bool x = 7; // x devine “true”

int y = true; // y devine 1

Expresii logice
expresie_relationala ::= expr < expr | expr > expr | expr <= expr | expr >= expr | expr ==
expr | expr != expr expresie_logica ::= ! expr | expr || expr | expr && expr

Valoarea expresiilor relaţionale

30
Curs 2. Elemente de bază în C/C++ (I)
Negația logică
! 0 = 1, ! orice_nr_diferit_de_0 = 0

Disjuncția logică. Valoarea expresiilor logice ||

Conjuncția logică. Valoarea expresiilor logice &&

Exemple
O condiţie de forma a ≤ x ≤ b se scrie în limbajul C++ astfel:

(x >= a) && (x <= b) (a <= x) && (x <= b)

31
Curs 2. Elemente de bază în C/C++ (I)
O condiţie de forma a > x sau x > b se scrie în limbajul C++ astfel:

(x < a) || (x > b) !(x >= a && x <= b)

Legile lui De Morgan

 ! (A && B) este echivalent cu !A || ! B


 ! (A || B) este echivalentă cu ! A && ! B

Tipul void

 Conversia în tip void a unei expresii semnifică faptul că valoarea sa este ignorată
 Utilizat pentru tipul pointer; nu se face controlul tipului la un pointer de tip void
 Utilizat pentru funcţii fără valoare returnată sau pentru funcţii fără parametri
 Este un tip incomplet ce nu poate fi completat
 Conversia în tip void a unei expresii semnifică faptul că valoarea sa este ignorată
 Utilizat pentru tipul pointer; nu se face controlul tipului la un pointer de tip void
 Utilizat pentru funcţii fără valoare returnată sau pentru funcţii fără parametri
 Este un tip incomplet ce nu poate fi completat

Structuri. Utilizare typedef


Typedef este un mecanism prin care se asociază un tip unui identificator:

typedef char litera_mare;

typedef short varsta;

typedef int vector[20];

typedef char string[30];

typedef float matrice[10][10];

typedef struct { double re, im; } complex;

Identificatorul respectiv se poate utiliza pentru a declara variabile:

litera_mare u, v=‘a’;

varsta v1, v2;

vector x; string s;

32
Curs 2. Elemente de bază în C/C++ (I)
matrice a;

complex z;

sau funcții

complex suma(complex z1, complex z2) {

complex z;

z.re=z1.re+z2.re; z.im=z1.im+z2.im;

return z;

Operatorul condiţional ? :
Sintaxa
exp1 ? exp2 : exp3

Semantica

 Se evaluează exp1
 Dacă exp1 are valoare true (nenulă), atunci valoarea expresiei este valoarea lui
exp2; exp3 nu se evaluează
 Dacă exp1 are valoare false (nulă), atunci valoarea expresiei este valoarea lui
exp3; exp2 nu se evaluează

Operatorul ?: este drept asociativ


Exemple
x >= 0 ? x : y

x > y ? x : y

x > y ? x > z ? x : z : y > z ? y : z

joc=(raspuns==’1’)?JocSimplu();JocDublu();

#include <iostream>

using namespace std;

33
Curs 2. Elemente de bază în C/C++ (I)
void main(){

int a=1, b=2, c=3;

int x, y, z;

x = a?b:c?a:b;

y = (a?b:c)?a:b; /* asociere stanga */

z = a?b:(c?a:b); /* asociere dreapta */

cout<< "x=" << x << "\ny=" << y << "/nz="<< z;

/* x=2 y=1 z=2 */

Operatorul virgulă ,
Sintaxa
expresia_virgula ::= expresie, expresie

Semantica

 Se evaluează prima expresie apoi cea de-a doua.


 Valoarea şi tipul întregii expresii este valoarea şi tipul operandului drept.
 Operatorul virgulă are cea mai mică precedenţă.

Exemplu
a = 1, b = 2;

i = 1, j = 2, ++k + 1;

k != 1, ++x * 2.0 + 1;

for(suma = 0, i = 1; i <= n; suma += i, ++i);

Operatorul sizeof()
sizeof() este un operator unar ce permite determinarea numărului de octeţi pe care se
reprezintă un obiect (un tip sau o expresie)

34
Curs 2. Elemente de bază în C/C++ (I)
Exemple:
sizeof(int), sizeof(double);
sizeof(b*b-4*a*c), sizeof(i);
sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
sizeof(signed)=sizeof(unsigned) = sizeof(int)
sizeof(float)<=sizeof(double)<=sizeof(long double)

Utilizare
#include <iostream>

using namespace std;

void main(){

int x = 1; double y = 9; long z = 0;

cout << "Operatorul sizeof()\n\n\n";

cout << "sizeof(char) = " << sizeof(char) << endl;

cout << "sizeof(int) = " << sizeof(int) << endl;

cout << "sizeof(short) = " << sizeof(short) << endl;

cout << "sizeof(long) = " << sizeof(long) << endl;

cout << "sizeof(float) = " <<sizeof(float) << endl;

cout << "sizeof(double) = " << sizeof(double) << endl;

cout << "sizeof(long double) = " << sizeof(long double) << endl;

cout << "sizeof(x +y + z) = " << sizeof(x+y+z) << endl;

Rezultatul executiei Visual C++:

Operatorul sizeof()

sizeof(char) = 1

35
Curs 2. Elemente de bază în C/C++ (I)
sizeof(int) = 4

sizeof(short) = 2

sizeof(long) = 4

sizeof(float) = 4

sizeof(double) = 8

sizeof(long double) = 8

sizeof(x + y + z) = 8

Tabel cu prioritatea și asociativitatea operatorilor

36
Curs 2. Elemente de bază în C/C++ (I)
Reguli pentru conversia implicită
În absenţa unui unsigned , obiectele se convertesc la tipul cel mai “înalt” în ordinea
(descrescătoare):

long double, double, float, long int, int

Regulile pentru operanzii unsigned depind de implementare.

Conversia la unsigned se face doar în caz de necesitate (de ex. valoarea din unsigned
nu “încape” în celălalt operand).

Regula “integer promotion” : operaţiile se fac cel puţin în int, deci char şi short sunt
“promovaţi” la int.

La o asignare (v = exp) tipul membrului drept se converteşte la tipul membrului stâng


(care este şi tipul rezultatului).

ATENŢIE! Se pot produce:

 Pierderea preciziei (double ->float ->long int)


 Pierderea unor biţi semnificativi (long ->int)
 Nedeterminări

Exemplu conversii implicite

#include <iostream>

using namespace std;

int main(void){

char c1 = -126, c2; /* c1 = 10000010 */

unsigned char c3, c4 = 255; /* c4 = 111111111 */

short s1, s2 = -32767; /* s2=10000000 00000001 */

short s3 = -1, s4; /* s3 = 11111111 11111111 */

s1 = c1;

37
Curs 2. Elemente de bază în C/C++ (I)
cout << "c1=" << (int)c1 << " s1=" << s1 << endl;

c2 = s2;

cout << "c2=" << (int)c2 << " s2=" << s2 << endl;

c3 = s3;

cout << "c3=" << (int)c3 << " s3=" << s3 << endl;

s4 = c4;

cout << "c4=" << (int)c4 << " s4=" << s4 << endl;

return 0;

Exemplu (rezultatul execuţiei)

Forţarea tipului – cast

 Conversia explicită la tipul numetip se face prin:

(numetip) expresie

Exemple:
(long)(‘A’ + 1.0)

38
Curs 2. Elemente de bază în C/C++ (I)
(int)(b*b-4*a*c)

(double)(x+y)/z

(float)x*y/z

x / (float)2

Exemplu cast
#include <iostream>

using namespace std;

int main(void){

int i, j; double x, y, z, t;

i = 5/2; x = 5/2;

y = (double)(5/2); j = (double)5/2;

z = (double)5/2; t = 5./2;

cout << i << ", " << x << ", ";

cout << y << ", " << j << ", ";

cout << z << ", " << t << ", " << endl;

return 0;

/* 2, 2, 2, 2, 2.5, 2.5 */

Fişiere în bibliotecă relative la tipuri


<limits.h>

 pentru tipurile întregi


 Întregul min/max: INT_MIN, INT_MAX
 Numărul de biţi pe caracter CHAR_BIT
 Etc.
39
Curs 2. Elemente de bază în C/C++ (I)
<float.h>

 pentru tipurile flotante:


 Exponentul maxim
 Precizia zecimală, etc.

<stdlib.h>

 conţine funcţii de conversie:


 Şir de caractere în int: atoi(const char*)
 Şir de caractere în float: atof(const char*)
 Test de evaluare a cunoștințelor

Funcții de citire și scriere


operații de citire și scriere în C:

 de la tastatură (stdin) și la ecran (stdout);


 prin fișiere;
 efectuate cu ajutorul funcțiilor de bibliotecă

funcții pentru citirea de la tastatură și scrierea la ecran:

 fără formatare: getchar, putchar, getch, getche, putch, gets, puts


 cu formatare: scanf, printf
 incluse în bibliotecile stdio.h (getchar, putchar, gets, puts, scanf, prinh) sau
conio.h (getch, getche, putch)
 CODE::BLOCKS nu include biblioteca conio.h

Functia printf()
Cu ajutorul acestei functii putem afisa mesaje pe ecran. Cand programul dvs. foloseste
printf, datele pe care vreti sa le afisati reprezinta parametrii sau argumentele functiei
printf. Urmatoare instructiune foloseste functia printf() pentru a afisa pe ecran mesajul
Hello:

printf("Hello!");

Functia printf accepta mai multi parametri. Primul parametru trebuie intotdeauna sa fie
un sir de caractere, parametrul care urmeaza primului sir de caractere pot fi numere,
variabile, expresii (cum ar fi 10*7) sau chiar alte siruri de caractere. Atunci cand doriti
ca printf sa afiseze o valoare sau o variabila, trebuie sa includeti informatia despre tipul
variabilei in primul parametru. Pe langa caractere in primul parametru puteti sa
40
Curs 2. Elemente de bază în C/C++ (I)
introduceti specificatori de format, care arata functiei printf cum sa afiseze ceilalti
parametri.

Spre ex. pentru a afisa o valoare de tip int, veti folosi %d. De asemenea, pentru a tipari
o valoare in virgula mobila (float), puteti folosi %f. Urmatoarele intructiuni ilustreaza
utilizarea specificatorilor de format in cadrul functiei printf():

int varsta=18, greutate=54,inaltime=1.69,pret=12;

printf("Varsta este: %d\n", varsta);

//Va afisa pe ecran - Varsta este 18

printf("Impozitul pe vanzari este: %f\n",pret*0.07);

//Va afisa pe ecran - Impozitul pe vanzari este: 0.84

printf("Varsta: %d, greutatea: %d, inaltimea: %f\n",

varsta,greutate,inaltime);

//Va afisa pe ecran - Varsta: 18, greutatea: 54, inaltimea: 1.69

Urmatorul program, intout.c foloseste specificatorul de format %d pentru a afisa valori


si variabile de tip int:

#include <stdio.h>

using namespace std;

int main()

int varsta = 41;

int greutate = 75;

int inaltime = 180;

printf("Varsta utilizatorului: %d greutate: %d inaltime:


%d\n",varsta,greutate,inaltime);

41
Curs 2. Elemente de bază în C/C++ (I)
printf("%d plus %d egal %d\n",1,2,1+2);

Atunci cand compilati si executati programul, pe ecran se afiseaza urmatorul rezultat:

Varsta utilizatorului: 41 greutate: 75 inaltime: 180

1 plus 2 egal 3

Tiparirea unei valori întregi octale sau hexazecimale


Functia printf permite utilizarea unor specificatori de format care furnizeaza informatii
despre tipurile parametrilor (cum ar fi int, float, char si asa mai departe). In functie de
programul dvs. poate ca la un moment dat veti dori sa afisati o valoare intreaga octala
(in baza 8) sau hexazecimala (in baza 16). Caracterul %o (litera o, nu cifra zero) este
specificatorul care indica functiei printf sa afiseze valoarea in format octal. Intr-un mod
similar, specificatorii %x si %X indica functiei sa afiseze valoarea in format
hexazecimal. Diferenta dintre %x si %X este ca cel din urma %X afiseaza valoarea
hexazecimala cu majuscule (litere mari). Urmatorul program oct_hex.c, ilustreaza
utilizarea specificatorilor de format %o, %x si %X:

#include <stdio.h>

int main()

int valoare = 255;

printf("Valoarea zecimala %d este %o in octal\n",

valoare, valoare);

printf("Valoarea zecimala %d este %x in hexazecimal\n",

valoare, valoare);

printf("Valoarea zecimala %d este %X in hexazecimal\n",

valoare, valoare);

}
42
Curs 2. Elemente de bază în C/C++ (I)

Atunci cand compilati si executati programul, pe ecran va fi afisat urmatorul rezultat:

Valoarea zecimala 255 este 377 in octal

Valoarea zecimala 255 este ff in hexazecimal

Valoarea zecimala 255 este FF in hexazecimal

Afișarea valorilor de tip unsigned int folosind functia printf


Asa cum ati vazut, functia printf permite utilizarea unor specificatori de format care
furnizeaza informatii despre tipurile parametrilor. Pentru a afisa variabile de tip
unsigned int cu functia printf, trebuie sa folositi specificatorul de format %u. Daca
folositi %d in loc de %u, printf va trata valoarea respectiva ca fiind de tip int si probabil
va afisa rezultatul gresit. Urmatorul program, foloseste identificatorii de format %u si
%d pentru a afisa valoarea 42000. Programul ilustreaza tipul de eroare care poate
aparea daca folositi un specificator de format gresit:

#include <stdio.h>

int main()

unsigned int valoare = 42000;

printf("Afiseaza 42000 ca unsigned %u\n", valoare);

printf("Afiseaza 42000 ca int %d\n", valoare);

Atunci cand compilati si executati programul, pe ecran va aparea urmatorul rezultat:

Afiseaza 42000 ca unsigned 42000

Afiseaza 42000 ca int -23536

43
Curs 2. Elemente de bază în C/C++ (I)
Afișarea valorilor de tip long int folosind funcția printf
Pentru a afisa valorile de tip long int cu functia printf, trebuie sa folositi specificatorul de
format %ld. Daca folositi %d in loc de %ld, printf va trata valoarea respectiva ca fiind te
tip int si probabil va afisa rezutatul gresit. Urmatorul program long_int.c foloseste
specificatorii de format %ld si %d pentru a afisa valoarea 1000000.

#include <stdio.h>

int main()

long int un_milion = 1000000;

printf("Un milion este %ld \n", un_milion);

printf("Un milion is %d\n", un_milion);

Dupa compilarea si executarea programului, pe ecranul dvs. va fi afisat urmatorul


rezultat:

Un milion este 1000000

Un milion is 16960

Afișarea valorilor de tip float folosind functia printf


Pt. a afisa valorile de tip float folosind functia printf, trebuie sa folositi specificatorul de
format %f. Urmatorul program foloseste specificatorul de format %f pentru a afisa valori
in virgula mobila:

#include <stdio.h>

int main()

float pret = 525.75;

float rata_impozit = 0.06;

44
Curs 2. Elemente de bază în C/C++ (I)
printf("Pretul este %f\n", pret);

printf("Impozitul pe vanzari este %f\n", pret*rata_impozit);

Dupa compilarea si executarea programului pe ecran va aparea:

Pretul este 525.750000

Impozitul pe vanzari este 31.544999

Afișarea valorilor de tip char folosind functia printf


Pentru a afisa valorile de tip char cu functia printf trebuie sa folositi specificatorul de
format %c. Urmatorul program, foloseste specificatorul de format %c pentru a afisa pe
ecran litera A:

#include <stdio.h>

int main()

printf("Litera este %c\n", 'A');

printf("Litera este %c\n" 65);

Dupa cum vedeti, programul va afisa litera A utilizand constanta de tip caracter ‘A’ si
valoarea ASCII 65. Atunci cand veti compila si executa programul pe ecran va fi afisat
urmatorul rezultat:

Litera este A

Litera este A

Afișarea valorilor in virgula mobila in format exponential


In functie de cerintele programului este posibil sa afisati valori in formatul exponential.
Pt a afisa valori in virgula mobila intr-un format exponential, folositi specificatorul de
format %e sau %E. Dinferenta dintre %e si %E este ca specificatorul de format %E
45
Curs 2. Elemente de bază în C/C++ (I)
indica functiei printf sa foloseasca majuscula E in iesire. Urmatorul program folosete
ambii specificatori de format exponential pt a afisa pe ecran valori in virgula mobila:

#include <stdio.h>

int main()

float pi = 3.14159;

float raza = 2.0031;

printf("Aria cercului este %e\n", 2*pi*raza);

printf("Aria cercului este %E\n", 2*pi*raza);

Dupa compilarea si executarea programului pe ecran va aprea urmatorul rezultat:

Aria cercului este 1.258584e+01

Aria cercului este 1.258584E+01

Afișarea valorilor în virgulă mobilă


In inceputul articolului ati invatat ca folosind specificatorul de format %f, puteti sa
indicati functiei printf sa afiseze valori in virgula mobila in format zecimal. De asemenea
ati invatat mai sus ca puteti folosi specificatorii %e su %E pentru a afisa valori in virgula
mobila in format exponential. In mod similar functia printf() accepta specificatorii de
format %g si %G. Atunci cand folositi acesti specificatori printf alege formatul %f sau
%e, astfel incat sa ofere utilizatorului o afisare cat mai convenabila. Urmatorul
program, ilustreaza utilizarea specificatorului de format %g:

#include

int main()

printf("Numarul 0.1234 este afisat in formatul %g\n",0.1234);

46
Curs 2. Elemente de bază în C/C++ (I)
printf("Numarul 0.00001234 este afisat in formatul %g\n", 0.00001234);

Atunci cand compilati si executati programul veti observa pe ecran urmatorul rezultat:

Numarul 0.1234 este afisat in formatul 0.1234

Numarul 0.00001234 este afisat in formatul 0.1234e-05

Afișarea unui șir de caractere folosind funcția printf


Un sir de caractere este o secventa care contine zero sau mai multe caractere. Una
dintre cele mai obisnuite operatii executate in programe este afisarea sirurilor de
caractere. Asa cum ati invatat pe parcursul acestui articol, functia printf permite
utilizarea unor specificatori de format care furnizeaza informatii despre tipurile
parametrilor (cum ar fi int, float, char etc). Pt a afisa un sir de caractere cu functia printf
trebuie sa folositi specificatorul de format %s. Urmatorul program utilizeaza acest
specificator pt a afisa un sir de caractere:

#include <stdio.h>

int main()

char titlu[255] = "Functiile printf() si scanf()";

printf("Numele acestui articol este: %s\n", titlu);

Atunci cand compilati si executati programul va aparea urmatorul rezultat:

Numele acestui articol este: Functiile printf() si scanf()

Utilizarea semnului plus sau minus inaintea unei valori


Atunci cand folositi functia printf pentru a afisa o valoare negativa, valoarea va fi
intotdeauna precedata de semnul minu. In functie de programul dumneavoastra, v-ati
dori uneori ca printf sa afiseze si semnul pentru valorile pozitive. Pentru a indica functiei
printf sa afiseze semnul valorii, pur si simplu veti include un semn plus imediat dupa %

47
Curs 2. Elemente de bază în C/C++ (I)
in specificatorul de format. Urmatorul program, ilustreaza utilizarea semnului plus
pentru specificatorii de format:

#include<stdio.h>

int main()

int neg_int = -5;

int poz_int = 5;

float neg_float = -100.23;

float poz_float = 100.23;

printf("Valoarea intreaga este %+d si %+d\n", neg_int, poz_int);

printf("Valoarea in virgula mobila este %+f si %+f\n", neg_float, poz_float);

Dupa compilarea si executarea programului va fi afisat urmatorul rezultat:

Valoarea intreaga este -5 si +5

Valoarea in virgula mobila este -100.230003 si +100.230003

Formatarea unei valori intregi folosind functia printf


Sa presupunem ca doriti sa afisati pe ecranul calculatorului un tabel similar cu
urmatorul:

Vanzator Cantitate

Ionescu 332

Popescu 1200

Georgescu 3311

48
Curs 2. Elemente de bază în C/C++ (I)
Daca folositi specificatorul de format %d, puteti sa indicati functiei printf sa afiseze un
numar minim de caractere. Urmatorul program ilustreaza modul in care puteti formata
valorile intregi folosind specificatorul %d:

#include <stdio.h>

int main()

int valoare = 5;

printf("%1d\n", valoare);

printf("%2d\n", valoare);

printf("%3d\n", valoare);

printf("%4d\n", valoare);

Cifra pe care o plasati dupa % precizeaza numarul minim de caractere pe care printf il
foloseste pentru a afisa o valoare intreaga. Daca, de exemplu specificati %5d si
valoarea pe care vreti sa o afisati este 10, printf va introduce trei spatii libere inainte de
valoare. Retineti ca valoarea precizeaza numarul minim de caractere pe care il va avea
iesirea. Daca valoarea pe care doriti sa o afisati are mai multe caractere decat ati
precizat, printf va folosi numarul de caractere necesar pentru afisarea corecta a valorii.

Afisarea numerelor intregi precedate de zero


In functie de scopul programului dvs. poate ca veti dori ca printf sa introduca zerouri
inaintea valorii, in loc de spatii. Pentru a indica functiei printf sa adauge zerouri inaintea
valorii, plasati un 0 (zero nu litera O) imediat dupa % in specificatorul de format, inainte
de numarul de cifre dorit. Urmatorul program ilustreaza acest procedeu:

#include <stdio.h>

int main()

int valoare = 5;

49
Curs 2. Elemente de bază în C/C++ (I)
printf("%01d\n", valoare);

printf("%02d\n", valoare);

printf("%03d\n", valoare);

printf("%04d\n", valoare);

Atunci cand compilati si executati programul veti avea urmatorul rezultat:

05

005

0005

Afișarea unui prefix înaintea valorilor octale și hexazecimale


Ati invatat cum se foloseste specificatorul de format %o pentru a afisa valori octale si
specificatorul de format %x si %X pentru a afisa valorile hexazecimale. Atunci cand
programul dvs. are la iesire astfel de valori, poate ca veti dori ca valorile octale sa fie
precedate de zero (de ex 0777), iar cele hexazecimale de 0x (de ex 0xFF).

Pentru a indica functiei printf sa adauge prefixul potrivit unei valori octale sau
hexazecimale , plasati caracterul # imediat dupa % in specificatorul de format.
Urmatorul program va exemplifica acest lucru:

#include <stdio.h>

int main()

int valoare = 255;

printf("Valoarea zecimala %d este %#o in octal\n", valoare);

printf("Valoarea zecimala %d este %#x in hexazecimal\n",valoare);

50
Curs 2. Elemente de bază în C/C++ (I)
printf("Valoarea zecimala %d este %#X in hexazecimal\n", valoare);

Dupa ce veti compila si executa programul pe ecran va aparea:

Valoarea zecimala 255 este 0377 in octal

Valoarea zecimala 255 este 0xff in hexazecimal

Valoarea zecimala 255 este 0xFF in hexazecimal

Formatarea valorilor cu virgula mobila


Atunci cand formatati o valoarea cu virgula mobila trebuie sa specificati doua valori.
Prima valoare comunica functiei printf numarul de caractere pe care vreti sa il afisati iar
a doua valoare comunica functiei numarul de cifre pe care vreti sa le afiseze la dreapta
punctului zecimal. Urmatorul program va exemplifica acest lucru:

#include <stdio.h>

int main()

float vlaoare = 1.23456;

printf(„%8.1f\n”, valoare);

printf(„%8.3f\n”, valoare);

printf(„%8.5f\n”, valoare);

In mod similar puteti cere functiei printf sa formateze o valoare in virgula mobila, in
format exponential.

51
Curs 2. Elemente de bază în C/C++ (I)
Alinierea la stanga a iesirii
Atunci cand afisati un text utilizand formatarea cu printf, alinierea prestabilita este la
dreapta. In functie de programul dvs. este posibil sa doriti ca printf sa faca alinierea
textului la stanga. Pentru a alinia un text la stanga trebuie sa plasati un semn minus
imediat dupa % in specificatorul de format. De ex:

#include <stdio.h>

int main()

int val_int = 5;

float val_flt = 3.33;

printf ("Aliniere dreapta %5d a valorii \n", val_int);

printf("Aliniere stanga %-5d a valorii\n", val_int);

printf("Aliniere dreapta %7.2f a valorii\n", val_flt);

printf("Aliniere stanga %-7.2f a valorii\n", val_flt);

Atunci cand veti executa programul veti avea urmatorul rezultat:

Aliniere dreapta 5 a valorii

Aliniere stanga 5 a valorii

Aliniere dreapta 3.33 a valorii

Aliniere stanga 3.33 a valorii

Utilizarea combinata a specificatorilor de format


Cu ajutorul functiei printf putem utiliza specificatori de format combinati, de exemplu
afisarea la stanga a unui numar intreg cu semn:

#include <stdio.h>

52
Curs 2. Elemente de bază în C/C++ (I)
int main()

int val_int = 5;

printf("Afisarea la stanga cu semn %-+3d\n",val_int);

Dupa compilare si executare veti avea urmatorul rezultat:

Afisarea la stanga cu semn +5

Functia scanf()
Funcția scanf este o functie cu ajutorul careia putem citi date de la tastatura. Sintaxa
functiei scanf este urmatoarea:

scanf(„lista de formate”,adresa_var1, adresa_var2, …);

Aceasta functie realizeaza urmatoarele operatii:

 citeste din fisierul standard de intrare stdio o secventa de campuri de intrare,


caracter cu caracter, pana la terminarea introducerii campurilor si apasarea tastei
<enter>
 formateaza fiecare camp conform formatului specificat in lista de formate Din
caracterele citite se calculeaza valori numerice sau literale, conform tipului
fiecarei variabile, dimensiunile de format specificate si a separatorilor de campuri
predefiniti (spatiu, tab si enter) sau impusi explicit
 valorile astfel construite sunt stocate la adresele variabilelor specificate ca
argumente;

Obs: Indiferent de formatul folosit, la intalnirea unui spatiu in introducerea datelor, este
terminata citirea variabilei.

Obs: Indiferent de formatul folosit, la intalnirea unui spatiu in introducerea datelor, este
terminata citirea variabilei.

Pentru functia de citire scanf trebuie folosit operatorul de adresa “&”. Pentru variabilele
citite cu aceasta functie trebuie precizate adresele la care se stocheaza in memoria

53
Curs 2. Elemente de bază în C/C++ (I)
calculatorului valorile variabilelor. Functia va introduce valorile citite direct la acele
adrese.

Singurul caz in care nu este obligatorie folosirea operatorului adresa pentru citirea
valorii unei variabile cu functia scanf este citirea unui sir de caractere.

Obs: citirea cu ajutorul functiei scanf a sirurilor de caractere care contin spatii este
imposibila.

In cazul in care formatul specificat este necorespunzator, rezultatul obtinut poate fi


neprevazut. Valoare intoarsa de scanf in caz de succes, este numarul de variabile care
au fost citit corect. Daca nu a fost citita nici o variabila (de ex s-a introdus un sir in loc
de un nr) functia intoarce valoarea 0. Daca apare o eroare inaintea oricarei citiri si
asignari, functia returneaza EOF (constanta de sistem avand valoarea intreaga -1).
Specificatorii de format ai functiei scanf sunt prezenti in lista urmatoare:

 %c – citeste un caracter
 %d – citeste un intreg zecimal
 %i – citeste un intreg zecimal
 %e – citeste un numar float
 %f – citeste un numar float
 %g – citeste un numar float
 %o – citeste un nr octal fara semn
 %s – citeste un sir de caractere
 %x – citeste un nr hexazecimal fara semn
 %p – citeste un pointer
 %n – argumentul asociat primeste o valoare intreaga egala cu numarul de
caractere deja citite
 %u – citeste un numar intreg fara semn
 %[] – scanare pentru set de caractere

Obs: Multe compilatoare trateaza specificatorul de format %i ca fiind identic cu %d.


Totusi nu este recomandat sa il folositi deoarece %i este un specificator mostenit si
este posibil ca viitoarele compilatoare sa nu il accepte.

In specificatorul de format pot sa apara si modificatori de tip:

Modificatorul h, care poate precede caracterele de conversie d,i,o,u,x sau X,


precizeaza ca valoarea convertita trebuie memorata ca un short int sau unsigned short
int.

54
Curs 2. Elemente de bază în C/C++ (I)
Modificatorul l, poate precede caracterele de conversie d,i,o,u,x,X, caz in care valoarea
trebuie memorata ca un long int sau unsigned long int, sau poate precede caracterele
e,E,f,g,G, caz in care valoarea trebuie memorata ca un double.

Modificatorul L, poate precede numai caracterele e,E,f,g,G si precizeaza ca valoarea


convertita trebuie memorata ca un long double.

Un numar între % si caracterul de format limitează caracterele citite

%4d întreg din cel mult 4 caractere (spaţiile iniţiale nu contează)

 scanf(„%d%d”, &m, &n); 12 34 m=12 n=34


 scanf(„%2d%2d”, &m, &n); 12345 m=12 n=34 rest: 5
 scanf(„%d.%d”, &m, &n); 12.34 m=12 n=34
 scanf(„%f”, &x); 12.34 x=12.34
 scanf(„%d%x”, &m, &n); 123a m=123 n=0xA

Aplicaţie – pătrat magic pentru n impar:

#include <cstdio>

using namespace std;

int a[100][100],i,j,n,k,i1,j1;

int main()

FILE *fin = fopen("patrat.in", "r");

FILE *fout = fopen("patrat.out", "w");

do{

fscanf(fin,"%d",&n);

}while(n%2==0);

k=1; i=(n+1)/2; j=n;

a[i][j]=k;

55
Curs 2. Elemente de bază în C/C++ (I)
while(k<n*n)

i1=i;j1=j; i=i+1;j=j+1;

if(i>n)i=1;

else if(j>n)j=1;

if(a[i][j]!=0||j>n)

i=i1;j=j1;

j=j-1;

k=k+1;

a[i][j]=k;

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

fprintf(fout,"%d ",a[i][j]);

fprintf(fout,"\n");

fclose(fin);

fclose(fout);

return 0;

56
Curs 2. Elemente de bază în C/C++ (I)
}

Funcțiile getchar și putchar

 operații de citire și scriere a caracterelor:


 int getchar(void) – citește un caracter de la tastatură. Așteaptă până este
apasată o tastă și returnează valoarea sa; tasta apăsată are imediat ecou pe
ecran.
 int putchar(int c) – scrie un caracter pe ecran în poziția curentă a cursorului
 fișierul antet pentru aceste funcții este stdio.h.

Funcțiile gets și puts

 operații de citire și scriere a șirurilor de caractere:


 char *gets(char *s) – citește caractere din stdin si le depune în zona de
date de la adresa s, până la apăsarea tastei Enter. În șir, tastei Enter îi va
corespunde caracterul ‘\0’.
 dacă operația de citire reușește, funcția întoarce adresa șirului, altfel
valoarea NULL ( = 0 ).
int puts(const char *s) – scrie pe ecran șirul de la adresa s sau o constantă șir
de caractere și apoi trece la linie nouă.
 dacă operația de scriere reușește, funcția întoarce ultimul caracter, alXel
valoarea EOF (-1).
fișierul antet pentru aceste funcții este stdio.h
 De ce să nu folosiți funcția gets:
 char *gets(char *s) – primeste ca input numai un buffer (s), nu stim
dimensiunea lui
 problema de buffer overflow: citim in s mai mult decat
 dimensiunea lui, gets nu ne impiedica, scrie datele in alta parte
 folositi fgets: char *fgets(char *s, int size, FILE *stream)
 fgets(buffer, sizeof(buffer), stdin);
 in standardul C11 funcția gets este eliminată

Rezumat
Discuție cu studenții în clasă

Sursa pentru funcțiile printf și scanf: competentedigitale.ro › oli_gim ›


Functiile_printf_si_scanf

57

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