当前位置: 首页 > news >正文

C语言实现关键字匹配算法(复制即用)

文章目录

  • 前言
  • 功能要求
  • 运行截图
  • 全部代码

前言

无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。

功能要求

一份C源代码存储在一个文本文件中,请统计该文件中关键字出现的频度,并按此频度对关键字进行排序。要求:

  • 从文本文件InFile.txt读取C源代码,从文本文件Key.txt读取关键字列表。
  • 分别采用如下不同的查找策略进行频度统计:
    • 链式存储上的顺序查找;
    • 基于链地址法的哈希查找。
  • 基于快速排序实现关键字排序。
  • 不论采取哪种查找和排序策略,完成功能均相同。
    • 关键字统计:依次从关键字列表Key.txt中读取关键字,若该关键字未在文本文件InFile.txt中出现,则将其频度计为0;每检索到一次该关键字,则将其频度增加1。统计结束后,将所有关键字及其频度按关键字列表顺序写入文本文件中。其中,无论关键字列表中的关键字是否出现都要计数。不同查找策略所获得的结果分别写入不同的文件(OutFile1.txt,OutFile2.txt)。
    • 关键字排序:根据关键字出现的频度对所有关键字进行从高到低排序,舍弃关键字列表中未出现的关键字。如果关键字出现的频度相等,则按照关键字的首字母从小到大排序,将排序后的关键字及其频度写入文本文件(OutFile3.txt)中。
  • 设计菜单,实现上述功能。

运行截图

在这里插入图片描述

