1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #define MAX_CHAR 20 // 最大字符
5 #define MAX_NUM 200 // 单词的最大个数
6 #define MAX_U 20 //用户人数
7 struct word
8 //单词的结构体 自定义类型
9 {
10 char en[MAX_CHAR]; // 英文形式
11 char ch[MAX_CHAR]; //中文形式
12 } s[MAX_NUM]; //单词数组
13 struct rankinglist
14 //用户名单结构体
15 {
16 char user[20];
17 int c,d; //c为单词错误数,d为单词正确数
18 int core; //成绩
19 }r[MAX_U];
20 int num; //单词个数
21 int num1=0; //用户数
22 int select=1;//select 为是否退出系统的标记
23 int d=0,c=0;
24 int core; //成绩
25 //检查数据选项
26 int panduan()
27 {
28 char c[50];
29 scanf("%s",c);
30 if(c[1]=='\0'){
31 if(c[0]>='0'&&c[0]<='9')
32 return c[0]-'0';
33 }
34 else return 0;
35 }
36 //数据验证(英文)
37 int panduan1(char a[]){ //返回0不是英文单词,返回1是
38 int i;
39 for(i=0;i<20;i++){ //判断条件是i不是a[i]啊啊啊
40 if(a[i]>='a'&&a[i]<='z'||a[i]=='\0') continue;
41 else{
42 printf("亲,这边建议您输入英文呢!");
43 return 0;
44 }
45 }
46 return 1;
47 }
48 //从文件中读取单词的信息
49 void readfile()
50 {
51 FILE *fp;
52 int i=0;
53 fp=fopen("data.txt","r"); //“r”方式打开不允许改写文件
54 if(!fp) //说明没有文件
55 {
56 printf("\n打开文件data.txt失败!");
57
58 }
59 while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2) //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数
60 {
61 i++; //读取下一个单词
62 }
63 num=i;
64 if(0==i)
65 printf("\n文件为空,请选择词典维护增加词条!");
66 else
67 printf("\n");
68 fclose(fp); //读取完毕,关闭文件
69
70 }
71 //从文件中写入单词的信息
72 void writefile()
73 {
74 FILE *fp;
75 int i=0;
76 fp=fopen("data.txt","w"); //初次写入的函数,所以用 “w"方式写入
77 if(!fp)
78 {
79 printf("\n打开文件data.txt失败!");
80
81 }
82 for(i=0;i<num;i++)
83 {
84 fprintf(fp,"\n%s %s ",s[i].en,s[i].ch); //写入字符串(单词)
85 }
86 printf("\n");
87 fclose(fp);
88 }
89 //实现排序对成绩
90 void sort0()
91 {
92 int i,j;
93 char temp[20];
94 int t;
95 for(i=0;i<num1-1;i++)
96 {
97 for(j=num1-1;j>i;j--)
98 if(r[j-1].core<r[j].core) //一个内循环实现将最高的成绩放在第一个位置
99 {
100 strcpy(temp,r[j-1].user); //用户名交换
101 strcpy(r[j-1].user,r[j].user);
102 strcpy(r[j].user,temp);
103 t=r[j-1].c; //错误单词交换
104 r[j-1].c=r[j].c;
105 r[j].c=t;
106 t=r[j-1].d; //正确单词交换
107 r[j-1].d=r[j].d;
108 r[j].d=t;
109 t=r[j-1].core; //成绩交换
110 r[j-1].core=r[j].core;
111 r[j].core=t;
112 }
113 }
114
115 }
116 //读取用户的成绩
117 void readuser()
118 {
119 FILE *fp;
120 int i=0;
121 fp=fopen("ranklist.txt","r"); //“r”方式打开不允许改写文件
122 if(!fp) //说明没有文件
123 {
124 printf("\n打开文件ranklist.txt失败!");
125 }
126 while(fscanf(fp,"%s %d %d %d ",r[i].user,&r[i].d,&r[i].c,&r[i].core)==4) //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数
127 {
128 i++; //读取下一个单词
129 }
130 num1=i;
131 if(0==i)
132 printf("\n文件为空,请先创建用户名并参加测试单词!");
133 else
134 printf("\n");
135 fclose(fp); //读取完毕,关闭文件
136 }
137 //文件写入用户信息
138 void writeuser()
139 {
140 printf("留下你的名字:");
141 scanf("%s",r[num1].user);
142 FILE *fp;
143 int i=num1;
144 fp=fopen("ranklist.txt","a"); //
145 r[i].c=c;
146 r[i].d=d;
147 r[i].core=10*d-10*c;
148 fprintf(fp,"\n%s %d %d %d ",r[i].user,r[i].d,r[i].c,r[i].core);
149 printf("\n");
150 d=0;
151 c=0; //初始化为0,为下个用户所用
152 num1++; //用户加一
153 sort0();
154 fclose(fp);
155 }
156 void sort()/*按字典排序*/
157 {
158 int i,j;
159 char temp[MAX_CHAR];
160 for(i=0;i<num-1;i++)
161 {
162 for(j=num-1;j>i;j--)
163 if(strcmp(s[j-1].en,s[j].en)>0) //一个内循环实现将最短的单词放在第一个位置
164 {
165 strcpy(temp,s[j-1].en); //英文交换
166 strcpy(s[j-1].en,s[j].en);
167 strcpy(s[j].en,temp);
168 strcpy(temp,s[j-1].ch); //中文交换
169 strcpy(s[j-1].ch,s[j].ch);
170 strcpy(s[j].ch,temp);
171 }
172 }
173 }
174 //添加单词信息
175 void add()
176 {
177 int i=num,j,flag=1;
178 while(flag)
179 {
180 flag=0;
181 printf("\n请输入单词的英文形式:");
182 scanf("%s",s[i].en); //
183 if(panduan1(s[i].en)==0) {
184 flag=1; //continue之后不会结束
185 continue;
186 }
187 for(j=0;j<i;j++) //遍历一遍文件里的单词,检查有没有重复的单词
188 if(strcmp(s[i].en,s[j].en)==0)
189 {
190 printf("已有该单词,请检查后重新录入!\n");
191 flag=1;
192 break; /*如有重复立即退出该层循环,提高判断速度,break只跳出了for循环,让用户再次输入*/
193 }
194
195 }
196 printf("\n请输入单词的中文形式:");
197 scanf("%s",s[i].ch);
198 num++; //单词数加1
199 printf("\n您输入的信息为: 英文: %s 中文: %s ",s[i].en,s[i].ch);
200 sort();
201 }
202 //删除单词信息
203 void del()
204 {
205 int i=0,j=0;
206 char en[MAX_CHAR]; //英文形式
207 printf("\n请输入你要删除的单词英文形式:");
208 scanf("%s",en);
209 for(i=0;i<num;i++)//先找到该英文形式对应的序号
210 if(strcmp(s[i].en,en)==0)
211 {
212 for(j=i;j<num-1;j++) //单词前移
213 s[j]=s[j+1];
214 num--; //数量减少 1
215 return;
216 }
217 printf("\n没有这个单词!");
218
219 }
220 //修改单词信息
221 void modify()
222 {
223 int i=0,choose=0,flag=1;//chooses代表菜单选项标识,flag代表是否找到单词
224 char en[MAX_CHAR]; //英文形式
225 while(flag||choose)
226 {
227 printf("\n请输入你要修改的单词英文形式:");
228 scanf("%s",en);
229 for(i=0;i<num;i++)//先找到该英文形式对应的序号
230 if(strcmp(s[i].en,en)==0)
231 {
232 printf("\n请输入单词正确的英文形式:");
233 scanf("%s",en);
234
235 printf("\n请输入此单词正确的的中文形式:");
236 scanf("%s",s[i].ch);
237
238 printf("\n继续修改请按任意键,返回上一级请选0:");
239 choose=panduan();
240 if(choose==0) return;
241 }
242 flag=0;
243
244 }
245 if(!flag) printf("\n没有这个单词!"); //设计的真巧妙!
246 }
247 //查询单词(中文查询)
248 void search0()
249 {
250 int i=0,choose=0,flag=1;
251 char ch[MAX_CHAR]; //中文形式
252 while(choose||flag)
253 {
254 printf("\n请输入你要查询的单词中文形式:");
255 scanf("%s",ch);
256 for(i=0;i<num;i++)//先找到该中文形式对应的序号
257 if(strcmp(s[i].ch,ch)==0)
258 {
259 printf("\n英文形式: 中文形式: ");
260 printf("\n %-12s%12s",s[i].en,s[i].ch);
261
262 printf("\n继续查询按任意键,返回上一级请选0:");
263 choose=panduan();
264 if(choose==0) return;
265 }
266 flag=0;
267 }
268 if(!flag) printf("\n没有这个单词!");
269 }
270 //查询单词(英文查询)
271 void search1()
272 {
273 int i=0,choose=0,flag=1;
274 char en[MAX_CHAR]; //中文形式
275 while(choose||flag)
276 {
277 printf("\n请输入你要查询的单词英文形式:");
278 scanf("%s",en);
279 for(i=0;i<num;i++)//先找到该中文形式对应的序号
280 if(strcmp(s[i].en,en)==0)
281 {
282 printf("\n英文形式: 中文形式: ");
283 printf("\n %-12s%12s",s[i].en,s[i].ch);
284
285 printf("\n继续查询请按任意键,返回上一级请选0:");
286 choose=panduan();
287 if(choose==0) return;
288 }
289 flag=0;
290 }
291 if(!flag) printf("\n没有这个单词!");
292 }
293 //查询单词的选项
294 void selectword()
295 {
296 int x; //查询选项
297 int t=1;
298 while(t){
299 printf("请选择查询类型:\n(1)英文查询 (2)中文查询\n");
300 x=panduan();
301 if(x==1){
302 search1();
303 t=0;
304 }
305 if(x==2){
306 search0();
307 t=0;
308 }
309 if(x!=1&&x!=2){
310 printf("没有这个选项,请重新输入!");
311 t=1;
312 }
313 }
314 }
315 //中译英测试
316 void zytest()
317 {
318 char b1[20];
319 int z;
320 int choose=1;
321 int i;
322 //srand(time(NULL));
323 while(choose)
324 {
325 i = rand()%num;
326 printf("\n【%s】的英文单词:",s[i].ch);
327 scanf("%s",b1);
328 for(z=0;strcmp(b1,s[i].en)!=0;z=z)
329 { if(c!=0)
330 {
331 printf("\n");
332 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:"); //对错误的单词进行重复记忆 (完善功能)
333 printf("\n英文形式: 中文形式: ");
334 printf("\n %-12s%12s",s[i].en,s[i].ch);
335 printf("\n");
336 }
337 printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1;
338 } //错误加一
339 printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1; //正确加一
340 printf("\n继续测试请按任意键,返回上一级请选0:");
341 choose=panduan();
342 if(choose==0) return;
343 }
344 }
345 //英译中测试
346 void yztest()
347 {
348 char b1[20];
349 int z;
350 int choose=1;
351 int i;
352 //srand(time(NULL));
353 while(choose)
354 {
355 i = rand()%num;
356 printf("【%s】的中文意思:",s[i].en);
357 scanf("%s",b1);
358 for(z=0;strcmp(b1,s[i].ch)!=0;z=z)
359 { if(c!=0)
360 {
361 printf("\n");
362 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:"); //对错误的单词进行重复记忆 (完善功能)
363 printf("\n英文形式: 中文形式: ");
364 printf("\n %-12s%12s",s[i].en,s[i].ch);
365 printf("\n");
366 }
367 printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1;
368 } //错误加一
369 printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
370 printf("\n继续测试请按任意键,返回上一级请选0:");
371 choose=panduan();
372 if(choose==0) return;
373 }
374 }
375 //成绩列表
376 void list()
377 {
378 printf("\n 共计输入错误:%d次 **每次扣10分**\n",c);
379 printf(" 共计输入正确:%d次 **每次加10分**\n",d);
380 printf(" 你的总得分为:%d分\n\n",10*d-10*c);
381 }
382
383 //词典维护
384 void maintain()
385 {
386 int choose;//维护功能选择
387 printf(" ------------------\n");
388 printf(" 1.增加单词\n");
389 printf(" 2.修改单词\n");
390 printf(" 3.删除单词\n");
391 printf(" 4.查询单词\n");
392 printf(" 5.退出本菜单\n");
393 printf(" ------------------\n");
394 while(1)
395 {
396 printf(" \n请输入维护功能编号(按5退出):");
397 choose=panduan();
398 switch(choose)
399 {
400 case 1:
401 system("cls");add();writefile();break;
402 case 2:
403 system("cls");modify();writefile();break;
404 case 3:
405 system("cls");del();writefile();break;
406 case 4:
407 system("cls");selectword();break;
408 case 5: 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.0(改善版) #\n");
423 printf("# #\n");
424 printf(" *********************************************************\n");
425 printf("# #\n");
426 printf("# (1)词库维护 #\n");
427 printf("# (2)单词背诵(中译英) #\n");
428 printf("# (3)单词背诵(英译中) #\n");
429 printf("# (4)查询成绩 #\n");
430 printf("# (5)退出系统 #\n");
431 printf("# #\n");
432 printf("# 单词旅行开始 #\n");
433 printf("# #\n");
434 printf(" **********************************************************\n");
435 printf("\n");
436 printf(" 请选择您需要的操作序号(1-5)按回车确认:");
437
438 item=panduan();
439 printf("\n");
440 readfile(); //打开文件好进行下一步操作
441 switch(item)
442 {
443 case 1:
444 system("cls");maintain();break; //单词维护
445 case 2:
446 system("cls");zytest();writeuser();break; //中译英
447 case 3:
448 system("cls");yztest();writeuser();break; //英译中
449 case 4:
450 system("cls");list();break; //查成绩
451 case 5:
452 select = 0;break; //退出
453 default:
454 printf("请在1-5之间选择\n");
455 }
456 }
457 int main()
458 {
459 system("color FA");
460 while(select)
461 {
462 menu();
463 }
464 system("pause");
465 return 0;
466 }