admin管理员组

文章数量:821302

单词小助手。

  1. 题目分析

   对做错的单词重复记忆,就是先建立一个错题文本文档,在中译英和英译中的函数里,当读到输入单词与所出随记单词不匹配时,打开该错题文件,将错词中英意存入错词文件中。再建立一个新的函数wrong(),在该函数中读取错词文件,并将文件里的错词中英意输出。在menu添加两个功能,中英重复记忆,英中重复记忆,在这两个函数里,对错误的单词重新测试。在词典维护中,添加两个功能,查询单词(中->英),查询单词(英->中),在中到英的单词查询中,输入一个中文意思,同样中文意义,可显示不同的英文单词。

2.程序实现

  #include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX_CHAR  20  // 最大字符

#define MAX_NUM  200  // 单词的最大个数

 struct word

//单词的结构体

{

   char  en[MAX_CHAR]; // 英文形式

   char  ch[MAX_CHAR];//中文形式

}  s[MAX_NUM],cc[MAX_NUM]; //单词数组

int   num;           //单词个数

int numc; //错词个数

int select=1;//select 为是否退出系统的标记

int d=0,c=0;

//帮助

void help()

{

    printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");

       printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");

}

 

//从文件中读取单词的信息

void  readfile()

{

   FILE *fp;

   int i=0;

   fp=fopen("data.txt","r");//打开data文件

   if(!fp)

   {

          printf("\n打开文件data.txt失败!");

 

   }

   while(fscanf(fp,"%s %s ",s[i].en,s[i].ch)==2)

   {

          i++;

   }

   num=i;

   if(0==i)

          printf("\n文件为空,请选择词典维护增加词条!");

   else

          printf("\n");

   fclose(fp);//关闭data文件

 

}

//从文件中读取单词的信息

void  writefile()

{

   FILE *fp;

   int i=0;

   fp=fopen("data.txt","w");

   if(!fp)

   {

          printf("\n打开文件data.txt失败!");

 

   }

   for(i=0;i<num;i++)//用一个循环读取单词的中英意

   {

          fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);

   }

   printf("\n");

   fclose(fp);

}

void sort()/*按字典排序*/

{

       int i,j;

       char temp[MAX_CHAR];

       for(i=0;i<num-1;i++)

       {

              for(j=num-1;j>i;j--)

                     if(strcmp(s[j-1].en,s[j].en)>0)

                     {

                            strcpy(temp,s[j-1].en);

                            strcpy(s[j-1].en,s[j].en);

                            strcpy(s[j].en,temp);

                            strcpy(temp,s[j-1].ch);

                            strcpy(s[j-1].ch,s[j].ch);

                            strcpy(s[j].ch,temp);

                    

                     }

       }

}

//添加单词信息

void add()

{

       int i=num,j,flag=1;

   while(flag)

       {

              flag=0;

              printf("\n请输入单词的英文形式:");

              scanf("%s",s[i].en);

              for(j=0;j<i;j++)

                     if(strcmp(s[i].en,s[j].en)==0)//与data里的每个单词进行比对,若相同则执行

                     {

                            printf("已有该单词,请检查后重新录入!\n");

                            flag=1;

                            break; /*如有重复立即退出该层循环,提高判断速度*/

                     }

   

   }

   printf("\n请输入单词的中文形式:");

   scanf("%s",s[i].ch);

   num++;

   printf("\n您输入的信息为: 英文: %s 中文: %s  ",s[i].en,s[i].ch);

       sort();

}

//删除单词信息

void del()

{

       int i=0,j=0;

       char  en[MAX_CHAR];   //英文形式

     printf("\n请输入你要删除的单词英文形式:");     

       scanf("%s",en);

       for(i=0;i<num;i++)//先找到该英文形式对应的序号

           if(strcmp(s[i].en,en)==0)

              {

                     for(j=i;j<num-1;j++)//删除

                             s[j]=s[j+1];

                     num--; //数量减少 1

                     return;

              }

     printf("\n没有这个单词!");

 

}

//修改单词信息

void modify()

{

       int i=0,choose=0,flag=1;//chooses代表选项标识,flag代表是否找到单词

       char  en[MAX_CHAR];   //英文形式

       while(flag||choose)

       {

              printf("\n请输入你要修改的单词英文形式:");     

              scanf("%s",en);

              for(i=0;i<num;i++)//先找到该英文形式对应的序号

                     if(strcmp(s[i].en,en)==0)

                     {

                            printf("\n请输入单词正确的英文形式:");

                            scanf("%s",s[i].en);

                           

                            printf("\n请输入此单词正确的的中文形式:");

                            scanf("%s",s[i].ch);

                           

                            printf("\n继续修改请选1,返回上一级请选0:");

                            scanf("%d",&choose);

                            if(choose==0) return;

                     }

                 flag=0;

                   

       }

  if(!flag)     printf("\n没有这个单词!");

}

