单词小助手

  1. 题目

例2为单词小助手,要求完成以下任务:

  1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。

  2.将单词测试中的功能完善,可针对做错的单词重复记忆。

  3.查询单词的功能添加英文词查询,中文查询的功能完善(考虑如何显示同样中文意义,不同的英文单词)

提高要求:

  可将程序中的不足(如数据验证,排名功能)等根据自己的能力与理解完成

    2.算法构造

(一)算法设计思路:

   (1)实现将单词测试中的功能完善,可针对做错的单词重复记忆功能:首先新建一个remember.txt,然后定义一个新的数组p[],将 在单词测试中做错的单词存入数组p[]中,在执行void yztest()和void zytest()时 打开remember.txt,只要输入的单词或中文意思与其随机生成的中文意思和单词不符,即将其存入remember.txt中,然后进行错词记忆执行void zy_remembertest()以及void yz_remember()函数时,打开remember.txt文件进行常错词的测试。

(2) 完善查询功能中的输入一个中文意思,输出不同的英文单词。这个不难,就改了一个中括号的位置,

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

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

{

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

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

}

在这个for循环中,当找到了与输入要查询的中文意思相符的单词时,不退出该循环,而是继续遍历单词数组,继续寻找与其意思相符的英文单词。

 3.代码

#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],p[MAX_NUM]; //单词数组
int   num;             //单词个数
int num1=0;            //重复记忆文件单词个数
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");
   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);
 
}
//从文件中读取单词的信息
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 rememberfile()
{
   FILE *fp;
   int i=0;
   fp=fopen("remember.txt","r");
   if(!fp)
   { 
	   printf("\n打开文件remember.txt失败");
   }
   while(fscanf(fp,"%s %s",p[i].en,p[i].ch)==2)
   {
	   i++;
   }
   num1=i;
   if(0==i)
       printf("\n文件为空");
   else
	   printf("\n");
   fclose(fp);
}
void re_show(){
   int  i=0;
   printf("\n单词:     英文        中文         ");
   for(i=0;i<num;i++)
	   printf("\n          %-12s%-12s",p[i].en,p[i].ch);

}

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)
			{
				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 search_CH()
{
   int i=0,choose=0,flag=1;
   char  ch[MAX_CHAR];   //中文形式
   while(choose||flag)
   {
    	printf("\n请输入你要查询的单词中文形式:");	
	    scanf("%s",ch);
    	for(i=0;i<num;i++)//先找到该中文形式对应的序号
		if(strcmp(s[i].ch,ch)==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 search_EN()
{   
	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()
{	
	char b1[20];
	int z;
    int choose=1;
	int   i;
	FILE *fp;
	while(choose)
	{   fp=fopen("remember.txt","a+");
	    if(!fp)
		{ printf("\n打开文件remember.txt失败!");
		}
		i = rand()%num;
		printf("\n【%s】请输入英文单词:",s[i].ch);
		scanf("%s",b1);
		for(z=0;strcmp(b1,s[i].en)!=0;z=z)
		{   
			fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//将错误的单词输入至记忆文件rememberfile中
			printf("\n输入错误!!请重新输入:");
			scanf("%s",b1);
			c=c+1;
			num1++;
		}
		    fclose(fp);
		    printf("\n恭喜你,回答正确,加10分!\n\n");
			d=d+1;
			printf("\n继续测试请选1,返回上一级请选0:");
			scanf("%d",&choose);
			if(choose==0) 
			return;	
	
	}
}
//英译中测试
void yztest()
{    
	char b1[20];
	int z,x=41;
	int choose=1;
	int   i;
    FILE *fp;
	while(choose)
	{   
		fp=fopen("remember.txt","a+");
	    if(!fp)
		{ printf("\n打开文件remember.txt失败!");
		}
	    i = rand()%num;
    	printf("【%s】请输入中文意思:",s[i].en);
    	scanf("%s",b1);
    	for(z=0;strcmp(b1,s[i].ch)!=0;z=z)
		{
           fprintf(fp,"\n%s %s ",s[i].en,s[i].ch);//将错误的单词输入至记忆文件rememberfile中
	       printf("输入错误!!请重新输入:");
		   scanf("%s",b1);
	   	   c=c+1;
		   num1++;
		}
           fclose(fp);
	       printf("\n恭喜你,回答正确,加10分!\n\n");
		   d=d+1;
	       printf("\n继续测试请选1,返回上一级请选0:");
	       scanf("%d",&choose);
	       if(choose==0) 
		   return;	
	}
}
//错词记忆(中英)
void zy_remembertest()
{   
	char b1[20];
	int z;
    int choose=1;
	int   i;
	while(choose)
	{  
        i = rand()%num1;
		printf("\n【%s】请输入英文单词:",p[i].ch);
		scanf("%s",b1);
		for(z=0;strcmp(b1,p[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 yz_remembertest()
{
	char b1[20];
	int z,x=41;
	int choose=1;
	int   i;
    while(choose)
	{ 
	    i = rand()%num1;
    	printf("【%s】请输入中文意思:",p[i].en);
    	scanf("%s",b1);
    	for(z=0;strcmp(b1,p[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:
	             search_CH();
				 break;
		 case 5: 
			     search_EN();
				 break;
	     case 6: 
			     return;
		 default:
			     printf("\n请在1-6之间选择");
		}
	}
}
//用户界面
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.错词记忆(zy)            #\n");
	printf("#                                                       #\n");
	printf("#       8.错词记忆(yz)    9.退出系统                  #\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:  
		      rememberfile();
		      re_show();
			  break;
	 case 7:  
		      rememberfile();
		      zy_remembertest();
		      break;
	 case 8:  
		      rememberfile();
		      yz_remembertest();
		      break;
	 case 9:  
              select =0;
			  break;
	 default:
		      printf("请在0-6之间选择\n");
	 }
}
int main()
{ 
  	while(select)
	{
		menu();
	}
	system("pause");
	return 0;
} 

4.测试结果

5.心得

通过本次上机实验,学会了如何将数据存在文件中,学会了写文件的输入输出那部分的代码。刚开始新建data.txt文件时,编译出来的结果一直是打不开data.txt,问了同学才知道,要把data.txt文件与代码放在同一个文件夹下才可以正常打开。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值