Sunteți pe pagina 1din 23

11/9/2016

Programarea Calculatoarelor și CUPRINS


Limbaje de Programare I. Aplicații cu numere
I.1. Aplicații la divizibilitate
CURS 4 I.2. Aplicații cu conversii între baze de numeraţie
II. Funcţii
- suport de curs - II.1. Apelul prin valoare
II.1.1. Aplicație cu tablouri de caractere
II.2. Variabile externe şi domeniul de vizibilitate
Aplicații cu numere și tablouri de caractere. III. Variabile
Funcţii. Variabile. Tipuri de date. Constante IV. Tipuri de date
V. Constante
17:51 PCLP CURS 4 2

I. APLICAȚII CU NUMERE I.1. APLICAȚII LA DIVIZIBILITATE

Testul de număr prim Testul de număr prim


#include <stdio.h>
main()
{ /* testul de numar prim */ Observaţie:
int n, i, prim = 1;
printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
• Limita n – 1 poate fi substituită
Se citește un număr n
for ( i = 2; i <= n - 1; ++i ){  cu n/2 sau
if ( n%i == 0 ){ natural (n>1). Să se afișeze
prim = 0; dacă este prim sau nu.  cu n
/* break; */
} Exemple: n = 17 => 17 e prim
} n = 77 => 77 nu e prim Algoritmul va fi astfel mai rapid.
if ( prim )
printf("%d e prim\n", n); TEMĂ: Modificați programul
else astfel încât să funcționeze
printf("%d nu e prim\n", n); pentru orice n natural.
}
17:51 PCLP CURS 4 5 17:51 PCLP CURS 4 6

PCLP CURS 4 1
11/9/2016

Temă. Testul de număr prim Temă. Divizorii unui număr


• Îmbunătățiți codul care testează că un număr este Afișați toți divizorii unui număr natural dat.
prim evitând valorile pare ale lui i din testul de Exemplu: n = 6 => 1, 2, 3, 6
divizibilitate: Indicație: Se parcurg cu un for() toți divizorii posibili pentru
n (de la 1 la n) și se verifică dacă restul împărțirii lui n la ei
for ( i = 2 ; i <= n - 1 ; ++i ) este zero; în acest caz se afișează divizorul respectiv.
if ( n%i == 0 )
n/2 sau Observație: Algoritmul poate fi eficientizat parcurgând - pentru
………… căutarea divizorilor - în locul intervalului 1 … n, intervalul 1
n … n/2, sau chiar intervalul 1… n şi observând că dacă d
este divizor pentru n, atunci şi n/d este divizor pentru n.
17:51 PCLP CURS 4 7 17:51 PCLP CURS 4 8

Descompunerea în factori primi c.m.m.d.c.


Se dă un număr natural n. Să se afișeze descompunea lui n
în factori primi. Exemplu: n = 360 => 2^3 * 3^2 * 5 Se dau două numere naturale nenule n şi m. Să se
întreg n, d, p calculeze cmmdc(n, m).
citește n
d <- 2
cât timp n > 1 execută Exemplu:
dacă n%d = 0 atunci
p <- 0
cât timp n%d = 0 execută n = 36, m = 30 => cmmdc(36,30)= 6
p <- p + 1
n <- n/d
sfârşit cât timp
scrie d, “^”, p Temă. Scrieți programul C
sfârşit dacă corespunzător
d <- d + 1 pseudocodului prezentat.
sfârșit cât timp

17:51 PCLP CURS 4 9 17:51 PCLP CURS 4 10

c.m.m.d.c. Varianta 1 Varianta 2. Algoritmul lui Euclid


întreg n, m
întreg n, m, rest
citește n, m
cât timp n  m execută citește n, m
dacă n > m atunci cât timp m  0 execută
n <- n – m rest <- n%m
altfel n <- m
m <- m – n m <- rest
sfârșit dacă Temă. Scrieţi programul C sfârșit cât timp Temă. Scrieţi programul C
sfârșit cât timp corespunzător pseudocodului scrie n corespunzător pseudocodului
prezentat. prezentat.
scrie n
17:51 PCLP CURS 4 11 17:51 PCLP CURS 4 12

PCLP CURS 4 2
11/9/2016

c.m.m.m.c. Temă
Se dau două numere naturale nenule n şi m. Să se
calculeze cmmmc(n, m).
Exemplu: n = 36, m = 30 => cmmmc(36,30)= 180

Indicaţie: Dacă se cunoaşte cmmdc(n,m), atunci:


cmmmc(n, m) = (n * m) / cmmdc(n, m) I.2. APLICAȚII CU CONVERSII ÎNTRE
BAZE DE NUMERAŢIE
Atenție la procesul de calcul a cmmmc(n, m) care modifică valorile
lui n și ale lui m!
17:51 PCLP CURS 4 13

Conversia din baza 10 în baza b Conversia din baza 10 în baza b


întreg n, b, nb, z
Se dă un număr n în baza 10. Să se convertească
citeşte n, b
numărul în baza b (2 <= b <= 9).
nb <- 0
 Se folosește metoda împărțirilor succesive: z <- 1
 Se împarte numărul dat n la baza b. cât timp n  0 execută
nb <- nb + z * (n%b)
 Se reține restul, iar câtul se împarte din nou la b. n <- n/b
 Procesul se repetă până când câtul devine 0. z <- 10 * z
sfârşit cât timp Temă. Scrieţi programul C
 În acel moment se afișează resturile în ordinea corespunzător pseudocodului
scrie nb prezentat.
inversă obținerii lor. Exemple: 5(10) = 101(2); 10(10) = 12(8)
17:51 PCLP CURS 4 15 17:51 PCLP CURS 4 16

Conversia din baza b în baza 10 Conversia din baza b în baza 10


Se dă un număr nb în baza b (2 <= b <= 9) să se întreg n, b, nb, z
convertească numărul în baza 10. citește nb, b
n <- 0
 Pentru conversie se înmulțește fiecare cifră a lui nb
cu baza ridicată la o putere corespunzătoare poziției z <- 1
pe care o ocupă cifra în număr. cât timp nb  0 execută
 Cifra unităților se înmulțește cu baza b la puterea 0 n <- n + z * (nb%10)
ş.a.m.d. nb <- nb/10
 Exemplu: nb = 177, b = 8 z <- b * z
sfârşit cât timp
n = 1*82 + 7*81 + 7*80 = 127
scrie n
17:51 PCLP CURS 4 17 17:51 PCLP CURS 4 18

