Sortowanie liter

0

Witam, mam do napisania program, który pobiera od użytkownika napis, zlicza ilość wystąpień każdej litery i wypisuję tą, która wystąpiła największą ilość razy.
Program sortuje litery podanego napisu, a potem zlicza, która litera wystąpiła ile razy, ale nie wiem jak wypisać literkę, która wystąpiła najwięcej razy.
Proszę o wskazówki

 			char napis[20];
cout<<"podaj napis ";
cin.getline(napis, 20);

for(int j=0; j<strlen(napis)-1; j++)

{
    for(int i=1; i<strlen(napis); i++)

    {
        int zamiennik_2;
        if(napis[i]<napis[i-1])
        {
            zamiennik_2=napis[i];
            napis[i]=napis[i-1];
            napis[i-1]=zamiennik_2;
        }
    }
}
cout<<napis<<endl;
int krotnosc[20];
for (int i=0; i<=strlen(napis); i++)
{
    int licznik_6=1, j=0;

    if (napis[i]==napis[i+1])
        licznik_6++;
    else if(napis[i]<napis[i+1])
    {
        krotnosc[j]=licznik_6;
        licznik_6=1;
        j++;
    }
}

2

Tak najprościej dla Ciebie będzie tak jak piszę poniżej, kod będzie prosty do zrozumienia.

int tab[26]

I sprawdzaj litery po kolei, jak trafisz na

'a'

to

++tab[0]

i tak dalej...
Dodam jeszcze, że w tablicy ASCII małe a jest równe 97, jeżeli string ma zawierać małe i duże litery to A jest równe 65

0
#include <iostream>
#include <string>
#include <cctype>
#include <algorithm>
#include <iterator>
#include <array>
using namespace std;

int main() {
	string line, cleared_line;
	getline(cin, line);
	copy_if(begin(line), end(line), back_inserter(cleared_line), [](auto c){ return isalpha(c); });
	array<size_t, 'z'-'a'> occurs{{}};
	for(auto c : cleared_line){
		c = tolower(c);
		occurs[c-'a'] += 1;
	}
	
	auto max = max_element(begin(occurs), end(occurs));
	cout << (char)(distance(begin(occurs), max)+'a') << ": " << *max << endl;
	return 0;
}

http://ideone.com/smklIp

2

To czego potrzebujesz, to tablicy która będzie zapamiętywać ile razy dana literka wystąpiła. Dla napisu

"cccaaaabb"

chcesz by końcowa wartość tej tablicy wyglądała tak

occurrences['a'] == 4
occurrences['b'] == 2
occurrences['c'] == 3

Jednak chwilowo nie chcemy się bawić tablicą o dziwnych indeksach, to zrobimy proste mapowanie

occurrences[0] == 4
occurrences[1] == 2
occurrences[2] == 3

Mapowanie jest zrobione tak, że literka
'a' dostanie indeks 'a' - 'a' (czyli 0)
'b' dostanie indeks 'b' - 'a' (czyli 1)
'c' dostanie indeks 'c' - 'a' (czyli 2)
itd.

Cały kod wtedy jest banalny

int occurrences[26] = {};
int len = strlen(str);  // swoja droga uzywaj std::string to nie bedziesz tego potrzebowal
for (int i = 0; i < len; ++i)
    ++occurrences[str[i]-'a'];

int max = 0;
char mostPopular;
for (int i = 0; i < len; ++i)
{
    if (occurrences[i] > max)
    {
        max = occurences[i];
        mostPopular = 'a' + i;
    }
}

cout << "Litera " << mostPopular << " wystapila " << max << " razy" << endl;
0

Dlaczego dyskryminujecie polskie litery? Żeby kod był prosty?

0

Mam coś takiego:

int main()
{
    char napis[20];
    cout<<"podaj napis ";
    cin.getline(napis, 20);
    int zdarzenia[26]= {};
    int dlugosc=strlen(napis);
    for (int i=0; i<dlugosc; ++i)
        ++zdarzenia[napis[i]-'a'];

    int max=0;
    char naj;
    for (int i=0; i<dlugosc; ++i)
    {
        if (zdarzenia[i]>max)
        {
            max=zdarzenia[i];
            naj='a'+i;
        }
    }
    cout<<"Litera "<<naj<<" wystapila "<<max <<" razy"<<endl; 
1

Jest bug, powinno być

char mostPopular;
for (int i = 0; i < 26; ++i)
{

1 użytkowników online, w tym zalogowanych: 0, gości: 1