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

Suma ilości samogłosek "a","e","o" w tekście

Object Storage Arubacloud
0 głosów
10,997 wizyt
pytanie zadane 9 kwietnia 2018 w C i C++ przez Duke_Astaroth Nowicjusz (240 p.)

Witam, mam problem dotyczący zadania c., mianowicie niezbyt rozumiem jak mam policzyć sumę ilości samogłosek w tekście wpisanym przez użytkownika. Starałem się to zrobić w następujący sposób:

#include <iostream>
#include <string>

using namespace std;

int obliczKlucz(string tekst, int k){
	if(tekst.find("a",0)!=string::npos)
		k++;
	if(tekst.find("o",0)!=string::npos)
		k++;
	if(tekst.find("e",0)!=string::npos)
		k++;
	}
	return k;
}


int main(){
	int klucz=0;
	string tekst;
	cout<<"Podaj tekst:"<<endl;
	getline(cin, tekst);
	cout<<obliczKlucz(tekst, klucz);
	return 0;
}

Proszę o pomoc i z góry dziękuję!

komentarz 9 kwietnia 2018 przez event15 Szeryf (93,790 p.)
Heh, może offtop, ale czytając treść zadań przypominają mi się czasy z mojego technikum w Świdwinie - zastanawiam się, czy przypadkiem nie jesteś z tego TI :P
komentarz 9 kwietnia 2018 przez Duke_Astaroth Nowicjusz (240 p.)
Niestety nie, uczęszczam do LO w zupełnie innej części Polski :P

4 odpowiedzi

+1 głos
odpowiedź 9 kwietnia 2018 przez Bondrusiek Maniak (61,370 p.)
wybrane 9 kwietnia 2018 przez Duke_Astaroth
 
Najlepsza

Cześć,

Twój program z tego co widzę potrafi tylko sprawdzić czy w stringu jest wyraz np. dla "abrakadabra" int k zostanie zwiększony tylko raz mimo że 'a' występuje 5 razy. Proponuje użyć funkcji std::count

#include <algorithm>
/*
 * 
 * 
 */

int obliczKlucz(std::string s)
{
size_t a = std::count(s.begin(), s.end(), 'a');
size_t e = std::count(s.begin(), s.end(), 'e');
size_t o = std::count(s.begin(), s.end(), 'o');

return (a+e+o);
}

http://en.cppreference.com/w/cpp/algorithm/count

komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

W Twoim rozwiązaniu trzeba jeszcze dodać zamianę na małe litery, w przeciwnym razie będą już problemy z liczeniem samogłosek w zdaniu: "Ala ma kota.".

Poniżej uzupełniony kod.

/******************* Liczenie samogłosek w tekscie (by Bondrusek) ************************/
#include <algorithm>
#include <iostream>
using namespace std;

int obliczKlucz(string tekst, int k)
{
    transform(tekst.begin(), tekst.end(), tekst.begin(), ::tolower);   //zamiana na małe litery
    size_t a = count(tekst.begin(), tekst.end(), 'a');
    size_t e = count(tekst.begin(), tekst.end(), 'e');
    size_t o = count(tekst.begin(), tekst.end(), 'o');

return (a+e+o);
}

int main(){
    int klucz = 0;
    string tekst;
    cout<<"Podaj tekst:"<<endl;
    getline(cin, tekst);
    cout << "\nLiczba samoglosek wynosi: " << obliczKlucz(tekst, klucz) << endl;
    return 0;
}

Autor ma teraz do wyboru trzy różne wersje rozwiązania zadania.

komentarz 9 kwietnia 2018 przez Bondrusiek Maniak (61,370 p.)
Tak, dobrze mówisz musi jeszcze zamienić string na małe litery. Można to zrobić przed przysłaniem do funkcji lub bezpośrednio w niej. Ewentualnie może wprowadzić dodatkowe zmienne size_t A,E,O;
+1 głos
odpowiedź 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
edycja 9 kwietnia 2018 przez mokrowski

Policz to z pomocą std::count_if(...) z <algorithm>. 

Nieco nowocześniej napisane..:

#include <string>
#include <cctype>
#include <algorithm>
#include <iostream>
// C++14
using namespace std;
using namespace std::string_literals;
 
