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

Buna am o problema:
Mi se da un sir de caractere pe mai multe linii si eu trebuie sa afisez litera care apare de cele mai multe ori in sir.
#include
#include
using namespace std;
int sir[256];
char s[256];
int i, maxim = 0;
int main() {
cin.getline(s, 256);
int n = strlen(s);
while (cin.getline(s, 256)) {
for (i = 0; i < n; ++i) {
if (s[i] >='a' && s[i] <='z') {
sir[s[i]]++;
maxim = max(maxim, sir[s[i]]);
}
}
}
for (i = int('a'); i <= (int)'z'; ++i) {
if (sir[i] == maxim) {
cout << (char) i;
return 0;
}
}
return 0;
}
Stiti cumva ce problema am in acest cod? As fi recunosctor daca mi ati raspunde... chiar nu stiu de ce nu functioneaza..
De asemenea, daca exista un numar egal de litere, se va afisa codul asci cel mai mic.

Răspunsuri la întrebare

Răspuns de Porecla0987
0

Citesti sirul de prea multe ori; il citesti si in while si o data in afara lui while.

N-ar trebui sa citesti cu "while" prin stdin, mai ales fara break, pentru ca n-ai cum sa-l opresti.

Pe 'n' il declari in afara structurii repetitive, dar nu-l mai modifici in structura repetitiva.

Nu ai initializat 'sir'. O sa fie plin cu numere random, evident ca programul n-o sa functioneze.

Nu-i nevoie sa folosesti "return 0" cand ai terminat cu ultimul for, poate vrei sa mai faca ceva programul, foloseste "break". Daca nu stii ce face break, practic "sparge" (iese) din structura repetitiva in care se afla. Daca se afla in mai multe iese din cea interioara.

Quality of life:

'sir' e mult prea mare

N-ar trebui sa folosesti variabile globale decat daca ai un motiv bine intemeiat (in cazul de fata n-ai)

Poftim codul tau, putin modificat si functional:

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

int sir[256] = {0};

int i, maxim = 0, numRepetitions;

cout << "Introdu numarul de linii pe care vrei sa le citesti: ";

cin >> numRepetitions >> std::ws;

for (int repetitions = 0; repetitions < numRepetitions; ++repetitions)

{

 char s[256];

 cin.getline(s, 256);

 int n = strlen(s);

 for (i = 0; i < n; ++i)

 {

  if (s[i] >= 'a' && s[i] <= 'z')

  {

   sir[s[i]]++;

   maxim = max(maxim, sir[s[i]]);

  }

 }

}

for (int i = int('a'); i <= (int) 'z'; ++i)

{

 if (sir[i] == maxim)

 {

  cout << (char) i << endl;

  break;

 }

}

return 0;

}

Acelasi cod, mai eficient si mai curat:

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

const int LETTERS = 26;

int apparitions[LETTERS] = {0};

int maxApparitions = 0, numRepetitions;

cout << "Introdu numarul de linii pe care vrei sa le citesti: ";

cin >> numRepetitions >> std::ws;

for (int repetition = 0; repetition < numRepetitions; ++repetition)

{

 char line[256];

 cin.getline(line, sizeof(line));

 int n = strlen(line);

 for (int chrIndex = 0; chrIndex < n; ++chrIndex)

 {

  if (line[chrIndex] >= 'a' && line[chrIndex] <= 'z')

  {

   ++apparitions[line[chrIndex] - 97];  // Alphabet position of character, starting from 'a' = 0.

  }

 }

}

for (int apparition : apparitions)

 maxApparitions = max(apparition, maxApparitions);

for (int letterIndex = 0; letterIndex < LETTERS; ++letterIndex)

{

 int alphabetPosition = letterIndex + 97;  // Alphabet position of character, starting from 'a' = 0.

 if (apparitions[letterIndex] == maxApparitions)

 {

  cout << (char) (alphabetPosition) << endl;

  break;

 }

}

return 0;

}


LokoPoco: Buna, nu mi se da un numar de linii anume, problema spune ca se citeste pe mai multe linii, multumesc pt sfaturi.
Alte întrebări interesante