PCLP CURS 4 3
11/9/2016

#include <stdio.h>
main() Întrebare
{
int n, b, nb, z; Se citește un număr n natural în baza 10. Să se
printf("nb = "); scanf("%d", &nb);
afișeze cifrele sale începând cu cifra cea mai puțin
printf("baza = "); scanf("%d", &b);
semnificativă ale reprezentării sale într-o bază
n = 0;
z = 1;
oarecare b. b se citește pe intrare.
while( nb != 0 ){
Exemplu: n = 9301, b = 8 => 5 2 1 2 2
n = n + z * (nb%10);
nb = nb/10;
z = b * z;
}
printf("n in baza 10 = %d\n", n);
}
17:51 PCLP CURS 4 19 17:51 PCLP CURS 4 20

#include <stdio.h> Răspuns


main()
{
int n, b , c;

printf("numarul = ");
scanf("%d",&n);
F F
printf("baza = ");
TEME
scanf("%d",&b);
1. Modificați codul astfel încât pentru
while( n != 0 ){ cifrele mai mari decât 9, programul
să afișeze corect cifrele A pentru
c = n % b;
10, B pentru 11 ş.a.m.d.
II. FUNCŢII
printf("%d ",c);
n = n / b; 2. Modificați codul astfel încât
} numărul citit pe intrare să poată fi
} un întreg în octal (%o)/ hexa (%x)
17:51 PCLP CURS 4 21

Funcţii Funcţii
• O funcţie furnizează un mod convenabil pentru a • C face utilizarea funcţiilor facilă, comodă şi
încapsula anumite calcule şi apoi eficientă;
 poate fi utilizată fără nicio grijă asupra modului  de multe ori o funcţie mică face mai clară o bucată
cum a fost implementată. de cod.
• Cu funcţii proiectate corect este posibil • Până acum am utilizat doar funcţii predefinite
 să ignori cum a fost realizată o sarcină; furnizate de limbaj
 este suficient să ştii doar ce a fost realizat.  printf, scanf, getchar şi putchar ;
 vom învăţa să scriem propriile noastre funcţii.
17:51 PCLP CURS 4 23 17:51 PCLP CURS 4 24

PCLP CURS 4 4
11/9/2016

SUMA A DOUĂ NUMERE numele


#include <stdio.h> parametrii (argumente) formali
tipul valorii funcţiei
int suma(int ,int); /* prototipul functiei */ parametrii (argumente) de intrare
returnate de funcţie
parametrii (argumente) valoare
int main() main: funcţie apelantă apelul funcţiei suma
{
int x, y, adunare; int suma(int a, int b)
parametrii actuali (efectivi)
x = 3;
y = 4; {
variabilă locală
adunare = suma(x, y); parametrii actuali coincid
printf("suma = %d\n",adunare); cu cei formali ca: int s;
return 0; • număr, CORPUL FUNCŢIEI
} • poziţie şi s = a + b;
• tip de dată
int suma(int a, int b)
NU coincid ca nume return s; a, b suma
{
suma: funcţie apelată
suma
int s; }
s = a + b;
return s; valoarea returnată de funcţie
}
17:51 PCLP CURS 4 25 17:51 PCLP CURS 4 26

#include <stdio.h> Completaţi spaţiile libere


int suma(int ,int ); /* prototipul functiei */ 1.
1. tipul
… valorii 2. numele
… 3. parametrii
3. parametrii formali

returnate de funcţie funcţiei 4.
4. parametrii
parametrii de
de intrare

main() 1. main: funcţie apel…
antă
{
int x, y, adunare; 2. apelul ..... funcţiei suma int suma(int a, int b)
x = 3;
y = 4; 3. parametrii actuali
…....... (efectivi)
(…..) {
5.5.variabilă
variabilălocală
...
adunare = suma(x, y);
printf("suma = %d\n",adunare); int s;
} 6. CORPUL
... FUNCŢIEI
FUNCŢIEI
s = a + b;
int suma(int a, int b) return s;
{ 4. suma: funcţie apelată
….. Completaţi …b
7. a, 9.9.suma

int s; } 8.
8. suma

s = a + b; spaţiile libere
return s; 10.returnată
10. valoarea … de funcţie
}
17:51 PCLP CURS 4 27 17:51 3
PCLP CURS 4 28

#include <stdio.h>
ÎNTREBARE float scad(float, float);
main()
• Scrieţi un {
float x, y, dif;
program care x = 3.25;
apelează o y = 4.05;
dif = scad(x, y);
funcţie care printf("%g - %g = %g\n", x, y, dif);
calculează }
Aplicaţie
diferența a
două numere
float scad(float a, float b)
{
PROGRAM PENTRU RIDICAREA LA O
reale. float s;
s = a - b;
PUTERE ÎNTREAGĂ POZITIVĂ
return s;
}
17:51 PCLP CURS 4 29 30

PCLP CURS 4 5
11/9/2016

#include <stdio.h>
int power(int base, int n);
Forma definiţiei unei funcţii
int main() tipul-valorii-returnate nume-funcţie(declaraţii de parametrii)
{ base, power
power {
int i; n
for (i = 0; i < 10; ++i) declaraţii
printf("%d %d %d\n", i, power(2,i), power(-3,i)); instrucţiuni
return 0; }
}
Programul conţine o • Declaraţiile funcţiilor pot apărea în orice ordine,
int power(int base, int n)
{/* power: raise base to n-th power; n >= 0 */
funcţie power(m,n) într-un fişier sursă sau în mai multe,
pentru a ridica un întreg
int i, p;
m la o putere întreagă  deşi nici o funcţie nu poate fi ruptă între mai multe
p = 1;
for (i = 1; i <= n; ++i)
pozitivă n. Adică fişiere.
valoarea returnată de
p = p * base;
power(2,5)este 32.
• Pentru moment vom presupune că funcţiile sunt în
return p;
} acelaşi fişier.
17:51 PCLP CURS 4 31 17:51 PCLP CURS 4 32

Apelul funcţiei power int power(int base, int n)


• Funcţia power este apelată de 2 ori de main, în
• Prima linie a funcţiei power, declară:
linia:
printf("%d %d %d\n", i, power(2,i), power(-3,i));  tipurile parametrilor funcţiei (int, int)şi
 numele lor (base, n), precum şi
• Fiecare apel transmite 2 argumente către power,  tipul rezultatului returnat de funcţie (int).
 de fiecare dată se returnează un întreg pentru a fi
