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

Jak napisać program który wyświetla ile razy każda z liter występuje w tekście ?

Object Storage Arubacloud
0 głosów
32,346 wizyt
pytanie zadane 9 kwietnia 2018 w C i C++ przez dudus2002 Początkujący (300 p.)
Witam, potrzebuję programu, który pobiera z klawiatury tekst i wyświetla informację o tym ile razy każda z liter alfabetu występuje w tym tekście. Jestem początkującym i nie mam pojęcia jak to napisać. Proszę o pomoc !

5 odpowiedzi

+1 głos
odpowiedź 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Dzisiaj, kilka godzin wcześniej był na wokandzie podobny temat. Zobacz:

https://forum.pasja-informatyki.pl/341759/suma-ilosci-samoglosek-a-e-o-w-tekscie
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
A w jaki sposób on jest podobny? Tam było kilka liter a tu masz wszystkie. Bardzo dalekie podobieństwo.
komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Sam już sobie odpowiedziałeś - różnica jest tylko w ilości liter.

W jednym i drugim zadaniu chodzi o wyszukiwanie (liczenie) liter z tekstu podanego z klawiatury.

Autor pytania może podejrzeć wiele użytych tam funkcji i algorytmów zwłaszcza, że było ich kilka.
0 głosów
odpowiedź 9 kwietnia 2018 przez chucksqll Stary wyjadacz (12,930 p.)

Zakładając, że jest to łaciński alfabet i w tekście są same duże litery to coś w ten deseń np.

#include <iostream>
using namespace std;
const int ROZMIAR_ALFABETU=...;
int main()
{
string Alfabet="ABCD...XYZ";
int ilosc_wystapien[ROZMIAR_ALFABETU];
strint Tekst;
while(getline(cin, Tekst)
{
 for(int i=0;i<Tekst.size();i++)
 {
  for(int j=0;i<ROZMIAR_ALFABETU;j++)
   { 
    if(...)//jeśli Tekst[i] jest równy Alfabet[j] to dodajesz 1 do ilosc_wystapien[j]
   }
 }
}
for(int i=0;i<ROZMIAR_ALFABETU;i++)
{
cout<<"Ilosc wystapien litery:"<<Alfabet[i]<<" "<<ilosc_wystapien[i]<<endl;
}

return 0;
}

To tak na szybko, w miejsce wielokropek zastosuj się do logiki oraz moich podpowiedzi.

Jeśli chcesz poszerzyć do zliczania małych i dużych liter odróżniając jedne od drugich, to możesz utworzyć tablicę dwuwymiarową przechowująca liczbę wystąpień, albo po prostu dołożyć kolejna tablicę lub powiększyć jej rozmiar dwukrotnie, analogicznie do tablicy przechowującej litery alfabetu.

0 głosów
odpowiedź 9 kwietnia 2018 przez Snejki Stary wyjadacz (14,520 p.)

To rozwiązanie nie uwzględnia polskich znaków językowych jak coś. 

 

Najpierw tworzysz tablicę int, która będzie reprezentować ilość wystąpień liter w ciągu znaków i zerujesz jej wszystkie elementy.

Następnie pobierasz ten ciąg znaków i przypisujesz ją do zmiennej string(w moim przypadku s)

Teraz pętla for, która przechodzi po kolei po kązdym elemencie w s:

	for(int i = 0; i < s.length(); i++) // s to nasz tekst
	{
		if(s[i] > 96 && s[i] < 123) // sprawdza, czy litera jest mała
		tab[s[i] - 97]++; // inkrementacja komórki tabeli odpowiadająca danej literce
	}

W kodzie podanym zauważysz pewne cyferki, odpowiadają one symbolom ASCII, 97 odpowiada literce "a" a 122  to "z".

Podobną instrukcję if musisz napisać dla dużych literek(patrz tablica ASCII)

Teraz już tylko wypisanie elementów tablicy :D

 

Oczywiście możesz w tej pętli for sprawdzać literki if''ami ale komu by się chciało :P

 

 

0 głosów
odpowiedź 9 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Mapa to struktura w której możesz dostać się do danych podając ich klucz. Mapa domyślnie samodzielnie się sortuje co jest zbędne w Twoim przypadku (chyba że nie napisałeś że tego potrzebujesz). Od standardu C++11 (2011) rok, masz dostępną strukturę unordered_map czyli mapa która się nie sortuje. Wystarczy więc użyć jej.

Czytasz każdy znak z tekstu i pod kluczem którym jest ten znak, zwiększasz zmienną o 1. Na końcu wyświetlasz klucze i licznik z nimi związany. Z łatwością zmienisz klucze na znaki obsługujące inne alfabety.

Oczywiście możesz to zrobić tablicą. Poprawne wykonanie tego kodu to jednak nieco trudniejsze zadanie. Łatwo o wyciek pamięci i złą obsługę danych.
0 głosów
odpowiedź 10 kwietnia 2018 przez dudus2002 Początkujący (300 p.)
edycja 10 kwietnia 2018 przez dudus2002

A czy to jest w miarę dobrze napisane ?

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;


    int c;
    char m = 'a';
    char d = 'A';
    string s;

int main(){
   
    
    cout<<"Podaj tekst:"<<endl;
    getline(cin, s);
    cout<<endl;
    
    
    
        
    for (int i = 0; i < 26; i++)
    {
    
        c = count(s.begin(), s.end(), d);
    
    
        if(!c==0)
        {
            cout<<d<<" "<<c<<endl;
        }

     d++;
    
    }
    

    
    for (int i = 0; i < 26; i++)
    {
    
        c = count(s.begin(), s.end(), m);
    
    
        if(!c==0)
        {
            cout<<m<<" "<<c<<endl;
        }

     m++;
    
    }
    
    return 0;
}

Niby działa ;)

