喜迎
春节

单词小助手


本博客是完成第三章上机作业,源码不是自己写的,上机任务为进行完善此代码

本次上机任务为改写程序,完成以下任务

  1. 改写程序为良好程序风格(文档注释,函数注释,语句注释)
  2. 将单词测试中的功能完善,可针对做错的的单次重复记忆。
  3. 查询单词的功能添加英文查询,中文查询功能完善(考虑如何显示同样的中文意思,不同的英文单词)
  4. 可将程序中的不足(如数据验证,排名功能)等根据自己的能力与理解完成。

 

 解决方案:

  1. 针对任务一:需要将程序的风格改正,将其不正确缩进进行改正以及进行文档注释,函数注释,语句注释。
  2. 针对任务二:针对错词重复记忆,首先要像建立data.txt文件一样建立一个文档来存放错词,wrong.txt,然后同样利用随机函数将wrong.txt中存入的单词随机重复测试。
  3. 针对任务三:添加英文查询功能,与中文查询算法相同;而将中文查询完善则可以再输入一次中文意思后,第一次会出现一个英文单词,按1继续则会出现另一个英文单词,遗憾的是两者没有同时显示。

源代码:

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

如果存在错误,请大神们多多指教,撒花撒花~~ 

 


文章作者: 周周
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 周周 !
评 论
  目录