• 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.

Object Storage Arubacloud
0 głosów
1,127 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 (155,460 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 (155,460 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 (155,460 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ź 801 wizyt
pytanie zadane 28 lutego 2018 w C i C++ przez janusz1 Początkujący (330 p.)
0 głosów
0 odpowiedzi 150 wizyt
pytanie zadane 7 czerwca 2018 w C i C++ przez MrRed Nowicjusz (160 p.)
0 głosów
1 odpowiedź 455 wizyt
pytanie zadane 28 lutego 2018 w C i C++ przez janusz1 Początkujący (330 p.)

92,583 zapytań

141,434 odpowiedzi

319,668 komentarzy

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

...