Programarea și utilizarea datelor de tip structură:
Se cunoaşte datele la n persoane (n<=30): numele, ziua, luna, anul naşterii. Să se scrie un program
care afişează numele persoane născute în ziua z, luna l, şi anul a şi numele persoanei care au mai
mulţi de v ani.
IN LIMBAJUL C!!! VA ROG FRUMOS!!!
Răspunsuri la întrebare
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;
}