[C++]Wypisanie litery o największej liczbie powtórzeń

1608
Użytkownik
Użytkownik
Posty: 245
Rejestracja: 9 wrz 2010, o 21:36
Płeć: Mężczyzna
Lokalizacja: Krakow
Podziękował: 133 razy
Pomógł: 1 raz

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: 1608 »

Witam. Program ma na zadanie wyświetlić literę którą najczęściej się powtarza w wyrazie podanym przez użytkownika. Operujemy tylko na malych literach.

Kod: Zaznacz cały

#include <iostream>
int bubble_sort(char *t, int s);
int main()
{
	char t[255];
	std::cout << "Podaj Wyraz ";
	std::cin >> t;
	int dlugosc = 0;
	//dlugosc wyrazu
	for(int i = 0; i <255;i++)
	{
	if(t[i]=='\0'){break;}
	dlugosc++;
	}
	std::cout << "Dlugosc rowna: "<< dlugosc;
	//sortujemy
	bubble_sort(t,dlugosc);
	std::cout << std::endl;
	for(int i =0;i<dlugosc;i++)
	{
		std::cout << t[i];
	}
	//koniec sortowania
	for(int i =0;i<dlugosc;i++)
	{
			
		
	}
	
	return 0;
}
int bubble_sort(char *t, int s){
    
    for (int i = 1; i < (s-1); i++){
        for (int j = (s-1); j >= i; j--){
            if (t[j] < t[j-1]){
                int tmp = t[j];
                t[j] = t[j-1];
                t[j-1] = tmp;
            }
        }
    }
    
    return 0;
}
Posortowałem tablicę tutaj. I teraz za bardzo nie mam pomysłu jak wyciągnąc tą najczęściej powtarzającą się literę. Bardzo proszę o jakieś wskazówki.
Mruczek
Użytkownik
Użytkownik
Posty: 1114
Rejestracja: 26 paź 2008, o 19:43
Płeć: Mężczyzna
Podziękował: 23 razy
Pomógł: 157 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: Mruczek »

A po co to sortować?
Możesz sobie w tablicy, pod kolejnymi indeksami zliczać ilości poszególnych liter. Np. t[0] to a, t[1] to b, itd. Wystarczy jedna pętla for po całym wyrazie.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

Kod: Zaznacz cały

unsigned char literka=t[0]; int histogram[256]={0};  // *
for(int i=0; t[i]; i++ ) 
    if( ++histogram[(unsigned char)t[i]] > histogram[literka] )   // **
        literka=t[i];
cout << "Literka " << literka << " wystąpiła " << histogram[literka] << " razy.
";
* "normalnych" znaków jest 128, praktycznie 256, teoretycznie chyba 65536
** ale kody wcale nie muszą być nieujemne
o czym zapomniało mnie mi się ostatnio i kosztowało mnie to sporo nerwów, program się walił w zagadkowy sposób.
Ale skoro modyfikowało się ujemne indeksy tablicy to mogły dziać się cuda.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: Afish »

ksisquare pisze: * "normalnych" znaków jest 128, praktycznie 256, teoretycznie chyba 65536
Normalnych znaków jest tyle, ile domyślnie ma platforma, na której wykonuje się program. Ponadto standard daje gwarancję, że kody liczbowe tych znaków będą dodatnie.
Praktycznie znaków zazwyczaj jest 126 a char ma 8 bitów.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

Złota rybko, zobacz proszę co "standard" ma do powiedzenia o "znakowości" znaków
a 126 to dziwna liczba, bo:... ile jest "dwucyfrowych liczb", czy odpowiedź 98 jest w jakikolwiek sposób poprawna?

