一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐。
6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口。
1 /**************函数接口定义************************/ 2 /*统计文件中单词数量,返回单词数量*/ 3 int statWordCount(char *filaename); 4 /*加载文本词库文件*/ 5 void loadTextFile(char *filename); 6 /*加载二进制词库文件*/ 7 void loadBinFile(char *filename); 8 /*为长度为len的结构体数组分配内存*/ 9 void mallocForSArra(int len); 10 /*创建并初始化词库结构体数组*/ 11 void createInitArray(); 12 13 /*对结构体dict数组进行排序,使用插入排序*/ 14 void sortStructArr(SWORD * dict); 15 /*输入模块,返回输入字符串*/ 16 char *getInput(char *p); 17 /*输出模块,输出一个结构体*/ 18 void setOutput(SWORD *word); 19 /*查询模块,根据关键词key在词库里查询,找到返回指向这个结构体的指针,否则返回NULL*/ 20 SWORD *searchWord(char *key); 21 /*从输入获取要添加的单词*/ 22 SWORD getWord(); 23 /*添加单词word到结构体数组*/ 24 void addWordToArr(SWORD *word); 25 /*保存词库结构数组到文件*/ 26 void saveWord(char *filename,SWORD *sw); 27 /*生成二进制的词库文件*/ 28 void createBinFile(SWORD *word); 29 /*计算一个字符串里某个ch字符的个数*/ 30 int calcNumber(char *str,char ch); 31 /*从字符串str中取出字符ch后面的字符串*/ 32 char *rearstr(char *str, char ch,int *pos); 33 /*比较两个SWORD单词的大小,前一个大于后一个返回1,前一个小于后一个返回-1,前一个等于后一个返回0*/ 34 int wordcmp(SWORD wordf, SWORD wordr); 35 /*创建并初始化二进制加载文件对应的的数组*/ 36 void createInitBinArr(FILE *F); 37 38 /*查询模块函数*/ 39 void searchModel(); 40 /*添加单词模块函数*/ 41 void addWordModel();
7.这一步就要搭建程序主流框架,即main函数,代码如下:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include "dict.h" 3 /*********定义常用全局变量*****************/ 4 /* 5 6 /*********结构体指针,指向词库结构体数组******/ 7 SWORD * DICT = NULL; 8 9 /************词库数量,结构体数组长度***************/ 10 int LEN = 0; 11 12 13 /***********文本词库文件名*********************/ 14 char *dicttxtname = "dict.txt"; 15 /***********二进制词库文件名*********************/ 16 char *dictbitname = "dict.dat"; 17 18 19 void main() 20 { 21 22 char mode[100]; 23 printf("提示:输入-text选择文本词库,输入-bin选择二进制词库,输入exit退出程序\n"); 24 printf("请选择要加载的文件:"); 25 26 A: scanf("%s", &mode); 27 28 if (strcmp(mode, "-text")==0)//加载文本词库 29 { 30 printf("%s\n", mode); 31 loadTextFile(dicttxtname);//加载文本词库 32 if (DICT == NULL)//加载失败 33 return; 34 35 sortStructArr(DICT);//对结构体数组按关键字key进行字典排序 36 37 //开始查询 38 D: searchModel(); 39 40 //保存添加前的词库末尾位置 41 SWORD *rpos = DICT + LEN - 1; 42 43 //添加模块 44 addWordModel(); 45 46 47 C: printf("是否保存词库数组到文件(输入Q退出程序):Y/N/Q?\n"); 48 char yesorno = getchar(); 49 50 if (yesorno == 'Y') 51 { 52 saveWord(dicttxtname,rpos);/*保存词库结构数组到文件*/ 53 goto D; 54 } 55 else if (yesorno == 'Q') 56 { 57 return;//结束 58 } 59 else if (yesorno == 'N') 60 { 61 goto D; 62 } 63 else 64 { 65 goto C; 66 } 67 68 69 70 71 } 72 else if (strcmp(mode, "-bin")==0)//加载二进制词库 73 { 74 75 printf("选择建立二进制文件(选择建立输入create,选择加载输入load):"); 76 77 B: scanf("%s", &mode); 78 if (strcmp(mode, "load") == 0) 79 { 80 loadBinFile(dictbitname);//加载二进制文件 81 if (DICT == NULL)//加载失败 82 return; 83 84 goto D;//加载完了去查询 85 86 } 87 else if (strcmp(mode, "create") == 0) 88 { 89 loadTextFile(dicttxtname);//加载文本词库 90 if (DICT == NULL)//加载失败 91 return; 92 93 sortStructArr(DICT);//排序 94 createBinFile(DICT);//生成二进制词库 95 96 goto D;//去查询 97 } 98 else 99 { 100 printf("\n您的输入有误,请重新输入:"); 101 goto B; 102 } 103 104 105 } 106 else if (strcmp(mode, "exit") == 0) 107 { 108 return;//退出程序 109 } 110 else//处理错误输入 111 { 112 printf("您的输入有误,请重新输入:"); 113 goto A; 114 } 115 116 }
8.函数接口实现,由于这一步代码较多,所以放在第三部曲中。
9.函数接口测试本人已经测试过了,结果就不在这贴了。
10.运行效果见下面三张图
-bin
-text
需要程序源码的可以加我微信x241602私聊。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?