CATEGORII DOCUMENTE |
Structuri. Tipuri de date definite de utilizator.
Datele pot fi clasificate in doua categorii:
Date simple, izolate: tipurile acestora sunt predefinite in limbajul C (ex. int. double, float, char)
Date grupate, sau structurate: tablourile si structurile, care permit prelucrarea globala dar si individuala a fiecarui element al datei respective.
Structurile: reprezinta o modalitate de grupare a datelor care nu sunt neaparat de acelasi tip (spre deosebire de tablouri). Este necesara uneori referirea la o data care cuprinde mai multe elemente, exemplu data calendaristica , avand componentele: zi, luna, an.
Prin structura in limbajul de programare, intelegem o colectie de date neomogene (de tipuri diferite), grupate sub un singur nume. Exista posibilitatea accesului la fiecare componenta a structurii , cat si posibilitatea referirii in ansamblu a structurii definite.
Sintaxa declararii unei structuri:
struct NumeStructura
nume1, nume2, ., numeN;
unde:
<instructiune de declarare de tip>::= <tip> <lista identificatori>
Observatie: Identificatorii: NumeStructura, nume1, ., numeN pot sa lipseasca dar nu toti odata. Astfel:
- Daca NumeStructura lipseste, cel putin nume1 trebuie sa apara in constructie
- Daca nume1, ., numeN lipsesc, atunci este obligatoriu ca NumeStructura se fie prezent.
- In situatia in care NumeStructura este prezent, prin acest lucru se defineste un nou tip de data denumit NumeStructura.
-Daca nume1, . numeN sunt prezente ele reprezinta date de tipul nou introdus NumeStructura.
- Daca una dintre datele din compunerea unei structuri este de tipul pointer la tipul de date introdus prin structura respectiva, numim structura recursiva:
struct NumeStructura //structura recursiva
nume1, nume2, ., numeN;
Exemple:
struct DataCalendaristica
DataNasterii, DataAngajarii;
-prin aceasta constructie am introdus un tip nou (DataCalendaristica) si am definit doua variabile de tipul nou introdus (DataNasterii si DataAngajarii)
struct DataNasterii, DataAngajarii;
-prin aceasta constructie NU am introdus un tip nou ci doar am definit doua variabile structurate (DataNasterii si DataAngajarii).
struct DataCalendaristica
struct DataCalendaristica DataNasterii, DataAngajarii;
- prin aceasta constructie am definit un tip nou (DataCalendaristica) si ulterior s-au declarat doua variabile structurate (DataNasterii si DataAngajarii) de tipul DataCalendaristica.
Exista posibilitatea declararii unor tablouri de date structurate. Spre exemplu, avem nevoie intr-un program de un sir de 100 date calendaristice, pe care dorim ulterior sa le prelucram. Cum se declara un tablou de date structurate?
struct NumeStructura
struct NumeStructura TablouDeStructuri[N];
- prin aceasta constructie am declarat un tablou unidimensional de N date structurate. Fiecare element al tabloului este reprezentat de o grupare de date.
Exemplu
struct DataCalendaristica
struct DataCalendaristica SirDate[100];
fiecare element al tabloului SirDate are trei componente: zi, luna, an si reprezinta o data calendaristica.
Exista posibilitatea ca in cadrul definirii unei structuri de date sa apara o declaratie a unei date de tip structurat. Spre exemplu, dorim sa prelucram date grupate de tipul Persoana. Pentru fiecare data de acest tip avem mai multe informatii de identificare:nume, prenume, adresa, data nasterii. Se observa ca data nasterii la randul sau este o data structurata (zi, luna, an).
Exemplu de structuri imbricate:
struct DataCalendaristica ;
struct Persoana ;
//declaratia unei date (Pers1) de tipul Persoana
struct Persoana Pers1;
Accesul la componentele unei structuri
Pentru a putea accesa componente ale unei date structurate se va utiliza operatorul punct ".". Daca avem o structura cu numele NumeStructura si o componenta a sa cu numele NumeComponenta, referirea componentei respective se face prin constructia:
NumeStructura.NumeComponenta
Pentru structuri imbricate se foloseste operatorul "." de cate ori este nevoie:Daca dorim sa accesam anul nasterii persoanei Pers1 din exemplul precedent, acest lucru se face printr-o constructie de forma:
Pers1.dataNasterii.an
Fie structura:
struct DataCalendaristica
struct DataCalendaristica SirDate[100];
Pentru a accesa o componenta a unui element al unui tablou de date structurate se folosesc constructii de forma :
SirDate[24].zi , SirDate[1].luna , SirDate[k].an.
Pointeri la structuri
Declararea unui pointer la o structura NumeStructura se face prin constructia:
struct NumeStructura *p;
In acest caz, p este o variabila pointer, si are ca valoare adresa unei date de tipul NumeStructura.
Exemplu. struct DataCalendaristica *p;
Avem nevoie de pointeri la structuri in urmatoarea situatie:
- In cazul in care avem o functie ce prelucreaza o variabila de tipul unei structuri, transmisa ca parametru, si dorim ca efectul modificarilor din corpul functiei apelate sa se regaseasca si in functia apelanta. Spre exemplu, dorim sa citim o data de tip structura printr-o functie, iar valorile citite in corpul functiei trebuie sa fie vizibile in programul apelant.
Exemplu
void Citire(struct DataCalendaristica *p)
Struct DataCalendaristica DC;
//Apelul functiei
Citire(&DC);
Pentru simplificarea sintaxei codului sursa, constructia (*p).NumeComponenta se poate inlocui cu contructia: p->NumeComponenta.
Tipuri de date utilizator
In foarte multe situatii este nevoie ca utilizatorul sa-si defineasca noi tipuri de date pe care le prelucreaza in program. Introducerea unui nou tip de date utilizator se face prin constructiile struct. Noul tip de date este referit prin: struct NumeStructura iar datele se vor declara prin instructiunile de declarare:
struct NumeStructura data1, data2, .datan;
Pentru a utiliza in mod mai flexibil numele noului tip de date introdus, respectiv, de a renunta la cuvantul cheie struct in declaratii de date se va utiliza declaratia de tip.
Limbajul C permite atribuirea unui nume pentru un tip predefinit sau pentru nou tip definit de utilizator prin constructia:
typedef TIP NumeTip;
In continuare cuvantul NumeTip poate fi utilizat in declaratii de date ca si cuvintele cheie (rezervate limbajului C) care denumesc tipurile (int, float, etc.)
Exemplu: Redenumirea tipului int al limbajului C:
typedef int INTREG;
Declararea unei variabile X de tipul int se poate face astfel:
INTREG X; //identica cu declaratia: int X;
In cazul tipurilor definite de utilizator, introduse prin declaratii de structura, putem asigna un nume noului tip printr-o constructie de forma:
typedef struct NumeStructura
NumeTip;
Declararea unor variabile de tipul anterior se face astfel:
NumeTip data1, data2, . datan;
Exemplu1: Program care citeste un sir de structuri de tipul Persoana si afiseaza acest sir ordonat dupa campul nume.
#include <stdio.h>
#include <string.h>
typedef structTData;
typedef struct TPersoana;
void citirePers(TPersoana *p)
void tiparirePers(TPersoana p)
void sortNUME(TPersoana per[],int nr)
}while (cod==0);
void main()
Probleme propuse spre rezolvare
Sa se defineasca un nou tip de data pentru entitatea Punct (3D), sa se denumeasca acest tip TipPunct si sa se declare 3 date de acest tip utilizator.
Scrieti un program care citeste intr-un tablou un numar de k structuri de tipul utilizator Marfa. Campurile structurii sunt: codMarfa, DenumireMarfa, PretMarfa, CantMarfa, Valoare. Se vor calcula valorile marfurilor (valoare=pret*cantitate) si tabloul se va ordona descrescator dupa valorile obtinute si se va afisa pe ecran. (valoarea produselor nu se va citi, aceasta urmind a fi calculata dupa formula data)
Sa se scrie un program care:
Defineste un nou tip de date Punct2D (puncte in plan)
Defineste un tip de date Triunghi
Citeste de la tastatura un tablou unidimensional (sir) de date de tipul triunghi.
TIP ABSTRACT DE DATE
Prin tip de date se intelege domeniul valorilor si operatiile specificate datelor de acel tip. Tipurile de date se clasifica in tipuri elementare (ex. numeric real, numeric intreg, caracter) si structurate (omogene - tablouri, neomogene - structuri). Majoritatea limbajelor de programare ofera posibilitatea manipularii datelor de tip elementar dar si introducerea de noi tipuri de date. Pentru tipurile de date definite de utilizator, programatorul isi va construi module specifice de prelucrare a datelor de acel tip.
Prezentam ca exemplu un modul C care contine definirea tipului de date abstract Rational.
Reamintim ca un numar rational este un numar care poate fi exprimat prin fractia m/n, unde m si n sunt numere intregi. Reprezentarea unui numar rational se poate face printr-o structura cu doua componente de tip intreg, semnificand intregii m si n ai fractiei m/n. Identificam urmatoarele operatii cu numere rationale:
Initializare: stabileste valorile implicite pentru m=0,n=1.
Definire: stabileste valorile pentru componentele m si n.
Modificare unei componente m sau n (setm, setn)
Accesarea unei componente (getm, getn)
Adunarea a doua numere rationale
Inmultirea a doua numere rationale
Reducerea unui rational (prin impartirea lui m si n la cel mai mare divizor comun al celor doi intregi
Testarea egalitatii a doua numere rationale
Testarea relatiei de ordine dintre doua numere rationale
Inversul unui rational
Fiecare operatie din cele enumerate va fi definita prin intermediul unei functii C corespunzatoare in modulul prezentat mai jos.
TAD RATIONAL
#include <stdio.h>
typedef structRational;
void initializare(Rational *a)
void definire(Rational *a, int m_nou, int n_nou)
void setm(Rational *a, int m_nou)
void setn(Rational *a, int n_nou)
int getm(Rational a)
int getn(Rational a)
int cmmdc(int x, int y)
while ( x != y)
if ( x > y)
x = x -y;
else
y = y -x;
return x;
void reduce(Rational *a)
void print(Rational a)
void inmultire(Rational a, Rational b, Rational *c)
void adunare(Rational a, Rational b, Rational *c)
int egalitate(Rational a, Rational b)
Rational invers(Rational a)
int maiMic(Rational a, Rational b)
//verifica relatia de ordine a<b
Problema: Urmand exemplul prezentat anterior (TAD Rational) sa se conceapa tipul abstract de date Complex, dezvoltand o biblioteca de functii specifice operatiilor cu numere complexe.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1830
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved