Другие языки программирования и технологии
Помогите решить написать программу в СИ пожалуйста
Составить словарь. Дан текстовый файл. Составить словарь из 20 наиболее часто встречающихся в этом тексте слов. Слова записать в новый файл в алфавитном порядке.
Тупая и неэффективная реализация в лоб, по уму, надо реализовывать используя структуры типа hash-table или map:
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define D " ,.?;:\n" // добавить разделителей слов по вкусу
typedef struct { char *w; int c; } wc_t;
int cc(wc_t *t1, wc_t *t2) { return t2->c - t1->c; }
int cw(wc_t *t1, wc_t *t2) { return strcmp(t2->w, t1->w); }
main() {
FILE *in, *out;
long int s;
char *b, *w;
wc_t *d = (wc_t *)malloc(0);
int dc = 0, c;
in = fopen("in.txt", "r");
fseek(in, 0, SEEK_END);
s = ftell(in);
fseek(in, 0, SEEK_SET);
b = (char *)malloc(s);
s = fread(b, 1, s, in);
fclose(in);
b[ s] = '\0';
w = strtok(b, D);
while (w != NULL) {
for (c = 0; c < dc; ++c) {
if (strcmp(d[c].w, w) == 0) {
++d[c].c;
break;
}
}
if (c == dc) {
++dc;
d = (wc_t *)realloc(d, dc * sizeof(d[0]));
d[c].w = w;
d[c].c = 1;
}
w = strtok(NULL, D);
}
if (dc > 20) {
qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cc);
dc = 20;
}
qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cw);
out = fopen("out.txt", "w");
for (c = 0; c < dc; ++c) fprintf(out,"%s\n", d[c].w);
fclose(out);
free(d);
free(b);
}
!!! Без проверок корректности работы с файлами и памятью !!!
ЗЫ:
> но я не сделаю, если кто может написать программный код
Программный код есть. Но его надо будет допилить и еще и объяснить преподавателю. Вы это сможете?
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define D " ,.?;:\n" // добавить разделителей слов по вкусу
typedef struct { char *w; int c; } wc_t;
int cc(wc_t *t1, wc_t *t2) { return t2->c - t1->c; }
int cw(wc_t *t1, wc_t *t2) { return strcmp(t2->w, t1->w); }
main() {
FILE *in, *out;
long int s;
char *b, *w;
wc_t *d = (wc_t *)malloc(0);
int dc = 0, c;
in = fopen("in.txt", "r");
fseek(in, 0, SEEK_END);
s = ftell(in);
fseek(in, 0, SEEK_SET);
b = (char *)malloc(s);
s = fread(b, 1, s, in);
fclose(in);
b[ s] = '\0';
w = strtok(b, D);
while (w != NULL) {
for (c = 0; c < dc; ++c) {
if (strcmp(d[c].w, w) == 0) {
++d[c].c;
break;
}
}
if (c == dc) {
++dc;
d = (wc_t *)realloc(d, dc * sizeof(d[0]));
d[c].w = w;
d[c].c = 1;
}
w = strtok(NULL, D);
}
if (dc > 20) {
qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cc);
dc = 20;
}
qsort(d, dc, sizeof(d[0]), (int (*)(const void *, const void *))cw);
out = fopen("out.txt", "w");
for (c = 0; c < dc; ++c) fprintf(out,"%s\n", d[c].w);
fclose(out);
free(d);
free(b);
}
!!! Без проверок корректности работы с файлами и памятью !!!
ЗЫ:
> но я не сделаю, если кто может написать программный код
Программный код есть. Но его надо будет допилить и еще и объяснить преподавателю. Вы это сможете?
прошу уточнить С или С++, потому что некоторые пишут Си, а на самом деле С++
тогда создаете 2 массива динамических, один строковый, второй числовой, и затем, считывая слово, определяете, если оно есть в массиве, то увеличиваете значение в другом массиве с этим же индексом, а потом сортируете, к сожалению с реализацией дин. массива я сейчас помочь вам не смогу, т. к я юзаю с++ а там вектора
тогда создаете 2 массива динамических, один строковый, второй числовой, и затем, считывая слово, определяете, если оно есть в массиве, то увеличиваете значение в другом массиве с этим же индексом, а потом сортируете, к сожалению с реализацией дин. массива я сейчас помочь вам не смогу, т. к я юзаю с++ а там вектора
Похожие вопросы
- Помогите плиз написать программу(язык Си)
- Помогите написать программу на Си
- Написать программу на Си
- помогите написать программу на Си
- помогите написать программу на Си
- Нужно написать программу на СИ++, которая переводит с паскаля на СИ++
- помогите написать программу на си
- Помогите написать программу в СИ. буду очень благодарин
- помогите написать программу в Си
- Помогите написать программу на Си.