formatat şi afişat. • Numele utilizate de power pentru parametrii săi
(base, n) sunt locali funcţiei power,
• Într-o expresie, power(2,i) este un întreg
 ei nu sunt vizibili pentru alte funcţii.
 ca şi 2 şi ca şi i.
17:51 PCLP CURS 4 33 17:51 PCLP CURS 4 34

int power(int base, int n) int power(int base, int n)


• Alte funcţii pot utiliza aceleaşi nume de variabile • Un argument poate fi:
(base, n) fără să apară niciun conflict.  formal
 Acest lucru este valabil şi pentru variabilele i şi p:  actual (efectiv).
 variabila i din power nu are nicio legătură cu
variabila i din main. • În prima linie a funcţiei power:
 base şi n sunt parametrii (argumente) formali,
• parametru este sinonim cu argument
 şi se referă la numele variabilei din lista pusă între adică parametrii cu care funcţia a fost definită.
paranteze rotunde după numele funcţiei.
17:51 PCLP CURS 4 35 17:51 PCLP CURS 4 36

PCLP CURS 4 6
11/9/2016

printf("%d %d %d\n", i, power(2,i), power(-3,i)); Parametru /argument actual şi formal


• În linia din main care apelează de 2 ori funcţia • Parametrii actuali (efectivi) şi cei formali trebuie
power, să corespundă ca
 2 şi i, respectiv -3 şi i  poziţie,
 sunt parametrii actuali / argumente actuale
 număr şi
 adică valorile cu care funcţia este apelată.
 tip de dată.
• Uneori în loc de parametru/argument actual
• Parametrii actuali (efectivi) substituie la apel
 se foloseşte expresia parametru/argument
efectiv. parametrii formali.

17:51 PCLP CURS 4 37 17:51 PCLP CURS 4 38

Completaţi spaţiile libere return expresie;


• Valoarea pe care funcţia power o calculează este
• Parametrii actuali (efectivi) şi cei formali trebuie
returnată funcţiei main prin instrucţiunea return.
să corespundă ca
 După return poate urma orice expresie
 ……….,
poziţie
 Nu este obligatoriu ca o funcţie să returneze o valoare.
 …………
număr şi
• Să observăm că există o instrucţiune return la
 …………...
tip de dată
finalul lui main.
• Parametrii .........…
actuali (.............)
efectivi substituie la apel
• Deoarece main este o funcţie ca oricare alta,
parametrii ……...….
formali .
 ea poate returna o valoare către apelantul său aflat în
mediul în care programul a fost executat.
17:51 PCLP CURS 4 39 17:51 PCLP CURS 4 40

main() : return 0; Prototipul funcţiei


int power(int base, int n);
• De obicei, returnarea valorii 0 presupune o
terminare normală a programului; • Declaraţia int power(int base, int n);
 valori non-zero semnalizează condiţii de terminare  plasată chiar înaintea lui main spune că power
neobişnuite sau cu erori. este o funcţie care:
 aşteaptă două argumente de tip int şi
 În exemple anterioare, din motive de simplitate  returnează un int. int
power
int
int
funcţia main nu avea o instrucţiune return,
• Această declarație, numită prototipul funcţiei,
dar ea va apărea în toate programele ulterioare
pentru că programele trebuie să returneze starea  trebuie să fie în conformitate cu definiţia şi
către mediile în care au fost lansate. utilizarea lui power.
17:51 PCLP CURS 4 41 17:51 PCLP CURS 4 42

PCLP CURS 4 7
11/9/2016

#include <stdio.h>
Prototipul funcţiei int main() /* testul de numar prim */ Întrebare
{
int n, i, prim = 1;
• Se semnalează eroare dacă definiţia unei funcţii printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
sau orice utilizare a ei nu este în conformitate cu for ( i = 2; i <= n - 1; ++i ){
prototipul său. if ( n%i == 0 ){
prim = 0; Rescrieți
/* break; */ programul testării
• Numele parametrilor nu trebuie să se conformeze. }
} unui număr dacă
if ( prim )
este prim sau nu
• Numele parametrilor sunt opţionali în prototipul printf("%d e prim\n", n);
else folosind o funcție
funcţiei, aşa că pentru prototip putem scrie şi aşa: printf("%d nu e prim\n", n); pentru testul de
număr prim.
int power(int, int); }
return 0;

17:51 PCLP CURS 4 43 17:51 PCLP CURS 4 44

Răspuns int prim(int n)


{
int i;
for ( i = 2 ; i <= n - 1 ; ++i )
#include <stdio.h> if ( n%i == 0 )
int prim(int); return 0;
int main() return 1;
{ }
int n;
printf("Introduceti nr care trebuie testat ca e prim\n");
scanf("%d",&n);
if ( prim(n) ) II.1 APELUL PRIN VALOARE
printf("%d e prim\n", n);
else
printf("%d nu e prim\n", n);
return 0;
}
17:51 PCLP CURS 4 45

În C toate argumentele sunt transmise /* power: raise base to n-th power; n >= 0; version 2 */

funcţiilor prin valoare int power(int base, int n)


{ Parametrul n este utilizat ca o variabilă tempo-
• Adică funcţia apelată dă valorile argumentelor sale rară, el numărând înapoi în ciclul for până când
unor variabile temporare cu care lucrează, int p; devine zero; se elimină necesitatea variabilei i.
 lăsând nemodificate originalele.
• Apelul prin valoare este un avantaj, nu o datorie. for (p = 1; n > 0; --n)

 El conduce de obicei la programe mai compacte cu p = p * base; Tot ceea ce este făcut asupra lui
mai puţine variabile străine, n în interiorul funcţiei power nu
return p; are niciun efect asupra
 deoarece parametrii pot fi trataţi ca variabile argumentului n original cu care
locale }
power a fost apelată.
 inițializate convenabil în funcţiile apelate.
17:51 PCLP CURS 4 47 17:51 PCLP CURS 4 48

PCLP CURS 4 8
11/9/2016

Parametrii adresă Tablouri ca parametrii


• Uneori este necesar ca o funcţie să modifice o • Când numele unui tablou este utilizat ca
variabilă din funcţia apelantă. argument, valoarea transmisă funcţiei apelate
este locaţia sau adresa de început a tabloului,
• Apelantul trebuie atunci să furnizeze adresa
variabilei care trebuie modificată (tehnic vorbind  nu se face o copie a elementelor tabloului.
este vorba de un pointer la variabilă),
• Utilizând această valoare, funcţia poate accesa şi
• iar funcţia apelată trebuie să declare parametrul ca modifica orice argument din tablou.
fiind un pointer şi să acceseze variabila indirect
prin intermediul lui. • Despre aceste lucruri se va vorbi în continuare.
17:51 PCLP CURS 4 49 17:51 PCLP CURS 4 50

