Obliczanie ilości wystąpień każdego ze słów w pliku.

Odpowiedz Nowy wątek
2019-06-12 20:02
0

Witam, dostałem projekt, w którym muszę wczytać do 20 słów od użytkownika, następnie wygenerować z nich do 1000 słów losowo i umieścić w pliku. Następnie obliczyć liczbę wystąpień każdego ze słów w pliku. Doszedłem do samego końca, niestety mam problem z porównywaniem odczytanego słowa z pliku ze słowami wprowadzonymi przez użytkownika. Chodzi o funkcję ZLICZANIE. Jak można to zrobić?
Z góry dziękuję za pomoc.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node
{
    int key;
    char slowo;
    struct Node *next;
}list;

void uzupelnianie(char **tab, int n)
{
    for(int i=0;i<n;i++)
    {
        printf("Wprowadz %d slowo : ",(i+1));
        tab[i] = (char*) malloc(n*sizeof(char));
        scanf("%s",tab[i]);

    }
}
void print(char **tab, int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%d slowo to : %s\n",i+1,tab[i]);
    }
}
void ZapisDoPliku(FILE *plik,char **tab, int ile, int n)
{
    int x;
    for(int i=0;i<ile-1;i++)
    {
        x=rand()%n;
        fprintf(plik,"%s ",tab[x]);
        x=0;
    }
}
int *zliczanie(char **tab,FILE *plik2,int n,int *wsk)
{
    int i=0,j=0,k=0;
    char znak;
    char slowo[100];
    znak=getc(plik2);
    while(znak!=EOF)
    {
        while(znak!=32)
        {
            slowo[i]=znak;
            znak=0;
            znak=getc(plik2);
            i++;
        }
        printf("%s\n",slowo);
        for(j=0;j<n;j++)
        {
            if(tab[j]==slowo)(wsk[j])++;
        }
        for(k=0;k<100;k++)
        {
            slowo[k]=0;
        }
        znak=0;
        znak=getc(plik2);
        i=0;
    }
    return *wsk;
}
void zeruj(int *wsk, int n)
{
    for(int i=0;i<n;i++)
    {
        wsk[i]=0;
    }
}
int main()
{
    int n=0,ile=0;
    srand(time(NULL));
    printf("Ile slow chcesz wpisac? : ");
    scanf("%d",&n);
    int ilosc[n-1];
    int *wsk=ilosc;
    zeruj(wsk,n);
    char **tab = (char**) malloc(n*sizeof(char*));
    int i;
    for(i = 0; i < n; i++)
    {
        tab[i] = (char*) malloc(n*sizeof(char));
        tab[i][0] = 0;
    }
    uzupelnianie(tab,n);
    print(tab,n);
    ile=rand()%1000;
    FILE *plik,*plik2;
    plik=fopen("tekst.txt","w");
    if(plik==NULL)
    {
        printf("Nie udalo sie otworzyc pliku tekst.txt");
        return 0;
    }
    ZapisDoPliku(plik,tab,ile,n);
    fclose(plik);
    plik2=fopen("tekst.txt","r");
    if(plik2==NULL)
    {
        printf("Nie udalo sie otworzyc pliku tekst.txt");
        return 0;
    }
    zliczanie(tab,plik2,n,wsk);
    printf("\n\n");
    for(int i=0;i<n;i++)
    {
        printf("%d\n",wsk[i]);
    }

    return 0;
}
edytowany 1x, ostatnio: Shalom, 2019-06-13 09:52
For - Mat! Tego się nie da czytać. - lion137 2019-06-12 20:27

Pozostało 580 znaków

2019-06-13 11:51
0

Przekombinowałeś. Zaimplementowałeś funkcję, która zwraca wskaźnik, a nic z tym nie robisz gdy wywołujesz funkcję.
Nie rozumiem czemu piszesz, że

mam problem z porównywaniem odczytanego słowa z pliku ze słowami wprowadzonymi przez użytkownika.

natomiast problem masz z funkcją o nazwie zliczanie. To złe nazewnictwo powoduje, że nie wiem już czy chodzi o porównanie czy samo zliczenie słów.

Jeśli chodzi o porównanie, to nie możesz robić tego, co zrobiłeś tutaj:

        for(j=0;j<n;j++)
        {
            if(tab[j]==slowo)(wsk[j])++;
        }

Nie masz możliwości porównania całego słowa porównując wskaźnik na ciąg znaków. W surowym C tego się tak nie robi.
Użyj strncmp. Dzięki temu będziesz mógł sprawdzić czy dwa ciągi są jednakowe. Nie musisz nawet porównywać ich długości.

Pozostało 580 znaków

2019-06-14 00:12
0

Zlicza wystąpienia "janusz"'y w pliku data.txt

#include <stdio.h>
#include <string.h>

int main()
{
    unsigned counter = 0;
    char buffer[128];
    FILE * file = fopen("data.txt", "r");
    if(!file)
    {
        printf("file not found\n");
        return 1;
    }
    while(fscanf(file, "%s", buffer) != EOF)
        if(!strcmp(buffer, "janusz"))
            ++counter;
    printf("%d", counter);
    fclose(file);
    return 0;
}
edytowany 2x, ostatnio: au7h, 2019-06-14 00:14
Brak klamerek kiedyś się zemści :P - tajny_agent 2019-06-14 11:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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