Funkcje w C++ operujące na napisach.

0

Witam, mam problem z napisaniem 2 funkcji:

  1. words, która zwraca liczbę wyrazów w C-string
  2. words2, która zwraca liczbę wyrazów jednak teraz tylko tych które zawierają minimum 2 litery

Cały program powinien działać tylko i wyłącznie z plikiem nagłówkowym iostream.

Próbowałem już na wiele sposobów, ale bezskutecznie. Czy ktoś mógłby mi wytłumaczyć.

#include <iostream>
using namespace std;

size_t words(const char* cstr);
size_t words2(const char* cstr);

int main(void){
  using std::cout; using std::endl;

char s2[]= " ... for (int i = 0; i < n; i++){...} ...";
  cout << "words : " << words(s2) << endl;
  cout << "words2 : " << words2(s2) << endl;
}

/* zdefiniowane funkcje */

}

program powinien wypisać:

words : 6
words2 : 2

1

Witaj na naszym forum. Możesz powiedzieć więcej o Twoim problemie z napisaniem tych dwóch funkcji?

0
  1. Kod jest napisany jak C z domieszką C++, a nie jak normalne C++
  2. Brak definicji "słowa". Przy standardowej interpretacji (wszystko o długości minimum 1 od białego znaku do białego znaku) wynik jest inny od obu odpowiedzi: 11
  3. Podany kod, pewnie ktoś ci dał, żebyś miał od czego zacząć, a sam nic nie zrobiłeś.
0
kq napisał(a):

Witaj na naszym forum. Możesz powiedzieć więcej o Twoim problemie z napisaniem tych dwóch funkcji?

próbowałem coś takiego

size_t words(const char *cstr)
{
    size_t n = 0;

    while ( *cstr )
    {
        while (*cstr == ' ' ||
        *cstr == '\0' ||
        *cstr == '\n' ||
        *cstr == '<' ||
        *cstr == '=' ||
        *cstr == '{' ||
        *cstr == '}' ||
          *cstr == '(' ||
            *cstr == ')' ||
              *cstr == ';' ||
               *cstr == '.'  ||
               *cstr == ',') ++cstr;

        if ( *cstr )
        {
            n++;
            while ( *cstr &&
                    !( *cstr == ' ' ||
                    *cstr == '\0' ||
                    
                    *cstr == '\n' ||
        
                    *cstr == '<' ||
                    *cstr == '=' ||
                    *cstr == ';' ||
                       *cstr == '.'  ||
                       *cstr == ',' ) ) ++cstr;

        }
    }

    return n;
}

problem tkwi w tym, że nie mogę użyć żadnego specjalnego pliku nagłówkowego

0
marek256 napisał(a):

problem tkwi w tym, że nie mogę użyć żadnego specjalnego pliku nagłówkowego

To może powiedz, jak chciałbyś to zrobić, mogąc użyć jakiegoś pliku nagłówkowego? Wtedy rozpracujemy co z tym da się zrobić.

0

Wskazówka:

bool notPartOfWord(char ch)
{
    return !partOfWord(ch);
}

const char *skipIf(const char *s, bool (*canSkip)(char))
{
    while (!isAtEndOfString(s) && canSkip(*s))
    {
        ++s;
    }
    return s;
}

size_t words(const char *cstr)
{
    size_t count = 0;
    cstr = skipIf(cstr, notPartOfWord);
    while(!isAtEndOfString(cstr)) {
         ++count;
         cstr = skipIf(cstr, partOfWord);
         cstr = skipIf(cstr, notPartOfWord);
    }
}
0

Nieco alternatywne podejście do tego od @MarekR22

size_t words(const char* cstr) {
    size_t alpha_count = 0;
    size_t word_count = 0;
    for (; *cstr; cstr++) {
        if (partOfWord(*cstr))
            alpha_count++;
        else
            alpha_count = 0;
        if (alpha_count == 1)
            word_count++;
    }
    return word_count;
}

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