Rezolvare in C++
Cei N prieteni se intalnesc dupa mult timp.
Se da urmatorul tabel cu cei n prieteni care contine:
● numele
● prenumele
● greutate
● inaltime
● varsta
Sa se elimine minorii, cei care inaltime sub 140 cm si peste 220 cm, iar apoi sa se afiseze prietenul care este cel mai gras si cel mai slab
Restrictii:
● 0 < N < 30;
● Vectorii v1, v2 vor fi de tip string, v3, v4, v5 vor fi de tip float.
Creati urmatoarele functii in cadrul programului vostru:
Functia scos_din_persoane
● Primeste ca parametri 2 vectori de tip string care reprezinta numele si prenumele si 3 vectori de tip float care reprezinta greutate, inaltime, varsta.
● Verifica daca varsta unei pers este mai mica de 18 ani. Daca da, elimina persoana respectiva
● Verifica daca inaltimea este sub 140 cm si peste 220 cm; daca da, elimina persoana
Functia gras_si_slab
● Primeste ca parametri 2 vectori de tip string care reprezinta numele si prenumele si
1 vector de tip float care reprezinta greutatea.
● Gaseste cel mai slab si cel mai gras din lista si ii afiseaza
Realizarea metodei Main:
● Citirea numarului N.
● Citirea vectorului v1 care reprezinta numele.
● Citirea vectorului v2 care reprezinta prenumele.
● Citirea vectorului v3 care reprezinta greutatea
● Citirea vectorului v4 care reprezinta inaltimea
● Citirea vectorului v5 care reprezinta varsta
● Apelarea functiei scos_din_persoane, iar apoi a functiei gras_si_slab
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <string>
#include <vector>
/* ca să nu mai scriem std::vector<std::string>& în funcții putem scrie acuma vectorString */
typedef std::vector<std::string>& vectorString;
/* la fel */
typedef std::vector<float>& vectorFloat;
void scos_din_persoane(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate, vectorFloat vectorInaltime, vectorFloat vectorVarsta);
void gras_si_slab(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate);
void afisare_persoane(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate, vectorFloat vectorInaltime, vectorFloat vectorVarsta);
int main()
{
/* nu am mai implementat scrierea datelor de la tastatură pentru a salva timp */
std::vector<std::string> vectorNume{ "Ion", "Vasile", "Andrei", "Mihai" };
std::vector<std::string> vectorPrenume{ "Ionescu", "Vasilescu", "Andreescu", "Mihailescu" };
std::vector<float> vectorGreutate{ 50.0f, 67.3f, 88.2f, 100.3f };
std::vector<float> vectorInaltime{ 150.0f, 165.0f, 163.2f, 139.5f };
std::vector<float> vectorVarsta{ 18.0f, 19.0f, 20.0f, 34.0f };
/* afișăm persoanele înainte de modificări (mai mult pentru testare) */
std::cout << "Persoanale inainte de modificari:\n";
/* am creat o funcție-n + care ne afișează persoanele ca să nu mai scriem noi de mână tot COUT-ul */
afisare_persoane(vectorNume, vectorPrenume, vectorGreutate, vectorInaltime, vectorVarsta);
/* scoatem persoanele care nu îndeplinesc criteriile (vârstă >= 18 și înălțimea între 140 și 220) */
scos_din_persoane(vectorNume, vectorPrenume, vectorGreutate, vectorInaltime, vectorVarsta);
/* le afișăm din nou pentru a vedea dacă modificările aduse vectorilor au funcționat */
std::cout << "\nPersoanale dupa eliminarea unora:\n";
afisare_persoane(vectorNume, vectorPrenume, vectorGreutate, vectorInaltime, vectorVarsta);
std::cout << "\n";
/* iar la final afișăm cea mai slabă și cea mai grasă persoană */
gras_si_slab(vectorNume, vectorPrenume, vectorGreutate);
return 0;
}
void scos_din_persoane(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate, vectorFloat vectorInaltime, vectorFloat vectorVarsta)
{
/* calculăm dimensiunea vectorilor (toți ar trebui să aibă dimensiuni egale) */
size_t dimVector{ vectorNume.size() };
for (size_t i{}; i < dimVector; i++) {
float varstaPersoana{ vectorVarsta.at(i) };
float inaltimePersoana{ vectorInaltime.at(i) };
bool conditieInaltime{ inaltimePersoana >= 140.0f && inaltimePersoana <= 220.0f };
/* dacă vârsta e mai mică de 18 iar condiția înălțimii nu este îndeplinită */
if (varstaPersoana < 18.0f || !conditieInaltime) {
/* scoatem persoana din vectori */
vectorNume.erase(vectorNume.begin() + i);
vectorPrenume.erase(vectorPrenume.begin() + i);
vectorGreutate.erase(vectorGreutate.begin() + i);
vectorInaltime.erase(vectorInaltime.begin() + i);
vectorVarsta.erase(vectorVarsta.begin() + i);
}
}
}
void gras_si_slab(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate)
{
size_t indicePersoanaSlaba{}, indicePersoanaGrasa{}, dimVector{ vectorNume.size() };
float greutateMin{ FLT_MAX }, greutateMax{ FLT_MIN };
for (size_t i{}; i < dimVector; i++) {
/* luăm greutatea persoanei curente */
float greutateCurenta{ vectorGreutate.at(i) };
/* dacă greutatea persoanei este mai mare decât cea actuală */
if (greutateCurenta > greutateMax) {
/* salvăm indexul persoanei și actualizăm greutatea */
indicePersoanaGrasa = i;
greutateMax = greutateCurenta;
}
/* dacă greutatea persoanei este mai mică decât cea actuală */
if (greutateCurenta < greutateMin) {
/* același lucru */
indicePersoanaSlaba = i;
greutateMin = greutateCurenta;
}
}
std::cout << "Cea mai slaba persoana din liste este: "
<< vectorNume.at(indicePersoanaSlaba) << " " << vectorPrenume.at(indicePersoanaSlaba) << "\n";
std::cout << "Cea mai grasa persoana din liste este: "
<< vectorNume.at(indicePersoanaGrasa) << " " << vectorPrenume.at(indicePersoanaGrasa) << "\n";
}
void afisare_persoane(vectorString vectorNume, vectorString vectorPrenume, vectorFloat vectorGreutate, vectorFloat vectorInaltime, vectorFloat vectorVarsta)
{
size_t dimVector{ vectorNume.size() };
for (size_t i{}; i < dimVector; i++) {
std::cout << "\t" << i + 1 << ".) " << vectorNume.at(i) << " " << vectorPrenume.at(i)
<< " in varsta de " << vectorVarsta.at(i) << " are " << vectorInaltime.at(i)
<< "cm inaltime si cantareste " << vectorGreutate.at(i) << "kg!\n";
}
}