C语言实现单词小助手

时间:2022-02-02 13:09:05

问题描述

对于任意给定的单词小助手程序(现有功能可以实现查单词的增删改查、中英、英中测试和分数显示功能),完善其单词查询、错误单词重复记忆和排行功能。

问题分析

首先附上给出的初始代码(已经可以实现基本功能)

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define MAX_CHAR 20 // 最大字符
  5. #define MAX_NUM 200 // 单词的最大个数
  6. struct word
  7. //单词的结构体
  8. {
  9. char en[MAX_CHAR]; // 英文形式
  10. char ch[MAX_CHAR]; //中文形式
  11. } s[MAX_NUM]; //单词数组
  12. int num; //单词个数
  13. int select=1;//select 为是否退出系统的标记
  14. int d=0,c=0;
  15. //帮助
  16. void help()
  17. {
  18. printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
  19. printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
  20. }
  21.  
  22. //从文件中读取单词的信息
  23. void readfile()
  24. {
  25. FILE *fp;
  26. int i=0;
  27. fp=fopen("data.txt","r");
  28. if(!fp)
  29. {
  30. printf("\n打开文件data.txt失败!");
  31.  
  32. }
  33. while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2)
  34. {
  35. i++;
  36. }
  37. num=i;
  38. if(0==i)
  39. printf("\n文件为空,请选择词典维护增加词条!");
  40. else
  41. printf("\n");
  42. fclose(fp);
  43.  
  44. }
  45. //从文件中读取单词的信息
  46. void writefile()
  47. {
  48. FILE *fp;
  49. int i=0;
  50. fp=fopen("data.txt","w");
  51. if(!fp)
  52. {
  53. printf("\n打开文件data.txt失败!");
  54.  
  55. }
  56. for(i=0;i<num;i++)
  57. {
  58. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);
  59. }
  60. printf("\n");
  61. fclose(fp);
  62. }
  63. void sort()/*按字典排序*/
  64. {
  65. int i,j;
  66. char temp[MAX_CHAR];
  67. for(i=0;i<num-1;i++)
  68. {
  69. for(j=num-1;j>i;j--)
  70. if(strcmp(s[j-1].en,s[j].en)>0)
  71. {
  72. strcpy(temp,s[j-1].en);
  73. strcpy(s[j-1].en,s[j].en);
  74. strcpy(s[j].en,temp);
  75. strcpy(temp,s[j-1].ch);
  76. strcpy(s[j-1].ch,s[j].ch);
  77. strcpy(s[j].ch,temp);
  78.  
  79. }
  80. }
  81. }
  82. //添加单词信息
  83. void add()
  84. {
  85. int i=num,j,flag=1;
  86. while(flag)
  87. {
  88. flag=0;
  89. printf("\n请输入单词的英文形式:");
  90. scanf("%s",s[i].en);
  91. for(j=0;j<i;j++)
  92. if(strcmp(s[i].en,s[j].en)==0)
  93. {
  94. printf("已有该单词,请检查后重新录入!\n");
  95. flag=1;
  96. break; /*如有重复立即退出该层循环,提高判断速度*/
  97. }
  98.  
  99. }
  100. printf("\n请输入单词的中文形式:");
  101. scanf("%s",s[i].ch);
  102. num++;
  103. printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch);
  104. sort();
  105. }
  106. //删除单词信息
  107. void del()
  108. {
  109. int i=0,j=0;
  110. char en[MAX_CHAR]; //英文形式
  111. printf("\n请输入你要删除的单词英文形式:");
  112. scanf("%s",en);
  113. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  114. if(strcmp(s[i].en,en)==0)
  115. {
  116. for(j=i;j<num-1;j++)
  117. s[j]=s[j+1];
  118. num--; //数量减少 1
  119. return;
  120. }
  121. printf("\n没有这个单词!");
  122.  
  123. }
  124. //修改单词信息
  125. void modify()
  126. {
  127. int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词
  128. char en[MAX_CHAR]; //英文形式
  129. while(flag||choose)
  130. {
  131. printf("\n请输入你要修改的单词英文形式:");
  132. scanf("%s",en);
  133. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  134. if(strcmp(s[i].en,en)==0)
  135. {
  136. printf("\n请输入单词正确的英文形式:");
  137. scanf("%s",s[i].en);
  138.  
  139. printf("\n请输入此单词正确的的中文形式:");
  140. scanf("%s",s[i].ch);
  141.  
  142. printf("\n继续修改请选1,返回上一级请选0:");
  143. scanf("%d",&choose);
  144. if(choose==0) return;
  145. }
  146. flag=0;
  147.  
  148. }
  149. if(!flag) printf("\n没有这个单词!");
  150. }
  151. //单词预览
  152. void show()
  153. {
  154. int i=0;
  155. printf("\n单词: 英文 中文 ");
  156. for(i=0;i<num;i++)
  157. printf("\n %-12s%-12s",s[i].en,s[i].ch);
  158.  
  159. }
  160. //查询单词
  161. void search()
  162. {
  163. int i=0,choose=0,flag=1;
  164. char ch[MAX_CHAR]; //中文形式
  165. while(choose||flag)
  166. {
  167. printf("\n请输入你要查询的单词中文形式:");
  168. scanf("%s",ch);
  169. for(i=0;i<num;i++)//先找到该中文形式对应的序号
  170. if(strcmp(s[i].ch,ch)==0)
  171. {
  172. printf("\n英文形式 中文形式 ");
  173. printf("\n %-12s%12s",s[i].en,s[i].ch);
  174.  
  175. printf("\n继续查询请选1,返回上一级请选0:");
  176. scanf("%d",&choose);
  177. if(choose==0) return;
  178. }
  179. flag=0;
  180. }
  181. if(!flag) printf("\n没有这个单词!");
  182. }
  183. //中译英测试
  184. void zytest()
  185. {
  186. char b1[20];
  187. int z;
  188. int choose=1;
  189. int i;
  190. while(choose)
  191. {
  192. i = rand()%num;
  193. printf("\n【%s】请输入英文单词:",s[i].ch);
  194. scanf("%s",b1);
  195. for(z=0;strcmp(b1,s[i].en)!=0;z=z)
  196. {
  197. printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1;}
  198. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  199. printf("\n继续测试请选1,返回上一级请选0:");
  200. scanf("%d",&choose);
  201. if(choose==0) return;
  202.  
  203. }
  204. }
  205. //英译中测试
  206. void yztest()
  207. {
  208. char b1[20];
  209. int z,x=41;
  210. int choose=1;
  211. int i;
  212. i = rand()%num;
  213. while(choose)
  214. {
  215. printf("【%s】请输入中文意思:",s[i].en);
  216. scanf("%s",b1);
  217. for(z=0;strcmp(b1,s[i].ch)!=0;z=z)
  218. {
  219. printf("输入错误!!请重新输入:");scanf("%s",b1);c=c+1;}
  220. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  221. printf("\n继续测试请选1,返回上一级请选0:");
  222. scanf("%d",&choose);
  223. if(choose==0) return;
  224. }
  225. }
  226. //成绩列表
  227. void list()
  228. {
  229. printf("\n 共计输入错误:%d次 **每次扣10分**\n",c);
  230. printf(" 共计输入正确:%d次 **每次加10分**\n",d);
  231. printf(" 你的总得分为:%d分\n\n",10*d-10*c);
  232.  
  233. }
  234. //词典维护
  235. void maintain()
  236. {
  237. int choose;//维护功能选择
  238. printf(" ------------------\n");
  239. printf(" 1.增加单词\n");
  240. printf(" 2.修改单词\n");
  241. printf(" 3.删除单词\n");
  242. printf(" 4.查询单词\n");
  243. printf(" 5.退出本菜单\n");
  244. printf(" ------------------\n");
  245. while(1)
  246. {
  247.  
  248. printf(" \n请输入维护功能编号:");
  249. scanf("%d",&choose);
  250.  
  251. switch(choose)
  252. {
  253. case 1:
  254. add();writefile();break;
  255. case 2:
  256. modify();writefile();break;
  257. case 3:
  258. del();writefile();break;
  259. case 4:
  260. search();break;
  261. case 5: return;
  262. default: printf("\n请在1-5之间选择");
  263. }
  264. }
  265. }
  266. //用户界面
  267. void menu()
  268. {
  269. int item;
  270. printf("\n");
  271. printf(" *********************************************************\n");
  272. printf("# #\n");
  273. printf("# 英语单词小助手 #\n");
  274. printf("# #\n");
  275. printf("# 版本 : v1.0 #\n");
  276. printf("# #\n");
  277. printf(" *********************************************************\n");
  278. printf("# #\n");
  279. printf("# 0.词库维护 1.单词预览 #\n");
  280. printf("# #\n");
  281. printf("# 2.单词背诵(中英) 3.单词背诵(英中) #\n");
  282. printf("# #\n");
  283. printf("# 4.查询成绩 5.帮助 #\n");
  284. printf("# #\n");
  285. printf("# 6.退出系统 #\n");
  286. printf("# #\n");
  287. printf(" **********************************************************\n");
  288. printf("\n");
  289. printf(" 请选择您需要的操作序号(0-5)按回车确认:");
  290.  
  291. scanf("%d",&item);
  292. printf("\n");
  293. readfile();
  294. switch(item)
  295. {
  296. case 0:
  297. maintain();break;
  298. case 1:
  299. show();break;
  300. case 2:
  301. zytest();break;
  302. case 3:
  303. yztest(); break;
  304. case 4:
  305. list();break;
  306. case 5:
  307. help();break;
  308. case 6:
  309. select =0;break;
  310. default:
  311. printf("请在0-6之间选择\n");
  312. }
  313. }
  314. int main()
  315. {
  316. while(select)
  317. {
  318. menu();
  319. }
  320. system("pause");
  321. return 0;
  322. }

