<C> Program wyodrębniający słowa.

DanoPlurana

Użytkownik
Dołączył
Marzec 16, 2007
Posty
246
Siema, moze ktos pomoc w napisaniu programu ktory ma za zadanie wyodrębnić słowa i je zliczac? Chodzi o to ze uzytkownik wpisuje np. jeden dwa trzy trzy, program to wyodrębnia (mysle ze chodzi o wylistowanie tych słów jedno pod drugim) najwiekszy problem jednak jest w zliczaniu, jak napisac funkcje ktora przy podanych 4 wyrazach napisze ze 'trzy' wystapilo dwa razy?

Odwdziecze sie za pomoc :p

Dzieki
 

trojanxem

Użytkownik
Dołączył
Grudzień 6, 2011
Posty
239
miedzy tymi wyrazami spacja zawsze będzie i mogą być 10 literowe, jak i 2, tak? napisz 3626738, mysle ze pomoge :)
 

DanoPlurana

Użytkownik
Dołączył
Marzec 16, 2007
Posty
246
Dokladnie tak, napisalem na GG :)
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Kod:
#include <stdio.h>#include <stdlib.h>
#include <string.h>


#define MAX_LINE  40
#define MAX_WORDS 10


int main() {
    char line[MAX_LINE];
    scanf("%[^\n]", &line[0]);


    struct word {unsigned amount, start, end;} words[MAX_WORDS];
    unsigned counter = 0;


    unsigned i, start = 0;
    for (i = 0; i < strlen(line) + 1; i++) {
        if (line[i] == ' ' || line[i] == '.' || line[i] == ',' || line[i] == '\0') {
            // an existing word?
            unsigned j, found = 0;
            for (j = 0; j < counter; j++) {
                if(!strncmp(&line[start], &line[words[j].start], i - start)) {
                    words[j].amount++; 
                    found = 1;
                }
            } 


            // a new word
            if (!found || !counter) {
                words[counter].start = start;
                words[counter].end = i;
                words[counter].amount = 1;    
                counter++;
            }
            start = i + 1; 
        }
    }


    // print results
    unsigned j;
    for (i = 0; i < counter; i++) {
        printf("%2d \'", words[i].amount);
        for (j = words[i].start; j != words[i].end; j++) {
           printf("%c", line[j]);  
        }
        printf("\'\n");
    }


    return 0;
}

Kod:
bash-3.2$ gcc -Wall main.c && echo "yyy xxx yyy yyy,xxx xxx 1a" | ./a.out  3 'yyy'
 3 'xxx'
 1 '1a'
bash-3.2$
 

codex

Użytkownik
Dołączył
Październik 30, 2012
Posty
25
Co to za wielka tajemnica zeby tego publicznie nie omówić ?
tutaj masz rozwiązanie bez użycia WinApi w asemblerze nie chce mi się przerabiać na C.
https://docs.google.com/file/d/0Bzkm-XARAFtnTnZncHgyR3I1TTg/edit?usp=sharing

Ciekawostka która wprowadziłem jest taka, że najpierw:
- tworzę kopie stringu przeszukiwanego oraz szukanego.
- zamieniam wszystkie litery w kopiach stringów na małe.
- teraz operując na kopiach wyszukuje to co mnie interesuje.
- po zakończeniu wyszukiwania zapisuje rezultaty i usuwam kopie łańcuchów.

dzięki temu wyszukiwanie odbywa się bez względu na wielkość liter
 
Do góry Bottom