1
komentarz 10 kwietnia 2018 przez niezalogowany

Niby działa, ale można skrócić:

#include <iostream>
#include <string>
#include <algorithm>

int main() 
{
	using namespace std;
	string s;
	cout << "Podaj tekst:" << endl;
	getline(cin, s);

	for (char i = 'a'; i <= 'z'; i++)
	{
		int c = count(s.begin(), s.end(), i);
		if (c != 0)
		{
			cout << i << " " << c << endl;
		}
	}
}

Natomiast rozwiązanie jest nieoptymalne. Pętlą 26 razy musisz sprawdzić po kolei każdą literę w stringu (to robi count). To mało optymalne. Gdybyś potrzebował znać ilość tylko jednej litery byłoby ok. Lepiej zmapować sobie od razu wszystkie wartości 

a) zwykłą tablicą korzystając z tablicy ASCII

#include <iostream>
#include <string>
#include <cctype>

int main()
{
	using namespace std;
	string s;
	cout << "Podaj tekst:" << endl;
	getline(cin, s);

	const int array_size = 'z' - 'a' + 1; // 26
	int array[array_size]{};

	for (int i = 0; i < s.size(); ++i)
	{
		if (isalpha(s[i])) // czy jest a-z 
		{
			array[tolower(s[i]) - 'a']++; // zamiana na mala litere za pomoca std::tolower z cctype
		}
	}

	for (int i = 0; i < array_size; ++i)
	{
		if (array[i] != 0)
		{
			cout << char(i + 'a') << ": " << array[i] << "\n";
		}
	}
}

b) mapą (lepiej)

#include <iostream>
#include <string>
#include <cctype>
#include <unordered_map>

int main() 
{
	std::string line;
	std::cout << "Podaj tekst:" << std::endl;
	std::getline(std::cin, line);

	std::unordered_map<char, unsigned> map;
	for (size_t i = 0; i < line.size(); ++i)
	{
		if (std::isalpha(line[i]))
		{
			map[std::tolower(line[i])]++;
		}
	}

	for (auto& p : map)
	{
		std::cout << p.first << ": " << p.second << "\n";
	}
}

 

Podobne pytania

0 głosów
2 odpowiedzi 721 wizyt
0 głosów
1 odpowiedź 3,560 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez Białozór Użytkownik (750 p.)
0 głosów
1 odpowiedź 230 wizyt
pytanie zadane 11 grudnia 2022 w SQL, bazy danych przez dave91 Początkujący (480 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 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!

...