Найти сколько раз каждое отдельное слово встречается в тексте - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д