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

Exercitiu structuri si alocare dinamica. Am mare nevoie de rezolvarea completa cat si de explicatii.

Anexe:

Madalin77: limbaj?
cosmaandra2000: C++ mi-as dori, dar merge si C
Madalin77: pentru functia data_nasterii, nu se vede in capat ce scrie
cosmaandra2000: cnp scrie
cosmaandra2000: scz, nu am facut eu poza, e gasita
1Viserys: conteaza complexitatea?

Răspunsuri la întrebare

Răspuns de Paddon
3

#include <iostream>

#include <fstream>

#include <cstring>

using namespace std;

struct persoana

{

char nume[20];

char prenume[20];

char cnp[14];

 

 

void citire()

{

 /**

  * Functia citeste numele, prenumele apoi CNP-ul intrdoduse de la tastatura, fiecare pe

  * cate o linie.

  */

 cout << "Nume: ";

 cin.getline(nume, sizeof(nume));

 cout << "Prenume: ";

 cin.getline(prenume, sizeof(prenume));

 cout << "CNP: ";

 cin.getline(cnp, sizeof(cnp));

}

 

 

void afisare()

{

 /**

  * Functia afiseaza informatiile persoanei (nume, prenume si CNP), fiecare pe linii

  * separate.

  */

 cout << "Nume: " << nume << endl;

 cout << "Prenume: " << prenume << endl;

 cout << "CNP: " << cnp << endl;

 char an[5], luna[3], zi[3];

 strncpy(an, cnp + 1, 2);

 strncpy(luna, cnp + 3, 2);

 strncpy(zi, cnp + 5, 2);

 an[2] = '\0';

 luna[2] = '\0';

 zi[2] = '\0';

 cout << "Data nasterii (an / luna / zi): " << an << "/" << luna << "/" << zi << ".";

 cout << endl;

}

 

 

void data_nasterii()

{

 

 // Luna, extrasa din CNP

 char luna_string[3];

 strncpy(luna_string, cnp + 3, 2);

 luna_string[2] = '\0';

 

 // Transforma numarul lunii in numele corespunzator

 char luna_nume[13];

 if (strcmp(luna_string, "01") == 0)

  strcpy(luna_nume, "ianuarie");

 else if (strcmp(luna_string, "02") == 0)

  strcpy(luna_nume, "februarie");

 else if (strcmp(luna_string, "03") == 0)

  strcpy(luna_nume, "martie");

 else if (strcmp(luna_string, "04") == 0)

  strcpy(luna_nume, "aprilie");

 else if (strcmp(luna_string, "05") == 0)

  strcpy(luna_nume, "mai");

 else if (strcmp(luna_string, "06") == 0)

  strcpy(luna_nume, "iunie");

 else if (strcmp(luna_string, "07") == 0)

  strcpy(luna_nume, "iulie");

 else if (strcmp(luna_string, "08") == 0)

  strcpy(luna_nume, "august");

 else if (strcmp(luna_string, "09") == 0)

  strcpy(luna_nume, "septembrie");

 else if (strcmp(luna_string, "10") == 0)

  strcpy(luna_nume, "octombrie");

 else if (strcmp(luna_string, "11") == 0)

  strcpy(luna_nume, "noiemmbrie");

 else if (strcmp(luna_string, "12") == 0)

  strcpy(luna_nume, "decembrie");

 

 // Creez propozitia cu data nasterii

 char sentence[100];

 strcpy(sentence, "Data nasterii este ");

 

 // Adaug propozitiei ziua, extrasa din CNP, si numele lunii

 strncat(sentence, cnp + 5, 2);

 strcat(sentence, " ");

 strcat(sentence, luna_nume);

 strcat(sentence, " ");

 

 // Prefixul anului, am presupus ca 00 - 20 = 20xx si 21 - 99 = 19xx

 if (cnp[1] == '0')

  strcat(sentence, "20");

 else

  strcat(sentence, "19");

 

 // Anul extras din CNP

 strncat(sentence, cnp + 1, 2);

 strcat(sentence, ".");

 puts(sentence);

}

 

 

bool egali(persoana other)

{

 return strcmp(nume, other.nume) == 0;

}

 

};

int main()

{

persoana persoane[10];

 

int numar_persoane;

cout << "Introduceti numarul de persoane: ";

cin >> numar_persoane;

 

// Fara linia urmatoare bufferul sare peste o linie.

cin.get();

 

// Citirea persoanelor si verificarea CNP-urilor

for (int i = 0; i < numar_persoane; ++i)

{

 persoane[i].citire();

 for (int j = 0; j < i; ++j)

 {

  if (strcmp(persoane[i].cnp, persoane[j].cnp) == 0)

  {

   cout << "Exista mai multe persoane cu acelasi CNP.";

   return 0;

  }

 }

}

cout << endl;

 

// Numararea persoanelor cu acelasi nume n-am reusit s-o fac sa functioneze bine cand

// exista mai multe persoane cu nume diferite

// Exemplu:

// a, a, b, b, b, c, c

// Va da rezultat 5.

int numar_persoane_cu_acelasi_nume = 1;

for (int i = 0; i < numar_persoane; ++i)

{

 cout << "Persoana " << i + 1 << ":" << endl;

 persoane[i].afisare();

 persoane[i].data_nasterii();

 cout << endl;

 for (int j = 0; j < i; ++j)

 {

  if (strcmp(persoane[i].nume, persoane[j].nume) == 0)

  {

   numar_persoane_cu_acelasi_nume++;

   break;

  }

 }

}

if (numar_persoane_cu_acelasi_nume > 1)

 cout << "Exista " << numar_persoane_cu_acelasi_nume << " persoane cu acelasi nume.";

 

// Stocarea persoanelor in fisier

ofstream fout("persoane.in");

for (int i = 0; i < numar_persoane; ++i)

{

 fout << persoane[i].nume << endl;

 fout << persoane[i].prenume << endl;

 fout << persoane[i].cnp << endl;

}

}

Sper ca n-am ratat nimic. Cum am spus si in comentarii, n-am reusit sa fac corect numararea persoanelor cu acelasi nume.

Evident, programul nu va functiona corect daca datele introduse sunt incorecte. Adica, iti va da garbage daca ii dai litere in CNP.

P.S: mi se pare ingrozitor lucratul cu cstring in C++ in 2020, dar asa-s facultatile.


Madalin77: si alocarea dinamica unde este?
Paddon: Nu e. Modific acum.
Paddon: Well, nu mai pot modifica. O sa las mai jos codul modificat
Paddon: int main()
{
int numar_persoane;
cout << "Introduceti numarul de persoane: ";
cin >> numar_persoane;

persoana *persoane;
persoane = new persoana[numar_persoane];

// Fara linia urmatoare bufferul sare peste o linie.
cin.get();

/** CONTINUAREA CODULUI ESTE LA FEL **/
}
Alte întrebări interesante