• 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,976 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,460 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 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,460 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,460 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,460 p.)
Popraw błędy...
komentarz 9 kwietnia 2018 przez mokrowski Mędrzec (155,460 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,580 wizyt
pytanie zadane 30 kwietnia 2020 w Python przez grzybek_4 Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 263 wizyt

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

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

...