Witamy na forum PC Format Zapraszamy do REJESTRACJI


Użytkownicy przeglądający ten wątek: 1 gości

[c++] Liczenie wyrazów

#1
[c++] Liczenie wyrazów
Potrzebuję napisać prosty program do liczenia wyrazów. Mam coś takiego:

Kod:
#include <iostream>
#include <cctype>
using namespace std;

int main(){

    string s; cin>>s;
    getline (cin, s);
    
    int words=0;
    
    for(int i=0; i<=s.size(); i++){
            if(isalpha(s[i])&&isspace(s[i+1])){
                              words++;
                              }            
            }
            
            cout<<words;            

    system("pause");
    return 0;
  
}

Wszystko wygląda mi tu poprawnie, a jednak nie działa. Dla przykładu kiedy wpiszę:

Cytat:ala ma kota

to wypisuje mi:

Cytat:1

Bardzo proszę o pomoc w postaci podpowiedzi, a nie gotowego kodu. Z góry dzięki za pomocOczko
 System operacyjny: windows_vista Przeglądarka: firefox
#2
RE: [c++] Liczenie wyrazów
Tu masz po pierwsze porządniej napisany kod.
Kod:
#include <iostream>
#include <cctype>
#include <string>
using namespace std;

int main()
{

    string s;
    getline (cin, s);
    
    int words=1;
    
    for(int i=0; i<=s.size(); i++){
            if(isalpha(s[i])&&isspace(s[i+1])) words++;          
    }
            
    cout << words;            

    system("pause");
    return 0;
  
}

Po drugie, nie wiem co to oznacza:
Kod:
if(isalpha(s[i])&&isspace(s[i+1])) words++;
ale sądzę, że program szacuje liczbę słów na podstawie spacji. Głupotą jest więc wymaganie od usera aby przed pierwszym albo za ostatnim wyrazem stawiał spację. Musimy zatem przyjąć, że: int words=1;

BTW: Zauważyłem, ze program olewa wyraz występujący po ciągu liczb, tzn.
"Ala ma 2 koty" da wynik 3 ponieważ program nie widzi słowa "koty"... pomyśl nad tym

Największym problemem Twojego programu było "cin>>s;" Po co to jeśli w następnej linijce jest getline() ? Z tego co pamiętam to cin pozostawia w strumieniu znak nowej linii bądź NULL co w efekcie bez wcześniejszego wyczyszczenia strumienia przy użyciu getline() umieszcza w stringu s tylko znak spacji bądź string ten jest pusty. Wybacz, ale nie jestem pewny, jednakże sens jest zachowany, nigdy nie daje się bezpośrednio getline po cin. W ogóle w tym programie jest to bezsensowne
 System operacyjny: windows_vista Przeglądarka: firefox
#3
RE: [c++] Liczenie wyrazów
Sprawdź może moją wersję
Kod:
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string s;
    int slowa=1;
    getline(cin,s);
    for(int i=0;i<s.length();i++)
        if(s[i]==' '&&s[i]!='\0')
            slowa++;
    cout<<"Ilosc slow w ciagu\n\""<<s<<"\"\nwynosi "<<slowa<<endl;
    return 0;
}
 System operacyjny: windows_xp_2003 Przeglądarka: firefox
#4
RE: [c++] Liczenie wyrazów
Szachista -> Twój kod nie sprawdzi się dla tekstów z większą ilością białych znaków pomiędzy wyrazami.
Dodałbym jeszcze zmienną typu bool "czy poprzedni znak był znakiem białym". Jeśli tak, to pomijamy zliczanie. Samo pojęcie białego znaku poszerzyłbym o tabulator.
Generalnie wszystko zależy od założeń, jaki tekst na wejściu możemy dostać, czy może mieć on błędy (typu spacja pomiędzy wyrazem i przecinkiem) itd, bo wprowadza to dodatkowe warunki, które trzeba uwzględnić.
 System operacyjny: windows_xp_2003 Przeglądarka: opera
#5
RE: [c++] Liczenie wyrazów
Mam jeszcze jeden problem. Kiedy przed tym:

Kod:
string s;
    getline (cin, s);

