c语言读入一篇英语文档,统计26个英文字母和空格出现的频率,计算信息熵
时间: 2024-09-17 14:05:56 浏览: 69
在C语言中,我们可以使用标准库`stdio.h`、`ctype.h`以及`string.h`来读取文件并统计字母和空格的频率。下面是一个简单的例子,它会读取一个英文文本文件,统计26个大写字母和单个空格的出现次数,然后计算信息熵。
```c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>
#define ALPHABET_SIZE 26
// 单独统计一个字符的频率
void count_char(char ch, unsigned int* freq) {
if (isalpha(ch)) { // 如果是字母
if (isupper(ch)) { // 转换为小写再计数
ch += 'a' - 'A';
}
(*freq)[ch]++;
} else if (isspace(ch)) { // 如果是空格
(*freq)[ALPHABET_SIZE + 1]++;
}
}
// 计算字符串中所有字符的频率
void count_text(const char* text, unsigned int* freq) {
while (*text) {
count_char(*text++, freq);
}
}
// 计算信息熵
double calculate_entropy(unsigned int* freq, int n) {
double entropy = 0.0;
double total_count = n;
for (int i = 0; i <= ALPHABET_SIZE + 1; ++i) {
if (freq[i]) {
double prob = (double) freq[i] / total_count;
entropy -= prob * log2(prob);
}
}
return entropy;
}
int main() {
FILE* file = fopen("input.txt", "r");
if (!file) {
perror("Error opening file");
return 1;
}
unsigned int letter_freq[ALPHABET_SIZE + 1] = {0};
fseek(file, 0, SEEK_END); // 获取文件长度
int file_size = ftell(file);
fseek(file, 0, SEEK_SET);
char buffer[1024]; // 临时缓冲区
int chars_read;
while ((chars_read = fread(buffer, 1, sizeof(buffer), file)) > 0) {
count_text(buffer, letter_freq);
}
fclose(file);
double info_entropy = calculate_entropy(letter_freq, file_size);
printf("Information Entropy: %.2f\n", info_entropy);
return 0;
}
```
在这个代码里,我们先打开文件,然后逐行读取,统计字母和空格的频率。接着调用`calculate_entropy`函数来计算信息熵。
阅读全文