C高编课程设计报告_第1页
C高编课程设计报告_第2页
C高编课程设计报告_第3页
C高编课程设计报告_第4页
C高编课程设计报告_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上C语言高级编程技术课程设计报告电子词典的设计 指导老师: 班 级: 姓 名: 目录 4.1.1 打印菜单的子函数print_menu- 2 - 4.1.2 解析输入要求的子函数analysis_cmd- 2 - 4.1.3 打开电子英汉词典(文件)的子函数open_dict- 2 - 4.1.5 添加单词的子函数add_word- 2 - 4.1.9 帮助单词的子函数help- 3 - 4.1.10 释放单词的子函数free_dict- 3 - 6.2.8修改函数调用的界面- 17 - - 17 -专心-专注-专业一、课程设计的要求1、全面熟悉、掌握c语言的基本知识,

2、增强对不同的问题运用和灵活选择合适的数据结构,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程思想。2、英汉词典: 以课上分发的“dict.txt”文件为词典文件为基础,程序可以实现完成“输出所输入英文单词的中文解释”也就是“英汉词典条目的查找”的基本功能,还可以实现“英汉词典条目的增加”即增加所输入的单词到文件中并添加中文注释、“英汉词典条目的删除”即删除所输入的单词及其中文注释、“英汉词典条目的修改”即修改原本存在的单词英语拼写功能。功能描述: 在计算机中建立有限规模的电子英汉词典,利用程序实现

3、电子英汉词典的查找、增词、删除、修改和维护工作。 1、词典的内容为:每行对应一个词条,每个词条由两个字符串组成,字符串用若干空格符分开,前一个是单词字符串,后一个是释义字符串,使用分号作为多个释义的分隔符。 2、采用菜单工作方式。在一个操作执行之后,程序询问是否继续执行该操作,如果继续查询,则直接输入你所需要的查询的单词 ,若想要进行其他功能的使用便需要按照提示输入结束功能是所需输入的字符,之后再输入你想要使用的功能的序号,然后进行程序的下一步运行。 3、要求整体设计以人为本,用户界面简洁美观。 测试数据:以老师所给的词库为准。2、 可行性分析 本课程主要完成的时候字典的查询、修改、添加、删除

4、等功能,从而我选取的方案是采用的结构体与模块化的方法去实现,每一个功能都被我细分到了不同的模块中,然后根据菜单的要求的输入不同由“解析选项”子函数来调用不同的子函数,来达到实现不同功能之间的转换,而主函数起到一个汇总调用的功能。三、需求分析(1)程序的功能 英汉词典作为一个常用的学习工具,是我们经常要使用的。此程序能完成一个简单的电子英汉词典的功能,如:单词的查找、增词、删除、修改和维护刷新等工作。在计算机中建立有限规模的电子英汉词典(文件),利用程序实现电子英汉词典的查找、增词、删除、修改和维护工作。词典的内容为:每行对应一个词条,每个词条由两个字符串组成,字符串用若干空格符分开;前一个是单

5、词字符串(英文),后一个是释义字符串(中文),使用分号作为多个释义的分隔符。 且在程序中可以实现对于电子英汉词典(文件)当中内容的添加单词,删除单词以及修改英语单词的功能。(2)输入输出的要求 采用菜单工作方式。在程序开始运行的时候便会有一个菜单出现,菜单中对于程序中可以实现的功能都逐一编号,当你想使用其中的某一项功能时,只需将此功能前的编输入,再按enter键便可使用该功能,若需要退出当前的功能时,只需将推出的字符输入再按enter键,便可重新出现菜单以供选择其它的功能。 要求整个设计以人为本,用户界面友好。四、概要设计与详细设计 4.1 程序分块 4.1.1 打印菜单的子函数print_m

6、enu,在程序开始运行之后,此函数便开始工作,在界面出现,方便我们在使用此程序时可以更加方便快捷,使程序功能的使用更加的方便快捷。4.1.2 解析输入要求的子函数analysis_cmd,此函数是分析我们在键盘上输入的数字,按照数调用相应的子函数工作。 4.1.3 打开电子英汉词典(文件)的子函数open_dict,此函数是用于打开以及调用电子英汉词典(文件)。4.1.4 查找单词的子函数find_word,此程序是用于查询我们从键盘输入的单词,并显示其中文注释。4.1.5 添加单词的子函数add_word,此程序是用于添加我们从键盘输入的单词,并存入其中文注释。4.1.6 删除单词的子函数d

