Мне нужно вычислить частоту из бинарных файлов.
Я имею в виду, что я буду читать символы, присутствующие в файле, а затем вычислять частоту по количеству повторений этого символа. Я делаю это с помощью этого кода. И он отлично работает:
struct Node
{
unsigned char symbol;
int appear;
struct Node *link;
struct Node * left,*right;
};Node * head;
Где-то в основном мне нужно прочитать файл:
ch = fgetc(fp);
while (fread(&ch,sizeof(ch),1,fp))
{
symbol(ch);
}
fclose(fp);
где функция add_symbol выглядит так:
Но я не могу понять логику этого кода. Может ли кто-нибудь объяснить вопросы, которые я задал в коде?
symbol(unsigned char sym)
{
Node*pt,*pt,*t;
int is_there=0;
pt = pt = head;
while (pt != NULL)
{
if (pt -> symbol == sym)
{
pt -> appear++;
is_there = 1;
break;
}
pt = pt;
pt = pt -> link;
}
if (!is_there)
{
// printf("\n is_there2 : %d\n",!is_there);
printf("sym2 : %d\n", sym);
t = (Node *) malloc(sizeof( Node));
t -> symbol = sym;
t -> appear = 1;
t -> left = NULL;
t -> right = NULL;
t->link = NULL;
if (head == NULL)
{
head = temp;
}
else
{
pt->link = temp;
}
}
}
Чтобы найти ту же частоту, нам нужно сначала где-то сохранить все данные.
(1) Где это делается?
(2) Нам нужно сравнить символ, появляется ли он снова или нет?
(3) Пожалуйста, объясните немного больше кода, логика одинакова и в c, и в c++. Так что любой язык, никаких проблем.
В объяснении у меня есть сомнения, что: предположим, что 1 2 1 3 3 1 2 - это символы в двоичном файле. При первом выполнении addsymbol мы делаем addsymbol(1); , Теперь мы сохраняем «1», чтобы знать, появится ли какая-либо другая «1» в будущем или нет? так что делаем pt->symbol если снова равно "1" то увеличиваем частоту на единицу. Но при втором выполнении addsymbol мы делаем addsymbol(2); который не равен "1", поэтому снова повторите.
При третьем выполнении я получил addsymbol(1); , на этот раз я получил «1», что равно «1», сохраненному ранее, поэтому частота увеличивается на «1». А как насчет предыдущей "2"? Поскольку мы читаем файл только один раз, выполнив
while (fread(&ch,sizeof(ch),1,fp))
{
add_symbol(ch);
}
и если "2" уже пройдено, то мы не сможем его посчитать. Как этот код сохраняет это «2», а также находит его частоту. Пожалуйста, не стесняйтесь спрашивать меня, если вы все еще не понимаете мой вопрос?