Zliczacz wyrazow/liczb - błąd?

0

Mam problem z zadaniem na SPOJ'u. A dokładnie z zliczaniem wyrazów i liczb.

Napisz program, który liczy, ile wyrazów i liczb znajduje się w podanej linii.

Wejście

Na wejście programu podana zostanie pewna ilość zestawów danych. Poszczególne zestawy składają sie z liczb całkowitych i wyrazów (wyraz = ciąg liter) rozdzielonych spacjami oraz kończą się znakiem nowej linii.

Wyjście

Na wyjściu ma się pojawić ilość liczb i wyrazów znajdujących się w poszczególnych liniach. Ilość liczb należy oddzielić spacją od ilości wyrazów, a po ilości wyrazów ma się pojawić znak nowej linii.

Przykład

Wejście:

Romek ma 2 koty i 3 psy
2 plus 2 jest rowne 4

Wyjście:

2 5
3 3

Napisałem takie coś:

#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char tekst[128];
    int licznik1=0;
    int licznik2=0;
    
    cin.getline(tekst,128);
    
    for(int i=0; tekst[i] != '\0'; ++i)
    {
      if (tekst[i]==' ')
       licznik1++;
      if (tekst[i] >= '0' && tekst[i] <= '9')
       licznik2++;
    }
    cout<<licznik1+1;
    cout<<licznik2;
    return 0;
}

Wiem. Zlicza tu cyfry, a nie liczby. Mógłbym prosić o pomoc? :)

0

if (tekst[i] >= '0' && tekst[i] <= '9')
licznik2++;

sprawdzasz tylko czy jest liczbą a nie cyfrą, tzn. sprawdasz czy liczba? tak - i lecisz dalej traktując kolejny składnik cyfry jako osobną liczbę
rozwiązanie powinno wyglądać tak, że: najpierw sprawdzasz pierwszy znak - jesli literaz zwiększasz odpowiedni licznik a następnie jakąs pętlą czekasz na spacje lub koniec linii. Tak samo dla cyfr

0

Najłatwiej? Za pomocą stringstream wpisuj sobie kolejne elementy tej linii do stringa/inta.

0

SPOJ służy aby się uczyć samodzielnie podstaw algorytmiki. Obejrzenie tego kodu nić ci nie da.

#include <cctype>
#include <iostream>
using namespace std;
 
int main()
  {
   unsigned L=0,W=0;
   int ch;
   bool inL=false,inW=false;
   while((ch=cin.getchar())!=EOF)
      {
       if(ch=='\n') { cout<<L<<' '<<W<<endl; L=W=0; }
       else if(isdigit(ch)) { inW=false; if(!inL) { inL=true; ++L; } }
       else if(ch!=' ') { inL=false; if(!inW) { inW=true; ++W; } }
       else inL=inW=false;
      }
   return 0;
  }
0
_13th_Dragon napisał(a):

SPOJ służy aby się uczyć samodzielnie podstaw algorytmiki. Obejrzenie tego kodu nić ci nie da.

#include <cctype>
#include <iostream>
using namespace std;
 
int main()
  {
   unsigned L=0,W=0;
   int ch;
   bool inL=false,inW=false;
   while((ch=cin.getchar())!=EOF)
      {
       if(ch=='\n') { cout<<L<<' '<<W<<endl; L=W=0; }
       else if(isdigit(ch)) { inW=false; if(!inL) { inL=true; ++L; } }
       else if(ch!=' ') { inL=false; if(!inW) { inW=true; ++W; } }
       else inL=inW=false;
      }
   return 0;
  }

Z twojego programu nic nie zrozumiałem. Chciałem uzyskać odpowiedź dla amatora. :)

0

Moze moje rozwiazanie bedzie bardziej dla ciebie zrozumiale:

 
#include <iostream>
#include <string>
#include <sstream>
#include <cctype>

int main()
{
    std::string str;
    int nums, words;

    while(std::getline(std::cin, str))
    {
        nums = 0;
        words = 0;

        std::istringstream iss(str);
        std::string tmp;

        while(iss.good())
        {
            iss >> tmp;

            for(int i=0; i<tmp.size(); ++i)
            {
                if(!std::isdigit(tmp[i]))
                {
                    words++;
                    nums--;
                    break;
                }
            }
            nums++;
        }

        std::cout << nums << " " << words << "\n";
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1