7、elete_word,此程序是用于删除我们从键盘输入的单词,并删除其中文注释。4.1.7 修改单词的子函数modify_word,此程序是用于修改电子英汉词典(文件)中存在的英文单词的拼写。4.1.8 保存单词的子函数save_word,此程序是用于保存我们在打开程序后对于电子英汉词典(文件)的添加、删除或修改的操作。 4.1.9 帮助单词的子函数help,此程序是用于当我们的操作过多时清屏的函数。 4.1.10 释放单词的子函数free_dict,此程序是用于释放我们在操作中多余的单词的函数。 于上述函数的使用做存贮。4.2、实现功能: 系统功能分析:本系统可以查询,修改,删除,增加词条,以

8、及退出词典。4.3 各模块流程图3.删除单词4.修改单词5.保存单词7.退出1.查找单词功能序号选择打印菜单主函数2.增加单词6.帮助 助五、编码实现 5.1、主函数和头文件定义 5.1.1 子函数的声明struct Nodechar * 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

9、* 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. 查找单词tt|n");printf("| 2. 增加单词t

10、t|n");printf("| 3. 删除单词tt|n");printf("| 4. 修改单词tt|n");printf("| 5. 保存单词tt|n");printf("| 6. 帮助tt|n");printf("| 7. 退出tt|n");printf("=n");/输入命令函数char get_command()char cmd;printf("nn请选择你需要的功能:");scanf("%c", &cmd);p

