CATEGORII DOCUMENTE |
Structurile grupeaza date de tipuri diferite, constituind definitii ale unor noi tipuri de date. Componentele unei structuri se numesc membrii (campurile) structurii. La declararea unei structuri se pot preciza tipurile, identificatorii elementelor componente si numele structurii.
Forma generala de declarare a unei structuri:
struct identificator_tip_structura
lista_identificatori_variabile;
in care:
struct este un cuvant cheie (obligatoriu)
identificator_tip_structura reprezinta numele noului tip (poate lipsi)
lista_de_declaratii_membri este o lista in care apar tipurile si identificatorii membrilor structurii
lista_identificatori_variabile este o lista cu identificatorii variabilelor de tipul declarat.
Membrii unei structuri pot fi de orice tip, cu exceptia tipului structura care se declara.
Sa se gaseasca coordonatele punctului mediu situat la jumatatea distantei dintre doua puncte date.
//Structuri
#include <iostream.h>
typedef struct punct2D;
punct2D punct_mediu(punct2D p1, punct2D p2)
void main ()
, b=, c;
c=punct_mediu(a,b);
cout<<'na('<<a.x<<','<<a.y<<')';
cout<<'nb('<<b.x<<','<<b.y<<')';
cout<<'nc('<<c.x<<','<<c.y<<')';
Oglinda
Sa se gaseasca imaginea in oglinda a unui punct A(x,y) fata de axa Oy
//Structuri-pointer
#include <iostream.h>
struct punct2D ;
void oglinda_oy(struct punct2D *pct)
void main ()
cout<<'nPunctul original A are x='<<A.x<<' si y= '<<A.y;
oglinda_oy(&A);
cout<<'nPunctul oglindit A' are x='<<A.x<<' si y=' <<A.y;
Modulul unui numar complex
Sa se calculeze modulul unui numar complex folosind o functie
//Functie cu structuri
#include<math.h>
#include<stdio.h>
#include<conio.h>
typedef struct COMPLEX;
double modul(COMPLEX *);//prototipul
void main()
double modul(COMPLEX *z)//definitie
Sa se scrie un program care citeste numere complexe si le afiseaza impreuna cu modulul si argumentul lor.
Programul foloseste o functie care calculeaza si returneaza modulul unui numar complex.
Daca: z = x + iy atunci modulul numarului complex este radacina patrata din: x*x + y*y
Programul mai foloseste si o functie care calculeaza si returneaza argumentul unui numar complex. Daca: z = x + iy atunci arg z se calculeaza astfel:
a. Daca x = y = 0, arg z = 0.
b. Daca y = 0 si x 0, atunci
daca x > 0, arg z =0; altfel arg z = p
c. Daca x = 0 si y 0, atunci
daca y > 0, arg z = p/2; altfel arg z = 3*pi/2.
d. Daca x si y 0, atunci fie:
a = arctg(y/x)
d1. Daca x > 0 si y > 0, atunci arg z = a.
d2. Daca x > 0 si y < 0, atunci arg z = 2*p + a.
d3. Daca x < 0 si y > 0, atunci arg z = p + a.
d4. Daca x < 0 si y < 0, atunci arg z = p + a. Se observa ca pentru x < 0 si y
arg z = pi + a;
altfel, daca x > 0 si y < 0, atunci arg z = 2*p + a
//PROGRAMUL BX3
#include <stdio.h>
#include <math.h>
typedef struct COMPLEX;
//FUNCTIA BX1
double d_modul(COMPLEX *z)
/* calculeaza si returneaza modulul numarului complex z */
//FUNCTIA BX2
/* functia foloseste constanta M_PI=3.1415 definita in headerul math.h */
double d_arg(COMPLEX *z)
void main() /* citeste numere complexe si le afiseaza impreuna cu modulul si argumentul corespunzator */
Sa se citeasca (cu ajutorul unei functii de citire) urmatoarele informatii despre elevii participanti la un concurs de admitere: nume, numarul de inscriere si cele trei note obtinute. Sa se afiseze, printr-o functie, informatiile citite. Sa se afiseze o lista cu elevii participanti la concurs, ordonati alfabetic, notele si media obtinuta (functie de ordonare, functie de calculare a mediei). Sa se afiseze lista elevilor inscrisi la concurs, in ordinea descrescatoare a mediilor.
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <conio.h>
#define DIM_PAG 24 // dimensiunea paginii de afisare
#define FALSE 0
#define TRUE 1
struct elev; //definirea tipului elev
void cit_elevi(elev *a, int n)
while ((a+i)->note[j]<0 || (a+i)->note[j]>10);
}
}
void ord_medii(elev *a, int n)
med1/=3; med2/=3;
if (med1<med2)
}
}
void ord_alf(elev *a, int n)
}
}
//void cit_elevi(elev *a, int n); // functie implementata anterior
void antet_afis(const char *s)
void afis_elev(elev *a, int n, char c)
med/=3;printf('%-9.2f|n', med);lin++;
if (lin==(DIM_PAG-1))
}
printf(' Apasa o tasta.'); getch();
void main()
Sa se calculeze media notelor la un examen pentru mai multi studenti si media notelor la toate examenele pentru un singur student. Se vor folosi date de tip structura (denumita student) cu urmatoarele campuri: Nume, nota1, nota2, nota3.
Aceeasi zona de memorie poate fi utilizata pentru pastrarea unor obiecte (date) de diferite tipuri, prin declararea uniunilor. Uniunile sunt similare cu structurile, singura diferenta constand in modul de memorare. Declararea uniunilor:
union identificator_tip_uniune
lista_identificatori_variabile;
Spatiul de memorie alocat corespunde tipului membrului de dimensiune maxima. Tipul uniune foloseste aceeasi zona de memorie, care va contine informatii organizate in mai multe moduri, corespunzator tipurilor membrilor.
//Uniuni
#include <iostream.h>
#include<conio.h>
union tip_dublu
ddata;
void main ()
Persoane
Sa se exemplifice folosirea reuniunilor (union) pentru citirea si afisarea datelor despre mai multe persoane de ambele sexe.
Vom folosi o structura pentru a memora numele, varsta si sexul unei persoane, indiferent daca aceasta este femeie sau barbat. Dar, in functie de sex, persoana respectiva va avea un sot (daca e femeie), respectiv o sotie (daca e barbat). O inregistrare de tip union va fi folosita, asadar, pentru a memora partenerul unei persoane oarecare.
O inregistrare union este similara cu o inregistrare de tip struct, cu exceptia faptului ca union va permite sa definiti variabile (campuri) care sa-si imparta acelasi spatiu de memorare.
//Patrut 6/87
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
union partener
struct persoana
void Citeste(int nr_p, struct persoana *x)
else
void Scrie(int nr_p, struct persoana x)
printf('Datele persoanei a %d-a:n',nr_p);
printf('Numele: %s.n',x.nume);
printf('Varsta: %d.n',x.varsta);
printf('Sexul: %c. n',x.sex);
if(x.sex=='F'|| x.sex=='f')
printf('Numele sotului: %s.n',x.p.sot);
else
printf('Numele sotiei: %s.n',x.p.sotie);
void main()
Fie tipul FIG declarat ca mai jos:
typedef struct fig;
FIG;
O data de tip FIG contine elementele unei figuri necesare pentru a calcula aria figurii respective. Figurile avute in vedere sunt:
cerc;
patrat;
dreptunghi
triunghi.
In cazul primelor doua figuri, data de tip FIG contine o valoare de tip double care, in cazul cercului reprezinta lungimea razei acestuia, iar in cazul patratului, lungimea laturii patratului. In cazul dreptunghiului, data contine doua elemente de tip double: lungimea si latimea. In sfirsit, in cazul triunghiului, data contine trei valori de tip double care reprezinta lungimile celor trei laturi ale triunghiului.
Componenta tip defineste elementele (figura) prezente intr-o data de tip FIG si are valorile:
Pentru cerc.
Pentru patrat.
Pentru dreptunghi.
Pentru triunghi.
Pentru eroare.
In locul acestor valori, consideram constantele simbolice:
#define EROARE -1
#define CERC 0
#define PATRAT 1
#define DREPTUNGHI 2
#define TRIUNGHI 3
Functia aria din program are ca parametru o data de tip FIG, calculeaza si returneaza aria figurii ale carei clemente sunt continute in zona definita de parametru. Functia returneaza 0 in cazul in care datele sunt eronate.
La calculul arici unui triunghi se foloseste formula lui Heron.
Functia citire_fig din program are ca parametru un pointer spre o data de tip FIG si citeste si pastreaza elementele figurii definite de componenta tip a datei de tip FIG.
//PROGRAMUL BX40
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct fig;
} FIG;
#define EROARE -1
#define CERC 0
#define PATRAT 1
#define DREPTUNGHI 2
#define TRIUNGHI 3
//FUNCTIA BX38
#define PI 3.14159265358979
double aria(FIG *p)
/* calculeaza si returneaza aria figurii definite de elementele prezente in zona spre care pointeaza p; la eroare returneaza 0 */
default:/* eroare */ return 0;
}/*switch*/
//FUNCTIA BX39
int citire_fig(FIG *p)
/* - citeste elementele figurii definite de p->tip; - returneaza:
0 - la intilnirea sfirsitului de fisier sau la eroare;
1 - altfel. */
case PATRAT:
for( ; ; )
case DREPTUNGHI:
for( ; ; )
case TRIUNGHI:
for( ; ; )
default: return 0;
}
void main ()
/* - citeste o litera marc care defineste o figura geometrica,
apoi citeste elementele figurii respective;
- calculeaza si afiseaza aria acelei figuri. */
sscanf(t,'%ls',lit);
switch(lit[0])
if(f.tip != EROARE) break;
} /* sfirsit for */
/* citeste elementele figurii */
if(citire_fig(&f)==0)
/* calculeaza si afiseaza aria figurii */
if((a=aria(&f))==0)
exit(1);
printf('Aria figurii= %gn', a);
Tipul enumerare permite programatorului sa foloseasca nume sugestive pentru valori numerice. De exemplu, in locul numarului unei luni calendaristice este mai sugestiv sa folosim denumirea lunii respective sau eventual o prescurtare:
ian - Pentru ianuarie in locul cifrei 1.
feb - Pentru februarie in locul cifrei 2.
si asa mai departe.
Un alt exemplu se refera la posibilitatea de a utiliza cuvintele FALS si ADEVARAT pentru valorile 0 respectiv 1. in felul acesta se obtine o mai mare claritate in programele sursa, deoarece valorile numerice sint inlocuite prin sensurile atribuie lor intr-un anumit context.
In acest scop se utilizeaza tipul enumerare. Un astfel de tip se declara printr-un format asemanator cu cel utilizat in cadrul structurilor. Un prim format general este:
enum nume dl,d2,,dn;
unde:
nume - Este numele tipului de enumerare introdus prin aceasta declaratie.
nume0, nume1,, numek - Sint nume care se vor utiliza in continuare in locul valorilor numerice si anume numei are valoarea i.
d1,d2,,dn - Sint date care se declara de tipul nume. Aceste date sint similare cu datele de tip int.
Ca si in cazul structurilor, in declaratia de mai sus nu sint obligatorii toate elementele. Astfel, poate lipsi nume, dar atunci va fi prezent cel putin d1. De asemenea, poate lipsi in totalitate lista d1,d2,,dn, dar atunci va fi prezent nume. In acest caz, se vor defini ulterior date de tip nume folosind un format de forma:
enum nume dl,d2,,dn;
enum luna;
Prin aceasta declaratie, numarul lunii poate fi inlocuit prin denumirea prescurtata a lunii respective. De exemplu, o atribuire de forma: luna = 3 se poate inlocui cu una mai sugestiva: luna = mar deoarece, conform declaratiei de mai sus, mar are valoarea 3.
In mod analog, o expresie de forma: luna == 7 este identica cu expresia: luna == iul
Daca in locul declaratiei de mai sus s-ar fi utilizat declaratia de tip enumerare:
enum dl ;
atunci putem declara ulterior data luna de tip dl astfel: enum dl luna; Data luna declarata in acest fel este o data identica cu data luna declarata la inceput.
Fie tipul enumerare Boolean declarat astfel:
enum Boolean ;
Declaram data bisect de tip Boolean:
enum Boolean bisect;
Atribuirea:
bisect = an%4 == 0&&an%100 || an%400 ==0;
atribuie variabilei bisect valoarea 1 sau 0, dupa cum anul definit de variabila an este bisect sau nu (se presupune ca anul apartine intervalului [1600,4900]).
in continuare se pot folosi expresii de forma:
bisect == false
sau
bisect == true
Limbajul C permite atribuirea unui nume pentru un tip (predefinit sau utilizator) de date. Pentru aceasta se folosesc delcaratiile de tip. Forma generala a acestora este:
typedef tip nume_tip;
Nume_tip poate fi folosit la declararea datelor in mod similar cuvintelor cheie pentru tipurile predefinite.
Exemplu:
typedef int INTREG;
INTREG x, y;
INTREG z=4;
typedef struct COMPLEX;
COMPLEX x, y;
Alocarea memoriei se poate realiza in urmatoarele moduri:
alocare statica;
alocare dinamica;
alocare pe stiva.
Se aloca static memorie in urmatoarele cazuri:
pentru instructiunile de control propriu-zise;
pentru variabilele globale si variabilele locale declarate in mod explicit static.
Se aloca memorie pe stiva pentru variabilele locale.
Se aloca dinamic memorie in mod explicit, cu ajutorul functiilor de alocare dinamica, aflate in headerul <alloc.h>.
In limbajul C, alocarea memoriei in mod dinamic se face cu ajutorul functiilor malloc, calloc, realloc; eliberarea zonei de memorie se face cu ajutorul functiei free. Functiile de alocare/dezalocare a memoriei au prototipurile in header-ele <stdlib.h> si <alloc.h>:
Sintaxa:
void *malloc(size_t nr_octei_de_alocat);
Functia malloc necesita un singur argument (numarul de octeti care vor fi alocati) si returneaza un pointer generic catre zona de memorie alocata (pointerul contine adresa primului octet al zonei de memorie rezervate).
#include <iostream.h>
#include <malloc.h>
#include <string.h>
#include <stdlib.h>
void main()
else
else strcpy(psir[i],sirstoc);
}
cout << 'Sirul ' << sirstoc << ' a fost alocat in ' << nrart
<< 'blocuri distincte.n'
for (i=0;i<nrart;i++)cout << psir[i] <<'n';
cout << 'Memoria pentru cele ' << nrart << ' blocuri ' << sirstoc
<< n';va fi eliberata apasind o tastan';
cin >> ch;
for(i=0;i<nrart;i++)free(psir[i]);
free(psir);
Sintaxa:
void *calloc(size_t nr_elemente, size_t marimea_in_octeti_ a_unui_elem);
Functia calloc aloca memorie pentru un tablou de nr_elemente, numarul de octeti pe care este memorat un element este marimea_in_octeti_a_unui_elem si returneaza un pointer catre zona de memorie alocata.
//calloc
#include <iostream.h>
#include <malloc.h>
float cere_element(int i)
void afis_tablou(int n,float *tablou)
void main()
else cout << 'Alocare esuata!n';
void *realloc(void *ptr, size_t marime);
Functia realloc permite modificarea zonei de memorie alocata dinamic cu ajutorul functiilor malloc sau calloc.
Observatie:
In cazul in care nu se reuseste alocarea dinamica a memoriei (memorie insuficienta), functiile malloc, calloc si realloc returneaza un pointer null. Deoarece functiile malloc, calloc, realloc returneaza un pointer generic, rezultatul poate fi atribuit oricarui tip de pointer. La atribuire, este indicat sa se utilizeze operatorul de conversie explicita (vezi exemplu).
Eliberarea memoriei (alocate dinamic cu una dintre functiile malloc, calloc sau realloc) se realizeaza cu ajutorul functiei free.
void free(void *ptr);
Variabilele tablou si variabilele de tip definit de utilizator sunt exemple de variabile compuse (reprezinta date structurate). Care este, totusi, deosebirea dintre ele ?
Ce posibilitati de definire a unor noi tipuri de date va ofera limbajul C/C++ ?
In ce consta diferenta dintre structuri si uniuni ?
Cum se numesc componentele unei structuri ?
Ce restrictii impune folosirea campurilor de biti ?
Exista vreo restrictie referitoare la tipul membrilor unei structuri ? Daca da, care este aceasta ?
Sa se implementeze programele cu exemplele prezentate.
Sa se scrie programele pentru exercitiile rezolvate care au fost prezentate.
Realizati urmatoarele modificari la exercitiul prezentat la sfarsitul capitolului:
Completati cu o functie de calcul si afisare a mediei notelor tuturor candidatilor pentru fiecare proba (media tuturor elevilor la proba1, media la proba2, etc).
Modificati lista alfabetica, astfel incat la elevii cu medie peste 5, sa apara (alaturi de medie) mesajul 'Promovat', iar la ceilalti, mesajul 'Nepromovat'.
Considerand ca rezultatelor obtinute sunt utilizate la un concurs de admitere, la care exista N locuri (N introdus de la tastatura), si de faptul ca pentru a fi admis media trebuie sa fie cel putin 5, sa se afiseze lista admisilor si lista respinsilor, in ordinea descrescatoare a mediilor, in limita locurilor disponibile.
Sa se scrie un program care sa permita memorarea datelor privitoare la angajatii unei firme mici: nume angajat, adresa, numar copii, sex, data nasterii, data angajarii, calificare, salariul brut. Se vor implementa urmatoarele functii:
Citirea informatiilor despre cei N angajati (N introdus de la tastatura);
Cautarea - dupa nume - a unui angajat si afisarea informatiilor despre acesta;
Modificarea informatiilor despre un anumit angajat;
Lista alfabetica a angajatilor, in care vor apare: nume, adresa, data angajarii, calificare, salariu;
Lista angajatilor in ordine descrescatoare a vechimii;
Lista angajatilor cu un anumit numar de copii, C, introdus de la tastatura;
Lista angajatilor cu varsta mai mare decat V (V introdus de la tastatura);
Salariul minim, salariul mediu si cel maxim din firma;
Lista de salarii, in care vor apare: numele, calificarea, salariul brut si salariul net. La sfarsitul listei vor apare totalurile pentru salariile brute, impozite, salarii nete. Pentru calculul salariului net se aplica urmatoarele reguli de impozitare:
I=15% pentru salariul brut (SB)<600000
I=50000+20% pentru 600000<=SB<1500000 (20% din ceea ce depaseste 600000)
I=100000+30% pentru 1500000<=SB<3000000
I=250000+40% pentru 3000000<=SB<15000000
I=45% pentru SB>=1500000
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1514
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved