Din fişierul text tablou.in se citesc: un număr natural n (n≤100) reprezentând
numărul de linii și numărul de coloane ale unui tablou bidimensional. De pe
următoarele linii se citesc elementele tabloului, câte n componente de pe fiecare
linie, numere naturale nenule cu cel mult trei cifre fiecare.
a) Pe prima linie a fișierului tablou.out, afișați valoarea celui mai mic element din
matrice.
b) Determinați câte elemente situate sub diagonala secundară (exclusiv diagonala!) au
suma cifrelor un număr par și afișați acest număr pe al doilea rând al fișierului
tablou.out. Dacă nu există niciun număr cu proprietatea cerută, se va afișa în fișier
mesajul Nu există!.
Exemplu: Dacă fişierul tablou.in are forma:
4
1 2 1 3
43 454 234 12
23 77 99 1
8 6 5 3
atunci fişierul tablou.out va conţine:
1
2
Răspunsuri la întrebare
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);