Aplicaţie

TABLOURI DE CARACTERE AFIŞAREA CELEI MAI LUNGI LINII


CITITE PE INTRARE (VERSIUNEA 1)

Tablouri de caractere Schema programului este simplă:


while (este o linie nouă)
• Numite şi şiruri de caractere.
if (lungimea ei > lungimea celei mai lungi linii anterioare)
• Cel mai uzual tip de tablou în C. salveaz-o
salvează-i lungimea
• Programul următor ilustrează utilizarea:
afişează cea mai lungă linie
 tablourilor de caractere şi
 a funcţiilor care le manipulează. Schema arată că programul se poate divide în 3 părți:
 o parte obţine o line nouă;
• El citeşte o mulţime de linii de text şi o afişează pe  o alta o salvează;
cea mai lungă.  restul controlează procesul.
17:51 PCLP CURS 4 53 17:51 PCLP CURS 4 54

PCLP CURS 4 9
11/9/2016

Funcţia getline Funcţia getline

• Funcţia getline încărcă o linie nouă a intrării. • 0 este o valoare acceptabilă pentru a fi returnată
 Ar trebui ca funcţia să fie utilă şi în alte contexte.  deoarece ea nu poate fi niciodată o lungime
validă pentru o linie.
• Minim minimorum getline trebuie să returneze
un semnal despre un posibil sfârşit de fişier; • Orice linie de text are cel puţin 1 caracter.
 o proiectare mai utilă trebuie să returneze
• Chiar şi o linie conţinând numai 1 caracter:
 lungimea liniei, sau
newline are lungimea 1.
 0 dacă este întâlnit un sfârşit de fişier.

17:51 PCLP CURS 4 55 17:51 PCLP CURS 4 56

/* getline: read a line into s, return length */


Funcţia getline int getline(char s[],int lim)
{
Citeşte o linie de text de pe intrare int c, i; int getline(char s[], int lim) spune că primul
argument, s, e un tablou, iar al doilea, lim, e un întreg.
şirul (linia de pe intrare) curent citit
for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n‘;++i)
s[i] = c;
Scopul furnizării mărimii unui tablou într-o
if (c == '\n') { declaraţie este de a stabili dimensiunea
s[i] = c; spaţiului în care va fi stocat. Mărimea
++i; lungimii tabloului s[] nu este necesară în
} getline deoarece mărimea sa a fost
s[i] = '\0'; stabilită în declaraţia
return i; char line[MAXLINE];
din main (vezi acolo)
Lungimea maximă a lungimii lungimea şirului (liniei de }
unei linii citite pe intrare pe intrare) curent citit getline utilizează return pentru a trimite valoarea
lungimii şirului curent citit, înapoi la funcţia apelantă main.

17:51 PCLP CURS 4 57 17:51 PCLP CURS 4 58

Funcţia copy Funcţia copy


• Când găsim o linie mai lungă decât cea mai lungă
linie anterioară, şirul de caractere în care s-a
salvat linia curentă pentru o
 trebuie să o salvăm undeva, pentru că posibilă afişare viitoare
 în final cea mai lungă linie va trebui afişată, iar
 în tabloul ce conţine linia curentă vom citi în
continuare următoarea linie.
• Aceasta sugerează existenţa unei a doua funcţii:
copy
 pentru a copia linia nouă (din from) într-un loc şirul de caractere care conţine linia
curentă care se doreşte salvată
sigur (în to).

17:51 PCLP CURS 4 59 17:51 PCLP CURS 4 60

PCLP CURS 4 10
11/9/2016

/* copy: copy 'from' into 'to'; assume to is big enough */ STRUCTURA PROGRAMULUI
void copy(char to[], char from[]) #include <stdio.h>
{ #define MAXLINE 1000 /* maximum input line length */

int i; int getline(char line[], int maxline);


void copy(char to[], char from[]);
i = 0;
Funcţiile getline şi copy sunt declarate
while ((to[i] = from[i]) != '\0') main()
la începutul programului, care presupunem
++i; {…}
că este conţinut într-un singur fişier.
} int getline(char s[],int lim)
copy se bazează pe faptul că argumentul său de intrare (char {…}
from[]) este terminat cu un '\0' şi copiază acest caracter pe
ieşire (char to[]). void copy(char to[], char from[])
{…}
17:51 PCLP CURS 4 61 17:51 PCLP CURS 4 62

/* print the longest input line */


Funcţia main int main()
{
int len; /* current line length */

• Avem nevoie de funcţia main care să controleze int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
funcţiile: char longest[MAXLINE]; /* longest line saved here */
 getline şi max = 0;
while ( (len = getline(line, MAXLINE)) > 0 )
 copy. if (len > max) {
max = len; main şi getline
copy(longest, line); comunică printr-o
} pereche de argumente
if (max > 0) /* there was a line */ (line, MAXLINE) şi o
printf("%s", longest); valoare returnată
(len).
return 0;
}
17:51 PCLP CURS 4 63 17:51 PCLP CURS 4 64

int getline(char s[], int lim) void copy(char to[], char from[])

• Această linie spune că primul argument formal, s, e un • Unele funcţii returnează valori utile.
tablou, iar al doilea, lim, e un întreg. • Altele, precum copy, sunt utilizate numai pentru ceea ce
fac şi nu returnează nicio valoare.
• Declară că getline returnează un int
 Tipul returnat de copy este void, care afirmă explicit
 Deoarece int este tipul implicit returnat, putea fi omis.  că nu este returnată nicio valoare.
 Adică linia
• Cu toate acestea, funcţia returnează către main şirul to[]
int getline(char s[], int lim)
în care a copiat şirul from[], dar prin intermediul
 putea fi substituită de linia parametrilor de ieşire - de tip adresă –
getline(char s[],int lim)  adrese care, în cazul tablourilor, sunt tot una cu numele lor
17:51 PCLP CURS 4 65 17:51 PCLP CURS 4 66

PCLP CURS 4 11
11/9/2016

În getline : s[i] = '\0'; În main: printf("%s", longest);


• getline pune caracterul '\0' (null character, a cărui
valoare ASCII e 0) la finalul tabloului de caractere, la • Specificatorul de format %s din printf este pus
crearea lui, pentru a marca finalul şirului de caractere. în corespondenţă cu un argument care
 trebuie să fie un şir de caractere (longest) ce va
