• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++, zliczanie literek

Object Storage Arubacloud
0 głosów
979 wizyt
pytanie zadane 23 września 2018 w C i C++ przez adamus Użytkownik (860 p.)

Witam wszytsko działa ok ale nie moge wpasc jak zrobic jeszcze duze litery, myslalem nad tym zeby stworzyc for'a gdzie bede jechal po calej dlugosci i dodac warunek na duze liczby taki sam jak poniższy.

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
	int i,tab[26]={0},dlugosc;
	string zdanie;
	cout << "Napisz zdanie "<<endl;
	getline(cin,zdanie);
	dlugosc=zdanie.length();
	for(i=0;i<26;i++)
		{
			tab[zdanie[i]-'a']++;
		}
	for(i=0;i<26;i++)
		{
			if(tab[i]!=0)
			cout << char(i+'a')<< " wystapilo " << tab[i]<<endl;
		}	
	getch();
	return 0;
}

Jak to ugryźć?

2 odpowiedzi

0 głosów
odpowiedź 23 września 2018 przez Kacper Sas Dyskutant (8,460 p.)
edycja 23 września 2018 przez Kacper Sas
 
Najlepsza

Proponuję stworzyć tablicę dwuwymiarową. Literę sprawdź funkcją isupper(), jeśli jest wielka to odejmij odpowiednią wartość od niej według ascii i inkrementuj odpowiednio tablicę. Jakiś przykład:

int tab[26][2];
getline(cin, napis);

for(int i=0; i<napis.length(); i++) {

    if(napis.at(i) != ' ') {
        if(isupper(napis.at(i))) tab[napis.at(i) - 'A'][1]++;
        else tab[napis.at(i) - 'a'][0]++;
   }
    
}

 

komentarz 23 września 2018 przez adamus Użytkownik (860 p.)
Tez na tym myslałem lecz chciałem bardziej "logicznie" to wymyślic masz jakis pomysl ?
komentarz 23 września 2018 przez mokrowski Mędrzec (155,460 p.)
"Logiczniej" jest zerknąć do <locale> lub <cctypes> i dowiedzieć się do czego służy funkcja std::isalpha(...).

W następnym etapie ew. zainteresować się <algorithm> i dowiedzieć się do czego służy std::cout_if(...).
komentarz 23 września 2018 przez adamus Użytkownik (860 p.)
A mozna by było zrobić tak że bym dodawal odpowiedna liczbe z kodów ascii aby liczylo duże litery ?
komentarz 23 września 2018 przez mokrowski Mędrzec (155,460 p.)
Widzę że nie przeczytałeś lub nie zrozumiałeś dokumentacji. isalpha(...) z <locales>, rozwiązuje szereg pytań typu "czy Ą jest literą i w jakim kodowaniu". Z kolei isalpha(...) z <cctypes> robi właśnie to co ty chcesz robić ręcznie 2 sekcjami if. Dla detekcji "małych liter ascii" i "dużych liter ascii".
+1 głos
odpowiedź 24 września 2018 przez afferu Mądrala (5,220 p.)
edycja 24 września 2018 przez afferu

Zmodyfikowałem troche mój przykład. Teraz używa funkcji std::isalpha, zaleta jest taka, że wyniki są zapisane w mapie. To jakie znaki zostaną uznane za alfabetyczme zależy od ustawień locale programu. Można usunąć if'a z std::isalpha aby zliczyć wszystkie znaki. Jest jeszcze wiele wad tego przykładu.

Żeby skompilować ten przykład trzeba włączyć obsługę c++11.

#include <iostream>
#include <string>
#include <stdint.h>
#include <map>

int main()
{
    std::cout << "Write something: \n";

    std::string user_string{};

    //Pobierz całą linię wejścia z terminala
    std::getline(std::cin, user_string);

    //Mapa unikalnych kluczy i wartości. char jest typem znakowym std::string,
    //każdemu unikalnemu kluczowi char w mapie przyporządkowany jest 32bitowy int bez znaku.
    std::map<char, std::uint32_t> letters_map{};

    //Przeiteruj string, zinkrementuj licznik dla każdego wystąpienia klucza
    for(auto str_char : user_string){
        if(isalpha(str_char)){
           letters_map[str_char]++;
        }
    }

    //Wypisz wynik
    std::cout << "User input: " << user_string << '\n';
    for(auto map_pair : letters_map){
        std::cout << '[' << map_pair.first << "]:" << map_pair.second << '\n';
    }

    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 4,161 wizyt
pytanie zadane 28 listopada 2015 w C i C++ przez agre Użytkownik (550 p.)
0 głosów
2 odpowiedzi 505 wizyt
+2 głosów
1 odpowiedź 687 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...