wczytam jeszcze jakieś inne dane wejściowe, to nie mogę wprowadzić s. Dlaczego? Nie do końca rozumiem tą funkcję i jeżeli ktoś mógłby mi ją jakoś dokładniej omówić, byłbym wdzięcznyOczko
 System operacyjny: windows_vista Przeglądarka: firefox
#6
RE: [c++] Liczenie wyrazów
Kolego autorze - umiecie czytać albo szukać?
Cytat:Z tego co pamiętam to cin pozostawia w strumieniu znak nowej linii bądź NULL co w efekcie bez wcześniejszego wyczyszczenia strumienia przy użyciu getline() umieszcza w stringu s tylko znak spacji bądź string ten jest pusty. Wybacz, ale nie jestem pewny, jednakże sens jest zachowany, nigdy nie daje się bezpośrednio getline po cin. W ogóle w tym programie jest to bezsensowne
Troszkę mało czytelnie wytłumaczone, więc opowiem ci to inaczej:
masz sobie strumień cin, który (ponieważ chce być miły) ignoruje dla ciebie wszystkie białe znaki (czyli spacje, entery, tabulatory itp.) jeśli nie zacząłeś podawać "prawdziwych" danych do strumienia (np. jakieś liczby). Gdy, po rozpoczęciu wpisywania, wciśniesz biały znak - cin dla ciebie zatrzyma wczytywanie, pozostawiając biały znak w strumieniu (trochę źle mówię, tak robi operator >>, nie sam strumień cin, jednak tak chyba łatwiej to zrozumieć). Gdy poprosisz funkcję getline o wczytanie tekstu - ona wie, że ma inne zadanie od
Kod:
cin >>
.
Jej zadaniem jest wczytać linię tekstu, do podanego ogranicznika (ty korzystasz z wartości domyślnej - entera). Getline nie ignoruje żadnych znaków, żadnych liter czy cyfr, żadnych spacji i enterów. Wyobraź sobie teraz taką sytuację:
dokonujesz wczytania operatorem>>
Kod:
string slowo;
cin >> zdanie;
A zaraz po tym
Kod:
string zdanie;
getline( cin, zdanie ) //w domyśle ogranicznik - enter
Rusz teraz głową i podsumuj to, co napisałem - jeśli wpiszesz (przy pierwszym wczytaniu, _ to spacja)
Cytat:kot_
To pół biedy, funkcja getline wczyta też tą spację, problem będzie, gdy napiszesz
Cytat:kot
i wciśniesz enter - wtedy funkcja getline "otrzyma" do wczytania ENTER (jego kod) - a to przecież jej ogranicznik! Nie będzie więc niczego wczytywać, od razu zakończy pracę.

Rozwiązanie? cin.ignore( 1, '\n') przed getline

Kupa pisania, rozwiązanie - proste.
Pozdrawiam.
[Obrazek: 16359.png]
[Obrazek: 15712.jpg]
 System operacyjny: windows_vista Przeglądarka: firefox
#7
RE: [c++] Liczenie wyrazów
(29.12.2008, 19:54)maciek94 napisał(a): Kolego autorze - umiecie czytać albo szukać?
Cytat:Z tego co pamiętam to cin pozostawia w strumieniu znak nowej linii bądź NULL co w efekcie bez wcześniejszego wyczyszczenia strumienia przy użyciu getline() umieszcza w stringu s tylko znak spacji bądź string ten jest pusty. Wybacz, ale nie jestem pewny, jednakże sens jest zachowany, nigdy nie daje się bezpośrednio getline po cin. W ogóle w tym programie jest to bezsensowne
Troszkę mało czytelnie wytłumaczone, więc opowiem ci to inaczej:
masz sobie strumień cin, który (ponieważ chce być miły) ignoruje dla ciebie wszystkie białe znaki (czyli spacje, entery, tabulatory itp.) jeśli nie zacząłeś podawać "prawdziwych" danych do strumienia (np. jakieś liczby). Gdy, po rozpoczęciu wpisywania, wciśniesz biały znak - cin dla ciebie zatrzyma wczytywanie, pozostawiając biały znak w strumieniu (trochę źle mówię, tak robi operator >>, nie sam strumień cin, jednak tak chyba łatwiej to zrozumieć). Gdy poprosisz funkcję getline o wczytanie tekstu - ona wie, że ma inne zadanie od
Kod:
cin >>
.
Jej zadaniem jest wczytać linię tekstu, do podanego ogranicznika (ty korzystasz z wartości domyślnej - entera). Getline nie ignoruje żadnych znaków, żadnych liter czy cyfr, żadnych spacji i enterów. Wyobraź sobie teraz taką sytuację:
dokonujesz wczytania operatorem>>
Kod:
string slowo;
cin >> zdanie;
A zaraz po tym
Kod:
string zdanie;
getline( cin, zdanie ) //w domyśle ogranicznik - enter
Rusz teraz głową i podsumuj to, co napisałem - jeśli wpiszesz (przy pierwszym wczytaniu, _ to spacja)
Cytat:kot_
To pół biedy, funkcja getline wczyta też tą spację, problem będzie, gdy napiszesz
Cytat:kot
i wciśniesz enter - wtedy funkcja getline "otrzyma" do wczytania ENTER (jego kod) - a to przecież jej ogranicznik! Nie będzie więc niczego wczytywać, od razu zakończy pracę.

