Informatică, întrebare adresată de vovatodirean, 8 ani în urmă

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 de Apollyon
0

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;

}

Alte întrebări interesante