感兴趣的用户可以自己运行测试,在这里仅附上一张主界面图,其余暂不赘述~

C语言实现单词小助手

关键算法构造

在这里参考了一些学长学姐写过的博客...

1>单词查询

由于这里要求在原有程序基础上添加显示同样中文意义,不同的英文单词的功能,因此我将查询函数分设立两个子模块:汉语查询、英语查询以解决显示同样中文意义,不同的英文单词和一词多义的情况。具体思想为:设置一个记录遍历单词数组的下标变量k初值为-1,在每次遍历之前置位-1,遍历的过程中如果遇到一次多译或一意多词的情况就更新下标变量k的值,以此录入多条单词意思,如果遍历结束k仍未-1就没有找到单词。

这里我以中文查询为例:

  1. //查中文
  2. void ChSearch()
  3. {
  4. char ch[MAX_CHAR]; //中文形式
  5. int choose=1;
  6. int flag;
  7. int k=-1;//查询到当前单词的中文下标
  8. while(choose==1)
  9. {
  10. //查找下一个单词时重置标志变量 k 和 flag
  11. k=-1;
  12. flag = 1;
  13. printf("输入要查询的单词的中文形式:");
  14. scanf("%s",ch);
  15. for(int i=0;i<num;i++)//遍历单词中文形式
  16. {
  17. if(strcmp(s[i].ch,ch)==0 && k==-1)
  18. {
  19. printf("\n 英文 中文 ");
  20. printf("\n %-12s%12s",s[i].en,s[i].ch);
  21. k=i;//记录当前下标
  22. }
  23. else if(strcmp(s[i].ch,ch)==0)//遍历到一译多词
  24. {
  25. printf("\n %-12s%12s",s[i].en,s[i].ch);
  26. k=i;//更新下标
  27. }
  28. }
  29. if(k==-1)//没有找到单词的情况
  30. {
  31. flag = 0;
  32. printf("啊哦,没有找到当前单词哦~");
  33. }
  34. printf("\n1.继续查询2.返回上一级:");
  35. scanf("%d",&choose);
  36. }
  37. }

