C语言实现单词小助手功能完善版

时间:2022-04-11 04:46:22

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

一.题目分析

1、在原有代码基础上添加文档注释,函数注释及语句注释,使代码风格良好,易于阅读和修改。

2、完善功能,实现背单词时出错词的重复记忆。

3、在词库维护选项中添加中英文分别查询的功能

4、完成输如数据的正确性验证,如:在菜单选择时输入不规范的错误提示、在添加单词时英文输入时输入汉语的异常排除等

二.关键算法构造

1.总菜单项目选择及maintain函数子选项的输入异常检查及提示。

C语言实现单词小助手功能完善版

C语言实现单词小助手功能完善版

2.添加单词

C语言实现单词小助手功能完善版

C语言实现单词小助手功能完善版

三.程序实现

  1. #include <string.h>
  2. #include <stdlib.h>
  3. #define MAX_CHAR 20 // 最大字符
  4. #define MAX_NUM 200 // 单词的最大个数
  5. struct word
  6. //单词的结构体
  7. {
  8. char en[MAX_CHAR]; // 英文形式
  9. char ch[MAX_CHAR]; //中文形式
  10. } s[MAX_NUM],r[MAX_NUM]; //单词数组
  11. int num; //词典单词个数
  12. int rnum = 0; //增强记忆单词个数
  13. int select=1;//select 为是否退出系统的标记
  14. int d=0,c=0;//c为答错的次数,d为答对的次数
  15. //帮助
  16. void help()
  17. {
  18. printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
  19. printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
  20. }
  21. //从文件中读取单词的信息
  22. void readfile()
  23. {
  24. FILE *fp;
  25. int i=0;
  26. fp=fopen("data.txt","r");
  27. if(!fp)
  28. {
  29. printf("\n打开文件data.txt失败!");
  30. }
  31. while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2)
  32. {
  33. i++;
  34. }
  35. num=i;
  36. if(0==i)
  37. printf("\n文件为空,请选择词典维护增加词条!");
  38. else
  39. printf("\n");
  40. fclose(fp);
  41. }
  42. //向文件中写入单词
  43. void writefile()
  44. {
  45. FILE *fp;
  46. int i=0;
  47. fp=fopen("data.txt","w");
  48. if(!fp)
  49. {
  50. printf("\n打开文件data.txt失败!");
  51. }
  52. for(i=0;i<num;i++)
  53. {
  54. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);
  55. }
  56. printf("\n");
  57. fclose(fp);
  58. }
  59. //从增强记忆文件中读取单词
  60. void readRemeberfile()
  61. {
  62. FILE *fp;
  63. int i=0;
  64. fp=fopen("Remeberdata.txt","r");
  65. if(!fp)
  66. {
  67. printf("\n打开文件Remeberdata.txt失败!");
  68. }
  69. while(fscanf(fp,"%s %s ",r[i].en,r[i].ch)==2)
  70. {
  71. i++;
  72. }
  73. rnum=i;
  74. if(0==i)
  75. printf("\n你还没有错题哦!");
  76. else
  77. printf("\n");
  78. fclose(fp);
  79. }
  80. void sort()/*按字典排序*/
  81. {
  82. int i,j;
  83. char temp[MAX_CHAR];
  84. for(i=0;i<num-1;i++)
  85. {
  86. for(j=num-1;j>i;j--)
  87. if(strcmp(s[j-1].en,s[j].en)>0)//string类strcmp函数通过Ascll 码逐字符比较
  88. {
  89. strcpy(temp,s[j-1].en);
  90. strcpy(s[j-1].en,s[j].en);
  91. strcpy(s[j].en,temp);
  92. strcpy(temp,s[j-1].ch);
  93. strcpy(s[j-1].ch,s[j].ch);
  94. strcpy(s[j].ch,temp);
  95.  
  96. }
  97. }
  98. }
  99. //添加单词信息
  100. void add()
  101. {
  102. int i=num,j,flag=1,a;
  103. f: while(flag)
  104. {
  105. flag=0;
  106. printf("\n请输入单词的英文形式:");
  107. scanf("%s",s[i].en);
  108. //strncpy(c,s[i].en.c_str(),s[i].en.length());
  109. for(a=0;a<20;a++)
  110. {if(s[i].en[a]>>8==0)
  111. {
  112. continue;
  113. }
  114. else
  115. {printf("输入不是纯英文,请重新输入");
  116. flag=1;
  117. goto f;//当不是纯英文输入时跳转
  118. }
  119. }
  120. //if(a!=19) continue;
  121. for(j=0;j<i;j++)
  122. if(strcmp(s[i].en,s[j].en)==0)//与已有单词比较
  123. {
  124. printf("已有该单词,请检查后重新录入!\n");
  125. flag=1;
  126. break; /*如有重复立即退出该层循环,提高判断速度*/
  127. }
  128.  
  129. }
  130. printf("\n请输入单词的中文形式:");
  131. scanf("%s",s[i].ch);
  132. num++;
  133. printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch);
  134. sort();
  135. }
  136. //删除单词信息
  137. void del()
  138. {
  139. int i=0,j=0;
  140. char en[MAX_CHAR];//英文形式
  141. printf("\n请输入你要删除的单词英文形式:");
  142. scanf("%s",en);
  143. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  144. if(strcmp(s[i].en,en)==0)//判断已有单词中是否存在此词
  145. {
  146. for(j=i;j<num-1;j++)
  147. s[j]=s[j+1];
  148. num--; //数量减少 1
  149. return;
  150. }
  151. printf("\n没有这个单词!");
  152.  
  153. }
  154. //修改单词信息
  155. void modify()
  156. {
  157. int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词
  158. char en[MAX_CHAR]; //英文形式
  159. while(flag||choose)
  160. {
  161. printf("\n请输入你要修改的单词英文形式:");
  162. scanf("%s",en);
  163. for(i=0;i<num;i++)//先找到该英文形式对应的序号
  164. if(strcmp(s[i].en,en)==0)
  165. {
  166. printf("\n请输入单词正确的英文形式:");
  167. scanf("%s",s[i].en);
  168.  
  169. printf("\n请输入此单词正确的的中文形式:");
  170. scanf("%s",s[i].ch);
  171.  
  172. printf("\n继续修改请选1,返回上一级请选0:");
  173. scanf("%d",&choose);
  174. if(choose==0) return;
  175. }
  176. flag=0;
  177.  
  178. }
  179. if(!flag)
  180. printf("\n没有这个单词!");
  181. }
  182. //单词预览
  183. void show()
  184. {
  185. int i=0;
  186. printf("\n单词: 英文 中文 ");//格式对齐
  187. for(i=0;i<num;i++)
  188. printf("\n %-15s%-13s",s[i].en,s[i].ch);//单词预览
  189. }
  190. //查询单词
  191. void search()
  192. {
  193. int i=0,choose=0,flag=1;
  194. char ch[MAX_CHAR];//中文形式
  195. while(choose||flag)
  196. {
  197. printf("\n请输入你要查询的单词中文形式:");
  198. scanf("%s",ch);
  199. for(i=0;i<num;i++)//先找到该中文形式对应的序号
  200. if(strcmp(s[i].ch,ch)==0)
  201. {
  202. printf("\n英文形式 中文形式 ");
  203. printf("\n %-12s%12s",s[i].en,s[i].ch);
  204.  
  205. printf("\n继续查询请选1,返回上一级请选0:");
  206. scanf("%d",&choose);
  207. if(choose==0) return;}
  208. flag=0;
  209. }
  210. if(!flag) printf("\n没有这个单词!");
  211. }
  212. //查询单词(英)
  213. void ysearch()
  214. {
  215. int i=0,choose=0,flag=1;
  216. char en[MAX_CHAR]; //英文形式
  217. while(choose||flag)
  218. {
  219. printf("\n请输入你要查询的单词英文形式:");
  220. scanf("%s",en);
  221. for(i=0;i<num;i++)//先找到该中文形式对应的序号
  222. if(strcmp(s[i].en,en)==0)
  223. {
  224. printf("\n英文形式 中文形式 ");
  225. printf("\n %-12s%12s",s[i].en,s[i].ch);
  226.  
  227. printf("\n继续查询请选1,返回上一级请选0:");
  228. scanf("%d",&choose);
  229. if(choose==0) return;
  230. }
  231. flag=0;
  232. }
  233. if(!flag) printf("\n没有这个单词!");
  234. }
  235. //中译英测试
  236. void zytest()
  237. {
  238. char b1[20];
  239. int z;
  240. int choose=1;
  241. int i;
  242. FILE *fp;
  243.  
  244. while(choose)
  245. {
  246. fp=fopen("Remeberdata.txt","a+");//打开增强记忆文件
  247. if(!fp)
  248. {
  249. printf("\n打开文件Remeberdata.txt失败!");
  250. }
  251. i = rand()%num;//在已有词汇中随机选取
  252. printf("\n【%s】请输入英文单词:",s[i].ch);
  253. scanf("%s",b1);
  254. int flag = 0;
  255. for(z=0;strcmp(b1,s[i].en)!=0;z++)
  256. {
  257. if(z<=3){
  258.  
  259. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//回答错误时写入增强记忆文件
  260. printf("\n");
  261. printf("\n输入错误!!请重新输入:");
  262. scanf("%s",b1);c=c+1;
  263.  
  264. rnum++;}
  265. else{
  266. printf("小伙子,挣扎有用吗,快滚去看字典");
  267. flag=1;
  268. break;
  269. }
  270. }
  271. if(flag)
  272. {return;
  273. }
  274. fclose(fp);
  275. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  276. printf("\n继续测试请选1,返回上一级请选0:");
  277. scanf("%d",&choose);
  278. if(choose==0) return;
  279.  
  280. }
  281. }
  282. //英译中测试
  283. void yztest()
  284. {
  285. char b1[20];
  286. int z,x=41;
  287. int choose=1;
  288. int i;
  289. //i = rand()%num;写入循环中
  290. FILE *fp;
  291.  
  292. while(choose)
  293. {
  294. i = rand()%num;
  295. fp=fopen("Remeberdata.txt","a+");
  296. if(!fp)
  297. {
  298. printf("\n打开文件Remeberdata.txt失败!");//打开增强记忆文件
  299. }
  300. printf("【%s】请输入中文意思:",s[i].en);
  301. scanf("%s",b1);
  302. int flag = 0;
  303. for(z=0;strcmp(b1,s[i].ch)!=0;z++)
  304. {if(z<=3){
  305.  
  306. fp=fopen("Remeberdata.txt","a+");
  307. if(!fp)
  308. {
  309. printf("\n打开文件Remeberdata.txt失败!");
  310. }
  311. fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//回答错误时写入增强记忆文件
  312. printf("\n");
  313. printf("输入错误!!请重新输入:");}
  314. else
  315. {printf("小伙子,别挣扎了,看词典吧 ");
  316. flag = 1;
  317. break;}
  318. scanf("%s",b1);c=c+1;
  319. rnum++;
  320. }
  321.  
  322. if(flag)
  323. {
  324. return ;
  325. }fclose(fp);
  326.  
  327. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  328. printf("\n继续测试请选1,返回上一级请选0:");
  329. scanf("%d",&choose);
  330. if(choose==0) return;
  331. }
  332. }
  333. //中英增强记忆
  334. void zyRetest()
  335. {
  336. char b1[20];
  337. int z;
  338. int choose=1;
  339. int i;
  340. int m = 0;
  341. while(choose)
  342. {
  343. i = rand()%rnum;
  344. printf("\n【%s】请输入英文单词:",r[i].ch);
  345. scanf("%s",b1);
  346. for(z=0;strcmp(b1,r[i].en)!=0;z=z)
  347. {
  348. printf("\n输入错误!!请重新输入:");
  349. scanf("%s",b1);c=c+1;
  350. }
  351. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  352. printf("\n继续测试请选1,返回上一级请选0:");
  353. scanf("%d",&choose);
  354. if(choose==0) return;
  355.  
  356. }
  357. }
  358. //英中增强记忆
  359. void yzRetest()
  360. {
  361. char b1[20];
  362. int z,x=41;
  363. int choose=1;
  364. int i;
  365. while(choose)
  366. {
  367. i = rand()%num;
  368. printf("【%s】请输入中文意思:",r[i].en);
  369. scanf("%s",b1);
  370. for(z=0;strcmp(b1,r[i].ch)!=0;z=z)
  371. {
  372. printf("输入错误!!请重新输入:");
  373. scanf("%s",b1);c=c+1;
  374. }
  375. printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
  376. printf("\n继续测试请选1,返回上一级请选0:");
  377. scanf("%d",&choose);
  378. if(choose==0) return;
  379. }
  380. }
  381. //成绩列表
  382. void list()
  383. {
  384. printf("\n共计输入错误:%d次**每次扣10分**\n",c);
  385. printf("共计输入正确:%d次**每次加10分**\n",d);
  386. printf("你的总得分为:%d分\n\n",10*d-10*c);//计算最后得分
  387. }
  388. //词典维护
  389. int maintain()
  390. {
  391. int choose;//维护功能选择
  392. printf(" ------------------\n");
  393. printf(" 1.增加单词\n");
  394. printf(" 2.修改单词\n");
  395. printf(" 3.删除单词\n");
  396. printf(" 4.查询单词(中)\n");
  397. printf(" 5.查询单词(英)\n");
  398. printf(" 6.退出本菜单\n");
  399. printf(" ------------------\n");
  400.  
  401. while(1)
  402. {
  403.  
  404. printf(" \n请输入维护功能编号:");//输入非法排错
  405. scanf("%d",&choose);
  406. int ret;
  407. ret=choose;
  408. while (ret != 1||ret !=2||ret!=3||ret!=4||ret!=5||ret!=6)//将输入限定在0-6的整数
  409. { if(ret>6||ret<=0){
  410.  
  411. while (getchar() != '\n');
  412. printf("error input,please again.\n");
  413. scanf("%d",&choose);
  414. ret =choose;
  415. }
  416. else
  417. break;
  418.  
  419. }//直到输入的值为整数*/
  420. ret=choose;
  421. switch(ret)
  422. {
  423. case 1:
  424. add();writefile();break;
  425. case 2:
  426. modify();writefile();break;
  427. case 3:
  428. del();writefile();break;
  429. case 4:
  430. search();break;
  431. case 5:
  432. ysearch();break;
  433. case 6: return 0;
  434. default: printf("\n请在1-6之间选择");
  435. }
  436. }
  437. }
  438. //用户界面
  439. void menu()
  440. {
  441. int item;
  442. printf(" \n");
  443. printf(" __________________________________________________________\n");
  444. printf(" || ||\n");
  445. printf(" || 英语单词小助手 ||\n");
  446. printf(" || ||\n");
  447. printf(" || 版本 : v1.0 ||\n");
  448. printf(" || ||\n");
  449. printf(" __________________________________________________________\n");
  450. printf(" || ||\n");
  451. printf(" || 0.词库维护 1.单词预览 ||\n");
  452. printf(" || ||\n");
  453. printf(" || 2.单词背诵(中英) 3.单词背诵(英中) ||\n");
  454. printf(" || ||\n");
  455. printf(" || 4.查询成绩 5.帮助 ||\n");
  456. printf(" || ||\n");
  457. printf(" || 6.增强记忆(中英) 7.增强记忆(英中) ||\n");
  458. printf(" || ||\n");
  459. printf(" || 8.退出 ||\n");
  460. printf(" || ||\n");
  461. printf(" __________________________________________________________\n");
  462. printf("\n");
  463. printf(" 请选择您需要的操作序号(0-8)按回车确认:");
  464.  
  465. scanf("%d",&item);
  466. printf("\n");
  467. int ret;
  468. ret=item;
  469. while (ret != 1||ret !=2||ret!=3||ret!=4||ret!=5||ret!=6||ret!=7||ret!=8)//将输入限定在0-6的整数
  470. { if(ret>8||ret<0){
  471.  
  472. while (getchar() != '\n');
  473. printf("error input,please again.\n");
  474. scanf("%d",&item);
  475. ret =item;
  476. }
  477. else
  478. break;
  479.  
  480. }//直到输入的值为整数*/
  481. ret=item;
  482. readfile();
  483. switch(ret)
  484. {
  485. case 0:
  486. show();maintain();break;//词库维护
  487. case 1:
  488. show();break; //单词预览
  489. case 2:
  490. zytest();break;//中英背词测试
  491. case 3:
  492. yztest(); break;//英中背刺测试
  493. case 4:
  494. list();break;//成绩查询
  495. case 5:
  496. help();break;//使用帮助
  497. case 6:
  498. readRemeberfile();zyRetest();break;//调用文件读入已插入词汇,进行重复中英记忆
  499. case 7:
  500. readRemeberfile();yzRetest();break;// 调用文件读入已插入词汇,进行重复英中记忆
  501. case 8:
  502. select =0;break;//退出子选项
  503. default:
  504. printf("请在0-8之间选择\n");
  505. }
  506. }
  507. int main()
  508. {
  509. while(select)
  510. {
  511. menu();
  512. }
  513. system("pause");
  514. return 0;
  515. }

四.经验归纳

此次程序设计在原有基础程序的基础上,实现功能的完善,侧重于程序的结构化及精细化编写。在单词汉英查询模块,使用了string库 strcmp函数,利用字符Ascll码的比较实现字符的相同与否判断。在判断输入输入字符是否为纯英文时,用到位运算右移八位得到最高位二进制,1则为汉语,0为英文。

通过本次程序代码编写,再次熟悉了文件操作,认识到程序结构化的重要性。虽然在上课时强调过少用甚至不用goto语句,但是在中英文识别的函数中由于while(for(if(flag)))的嵌套使用,导致逻辑有些混乱,还是不可避免的使用了goto语句,好在最终最终解决了问题。所以在以后设计逻辑算法的时候,要尽量用能驾驭的语句实现,否则会出现意想不到的逻辑错误,甚至到用goto语句破坏程序结构性的地步。

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

原文链接:https://blog.csdn.net/qq_41753944/article/details/89020436