• Această conversie este utilizată de limbajul C și când o
constantă şir, de exemplu, fi reprezentat în acest format.
0 1 2 3 4 5 6

"hello\n" 'h' 'e' 'l' 'l' 'o' '\n' '\0'

 apare într-un program C, ea este stocată ca un tablou de


caractere conţinând caracterele şirului şi terminându-se
cu un '\0'
 pentru a marca finalul acestui şir de caractere.
17:51 PCLP CURS 4 67 17:51 PCLP CURS 4 68

Probleme de proiectare Probleme de proiectare


• Ce trebuie să facă main dacă întâlneşte o linie care • Nu există o modalitate pentru utilizatorul funcţiei
este mai mare decât limita sa? getline să ştie în avans cât de lungă ar putea fi o
 getline lucrează în siguranţă, prin aceea că opreşte linie pe care o citeşte,
culegerea caracterelor (chiar dacă nici un caracter  aşa că getline verifică depăşirea.
newline nu a fost găsit) când tabloul este plin.
• Pe de altă parte, s-a considerat că utilizatorul funcţiei
• Testând lungimea şi ultimul caracter returnat, main copy deja ştie (sau poate afla) cât de mari sunt
poate determina dacă linia a fost prea lungă şi apoi şirurile de caractere,
acționează în consecință.  astfel că în programul prezentat s-a ales să nu se
 Din motive de concizie, această testare a fost ignorată. adauge verificări ale erorilor.
17:51 PCLP CURS 4 69 17:51 PCLP CURS 4 70

EXEMPLIFICARE LA “AFIŞAREA CELEI


II.2 VARIABILE EXTERNE ŞI MAI LUNGI LINII CITITE PE
DOMENIUL DE VIZIBILITATE INTRARE”

PCLP CURS 4 12
11/9/2016

int main()
int getline(char s[],int lim)
{ variabilele din main, cum ar fi len,
int len; { Acelaşi lucru este valabil şi pentru
max, line, longest sunt private
int max; int c, i; variabilele din alte funcţii.
sau locale funcţiei main.
char line[MAXLINE]; for(i=0;i<lim-1&&(c=getchar())!=EOF&&c!='\n‘;++i)
char longest[MAXLINE]; s[i] = c;
max = 0; if (c == '\n') { Variabila i din getline nu
s[i] = c; are absolut nicio legătură cu
while ((len = getline(line, MAXLINE)) > 0)
variabila i din copy.
if (len > max) { ++i;
} void copy(char to[], char from[])
max = len; Deoarece ele sunt în interiorul s[i] = '\0'; {
copy(longest, line); funcţiei main, nici o altă return i; int i;
} funcţie nu poate avea acces } i = 0;
if (max > 0) direct la ele.
while ((to[i] = from[i]) != '\0')
printf("%s", longest); ++i;
return 0; }
}
17:51 PCLP CURS 4 73 17:51 PCLP CURS 4 74

Variabile automate Variabile automate


• Ulterior vom discuta clasa de memorare static
• Fiecare variabilă locală dintr-o funcţie  în care variabilele locale îşi păstrează valorile lor între
apeluri.
 apare numai când funcţia este apelată şi
• Deoarece variabilele automate apar şi dispar la apelul
 dispare când se iese din funcţie.
funcţiei:
• Acesta este motivul pentru care astfel de variabile  ele nu reţin valorile lor între două apeluri ale funcţiei
 trebuie să fie setate explicit la fiecare intrare.
sunt numite variabile automate
• Dacă ele nu sunt setate, aceste variabile vor conţine
 automatic variables. resturi de memorie (garbage).
17:51 PCLP CURS 4 75 17:51 PCLP CURS 4 76

Variabile externe Variabile externe


• Mai mult, datorită faptului că variabilele externe
• Ca o alternativă la variabilele automate, este continuă să existe permanent,
posibil să definim variabile care sunt externe  chiar dacă funcţiile care le utilizează sunt apelate
tuturor funcţiilor, adică, şi se termină,
 variabile care pot fi accesate prin nume de orice  ele reţin valorile lor chiar după ce funcţiile care
funcţie. le-au modificat le-au returnat.
• Deoarece variabilele externe sunt accesibile • O variabilă externă trebuie definită o singură
global, dată, în afara oricărei funcţii;
 ele pot fi utilizate în locul listei de argumente  această declarare pune deoparte un spaţiu de
 pentru a comunica date între funcţii. stocare pentru ea.
17:51 PCLP CURS 4 77 17:51 PCLP CURS 4 78

PCLP CURS 4 13
11/9/2016

Variabile externe Completaţi spaţiile libere


• Variabila trebuie declarată în fiecare funcţie care 1. O variabilă locală dintr-o funcţie care apare
doreşte să o acceseze; numai când funcţia este apelată şi dispare când
 aceasta specifică tipul variabilei. se iese din funcţie se numeşte variabilă automată
………….

• Declaraţia poate fi 2. O variabilă care este accesibilă tuturor


funcţiilor şi îşi reţine valoarea chiar după ce
 o instrucţiune explicită folosind cuvântul cheie
funcţiile care au modificat-o au returnat-o se
extern sau
numeşte variabilă externă.
………….
 poate fi implicită din context (i.e. nu se declară
deloc).
17:51 PCLP CURS 4 79 17:51 PCLP CURS 4 80

Linia de lungime maximă


• Reluăm programul care afişează linia de lungime
maximă într-o versiune nouă,
 în care line, longest şi max sunt variabile
externe.
Aplicaţie
• Acest lucru presupune modificări ale
AFIŞAREA CELEI MAI LUNGI LINII  apelurilor,
CITITE PE INTRARE (VERSIUNEA 2)  declaraţiilor şi
 corpurilor celor trei funcții.
17:51 PCLP CURS 4 82

#include <stdio.h> main() /* print longest input line; 2nd version */


{
#define MAXLINE 1000 /* maximum input line size */ int len; DECLARAREA variabilelor externe
în fiecare funcție care le accesează:
extern int max;
int max; /* maximum length seen so far */ • se specifică tipul variabilei.
extern char longest[]; • declarația este explicită folosind
char line[MAXLINE]; /* current input line */
max = 0; cuvântul cheie extern.
char longest[MAXLINE]; /* longest line saved here */
while ((len = getline()) > 0)
int getline(void);
DEFINIREA variabilelor if (len > max) {
void copy(void); externe ale programului. max = len;
Se definesc o singură dată: copy();
main() {…}
}
se specifică tipul lor şi li se
int getline(void){…} alocă spaţiu de stocare. if (max > 0) /* there was a line */
printf("%s", longest);
void copy(void) {…}
return 0;
}
17:51 PCLP CURS 4 83 17:51 PCLP CURS 4 84

PCLP CURS 4 14
11/9/2016

/* getline: 2nd version */


/* copy: 2nd version */
int getline(void)
{ void copy(void)
int c, i; DECLARAREA variabilelor externe
extern char line[]; în funcția care le accesează. { DECLARAREA variabilelor externe
int i; în funcția care le accesează.
for (i = 0; i < MAXLINE – 1 && (c = getchar)) != EOF && c != '\n'; ++i)
line[i] = c; extern char line[], longest[];
if (c == '\n') {
line[i] = c; i = 0;
++i;
} while ((longest[i] = line[i]) != '\0')
line[i] = '\0'; ++i;
return i;
} }