2>错词重记

错词结构体定义:

  1. //错误单词的结构体
  2. struct wrongWord
  3. {
  4. char en[MAX_CHAR];
  5. char ch[MAX_CHAR];
  6. } w[MAX_NUM];//错误单词数组

依照个人理解,这里应该和单词背诵模块大同小异~建立一个错词结构体,把单词背诵过程中的错词记录下来,依次存到错词数组里就好~

3>用户排行

用户信息结构体:

  1. //用户信息结构体
  2. typedef struct user
  3. {
  4. char name[MAX_CHAR];
  5. int score;
  6. }user;
  7.  
  8. user users[MAX_USER];//用户结构体数组
  9. user nowuser;

再定义一个用户信息的结构体,规定用户上限,针对不同的用户存储不同的分数,在排行榜里展示~(时间有限,这里还没有实现)

运行结果

C语言实现单词小助手

程序源代码

这里仅供参考,因为还有部分功能没有完善......

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include<time.h>
  5. #define MAX_CHAR 20 // 最大字符
  6. #define MAX_NUM 200 // 单词的最大个数
  7. #define MAX_USER 5 //用户的最大个数
  8.  
  9. struct word
  10. //单词的结构体
  11. {
  12. char en[MAX_CHAR]; // 英文形式
  13. char ch[MAX_CHAR]; //中文形式
  14. } s[MAX_NUM]; //单词数组
  15.  
  16. //错误单词的结构体
  17. struct wrongWord
  18. {
  19. char en[MAX_CHAR];
  20. char ch[MAX_CHAR];
  21. } w[MAX_NUM];//错误单词数组
  22.  
  23. //用户信息结构体
  24. typedef struct user
  25. {
  26. char name[MAX_CHAR];
  27. int score;
  28. }user;
  29.  
  30. user users[MAX_USER];//用户结构体数组
  31. user nowuser;
  32.  
  33. int num;//单词个数
  34. int select=1;//select 为是否退出系统的标记
  35. int d=0,c=0;//c统计输入错误次数 d统计输入正确次数
  36.  
  37. //函数声明
  38. void ReciteAllVocabulary();
  39. void ReciteWrongVocabulary();
  40.  
  41. //读文件(单词词库)
  42. void ReadVocabularyFile()
  43. {
  44. FILE *fp;
  45. int i=0;
  46. fp=fopen("vocabulary.txt","r");
  47. if(!fp)
  48. {
  49. printf("\n打开文件vocabulary.txt失败!");
  50.  
  51. }
  52. while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2)//?
  53. {
  54. i++;
  55. }
  56. num=i;
  57. if(i==0)
  58. printf("\n哎呀,词库空空如也~,请先选择词典维护增加词条哦!\n");
  59. else
  60. printf("\n");
  61. fclose(fp);
  62. }
  63.  
  64. //读文件(错词词库)
  65. void ReadWrongVocabularyFile()
  66. {
  67. FILE *fp;
  68. int i = 0;
  69. int item= 0;
  70. fp = fopen("wrongvocabulary.txt","r");
  71. if(!fp)
  72. {
  73. printf("\n打开文件wrongVocabulary.txt失败!");
  74. }
  75. while(fscanf(fp,"%s %s ",w[i].en,w[i].ch)==2)//?
  76. {
  77. i++;
  78. }
  79. num=i;
  80. if(i==0)
  81. {
  82. printf("\n你的错词库当前没有单词~请先选择单词测试查漏补缺哦!\n");
  83. printf("1.单词测试 2.返回上一级 3.退出系统\n");
  84. scanf("%d",&item);
  85. switch(item)
  86. {
  87. case 1:
  88. ReciteAllVocabulary();
  89. break;
  90. case 2:
  91. return;
  92. case 3:
  93. exit(0);
  94.  
  95. }
  96. }
  97. else
  98. {
  99. printf("\n");
  100. }
  101. fclose(fp);
  102. }
  103.  
  104. //写文件(单词词库)
  105. void WriteVocabularyFile()
  106. {
  107. FILE *fp;
  108. int i=0;//?
  109. fp=fopen("vocabulary.txt","w");
  110. if(!fp)
  111. {
  112. printf("\n打开文件vocabulary.txt失败!");
  113.  
  114. }
  115. for(i=0;i<num;i++)
  116. {
  117. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);
  118. }
  119. printf("\n");
  120. fclose(fp);
  121. }
  122.  
  123. //写文件(错词库)
  124. void WriteWrongVocabularyFile()
  125. {
  126. FILE *fp;
  127. int i=0;
  128. fp=fopen("wrongvocabulary.txt","w");
  129. if(!fp)
  130. {
  131. printf("\n打开文件wrongvocabulary.txt失败!");
  132.  
  133. }
  134. for(i=0;i<num;i++)
  135. {
  136. fprintf(fp,"\n%s %s ",w[i].en,w[i].ch);
  137. }
  138. fclose(fp);
  139. printf("\n");
  140. }
  141.  
  142. //词库单词测试(中英+英中)
  143. void ReciteAllVocabulary()
  144. {
  145. int right = 0;//标志变量 答对right记为1 答错right置为0
  146. char b1[20];
  147. int choose=1;
  148. srand((unsigned int)time(NULL));
  149. int i=rand()%num;
  150. int j=0;
  151. int n;//由n产生一个1或2的随机数 1对应英译中测试 2对应中译英测试
  152. while(choose)
  153. {
  154. right=0;
  155. n = rand()%2+1;
  156. i = rand()%num;
  157. if(right==0)
  158. {
  159. if(n==1)//英译中
  160. {
  161. printf("\n【%s】请输入中文意思:",s[i].en);
  162. scanf("%s",b1);
  163. if(strcmp(b1,s[i].ch)!=0)//输入的单词和词库的单词不相同
  164. {
  165. printf("\n你记错啦,要加油哦!");
  166. right = 0;
  167. printf("\n正确形式:%s%5s",s[i].en,s[i].ch);
  168. strcpy(w[j].ch,s[j].ch);//将记错的单词(中文形式)录入错词库
  169. strcpy(w[j].en,s[j].en);//将记错的单词(英文形式)录入错词库
  170. }
  171. else
  172. right =1;
  173. }
  174. else if(n==2)//中译英
  175. {
  176. printf("\n【%s】请输入英文单词:",s[i].ch);
  177. scanf("%s",b1);
  178. if(strcmp(b1,s[i].en)!=0)
  179. {
  180. printf("\n你记错啦,要加油哦!\n");
  181. printf("\n正确形式:%s%5s",s[i].en,s[i].ch);
  182. right =0;
  183. strcpy(w[j].ch,s[j].ch);
  184. strcpy(w[j].en,s[j].en);
  185. }
  186. else
  187. right=1;
  188. }
  189. j++;
  190. }
  191. if(right==1)
  192. {
  193. printf("\n恭喜你,回答正确,加10分!\n\n");
  194. right = 1;
  195. }
  196. printf("\n继续测试请选1,返回上一级请选0:");
  197. scanf("%d",&choose);
  198. }
  199. if(choose==0)
  200. return;
  201. WriteWrongVocabularyFile();
  202. }
  203.  
  204. void Sort()/*按字典排序*/
  205. {
  206. int i,j;
  207. char temp[MAX_CHAR];
  208. for(i=0;i<num-1;i++)
  209. {
  210. for(j=num-1;j>i;j--)
  211. if(strcmp(s[j-1].en,s[j].en)>0)
  212. {
  213. strcpy(temp,s[j-1].en);
  214. strcpy(s[j-1].en,s[j].en);
  215. strcpy(s[j].en,temp);
  216. strcpy(temp,s[j-1].ch);
  217. strcpy(s[j-1].ch,s[j].ch);
  218. strcpy(s[j].ch,temp);
  219. }
  220. }
  221. }
  222.  
  223. //添加单词信息
  224. void Add()
  225. {
  226. int i=num,j,flag=1;//num,i为单词总个数
  227. while(flag)
  228. {
  229. flag=0;
  230. printf("\n请输入单词的英文形式:");
  231. scanf("%s",s[i].en);
  232. for(j=0;j<i;j++)
  233. if(strcmp(s[i].en,s[j].en)==0)//比较当前录入的单词在现有词库中是否已经存在
  234. {
  235. printf("已有该单词,请检查后重新录入!\n");
  236. flag=1;
  237. break; //如有重复立即退出该层循环,提高判断速度
  238. }
  239.  
  240. }
  241. printf("\n请输入单词的中文形式:");
  242. scanf("%s",s[i].ch);
  243. num++;
  244. printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch);
  245. Sort();
  246. }
  247.  
  248. //删除单词信息
  249. void del()
  250. {
  251. int i=0,j=0;
  252. char en[MAX_CHAR]; //英文形式
  253. printf("\n请输入你要删除的单词英文形式:");
  254. scanf("%s",en);
  255. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  256. if(strcmp(s[i].en,en)==0)
  257. {
  258. for(j=i;j<num-1;j++)
  259. s[j]=s[j+1];
  260. num--; //数量减少 1
  261. return;
  262. }
  263. printf("\n没有这个单词!");
  264. }
  265.  
  266. //修改单词信息
  267. void Modify()
  268. {
  269. int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词
  270. char en[MAX_CHAR]; //英文形式
  271. while(flag||choose)
  272. {
  273. printf("\n请输入你要修改的单词英文形式:");
  274. scanf("%s",en);
  275. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  276. {
  277. if(strcmp(s[i].en,en)==0)
  278. {
  279. printf("\n请输入单词正确的英文形式:");
  280. scanf("%s",s[i].en);
  281.  
  282. printf("\n请输入此单词正确的的中文形式:");
  283. scanf("%s",s[i].ch);
  284.  
  285. printf("\n继续修改请选1,返回上一级请选0:");
  286. scanf("%d",&choose);
  287. if(choose==0) return;
  288. }
  289. }
  290. flag=0;
  291. }
  292. if(!flag) printf("\n没有这个单词!");
  293. }
  294.  
  295. //单词预览
  296. void ShowAllVocabulary()
  297. {
  298. int i=0;
  299. printf("\n 英文 中文 ");
  300. for(i=0;i<num;i++)
  301. {
  302. printf("\n %-12s%-12s",s[i].en,s[i].ch);
  303. }
  304. }
  305.  
  306. //错词预览
  307. void ShowWrongVocabulary()
  308. {
  309. int i=0;
  310. printf("\n 英文 中文 ");
  311. for(i=0;i<num;i++)
  312. {
  313. printf("\n %-12s%-12s",w[i].en,w[i].ch);
  314. }
  315. }
  316.  
  317. //查中文
  318. void ChSearch()
  319. {
  320. char ch[MAX_CHAR]; //中文形式
  321. int choose=1;
  322. int flag;
  323. int k=-1;//查询到当前单词的中文下标
  324. while(choose==1)
  325. {
  326. //查找下一个单词时重置标志变量 k 和 flag
  327. k=-1;
  328. flag = 1;
  329. printf("输入要查询的单词的中文形式:");
  330. scanf("%s",ch);
  331. for(int i=0;i<num;i++)//遍历单词中文形式
  332. {
  333. if(strcmp(s[i].ch,ch)==0 && k==-1)
  334. {
  335. printf("\n 英文 中文 ");
  336. printf("\n %-12s%12s",s[i].en,s[i].ch);
  337. k=i;//记录当前下标
  338. }
  339. else if(strcmp(s[i].ch,ch)==0)//遍历到一译多词
  340. {
  341. printf("\n %-12s%12s",s[i].en,s[i].ch);
  342. k=i;//更新下标
  343. }
  344. }
  345. if(k==-1)//没有找到单词的情况
  346. {
  347. flag = 0;
  348. printf("啊哦,没有找到当前单词哦~");
  349. }
  350. printf("\n1.继续查询2.返回上一级:");
  351. scanf("%d",&choose);
  352. }
  353. }
  354.  
  355. void EnSearch()
  356. {
  357. char en[MAX_CHAR]; //英文形式
  358. int choose=1;
  359. int flag;
  360. int k=-1;//查询到当前单词的英文下标
  361. while(choose==1)
  362. {
  363. //查找下一个单词时重置标志变量 k 和 flag
  364. k=-1;
  365. flag = 1;
  366. printf("输入要查询的单词的英文形式:");
  367. scanf("%s",en);
  368. for(int i=0;i<num;i++)//遍历单词英文形式
  369. {
  370. if(strcmp(s[i].en,en)==0 && k==-1)
  371. {
  372. printf("\n 英文 中文 ");
  373. printf("\n %-12s%12s",s[i].en,s[i].ch);
  374. k=i;//记录当前下标
  375. }
  376. else if(strcmp(s[i].en,en)==0)//遍历到一词多译
  377. {
  378. printf("\n %-12s%12s",s[i].en,s[i].ch);
  379. k=i;//更新下标
  380. }
  381. }
  382. if(k==-1)//没有找到单词的情况
  383. {
  384. flag = 0;
  385. printf("啊哦,没有找到当前单词哦~");
  386. }
  387. printf("\n1.继续查询2.返回上一级:");
  388. scanf("%d",&choose);
  389. }
  390. }
  391.  
  392. //查询单词
  393. void Search()
  394. {
  395. int i=0;
  396. char en[MAX_CHAR]; //英文形式
  397. int choice;
  398. while(1)
  399. {
  400. printf("1.查中文2.查英文3.返回上一级:");
  401. scanf("%d",&choice);
  402. switch(choice)
  403. {
  404. case 1:
  405. ChSearch();
  406. break;
  407. case 2:
  408. EnSearch();
  409. case 3:
  410. return;
  411.  
  412. }
  413. }
  414. }
  415.  
  416. //背诵错误的单词
  417. void ReciteWrongVocabulary()
  418. {
  419. ReadWrongVocabularyFile();
  420. int right = 0;//标志变量 答对right记为1 答错right置为0
  421. char b1[20];
  422. int choose=1;
  423. int i;
  424. int j=0;
  425. i = rand()%num;
  426. srand((unsigned int)time(NULL));
  427. int n;//由n产生一个1或2的随机数 1对应英译中测试 2对应中译英测试
  428. while(choose)
  429. {
  430. right=0;
  431. n = rand()%2+1;
  432. i = rand()%num;
  433. if(right==0)
  434. {
  435. if(n==1)//英译中
  436. {
  437. printf("\n【%s】请输入中文意思:",s[i].en);
  438. scanf("%s",b1);
  439. if(strcmp(b1,w[i].ch)!=0)//输入的单词和词库的单词不相同
  440. {
  441. printf("\n你记错啦,要加油哦!");
  442. right = 0;
  443. }
  444. else
  445. right =1;
  446. }
  447. else if(n==2)//中译英
  448. {
  449. printf("\n【%s】请输入英文单词:",s[i].ch);
  450. scanf("%s",b1);
  451. if(strcmp(b1,w[i].en)!=0)
  452. {
  453. printf("\n你记错啦,要加油哦!\n");
  454. right =0;
  455. }
  456. else
  457. right=1;
  458. }
  459. j++;
  460. }
  461. if(right==1)
  462. {
  463. printf("\n恭喜你,回答正确,加10分!\n\n");
  464. right = 1;
  465. }
  466. printf("\n继续测试请选1,返回上一级请选0:");
  467. scanf("%d",&choose);
  468. }
  469. if(choose==0)
  470. return;
  471. WriteWrongVocabularyFile();
  472. }
  473.  
  474. //成绩列表
  475. void List()
  476. {
  477. printf("--------------------英雄榜--------------------\n");
  478.  
  479. printf("\n 共计输入错误:%d次 **每次扣10分**\n",c);
  480. printf(" 共计输入正确:%d次 **每次加10分**\n",d);
  481. printf(" 你的总得分为:%d分\n\n",10*d-10*c);
  482.  
  483. }
  484.  
  485. //帮助
  486. void Help()
  487. {
  488. printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
  489. printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
  490. }
  491.  
  492. //英雄榜
  493. void Rank()
  494. {
  495. printf("该系统尚未开放!");
  496. }
  497.  
  498. //词典维护
  499. void Maintain()
  500. {
  501. int choose;//维护功能选择
  502. printf(" ------------------\n");
  503. printf(" 1.增加单词\n");
  504. printf(" 2.修改单词\n");
  505. printf(" 3.删除单词\n");
  506. printf(" 4.查询单词\n");
  507. printf(" 5.退出本菜单\n");
  508. printf(" ------------------\n");
  509. while(1)
  510. {
  511.  
  512. printf(" \n请输入维护功能编号:");
  513. scanf("%d",&choose);
  514.  
  515. switch(choose)
  516. {
  517. case 1:
  518. Add();
  519. WriteVocabularyFile();
  520. break;
  521. case 2:
  522. Modify();
  523. WriteVocabularyFile();
  524. break;
  525. case 3:
  526. del();
  527. WriteVocabularyFile();
  528. break;
  529. case 4:
  530. Search();
  531. break;
  532. case 5: return;
  533. default: printf("\n请在1-5之间选择");
  534. }
  535. }
  536. }
  537.  
  538. //用户界面
  539. void Menu()
  540. {
  541. int item;
  542. printf("\n");
  543. printf("*********************************************************\n");
  544. printf("# #\n");
  545. printf("# 英语单词小助手 #\n");
  546. printf("# #\n");
  547. printf("# 版本 : v1.1 #\n");
  548. printf("# #\n");
  549. printf(" ********************************************************\n");
  550. printf("# #\n");
  551. printf("# 0.词库维护 1.单词预览 #\n");
  552. printf("# #\n");
  553. printf("# 2.单词背诵 3.强化记忆 #\n");
  554. printf("# #\n");
  555. printf("# 4.查询成绩 5.帮助 #\n");
  556. printf("# #\n");
  557. printf("# 6.错词预览 7.英雄榜 #\n");
  558. printf("# #\n");
  559. printf("# 8.退出系统 #\n");
  560. printf("# #\n");
  561. printf(" ********************************************************\n");
  562. printf("\n");
  563. printf("请选择您需要的操作序号(0-7)按回车确认:");
  564. scanf("%d",&item);
  565. printf("\n");
  566. ReadVocabularyFile();
  567. switch(item)
  568. {
  569. case 0:
  570. Maintain();
  571. break;
  572. case 1:
  573. ShowAllVocabulary();
  574. break;
  575. case 2:
  576. ReciteAllVocabulary();
  577. break;
  578. case 3:
  579. ReciteWrongVocabulary();
  580. break;
  581. case 4:
  582. List();
  583. break;
  584. case 5:
  585. Help();
  586. break;
  587. case 6:
  588. ShowWrongVocabulary();
  589. case 7:
  590. Rank();
  591. break;
  592. case 8:
  593. select =0;
  594. default:
  595. printf("请在0-6之间选择\n");
  596. }
  597. }
  598.  
  599. int main()
  600. {
  601. while(select)
  602. {
  603. Menu();
  604. }
  605. system("pause");
  606. return 0;
  607. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/qq_42611113/article/details/89061440