//单词预览

void show()

{

       int  i=0;

       printf("\n单词:     英文        中文         ");

       for(i=0;i<num;i++)

              printf("\n          %-12s%-12s",s[i].en,s[i].ch);

 

}

//查询单词(中->英)

void search1()

{

       int i=0,choose=0,flag=1;

       char  ch[MAX_CHAR];   //中文形式

       while(choose||flag)

       {

          printf("\n请输入你要查询的单词中文形式:");     

           scanf("%s",ch);

        printf("\n英文形式       中文形式        ");

          for(i=0;i<num;i++)//先找到该中文形式对应的序号

           if(strcmp(s[i].ch,ch)==0)//同样中文意义,显示不同的英文单词

              {            

               printf("\n   %-12s%12s",s[i].en,s[i].ch);

              }     

                     printf("\n继续查询请选1,返回上一级请选0:");

                     scanf("%d",&choose);

                     if(choose==0) return;

             

           flag=0;

       }

   if(!flag)   printf("\n没有这个单词!");

}

//添加功能

//查询单词(英->中)

void search2()

{

       int i=0,choose=0,flag=1;

       char  en[MAX_CHAR];   //英文形式

       while(choose||flag)

       {

          printf("\n请输入你要查询的单词中文形式:");     

           scanf("%s",en);

          for(i=0;i<num;i++)//先找到该中文形式对应的序号

           if(strcmp(s[i].en,en)==0)

              {              

                  printf("\n英文形式       中文形式        ");

           

               printf("\n   %-12s%12s",s[i].en,s[i].ch);

              }     

                     printf("\n继续查询请选1,返回上一级请选0:");

                     scanf("%d",&choose);

                     if(choose==0) return;

             

           flag=0;

       }

   if(!flag)   printf("\n没有这个单词!");

}

//中译英测试

void zytest()

{     

       FILE *fw;

  

       char b1[20];

       int z;

    int choose=1;

       int   i;

       while(choose)

       {

              fw=fopen("错词.txt","a+");//打开错题文件

              if(!fw)

              {

          printf("\n打开文件错词.txt失败!");

              }

              i = rand()%num;//通过随机函数出单词

              printf("\n【%s】请输入英文单词:",s[i].ch);

              scanf("%s",b1);

              for(z=0;strcmp(b1,s[i].en)!=0;z=z)//输入单词与所出单词不匹配则执行

              {

                     fw=fopen("错词.txt","a+");

                   if(!fw)

                      {

                  printf("\n打开文件错词.txt失败!");

                      }

                  printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1;numc++;//增加错题个数

                  fprintf(fw,"\n%s %s",s[i].en,s[i].ch);//将错词存入错词文件

              }

                     fclose(fw);

                  printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;;

                     printf("\n继续测试请选1,返回上一级请选0:");

                     scanf("%d",&choose);

                     if(choose==0) return;

      

       }

       fclose(fw);

}

//英译中测试

void yztest()

{

              FILE *fw;

       char b1[20];

       int z,x=41;

       int choose=1;

       int   i;

    i = rand()%num;

       while(choose)//过程与中译英等同

       { 

      

          printf("【%s】请输入中文意思:",s[i].en);

          scanf("%s",b1);

          for(z=0;strcmp(b1,s[i].ch)!=0;z=z)

              {

                            fw=fopen("错词.txt","a+");

                    if(!fw)

                            {

                     printf("\n打开文件错词.txt失败!");

                            }

                      printf("输入错误!!请重新输入:");scanf("%s",b1);c=c+1;numc++;

                            for(int j=0;j<numc;j++)

                            {

                                   if(strcmp(b1,cc[j].ch)!=0)

                                   {fprintf(fw,"\n%s %s",s[i].en,s[i].ch);}break;//将错词存入错词文件

                            }     

              }

              fclose(fw);

           printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;

           printf("\n继续测试请选1,返回上一级请选0:");

           scanf("%d",&choose);

           if(choose==0) return;     

       }

}

//错词显示

void wrong()

{

        FILE *fp;

   int i=0;

   int j;

   fp=fopen("错词.txt","r");

   if(!fp)

   {

          printf("\n打开文件错词.txt失败!");

 

   }

   while(fscanf(fp,"%s %s ",cc[i].en,cc[i].ch)==2)

   {

          i++;

   }

   numc=i;

   if(0==i)

          printf("\n错题文件为空!");

   else

          printf("\n");

   fclose(fp);

   //错词显示

   printf("\n重复记忆单词:     英文        中文         ");

       for(j=0;j<num;j++)

              printf("\n          %-12s%-12s",cc[j].en,cc[j].ch);

}