全部代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_KEYWORDS 100
#define MAX_KEYWORD_LENGTH 50
#define HASH_TABLE_SIZE 101typedef struct {char keyword[MAX_KEYWORD_LENGTH];int frequency;
} KeywordInfo;typedef struct HashNode {KeywordInfo data;struct HashNode *next;
} HashNode;typedef struct {HashNode *table[HASH_TABLE_SIZE];
} HashTable;int compareKeywords(const void *a, const void *b) {const KeywordInfo *keywordA = (const KeywordInfo *)a;const KeywordInfo *keywordB = (const KeywordInfo *)b;if (keywordB->frequency != keywordA->frequency) {return keywordB->frequency - keywordA->frequency;}return strcmp(keywordA->keyword, keywordB->keyword);
}void initializeHashTable(HashTable *hashTable) {int i;for (i = 0; i < HASH_TABLE_SIZE; i++) {hashTable->table[i] = NULL;}
}unsigned int hashFunction(const char *str) {unsigned int hash = 0;while (*str) {hash = (hash << 5) + *str++;}return hash % HASH_TABLE_SIZE;
}HashNode *searchHashTable(HashTable *hashTable, const char *keyword) {unsigned int hashValue = hashFunction(keyword);HashNode *current = hashTable->table[hashValue];while (current != NULL) {if (strcmp(current->data.keyword, keyword) == 0) {return current;}current = current->next;}return NULL;
}void insertHashTable(HashTable *hashTable, const KeywordInfo *keywordInfo) {unsigned int hashValue = hashFunction(keywordInfo->keyword);HashNode *newNode = (HashNode *)malloc(sizeof(HashNode));if (newNode == NULL) {printf("内存分配失败\n");exit(1);}newNode->data = *keywordInfo;newNode->next = hashTable->table[hashValue];hashTable->table[hashValue] = newNode;
}void freeHashTable(HashTable *hashTable) {int i;for (i = 0; i < HASH_TABLE_SIZE; i++) {HashNode *current = hashTable->table[i];while (current != NULL) {HashNode *next = current->next;free(current);current = next;}}
}void countKeywordsSequential(FILE *file, char *keywords[], int numKeywords, KeywordInfo keywordInfo[]) {char line[1024];rewind(file);while (fgets(line, sizeof(line), file) != NULL) {for (int i = 0; i < numKeywords; i++) {char *pos = strstr(line, keywords[i]);while (pos != NULL) {if ((pos == line || !isalpha(pos[-1])) && !isalpha(pos[strlen(keywords[i])])) {keywordInfo[i].frequency++;}pos = strstr(pos + 1, keywords[i]);}}}
}void countKeywordsHash(FILE *file, HashTable *hashTable, char *keywords[], int numKeywords, KeywordInfo keywordInfo[]) {char line[1024];rewind(file);while (fgets(line, sizeof(line), file) != NULL) {for (int i = 0; i < numKeywords; i++) {char *pos = strstr(line, keywords[i]);while (pos != NULL) {if ((pos == line || !isalpha(pos[-1])) && !isalpha(pos[strlen(keywords[i])])) {// 检查哈希表中是否已存在该关键字的节点HashNode *existingNode = searchHashTable(hashTable, keywords[i]);if (existingNode != NULL) {// 如果已存在,则更新哈希表中节点的频度existingNode->data.frequency++;} else {// 如果不存在,则插入新节点到哈希表KeywordInfo newKeywordInfo = { .frequency = 1 };strcpy(newKeywordInfo.keyword, keywords[i]);insertHashTable(hashTable, &newKeywordInfo);}// 更新数组中的频度keywordInfo[i].frequency++;}pos = strstr(pos + 1, keywords[i]);}}}
}void writeKeywordStats(FILE *outputFile, KeywordInfo keywordInfo[], int numKeywords) {for (int i = 0; i < numKeywords; i++) {fprintf(outputFile, "%s: %d\n", keywordInfo[i].keyword, keywordInfo[i].frequency);}
}void writeSortedKeywordStats(FILE *outputFile, KeywordInfo keywordInfo[], int numKeywords) {for (int i = 0; i < numKeywords; i++) {if (keywordInfo[i].frequency > 0) {fprintf(outputFile, "%s: %d\n", keywordInfo[i].keyword, keywordInfo[i].frequency / 2);}}
}void writeHashTableStats(FILE *outputFile, HashTable *hashTable, char *keywords[], int numKeywords) {for (int i = 0; i < numKeywords; i++) {HashNode *node = searchHashTable(hashTable, keywords[i]);fprintf(outputFile, "%s: %d\n", keywords[i], (node != NULL) ? node->data.frequency : 0);}
}void sortKeywords(KeywordInfo keywordInfo[], int numKeywords) {qsort(keywordInfo, numKeywords, sizeof(KeywordInfo), compareKeywords);
}int main(void) {FILE *keywordFile, *codeFile;FILE *outputFile1, *outputFile2, *outputFile3;char *keywords[MAX_KEYWORDS];int numKeywords = 0;char tempKeyword[MAX_KEYWORD_LENGTH];KeywordInfo keywordInfo[MAX_KEYWORDS];HashTable hashTable;// 打开文件keywordFile = fopen("Key.txt", "r");codeFile = fopen("InFile.txt", "r");outputFile1 = fopen("OutFile1.txt", "w");outputFile2 = fopen("OutFile2.txt", "w");outputFile3 = fopen("OutFile3.txt", "w");if (keywordFile == NULL || codeFile == NULL || outputFile1 == NULL || outputFile2 == NULL || outputFile3 == NULL) {printf("无法打开文件\n");return 1;}// 读取关键字列表while (fscanf(keywordFile, "%s", tempKeyword) != EOF && numKeywords < MAX_KEYWORDS) {keywords[numKeywords] = (char *)malloc(strlen(tempKeyword) + 1);strcpy(keywords[numKeywords], tempKeyword);numKeywords++;}// 初始化关键字信息数组for (int i = 0; i < numKeywords; i++) {strcpy(keywordInfo[i].keyword, keywords[i]);keywordInfo[i].frequency = 0;}// 初始化哈希表initializeHashTable(&hashTable);int choice;do {// 显示菜单printf("\n菜单:\n");printf("1. 顺序查找关键字并统计频度(输出到OutFile1.txt)\n");printf("2. 哈希查找关键字并统计频度(输出到OutFile2.txt)\n");printf("3. 排序关键字并输出到OutFile3.txt\n");printf("4. 退出\n");printf("请选择操作: ");scanf("%d", &choice);switch (choice) {case 1:// 顺序查找关键字并统计频度countKeywordsSequential(codeFile, keywords, numKeywords, keywordInfo);writeKeywordStats(outputFile1, keywordInfo, numKeywords);break;case 2:// 哈希查找关键字并统计频度countKeywordsHash(codeFile, &hashTable, keywords, numKeywords, keywordInfo);writeHashTableStats(outputFile2, &hashTable, keywords, numKeywords);break;case 3:// 排序关键字并输出sortKeywords(keywordInfo, numKeywords);writeSortedKeywordStats(outputFile3, keywordInfo, numKeywords);break;case 4:// 退出break;default:printf("无效的选项,请重新选择\n");break;}} while (choice != 4);// 关闭文件和释放内存fclose(keywordFile);fclose(codeFile);fclose(outputFile1);fclose(outputFile2);fclose(outputFile3);for (int i = 0; i < numKeywords; i++) {free(keywords[i]);}freeHashTable(&hashTable);return 0;
}

相关文章:

C语言实现关键字匹配算法(复制即用)

文章目录 前言功能要求运行截图全部代码 前言 无套路&#xff0c;均已上机通过&#xff0c;求个关注求个赞&#xff0c;提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中&#xff0c;请统计该文件中关键字出现的频度&#xff0c;并按此频度对关键字进行排序。要…...

【大数据】安装 Zookeeper 单机版

安装 Zookeeper 单机版 下面安装 Zookeeper&#xff0c;由于它是 Apache 的一个顶级项目&#xff0c;所以域名是 zookeeper.apache.org&#xff0c;所有 Apache 的顶级项目的官网都是以项目名 .apache.org 来命名的。 点击 Download 即可下载&#xff0c;这里我们选择的版本是 …...

Django 快速整合 Swagger:实用步骤和最佳实践

Django &#xff0c;作为 Python 编写的一个优秀的开源 Web 应用框架&#xff0c;特别适用于快速开发的团队。对于很多场景来说&#xff0c;我们需要一份 API 文档&#xff0c;好处实在太多了&#xff1a; 提高开发效率&#xff1a;开发者可以基于 API 文档 快速学习和尝试 AP…...

C++ cstdio

头文件 <cstdio> 是 C 中的标准输入输出库&#xff08;C Standard Input and Output Library&#xff09;头文件&#xff0c;它提供了一系列的输入输出函数。以下是其中一些主要的函数&#xff1a; 输入函数&#xff1a; scanf: 格式化输入函数&#xff0c;用于从标准输入…...

昇腾多卡通信教程【配置网络检测对象IP】

无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态&#xff08;本端与所配置的检测IP之间的连通状态&#xff09;&#xff0c;用户可指定上报的状态信息名称。 状态信…...

PKI 公钥基础设施,公钥私钥,信息摘要,数字签名,数字证书

PKI 公钥基础设施 https 基于 PKI 技术。PKI&#xff08;Public Key Infrastructure&#xff0c;公钥基础设施&#xff09;是一种安全体系结构&#xff0c;用于管理数字证书和密钥对&#xff0c;以确保安全的数据传输和身份验证。PKI 采用了公钥加密技术&#xff0c;其中每个实…...

企业Aspera替代方案有哪些推荐

随着企业数据量的不断增加&#xff0c;数据传输和共享成为了一个重要的问题。Aspera是一款高性能、低延迟的数据传输工具&#xff0c;但是它并不是万能的&#xff0c;随着数据量的不断增大&#xff0c;也有一些企业需要寻找Aspera的替代方案。本文将介绍三种常用的企业Aspera替…...

vue3 vuedraggable draggable element must have an item slot

vue3vite 看官网使用这种<template #item“{ element }”> <draggablev-model"myArray"start"onStart"end"onEnd":sort"false"item-key"id"draggable".item"handle".mover" ><template…...

如何缓解BOT攻击?分享灵活准确的防御之道

BOT流量在所有互联网流量中的占比过半&#xff0c;而且存在好坏之分。其中“好”的BOT&#xff0c;比如在互联网上搜索和查找内容的BOT&#xff0c;它们是我们不可或缺的帮手。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为&#xff0c;正损害着企业和用户的利益。专业数据统计…...

了解JavaScript的执行环境及作用域

一、执行环境 执行环境定义了变量或函数有权访问的其他数据&#xff0c;决定了它们的各自行为。每个执行环境都有一个与之关联的变量对象&#xff0c;环境中定义的所有变量和函数都保存在这个对象中。虽然我们无法访问这个对象&#xff0c;但是解析器在处理数据时会在后台使用它…...

嵌套调用和链式访问

嵌套调用 嵌套调用就是函数之间的互相调用&#xff0c;每个函数就是⼀个乐高零件&#xff0c;正是因为多个乐高的零件互相无缝的配合才能搭建出精美的乐高玩具&#xff0c;也正是因为函数之间有效的互相调用&#xff0c;最后写出来了相对大型的程序。 假设我们计算某年…...

DBA技术栈(二):MySQL 存储引擎

2.1 MySQL存储引擎概述 上个业余的图&#xff1a; MyISAM 存储引擎是 MySQL 默认的存储引擎&#xff0c;也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM&#xff0c;是 ISAM 的升级版本。在 MySQL最开始发行的时候是 ISAM 存…...

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…...

MySQL中的JSON数据类型计数及多张表COUNT的数据相加

1.使用场景&#xff1a;在MySQL中&#xff0c;JSON作为一种数据类型存储在表的列中。需计算键值对的数量。 2.方法&#xff1a;SELECT COUNT(chief>$.number) FROM t_projectapplication where id #{id};&#xff08;t_projectapplication&#xff1a;表&#xff1b;chief&…...

XDOJ78.机器人

标题 机器人 类别 综合 时间限制 1S 内存限制 256Kb 问题描述 机器人按照给定的指令在网格中移动&#xff0c;指令有以下四种&#xff1a; N 向北&#xff08;上&#xff09;移动 S 向南&#xff08;下&#xff09;移动 E 向东&#xff08;右&#xff09;移动 W 向西&…...

分布式系统架构设计之分布式事务的概述和面临的挑战

在当今大规模应用和服务的背景下&#xff0c;分布式系统的广泛应用已经成为了一种必然的主流趋势。然后&#xff0c;伴随着分布式系统的应用范围的增长&#xff0c;分布式事务处理成为了一个至关重要的关键话题。在传统的单体系统中&#xff0c;事务处理通常相对简单&#xff0…...

私有化部署你的甘特图协作工具

安装 首先去官网 https://zz-plan.com/deploy 下载对应的版本 arm是对应m1 m2 m3的mac amd是老的intel处理器 准备工作 安装mysql zz-plan需要依赖mysql 生成token 解压下载的压缩包 创建token./zz-plan -c 复制创建的token去获取授权码&#xff0c;点击获取免费授权码 …...

编程笔记 html5cssjs 011 HTML内连框架

编程笔记 html5&css&js 011 HTML内连框架 一、内连框架&#xff08;一&#xff09;意义&#xff08;二&#xff09;属性 二、操作注意 接下来要看一下网页内的划分。通过内连框架在当前页面嵌入一个特定内容&#xff0c;是一种特定需要。 一、内连框架 HTML 内联框架元…...

Stable Diffusion 系列教程 - 5 ControlNet

ControlNet和LORA的定位都是对大模型做微调的额外网络。作为入门SD的最后一块拼图是必须要去了解和开发的。为什么ControlNet的影响力如此的大&#xff1f;在它之前&#xff0c;基于扩散模型的AIGC是非常难以控制的&#xff0c;扩散整张图像的过程充满了随机性。这种随机性并不…...

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】 一、导出虚拟机二、导入虚拟机三、启动数据库四、使用Data Studio连接数据库 一、导出虚拟机 选择关机状态的虚拟机 -> 管理菜单 -> 导出虚拟电脑 点击完成后&#xff0c;需要等待一小段时间&#xff0c;如…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...