Normalnych znaków jest tyle, ile domyślnie ma platforma, na której wykonuje się program.
czyli można "niedomyślnie"
Ponadto standard daje gwarancję, że kody liczbowe tych znaków będą dodatnie.
Gdzie?
Praktycznie znaków zazwyczaj jest 126 a char ma 8 bitów.
znaczy się, że \(\displaystyle{ 2^8=126}\)
Wiem, czepiam się, bo to w końcu tylko trzy zdania i trzy bzd...
Domyślam się, że w regulaminie gdzieś tam stoi, że "nie wolno" mieć więcej wcieleń niż jedno
Ale, ja lubię to miejsce, i mimo upodobań "ałtomatów" czasem korci mnie by coś "postnąć"
Złota rybko, mam w notatkach parę rzeczy które powiedziałeś, ale uwiera mnie gdy bzdurzysz i się czepiasz.
Ja szanuję twoje zdanie, poproszę o to samo

Pozdrawiam, Xitami.
Ostatnio zmieniony 12 cze 2012, o 19:48 przez ksisquare, łącznie zmieniany 1 raz.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: Afish »

Sam zerknij skarbeńku, bo ja już to zrobiłem kilka razy. Nie zrozumiałeś mojej wypowiedzi, bo w swoim kodzie zaprezentowałeś literkę Ą, a ona nie jest standardowym znakiem ASCII, o którym mógłbyś poczytać (szczególnie o stronach kodowych). Znaków jest 126, a właściwie 127, jeżeli uwzględnimy również znak zerowy. A gdy będziesz już sprawdzał kwestię znakowości znaków, to przy okazji sprawdź w standardzie, czy gdziekolwiek jest określone, że char musi być tożsamy z unsigned char lub signed char, bo i w tej kwestii możesz mieć niespodziankę.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

"Sam zerknij skarbeńku, bo ja już to zrobiłem kilka razy. Nie zrozumiałeś mojej wypowiedzi, bo w swoim kodzie zaprezentowałeś literkę Ą, a ona nie jest standardowym znakiem ASCII," No tak, już nie używamy kart perforowanych, ja je pamiętam, a Ty?
"Znaków jest 126, a właściwie 127" jeden jest liczbą pierwszą, albo nie
I trzecie zdanie, no cóż, mam silny dowód eksperymentalny, link patrz wyżej.
Trzy zdania trzy
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: Afish »

Cóż, czytanie ze zrozumieniem w Twoim przypadku się kłania. Naprawdę poczytaj o ASCII i przestań trolować.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

Zauważ, że o ASCII to ty sam wspomniałeś. A pewnie go nigdy nie widziałeś.

No cóż, dla własnej przyjemności "potroluję" jeszcze
Mimo
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: witekkq »

