Informatică, întrebare adresată de goldman501, 8 ani în urmă

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 de Apollyon
1

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

Alte întrebări interesante