简单的关键词查找实验(基于C语言)
准备
书名数据库的阵列表示
| 关键字 |
|
||||||
| B1 | B2 | B3 | B4 | B5 | B6 | B7 | |
| algebra | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| application | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
| elementary | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| linear | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
| matrix | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| theory | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
table { margin: auto }
- B1. Applied Linear Algebra
- B2. Elementary Linear Algebra
- B3. Elementary Linear Algebra with Applications
- B4. Linear Algebra and Its Applications
- B5. Linear Algebra with Applications
- B6. Matrix Algebra with Applications
- B7. Matrix Theory
编写代码
- 原本是准备了500本txt小说作为数据库书目的,如果这样就得自己在确定关键词,和把这500本小说名通过关键词组成一个数据库阵列,而且对于中文来说,还得考虑编码问题和文件操作问题,真要这样,从我个人能力来估计,费老大功夫还不一定实现,所以干脆简单点,直接照着线代书上的阵列抄了_。
- 关键词库
unsigned char *key_database[]={
"algebra",\
"application",\
"elementary",\
"linear",\
"matrix",\
"theory"
};
- 书目库
unsigned char B1[]="Applied Linear Algebra";
unsigned char B2[]="Elementary Linear Algebra";
unsigned char B3[]="Elementary Linear Algebra with Applications";
unsigned char B4[]="Linear Algebra and Its Applications";
unsigned char B5[]="Linear Algebra with Applications";
unsigned char B6[]="Matrix Algebra with Applications";
unsigned char B7[]="Matrix Theory";
unsigned char *book_database[]={B1,B2,B3,B4,B5,B6,B7};
- 数据库阵列
unsigned char database_matrix[7][6]={\
1,1,0,1,0,0,\
1,0,1,1,0,0,\
1,1,1,1,0,0,\
1,1,0,1,0,0,\
1,1,0,1,0,0,\
1,1,0,0,1,0,\
0,0,0,0,1,1
};
- 要做这个实验之前,首先得确定数据库阵列,行代表书名中包含的关键词的向量,1表示包含,0表示不包含。而我们要做的就是把搜索向量与行向量比较,并且统计出现关键词的次数,然后包含次数多的书靠前显示。
- main.c
#include <stdio.h>
#include <stdlib.h>
#include "init_db.h" //初始化数据库头文件
#include <string.h>
#define CASE_SENSITIVE 0 //区分大小写
#define CASE_INSENSITIVE 1 //不区分大小写
void str_all_lowercase(unsigned char *str);//字符串小写化函数
char str_cmp_sensitive(unsigned char str1[],unsigned char str2[],unsigned char options);//可选区分比较字符串函数
void keywords_to_vector(char argc,char *argv[],unsigned char *key_vector);//关键词转搜索向量函数
void search_database(unsigned char key_vector[],unsigned char res_vector[]);//搜索数据库函数
void sort_search_res(unsigned char res_vector[],unsigned char sort_res_vector[]);//排列搜索结果函数
void main(int argc,char *argv[]){//参数:搜索关键词
char book_count=0,i,j;
unsigned char key_vector[KEYWORD_NUM]={0};//关键词向量->搜索向量
unsigned char res_vector[BOOK_NUM]={0};//结果向量
unsigned char sort_res_vector[BOOK_NUM]={0};//排序的位置向量
if(argc>=2){
keywords_to_vector(argc,argv,key_vector);//获取搜索向量
search_database(key_vector,res_vector);//得到结果向量
for(i=0;i<BOOK_NUM;i++) sort_res_vector[i]=i;//生成位置向量
sort_search_res(res_vector,sort_res_vector);//对结果向量进行排序,使得符合搜索的书名靠前
for(i=0;i<BOOK_NUM;i++){
if(res_vector[i]!=0){
book_count++;
printf("book%d:%s---%d\n",i+1,book_database[sort_res_vector[i]],res_vector[i]);
}
}
printf("%d books found in total\n",book_count);
}
else{
printf("no arguments\n");
}
}
- 关键词转搜索向量函数
void keywords_to_vector(char argc,char *argv[],unsigned char *key_vector){
char *tmp,i,j;
for(i=1;i<argc;i++){
tmp=argv[i];
for(j=0;j<KEYWORD_NUM;j++){
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:key_vector[j]);
}
}
}
- 搜索数据库函数
void search_database(unsigned char key_vector[],unsigned char res_vector[]){
unsigned char i,j;
unsigned char *tmp;
for(i=0;i<BOOK_NUM;i++){
tmp=database_matrix[i];
for(j=0;j<KEYWORD_NUM;j++){
res_vector[i]+=((tmp[j]==key_vector[j])?tmp[j]:0);
}
}
}
- 排列搜索结果函数
void sort_search_res(unsigned char res_vector[],unsigned char sort_res_vector[]){
unsigned char i,j,tmp;
for(i=0;i<BOOK_NUM;i++){
for(j=BOOK_NUM-1;j>i;j--){
if(res_vector[j]>res_vector[j-1]){
tmp=res_vector[j-1];
res_vector[j-1]=res_vector[j];
res_vector[j]=tmp;
tmp=sort_res_vector[j-1];
sort_res_vector[j-1]=sort_res_vector[j];
sort_res_vector[j]=tmp;
}
}
}
}
调试过程
低级错误
在函数str_all_lowercase中有两处低级错误一个是数组的位移变量i没有做++操作导致死循环在那里,然后在判断是否大写的时候用的是逻辑或||运算,而正确的是逻辑与&&运算。逻辑错误
在函数keywords_to_vector中的
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:key_vector[j]);这里
原本我是这样写的
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:0;
这就导致把我每一次对比关键词的时候都会破坏上一次比较的结果,所以把0改为key_vector[j]后就可以保持上一次结果不变。
在函数search_database中的
res_vector[i]+=((tmp[j]==key_vector[j])?tmp[j]:0);
原本我是这样写的
res_vector[i]+=((tmp[j]==key_vector[j])?1:0);
这就导致只要我的搜索向量和数据库阵列比较结果一致时就会在结果向量上加一,这就导致同为0时,即书名不包含的关键词,同时搜索向量也不包含时,结果向量还要加1,所以最后把1改为tmp[j],即可当同时不包含关键词时结果向量加的是0。
运行结果

