问题描述:文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写 一个实现这一目标的文字统计系统,称为“文学研究助手”。 基本要求:英文小说存于一个文本文件中,待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数 和出现位置所在行的行号,格式自行设计。利用C语言
时间: 2024-02-22 10:59:24 浏览: 172
实现该功能可以分为以下步骤:
1. 读入待处理的小说文本文件和需要统计的形容词集合。
2. 将小说文本文件逐行读入,对于每一行,使用字符串处理函数(如strtok、strstr等)查找其中是否出现需要统计的形容词,如果出现,则记录该形容词在该行的位置信息(如字符偏移量),并将该形容词的出现次数加1。
3. 统计完成后,输出每个形容词的出现次数和位置信息。
下面是一个示例代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 50 // 最长单词长度
#define MAX_LINE_LEN 1000 // 最长行长度
#define MAX_WORDS 100 // 最多统计的单词数目
// 存储单词信息的结构体
typedef struct {
char word[MAX_WORD_LEN]; // 单词内容
int count; // 出现次数
int pos[MAX_LINE_LEN]; // 出现位置所在行的行号
int pos_count; // 出现位置数量
} WordInfo;
int main() {
char novel_file[100], word_file[100];
FILE *fp_novel, *fp_words;
char line[MAX_LINE_LEN];
char *word;
WordInfo words[MAX_WORDS];
int word_count = 0, line_count = 0;
// 读入小说文本文件和需要统计的单词集合
printf("请输入小说文本文件路径:");
scanf("%s", novel_file);
printf("请输入需要统计的单词文件路径:");
scanf("%s", word_file);
// 打开文件
fp_novel = fopen(novel_file, "r");
if (fp_novel == NULL) {
printf("无法打开小说文本文件 %s\n", novel_file);
exit(1);
}
fp_words = fopen(word_file, "r");
if (fp_words == NULL) {
printf("无法打开单词文件 %s\n", word_file);
exit(1);
}
// 读入需要统计的单词集合
while (fgets(line, MAX_LINE_LEN, fp_words) != NULL) {
line[strcspn(line, "\r\n")] = '\0'; // 去除换行符
if (word_count >= MAX_WORDS) {
printf("需要统计的单词数量超过了最大限制 %d\n", MAX_WORDS);
exit(1);
}
strcpy(words[word_count].word, line);
words[word_count].count = 0;
words[word_count].pos_count = 0;
word_count++;
}
fclose(fp_words);
// 统计每个单词的出现次数和位置
while (fgets(line, MAX_LINE_LEN, fp_novel) != NULL) {
line_count++;
for (word = strtok(line, " \t\n"); word != NULL; word = strtok(NULL, " \t\n")) {
for (int i = 0; i < word_count; i++) {
if (strcmp(word, words[i].word) == 0) {
words[i].count++;
if (words[i].pos_count < MAX_LINE_LEN) {
words[i].pos[words[i].pos_count++] = line_count;
}
break;
}
}
}
}
fclose(fp_novel);
// 输出统计结果
printf("单词\t\t出现次数\t出现位置所在行\n");
printf("=================================================\n");
for (int i = 0; i < word_count; i++) {
printf("%-15s\t%d\t", words[i].word, words[i].count);
for (int j = 0; j < words[i].pos_count; j++) {
printf("%d ", words[i].pos[j]);
}
printf("\n");
}
return 0;
}
```
该程序中使用了字符串处理函数strtok来将每行分割成单词,使用了字符串处理函数strstr来查找单词是否出现在需要统计的单词集合中。使用结构体WordInfo来存储每个单词的出现次数和位置信息。
阅读全文