Rozwiązanie? cin.ignore( 1, '\n') przed getline

Kupa pisania, rozwiązanie - proste.

O to mi chodziło Wesoły Ale nie miałem czasu zweryfikować swojej wiedzy z książką, więc napisałem co wiedziałem.
 System operacyjny: windows_vista Przeglądarka: firefox
#8
RE: [c++] Liczenie wyrazów
Cytat:Ale nie miałem czasu zweryfikować swojej wiedzy z książką, więc napisałem co wiedziałem.
A ja ochoty, pisałem z pamięciWesoły
Pozdrawiam.
[Obrazek: 16359.png]
[Obrazek: 15712.jpg]
 System operacyjny: windows_vista Przeglądarka: firefox
Programy: Polecane / Nowe / Inne



Użytkownicy forum szukali:
zliczanie wyrazów c++liczenie wyrazów c++c++ liczenie slowliczenie wyrazów w tekście c++zliczanie zer w liczbie bezpośrednio po przecinku dla c++zliczamie wyrazow i liter w tekscie c++liczenie słów c++c++ liczenie słówc zliczanie wyrazówzliczenie wyrazów c++

Podobne wątki ([c++] Liczenie wyrazów)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Funkcja zwracająca liczbę wyrazów? Dreamer1x6xX 5 4446 12.11.2014, 22:30
Ostatni post: Szachista
  Liczenie operacji w kodzie [C] mateush998 3 2555 23.03.2014, 10:34
Ostatni post: Szachista
  [c++]Liczenie liczby cyfr po przecinku Kazer 12 11600 12.12.2013, 23:35
Ostatni post: Rincewind

Skocz do:


Wybrane wątki ([c++] Liczenie wyrazów)
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  Python z wiersza poleceń Physicist 15 21207 21.08.2019 20:14
Ostatni post: Physicist
  Transfer plików via FTP Visual Basic FireBytes 3 7019 15.08.2019 07:41
Ostatni post: Szachista
  Menu wysuwane z boku patryk67 1 7611 07.08.2019 12:43
Ostatni post: aht
  Visual Basic Excel l.całkowitą przedstawić w postaci szesnastkowej fugaz 4 9505 18.06.2019 21:36
Ostatni post: fugaz
  Nauka do Olimpiady Informatycznej? piotr0905 1 8987 08.06.2019 16:50
Ostatni post: wlisik
Ściana Prosta gra w Builder C++ Kiranek1 1 8968 31.05.2019 15:20
Ostatni post: Szachista
  Menu (Nie widoczne długie opisy) wanhelsing 5 11021 28.04.2019 19:31
Ostatni post: koneton
  Skrypt usuwający pliki sylwiaa1 2 4449 28.04.2019 15:20
Ostatni post: sylwiaa1
  Środowisko do assemblera Physicist 4 10258 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 10504 17.04.2019 10:20
Ostatni post: ptrick
  C++ - sens pogłębiania nauki gbr 5 10225 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 9872 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 8970 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 12605 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 9474 07.03.2019 15:33
Ostatni post: wiktrom12