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语言实现关键字匹配算法(复制即用)
文章目录 前言功能要求运行截图全部代码 前言 无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中,请统计该文件中关键字出现的频度,并按此频度对关键字进行排序。要…...

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

Django 快速整合 Swagger:实用步骤和最佳实践
Django ,作为 Python 编写的一个优秀的开源 Web 应用框架,特别适用于快速开发的团队。对于很多场景来说,我们需要一份 API 文档,好处实在太多了: 提高开发效率:开发者可以基于 API 文档 快速学习和尝试 AP…...
C++ cstdio
头文件 <cstdio> 是 C 中的标准输入输出库(C Standard Input and Output Library)头文件,它提供了一系列的输入输出函数。以下是其中一些主要的函数: 输入函数: scanf: 格式化输入函数,用于从标准输入…...
昇腾多卡通信教程【配置网络检测对象IP】
无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态(本端与所配置的检测IP之间的连通状态),用户可指定上报的状态信息名称。 状态信…...
PKI 公钥基础设施,公钥私钥,信息摘要,数字签名,数字证书
PKI 公钥基础设施 https 基于 PKI 技术。PKI(Public Key Infrastructure,公钥基础设施)是一种安全体系结构,用于管理数字证书和密钥对,以确保安全的数据传输和身份验证。PKI 采用了公钥加密技术,其中每个实…...

企业Aspera替代方案有哪些推荐
随着企业数据量的不断增加,数据传输和共享成为了一个重要的问题。Aspera是一款高性能、低延迟的数据传输工具,但是它并不是万能的,随着数据量的不断增大,也有一些企业需要寻找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流量在所有互联网流量中的占比过半,而且存在好坏之分。其中“好”的BOT,比如在互联网上搜索和查找内容的BOT,它们是我们不可或缺的帮手。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为,正损害着企业和用户的利益。专业数据统计…...
了解JavaScript的执行环境及作用域
一、执行环境 执行环境定义了变量或函数有权访问的其他数据,决定了它们的各自行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。虽然我们无法访问这个对象,但是解析器在处理数据时会在后台使用它…...

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

DBA技术栈(二):MySQL 存储引擎
2.1 MySQL存储引擎概述 上个业余的图: MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一。他的前身就是我们在 MySQL 发展历程中所提到的 ISAM,是 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.使用场景:在MySQL中,JSON作为一种数据类型存储在表的列中。需计算键值对的数量。 2.方法:SELECT COUNT(chief>$.number) FROM t_projectapplication where id #{id};(t_projectapplication:表;chief&…...

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

分布式系统架构设计之分布式事务的概述和面临的挑战
在当今大规模应用和服务的背景下,分布式系统的广泛应用已经成为了一种必然的主流趋势。然后,伴随着分布式系统的应用范围的增长,分布式事务处理成为了一个至关重要的关键话题。在传统的单体系统中,事务处理通常相对简单࿰…...

私有化部署你的甘特图协作工具
安装 首先去官网 https://zz-plan.com/deploy 下载对应的版本 arm是对应m1 m2 m3的mac amd是老的intel处理器 准备工作 安装mysql zz-plan需要依赖mysql 生成token 解压下载的压缩包 创建token./zz-plan -c 复制创建的token去获取授权码,点击获取免费授权码 …...
编程笔记 html5cssjs 011 HTML内连框架
编程笔记 html5&css&js 011 HTML内连框架 一、内连框架(一)意义(二)属性 二、操作注意 接下来要看一下网页内的划分。通过内连框架在当前页面嵌入一个特定内容,是一种特定需要。 一、内连框架 HTML 内联框架元…...

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

【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】
【导出与导入Virtualbox虚拟机和启动连接openGauss数据库】 一、导出虚拟机二、导入虚拟机三、启动数据库四、使用Data Studio连接数据库 一、导出虚拟机 选择关机状态的虚拟机 -> 管理菜单 -> 导出虚拟电脑 点击完成后,需要等待一小段时间,如…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...