小结
其实这样的实验老早就想要做了,我说这样的实验是指,把数学应用通过编程的手段来表达的实验,或者更深一层次,我想用编程来学习数学,像是线代,微积分这些。老实说,我数学真的是垃圾,匆匆20+年,感觉连门把手都够不着,很急,非常急,急出心理变态了,急出生理病变了,老子tmd什么时候能进入数学的殿堂,什么时候能tmd玩弄数学于股掌之间,tmd什么时候能会应用数学啊,啊啊啊。我现在只能另辟蹊径,寻找一些应用的机会,除了这样,我无计可施,因为我无法面对深奥的书本,无法面对难懂的公式,更无法面对乱入的定理和结论。我也想造原子弹,我也想玩加速器,我也tmd想搞量子力学和人工智能,还tmd想如果给关二爷上香有用的话,那我铁定天天给毕达哥拉斯磕头,我甚至还tmd想长生不老,能让我等到打一针就能智商300的药,梦一场就能贯通古今的觉,如果有人做这样的实验,请立即叫上我,我也这能通过这种方式了,真卑微啊,这样一想我还真是一个彻彻底底的,真真切切的变态啊,哎,艹了,就当是一个渣人的本愿吧。
简单的关键词查找实验(基于C语言)的更多相关文章
- 实验报告系列:实验一 HTML语言的简单网页制作
实验一 HTML语言的简单网页制作 一.实验目的: 1.掌握常用的HTML语言标记: 2.利用文本编辑器建立HTML文档,制作简单网页. 3.学习将其它格式的文档转换成HTML格式的文档 二.实验内容 ...
- Kcptun 是一个非常简单和快速的,基于KCP 协议的UDP 隧道,它可以将TCP 流转换为KCP+UDP 流
本博客曾经发布了通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度.Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户:而 ...
- selenium2自动化测试实战--基于Python语言
自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...
- 关于《selenium2自动测试实战--基于Python语言》
关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...
- Gogs - 基于 Go 语言的自助 Git 服务
Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务.Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...
- Ggoogle Protocol Buffer的使用 (基于C++语言)
首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...
- 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
基于python语言的tensorflow的‘端到端’的字符型验证码识别 1 Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...
- 基于R语言的时间序列指数模型
时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...
- JFinal -基于Java 语言的MVC极速 web 开发框架
JFinal概述 JFinal 是基于Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再 ...
- 基于VB语言对SolidWorks参数化设计的二次开发
0 引言 随着数字信息化进程的快速推进,如今三维CAD技术在越来越多的企业当中得到运用.为了降低在设计生产中的成本,缩短设计周期,增强企业竞争力,三维参数化技术随之应声,它凭借更贴近现代概念的设计以及 ...
随机推荐
- C#实现聊天消息渲染、图文混排(支持Windows、Linux)
在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图.引用消息.撤回消息.名片等不同样式的消息渲染时,就更加麻烦了. 好在我们可以使用 ESFramework 提供的 ...
- 插入排序(CSP-J 2021 T2)
题目:(由于题干过长直接上链接:P7910 [CSP-J 2021] 插入排序 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)) 不是打广告 又有一个新思路: 我们可以再开一个b数组 ...
- spring-in-action-day05-REST
1.创建RESTFUL端点 (1)创建get端点 (2)创建post端点 (3)创建put/patch端点 (4)创建delete端点 2.启用超媒体 3.消费REST端点 3.1使用RestTemp ...
- 微服务学习计划——SpringCloud
微服务学习计划--SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服务的要求也越来 ...
- 自抗扰(ADRC)控制原理及控制器设计
https://blog.csdn.net/weixin_43487974/article/details/127163824?spm=1001.2101.3001.6650.2&utm_me ...
- UEFI引导安装UBUNUT
1.引导方式一定要选UEFI,否则一些显卡驱动将不能安装 2.安装的时候,要在第四个界面,也就是选择覆盖安装还是保留双系统的那个界面,选择其他,一定要自己分区 3.分区: 4.一共5个重要分区: 1. ...
- Rigol DSA815频谱仪在合肥光源工作点测量系统中的应用
发的这篇文,我只是搬运工,读者切记. 合肥光源工作点测量系统已实现BBQ无激励在线测量,还是前些年永良师弟在这的时候调试成功的,并和超才把安捷伦的一台频谱仪和普源的DSA815的IOC调试成功,不过在 ...
- Python绘制神经网络模型图
本文介绍基于Python语言,对神经网络模型的结构进行可视化绘图的方法. 最近需要进行神经网络结构模型的可视化绘图工作.查阅多种方法后,看到很多方法都比较麻烦,例如单纯利用graphviz模块 ...
- C语言补漏--内存管理-完结
1.内存分布 2.内存操作函数 数组清空 2. 内存拷贝函数 数组拷贝 3.内存对比 总结 堆区开辟 内存泄漏只申请不释放,导致内存空间持续增长,导致推出 内存污染向没有申请的内存空间写数据 向堆区 ...
- 郁金香 对MFC 编辑框的查看 与更改
非常简单,本来想写一个带窗口的DLL注入工具 但是进程句柄可以拿到,但是好像开辟不了空间 注入DLL进不去 不知道怎么回事 这个问题,日后解决