Найти символ, встречающийся в файле наибольшее число раз - C (СИ) (74693)
Формулировка задачи:
Задача программы - найти символ, встречающийся в файле(дан файл F) наибольшее число раз. Если таких символов несколько, найти их все. Переписать эти символы в другой файл G.
Решение задачи: «Найти символ, встречающийся в файле наибольшее число раз»
textual
Листинг программы
#include <stdlib.h>
#include <stdio.h>
enum { MAX_SIZE = 256 };
typedef struct CountChar{
char chr;
unsigned cnt;
}CountChar;
typedef struct CounterChars{
struct CountChar cchr[MAX_SIZE];
int size;
}CounterChars;
void addchar(CounterChars *, const char);
char *maxcount(const CounterChars *, char [MAX_SIZE]);
int main(void){
FILE *f = fopen("F", "r");
if (!f){
perror("File error");
exit(EXIT_FAILURE);
}
CounterChars cntr = { .size=0 };
while (!feof(f)) addchar(&cntr, fgetc(f));
freopen("G", "w", f);
if (!f){
perror("File error");
exit(EXIT_FAILURE);
}
char chrs[MAX_SIZE];
fputs(maxcount(&cntr, chrs), f);
fclose(f);
return EXIT_SUCCESS;
}
void addchar(CounterChars *cntr, const char chr){
int i = 0;
for (; (i < cntr->size) && (cntr->cchr[i].chr != chr); ++i);
if (i == cntr->size){
cntr->cchr[i].chr = chr;
cntr->cchr[i].cnt = 1;
++cntr->size;
}else ++cntr->cchr[i].cnt;
}
char *maxcount(const CounterChars *cntr, char chrs[MAX_SIZE]){
unsigned maxcnt = 0;
for (int i = 0; i < cntr->size; ++i){
if (cntr->cchr[i].cnt > maxcnt) maxcnt = cntr->cchr[i].cnt;
}
int size = 0;
for (int i = 0; i < cntr->size; ++i){
if (cntr->cchr[i].cnt == maxcnt) chrs[size++] = cntr->cchr[i].chr;
}
chrs[size++] = '\0';
return chrs;
}