STRUCTURI, UNIUNI, ENUMERARI, DECLARATII TYPEDEF
Structurile si uniunile reprezinta pentru programator doua posibilitati importante de a modela colectii de date eterogene din punct de vedere al tipului de date. Enumerarile permit crearea unor tipuri de date noi cu ajutorul unor liste de constante intregi cu nume. Cu ajutorul declaratiilor typedef se pot modifica numele unor tipuri de date existente. In acest capitol se va arata cum se definesc tipurile de date struct, union si enum, cum se folosesc concret in aplicatii si cum se poate redenumi un tip de date deja definit.
structuri
Structurile reprezinta colectii de date neomogene grupate sub acelasi nume, intr-o zona de memorie compacta. Declaratia unei structuri are forma generala:
struct nume_structura
A
tip nume_camp1;
tip nume_camp2;
tip nume_camp3;
tip nume_campn;
Ilista_variabile_structura;
unde:
nume_camp1,nume_camp2,.,nume_campn sunt nume de campuri, membre ale structurii;
tip reprezinta tipul campului si poate fi orice tip simplu sau derivat admis in C;
nume_structura reprezinta numele structurii;
lista_variabile_structura este o lista de variabile al carei tip este struct nume_structura.
Nume_structura si lista variabile_structura sunt optionale dar nu pot lipsi simultan: declaratia unei structuri anonime, care in plus are si lista_variabile_structura vida este absolut inutila.
Iata un exemplu de structura care reflecta un rand din cartea de telefoane.
struct rand_tel
A
char numea15i;
char prenumea20i;
char adresaa50i;
unsigned long int telefon;
Ipers1,pers2;
Aici, pers1 si pers2 sunt nume de variabile care vor avea tipul struct rand_tel. Aceasta declaratie este echivalenta cu:
struct rand_tel
A
char numea15i;
char prenumea20i;
char adresaa50i;
unsigned long int telefon;
I;
struct rand_tel pers1,pers2;
Selectarea unui camp din structura se face utilizand operatorul . sub forma:
nume_variabila_structura.nume_camp
De exemplu, accesul la informatia continuta in campul adresa al variabilei pers1 se face utilizand constructia
pers1.adresa
Asupra unui camp selectat se pot aplica toate operatiile care se pot aplica unei variabile de acelasi tip cu campul. Are sens, de exemplu, o secventa ca aceasta
scanf("%d",&pers1.telefon);
printf("tn Numarul de telefon este %d",pers1.telefon);
Daca o variabila este un pointer catre o structura, accesul la un camp al structurii se face utilizand operatorul -> (alcatuit din semnul si semnul >) sub forma:
nume_pointer_structura->nume_camp
De exemplu, daca avem declarat pointerul pers3 astfel,
struct rand_tel *pers3;
referirea la campul nume al acestei variabile se face sub forma
pers3->nume
Remarcam faptul ca operatorul -> este o sinteza a operatorilor (indirectare) si (selectie). Asadar, expresia
pers3->nume
este echivalenta cu expresia
(*pers3).nume
Marimea unei structuri se calculeaza utilizand operatorul sizeof. De exemplu, marimea structurii rand_tel este data de sizeof(struct rand_tel). Este recomandata folosirea acestui operator si nu calculul manual al marimii structurii (insumand octetii ocupati de fiecare camp) atat din motive de portabilitate cat si din ratiuni de corectitudine: in unele situatii, compilatorul, prin alinierile pe care le face, obtine un necesar de memorie mai mare decat dimensiunea obtinuta manual.
O variabila de tip structura poate fi initializata pe linia de declarare in maniera obisnuita:
Declaratie structurasAlista_valori_initialeI;
De exemplu, prin declaratia
Struct rand_tel pers1sA"Dan","Ion","Ploiesti,str.Tei",165239I;
campurile nume,prenume,adresa,telefon ale variabilei pers1, vor primi in ordine, valorile enumerate in lista.
Copierea informatiei bit cu bit dintr-o structura in alta structura de acelasi tip este posibila printr-o singura instructiune de atribuire. Astfel, atribuirea
pers1spers2;
este echivalenta cu
strcpy(pers1.nume,pers2.nume);
strcpy(pers1.prenume,pers2.prenume);
strcpy(pers1.adresa,pers2.adresa);
pers1.telefonspers2.telefon;
O structura poate fi inclusa in alta structura obtinandu-se structuri imbricate.
De exemplu, se poate imagina structura:
struct info_pers
A
struct rand_tel info;
int varsta;
float salariu;
Iangajat;
Referirea la un camp al structurii incluse se face urmand modelul constructiei
angajat.info.nume
care indica numele unui angajat.
In interiorul unei structuri numele campurilor trebuie sa fie diferite, insa doua structuri diferite pot avea nume de campuri comune. De asemenea, atat numele structurii cat si numele unui camp al structurii pot coincide cu numele unei variabile. De exemplu, declaratiile:
struct pers
A
int i;
int j;
Ip;
int pers;
float i;
sunt perfect valide.
Campurile unei structuri pot fi pointeri catre structura din care fac parte. Acest lucru permite construirea unor structuri recursive (autoreferite) foarte utile in implementarea dinamica a cozilor, stivelor, listelor, arborilor, grafurilor. Iata un exemplu de program care construieste o lista si apoi afiseaza elementele sale. Lista va fi construita element cu element de la sfarsit spre inceput.
Exemplul 16.1
Construirea unei liste si afisarea elementelor sale.
#include 'stdio.h'
#include 'conio.h'
#include 'alloc.h'
programul creaza si afiseaza o lista simplu inlantuita
dintr-un sir de date cu marcatorul de sfirsit 0
void main(void)
A
int x;
struct nod
A
int data;
struct nod *leg;
I*p,*q;
qsNULL;
printf('tnIntroduceti elementele listeitnta');
printf('tnxs');
scanf('%d',&x);
while (x)
A
ps(struct nod *)malloc(sizeof(struct nod));
p->datasx;
p->legsq;
qsp;
printf('tnxs');
scanf('%i',&x);
I
/* afiseaza elementele listei */
printf('tn Elementele listei sint tnta');
psq;
while (p)
A
printf('%i ',(*p).data);
psp->leg;
I
getch();
I
Un tablou poate fi camp al unei structuri asa cum se vede in exemplul urmator:
struct anonima
A
float xa5ia2i;
int y;
Ia;
Referirea la un element al tabloului se face dupa modelul
a.xaiiaji,0<si<s4,0<sj<s1.
De asemenea, componentele unui masiv de date pot fi de tip structura. In exemplul care urmeaza se prezinta un program care memoreaza o lista cu informatii despre notele obtinute de o grupa de studenti intr-un vector de maxim componente.
Un rand din lista se descrie cu ajutorul structurii:
struct catalog
A
char npra30i;
short nota;
Istuda30i;
Dupa memorare, lista este aranjata in ordinea alfabetica a numelor folosind un algoritm de sortare cunoscut (sortarea prin selectie).
Exemplul 16.2
Ordonarea unei liste folosind algoritmul de sortare prin selectie.
#include 'stdio.h'
#include 'conio.h'
#include 'string.h'
void main(void)
A
short i,j,l,n;
struct catalog
A
char npra30i;
short nota;
Istuda30i,studint;
/* introducerea datelor */
printf('tn ns');
scanf('%i',&n);
for (is0;i<n;iSS)
A
printf('tn Numes');
scanf('%s',&studaii.npr);
printf('tn Notas');
scanf('%i',&studaii.nota);
I
/* ordonarea alfabetica a catalogului */
for (is0;i<n-1;iSS)
A
lsi;
for (jsiS1;j<n;jSS)
strcmp(studaji.npr,studali.npr)<0 ? lsj
: l;
studintsstudaii;
studaiisstudali;
studalisstudint;
I
/* afisarea catalogului ordonat */
printf('tn Catalogul ordonat este:tn');
for (is0;i<n;iSS)
printf('tn %s %i',studaii.npr,studaii.nota);
getch();
I
16.1.1. CAmpuri de biTi
In C exista posibilitatea sa accesam un bit din memorie prin intermediul campurilor de biti. Forma generala a declaratiei unui camp de biti este:
struct nume_structura
A
tip nume_camp1:lungime;
tip nume_camp2:lungime;
tip nume_campn:lungime;
Ilista_variabile;
unde lungime reprezinta numarul de biti ai campului, iar tip poate fi unsigned sau signed.
Dupa cum se observa, un camp de biti este de fapt membrul unei structuri caruia i se precizeaza lungimea (numarul de biti). Din acest motiv, accesul la informatia continuta intr-un camp se face folosind operatorii consacrati . sau ->
Totusi, nu toate facilitatile oferite de structuri sunt valabile si in cazul special al campurilor de biti. De exemplu, nu se poate utiliza operatorul & pentru a lua adresa unui camp. De asemenea, numele unui camp nu poate fi numele unui tablou, iar ordinea campurilor este dependenta de implementare.
Campurile de biti isi gasesc utilitatea in special in programarea de sistem (gestionarea registrilor hardware, constructia interfetelor cu dispozitivele de intrare/iesire etc.) sau pentru a face economie de memorie.
De exemplu, sa consideram un dispozitiv cu componente. Daca fiecarei componente ii atasam un bit de stare ( functioneaza, - nu functioneaza) starea intregului dispozitiv poate fi descrisa prin structura:
struct stare_disp
A
unsigned comp1:1;
unsigned comp2:1;
unsigned comp3:1;
unsigned comp4:1;
unsigned comp5:1;
unsigned comp6:1;
Istare;
Starea componentei , de pilda, va fi furnizata de stare.comp4. Avantajul folosirii unei astfel de structuri este evident: in loc sa se foloseasca octeti pentru codificare, se foloseste doar un octet.
Daca anumiti membri ai unui camp de biti nu ne intereseaza, pot fi sariti fara a le da nume. De exemplu, daca ne intereseaza numai bitul , se poate folosi urmatoarea forma simplificata:
struct stare_disp
A
unsigned:3;
unsigned comp4:1;
Istare;
Sa observam ca bitii comp5 si comp6 au fost omisi, lucru acceptat de compilator.
O structura poate contine atat campuri obisnuite, cat si campuri de biti ca in exemplul de mai jos:
struct stare_student
A
char numea40i;
unsigned nota:4;
unsigned adm:1; /*admis sau respins*/
unsigned restante:3; /*numar de restante*/
Istudent;
16.2. Uniuni
O uniune este o structura de date care permite folosirea in comun a aceleiasi zone de memorie de doua sau mai multe variabile diferite, la momente de timp diferite. Forma generala de declarare a unei uniuni este:
union nume_uniune
A
tip nume_camp1;
tip nume_camp2;
tip nume_camp3;
tip nume_campn;
Ilista variabile_uniune;
Dupa cum se poate constata forma generala de declarare a unei uniuni este asemanatoare cu cea a unei structuri. Precizarile facute la uniuni referitoare la relatiile dintre numele uniunii, numele campurilor, numele variabilelor_uniune si numele oricarei variabile raman valabile si aici. Pentru selectarea campurilor putem folosi, de asemenea, operatorii . si ->
Operatorul sizeof aplicat tipului de date union, adica sizeof(union nume_uniune) va furniza lungimea uniunii. Aceasta este mai mare sau egala cu lungimea celui mai mare camp al uniunii.
Deosebirea fundamentala dintre o uniune si o structura consta insa in felul in care campurile folosesc memoria. La o structura, zonele de memorie rezervate campurilor sunt diferite pentru campuri diferite. La o uniune, toate campurile din uniune impart aceeasi zona de memorie. Din acest motiv, datele memorate intr-o uniune pot fi referite diferit, functie de tipul membrului pe care-l avem in vedere. Astfel, folosind secventa
union una
A
int i;
float f;
Iv;
datele din variabila v vor fi privite ca intregi, daca selectam v.i sau reale, daca selectam v.f. Campurile i si f se refera la aceeasi adresa: in v.i se memoreaza sizeof(int) octeti care incep la aceasta adresa, iar in v.f, sizeof(float) octeti care incep la aceeasi adresa.
Folosirea memoriei se face conform urmatoarei schite:
Figura 16.1. Modul de folosire a memoriei de catre campurile uniunii una
Este posibila initializarea unei uniuni cu o constanta care trebuie sa aiba tipul primului camp declarat.
De exemplu, secventa de program
union
A
int i;
float f;
IxsA324I;
va avea ca efect initializarea primului camp (x.is324
Folosind uniunile si campurile de biti se poate accesa cu usurinta informatia la nivel de bit a unei variabile.
Exemplul 16.3
Afisarea primului si ultimului bit din codul binar al unui caracter introdus de la tastatura.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
struct biti
A
unsigned prim :1;
unsigned :6;
unsigned ultim:1;
I;
union char_bit
A
char x;
struct biti y;
Itasta;
printf('tn Tastati un caracter: ');
tasta.xsgetche();
if (tasta.y.prim)
printf('tn Primul bit are valoarea 1');
else
printf('tn Primul bit are valoarea 0');
if (tasta.y.ultim)
printf('tn Ultimul bit are valoarea 1');
else
printf('tn Ultimul bit are valoarea 0');
getch();
I
Pentru interpretarea corecta a informatiei dintr-o uniune, de obicei, se pastreaza intr-o variabila ajutatoare informatii privind continutul curent al uniunii. Pentru ilustrare am ales urmatoarul exemplu.
Exemplul 16.4
Se doreste crearea unei liste cu rezultatele sesiunii de examene pentru o grupa cu un numar de de studenti. Pentru verificarea corectitudinii informatiilor memorate, programul trebuie sa contina si afisarea listei. Se presupune ca un student, la sfarsitul sesiunii, poate fi intr-una din situatiile urmatoare:
a luat toate examenele si i s-a putut incheia o medie pe sesiune;
a luat toate examenele (sa presupunem ca acestea sunt in numar de cinci), dar nu este incheiata media;
a picat cel putin un examen.
Solutia problemei este urmatoarea: lista va fi creata in tabloul stud de componente. Fiecare componenta va fi o structura (numita catalog) care va contine:
campul npr pentru memorarea numelui si prenumelui studentului ( de caractere);
campul tip (un caracter) unde aflam informatii despre continutul curent al uniunii care urmeaza;
uniunea sit cu urmatoarele campuri:
media studentului, cand campul tip are valoarea 'm'
vectorul notea5i, cu cele note de la examene, cand campul tip are valoarea 'e'
un pointer catre prima componenta a unei liste liniare simplu inlantuita, care contine numele disciplinelor restante, cand campul tip are valoarea 'r'
#include 'stdio.h'
#include 'conio.h'
#include 'string.h'
#include 'alloc.h'
void main(void)
A
char discia10i,ch;
int i,k,n;
typedef struct lista
A
char disca10i;
int noter;
struct lista *leg;
Ilist;
list *res;
struct catalog
A
char npra30i;
char tip;
union
A
int nota;
int notea5i;
struct lista *resta;
Ivar;
Istuda30i;
/* introducerea datelor */
printf('tnNs');
scanf('%i',&n);
for (is0;i<n;SSi)
A
printf('tnNume Prenumes');
scanf('%s',&studaii.npr);
do
A
printf('tnTip informatie (m,e,r)s');
chsgetche();
I
while (ch !s 'm' && ch !s 'e' && ch !s 'r');
studaii.tipsch;
switch (studaii.tip)
A
case 'm':printf('tnMedia s ');
scanf('%i',&studaii.var.nota);
break;
case 'e':printf('tnIntroduceti notele tn');
for (ks0;k<5; kSS)
A
printf('tnNotaa%iis',k);
scanf('%d',
&studaii.var.noteaki);
I
break;
case 'r':ressNULL;
printf('tnDiscipline restante
si note;');
printf(' pentru terminare tastati stop ');
printf('tn Disciplina s');
scanf('%s',disci);
while (strcmp(disci,'stop'))
A
studaii.var.restas(list*)malloc(sizeof(list));
strcpy(studaii.var.resta->disc,disci);
printf('tn Nota restantas');
scanf('%d',&studaii.var.resta->noter);
studaii.var.resta->legsres;
ressstudaii.var.resta;
printf('tn Disciplina s');
scanf('%s',disci);
I
break;
I /* end switch*/
I /* end for*/
/* afisarea informatiei */
for (is0;i<n;iSS)
A
printf('tnNume Prenumes%s',studaii.npr);
switch(studaii.tip)
A
case 'm':printf('tn Media la
examenes%i',studaii.var.nota);
break;
case 'e':printf('tn Notele la examen
sunt:
tn');
for (ks0;k<5;kSS)
printf('tn
Notaa%iis%i',k,
studaii.var.noteaki);
break;
case 'r':printf('tn Disciplinele restante
sunt: tn');
ressstudaii.var.resta;
while(res)
A
printf('tn Disciplinas%s',
res->disc);
printf('tn Nota restanta s %d',
res->noter);
ressres->leg;
I
break;
I /* end switch */
I /* end for */
getch();
I
16.3. EnumerAri
O enumerare reprezinta o lista de constante intregi cu nume. Forma generala a unei enumerari este:
enum nume_enumerareAlista_enumIlista_de_variabile;
unde nume_enumerare si lista-enum sunt optionale. Lista_enum defineste toate valorile pe care le pot lua variabilele din lista_de_variabile
In exemplul urmator
enum culoareArosu,alb,verde,albastruIculoarea_mea;
variabila culoarea_mea poate lua oricare din valorile rosu,alb,verde,albastru. Este deci valida atribuirea:
culoarea_measalbastru;
O data enumerarea definita, putem sa ne referim la ea sub forma
enum nume_enumerare lista_de_variabile;
De exemplu, constructia
enum culoare culoarea_ta;
defineste o noua variabila de tip culoare
Simbolurile din lista_enumerare reprezinta valori intregi, conform regulei: valoarea primului simbol din enumerare este , valoarea celui de-al doilea simbol este etc. In exemplul prezentat, rosu are valoarea alb valoarea verde valoarea , iar albastru valoarea
Aceste valori pot fi insa impuse, ca in exemplul urmator:
enum zile_saptAlunis1,miercuris3,joi,vineri, duminicas7Izi;
Simbolul care nu este initializat va primi o valoare cu o unitate mai mare decat valoarea simbolului precedent. Astfel, joi are valoarea , iar vineri valoarea
Simbolurile din lista de enumerare nu pot fi citite de la tastatura sau afisate pe ecran in mod direct. Este deci incorecta o secventa de forma:
zisvineri;
printf("tn ziua este %s",zi);
unde se trateaza un simbol din lista, ca un sir de caractere. In ciuda acestei restrictii enumerarile se folosesc in programe pentru plusul de claritate pe care-l aduc. Este mai sugestiv, de exemplu, sa folosim simbolurile luni,miercuri,joi,vineri, duminica decat, respectiv, codurile
Exemplul 16.5
Afisarea unui simbol din lista de enumerare cu ajutorul sirurilor si a unei structuri switch.
#include 'stdio.h'
#include 'conio.h'
void main(void)
A
enum culoareArosu,alb,verde,albastruI culoarea_mea;
culoarea_measalb;
switch (culoarea_mea)
A
case rosu:printf('tn rosu'); break;
case alb:printf('tn alb'); break;
case verde:printf('tn verde'); break;
case albastru:printf('tn albastru'); break;
I
getch();
I
16.4. DeclaraTii typedef
unde tip reprezinta un tip de date valid (predefinit sau definit de utilizator), iar nume_nou este noul nume asociat. Accentuam faptul ca typedef nu creeaza tipuri de date noi, ci doar redenumeste tipuri existente.
Exemplu:
typedef short int scurt_in;
typedef struct
A
float re;
float in;
Icomplex;
typedef enumAfalse,trueIboolean;
In aceste conditii au sens declaratiile, definitiile si atribuirile de variabile:
scurt_in i;
complex z;
boolean bsfalse;
is321;
z.res0.73; z.ins-72.9;
Facem precizarea ca numele initial al tipului poate fi folosit in continuare alaturi de tipurile nou definite. De exemplu, declaratiile:
short int j;
scurt_in i;
sunt compatibile.
De asemenea, se pot folosi mai multe declaratii typedef pentru a crea diferite nume noi pentru acelasi tip, ca in exemplul urmator:
typedef int integer;
typedef integer intreg;
typedef intreg intr;
Utilitatea declaratiei typedef consta, in primul rand, in aportul de claritate pe care-l poate aduce unui program. Folosirea ei este recomandata mai ales pentru tipuri care se reprezinta mai complicat (de exemplu tipurile struct, union, enum). Exemplele date sunt edificatoare in acest sens.
In al doilea rand, typedef este recomandata pentru a imbunatatii portabilitatea unui program. Daca anumite tipuri de date sunt dependente de calculatorul pe care se ruleaza programul, este bine ca acestea sa primeasca un nume nou cu ajutorul typedef. La o compilare pe alt tip de calculator se vor modifica eventual numai aceste declaratii typedef.
De exemplu, considerand ca pe un calculator unde intregii se reprezinta pe biti, am declarat
typedef int intreg;
trecerea pe un calculator unde intregii se reprezinta pe biti se va face modificand doar declaratia intregilor astfel:
typedef short int intreg;
Deoarece short int pe ultimul calculator se reprezinta pe biti, variabilele declarate de tip intreg vor avea aceeasi lungime pe ambele tipuri de calculatoare.
TESTE DE CONTROL
Secventa de program
struct
A
int x;
float y;
Iz;
scanf("%d",&x);
este gresita, deoarece:
a) la structura din secventa lipseste numele structurii
b) in apelul functiei scanf(), campul x este tratat ca o variabila
Selectarea unui camp din structura se face utilizand simbolul:
a)
b)
c)
d)
e)
Daca p este un pointer catre structura
struct numere
A
int x;
float y;
I;
atunci expresia p x este echivalenta cu:
a) *p.x
b) (*p).x
c) *p.(x)
Atribuirea informatiei dintr-o variabila structura x unei alte variabile structura y de acelasi tip se poate face:
a) scriind ysx
b) atribuind valorile campurilor structurii x campurilor corespunzatoare din y
Secventa de program
int y;
struct num
A
char *x;
int y;
Ia,*p;
ys10;
a ysy;
p.xs "Eroare";
este gresita deoarece:
a) y este in acelasi timp nume de variabila si de camp
b) campul x nu este selectat cu ci cu ajutorul operatorului punct
c) campul y nu este selectat cu operatorul punct, ci cu ajutorul operatorului
Structura
struct persoana
A
int salariu;
struct persoana *p;
struct inform
A
long int telefon;
char *adresa;
Iinf;
Ipers;
este:
a) gresita, deoarece campul pointer p indica catre structura din care face parte
b) corecta
c) gresita, deoarece structura persoana include o alta structura (structura inform
Secventa de program
struct a
A
int x;
float z;
Iw;
struct b
A
int x;
float y;
Iz;
w.xs1;
z.xs2;
a) este gresita, deoarece structurile a si b contin un camp cu nume comun (campul x
b) este corecta, deoarece doua structuri diferite pot avea campuri cu nume comune
Structura
struct a
A
int x;
float ya3ia2i;
Ia;
a) este incorecta, deoarece contine un camp care este tablou
b) este corecta, iar referirea la elementul ya0ia1i se poate face sub forma a.ya0ia1i.
Secventa de program
struct material
A
int cant;
float pu,valoare;
Imagaa3i;
magaa0i.cants100;
este:
a) incorecta deoarece componentele tabloului magaa5i sunt de tip struct
b) incorecta deoarece campurile pu si valoare nu sunt declarate sub forma
float pu;
float valoare;
c) este corecta
Lungimea unei structuri se afla
a) adunand lungimile truturor campurilor care compun structura
b) utilizand operatorul sizeof
Structura
struct a
A
unsigned adm:1;
int nota;
Ielev;
a) este gresita deoarece contine un camp de biti de lungime bit
b) este corecta, deoarece o structura poate contine atat campuri obisnuite cat si campuri de biti
Structura
struct a
A
unsigned:4;
unsigned x:2;
float y:3;
I;
este gresita deoarece
a) primul camp de biti nu are nume
b) al treilea camp de biti nu este de tip unsigned sau signed
Membrii unei uniuni
a) impart aceeasi zona de memorie
b) au rezervate zone de memorie diferite
Operatorii de selectare si se pot folosi pentru selectia campurilor
a) numai la structuri
b) la structuri si la uniuni
c) numai la uniuni
Secventa de program
union
A
float a;
int b;
IzsA10I;
a) este gresita deoarece nu are nume
b) este corecta iar campului a i se atribuie valoarea
c) este corecta iar campului b i se atribuie valoare
Lungimea unei uniuni se afla
a) calculand maximul dintre lungimile membrilor uniunii
b) utilizand operatorul sizeof
Secventa de program
enum masiniATrabant,Dacia,Audi,MarcedesImasina_ta;
masina_tasDacia;
printf("tn Masina ta este %s",masina_ta);
a) este incorecta deoarece constanta simbolica Dacia este tratata ca un sir
b) este corecta si afiseaza cuvantul Dacia
c) este incorecta deoarece este ilegala atribuirea masina_tasDacia;
Numele simbolice dintr-o lista de enumerare
a) se pot atribui unei variabile de tip corespunzator
b) se pot citi de la tastatura
c) se pot scrie nemijlocit
d) pot figura ca o constanta case intr-o instructiune switch
In secventa de program
enum luna_anAianuarie,marties3,maiI;
valoarea atasata numelui simbolic mai este:
a)
b)
c)
Declaratia
typedef enumAfalse,trueIboolean;
a) este incorecta deoarece lipseste numele tipului enumerare
b) este corecta si asociaza enumerarii un nume nou (boolean
c) este corecta si defineste in C tipul boolean pe care standardul ANSI C nu-l prevede.
RASPUNSURI
16.1-b 16.2-a, c 16.3-b 16.4-a, b 16.5-b, c
16.6-b 16.7-b 16.8-b 16.9-c 16.10-b
16.11-b 16.12-b 16.13-a 16.14-b 16.15-b
16.16-b 16.17-a 16.18-a, d 16.19-b 16.20-b
|