资源描述
C语言高级编程技术课程设计汇报
电子词典设计
指导老师:
班 级:
姓 名:
目录
一、课程设计要求—————————————————————————————- 1 -
二、可行性分析———————————————————————————————- 1 -
三、需求分析————————————————————————————————- 2 -
(1)程序功效———————————————————————————- 2 -
(2)输入输出要求—————————————————————————- 2 -
四、概要设计和具体设计———————————————————————————- 2 -
4.1模块分块——————————————————————————————- 2 -
4.1.1 打印菜单子函数print_menu——————————————————- 2 -
4.1.2 解析输入要求子函数analysis_cmd—————————-—————-- 2 -
4.1.3 打开电子英汉词典(文件)子函数open_dict————-——————- 2 -
4.1.4 查找单词子函数find_word——————————————————-- 2 -
4.1.5 添加单词子函数add_word——————————————————-- 2 -
4.1.6 删除单词子函数delete_word————————————————-— - 2 -
4.1.7 修改单词子函数modify_word—————————————————- 3 -
4.1.8 保留单词子函数save_word—————————————————— - 3 -
4.1.9 帮助单词子函数help———————————-—————————-- 3 -
4.1.10 释放单词子函数free_dict—————————————————--—- 3 -
4.1.11 主程序——————————————————————————-—- 3 -
4.2 实现功效———————————————————————-——————-- 3 -
4.3 各模块步骤图—————————————————————-——————-- 3 -
五、编码实现—————————————————————-————————-——- 3-
5.1 主函数和头文件定义—————————————————————————- 3 -
5.1.1 子函数申明—————————————————-————————- 4 -
5.1.2开始菜单和解析编写—————————————-———————-- 6 -
5.1.3 头文件定义—————————————————————-————- 5 -
5.2 各个模块实现—————————————-—————————————- 7 -
5.2.1 查找模块—————————————-—————————————-- 7 -
5.2.2 删除模块—————————————-—————————————-- 8 -
5.2.3 添加模块—————————————-————————————-—- 9-
5.2.4 修改模块—————————————-—————————————- 10-
六、系统调试—————————————-—————————————————-- 14 -
6.1系统调用文件存放位置————-——————————————————- 14-
6.2 子函数调用调试————————-—————————————————-14-
6.2.1 程序开始运行界面————-—————————————————- 14 -
6.2.2 查找函数调用界面————-—————————————————- 15 -
6.2.3 删除函数调用界面——-———————————————————- 15 -
6.2.5 检验单词是否被删除界面—-—————————————————- 16 -
6.2.6 添加函数调用界面————-—————————————————- 16-
6.2.7 检验单词是否添加界面——-—————————————————- 16 -
6.2.8修改函数调用界面——-———————————————————- 17 -
6.2.9 确定修改单词界面——-———————————————————- 17 -
七、总结归纳—————————————-——————————————————- 17 -
附录:源程序代码—————————————-————————————————- 18 -
一、课程设计要求
1、全方面熟悉、掌握c语言基础知识,增强对不一样问题利用和灵活选择适宜数据结构,熟悉编制和调试程序技巧,掌握分析结果若干有效方法,深入提升上机动手能力,培养使用计算机处理实际问题能力,养成提供文档资料习惯和规范编程思想。
2、英汉词典:
以课上分发“dict.txt”文件为词典文件为基础,程序能够实现完成“输出所输入英文单词汉字解释”也就是“英汉词典条目标查找”基础功效,还能够实现“英汉词典条目标增加”即增加所输入单词到文件中并添加汉字注释、“英汉词典条目标删除”即删除所输入单词及其汉字注释、“英汉词典条目标修改”即修改原本存在单词英语拼写功效。
功效描述:
在计算机中建立有限规模电子英汉词典,利用程序实现电子英汉词典查找、增词、删除、修改和维护工作。
1、词典内容为:每行对应一个词条,每个词条由两个字符串组成,字符串用若干空格符分开,前一个是单词字符串,后一个是释义字符串,使用分号作为多个释义分隔符。
2、采取菜单工作方法。在一个操作实施以后,程序问询是否继续实施该操作,假如继续查询,则直接输入你所需要查询单词 ,若想要进行其它功效使用便需要根据提醒输入结束功效是所需输入字符,以后再输入你想要使用功效序号,然后进行程序下一步运行。
3、要求整体设计以人为本,用户界面简练美观。
测试数据:以老师所给词库为准。
二、 可行性分析
本课程关键完成时候字典查询、修改、添加、删除等功效,从而我选择方案是采取结构体和模块化方法去实现,每一个功效全部被我细分到了不一样模块中,然后依据菜单要求输入不一样由“解析选项”子函数来调用不一样子函数,来达成实现不一样功效之间转换,而主函数起到一个汇总调用功效。
三、需求分析
(1)程序功效
英汉词典作为一个常见学习工具,是我们常常要使用。此程序能完成一个简单电子英汉词典功效,如:单词查找、增词、删除、修改和维护刷新等工作。在计算机中建立有限规模电子英汉词典(文件),利用程序实现电子英汉词典查找、增词、删除、修改和维护工作。词典内容为:每行对应一个词条,每个词条由两个字符串组成,字符串用若干空格符分开;前一个是单词字符串(英文),后一个是释义字符串(汉字),使用分号作为多个释义分隔符。
且在程序中能够实现对于电子英汉词典(文件)当中内容添加单词,删除单词和修改英语单词功效。
(2)输入输出要求
采取菜单工作方法。在程序开始运行时候便会有一个菜单出现,菜单中对于程序中能够实现功效全部逐一编号,当你想使用其中某一项功效时,只需将此功效前编输入,再按enter键便可使用该功效,若需要退出目前功效时,只需将推出字符输入再按enter键,便可重新出现菜单以供选择其它功效。
要求整个设计以人为本,用户界面友好。
四、概要设计和具体设计
4.1 程序分块
4.1.1 打印菜单子函数print_menu,在程序开始运行以后,此函数便开始工作,在界面出现,方便我们在使用此程序时能够愈加方便快捷,使程序功效使用愈加方便快捷。
4.1.2 解析输入要求子函数analysis_cmd,此函数是分析我们在键盘上输入数字,根据数调用对应子函数工作。
4.1.3 打开电子英汉词典(文件)子函数open_dict,此函数是用于打开和调用电子英汉词典(文件)。
4.1.4 查找单词子函数find_word,此程序是用于查询我们从键盘输入单词,并显示其汉字注释。
4.1.5 添加单词子函数add_word,此程序是用于添加我们从键盘输入单词,并存入其汉字注释。
4.1.6 删除单词子函数delete_word,此程序是用于删除我们从键盘输入单词,并删除其汉字注释。
4.1.7 修改单词子函数modify_word,此程序是用于修改电子英汉词典(文件)中存在英文单词拼写。
4.1.8 保留单词子函数save_word,此程序是用于保留我们在打开程序后对于电子英汉词典(文件)添加、删除或修改操作。
4.1.9 帮助单词子函数help,此程序是用于当我们操作过多时清屏函数。
4.1.10 释放单词子函数free_dict,此程序是用于释放我们在操作中多出单词函数。
4.1.11 主程序对于上述函数使用做存贮。
4.2、实现功效:
系统功效分析:本系统能够查询,修改,删除,增加词条,和退出词典。
4.3 各模块步骤图
3.删除单词
4.修改单词
5.保留单词
7.退出
1.查找单词
功效序号选择
打印菜单
主函数
2.增加单词
6.帮助
助
五、编码实现
5.1、主函数和头文件定义
5.1.1 子函数申明
struct Node
{
char * key;
char * context;
pNode next;
};
static pNode head = NULL;
static bool save_flag = true; //true说明已经保留 false未保留
void print_menu(); //打印菜单
void analysis_cmd(char c); //解析选项
void create_dict(FILE * file); //创建字典链表
void open_dict(); //打开字典文件
void find_word(); //查找单词
void delete_word(); //删除单词
void modify_word(); //修改单词
void save_word(); //保留单词
void help(); //帮助
void free_dict(); //释放
void print_dict(); //打印
5.1.2开始菜单和解析编写
void print_menu()
{
printf("=========================\n");
printf("| 1. 查找单词\t\t|\n");
printf("| 2. 增加单词\t\t|\n");
printf("| 3. 删除单词\t\t|\n");
printf("| 4. 修改单词\t\t|\n");
printf("| 5. 保留单词\t\t|\n");
printf("| 6. 帮助\t\t|\n");
printf("| 7. 退出\t\t|\n");
printf("=========================\n");
}
//输入命令函数
char get_command()
{
char cmd;
printf("\n\n请选择你需要功效:");
scanf("%c", &cmd);
printf("\n");
while (cmd < '1' || cmd > '9') //假如输入选项不是1-9,重新输入
{
printf("您输入选项不正确\n请输入正确选择 : ");
scanf("%c", &cmd);
printf("\n");
}
return cmd;
}
//解析输入命令函数
void analysis_cmd(char c)
{
switch(c)
{
case '1':
find_word();
break;
case '2':
add_word();
break;
case '3':
delete_word();
break;
case '4':
modify_word();
break;
case '5':
save_word();
break;
case '6':
help();
break;
case '7':
if (!save_flag)
save_word();
free_dict();
exit(0);
break;
default:
printf("请输入正确选择\n");
break;
}
}
5.1.3头文件定义
#include <stdio.h> //C语言头文件函数
#include <stdlib.h> //分配内存函数
#include <string.h> //字符函数
#define DICT_EN "dict en.txt"
5.2各个模块实现
5.2.1查找模块
//查找单词操作
void find_word()
{
char word[100] = {0};
do
{
printf("\n\n请输入你要查找单词[结束查找输入-f]:\n");
scanf("%s", word); //输入你要查找单词
if (!strcmp(word, "-f")) //输入为-f表示要退出查找
{
fflush(stdin); //刷新缓冲区(退出前要刷新缓冲区)
break;
}
bool flag = false; //是否查找到标志位
pNode p = head;
while (p->next != NULL) //遍历链表
{
if (!strcmp(p->key, word)) //假如改节点key是你要输入要查找单词,打印输出,并置位标志位
{
printf("%s\n", p->context);
flag = true; //置位标志位
break;
}
p = p->next; //假如该节点不是你要查单词,进入下一个节点
}
if (!flag) //假如标志位未被置位(false),则提醒未找到。
printf("not found.\n");
}while(1);
}
5.2.2删除模块
//删除单词
void delete_word()
{
char key[100] = {0};
bool flag = false;//是否删除成功 false表示未删除成功或不存在,true表示删除成功、
do
{
printf("输入-d退出删除.\n");
printf("\n\n请输入你要删除单词:\n");
scanf("%s", key);
if (!strcmp(key, "-d"))
{
fflush(stdin); //刷新缓冲区
break;
}
if (key == NULL)
{
printf("输入有误,请重新输入。\n");
continue;
}
pNode p = head;
while (p->next != NULL)
{
if (!strcmp(p->key, key)) //存在就删除
{
if (p->key != NULL) //释放建立链表时候创建空间
free(p->key);
if (p->context != NULL)
free(p->context);
free(p);
printf("单词%s已经被删除.\n", key);
flag = true;
break;
}
p = p->next;
}
}while(1);
if (flag)
save_flag = false;
}
5.2.3添加模块
//添加单词
void add_word()
{
char key[100] = {0}; //保留要添加单词本身数组
char context[100] = {0}; //保留要添加单词词义数组
bool flag = false; //是否添加成功 false表示未添加成功,true表示添加成功
do
{
printf("输入-a退出添加.\n");
printf("\n\n请输入你要添加单词:\n");
scanf("%s", key); //输入要添加单词本身
if (!strcmp(key, "-a")) //假如输入为-a,则刷新缓冲区,并退出添加功效。
{
fflush(stdin); //刷新缓冲区
break;
}
printf("\n\n请输入你要添加单词词义:\n");
scanf("%s", context); //输入要添加单词词义
if (key == NULL || context == NULL) //检测,假如输入单词本身或词义为空,则提醒有误。
{
printf("输入有误,请重新输入。\n");
continue;
}
pNode p = head; //用p统计链表头,用于遍历链表使用
while (p->next != NULL) //链表遍历循环
{if (!strcmp(p->key, key))
//假如要添加单词在词库中存在,则提醒存在,不能添加成功。
{
printf("您添加单词在字库中已存在,请重新输入。\n");
break;
}
else
{ //查找链表中适宜位置,添加单词
if (strcmp(p->key, key) < 0 && strcmp(p->next->key, key) > 0)
{
pNode temp = (pNode)malloc(sizeof(Node));
memset(temp, 0, sizeof(temp));
int len = strlen(key)+1;
temp->key = (char *)malloc(len);
memset(temp->key, 0, len);
memcpy(temp->key, key, len);
temp->key[len-1] = '\0';
len = strlen(context)+1;
temp->context = (char *)malloc(len);
memset(temp->context, 0, len);
memcpy(temp->context, context, len);
temp->context[len-1] = '\0';
temp->next = p->next; //添加单词操作
p->next = temp;
printf("%s添加成功\n");
flag = true;
break;
}
p = p->next;
}
}
}while(1);
if (flag) //链表是否有更新标志,假如有更新,则清空save_flag标志位
save_flag = false;
}
5.2.4修改模块
//修改单词
void modify_word()
{
char key[100] = {0};
char context[100] = {0};
bool flag = false; //是否修改成功 false表示未修改成功或不存在,true表示修改成功、
do
{
printf("输入-m退出删除.\n");
printf("\n\n请输入你要修改单词:\n");
scanf("%s", key);
if (!strcmp(key, "-m"))
{
fflush(stdin); //刷新缓冲区
break;
}
if (key == NULL)
{
printf("输入有误,请重新输入。\n");
continue;
}
pNode p = head;
while (p->next != NULL)
{
if (!strcmp(p->key, key)) //假如要修改单词存在,则修改
{
printf("%s词义是%s\n", p->key, p->context);
printf("请输入要修改词义: ");
scanf("%s", context);
int len = strlen(context)+1;
memcpy(p->context, context, len);
p->context[len-1] = '\0';
printf("修改成功.\n");
flag = true;
break;
}
}
}while(1);
if (flag)
save_flag = false;
}
六、系统调试
调用词典文件
6.1系统调用文件存放位置
词典文件放置位置和程序在同一文件夹中,这么能够方便程序调用
6.2子函数调用调试
6.2.1 程序开始运行界面
本函数使用是菜单式查询,所以在程序运行之初便会有一个菜单出现,输入对应数值,便可调用数值对应函数功效
6.2.2 查找函数调用界面
此功效只要不输入结束查找字符便能够
一直继续查找下去,但假如想要继续使用其它功效,则必需输入退出查找函数字符,以后菜单便会重新出现。
6.2.3 删除函数调用界面
此功效只要不输入结束查找字符便能够一直继续删除下去,但假如想要继续使用其它功效,则必需输入退出删除程序字符,以后菜单便会重新出现。
6.2.5 检验单词是否被删除界面
确定单词已经被删除
显示“not found”即表示此单词 以成功删除。
6.2.6 添加函数调用界面
6.2.7 检验单词是否添加界面
6.2.8 修改函数调用界面
6.2.9 确定修改单词界面
七、总结归纳
这次经过C语言设计一个简易电子词典,让我对于C语言这门课认知更为深刻。而且经过这次机会,我知道了自己在学习C语言这门课上上不足。
我们日常在课堂上编写程序在这次经历以后,我最终明白了老师日常所说“你们现在写程序实际上不能算作是程序,正真程序是几百甚至是几千行代码”,明白了为何说一个程序编写是么不轻易。
日常只学习书本上知识是不够,自己编写程序也是学习过程中相当关键一环,以前学习过程中问题在这次课程设计中全部暴露出来了。比如:对于基础知识掌握不牢靠,程序了解不够透彻,对于指针、数组利用不牢靠等等,所以经过这次课程设计让我将以前学过知识又巩固了一遍,有效填补了部分自己知识系统漏洞。
以前学习是为了应付考试而学习,毕竟在学校中学分是一个很关键东西,而且现在学校教育全部是为了分数而学。而这次课程设计将我们所学知识利用到了现实生活中,尤其是这么一个很实用电子词典系统,让我对于程序设计方法和思绪有了比较清楚认知。此次程序使用是模块化思想,经过模块和模块之间联络,整体和模块之间联络,让我明白了其实程序全部是大同小异,一通则百通。只要将各个模块之间功效加以调整,并附上对应注释,一个程序便不难了解。
附录:源程序代码
/****************************************************/
#include <stdlib.h>
#include <string.h>
#define DICT_EN "dict_en.txt"
typedef struct Node Node;
typedef Node * pNode;
//字典结构体定义,key是单词,context是翻译,next是指向下一个单词节点指针
struct Node
{
char * key;
char * context;
pNode next;
};
static pNode head = NULL;
static bool save_flag = true; //true说明已经保留 false未保留
void print_menu(); //打印菜单
void analysis_cmd(char c); //解析选项
void create_dict(FILE * file); //创建字典链表
void open_dict(); //打开字典文件
void find_word(); //查找单词
void delete_word(); //删除单词
void modify_word(); //修改单词
void save_word(); //保留单词
void help(); //帮助
void free_dict(); //释放
void print_dict(); //打印
//创建字典结构体链表
void create_dict(FILE * file)
{
char buf[2048] = {0}; //存放读取每行单词缓冲区
head = (pNode)malloc(sizeof(Node)); //头指针分配空间
memset(head, 0, sizeof(Node)); //头指针空间数据清空
pNode p = head; //定义变量指向头指针,用于链表遍历浮标
int index = 0; //表示单词长度
int len = 0; //表示单词和翻译长度,和index一起使用用来计算翻译长度(len-index)
while (!feof(file)) //该while循环功效是一行一行读取单词和词义,直到读取到文件结尾
{
index = 0; //清空单词长度
memset(buf, 0, sizeof(buf)); //清空缓冲区
fgets(buf, sizeof(buf), file); //读取文件中一行数据,也就是读取一个单词词本身和词义
if (buf == NULL) //读取为空,继续读取下一个单词
continue;
len = strlen(buf); //单词和词义总长度
while (buf[index++] != '\t'); //该while循环是得到单词本身长度 if (index >= len) //假如只有单词儿没有词义,就表示该行不是正确单词和词义格式,舍弃,继续读下一行
continue ;
p->key = (char *)malloc(index); //单词本身分配空间
memset(p->key, 0, index); //清空分配空间
memcpy(p->key, buf, index); //拷贝单词本身到分配空间
p->key[index-1] = '\0'; //单词结尾
p->context = (char *)malloc(len-index); //单词词义分配空间
memset(p->context, 0, len-index); //单词词义本身空间清空
memcpy(p->context, buf+index, len-index); //单词词义拷贝到分配空间
p->context[len-index-1] = '\0'; //单词词义结尾
p->next = (pNode)malloc(sizeof(Node)); //单词下一个节点分配空间
p->next->next = NULL; //单词下一个节点下一个节点指向空
memset(p->next, 0, sizeof(p->next)); //清空下一个单词分配空间
p = p->next; //目前游标指向下一个分配空间
};
}
//文件打开操作
void open_dict()
{
FILE * file_en = fopen(DICT_EN, "r"); //打开字库文件
if (file_en == NULL)
{
printf("英文词典打开失败。\n");
exit(1);
}
create_dict(file_en); //创建字典链表
fclose(file_en); //关闭文件
}
//查找单词操作
void find_word()
{
char word[100] = {0};
do
{
printf("\n\n请输入你要查找单词[结束查找输入-f]:\n");
scanf("%s", word); //输入你要查找单词
if (!strcmp(word, "-f")) //输入为-f表示要退出查找
{
fflush(stdin); //刷新缓冲区(退出前要刷新缓冲区)
break;
}
bool flag = false; //是否查找到标志位
pNode p = head;
while (p->next != NULL) //遍历链表
{
if (!strcmp(p->key, word)) //假如改节点key是你要输入要查找单词,打印输出,并置位标志位
{
printf("%s\n", p->context);
flag = true; //置位标志位
break;
}
p = p->next; //假如该节点不是你要查单词,进入下一个节点
}
if (!flag) //假如标志位未被置位(false),则提醒未找到。
printf("not found.\n");
}while(1);
}
//添加单词
void add_word()
{
char key[100] = {0}; //保留要添加单词本身数组
char context[100] = {0}; //保留要添加单词词义数组
bool flag = false; //是否添加成功 false表示未添加成功,true表示添加成功
do
{
printf("输入-a退出添加.\n");
printf("\n\n请输入你要添加单词:\n");
scanf("%s", key); //输入要添加单词本身
if (!strcmp(key, "-a")) //假如输入为-a,则刷新缓冲区,并退出添加功效。
{
fflush(stdin); //刷新缓冲区
break;
}
printf("\n\n请输入你要添加单词词义:\n");
scanf("%s", context); //输入要添加单词词义
if (key == NULL || context == NULL) //检测,假如输入单词本身或词义为空,则提醒有误。
{
printf("输入有误,请重新输入。\n");
continue;
}
pNode p = head; //用p统计链表头,用于遍历链表使用
while (p->next != NULL) //链表遍历循环
{
if (!strcmp(p->key, key)) //假如要添加单词在词库中存在,则提醒存在,不能添加成功。
{
printf("您添加单词在字库中已存在,请重新输入。\n");
break;
}
else
{ //查找链表中适宜位置,添加单词
if (strcmp(p->key, key) < 0 && strcmp(p->next->key, key) > 0)
{
pNode temp = (pNode)malloc(sizeof(Node));
memset(temp, 0, sizeof(temp));
int len = strlen(key)+1;
temp->key = (char *)malloc(len);
memset(temp->key, 0, len);
展开阅读全文