服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言实现单词助手功能

C语言实现单词助手功能

2021-08-04 11:53ぃAnn C/C++

这篇文章主要为大家详细介绍了C语言实现单词小助手,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现单词小助手的具体代码,供大家参考,具体内容如下

单词小助手

(声明:此程序非原创,是在已有程序上进行一些修改和添加)

一、题目分析

题目要求:

1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。

2.将单词测试中的功能完善,可针对做错的单词重复记忆。

3.查询单词的功能添加英文词查询,中文查询的功能完善(考虑如何显示同样中文意义,不同的英文单词)

分析:

要求2,将做错的单词保存在新的错词文件中,并增添加强记忆函数;

要求3,采用循环遍历,找寻与所输入中文意思对应的所有英文单词,并依据中文查询添加英文查询。

二、关键算法构造

错题巩固,英中流程图:

C语言实现单词助手功能

中文查询流程图:

C语言实现单词助手功能

三、程序实现

[cpp] view plaincopyprint?
  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],r[MAX_NUM]; //单词数组  
  12. int num;  //单词个数  
  13. int rnum;  //需加强巩固的单词个数  
  14. int n=1,select=1; //select为是否退出系统的标记  
  15. int d=0,c=0; //c为回答错误的次数,d为回答正确的次数  
  16. //帮助  
  17. void help()  
  18. {  
  19. printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");  
  20. printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");  
  21. }  
  22.   
  23. //从文件中读取单词的信息  
  24. void readfile()  
  25. {  
  26. FILE *fp;//声明一个文件  
  27. int i=0;  
  28. fp=fopen("data.txt","r");//打开文件data.txt  
  29. if(!fp)//若文件不存在  
  30. {  
  31. printf("\n打开文件data.txt失败!");  
  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)//若单词数为0  
  39. printf("\n文件为空,请选择词典维护增加词条!");  
  40. else  
  41. printf("\n");  
  42. fclose(fp);//关闭文件  
  43. }  
  44. //向文件中写入单词的信息  
  45. void writefile()  
  46. {  
  47. FILE *fp;//声明一个文件  
  48. int i=0;  
  49. fp=fopen("data.txt","w");  
  50. if(!fp)//若文件不存在  
  51. {  
  52. printf("\n打开文件data.txt失败!");  
  53. }  
  54. for(i=0;i<num;i++)//循环遍历写入单词  
  55. {  
  56. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);  
  57. }  
  58. printf("\n");  
  59. fclose(fp);//关闭文件  
  60. }  
  61. //读取错题巩固文件  
  62. void wreadfile()  
  63. {  
  64. FILE *fp;//声明一个文件  
  65. int i=0;  
  66. fp=fopen("redata.txt","r");//打开错题巩固文件  
  67. if(!fp)//若文件为空  
  68. {  
  69. printf("\n打开文件redata.txt失败!");  
  70. }  
  71. while(fscanf(fp,"%s %s",r[i].en,r[i].ch)==2)//读取下一个单词  
  72. {  
  73. i++;  
  74. }  
  75. rnum=i;//记录错词数  
  76. if(0==i)//若错次数为0  
  77. printf("\n你还没有错题哦!");  
  78. else  
  79. printf("\n");  
  80. fclose(fp);//关闭文件  
  81. }  
  82. //按字典排序  
  83. void sort()  
  84. {  
  85. int i,j;  
  86. char temp[MAX_CHAR];  
  87. for(i=0;i<num-1;i++)//循环遍历单词数  
  88. {  
  89. for(j=num-1;j>i;j--)//循环遍历当前单词之后的单词  
  90. if(strcmp(s[j-1].en,s[j].en)>0)/*若字符串s[j-1].en大于字符串s[j].en,则通过中间变量调换两个字符串*/  
  91. {  
  92. strcpy(temp,s[j-1].en);//调换英文字符串  
  93. strcpy(s[j-1].en,s[j].en);  
  94. strcpy(s[j].en,temp);  
  95. strcpy(temp,s[j-1].ch);//调换中文字符串  
  96. strcpy(s[j-1].ch,s[j].ch);  
  97. strcpy(s[j].ch,temp);  
  98. }  
  99. }  
  100. }  
  101. //添加单词信息  
  102. void add()  
  103. {  
  104. int i=num,j,flag=1;//定义变量  
  105. while(flag)  
  106. {  
  107. flag=0;  
  108. printf("\n请输入单词的英文形式:");  
  109. scanf("%s",s[i].en);//将所添加单词放在已有单词末尾  
  110. for(j=0;j<i;j++)//循环遍历已有单词,检查所添加单词是否重复  
  111. if(strcmp(s[i].en,s[j].en)==0)//若两个字符串相等  
  112. {  
  113. printf("已有该单词,请检查后重新录入!\n");  
  114. flag=1;  
  115. break/*如有重复立即退出该层循环,提高判断速度*/  
  116. }  
  117. }  
  118. printf("\n请输入单词的中文形式:");  
  119. scanf("%s",s[i].ch);  
  120. num++;  //单词数加1  
  121. printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch);  
  122. sort();//调用字典排序函数  
  123. }  
  124. //删除单词信息  
  125. void del()  
  126. {  
  127. int i=0,j=0;  
  128. char en[MAX_CHAR]; //英文形式  
  129. printf("\n请输入你要删除的单词英文形式:");  
  130. scanf("%s",en);  
  131. for(i=0;i<num;i++)/*循环遍历所有单词,找与所要删除的单词相等的字符串*/  
  132. if(strcmp(s[i].en,en)==0)  
  133. {  
  134. for(j=i;j<num-1;j++)  
  135. s[j]=s[j+1];  
  136. num--; //数量减少 1  
  137. return;  
  138. }  
  139. printf("\n没有这个单词!");  
  140.   
  141. }  
  142. //修改单词信息  
  143. void modify()  
  144. {  
  145. int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词  
  146. char en[MAX_CHAR]; //英文形式  
  147. while(flag||choose)  
  148. {  
  149. printf("\n请输入你要修改的单词英文形式:");  
  150. scanf("%s",en);  
  151. for(i=0;i<num;i++)//循环遍历单词,找与所要修改单词相等的字符串  
  152. if(strcmp(s[i].en,en)==0)  
  153. {  
  154. printf("\n请输入单词正确的英文形式:");  
  155. scanf("%s",s[i].en);  
  156. printf("\n请输入此单词正确的的中文形式:");  
  157. scanf("%s",s[i].ch);  
  158. printf("\n继续修改请选1,返回上一级请选0:");  
  159. scanf("%d",&choose);  
  160. if(choose==0) return;  
  161. }  
  162. flag=0;  
  163. }  
  164. if(!flag)  
  165. printf("\n没有这个单词!");  
  166. }  
  167. //单词预览  
  168. void show()  
  169. {  
  170. int i=0;  
  171. printf("\n单词: 英文  中文  ");  
  172. sort();  
  173. for(i=0;i<num;i++)  
  174. printf("\n  %-12s %-14s",s[i].en,s[i].ch);  
  175.   
  176. }  
  177. //英文查询  
  178. void searchen()  
  179. {  
  180. int i=0,choose=0,flag=1;  
  181. char en[MAX_CHAR]; //中文形式  
  182. while(choose||flag)  
  183. {  
  184. printf("\n请输入你要查询的单词英文形式:");  
  185. scanf("%s",en);  
  186. for(i=0;i<num;i++)//先找到该英文形式对应的序号  
  187. if(strcmp(s[i].en,en)==0)  
  188. {  
  189. printf("\n中文形式:%-12s 英文形式:%12s",s[i].ch,s[i].en);  
  190. }  
  191. printf("\n继续查询请选1,返回上一级请选0:");  
  192. scanf("%d",&choose);  
  193. if(choose==0) return;  
  194. flag=0;  
  195. }  
  196. if(!flag)  
  197. printf("\n没有这个单词!");  
  198. }  
  199. //中文查询  
  200. void searchch()  
  201. {  
  202. int i=0,choose=0,flag=1;  
  203. char ch[MAX_CHAR]; //中文形式  
  204. while(choose||flag)  
  205. {  
  206. printf("\n请输入你要查询的单词中文形式:");  
  207. scanf("%s",ch);  
  208. for(i=0;i<num;i++)//先找到该中文形式对应的序号  
  209. if(strcmp(s[i].ch,ch)==0)  
  210. {  
  211. printf("\n英文形式:%-12s 中文形式 :%12s",s[i].en,s[i].ch);  
  212. }  
  213. printf("\n继续查询请选1,返回上一级请选0:");  
  214. scanf("%d",&choose);  
  215. if(choose==0) return;  
  216.   
  217. flag=0;  
  218. }  
  219. if(!flag)  
  220. printf("\n没有这个单词!");  
  221. }  
  222.   
  223. //中译英测试  
  224. void zytest()  
  225. {  
  226. char b1[20];  
  227. int z;  
  228. int choose=1;//设置关键字  
  229. int i;  
  230. FILE *fp;//声明一个文件  
  231. while(choose)  
  232. {  
  233. fp=fopen("redata.txt","a+");//打开需巩固的错词文件  
  234. if(!fp)//若文件为空  
  235. {  
  236. printf("\n打开错词巩固文件redata.txt文件失败!");  
  237. }  
  238. i = rand()%num;//生成介于词库数目之间的随机数,随机抽取词库中的汉字  
  239. printf("\n【%s】请输入英文单词:",s[i].ch);  
  240. scanf("%s",b1);  
  241. for(z=0;strcmp(b1,s[i].en)!=0;z=z)//若所输入单词与汉字所对应单词不相等  
  242. {  
  243. fprintf(fp,"%s %s\n",s[i].en,s[i].ch);//回答错误时写入错词巩固文件  
  244. printf("\n输入错误!!请重新输入:");  
  245. scanf("%s",b1);  
  246. c=c+1; //做错单词数加1  
  247. rnum++; //单词巩固文件中单词数加1  
  248. }  
  249. fclose(fp); //关闭文件  
  250. printf("\n恭喜你,回答正确,加10分!\n\n");  
  251. d=d+1; //做对单词数加1  
  252. printf("(继续测试请选1,返回上一级请选0:)");  
  253. scanf("%d",&choose);  
  254. if(choose==0) return;  
  255.   
  256. }  
  257. }  
  258. //英译中测试  
  259. void yztest()  
  260. {  
  261. char b1[20];  
  262. int z,x=41;  
  263. int choose=1;  
  264. int i;  
  265. FILE *fp; //声明一个文件  
  266. while(choose)  
  267. {  
  268. fp=fopen("redata.txt","a+");//打开需巩固的错词文件  
  269. if(!fp)//若文件为空  
  270. {  
  271. printf("\n打开错词巩固文件redata.txt失败!");  
  272. }  
  273. i = rand()%num;//生成介于词库数目之间的随机数,随机抽取词库中的单词  
  274. printf("\n【%s】请输入中文意思:",s[i].en);  
  275. scanf("%s",b1);  
  276. for(z=0;strcmp(b1,s[i].ch)!=0;z=z)//若所输入汉字与单词所对应汉字不相等  
  277. {  
  278. fprintf(fp,"%s %s\n",s[i].en,s[i].ch);//回答错误时写入错词巩固文件中  
  279. printf("\n输入错误!!请重新输入:");scanf("%s",b1);  
  280. c=c+1; //做错单词数加1  
  281. rnum++;//单词巩固文件中单词数加1  
  282. }  
  283. fclose(fp);//关闭文件  
  284. printf("\n恭喜你,回答正确,加10分!");  
  285. d=d+1; //做对单词数加1  
  286. printf("\n\n继续测试请选1,返回上一级请选0:");  
  287. scanf("%d",&choose);  
  288. if(choose==0) return;  
  289. }  
  290. }  
  291. //中英加强记忆  
  292. void zyretest()  
  293. {  
  294. char b1[20];  
  295. int z;  
  296. int choose=1;  
  297. int i;  
  298. while(choose)  
  299. {  
  300. i = rand()%rnum;//生成介于错题巩固文件中单词数目之间的随机数,随机抽取词库中的汉字  
  301. printf("【%s】请输入英文单词:",r[i].ch);  
  302. scanf("%s",b1);  
  303. for(z=0;strcmp(b1,r[i].en)!=0;z=z)//若所输入单词与汉字所对应单词不相等  
  304. {  
  305. printf("\n输入错误!!请重新输入:");  
  306. scanf("%s",b1);  
  307. c=c+1;//做错单词数加1  
  308. }  
  309. printf("\n恭喜你,回答正确,加10分!\n");  
  310. d=d+1;//做对单词数加1  
  311. printf("\n继续测试请选1,返回上一级请选0:");  
  312. scanf("%d",&choose);  
  313. if(choose==0) return;  
  314. }  
  315. }  
  316. //英中加强记忆  
  317. void yzretest()  
  318. {  
  319. char b1[20];  
  320. int z;  
  321. int choose=1;  
  322. int i;  
  323. while(choose)  
  324. {  
  325. i = rand()%rnum;//生成介于错题巩固文件中单词数目之间的随机数,随机抽取词库中的单词  
  326. printf("【%s】请输入中文意思:",r[i].en);  
  327. scanf("%s",b1);  
  328. for(z=0;strcmp(b1,r[i].ch)!=0;z=z)//若所输入汉字与单词所对应汉字不相等  
  329. {  
  330. printf("输入错误!!请重新输入:");  
  331. scanf("%s",b1);  
  332. c=c+1;  
  333. }  
  334. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;  
  335. printf("\n继续测试请选1,返回上一级请选0:");  
  336. scanf("%d",&choose);  
  337. if(choose==0) return;  
  338. }  
  339. }  
  340. //成绩列表  
  341. void list()  
  342. {  
  343. printf("\n 共计输入错误:%d次 **每次扣10分**\n",c);  
  344. printf(" 共计输入正确:%d次 **每次加10分**\n",d);  
  345. printf(" 你的总得分为:%d分\n\n",10*d-10*c);  
  346.   
  347. }  
  348. //词典维护  
  349. void maintain()  
  350. {  
  351. int choose;//维护功能选择  
  352. printf(" ------------------\n");  
  353. printf(" 1.增加单词\n");  
  354. printf(" 2.修改单词\n");  
  355. printf(" 3.删除单词\n");  
  356. printf(" 4.英文查询\n");  
  357. printf(" 5.中文查询\n");  
  358. printf(" 6.退出本菜单\n");  
  359. printf(" ------------------\n");  
  360. while(1)  
  361. {  
  362. printf(" \n请输入维护功能编号:");  
  363. scanf("%d",&choose);  
  364. switch(choose)  
  365. {  
  366. case 1:  
  367. add();writefile();break;  
  368. case 2:  
  369. modify();writefile();break;  
  370. case 3:  
  371. del();writefile();break;  
  372. case 4:  
  373. searchen();break;  
  374. case 5:  
  375. searchch();break;  
  376. case 6: return;  
  377. default: printf("\n请在1-5之间选择");  
  378. }  
  379. }  
  380.   
  381. }  
  382. //用户界面  
  383. void menudisplay()  
  384. {  
  385. printf("\n");  
  386. printf("*********************************************************\n");  
  387. printf("#       #\n");  
  388. printf("#   英语单词小助手   #\n");  
  389. printf("#       #\n");  
  390. printf("#   版本 : v1.0    #\n");  
  391. printf("#       #\n");  
  392. printf("*********************************************************\n");  
  393. printf("#       #\n");  
  394. printf("# 0.词库维护  1.单词预览   #\n");  
  395. printf("#       #\n");  
  396. printf("# 2.单词背诵(中英) 3.单词背诵(英中)  #\n");  
  397. printf("#       #\n");  
  398. printf("# 4.查询成绩  5.错词巩固(中英)  #\n");  
  399. printf("#       #\n");  
  400. printf("# 6.错词巩固(英中) 7.帮助   #\n");  
  401. printf("#       #\n");  
  402. printf("# 8.退出系统     #\n");  
  403. printf("#       #\n");  
  404. printf("*********************************************************\n");  
  405. printf("\n");  
  406. }  
  407. void menu()  
  408. {  
  409. int item;  
  410. printf(" \n请选择您需要的操作序号(0-8)按回车确认:");  
  411. scanf("%d",&item);  
  412. printf("\n");  
  413. readfile();  
  414. switch(item)  
  415. {  
  416. case 0:  
  417. maintain();break;  
  418. case 1:  
  419. show();break;  
  420. case 2:  
  421. zytest();break;  
  422. case 3:  
  423. yztest(); break;  
  424. case 4:  
  425. list();break;  
  426. case 5:  
  427. wreadfile();zyretest();break;  
  428. case 6:  
  429. wreadfile();yzretest();break;  
  430. case 7:  
  431. help();break;  
  432. case 8:  
  433. select=0;break;  
  434. default:  
  435. printf("请在0-8之间选择\n");  
  436. }  
  437. }  
  438. int main()  
  439. {  
  440. menudisplay();  
  441. menu();  
  442. printf("\n需要显示菜单界面请输入1,直接选择请输入0:");  
  443. scanf("%d",&n);  
  444. switch(n)  
  445. {  
  446. case 1: menudisplay();  
  447. case 0:menu();  
  448. }  
  449. system("pause");  
  450. return 0;  
  451. }  

四、调试,测试及运行结果

调试:

在选择错题巩固功能时,错题文件中的单词无法成功被调出,调试发现错题文件单词总数rnum=0,但实际并不为0

C语言实现单词助手功能

随及对单词背诵函数进行调试,发现错误的单词可以被正确的记录到错题文件中,且错题总数rnum的值是正确的

C语言实现单词助手功能

在经过检查分析后发现在调用错题巩固函数前没有调用读取错题巩固文件函数,添加后程序运行正确,rnum的值正确

C语言实现单词助手功能

测试:

开始中文查询只能查到排序在前的一个单词

C语言实现单词助手功能

对中文查询函数进行代码测试,将是否继续查询移出for循环,使循环遍历所有单词组,得到满足中文意思的所有单词

C语言实现单词助手功能

运行结果:

英中及中英查询:

C语言实现单词助手功能

中英单词背诵:

C语言实现单词助手功能

英中单词背诵:

C语言实现单词助手功能

错题巩固,增强记忆(中英及英中):

C语言实现单词助手功能

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

原文链接:https://blog.csdn.net/c2607119981/article/details/89057788

延伸 · 阅读

精彩推荐
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16