简单的关键词查找实验(基于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
  • 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本小说名通过关键词组成一个数据库阵列,而且对于中文来说,还得考虑编码问题和文件操作问题,真要这样,从我个人能力来估计,费老大功夫还不一定实现,所以干脆简单点,直接照着线代书上的阵列抄了_
  1. 关键词库
unsigned char *key_database[]={
    "algebra",\
    "application",\
    "elementary",\
    "linear",\
    "matrix",\
    "theory"
};
  1. 书目库
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};
  1. 数据库阵列
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表示不包含。而我们要做的就是把搜索向量与行向量比较,并且统计出现关键词的次数,然后包含次数多的书靠前显示。
  1. 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的药,梦一场就能贯通古今的觉,如果有人做这样的实验,请立即叫上我,我也这能通过这种方式了,真卑微啊,这样一想我还真是一个彻彻底底的,真真切切的变态啊,哎,艹了,就当是一个渣人的本愿吧。

posted @ 2022-07-09 18:40  pie_thn  阅读(158)  评论(0编辑  收藏  举报