auto policzSamogloski(const string& tekst)
{
    const auto samogloski = "aeiou"s;
    return count_if(tekst.cbegin(), tekst.cend(),
        [&samogloski](const int c) {
            return samogloski.find(static_cast<char>(::tolower(c))) != string::npos;
    });
}
  
int main(){
    string tekst;
    cout << "Podaj tekst: ";
    getline(std::cin, tekst);
    cout << "Liczba samoglosek wynosi: "
        << policzSamogloski(tekst) << '\n';
}

I dla nieco starszych kompilatorów:

#include <string>
#include <cctype>
#include <cstddef>
#include <algorithm>
#include <iostream>
// C++03
using namespace std;

bool czySamogloska(const char c) {
    const string samogloski = "aeiou";
    return samogloski.find(static_cast<char>(::tolower(c))) != string::npos;
}

size_t policzSamogloski(const string& tekst)
{
    return static_cast<size_t>(count_if(tekst.begin(), tekst.end(), czySamogloska));
}
 
int main(){
    string tekst;
    cout << "Podaj tekst: ";
    getline(std::cin, tekst);
    cout << "Liczba samoglosek wynosi: "
        << policzSamogloski(tekst) << '\n';
}

 

komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Nie trzeba nagłówka <string> ani "string literals".
komentarz 9 kwietnia 2018 przez monika90 Pasjonat (22,940 p.)
Bez #include <string> nie ma typu string.
komentarz 9 kwietnia 2018 przez monika90 Pasjonat (22,940 p.)

::tolower(c)

#include <cctype>

std::tolower(static_cast<unsigned char>(c))

albo od razu zadeklarować c jako unsigned char

komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)

@monika90, fixed. A nawet wyszło jeszcze śmieszniej bo w innych miejscach g++ zgłaszał ostrzeżenie konwersji.

BTW.. jest jakiś niezawodny sposób/zestaw przełączników żeby takie przeoczenia jak <cctype> (czyli w jednym kompilatorze jest ale w innym może nie być) wyłapać? Tylko testowanie na X kompilatorów?

komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)

@Beginer, trzeba trzeba. A na brak std::string_literals sam się natknąłem przy którymś "przejściowym" kompilatorze.

komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
U mnie (na C::B) wszystko działało poprawnie (bez nagłówków).
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
1. C::B to IDE. Istotne jest jaki kompilator obsługuje kompilację a nie jakim edytorem tworzysz kod.

2. Na "twoim C::B" świat się nie kończy. Poprawny kod to taki który kompiluje się i pod Visual Studio i pod gcc/clang pod GNU/Linux, *BSD, OSX i pod innymi systemami...

Brak nagłówka <string> to brak typu std::string. To czy dany kompilator "wciąga przy okazji innego nagłówka także <string>", nie ma znaczenia.
komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Ad.1  Przecież doskonałe wiesz, jakiego kompilatora używa fabrycznie C::B. Tym bardziej, że niedawno była o tym szczegółowo mowa, kiedy uzgadnialiśmy standardy. Gdybym używał innego kompilatora, na pewno bym o tym wspomniał.

Ad.2  Do tej pory nie przejmowałeś się faktem, że "świat się nie kończy" na twoich kodach, kompilatorach i standardach. Nie przejmowałeś się losem ludzi, którzy nie mogli ich uruchomić.

Ad.3  Jeśli czas pozwoli, sprawdzę na innych kompilatorach.

Jeśli przyjmujemy, że kod ma być krótki i przejrzysty  -  to tniemy aż do bólu!  Ty usuwasz z main() return 0;  plik.close(); itp., ja wyciąłem nagłówki.
komentarz 9 kwietnia 2018 przez monika90 Pasjonat (22,940 p.)
Bez koniecznych nagłówków kod nie jest ani krótki ani przejrzysty, jest po prostu błędny.
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
edycja 9 kwietnia 2018 przez mokrowski

Ad.1  Przecież doskonałe wiesz, jakiego kompilatora używa fabrycznie C::B. Tym bardziej, że niedawno była o tym szczegółowo mowa, kiedy uzgadnialiśmy standardy. Gdybym używał innego kompilatora, na pewno bym o tym wspomniał.

Bzdura... Nie ma czegoś takiego jak "fabrycznie używany przez C::B kompilator... a reszty się doucz... 

