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

String-ilosc wyrazów w zdaniu.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,385 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez adamus Użytkownik (860 p.)

Program liczy mi ilosc wyrazow lecz jesli uzyje wieksza ilosc bialych znakow typu spacja to niestety program kazda spacje liczy jako wyraz. Jak tego uniknac?

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int x=1,dlugosc,i;
    string tekst;
    cout<<"Wprowadz tekst:"<<endl;
    getline(cin,tekst);
    dlugosc=tekst.length();
    if (dlugosc>0)
	{
    for(i=0;i<dlugosc;i++)
    {
        if (tekst[i]==' ')
        x++;
    }
    }
    else
		 x=0;
    cout<<"Ilosc wyrazow wynosi: "<<x;
    return 0;
}

 

2 odpowiedzi

0 głosów
odpowiedź 7 czerwca 2018 przez niezalogowany

Licz spacje po których bezpośrednio znajduje się znak. 

If(text[i] == ' ' && text[i+1] != ' ') {
Licznik++
}

Tylko po takim stringu iteruj do text.length()-2 

komentarz 7 czerwca 2018 przez adamus Użytkownik (860 p.)
if (dlugosc>0)
	{
    for(i=0;i<dlugosc-2;i++)
    {
        if(tekst[i]==' '&&tekst[i+1]!=' ')
        {
        	x++;
		}
        
        
    }
    }
    else
		 x=0;

Zgadzam sie z tym forem lecz nie zadziala on w jednym przypadku a mianowicie gdy przed wyrazem damy spacje tez na to wczesniej wpadlen lecz wlasnie nie dzialalo bo pierwsza spacja liczy sie jako wyraz.. :(

0 głosów
odpowiedź 7 czerwca 2018 przez mokrowski Mędrzec (158,660 p.)

No bo niepotrzebnie te znaki liczysz. Oczywiście zakładam(y) że słowo może zawierać także znak przestankowy.

"Szkolne rozwiązanie" jest stosunkowo proste:

1. Wczytaj linię.

2. Zapisz ją do obiektu std::stringstream

3. Sukcesywnie wczytuj z std::stringstream słowa zliczając je.

Jak się to połączy już z algorytmami, to będzie proste:

#include <iostream>
#include <iterator>
#include <sstream>
#include <string>

int main() {
    using ciIter = std::istream_iterator<std::string>;

    std::cout << "Wprowadź tekst:\n";
    std::string line;
    std::getline(std::cin, line);
    std::stringstream swords(line);
    auto word_count = std::distance(cIter(swords), cIter());
    std::cout << "Ilość wyrazów wynosi: " << word_count << '\n';
}

 

komentarz 7 czerwca 2018 przez adamus Użytkownik (860 p.)
A czy mógłbys napisac własnie ten jeden warunek w prostszy sposób? Bo nie miałem jeszcze tego co napisales wyzej :/ najprostszym ifem bo nie moge nic do tego wykombinowac aby ta pierwsza spacja nie byla liczona...

Dzięki!
komentarz 7 czerwca 2018 przez mokrowski Mędrzec (158,660 p.)
#include <iostream>
#include <sstream>
#include <string>
#include <cstddef>

int main() {
    std::cout << "Wprowadź tekst:\n";
    std::string line;
    std::getline(std::cin, line);
    std::stringstream swords(line);
    std::size_t word_count = 0;
    while(swords >> line) {
        ++word_count;
    }
    std::cout << "Ilość wyrazów wynosi: " << word_count << '\n';
}

Pewnym wskaźnikiem opanowania języka C++, jest ilość "surowych pętli i if'ów w kodzie". Po zapoznaniu się z biblioteką standardową ta ilość dąży do zera :)

komentarz 7 czerwca 2018 przez adamus Użytkownik (860 p.)
for(i=0;i<dlugosc-2;i++)
    {
        if(tekst[i]==' '&&tekst[i+1]!=' ')
        {
        	x++;
		}
		if(tekst[0]==' ')
		{
			x++;
		}
Spobowałem czegos takiego ale niestety nadal nie wychodzi...

 

komentarz 7 czerwca 2018 przez mokrowski Mędrzec (158,660 p.)
Dostałeś rozwiązanie na tacy. Brniesz w algorytm który wyprodukuje skomplikowany i błędo-genny kod. Wczytaj dane do std::stringstream. To nie jest C gdzie masz "zliczać znaczki".

Po co chcesz tak jak to próbujesz robić? Kazano Ci?
komentarz 7 czerwca 2018 przez adamus Użytkownik (860 p.)
No kazano musze to zrobic na zajecie dodatkowe i wszystko ok tylko chodzi o to glupia spacje przed zdaniem.....

A nie moge tego zrobic w taki sposob jak ty poniewaz sciagne to w 100%...

Podobne pytania

0 głosów
1 odpowiedź 1,206 wizyt
pytanie zadane 28 lutego 2018 w C i C++ przez janusz1 Początkujący (330 p.)
0 głosów
0 odpowiedzi 218 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez MrRed Nowicjusz (160 p.)
0 głosów
1 odpowiedź 639 wizyt
pytanie zadane 28 lutego 2018 w C i C++ przez janusz1 Początkujący (330 p.)

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,799 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

...