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 4455 12.11.2014, 22:30
Ostatni post: Szachista
  Liczenie operacji w kodzie [C] mateush998 3 2565 23.03.2014, 10:34
Ostatni post: Szachista
  [c++]Liczenie liczby cyfr po przecinku Kazer 12 11639 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
Ściana Prosta gra w Builder C++ Kiranek1 1 9547 31.05.2019 15:20
Ostatni post: Szachista
  Menu (Nie widoczne długie opisy) wanhelsing 5 11574 28.04.2019 19:31
Ostatni post: koneton
  Skrypt usuwający pliki sylwiaa1 2 4546 28.04.2019 15:20
Ostatni post: sylwiaa1
  Środowisko do assemblera Physicist 4 10795 21.04.2019 14:04
Ostatni post: Ajgor
  VBA excel dmjs 6 11172 17.04.2019 10:20
Ostatni post: ptrick
  C++ - sens pogłębiania nauki gbr 5 10786 25.03.2019 12:53
Ostatni post: koneton
  Klasa wewnętrzna w C++ Physicist 4 10428 23.03.2019 18:28
Ostatni post: Physicist
  Ruby on Rails - tutoriale luciussulla 0 9513 23.03.2019 16:49
Ostatni post: luciussulla
Big Grin Czy dostane sie technikum informatycznego klaudiusz20046 6 13277 21.03.2019 01:28
Ostatni post: UnableToSee
  [C#] Program do moderacji czatów gier wiktrom12 0 10035 07.03.2019 15:33
Ostatni post: wiktrom12
  Mój pierwszy projekt - Pomoc rafal12999 1 10468 07.02.2019 22:01
Ostatni post: Szachista
  pomoc projekt scilab piesel18 2 11939 04.02.2019 09:03
Ostatni post: piesel18
  Szkoła Informatyczna Zikinan 1 10760 02.02.2019 17:59
Ostatni post: wojownikhaha
  [Java] Strona z zadaniami do rozwiązania i odpowiedziami rafal12999 2 11576 27.01.2019 13:44
Ostatni post: rafal12999
  kompilacja biblioteki Agui - cmake jurek2 0 10772 10.01.2019 13:12
Ostatni post: jurek2