17:51 PCLP CURS 4 85 17:51 PCLP CURS 4 86

Variabile externe Variabile externe


• Din punct de vedere sintactic, definirile de variabile
externe • Declaraţia cu extern în interiorul funcţiilor poate fi omisă
 Dacă definiţia variabilei externe apare în fişierul sursă
 sunt exact ca şi definiţiile de variabile locale, dar
înainte de utilizarea sa în funcţie,
 datorită faptului că ele apar în afara funcţiilor,  nu este nevoie de o declaraţie cu extern în funcţie.
variabilele sunt externe.  Astfel, declaraţiile cu extern în funcţiile main, getline şi
copy sunt redundante.
• Înainte ca o funcţie să poată utiliza, în partea sa de
instrucţiuni, o variabilă externă, • Practic:
 plasăm definiţiile tuturor variabilelor externe la
 numele variabilei trebuie să fie făcut cunoscut funcţiei
începutul fişierului sursă şi
în partea sa de declaraţii;
 omitem toate declaraţiile de variabile externe din
declaraţia este asemănătoare cu cea definiția cu
excepţia faptului că apare cuvântul cheie extern. interiorul funcţiilor.
17:51 PCLP CURS 4 87 17:51 PCLP CURS 4 88

Mai multe fişiere sursă Mai multe fişiere sursă


• Practica comună este să se colecteze declaraţiile
Dacă programul este plasat în câteva fişiere sursă şi extern ale variabilelor şi funcţiilor în fişiere
 o variabilă este definită în fişier1 şi separate,
 utilizată în fişier2 şi în fişier3,  numite header, care
 sunt incluse prin directiva #include la începutul
 atunci declaraţiile extern sunt necesare fiecărui fişier sursă.
 în fişier2 şi Extensia .h este prin convenţie asociată cu fișierele
header.
 în fişier3
• De exemplu, funcţiile din biblioteca standard sunt
 pentru a conecta apariţiile variabilei.
declarate în headere ca <stdio.h>.
17:51 PCLP CURS 4 89 17:51 PCLP CURS 4 90

PCLP CURS 4 15
11/9/2016

Listă explicit vidă de argumente Definire şi Declarare


• Datorită faptului că în program funcţiile getline • Să observăm că am utilizat termenii definire şi
şi copy nu au niciun argument, logic ar fi ca declarare asociaţi cu o oarecare subtilitate când
prototipurile lor de la începutul fişierului sursă să ne-am referit la variabilele externe.
fie de forma  DEFINIREA se referă la locul unde variabila
getline() int getline(void);
şi void copy(void);  este creată sau
copy()  i se asociază spaţiu de stocare în memoria
calculatorului.
 dar compilatorul întâlnind o listă vidă invalidează
verificarea listei de argumente.  DECLARAREA se referă la locurile unde
Din acest motiv cuvântul cheie void trebuie utilizat  este specificată natura variabilei, dar
pentru a preciza o listă explicit vidă de argumente.  nu i se aloca spaţiu de memorie.
17:51 PCLP CURS 4 91 17:51 PCLP CURS 4 92

Variabile extern Variabile extern

• Există o tendinţă să se lucreze numai cu variabile • A te baza prea mult pe variabilele externe este
extern deoarece se pare că periculos deoarece:
 se simplifică comunicarea,  aceasta conduce la programe ale căror conexiuni
între date nu sunt toate evidente;
 lista de argumente este scurtă şi
 variabilele sunt totdeauna acolo unde le vrei.  variabilele pot fi modificate în moduri neaşteptate
sau accidentale şi
• Dar variabilele externe sunt totdeauna acolo chiar  programul este apoi greu de reparat.
şi atunci când nu le doreşti.
17:51 PCLP CURS 4 93 17:51 PCLP CURS 4 94

Versiunea 2 vs. Versiunea 1


• Versiunea 2 a programului este inferioară celei
dintâi,
 pe de-o parte datorită motivelor expuse anterior,
 pe de altă parte deoarece ea distruge
generalitatea celor două funcţii extrem de utile
scriind în ele numele variabilelor pe care le
manipulează
III. VARIABILE
 funcţiile nu mai pot fi utilizate şi
 în alte contexte
 pentru alte variabile.
17:51 PCLP CURS 4 95

PCLP CURS 4 16
11/9/2016

Variabile şi constante Patru caracteristici


• Variabilele şi constantele sunt obiectele de date • Variabila, ca şi constanta reprezintă un obiect de
de bază manipulate într-un program. date cu 4 caracteristici:
1. numele,
• Declarațiile
2. valoarea,
 enumeră variabilele care vor fi utilizate,
3. tipul de dată şi
 stabilesc tipul de dată pe care îl au şi uneori
4. adresa de memorie unde se afla stocată.
 le inițializează cu valoarea cu care intra în calcule.
17:51 PCLP CURS 4 97 17:51 PCLP CURS 4 98

Completaţi spaţiile libere Diferența variabilă - constantă


• Variabila - ca şi constanta - reprezintă un obiect • Diferența între cele două obiecte de date este
de date cu 4 caracteristici: dată de
valoare
1. numele

 care se poate modifica în timpul rulării
2. valoarea
… programului pentru variabilă şi
3. tipul
… de dată  este nemodificabilă pentru constantă.
4. adresa
… de memorie
• Aceasta diferență reprezintă şi sursa numelor de
variabilă, respectiv constantă.
17:51 PCLP CURS 4 99 17:51 PCLP CURS 4 100