11、rintf("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

12、();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

13、语言的头文件函数#include <stdlib.h> /分配内存函数#include <string.h> /字符函数#define DICT_EN "dict en.txt"5.2各个模块的实现5.2.1查找模块/查找单词操作void find_word()char word100 = 0;do printf("nn请输入你要查找的单词结束查找输入-f:n");scanf("%s", word);/输入你要查找的单词if (!strcmp(word, "-f")/输入为-f表示要退出查找

14、fflush(stdin);/刷新缓冲区(退出前要刷新缓冲区)break;bool flag = false;/是否查找到标志位pNode p = head;while (p->next != NULL)/遍历链表if (!strcmp(p->key, word)/如果改节点的key是你要输入要查找的单词,打印输出,并置位标志位printf("%sn", p->context);flag = true;/置位标志位break;p = p->next;/如果该节点不是你要查的单词,进入下一个节点if (!flag)/如果标志位未被置位(false),则

15、提示未找到。printf("not found.n");while(1);5.2.2删除模块/删除单词void delete_word()char key100 = 0;bool flag = false;/是否删除成功 false表示未删除成功或者不存在,true表示删除成功、do printf("输入-d退出删除.n");printf("nn请输入你要删除的单词:n");scanf("%s", key);if (!strcmp(key, "-d")fflush(stdin);/刷新缓冲区br

16、eak;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 =

17、p->next;while(1);if (flag)save_flag = false;5.2.3添加模块/添加单词void add_word()char key100 = 0;/保存要添加的单词本身数组char context100 = 0;/保存要添加的单词词义数组bool flag = false;/是否添加成功 false表示未添加成功,true表示添加成功do printf("输入-a退出添加.n");printf("nn请输入你要添加的的单词:n");scanf("%s", key);/输入要添加的单词本身if (!

18、strcmp(key, "-a")/如果输入为-a,则刷新缓冲区,并退出添加功能。fflush(stdin);/刷新缓冲区break;printf("nn请输入你要添加单词的词义:n");scanf("%s", context);/输入要添加单词的词义if (key = NULL | context = NULL)/检测,如果输入的单词本身或者词义为空,则提示有误。printf("输入有误,请重新输入。n");continue;pNode p = head;/用p记录链表头,用于遍历链表使用while (p->

19、;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);in

20、t len = strlen(key)+1;temp->key = (char *)malloc(len);memset(temp->key, 0, len);memcpy(temp->key, key, len);temp->keylen-1 = '0'len = strlen(context)+1;temp->context = (char *)malloc(len);memset(temp->context, 0, len);memcpy(temp->context, context, len);temp->contextl

21、en-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 key100 = 0;char context100 = 0;bool flag = false;/是否修改成功 false表示

22、未修改成功或者不存在,true表示修改成功、do printf("输入-m退出删除.n");printf("nn请输入你要修改的单词: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

23、)/如果要修改的单词存在,则修改printf("%s的词义是%sn", p->key, p->context);printf("请输入要修改的词义: ");scanf("%s", context);int len = strlen(context)+1;memcpy(p->context, context, len);p->contextlen-1 = '0'printf("修改成功.n");flag = true;break;while(1);if (flag)save_f

24、lag = false;六、系统调试调用的词典文件6.1系统调用文件的存储位置 词典文件的放置位置与程序在同一文件夹中,这样可以方便程序的调用6.2子函数的调用调试 6.2.1 程序开始运行的界面 本函数使用的是菜单式查询,所以在程序运行之初便会有一个菜单的出现,输入相应的数值,便可调用数值对应的函数功能 此功能只要不输入结束查找的字符便可以一直继续查找下去,但如果想要继续使用其它的功能,则必须输入退出查找函数的字符,之后菜单便会重新出现。 此功能只要不输入结束查找的字符便可以一直继续删除下去,但如果想要继续使用其它的功能,则必须输入退出删除程序的字符,之后菜单便会重新出现。 确定单词已经被删

25、除 显示“not found”即表示此单词 以成功删除。 6.2.7 检查单词是否添加的界面 七、总结归纳这次通过C语言设计一个简易的电子词典,让我对于C语言这门课的认知更为深刻。而且通过这次的机会,我知道了自己在学习C语言这门课上的上的不足。我们平常在课堂上编写的程序在这次的经历之后,我终于明白了老师平常所说的“你们现在写的程序实际上不能算作是程序,正真的程序是几百甚至是几千行的代码”,明白了为什么说一个程序的编写是么的不容易。平常只学习书本上的知识是不够的,自己编写程序也是学习过程中相当重要的一环,以前学习过程中的问题在这次的课程设计中全部暴露出来了。例如:对于基本知识的掌握不牢固,程序的

26、理解不够透彻,对于指针、数组的运用不牢固等等,所以通过这次的课程设计让我将以前学过的知识又巩固了一遍,有效的弥补了一些自己知识系统的漏洞。以前的学习是为了应付考试而学习,毕竟在学校中学分是一个很重要的东西,而且现在的学校的教育都是为了分数而学。而这次的课程设计将我们所学的知识运用到了现实生活中,尤其是这样一个很实用的电子词典系统,让我对于程序设计的方法和思路有了比较清晰的认知。此次的程序使用的是模块化的思想,通过模块与模块之间的联系,整体与模块之间的联系,让我明白了其实程序都是大同小异的,一通则百通。只要将各个模块之间的功能加以调整,并附上相应的注释,一个程序便不难理解。附录:源程序代码/*/

27、#include <stdlib.h>#include <string.h>#define DICT_EN "dict_en.txt"typedef struct Node Node;typedef Node * pNode;/字典结构体定义,key是单词,context是翻译,next是指向下一个单词节点的指针struct Nodechar * key;char * context;pNode next;static pNode head = NULL;static bool save_flag = true;/true说明已经保存 false未保

28、存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 *

29、file)char buf2048 = 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

30、(buf, 0, sizeof(buf);/清空缓冲区fgets(buf, sizeof(buf), file);/读取文件中一行数据,也就是读取一个单词的词本身和词义if (buf = NULL)/读取为空,继续读取下一个单词continue;len = strlen(buf);/单词和词义的总长度while (bufindex+ != 't');/该while循环是得到单词本身的长度 if (index >= len)/如果只有单词儿没有词义,就表示该行不是正确的单词和词义格式,舍弃,继续读下一行continue ;p->key = (char *)malloc

31、(index);/单词本身分配空间memset(p->key, 0, index);/清空分配空间memcpy(p->key, buf, index);/拷贝单词本身到分配空间p->keyindex-1 = '0'/单词结尾p->context = (char *)malloc(len-index);/单词词义分配空间memset(p->context, 0, len-index);/单词词义本身空间清空memcpy(p->context, buf+index, len-index);/单词词义拷贝到分配空间p->contextlen-

32、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 =

33、 NULL)printf("英文词典打开失败。n");exit(1);create_dict(file_en);/创建字典链表fclose(file_en);/关闭文件/查找单词操作void find_word()char word100 = 0;do printf("nn请输入你要查找的单词结束查找输入-f:n");scanf("%s", word);/输入你要查找的单词if (!strcmp(word, "-f")/输入为-f表示要退出查找fflush(stdin);/刷新缓冲区(退出前要刷新缓冲区)break

34、;bool flag = false;/是否查找到标志位pNode p = head;while (p->next != NULL)/遍历链表if (!strcmp(p->key, word)/如果改节点的key是你要输入要查找的单词,打印输出,并置位标志位printf("%sn", p->context);flag = true;/置位标志位break;p = p->next;/如果该节点不是你要查的单词,进入下一个节点if (!flag)/如果标志位未被置位(false),则提示未找到。printf("not found.n"

35、);while(1);/添加单词void add_word()char key100 = 0;/保存要添加的单词本身数组char context100 = 0;/保存要添加的单词词义数组bool flag = false;/是否添加成功 false表示未添加成功,true表示添加成功do printf("输入-a退出添加.n");printf("nn请输入你要添加的的单词:n");scanf("%s", key);/输入要添加的单词本身if (!strcmp(key, "-a")/如果输入为-a,则刷新缓冲区,并退

36、出添加功能。fflush(stdin);/刷新缓冲区break;printf("nn请输入你要添加单词的词义:n");scanf("%s", context);/输入要添加单词的词义if (key = NULL | context = NULL)/检测,如果输入的单词本身或者词义为空,则提示有误。printf("输入有误,请重新输入。n");continue;pNode p = head;/用p记录链表头,用于遍历链表使用while (p->next != NULL)/链表遍历循环if (!strcmp(p->key, k

37、ey)/如果要添加的单词在词库中存在,则提示存在,不能添加成功。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 *)

38、malloc(len);memset(temp->key, 0, len);memcpy(temp->key, key, len);temp->keylen-1 = '0'len = strlen(context)+1;temp->context = (char *)malloc(len);memset(temp->context, 0, len);memcpy(temp->context, context, len);temp->contextlen-1 = '0'temp->next = p->next;

39、/添加单词操作p->next = temp;printf("%s添加成功n", key);flag = true;break;p = p->next;while(1);if (flag)/链表是否有更新标志,如果有更新,则清空save_flag标志位save_flag = false;/删除单词void delete_word()char key100 = 0;bool flag = false;/是否删除成功 false表示未删除成功或者不存在,true表示删除成功、do printf("输入-d退出删除.n");printf("

40、nn请输入你要删除的单词:n");scanf("%s", key);if (!strcmp(key, "-d")fflush(stdin);/刷新缓冲区break;if (key = NULL)printf("输入有误,请重新输入。n");continue;pNode p = head;pNode pre = head;while (p->next != NULL)if (!strcmp(p->key, key)/存在就删除pre->next = p->next;if (p->key != NU

41、LL)/释放建立链表时候创建的空间free(p->key);if (p->context != NULL)free(p->context);free(p);printf("单词%s已经被删除.n", key);flag = true;break;pre = p;p = p->next;while(1);if (flag)save_flag = false;/修改单词void modify_word()char key100 = 0;char context100 = 0;bool flag = false;/是否修改成功 false表示未修改成功或者

42、不存在,true表示修改成功、do printf("输入-m退出修改.n");printf("nn请输入你要修改的单词: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)/如果要修改

43、的单词存在,则修改printf("%s的词义是%sn", p->key, p->context);printf("请输入要修改的词义: ");scanf("%s", context);if (p->context != NULL)free(p->context);p->context = NULL;int len = strlen(context)+1;p->context = (char *)malloc(len);memcpy(p->context, context, len);p->

44、;contextlen-1 = '0'printf("修改成功.n");flag = true;break;p = p->next;while(1);if (flag)save_flag = false;/保存单词,把链表里面的数据重新写到文件中void save_word()FILE * file = fopen(DICT_EN, "w");if (file = NULL)printf("打开字库文件出错n");exit(1);pNode p = head;while (p->next != NULL)/

45、写回文件fprintf(file, "%st%sn", p->key, p->context);p = p->next;printf("保存完成,请输入enter键进入主菜单n");fflush(stdin);getchar();save_flag = true;fclose(file);system("cls");fflush(stdin);/刷新缓冲区/帮助函数void help()printf("tt+n");printf("tt+ +n");printf("tt+ this is the help for dict +n");printf("tt+ plesae enter any key to exit help +n");printf("tt+ +n");printf("tt+n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论