Найти сколько раз каждое отдельное слово встречается в тексте - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. У меня возникла проблема с программой. Есть файл с N-ым количеством слов(текстом любой длинны), нужно найти сколько раз каждое отдельное слово встречается в тексте. Пока только на этапе выписывания слов в структуру и появляются ошибки. подскажите пожалуйста где проблема. И если не сложно может какие-нибудь варианты алгоритмов. Код пока не редактированный особо, делаю проверки(не судите строго). За ранее спасибо.
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

typedef struct slova_kolvo {
    char slova[20];
    int kolvo;
};

int main()
{FILE *f;
 int count=0, i=0, j=0, k=0, len, exit = 1, exit1 = 1, check = 0, check1=0;
 char *str, str1[100], ch;
 //slova_kolvo a[100];
 
 f = fopen("test.txt", "r+");
 
 if(f == NULL)
 {printf("Error! Program close!!!");
  return 0;}
 
 while ((ch=getc(f))!=EOF){   
   count++;
 }
 
 str = (char*)malloc(count+1); 
 
 rewind(f);
 
 for(i=0;i<=count;i++)  
{   if(count==i) 
      {str[i] = '\0';
       break;}
    fscanf(f, "%c",&str[i]);
 }
 
 fclose(f);
 
 printf("Dlina texta v file = %d", count);
 
 printf("\nV file nachoditsia text : \n");
 for(i=0; i<=count; i++)
     printf("%c",str[i]);
 
 len = strlen(str);
 printf("\n%d", len);

 i=0;
 j=0;

 int kol=0;
 for(i=0; i<=len; i++)
 {if(str[i] == ' ')
    kol++; }
 printf("\nkolvo slov v tekste = %d", kol);
  
  slova_kolvo* a;
  a = (slova_kolvo*)malloc(sizeof(slova_kolvo) * kol);
 
  do{    
   for(i=0; i<=len; i++)
     {if(str[i] == '\0') 
       {str1[j++] = '\0';
           check1 = check; 
           for(k=0; k<=check1; k++)
            {if((strcmp(str1,a[k].slova) == 0))
            exit = 0;}
            
        strcpy(a[check].slova, str1);
        exit = 0;}

   if(str[i] != ' ')
       {str1[j] = str[i];
        j++;}
      else
       {str1[j++] = '\0';
        check1 = check; 
        do{
        for(k=0; k<=check1; k++)
        {if(strcmp(str1,a[k].slova) == 0)
           {j = 0;
            exit1 = 0;}}
         
          strcpy(a[check].slova, str1);
          check++;
          j=0;
          exit1 = 0;
        }while(exit1);    
        exit1 = 1;
      }
   }
  }while(exit);
 
 printf("\nV struct  slov : ");
 printf("\n%d\n", check+1);
 for(i=0; i<=check; ++i)
   printf("\n%s", a[i].slova);

 printf("\n--------\n");
 puts(str1);

 free(a);
 free(str); 
 getchar();
 getchar();
 return 0;
}

Решение задачи: «Найти сколько раз каждое отдельное слово встречается в тексте»

textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <locale.h>
#define MAX_SIZE   16
 
typedef struct {
    char*    p;
    unsigned n;
} word;
 
typedef struct {
    word*    arr;
    unsigned len;
    unsigned cnt;
} array;
 
static int array_alloc(array* arr);
static unsigned array_index(array* arr, char* s, int* ok);
void array_init(array* arr);
int  array_add(array* arr, char* s);
void array_free(array* arr);
int file_words(FILE* _out, const char* filename);
 
 
int main(void){
    FILE* fp;
#ifndef __STDC__
    setlocale(LC_ALL, "Rus");
#endif
 
/*  вывод результата в файл
    fp = fopen("report.txt", "wt");
    file_words(fp, "file.txt");
    fclose(fp);
*/
    file_words(stdout, "file.txt");
    getchar();
    return 0;
}
 
//подсчёт повторений слов из файла
int file_words(FILE* _out, const char* filename){
    unsigned i;
    char*    buf, *p;
    array    arr;
    long     num;
    FILE*    fp;
    const char delim[] = " \t\n\r.,!?";
 
    if((fp = fopen(filename, "rb")) == NULL)
        return 0;
 
    fseek(fp, 0L, SEEK_END);
    num = ftell(fp);
    if(num <= 0L){
        fclose(fp);
        return 0;
    }
    
    fseek(fp, 0L, SEEK_SET);
    buf = (char*)malloc((size_t)(num + 1));
    if(buf == NULL){
        fclose(fp);
        return 0;
    }
 
    if(fread(buf, 1, (size_t)num, fp) != (size_t)num){
        fclose(fp);
        free(buf);
        return 0;
    }
    fclose(fp);
    buf[num] = '\0';
 
    array_init(&arr);
    for(p = strtok(buf, delim); p != NULL; p = strtok(NULL, delim)){
        if(! array_add(&arr, p))
            break;
    }
 
    //вывод
    for(i = 0; i < arr.cnt; ++i)
        fprintf(_out, "%s(%u)\n", arr.arr[i].p, arr.arr[i].n);
 
    free(buf);
    array_free(&arr);
    return 1;
}
 
//инициализация
void array_init(array* arr){
    arr->arr = NULL;
    arr->cnt = 0;
    arr->len = MAX_SIZE;
}
 
//добавление
int array_add(array* arr, char* s){
    int ok;
    unsigned i = array_index(arr, s, &ok);
    if(ok)
        ++(arr->arr[i].n);
    else {
        if(! array_alloc(arr))
            return 0;
 
        if(i != arr->cnt)
            memmove(arr->arr + (i + 1), arr->arr + i, (arr->cnt - i) * sizeof(word));
        arr->arr[i].p = s;
        arr->arr[i].n = 1;
        ++(arr->cnt);
    }
    return 1;
}
 
//удаление всех
void array_free(array* arr){
    if(arr->arr != NULL)
        free(arr->arr);
    arr->arr = NULL;
    arr->cnt = 0;
    arr->len = MAX_SIZE;
}
 
static int array_alloc(array* arr){
    word*    tmp;
    unsigned len;
    if(arr->arr == NULL){
        arr->arr = (word*)malloc(sizeof(word) * arr->len);
        if(arr->arr == NULL)
            return 0;
    } else if((arr->cnt + 1) >= arr->len){
        len = arr->cnt + 1 + arr->len / 2;
        tmp = (word*)realloc(arr->arr, len * sizeof(word));
        if(tmp == NULL)
            return 0;
        arr->arr = tmp;
        arr->len = len;
    }
    return 1;
}
 
#ifdef __STDC__
#define _scmp strcmp
#else
#define _scmp stricmp
#endif
 
static unsigned array_index(array* arr, char* s, int* ok){
    int n;
    unsigned a, b, m;
    *ok = 0;
    if(!arr->cnt || (_scmp(s, arr->arr[0].p) < 0))
        return 0;
    else if(_scmp(s, arr->arr[arr->cnt - 1].p) > 0)
        return arr->cnt;
 
    a   = m = 0;
    b   = arr->cnt;
    while(a < b){
        m = a + (b - a) / 2;
        n = _scmp(s, arr->arr[m].p);
        if(n == 0){
            *ok = 1;
            break;
        } else if(n < 0)
            b = m;
        else 
            a = ++m;
    }
    return m;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.357 из 5
Похожие ответы