7-5 统计单词的长度 (15 分)
时间: 2023-04-24 11:06:41 浏览: 155
这道题目的意思是要求我们统计一段文本中每个单词的长度,并输出每个长度出现的次数。具体的做法可以使用哈希表来实现,遍历文本中的每个单词,统计其长度并将其作为键值存入哈希表中,每次出现相同长度的单词则将对应的值加一。最后遍历哈希表输出每个长度及其出现次数即可。
相关问题
7-4 词频统计 (10 分) c语言
### 回答1:
在C语言中实现7-4题,即词频统计,可以通过使用哈希表的方式来解决。哈希表是根据关键字直接访问存储位置的数据结构,它通过计算关键字的哈希值,将其映射到某个数组或链表的位置,实现高效的查找和插入操作。
具体实现步骤如下:
1. 定义一个哈希表,作为存储词频的数据结构。可以使用数组和链表的结合来实现,每个数组元素存储一个链表。
2. 读取输入的字符串。
3. 遍历字符串,依次将每个单词提取出来。可以通过空格或标点符号来分隔单词。
4. 对每个单词进行哈希计算,得到哈希值。
5. 在哈希表中查找对应哈希值的位置,如果已存在则更新词频,否则插入新的节点。
6. 输出哈希表中每个单词的词频。
以下是一个简单的示例代码:
```
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 哈希表节点
typedef struct Node {
char word[100]; // 单词
int frequency; // 词频
struct Node* next; // 链表指针
} Node;
#define HASH_SIZE 1000 // 哈希表大小
Node* hashTable[HASH_SIZE]; // 哈希表数组
// 计算哈希值
int hash(char* word) {
int sum = 0;
for (int i = 0; i < strlen(word); i++) {
sum += word[i];
}
return sum % HASH_SIZE;
}
// 在哈希表中插入或更新节点
void insertOrUpdate(char* word) {
int index = hash(word);
Node* node = hashTable[index];
while (node != NULL) {
if (strcmp(node->word, word) == 0) { // 单词已存在,更新词频
node->frequency++;
return;
}
node = node->next;
}
// 单词不存在,插入新节点
Node* newNode = (Node*) malloc(sizeof(Node));
strcpy(newNode->word, word);
newNode->frequency = 1;
newNode->next = hashTable[index];
hashTable[index] = newNode;
}
// 输出哈希表中的单词和词频
void printFreq() {
for (int i = 0; i < HASH_SIZE; i++) {
Node* node = hashTable[i];
while (node != NULL) {
printf("%s: %d\n", node->word, node->frequency);
node = node->next;
}
}
}
int main() {
// 初始化哈希表
memset(hashTable, 0, sizeof(hashTable));
char input[10000];
scanf("%[^\n]", input); // 读取输入的字符串直到换行符
char* token = strtok(input, " ,.-"); // 使用空格和标点符号分隔单词
while (token != NULL) {
for (int i = 0; i < strlen(token); i++) {
token[i] = tolower(token[i]); // 统一转为小写字母
}
insertOrUpdate(token);
token = strtok(NULL, " ,.-");
}
// 输出词频
printFreq();
return 0;
}
```
这样,输入一段文本,程序会输出每个单词的词频。注意,此代码只是一个简单示例,没有考虑一些特殊情况,如单词超长等,需根据实际需求进行调整和完善。
### 回答2:
题目要求使用C语言编写一个程序,统计一个给定字符串中各个单词出现的次数。下面是一个简单的C语言代码示例:
```c
#include <stdio.h>
#include <string.h>
void wordFrequency(char *str) {
int len = strlen(str);
int count = 1;
for (int i = 0; i < len; i++) {
if (str[i] == ' ') {
count++;
continue;
}
while (str[i] != ' ' && i < len) {
i++;
}
}
printf("单词个数:%d\n", count);
}
int main() {
char str[100];
printf("请输入字符串:");
gets(str);
wordFrequency(str);
return 0;
}
```
代码中的wordFrequency函数用于统计单词个数。它首先通过strlen函数获取字符串的长度,然后使用一个循环遍历字符串。在循环中,每次遇到空格符就将计数器加一,忽略其他符号。最后输出计数器的值,即为单词个数。
在主函数中,我们使用gets函数获取用户输入的字符串,并调用wordFrequency函数进行统计。最后输出结果。注意,由于使用了gets函数,输入的字符串长度不能超过100个字符。
这是一个简单的单词频率统计程序,只能统计单词的个数,并不考虑重复出现的情况。如果需要统计每个单词的具体出现次数,需要对代码进行进一步的修改和完善。
c语言+统计单词的平均长度
以下是一个C语言程序,可以实现输入一行字符,统计每个单词的长度,并计算单词的平均长度:
```c
#include <stdio.h>
#include <string.h>
int main() {
char s[1000];
int len = 0, cnt = 0;
while (~scanf("%s", s)) {
len += strlen(s);
cnt++;
if (getchar() == '\n') {
break;
}
}
if (cnt == 0) {
printf("0\n");
} else {
printf("%.2f\n", (double)len / cnt);
}
return 0;
}
```
程序的思路是先读入一行字符,然后使用`strlen`函数计算每个单词的长度,并累加到`len`变量中,同时统计单词的个数,累加到`cnt`变量中。最后,如果`cnt`为0,则输出0;否则,输出`len/cnt`的值,即单词的平均长度。