简单的关键词查找实验(基于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技术在越来越多的企业当中得到运用.为了降低在设计生产中的成本,缩短设计周期,增强企业竞争力,三维参数化技术随之应声,它凭借更贴近现代概念的设计以及 ...
随机推荐
- JDK的下载与安装-环境变量的配置
JDK的下载与安装 环境变量的配置 配置环境变量作用 开发Java程序,需要使用JDK中提供的工具,工具在JDK9安装目录的 bin 目录下. 在DOS命令行下使用这些工具,就要先进入到JDK的bin ...
- VUE 轮询、轮询终止 beforeRouteLeave
目录 1 在data中定义 2 在methods中定义 3 开始轮询 4 终止轮询 方法一: destroyed() 方法二:beforeRouteLeave(to, from, next) 推荐 所 ...
- Windows性能监控工具Perfmon的使用、性能指标分析
Fighting_001 关注 0.1 2018.08.25 22:18* 字数 1488 阅读 7604评论 0喜欢 4 目录结构 一.Perfmon简介.性能监控指标.性能对象指标 1.常用的性 ...
- 力扣---2319. 判断矩阵是否是一个 X 矩阵
如果一个正方形矩阵满足下述 全部 条件,则称之为一个 X 矩阵 : 矩阵对角线上的所有元素都 不是 0 矩阵中所有其他元素都是 0给你一个大小为 n x n 的二维整数数组 grid ,表 ...
- Python核对遥感影像批量下载情况的方法
本文介绍批量下载遥感影像时,利用Python实现已下载影像文件的核对,并自动生成未下载影像的下载链接列表的方法. 批量下载大量遥感影像数据对于GIS学生与从业人员可谓十分常见.然而,对于动辄成 ...
- CSS动画,盒子爬坡源码
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 云小课|MRS数据分析-通过Spark Streaming作业消费Kafka数据
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Spark Str ...
- 与 Flutter 共创未来 | Flutter Forward 活动精彩回顾
作者 / Google 开发者框架和语言 (含 Flutter.Dart 和 Go) 产品经理 & 用户体验总监 Tim Sneath 我们很高兴可以在 Flutter Forward 活动 ...
- 网关与网络地址(网络号)以及IP地址、广播地址
转载新浪博客: http://blog.sina.com.cn/s/blog_406127500101i8bp.html
- xampp修改mysql数据库密码(测试成功)
转载: http://www.360doc.com/content/17/0608/14/8797027_661063783.shtml ------------------------------- ...