Fișierul text numere.txt conține pe prima linie un număr natural nenul n cu cel mult 9 cifre, iar pe a doua linie n cifre, separate prin câte un spațiu. Scrieți un program care determină cea mai mare cifră dintre cele situate pe a doua linie a fișierului numere.txt și numărul de apariții ale acesteia. Valorile determinate se vor afișa pe ecran, separate printr-un spatiu
Răspunsuri la întrebare
Răspuns:
#include <fstream>
#include <iostream>
#include <map>
#include <string>
void
adaugaCifraInDictionar(std::map<int, int>& frecventaCifre, int numarCurent, int& cifraMaxima);
int
main()
{
std::string primulNumar;
/* în loc de std::map poți folosi un vector cu frecvențe dar mie cu std::map mi se pare mai ușor */
std::map<int, int> frecventaCifre;
/* deschidem un std::ifstream pentru a citi din fișier */
std::ifstream fin("numere.txt", std::ios::in);
/* dacă fișierul n-a fost deschis cu succes ieșim din program */
if (!fin.good()) {
exit(EXIT_FAILURE);
}
/* citim prima linie (ce conține câte numere citim de pe a doua linie) */
std::getline(fin, primulNumar);
/* convertim numărul citit de pe prima linie de la std::string la int și-l salvăm în cateNumere */
int cateNumere{ std::stoi(primulNumar) };
/* variabila ce va conține cifra maximă găsită din numerele de pe a doua linie */
int cifraMaxima{ INT_MIN };
int numarCurent{};
for (int i{ 0 }; i < cateNumere; i++) {
/* citim de pe a doua linie (std::getline() ne-a mutat pe a doua linie) numerele */
fin >> numarCurent;
/* și adăugăm cifrele numerelor în dicționarul cu frecvențele */
adaugaCifraInDictionar(frecventaCifre, numarCurent, cifraMaxima);
}
/* la final afișăm cifra maximă găsită și de câte ori apare aceasta */
std::cout << cifraMaxima << " " << frecventaCifre.at(cifraMaxima) << "\n";
}
void
adaugaCifraInDictionar(std::map<int, int>& frecventaCifre, int numarCurent, int& cifraMaxima)
{
/* cât timp numărul e diferit de 0 */
while (numarCurent) {
/* salvăm ultima cifră */
int ultimaCifra{ numarCurent % 10 };
/* dacă ultima cifră e mai mare decât cifra maximă atunci cifra maximă o setăm la valoarea ultimei cifre */
if (ultimaCifra > cifraMaxima) cifraMaxima = ultimaCifra;
/* dacă cifra numărului nu există în dicționar o adaugă cu valoarea 0 pe care mai apoi o și incrementează dacă cifra există îi ia valoarea și o incrementează */
frecventaCifre[ultimaCifra]++;
numarCurent /= 10;
}
}
Conținutul fișierului numere.txt
5
23 14 83 88 72 888 23