背单词系统
目 录
1.设计任务 1
2. 需求分析 1
3. 概要设计 1
3.1 基本功能 1
3.2 函数说明 1
3.3 变量和结构体说明 2
3.4 单词存储简要分析 2
3.5 功能介绍 3
3.5.1功能模块图 3
3.5.2 详细介绍 3
3.6 程序调试 4
图3-5 单词添加 6
3.7 总结 9
致谢 10
附录(源代码) 11
参 考 文 献 20
轻松背单词
1.设计任务
综合训练用C语言以及数据结构知识来解决问题和提高处理问题的能力,巩固对C语言和数据结构的内容和知识的综合应用;本次课设的题目来源于12月份的英语四六级考试,该单词系统的设计核心是利用文件存储单词库,应用顺序表去实现单词的添加、删除、查找以及背诵等功能。
2. 需求分析
英语已成为我们生活中不可缺少的一部分,今年江苏高考的改革更加体现了英语的重要性。无论是中学生、大学生还是已经工作的人,要学好英语,首先自己的大脑路得有足够大的单词库,所以,背单词成了我们最头疼的事。
利用此次课程设计,我们写了背单词系统。使用该系统用户可以维护单词的词库,并可以编辑自己的词库;主要是用来背诵单词的,所以有英译汉、汉译英的测试,测试完后用户可以查看自己的测试成绩,同时在背诵过程中用户可以删除自己已背诵过的单词,也可以修改单词汉语意思为自己容易记住的,同时该系统具有单词预览功能,以及单词翻译功能。
3. 概要设计
3.1 基本功能
(1)词库的预览
(2)查单词的释义
(3)词库的添加
(4)词库的删除
(5)词库的修改
(6)汉译英测试
(7)英译汉测试
(8)成绩的查看
3.2 函数说明
(1)void read_from_file() //从文件中读取单词的信息
(2)void write_to_file() //从文件中写入单词的信息
(3)void add_infor() //添加单词信息
(4)void del_infor() //删除单词信息
(5)void modify_infor() //修改单词信息
(6)void show_infor() //单词显示
(7)void search_infor() //查询单词
(8)void ch_to_en_infor() //汉译英测试
(10)void en_to_ch_infor() //英译汉测试
(11)void show_main_menu() //显示主菜单
(12)void chengji_infor() //测试成绩
3.3 变量和结构体说明
(1)单词信息的结构体如下:
typedef struct word//单词的结构体
{
char en[MAX_CHAR]; // 英文形式
char ch[MAX_CHAR]; //中文形式
}word;
(2)宏定义
#define MAX_CHAR 20 //最大字符
#define MAX_NUM 100 //单词最大个数
(3)存放单词的信息的变量如下:
word s[MAX_NUM]; //单词数组
int num;//单词个数
3.4 单词存储简要分析
(1)定义结构体数组用来存放单词的信息
(2)单词信息存放在data.txt中,文件格式如下:
单词个数——长度为4个字节
第1个单词的信息——长度为sizeof(word)
第2个单词的信息——长度为sizeof(word)
......
第n个单词的信息——长度为sizeof(word)
(3)读文件data.txt的过程如下:
打开文件data.txt用fopen函数(以mode指定的方式打开名为filename的 文件)先读取单词个数,然后逐个读取单词的信息,采用fread函数(从fp所制定的文件中读取长度为size的n个数据项,存到pt所指向的内存区)
(4)写文件data.txt的过程如下:
先写入单词个数,然后逐个写入单词的信息,采用fwrite函数(把ptr所指向的n*size个字节输出的fp所指向的文件中)
3.5 功能介绍
3.5.1功能模块图
图3-1 功能结构图
3.5.2 详细介绍
(1)词库预览即打开文件并把文件信息输出至屏幕
(2)删除单词和修改单词信息的时候,都需要先输入中文,从该中文找到单词的位置
(3)在文件中单词查找与匹配过程中均用strcmp()函数
(4)程序采用菜单的形式显示,用户可以输入选择进行操作
(5)英译汉、汉译英测试选用随机测试
(6)添加单词需逐个添加
3.6 总结
通过本次数据结构课程设计,让我不但对数据结构所学课程内容加深了巩固,同时也对C语言编程有了很大的提高,而且培养了自己的团队合作精神。对C语言的文件的存取、结构体的使用、数组的使用以及数据结构顺序表都加深了理解。“千里之堤毁于蚁穴”这句话对于C语言编程特别适用,因为一个小小的分号都可能使你费尽心思编出来的程序无法运行,所以通过这次课程设计我领略到了程序员该有的一丝不苟。
此次课程设计题目来源于当时的四六级考试,所以设计的功能都贴近我们的需求。开始着手去写时完全没有思绪,和队友一起讨论要实现的功能,意见统一后进行分工。在讨论声中给此次课设画上了句号。
对于词库的维护刚开始没有选用文件,导致每次退出测试词库都会清空,这便要求每次用户进行查询测试等前都必须先添加单词,因此,经过考虑进行了文件存储,实现了词库的维护。查询单词以及英译汉、汉译英测试都需要去词库进行查找与匹配,即需要用到顺序表的locate()函数,但考虑到这样工程较大,所以在这三个函数中运用了存放在头文件string.h中的strcmp()函数,对程序进行了优化。同时,想要让程序运行时菜单一直处在上方不动,但能力有限,所以采用了每步运行完返回主菜单的方法代替它。
通过此次数据结构课程设计,我提高了编程的经验,为以后的学习打下了坚实的基础。
附录(源代码)
1 数据结构 课程设计说明书 2 3 4 5 6 7 题目: 轻松背单词 8 9 学生姓名: 啦啦啦 10 学 号: 201406060306 11 院 (系): 电气与信息工程 12 专 业: 计算机科学与技术 13 指导教师: 14 2016 年 1 月 15 日 15 16 目 录 17 18 1.设计任务 1 19 2. 需求分析 1 20 3. 概要设计 1 21 3.1 基本功能 1 22 3.2 函数说明 1 23 3.3 变量和结构体说明 2 24 3.4 单词存储简要分析 2 25 3.5 功能介绍 3 26 3.5.1功能模块图 3 27 3.5.2 详细介绍 3 28 3.6 程序调试 4 29 图3-5 单词添加 6 30 3.7 总结 9 31 致谢 10 32 附录(源代码) 11 33 参 考 文 献 20 34 35 轻松背单词 36 1.设计任务 37 综合训练用C语言以及数据结构知识来解决问题和提高处理问题的能力,巩固对C语言和数据结构的内容和知识的综合应用;本次课设的题目来源于12月份的英语四六级考试,该单词系统的设计核心是利用文件存储单词库,应用顺序表去实现单词的添加、删除、查找以及背诵等功能。 38 2. 需求分析 39 英语已成为我们生活中不可缺少的一部分,今年江苏高考的改革更加体现了英语的重要性。无论是中学生、大学生还是已经工作的人,要学好英语,首先自己的大脑路得有足够大的单词库,所以,背单词成了我们最头疼的事。 40 利用此次课程设计,我们写了背单词系统。使用该系统用户可以维护单词的词库,并可以编辑自己的词库;主要是用来背诵单词的,所以有英译汉、汉译英的测试,测试完后用户可以查看自己的测试成绩,同时在背诵过程中用户可以删除自己已背诵过的单词,也可以修改单词汉语意思为自己容易记住的,同时该系统具有单词预览功能,以及单词翻译功能。 41 3. 概要设计 42 3.1 基本功能 43 (1)词库的预览 44 (2)查单词的释义 45 (3)词库的添加 46 (4)词库的删除 47 (5)词库的修改 48 (6)汉译英测试 49 (7)英译汉测试 50 (8)成绩的查看 51 3.2 函数说明 52 (1)void read_from_file() //从文件中读取单词的信息 53 (2)void write_to_file() //从文件中写入单词的信息 54 (3)void add_infor() //添加单词信息 55 (4)void del_infor() //删除单词信息 56 (5)void modify_infor() //修改单词信息 57 (6)void show_infor() //单词显示 58 (7)void search_infor() //查询单词 59 (8)void ch_to_en_infor() //汉译英测试 60 (10)void en_to_ch_infor() //英译汉测试 61 (11)void show_main_menu() //显示主菜单 62 (12)void chengji_infor() //测试成绩 63 3.3 变量和结构体说明 64 (1)单词信息的结构体如下: 65 typedef struct word//单词的结构体 66 { 67 char en[MAX_CHAR]; // 英文形式 68 char ch[MAX_CHAR]; //中文形式 69 }word; 70 (2)宏定义 71 #define MAX_CHAR 20 //最大字符 72 #define MAX_NUM 100 //单词最大个数 73 (3)存放单词的信息的变量如下: 74 word s[MAX_NUM]; //单词数组 75 int num;//单词个数 76 3.4 单词存储简要分析 77 (1)定义结构体数组用来存放单词的信息 78 (2)单词信息存放在data.txt中,文件格式如下: 79 单词个数——长度为4个字节 80 第1个单词的信息——长度为sizeof(word) 81 第2个单词的信息——长度为sizeof(word) 82 ...... 83 第n个单词的信息——长度为sizeof(word) 84 (3)读文件data.txt的过程如下: 85 打开文件data.txt用fopen函数(以mode指定的方式打开名为filename的 文件)先读取单词个数,然后逐个读取单词的信息,采用fread函数(从fp所制定的文件中读取长度为size的n个数据项,存到pt所指向的内存区) 86 (4)写文件data.txt的过程如下: 87 先写入单词个数,然后逐个写入单词的信息,采用fwrite函数(把ptr所指向的n*size个字节输出的fp所指向的文件中) 88 3.5 功能介绍 89 3.5.1功能模块图 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 图3-1 功能结构图 106 3.5.2 详细介绍 107 (1)词库预览即打开文件并把文件信息输出至屏幕 108 (2)删除单词和修改单词信息的时候,都需要先输入中文,从该中文找到单词的位置 109 (3)在文件中单词查找与匹配过程中均用strcmp()函数 110 (4)程序采用菜单的形式显示,用户可以输入选择进行操作 111 (5)英译汉、汉译英测试选用随机测试 112 (6)添加单词需逐个添加 113 3.6 程序调试 114 (1)系统菜单 115 图3-2 主菜单显示 116 (2)查询词库信息 117 图3-3 词库预览 118 (3)查询单个单词 119 图3-4 单词查询 120 (4)添加单词 121 122 图3-5 单词添加 123 (5)删除单词 124 图3-6 单词删除 125 (6)英译汉测试 126 图3-7 英译汉测试 127 (7)汉译英测试 128 图3-8 汉译英测试 129 (8)查看测试成绩 130 图3-9 测试成绩查询 131 (9)修改单词信息 132 图3-10 修改单词 133 (10)退出系统 134 图3-11 退出系统 135 3.7 总结 136 通过本次数据结构课程设计,让我不但对数据结构所学课程内容加深了巩固,同时也对C语言编程有了很大的提高,而且培养了自己的团队合作精神。对C语言的文件的存取、结构体的使用、数组的使用以及数据结构顺序表都加深了理解。“千里之堤毁于蚁穴”这句话对于C语言编程特别适用,因为一个小小的分号都可能使你费尽心思编出来的程序无法运行,所以通过这次课程设计我领略到了程序员该有的一丝不苟。 137 此次课程设计题目来源于当时的四六级考试,所以设计的功能都贴近我们的需求。开始着手去写时完全没有思绪,和队友一起讨论要实现的功能,意见统一后进行分工。在讨论声中给此次课设画上了句号。 138 对于词库的维护刚开始没有选用文件,导致每次退出测试词库都会清空,这便要求每次用户进行查询测试等前都必须先添加单词,因此,经过考虑进行了文件存储,实现了词库的维护。查询单词以及英译汉、汉译英测试都需要去词库进行查找与匹配,即需要用到顺序表的locate()函数,但考虑到这样工程较大,所以在这三个函数中运用了存放在头文件string.h中的strcmp()函数,对程序进行了优化。同时,想要让程序运行时菜单一直处在上方不动,但能力有限,所以采用了每步运行完返回主菜单的方法代替它。 139 通过此次数据结构课程设计,我提高了编程的经验,为以后的学习打下了坚实的基础。 140 141 致谢 142 感谢我的小伙伴李佳鑫同学和我一起完成了这次课设,同时感谢赵老师的热心辅导。 143 144 145 附录(源代码) 146 #include <stdio.h> 147 #include <string.h> 148 #include <stdlib.h> 149 #define MAX_CHAR 20 //最大字符 150 #define MAX_NUM 100 //单词最大个数 151 typedef struct word//单词的结构体 152 { 153 char en[MAX_CHAR]; // 英文形式 154 char ch[MAX_CHAR]; //中文形式 155 }word; 156 int c=0,d=0;//统分变量 157 word s[MAX_NUM]; //单词数组 158 int num;//单词个数 159 void read_from_file()//从文件中读取单词的信息 160 { 161 FILE *fp; 162 int i=0; 163 fp=fopen("data.txt","r"); 164 fread(&num,sizeof(num),1,fp); //先读取单词的个数 165 for(i=0;i<num;i++) 166 fread(&s[i],sizeof(word),1,fp); //读取每个单词的信息存放到结构体 167 fclose(fp);//关闭文件 168 return 0; 169 } 170 void write_to_file()//从文件中写入单词的信息 171 { 172 FILE *fp; 173 int i=0; 174 fp=fopen("data.txt","w+"); 175 if(!fp) 176 { 177 printf("打开文件data.txt失败!\n"); 178 return 0; 179 } 180 fwrite(&num,sizeof(num),1,fp); //先写入单词的个数 181 for(i=0;i<num;i++) 182 fwrite(&s[i],sizeof(word),1,fp); //写入每个单词的信息 183 fclose(fp);//关闭文件 184 } 185 void add_infor()//添加单词信息 186 { 187 int a,i=num,o; 188 printf("请输入单词的英文形式:"); 189 scanf("%s",s[i].en); 190 printf("请输入单词的中文形式:"); 191 scanf("%s",s[i].ch); 192 num++; 193 printf("您输入的信息为: 英文: %s 中文: %s \n",s[i].en,s[i].ch); 194 printf("Enter 3 继续输入;Enter 9 返回主菜单"); 195 scanf("%d",&o); 196 if(o==3) 197 { 198 add_infor(); 199 return 0; 200 } 201 if(o==9) 202 { 203 show_main_menu(); 204 return 0; 205 } 206 } 207 void del_infor()//删除单词信息 208 { 209 int i=0,j=0,o; 210 char ch[MAX_CHAR]; //中文形式 211 printf("请输入你要删除的单词中文形式:"); 212 scanf("%s",ch); 213 for(i=0;i<num;i++)//先找到该中文形式对应的序号 214 if(strcmp(s[i].ch,ch)==0) 215 { 216 for(j=i;j<num-1;j++) 217 s[j]=s[j+1]; 218 num--; //数量减少 1 219 printf("删除成功!\n"); 220 printf("Enter 4 继续删除;Enter 9 返回主菜单"); 221 scanf("%d",&o); 222 if(o==9) 223 { 224 show_main_menu(); 225 return 0; 226 } 227 if(o==4) 228 { 229 del_infor(); 230 return 0; 231 } 232 } 233 printf("没有这个单词!"); 234 printf("Enter 4 继续删除;Enter 9 返回主菜单"); 235 scanf("%d",&o); 236 if(o==9) show_main_menu(); 237 if(o==4) del_infor(); 238 } 239 void modify_infor()//修改单词信息 240 { 241 int i=0,o; 242 char ch[MAX_CHAR]; //中文形式 243 printf("请输入你要修改的单词中文形式:"); 244 scanf("%s",ch); 245 for(i=0;i<num;i++)//先找到该中文形式对应的序号 246 if(strcmp(s[i].ch,ch)==0)//strcmp()函数在string.h中 相等返回0 247 { 248 printf("请输入单词正确的英文形式:"); 249 scanf("%s",s[i].en); 250 printf("请输入此单词正确的的中文形式:"); 251 scanf("%s",s[i].ch); 252 printf("修改成功!\n"); 253 printf("Enter 8 继续修改;Enter 9 返回主菜单"); 254 scanf("%d",&o); 255 if(o==9) 256 { 257 show_main_menu(); 258 return 0; 259 } 260 if(o==8) 261 { 262 modify_infor(); 263 return 0; 264 } 265 } 266 printf("没有这个单词!"); 267 printf("Enter 8 继续修改;Enter 9 返回主菜单"); 268 scanf("%d",&o); 269 if(o==9) show_main_menu(); 270 if(o==8) modify_infor(); 271 } 272 void show_infor() //单词显示 273 { 274 int i=0,o; 275 printf("单词: 英文 中文 \n"); 276 for(i=0;i<num;i++) 277 printf(" %10s%10s\n",s[i].en,s[i].ch); 278 printf("Enter 9 返回主菜单"); 279 scanf("%d",&o); 280 if(o==9) show_main_menu(); 281 } 282 void search_infor()//查询单词 283 { 284 int i=0,o; 285 char ch[MAX_CHAR]; //中文形式 286 printf("请输入你要查询的单词中文形式:"); 287 scanf("%s",ch); 288 for(i=0;i<num;i++)//先找到该中文形式对应的序号 289 if(strcmp(s[i].ch,ch)==0) 290 { 291 printf("英文形式 中文形式 \n"); 292 printf("%10s%12s\n",s[i].en,s[i].ch); 293 printf("Enter 2 继续查询;Enter 9 返回主菜单"); 294 scanf("%d",&o); 295 if(o==9) 296 { 297 show_main_menu(); 298 return 0; 299 } 300 if(o==2) 301 { 302 search_infor(); 303 return 0; 304 } 305 } 306 printf("没有这个中文形式!"); 307 printf("Enter 2 继续查询;Enter 9 返回主菜单"); 308 scanf("%d",&o); 309 if(o==9) show_main_menu() ; 310 if(o==2) search_infor(); 311 } 312 void ch_to_en_infor() //汉译英测试 313 { 314 char b1[20]; 315 int i,o; 316 i = rand()%num; //随机测试 317 printf("【%s】请输入英文单词:",s[i].ch); 318 scanf("%s",b1); 319 while(strcmp(b1,s[i].en)!=0) 320 { 321 printf("输入错误!!!Enter 0 重新输入;Enter 6 继续测试;Enter 9 返回主菜单:"); 322 c++; 323 scanf("%d",&o); 324 if(o==0) 325 { 326 printf("请再次尝试:"); 327 scanf("%s",b1); 328 } 329 if(o==6) 330 { 331 ch_to_en_infor(); 332 return 0; 333 } 334 if(o==9) 335 { 336 show_main_menu(); 337 return 0; 338 } 339 } 340 printf("\n恭喜你,回答正确,加10分!\n\n");d++; 341 printf("Enter 6 继续测试,Enter 9 返回主菜单"); 342 scanf("%d",&o); 343 if(o==6) ch_to_en_infor(); 344 if(o==9) show_main_menu(); 345 } 346 void en_to_ch_infor() //英译汉测试 347 { 348 char b1[20]; 349 int i,o; 350 i = rand()%num; //随机测试 351 printf("【%s】请输入中文意思:",s[i].en); 352 scanf("%s",b1); 353 while(strcmp(b1,s[i].ch)!=0) 354 { 355 printf("输入错误!!!Enter 0 重新输入;Enter 5 继续测试;Enter 9 返回主菜单:"); 356 c++; 357 scanf("%d",&o); 358 if(o==0) 359 { 360 printf("请再次尝试:"); 361 scanf("%s",b1); 362 } 363 if(o==5) 364 { 365 en_to_ch_infor(); 366 return 0; 367 } 368 if(o==9) 369 { 370 show_main_menu(); 371 return 0; 372 } 373 } 374 printf("\n恭喜你,回答正确,加10分!\n\n");d++; 375 printf("Enter 5 继续测试;Enter 9 返回主菜单"); 376 scanf("%d",&o); 377 if(o==5) en_to_ch_infor(); 378 if(o==9) show_main_menu(); 379 } 380 void show_main_menu() //显示主菜单 381 { 382 printf("\t***********************************************\n"); 383 printf("\t** 1、查看词库 2、单词查询 **\n"); 384 printf("\t** 3、单词添加 4、单词删除 **\n"); 385 printf("\t** 5、英译汉测试 6、汉译英测试 **\n"); 386 printf("\t** 7、查看成绩 8、单词修改 **\n"); 387 printf("\t** 9、返回主菜单 10、退出系统 **\n"); 388 printf("\t***********************************************\n"); 389 printf("请选择您需要的服务:"); 390 return 0; 391 } 392 void chengji_infor() //测试成绩 393 { 394 int o; 395 printf("\n 共计输入错误:%d次 **每次扣10分**\n",c); 396 printf(" 共计输入正确:%d次 **每次加10分**\n",d); 397 printf(" 你的总得分为:%d分\n\n",10*d-10*c); 398 printf("Enter 9 返回主菜单"); 399 scanf("%d",&o); 400 if(o==9) show_main_menu() ; 401 } 402 int main() 403 { 404 printf("\t***********************************************\n"); 405 printf("\t** 欢迎使用背单词系统! **\n"); 406 printf("\t** 设计者:侯婧欢 && 李佳鑫 **\n"); 407 printf("\t** 班级:计本143班 **\n"); 408 printf("\t** 学号:06 18 **\n"); 409 printf("\t***********************************************\n"); 410 int choose=0; 411 num=0; //初始化单词个数为0 412 fopen("data.txt","a"); 413 read_from_file(); //读取文件 414 show_main_menu(); 415 while(choose!=10) 416 { 417 scanf("%d",&choose); 418 switch(choose) 419 { 420 case 1: show_infor();break; 421 case 2: search_infor();break; 422 case 3: add_infor();break; 423 case 4: del_infor();break; 424 case 5: en_to_ch_infor();break; 425 case 6: ch_to_en_infor();break; 426 case 7: chengji_infor();break; 427 case 8: modify_infor();break; 428 case 9: show_main_menu();break; 429 } 430 write_to_file();//写入文件 431 } 432 printf(" ***************谢谢使用背单词系统!再见!*************** \n"); 433 getch(); 434 return 0; 435 } 436 437 参 考 文 献 438 [1] 严蔚敏.数据结构[M].清华大学出版社.2007-03; 439 [2] 谭浩强.C程序设计[M].清华大学出版社.2010-06。
参 考 文 献
[1] 严蔚敏.数据结构[M].清华大学出版社.2007-03;
[2] 谭浩强.C程序设计[M].清华大学出版社.2010-06。