W czasach obecnych w aplikacjach zazwyczaj stosuję się 8 bitów (odpowiada to jednemu bajtowi) jednak w starszych zastosowaniach można spotkać 5 bitów – głównie w Kodzie Baudot`a obecnie używany głównie w telekomunikacyjnych urządzeniach dla głuchoniemych TDD i w krótkofalarstwie jako RTTY. Przesył 6 bitów jest rzadziej spotykany, natomiast przesył 7 bitowy związany jest z prawdziwym (nie rozszerzonym o dodatkowe bity) kodem ASCII (ang. American Standard Code for Information Interchange). 8 bitów również odnosi się do kodu ASCII jednak w tym przypadku już 8 bitówego zawierającego 256 kodów poszczególnych znaków.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

jakoś trzebaby wspomnieć o Ebdicc czy jakoś tak,
Android nadaje się tylko do zabaw

-- 12 cze 2012, o 22:35 --

w fortranie wydaje mnie mi się, że obowiazuje "moda" EBC ...",
cóż Fortran niby tylko dla archeologow,
bo tylko "nk " jest na top500, a to jakoś nie w modzie-- 12 cze 2012, o 22:44 --a nie, mamy coś jeszcze
oczywiście programowane w Basicu.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: Afish »

Miło że wyedytowałeś posta po mojej wypowiedzi, niemniej odniosę się do tego troszkę z opóźnieniem:
ksisquare pisze:
Ponadto standard daje gwarancję, że kody liczbowe tych znaków będą dodatnie.
Gdzie?
Poszukaj.
ksisquare pisze:
Praktycznie znaków zazwyczaj jest 126 a char ma 8 bitów.
znaczy się, że \(\displaystyle{ 2^8=126}\)
Wziąłeś liczbę z niczego (znowu bez zrozumienia). Kolejny raz zalecam poczytać o ASCII.
ksisquare pisze: Złota rybko, mam w notatkach parę rzeczy które powiedziałeś, ale uwiera mnie gdy bzdurzysz i się czepiasz.
Ja szanuję twoje zdanie, poproszę o to samo
Póki co niestety nic nie pokazałeś. Bez tego dalsza dyskusja nie ma raczej sensu.
ksisquare pisze:jakoś trzebaby wspomnieć o Ebdicc czy jakoś tak,
O ile pamiętam sam Cię uświadomiłem o istnieniu czegokolwiek poza ASCII. Teraz widzę, że chyba odrobinkę za szybko.
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

#1 wiesz, popatrzyłem tu i tam, nie patrzyłem w normy bo nie lubię prawniczego języka
znalazłem tylko tyle, że pozostawia się to implementacji, mylę się? (z praktyki tak mi wychodzi)

#2 nie z niczego tylko z Twojego postu

#3 no tak, masz rację

#4 zdaje mnie mi się, że to akurat Ty onego ASCII się go uczepiłeś

kiedy ja żyłem z programowania to za ścianą miałem Odrę, a na biurku Spectrum
(tak kiedyś komputeryzowało się uczelnie) (oboje mieli własne upodobania)
a PC ze swoim ASCII był jeszcze kosztowną ekstrawagancją
zarabiałem jakieś naście tysięcy, a jeden z pierwszych w szkole kosztował naście milionów
(kilu znajomych zbiło fortunę wożąc w bagażniku kontrabandę z zachdniego Berlina)
jakiż byłem zadowolony, gdy wydałem prawie całą wypłatę na pare mega pamięci (chyba 8, mega! nie giga czy terra)
by odkupić swojego pierwszego twardziela od uczelni musiałem poprosić NOT o wycenę, a było to jakieś 10 MB
formatu 5 i ćwierć cala
a jakoś przedwczoraj kupiłem na prezent telefon, w cenie dobrej butelki z którym tamte "komputery" nie mogłyby się mierzyć
łoj, wzięło mi się na wspominki, zupełnie nie na temat
augustyn
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 12 cze 2012, o 13:05
Płeć: Mężczyzna
Lokalizacja: Warszawa-Bemowo

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: augustyn »

Przykładowy (bardzo prosty, wręcz prostacki) kod wyciągający najczęściej występującą literę. Jak wrzucisz go do swojego programu, to zadziala

Kod: Zaznacz cały

 int wystapienia[255];
      for(int i =0;i<dlugosc;i++)
   {
      wystapienia[i]=0;
   }//tablica zliczajaca wystapienia danego znaku
   for(int i =0;i<dlugosc;i++)
   {
        int j=1;
        while(t[i]==t[i+j])
        {
                           wystapienia[i]=wystapienia[i]+1;
                           j++;
        } 
   }//petla ktora zlicza dla kazdego znaku ilosc jego wystapien (po jego miejscu w tablicy)

   int max=0;
   for(int i =0;i<dlugosc;i++)
   {
      if(wystapienia[i]>max)
      {max=wystapienia[i];}
   }// szukamy najwiekszej ilosci wystapien znaku
   for(int i =0;i<dlugosc;i++)
   {
      if(wystapienia[i]==max)
      std::cout<<"Najczesciej wystapil znak "<<t[i]<<" z czestotliwoscia "<<wystapienia[i]+1<<"
";
   }
ksisquare
Użytkownik
Użytkownik
Posty: 132
Rejestracja: 1 cze 2012, o 07:04
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 15 razy

[C++]Wypisanie litery o największej liczbie powtórzeń

Post autor: ksisquare »

augustynie a czy testowałeś swój kod?
a zauważyłeś grzech śmiertelny w 9. wierszu?
Dodałem troszkę z przodka i tył..u by się kompilowało:
ODPOWIEDZ