//中英重忆

void zyRetest()

{

    char b1[20];

    int z;

    int choose = 1;

    int i;

    int m = 0;

    while(choose)

    {

        i = rand()%numc;

        printf("\n【%s】请输入英文单词:",cc[i].ch);

        scanf("%s",b1);

        for(z=0;strcmp(b1,cc[i].en)!=0;z=z)

        {

            printf("\n输入错误!!请重新输入:");

            scanf("%s",b1);c=c+1;

        }

        printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;

        printf("\n继续测试请选1,返回上一级请选0:");

        scanf("%d",&choose);

        if(choose==0)

            return;

 

 }

}

//英中重忆

void yzRetest()

{

    char b1[20];

    int z;

    int choose = 1;

    int i;

    while(choose)

    {

        i = rand()%numc;

        printf("【%s】请输入中文意思:",cc[i].en);

        scanf("%s",b1);

        for(z=0;strcmp(b1,cc[i].ch)!=0;z=z)

        {

            printf("输入错误!!请重新输入:");

            scanf("%s",b1);c=c+1;

        }

        printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;

        printf("\n继续测试请选1,返回上一级请选0:");

        scanf("%d",&choose);

        if(choose==0)

            return;

    }

}

//成绩列表

void list()

{

       printf("\n     共计输入错误:%d次       **每次扣10分**\n",c);

       printf("  共计输入正确:%d次       **每次加10分**\n",d);

       printf("  你的总得分为:%d分\n\n",10*d-10*c);

 

}

//词典维护

void maintain()

{

    int choose;//维护功能选择

       printf("   ------------------\n");

       printf("   1.增加单词\n");

       printf("   2.修改单词\n");

       printf("   3.删除单词\n");

       printf("   4.查询单词(中->英)\n");

    printf("   5.查询单词(英->中)\n");

       printf("   6.退出本菜单\n");

       printf("   ------------------\n");

   while(1)

       {  

             

              printf(" \n请输入维护功能编号:");

              scanf("%d",&choose);

      

              switch(choose)

              {

               case 1:

                          add();writefile();break;

               case 2:

                          modify();writefile();break;

               case 3:

                          del();writefile();break;

               case 4:

                    search1();break;

               case 5:

                          search2();break;

             case 6:  return;

              default: printf("\n请在1-5之间选择");

              }

       }

}

//用户界面

void menu()

       int item;

       printf("\n");

       printf("      *********************************************************\n");

       printf("#                                                       #\n");

       printf("#                 英语单词小助手                        #\n");

       printf("#                                                       #\n");

       printf("#              版本 : v1.0                          #\n");

       printf("#                                                       #\n");

       printf(" *********************************************************\n");

       printf("#                                                       #\n");

       printf("#       0.词库维护          1.单词预览                  #\n");

       printf("#                                                       #\n");

       printf("#       2.单词背诵(中英)    3.单词背诵(英中)            #\n");

       printf("#                                                       #\n");

       printf("#       4.查询成绩          5.帮助                      #\n");

       printf("#                                                       #\n");

       printf("#       6.退出系统          7.错词显示                  #\n");

       printf("#                                                       #\n");

       printf("#       8.中英重忆          9.英中重忆                  #\n");

       printf("#                                                       #\n");

       printf(" **********************************************************\n"); 

       printf("\n");

       printf("       请选择您需要的操作序号(0-9)按回车确认:");

      

       scanf("%d",&item);

       printf("\n");

    readfile();

       switch(item)

       {

        case 0:

                    maintain();break;

        case 1:

                    show();break;

        case 2:

                    zytest();break;

        case 3:

                    yztest(); break;

     case 4:

                    list();break;

        case 5:

                    help();break;

      case 6:

                    select =0;break;

     case 7:

                    wrong();break;

       case 8:

                       zyRetest();break;

       case 9:

                       yzRetest();break;

 

        default:

              printf("请在0-9 之间选择\n");

        }

}

int main()

{

     while(select)

       {

              menu();

       }

       system("pause");

       return 0;

}

3.调试、测试及运行结果

 

 4.经验归纳

在开始的时候,记录错词需要建立一个新的单词数组来记录,并且设置一个全局变量numc来记录错题个数,在中译英测试时,在函数里打开错词文件,如果strcmp(b1,s[i].ch)!=0 即输入与随机出的单词不相同,则用一个fprintf(fw,"\n%s %s",s[i].en,s[i].ch)将该词的中英意存入错词文件。在重新记忆的函数中,也都是打开错词文件通过新的数组来读取错词的,在词典维护中的查询单词,解决遇到相同中文意思,输出不同英文单词,只需要将输出中英文的语句单独放入一个for循环即可,只要找到与中文意思匹配的英文,它都会输出。

本文标签: 单词小助手