Răspuns :
#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.
Vă mulțumim că ați vizitat site-ul nostru web care acoperă despre Informatică. Sperăm că informațiile furnizate v-au fost utile. Nu ezitați să ne contactați dacă aveți întrebări sau aveți nevoie de asistență suplimentară. Ne vedem data viitoare și nu ratați să marcați.