数据结构 背单词

  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 }

 

posted @ 2022-07-14 07:21  宇AI泽  阅读(25)  评论(0编辑  收藏  举报