Operatori, Expresii, Tip de dată Întrebare


• Operatorii specifică ce prelucrări să facem cu • Ce specifică un tip de dată al unui obiect?
variabilele şi constantele.
• Expresiile combină variabile şi constante pentru a 1. mulţimea de valori pe care le poate avea,
produce noi valori. 2. ce operații pot fi executate pe această
• Tipul de dată al unui obiect specifică: mulţime de valori și
 mulţimea de valori pe care le poate avea, 3. modul cum se memorează valorile.
 ce operații pot fi executate pe această mulţime de
valori și
 modul cum se memorează valorile.
17:51 PCLP CURS 4 101 17:51 PCLP CURS 4 102

PCLP CURS 4 17
11/9/2016

Nume de variabile Nume de variabile


• Numele variabilelor şi al constantelor simbolice • minusculele şi MAJUSCULELE sunt distincte (limbajul C este
 este format numai din litere şi cifre, case sensitive),
 primul caracter trebuie să fie o literă.  astfel că x şi X sunt două nume diferite.

• Convenția impune folosirea


• Simbolul subliniat (underscore) '_' se consideră literă  minusculelor pentru nume de variabile şi a
 poate apare în numele unei variabile sau constante,  MAJUSCULELOR pentru nume de CONSTANTE simbolice.
 dar nu va fi plasat niciodată pe prima poziție • Cuvinte cheie precum if, else, int, float etc., sunt
 pentru a nu se confunda cu anumite rutine de rezervate:
bibliotecă care încep cu '_'.  nu le puteți utiliza ca nume de variabile sau constante.
17:51 PCLP CURS 4 103 17:51 PCLP CURS 4 104

Nume de variabile
• Numele vor fi alese în corespondență cu scopul
variabilei.

• Se vor alege:
 nume scurte pentru variabile locale,
 în special pentru contoarele ciclurilor şi IV. TIPURI DE DATE
 nume mai lungi pentru variabilele externe.

17:51 PCLP CURS 4 105

Tipuri de date Calificatori


Există numai câteva tipuri de date de bază în C. • În plus, există un număr de calificatori care pot fi
aplicați acestor tipuri de bază.
un singur octet, capabil să memoreze un
char
caracter din codul ASCII • short şi long se aplică întregilor:
un întreg, mărimea depinde de short int sh;
int
implementare, 16 sau 32 de biţi
long int counter;
float real simplă-precizie virgulă mobilă
• Cuvântul int poate fi omis în astfel de declarații
double real dublă-precizie virgulă mobilă şi de obicei chiar este omis.
17:51 PCLP CURS 4 107 17:51 PCLP CURS 4 108

PCLP CURS 4 18
11/9/2016

Calificatori Calificatori
• Calificatorul signed sau unsigned poate fi aplicat • Tipul long double specifică numere reale în
la char sau la orice întreg. virgulă mobilă cu precizie extinsă.
• Numerele unsigned sunt totdeauna pozitive sau • Ca şi la tipurile întregi, dimensiunile tipurilor virgulă
zero. mobilă depind de implementare;
 float, double şi long double pot avea una, două
• De exemplu, dacă char ocupă 8 biți: sau trei dimensiuni distincte.
 variabilele unsigned char iau valori între 0 şi 255
• Headerele standard <limits.h> şi <float.h>
 variabilele signed char iau valori între -128 şi 127
conțin constante simbolice pentru toate aceste
(în cod complement faţă de doi).
dimensiuni împreună cu alte proprietăți ale mașinii și
• Caracterele tipăribile sunt totdeauna pozitive. compilatorului.
17:51 PCLP CURS 4 109 17:51 PCLP CURS 4 110

Sufixe
• O constantă întreagă precum 1234 este un int.

• O constantă long este scrisă cu


 un sufix l (el) sau
 L, ca în 123456789L
V. CONSTANTE
• O constantă întreagă prea mare ca să încapă în
tipul int va fi considerată de tipul long.
17:51 PCLP CURS 4 112

Sufixe Sufixe
• Constantele fără semn • Sufixele f sau F
 sunt scrise cu sufixul u sau U,  indică o constantă float
• Sufixul ul sau UL indica tipul unsigned long.
• l sau L
• Constantele în virgulă mobilă conțin
 indică o constantă long double
 un punct zecimal (123.4) sau
 un exponent (1e-2) sau
 ambele;
• tipul lor este double, chiar dacă nu sunt sufixate.
17:51 PCLP CURS 4 113 17:51 PCLP CURS 4 114

PCLP CURS 4 19
11/9/2016

Octal şi Hexazecimal Octal şi Hexazecimal


• Valoarea unui întreg poate fi specificată în octal sau în • Constantele în octal şi hexazecimal pot fi şi ele
hexazecimal în loc de baza zece. urmate de
• Un prefix 0 (zero) la o constantă întreagă specifică  L pentru a le face de tipul long şi
scrierea în octal;
 U pentru a le face unsigned.
• Un prefix 0x sau 0X înseamnă hexazecimal.
• De exemplu, 0XFUL este o constantă de tipul
• De exemplu, numărul 31 din baza 10 poate fi scris unsigned long,
 în octal ca 037
 care în baza 10 are valoarea 15.
 în hexa ca 0x1f sau 0x1F.
17:51 PCLP CURS 4 115 17:51 PCLP CURS 4 116

Constante caracter Constante caracter


• O constantă caracter este un întreg scris ca un • Dacă scriem '0' în locul unei valori numerice ca 48
caracter între apostrofuri, de exemplu: 'x'. (dacă lucrăm în codul ASCII)
 programul este independent de o valoare particulară a
• Valoarea unei constante caracter unui anumit set de caractere şi
 este valoarea numerică a caracterului în setul de  este mai ușor de citit.
caractere al mașinii.
• Constantele caracter intră în operații numerice exact
• în codul ASCII constanta '0' are valoarea 48, ca orice alt întreg,
 care nu are nicio legătură cu valoarea numerică 0.  deși cel mai adesea sunt utilizate în comparații cu alte
caractere.
17:51 PCLP CURS 4 117 17:51 PCLP CURS 4 118

Secvențe escape Secvențe escape


• Anumite caractere pot fi reprezentate prin • un model de biți oarecare, de dimensiune un octet
secvențe escape, cum ar fi \n (newline)  poate fi specificat prin
 aceste secvențe arată ca două caractere, '\ooo'
unde ooo este una până la trei cifre octale (0...7)
 dar reprezintă unul singur.
 sau prin