PS. Idę płakać nad "losem ludzi" którzy nie mogą uruchomić czegoś w fabrycznych kompilatorach C::B.

EOT.

komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)

@monika90, przypomnę się z pytaniem.. Jakiś niezawodny sposób na wyłapywanie pominięć/niejawnie włączanych nagłówków? Tj. uniezależnienie się od zestawu testowanych kompilatorów i środowisk. Przełącznik ostrzeżeń? Lint? Inne... 

komentarz 9 kwietnia 2018 przez monika90 Pasjonat (22,940 p.)
Niestety, żadne sposoby nie są mi znane. GCC 8 może zasugerować dołączenie standardowego nagłówka, ale tylko wtedy gdy jego brak powoduje błąd kompilacji, więc to nie to.
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
Szukałem, Lakos w swojej książce umieścił trochę narzędzi ale stare. Z nowszych https://include-what-you-use.org/

W repozytoriach pakietów dla dystrybucji GNU/Linux jest iwyu. Wymaga backendu clang. Wyniki obiecujące.
komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

@mokrowski,

1.  Uczę się ustawicznie.

2.  C::B jest zwyczajowo wyposażony w kompilator MinGW (znajduje się we wspólnym pakiecie), jest to powszechnie znana wiedza.

3.  Kod (bez nagłówków "string") sprawdzałem na kilku kompilatorach sieciowych, m.in.C++ Shell. Kompiluje się bez problemów, działa prawidłowo. (Tak samo było w MinGW).

P.S. Na forum nikogo nie pouczamy - najwyżej służymy pomocą.

komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)

@Beginer, rób jak chcesz i sądź co chcesz. Jeśli będziesz w błędzie, możesz liczyć na komentarz. Szczególnie jeśli błędne przekonania będziesz rozpowszechniał jako dobre praktyki.

Do poczytania.. 

https://stackoverflow.com/questions/15420891/header-files-and-include-best-practice?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

https://softwareengineering.stackexchange.com/questions/262019/is-it-good-practice-to-rely-on-headers-being-included-transitively

http://umich.edu/~eecs381/handouts/CppHeaderFileGuidelines.pdf

A to tylko czubek góry lodowej ... 

komentarz 10 kwietnia 2018 przez monika90 Pasjonat (22,940 p.)
C++ Core Guidelines reguła SF.10
0 głosów
odpowiedź 9 kwietnia 2018 przez niezalogowany
edycja 9 kwietnia 2018
Jeżeli musisz użyć do tego funkcji wyszukującej to możesz usuwać ciąg do momentu znalezienie pierwszej litery. Jeżeli nie wystarczy pętla for.
2
komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Proszę, popraw ortografię bo kłuje w oczy.
–1 głos
odpowiedź 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

Dobrze rozwiązałeś zadanie. Dodałem tylko zamianę tekstu na małe litery. Kod poniżej.

#include <algorithm>
#include <iostream>
using namespace std;

int obliczKlucz(string tekst, int k)
{
   transform(tekst.begin(), tekst.end(), tekst.begin(), ::tolower);   //zamiana na małe litery
   for (int i = 0; i < tekst.size(); ++i)
   if (tekst[i] == 'a' || tekst[i] == 'o' || tekst[i] == 'e') k++;
   return k;
}

int main(){
    int klucz = 0;
    string tekst;
    cout<<"Podaj tekst:"<<endl;
    getline(cin, tekst);
    cout << "\nLiczba samoglosek wynosi: " << obliczKlucz(tekst, klucz) << endl;
    return 0;
}

 

komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
Popraw błędy...
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,640 p.)
1. Jest nieco więcej samogłosek.

2. Licznik nie powinien być typem signed tylko unsigned.

3. Nie przekazuj std::string przez kopię.

4. Iteratory powinny być stałe.

5. Brakuje nagłówka obsługującego std::string i to bez względu na fabryczny kompilator C::B

Nie groź ludziom bo mogą Cię potraktować poważnie.
komentarz 9 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Mówiłem tylko, że odpowiem wieczorem (żebyś był w domu), co uczyniłem.

Podobne pytania

0 głosów
2 odpowiedzi 2,608 wizyt
pytanie zadane 30 kwietnia 2020 w Python przez grzybek_4 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 266 wizyt

92,620 zapytań

141,473 odpowiedzi

319,813 komentarzy

62,003 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!

...