简单的关键词查找实验(基于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技术在越来越多的企业当中得到运用.为了降低在设计生产中的成本,缩短设计周期,增强企业竞争力,三维参数化技术随之应声,它凭借更贴近现代概念的设计以及 ...
随机推荐
- Node.js+Koa2+TypeScript技术概览
最近几年一直使用Node.js作为后端服务平台,通过Koa2框架中间件快速搭建Web服务,但是使用JavaScript开发大型后端服务时会使程序变得难以维护,继而使用TypeScript语言开发,使编 ...
- Node.js学习笔记----day03
认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.Node中的模块系统 使用Node编写应用程序主要就是在使用 EcmaScript 和浏览器不一样的是,在Node中没有BOM.DOM 核 ...
- SQLSERVER 的 truncate 和 delete 有区别吗?
一:背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 ,这是一个很有意思的话题,本篇我就试着来回答一下,如果下次大家遇到这类问题,我的答案应该可以帮 ...
- JAVA虚拟机07-垃圾回收-分代收集理论和垃圾收集算法
1.分代收集理论 1.1分代收集理论假说 1.2分代收集理论奠定的垃圾收集器原则 1.3基于分代收集理论的内存划分-跨代引用假说 2.垃圾回收 3.垃圾收集算法 3.1标记-清除算法 3.2标记-复制 ...
- 随机森林RF模型超参数的优化:Python实现
本文介绍基于Python的随机森林(Random Forest,RF)回归代码,以及模型超参数(包括决策树个数与最大深度.最小分离样本数.最小叶子节点样本数.最大分离特征数等)自动优化的代码. ...
- Jpbc哈希函数如何实现
1.(0,1)→Element元素 在Jpbc库中存在两个方法 Element A=G1.newRandomElement();A.setFromBytes(arr,0,arr.length);//A ...
- C++ 练习7 引用作为函数返回值
当引用作为函数的返回值时,可以直接将其当作赋值语句的左值使用 如:函数refValue(int& x)可以像 a=10 中的"a"来使用 1 #include <io ...
- 勇者sky遇上的命中注定的恋人白羽竟然是妹妹2
题目大意 构造一个分段函数来拟合若干点(\(x_i , y_i\)),每一段是一个常函数,即 \[f(x)= \left \{ \begin{aligned} a_1& & (0\le ...
- JZOJ 2645. 【NOIP2011模拟11.1】钓鱼
题面 分析 状压 \(dp\) 直接上啊! 设 \(f_{t,S,pos}\) 表示 \(t\) 这个时刻之前能钓到的最多的鱼的数量 那么当前为可以钓鱼也可以移动 于是一切都明朗了 \(Code\) ...
- 不借助脚手架手动搭建react项目(webpack5 + Antd4 + React18)
前言 工作中发现很多同事在接到一个新项目时,总是基于现有项目复制一份配置文件,然后写自己的组件及业务代码,以至于项目中存在一些冗余的依赖及配置信息.并且由于已有项目的依赖包及插件比较老,新项目也一直没 ...