Răspuns :
Rezolvare:
#include <iostream>
#include <fstream>
using std::cout, std::cin, std::endl, std::string;
static int **creareMatrice(int numarLiniiSiColoane)
{
int **matrice = new int *[numarLiniiSiColoane];
for (int i = 0; i < numarLiniiSiColoane; i++)
matrice[i] = new int[numarLiniiSiColoane]{};
return matrice;
}
static void populareMatrice(int **matrice, int numarLiniiSiColoane, std::ifstream &ifstream)
{
for (int i = 0; i < numarLiniiSiColoane; i++)
for (int j = 0; j < numarLiniiSiColoane; j++)
ifstream >> matrice[i][j];
}
// static void afisareMatrice(int **matrice, int numarLiniiSiColoane)
// {
// for (int i = 0; i < numarLiniiSiColoane; i++)
// {
// for (int j = 0; j < numarLiniiSiColoane; j++)
// cout << matrice[i][j] << " ";
// cout << endl;
// }
// }
static int minimDinMatrice(int **matrice, int numarLiniiSiColoane)
{
int minim = 1000;
for (int i = 0; i < numarLiniiSiColoane; i++)
for (int j = 0; j < numarLiniiSiColoane; j++)
if (matrice[i][j] < minim)
minim = matrice[i][j];
return minim;
}
static int elementeCuSumaPara(int **matrice, int numarLiniiSiColoane)
{
int contorNumere{}, copieNumar{}, sumaCifre{};
for (int i = 0; i < numarLiniiSiColoane; i++)
for (int j = 0; j < numarLiniiSiColoane; j++)
{
if (j >= numarLiniiSiColoane - i)
{
copieNumar = matrice[i][j];
while (copieNumar)
{
sumaCifre += copieNumar % 10;
copieNumar /= 10;
}
if (sumaCifre % 2 == 0)
contorNumere++;
sumaCifre = 0;
}
}
return contorNumere;
}
static void dealocaMatricea(int **matrice, int numarLiniiSiColoane)
{
for (int i = 0; i < numarLiniiSiColoane; i++)
delete[] matrice[i];
delete[] matrice;
matrice = nullptr;
}
int main()
{
int numarLiniiSiColoane{};
std::ifstream ifstream("tablou.in");
if (!ifstream.good())
exit(EXIT_FAILURE);
std::ofstream ofstream;
ofstream.open("tablou.out", std::ofstream::out | std::ofstream::app);
if (!ofstream.good())
exit(EXIT_FAILURE);
ifstream >> numarLiniiSiColoane;
int **matrice = creareMatrice(numarLiniiSiColoane);
populareMatrice(matrice, numarLiniiSiColoane, ifstream);
ifstream.close();
// afisareMatrice(matrice, numarLiniiSiColoane);
ofstream << minimDinMatrice(matrice, numarLiniiSiColoane) << endl;
ofstream << elementeCuSumaPara(matrice, numarLiniiSiColoane) << endl;
ofstream.close();
dealocaMatricea(matrice, numarLiniiSiColoane);
return 0;
}
Explicație:
- Deschizi fișierul „tablou.in” și citești numărul de linii și de coloane de pe prima linie cu un std::ifstream ( folosit pentru a citi din fișiere ). Aici mai poți adăuga un if în care să verifici dacă e mai mic sau egal cu 100. Dacă nu poți da un exit(EXIT_FAILURE).
- După ce ai aflat numărul de coloane îți aloci dinamic o matrice bidimensională cu ajutorul funcției „creareMatrice(...)”
- După ce ai creat-o o populezi citind numerele de pe liniile rămase din „tablou.in” cu ajutorul funcției „populareMatrice(...)” ( dacă numărul de linii și coloane e 4 încearcă să ai câte 4 numere pe fiecare linie din fișier, dacă e 5 să ai 5 numere ș.a.m.d. )
- Ai și o funcție de afișare să vezi dacă a citit bine matricea ( pe care am comentat-o că nu are rost s-o folosim ).
- După ce ai citit matricea cauți minimul din ea ( iei un număr să zicem 1000 că oricum îți zice-n enunț că n-o să ai numere mai mari de 3 cifre ) și dacă găsești un număr mai mic decât 1000 actualizezi minimul pe care-l și returnezi la final. De asta se ocupă funcția „minimDinMatrice(...)”
- Valoarea returnată de această funcție o scriem mai apoi folosindu-ne de un std::ofstream pe care-l deschidem cu std::ofstream::out | std::ofstream::app ( pentru a da append la elemente ).
- După trebuie să returnăm numărul de elemente de sub diagonala secundară care au suma cifrelor pară. Ai funcția „elementeCuSumaPara(...)” care fix asta face, parcurge matricea și dacă numărul se află sub diagonala secundară îi calculează suma cifrelor, dacă suma cifrelor este pară încrementează contorul. La final îl returnează iar valoarea returnată este scrisă-n fișier.
- După toate astea închizi std::ofstream și apelezi funcția „dealocaMatricea(...)” pentru a elibera memoria alocată dinamic.
Edit:
Acuma am citit mai bine și dacă nu-s numere cu suma pară trebuie să scrii "Nu există", ai mai jos funcția corectă, cea de sus ar fi scris în fișier 0 dacă nu găsea numere cu suma pară.
static void elementeCuSumaPara(int **matrice, int numarLiniiSiColoane, std::ofstream &ofstream)
{
int contorNumere{}, copieNumar{}, sumaCifre{};
for (int i = 0; i < numarLiniiSiColoane; i++)
for (int j = 0; j < numarLiniiSiColoane; j++)
{
if (j >= numarLiniiSiColoane - i)
{
copieNumar = matrice[i][j];
while (copieNumar)
{
sumaCifre += copieNumar % 10;
copieNumar /= 10;
}
if (sumaCifre % 2 == 0)
contorNumere++;
sumaCifre = 0;
}
}
contorNumere != 0 ? ofstream << contorNumere : ofstream << "Nu exista\n";
}
Și o apelezi în main( ) cu:
- elementeCuSumaPara(matrice, numarLiniiSiColoane, ofstream);
Vă mulțumim că ați ales să vizitați platforma noastră dedicată Informatică. Ne bucurăm dacă informațiile oferite v-au fost de folos. Pentru întrebări sau asistență suplimentară, nu ezitați să ne contactați. Revenirea dumneavoastră ne onorează – adăugați-ne la favorite pentru a fi mereu la curent!