C++ POO Lab Lucrarea 1
Structura în C
Tipurile de date struct sunt utilizate pentru a agrega mai multe multe varibile care au sens împreună. De exemplu, dorim să stocăm informații despre o mașină, prin urmare avem nevoie să stocăm marca, modelul, anul de fabricație, numărul de înmatriculare, culoarea, etc. Putem în acest caz să definim o structură numită Masina care să stocheze aceste valori. Variabilele care aparțin unei structuri se numesc câmpuri ale structurii. Un exemplu:
struct Masina {
char marca[100];
char model[50];
unsigned short anFabricatie;
char numarInmatriculare[8];
char culoare[10];
};
Câmpurile structurii Masina sunt: marca, model, anFabricatie, numarInmatriculare și culoare.
Atenție: Definiția unei structuri nu implică automat și existența unei variabile de tipul respectiv, așa cum definirea tipului de dateintnu implică existența unei varibile de tipint.
Declararea unei variabile de tipul Masina se face exact ca declararea oricărei alte variabile, sub forma: <tip_data> <nume_variabila>, cu observația că tipul de dată va conține și cuvântul cheie struct, deci acesta va fi struct Masina:
struct Masina {
char marca[100];
char model[50];
unsigned short anFabricatie;
char numarInmatriculare[8];
char culoare[10];
};
int main() {
struct Masina masina;
return 0;
}
Odată definită o variabilă de tip struct, operatorul folosit pentru a accesa câmpurile structurii este .:
#include <stdio.h>
struct Masina {
char marca[100];
char model[50];
unsigned short anFabricatie;
char numarInmatriculare[8];
char culoare[10];
};
int main() {
struct Masina masina_mea;
printf("Care este marca masinii? ");
fgets(masina_mea.marca, 100, stdin);
printf("Care este modelul masinii? ");
fgets(masina_mea.model, 50, stdin);
printf("Care este numarul de inmatriculare al masinii? ");
fgets(masina_mea.numarInmatriculare, 8, stdin);
printf("Care este culoarea masinii? ");
fgets(masina_mea.culoare, 10, stdin);
printf("Care este anul de fabricatie a masinii? ");
scanf("%hu", &masina_mea.anFabricatie);
return 0;
}
Observație: O structură poate avea câmpuri de orice tip, inclusiv de tipul altor structuri.
Un tip de dată de tip structură poate fi folosit ca orice alt tip de dată, spre exemplu pentru a crea vectori de acel tip, dar și pentru a defini funcții care au argumente sau întorc valori de acel tip:
#include <stdio.h>
struct Masina {
char marca[100];
char model[50];
unsigned short anFabricatie;
char numarInmatriculare[8];
char culoare[10];
};
struct Masina citesteMasina() {
struct Masina masina_mea;
printf("Care este marca masinii? ");
fgets(masina_mea.marca, 100, stdin);
printf("Care este modelul masinii? ");
fgets(masina_mea.model, 50, stdin);
printf("Care este numarul de inmatriculare al masinii? ");
fgets(masina_mea.numarInmatriculare, 8, stdin);
printf("Care este culoarea masinii? ");
fgets(masina_mea.culoare, 10, stdin);
printf("Care este anul de fabricatie a masinii? ");
scanf("%hu", &masina_mea.anFabricatie);
return masina_mea;
}
void afiseazaMasina(struct Masina masina){
printf("Masina marca %s si modelul %s are numarul de inmatriculare "
"%s, culoarea %s si a fost fabricata in anul %hu!\n",
masina.marca, masina.model, masina.numarInmatriculare,
masina.culoare, masina.anFabricatie);
}
int main() {
struct Masina parcAuto[10];
parcAuto[0] = citesteMasina();
afiseazaMasina(parcAuto[0]);
return 0;
}
Plecând de la limbajul C, ne amintim că acesta pune la dispoziție o serie de tipuri de date primitive, incluse în standardul limbajului. Ca exemple, avem: int, long, char, double, etc. În plus, există posibilitatea de a crea structuri compuse folosind cuvântul cheie struct. O structură în C este compusă din una sau mai multe variabile care pot fi ori de tip primitiv, ori alte structuri.
În continuare avem un exemplu de definiție a unor structuri în C.
struct string{
char* str;
unsigned length;
};
struct person{
struct string *first_name;
struct string *last_name;
unsigned age;
float height;
float weight;
};
Se vede că structura person conține pointeri la două structuri de tip string. Relația este descrisă de schema bloc următoare (cu exemple de valori pentru variabilele primitive):
În continuare, vom da un exemplu de utilizare a acestor structuri:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
//make a default string with no content and length = 30
struct string * some_string = (struct string*)malloc(sizeof(struct string));
unsigned default_length = 30;
some_string->length = default_length;
some_string->str = (char*)malloc(default_length * sizeof(char));
strcpy(some_string->str, "Vasile");
//make a person structure in which all strings refer to the default empty string
struct person* new_person = (struct person*)malloc(sizeof(struct person));
new_person->first_name = some_string;
new_person->last_name = some_string;
new_person->age = 29;
new_person->height = (float)1.7;
new_person->weight = 68.9F;
printf("Persoana se numeste %s %s, are varsta de %d ani, inaltimea %f si greutatea %f\n", new_person->first_name->str,
new_person->last_name->str,
new_person->age,
new_person->height,
new_person->weight);
return 0;
}
În acest exemplu, schema bloc este diferită dintr-un punct de vedere esențial: ambii pointeri de tip string sunt referință la aceeași adresă, respectiv la același string. Astfel, dacă se modifică new_person->first_name, atunci implicit se modifică și new_person->last_name (de fapt este aceeași structură):
Pentru a face un rezumat, structura, in C, este un tip de dată compusă din tipuri primitive, sau alte structuri. Analog cu orice alt tip de dată, se pot defini variabile de tipul structurii, așa cum se pot defini variabile de tip primitiv. Limitarea fundamentală a structurilor este că acestea nu pot conține decât date, nu și funcții. În laboratorul următor vom vedea aceasta limitare rezolvată prin noțiunea de clasă.

