Răspuns :
Răspuns:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// structura noastră
typedef struct Persoana {
char* _nume;
int _ziua, _luna, _anul;
} Persoana;
// funcția ne creează un vector de persoane
static Persoana* creeaza_vector_persoane(int numar_persoane) {
// curățăm buffer-ul deoarece după ce citim vârsta / data nașterii rămân pe stdin junk values (și nu mai putem citi corect la următoarea iterație)
while ((getchar()) != '\n')
;
// ne creăm un vector și alocăm spațiu doar pentru câte persoane vrem să creăm
Persoana* vector_persoane = (Persoana*)malloc(sizeof(Persoana) * (unsigned long long)numar_persoane);
// un buffer temporar în care vom salva numele persoanei ca mai apoi să-l copiem în char*-ul din interiorul structurii
char sir_temp[BUFSIZ];
// și acum începem să creăm persoanele
for (int i = 0; i < numar_persoane; ++i) {
printf("Introdu numele persoanei (de ex. Vasile Vasilescu) >> ");
// dacă fgets returnează NULL înseamnă că a apărut o eroare și ieșim din program
if ((fgets(sir_temp, BUFSIZ, stdin)) == NULL) {
fprintf(stderr, "Eroare la citirea sirului de caractere!\n");
exit(EXIT_FAILURE);
}
// dacă fgets a citit cu succes scăpăm de caracterul '\n' pe care-l adaugă fgets-ul automat la final
sir_temp[strcspn(sir_temp, "\n")] = 0;
// calculăm dimensiunea necesară pe care „_nume” va trebui s-o aibă pentru a putea stoca numele citit
rsize_t dim_buffer = strlen(sir_temp) + 1;
// alocăm spațiu pentru „_nume” din interiorul structurii
vector_persoane[i]._nume = (char*)malloc(dim_buffer);
// și copiem șirul din „sir_temp” în „_nume” din interiorul structurii
strcpy_s(vector_persoane[i]._nume, dim_buffer, sir_temp);
// după îi spunem utilizatorului să introducă data nașterii
printf("Introdu ziua, luna si anul nasterii (de ex. 2 11 2000)! >> ");
// și salvăm în field-urile corespunzătoare din interiorul structurii
scanf("%d%d%d", &vector_persoane[i]._ziua, &vector_persoane[i]._luna, &vector_persoane[i]._anul);
}
// și returnăm vectorul cu persoane
return vector_persoane;
}
// o simplă funcție care afișează o persoană
static void afisare_date_persoane(const Persoana* persoana) {
printf("Numele >> \"%s\"\nData nasterii >> \"%d %d %d\"\n", persoana->_nume, persoana->_ziua, persoana->_luna, persoana->_anul);
}
// funcție ce eliberează memoria alocată
static void elibereaza_memoria(Persoana* vector_persoane, int dimensiune_vector) {
for (int i = 0; i < dimensiune_vector; ++i) free(vector_persoane[i]._nume);
free(vector_persoane);
}
int main() {
int varsta, cate_persoane = 0;
printf("Cate persoane vrei sa creezi ? >> ");
// citim câte persoane vrem să creăm
scanf("%d", &cate_persoane);
// dacă numărul de persoane este mai mic decât 0 sau 0 și peste 30 ieșim din program
if (cate_persoane <= 0 || cate_persoane > 30) {
fprintf(stderr, "Varsta trebuie sa fie cuprinsa in intervalul (0,30]!\n");
exit(EXIT_FAILURE);
}
// creăm vectorul cu persoane
Persoana* vector_persoane = creeaza_vector_persoane(cate_persoane);
// citim vârsta (de ex. 21)
printf("Introdu varsta >> ");
scanf("%d", &varsta);
printf("Persoanele care au peste \"%d\" ani sunt:\n", varsta);
// și acuma parcurgem vectorul, din 2022 scădem anul nașterii și ne rezultă aproximativ vârsta persoanei de exemplu dacă avem o persoană născută-n 02 11 2000 va avea aproximativ 22 de ani și 22 > 21 deci afișăm persoana
for (int i = 0; i < cate_persoane; ++i)
// dacă vârsta persoanei este mai mare decât vârsta minimă afișăm persoana
if ((2022 - vector_persoane[i]._anul) > varsta)
afisare_date_persoane(&vector_persoane[i]);
// la final eliberăm memoria
elibereaza_memoria(vector_persoane, cate_persoane);
return 0;
}
Vă mulțumim că ați ales să vizitați site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile. Dacă aveți întrebări sau aveți nevoie de asistență suplimentară, vă rugăm să ne contactați. Revenirea dumneavoastră ne va bucura, iar pentru acces rapid, nu uitați să ne salvați la favorite!