'\xhh'
unde hh este una sau două cifre hexazecimale
(0...9, a...f, A...F).
17:51 PCLP CURS 4 119 17:51 PCLP CURS 4 120

PCLP CURS 4 20
11/9/2016

Secvențe escape Setul complet de secvenţe escape


• Astfel putem scrie în octal: \a caracterul alertă sonoră (bell) \\ backslash
#define VTAB '\013' /* ASCII vertical tab */ \b backspace \? semnul întrebării

#define BELL '\007' /* ASCII bell character */ \f avans la linie nouă (formfeed) \' apostrof
\n linie nouă (newline) \" ghilimea
• sau, în hexazecimal: \r return (carriage return) \ooo număr octal
\t tab orizontal \xhh număr hexa
#define VTAB '\xb' /* ASCII vertical tab */
\v tab vertical
#define BELL '\x7‘ /* ASCII bell character */
17:51 PCLP CURS 4 121 17:51 PCLP CURS 4 122

Secvențe escape Expresii constantă


• Astfel de expresii pot fi evaluate
• Constanta caracter '\0' reprezintă caracterul cu
valoarea numerică zero, caracterul nul.  în momentul compilării
 mai degeaba decât la momentul execuției şi
• '\0' este adesea scris în locul lui 0 pentru a în consecință pot fi utilizate în orice loc în care
pune mai bine în evidenţă tipul caracter al poate apărea o constantă, ca de exemplu:
anumitor expresii, #define MAXLINE 1000
 însă valoarea numerică este exact 0. char line[MAXLINE + 1];
sau
• O expresie constantă este o expresie care implică #define LEAP 1 /* in leap years */
numai constante. int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];
17:51 PCLP CURS 4 123 17:51 PCLP CURS 4 124

Constante şir Constante şir


• O constantă şir, sau un şir literal, • Aceleași secvențe escape utilizate în constantele
caracter se folosesc și în șiruri;
 este o secvență de zero sau mai multe caractere
 plasate între ghilimele, ca în • \" reprezintă caracterul ghilimea.
Ghilimelele
• Șirurile constante pot fi concatenate la momentul
"I am a string" nu fac parte
compilării:
din șir, ele
servesc doar "hello, " "world"
sau
la delimitarea
este echivalent cu
"" /* the empty string */ șirului.
"hello, world"
17:51 PCLP CURS 4 125 17:51 PCLP CURS 4 126

PCLP CURS 4 21
11/9/2016

Constante şir Constante şir


• Concatenarea este utilă pentru divizarea șirurilor • Această reprezentare finalizată cu '\0‘ înseamnă
lungi de caractere pe mai multe linii sursă. că nu există nici o limită asupra lungimii unui şir,
• Tehnic vorbind o constantă șir de caractere este un  dar programele trebuie să scaneze complet un şir
tablou de caractere. pentru a-i determina lungimea.
• Reprezentarea internă a unui şir de caractere are • Funcţia strlen(s) din biblioteca standard
la final caracterul nul: '\0',  returnează lungimea şirului de caractere s furnizat
 astfel că spațiul fizic de stocare necesar este mai ca argument,
mare cu o unitate decât numărul de caractere  excluzând caracterul terminal '\0'.
scrise între ghilimele.
17:51 PCLP CURS 4 127 17:51 PCLP CURS 4 128

Versiune strlen(s) 'x' vs. "x"


/* strlen: return length of s */
• Nu trebuie să se facă confuzie între constanta
int strlen(char s[]) caracter şi un şir care conţine un singur caracter:
{
int i; strlen şi alte 'x' nu este acelaşi lucru cu "x"
funcţii pentru
i = 0; şiruri de caractere 'x'este un întreg utilizat pentru a produce
while (s[i] != '\0') sunt declarate în valoarea numerică a literei x din setul de caractere
headerul standard al maşinii
++i; <string.h>  de exemplu, în codul ASCII, 'x' are codul 120.
return i;
} "x" este un tablou de caractere care conţine un
caracter (litera x) şi un '\0'.
17:51 PCLP CURS 4 129 17:51 PCLP CURS 4 130

Constanta enumerare Constanta enumerare


• Există un tip special de constantă şi anume • Dacă nu sunt specificate toate valorile, valorile
constanta enumerare. nespecificate continuă progresia de la ultima valoare
• O enumerare este o listă de valori întregi specificată, ca în al 2-lea exemplu de mai jos:
constante, ca în: enum escapes { BELL = '\a', BACKSPACE =
'\b', TAB = '\t', NEWLINE = '\n', VTAB =
enum boolean { NO, YES }; '\v', RETURN = '\r' };
 Primul nume într-un enum are valoarea 0,
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
 următorul are valoarea 1 ş.a.m.d. JUL, AUG, SEP, OCT, NOV, DEC };
 dacă nu sunt specificate nişte valori explicite. /* FEB = 2, MAR = 3, etc. */
17:51 PCLP CURS 4 131 17:51 PCLP CURS 4 132

PCLP CURS 4 22
11/9/2016

• Numele care apar în enumerări trebuie să fie Constanta enumerare


distincte.
• Valorile nu trebuie să fie distincte, ca în exemplul: • Enumerările furnizează un mod convenabil de a
#include <stdio.h>
asocia valori constante cu nume,
int main()
{
 o alternativă pentru #define.
enum months { JAN = 1, FEB = 1, MAR = 1, APR,
MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC };
• Putem declara variabile de tip enum
printf("JAN=%d,FEB=%d,MAR=%d, APR=%d \n",
JAN, FEB, MAR, APR);  care adesea sunt o variantă mai bună decât
return 0; #define.
}

17:51 PCLP CURS 4 133 17:51 PCLP CURS 4 134

Exemplu cu variabilele luna şi


luna_curenta de tip enum: Bibliografie
#include <stdio.h>
[1] Kernighan, B., Ritchie, D., The C Programming
int main()
Language, ediția a II-a, Ed. Prentice Hall, 1988.
{
enum months { JAN = 1, FEB, MAR, APR, MAY, JUN,
JUL, AUG, SEP, OCT, NOV, DEC } luna;
enum months luna_curenta = OCT;
for(luna = JAN; luna <= DEC; luna++)
printf("indexul lunii = %d\n", luna);
printf("luna curenta = %d\n", luna_curenta);
return 0;
}
17:51 PCLP CURS 4 135 17:51 PCLP CURS 4 136

PCLP CURS 4 23

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