单词小助手(C语言)

/***************************/
名称:单词小助手(稍微改善版)
编程语言:C
编译器:DEV C++
完成日期:2019年04月03日

PS:此程序不是本人制作,我只是在源程序上进行添加功能和进行改善

添加功能如下:
(1)排行榜功能
(2)数据验证
(3)错词重记忆
单词小助手:
首先题目已经给出了基本的代码,也实现了基本的功能,比如说添加单词,修改,删除,查询,以及单词小测试等功能,我们需要做的就是改善其中的功能,更进一步添加新的功能,比如说改善其中的数据验证,添加排行功能,错词重复记忆!让单词小助手更激发用户的攀比!
增加了一点小小的颜色:界面换了个颜色之类的。

界面截图:
1.主界面:
在这里插入图片描述
2.词库维护:
在这里插入图片描述
3.单词预览:
在这里插入图片描述
4.单词背诵:
在这里插入图片描述
在这里插入图片描述
5.查询成绩:
在这里插入图片描述
6.帮助:
在这里插入图片描述
7.排行榜:
在这里插入图片描述

PS:非原创

不废话了,直接bia源代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR  20  // 最大字符
#define MAX_NUM  200  // 单词的最大个数
#define MAX_U 20       //用户人数 
 struct word
//单词的结构体
{
   char  en[MAX_CHAR]; // 英文形式
   char  ch[MAX_CHAR];   //中文形式
}  s[MAX_NUM]; //单词数组
 struct rankinglist
//用户名单结构体 
{
	char user[20];
	int c,d;       //c为单词错误数,d为单词正确数 
	int core;     //成绩 
}r[MAX_U];         
int   num;           //单词个数
int   num1=0;          //用户数 
int select=1;//select 为是否退出系统的标记
int d=0,c=0;
int core;    //成绩 
//帮助
void help()
{
    printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
	printf("\n同时还可进行中译英、英译中测试。本系统还提供了测试成绩的显示功能。");
	printf("\n经过改善本系统添加了新的排行榜功能期待你来挑战第一名!另:还有错词循环记忆让你记忆不愁。"); 
}
//检查数据选项
int panduan()
{
	char c[50];
	scanf("%s",c); 
    if(c[1]=='\0'){
    	if(c[0]>='0'&&c[0]<='9')
    	return c[0]-'0';
	}
	else return 0;
} 
//数据验证(英文)
int panduan1(char a[]){     //返回0不是英文单词,返回1是 
	int i;  
	for(i=0;i<20;i++){      //判断条件是i不是a[i]啊啊啊 
		if(a[i]>='a'&&a[i]<='z'||a[i]=='\0') continue;
		else{
			printf("亲,这边建议您输入英文呢!");
			return 0;
		}      
	}
	return 1;
}
//从文件中读取单词的信息
void  readfile()
{
   FILE *fp;
   int i=0;
   fp=fopen("data.txt","r");   //“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");                     //初次写入的函数,所以用 “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 sort0()
 {
 	int i,j;
	char temp[20];
	int t; 
	for(i=0;i<num1-1;i++)
	{
		for(j=num1-1;j>i;j--)
			if(r[j-1].core<r[j].core)        //一个内循环实现将最高的成绩放在第一个位置 
			{
				strcpy(temp,r[j-1].user);            //用户名交换 
				strcpy(r[j-1].user,r[j].user);
				strcpy(r[j].user,temp);
				t=r[j-1].c;           //错误单词交换 
				r[j-1].c=r[j].c;
				r[j].c=t;
				t=r[j-1].d;           //正确单词交换 
				r[j-1].d=r[j].d;
				r[j].d=t;	
				t=r[j-1].core;           //成绩交换 
				r[j-1].core=r[j].core;
				r[j].core=t;		
			}
	}
 	
  } 
//读取用户的成绩 
void  readuser()
{
   FILE *fp;
   int i=0;
   fp=fopen("ranklist.txt","r");   //“r”方式打开不允许改写文件 
   if(!fp)                     //说明没有文件 
   {
	   printf("\n打开文件ranklist.txt失败!");
   }
   while(fscanf(fp,"%s %d %d %d ",r[i].user,&r[i].d,&r[i].c,&r[i].core)==4)  //以空格符,换行符等为结束标志,返回值为实际读取的字符串个数 
   {              
	   i++;                                       //读取下一个单词 
   }
   num1=i;
   if(0==i)            
	   printf("\n文件为空,请先创建用户名并参加测试单词!");
   else
	   printf("\n");
   fclose(fp);                                    //读取完毕,关闭文件 
}
//文件写入用户信息 
void writeuser()
{
    printf("留下你的名字:"); 
	scanf("%s",r[num1].user);
	FILE *fp;
	int i=num1;
    fp=fopen("ranklist.txt","a");                     //
	r[i].c=c;
	r[i].d=d;
	r[i].core=10*d-10*c;
    fprintf(fp,"\n%s %d %d %d ",r[i].user,r[i].d,r[i].c,r[i].core);   
    printf("\n");
    d=0;
    c=0;               //初始化为0,为下个用户所用 
    num1++;            //用户加一 
    sort0();
    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);               //  
		if(panduan1(s[i].en)==0) {
			flag=1;          //continue之后不会结束 
			continue; 
		}
		for(j=0;j<i;j++)                           //遍历一遍文件里的单词,检查有没有重复的单词 
			if(strcmp(s[i].en,s[j].en)==0)
			{
				printf("已有该单词,请检查后重新录入!\n");
				flag=1;
				break; /*如有重复立即退出该层循环,提高判断速度,break只跳出了for循环,让用户再次输入*/
			}
    
   }
   printf("\n请输入单词的中文形式:");
   scanf("%s",s[i].ch);
   num++;                                  //单词数加1 
   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",en);
				
				printf("\n请输入此单词正确的的中文形式:");
				scanf("%s",s[i].ch);
				
				printf("\n继续修改请按任意键,返回上一级请选0:");
				choose=panduan();                     
				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 showrank()
{
	FILE *fp;
	int i;
	fp=fopen("ranklist.txt","r");
	sort0();                     //输出前排序 
	if(!fp)                     //说明没有文件 
    {
	   printf("\n文件ranklist.txt不存在!请参加测试!");
	   return; 
    }
	else
	{
	printf("\n用户名:   答对单词数:    答错单词数:    成绩:");
	for(i=0;i<20;i++)
	printf("\n      %-12s%-12d%-12d%-12d",r[i].user,r[i].d,r[i].c,r[i].core); 
	}
	fclose(fp);
}
//查询单词(中文查询) 
void search0()
{
	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继续查询按任意键,返回上一级请选0:");
			choose=panduan();
			if(choose==0) return;	
		}
	    flag=0;
	}
   if(!flag)	 printf("\n没有这个单词!");
}
//查询单词(英文查询) 
void search1()
{
	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继续查询请按任意键,返回上一级请选0:");
			choose=panduan();
			if(choose==0) return;	
		}
	    flag=0;
	}
   if(!flag)	 printf("\n没有这个单词!");
}
//查询单词的选项
void selectword()
{
	int x;     //查询选项
	int t=1;
	while(t){
		printf("请选择查询类型:\n(1)英文查询      (2)中文查询\n");
	    x=panduan();
	    if(x==1){
	    	search1();
	    	t=0;
		}
	    if(x==2){
	    	search0();
	    	t=0;
		}
	    if(x!=1&&x!=2){
	    	printf("没有这个选项,请重新输入!");
	    	t=1;
		}
	}
} 
//中译英测试
void zytest()
{	
	char b1[20];
	int z;
    int choose=1;
	int   i;
	srand(time(NULL));
	while(choose)
	{ 
	    i = rand()%num;
		printf("\n【%s】的英文单词:",s[i].ch);
		scanf("%s",b1);
		for(z=0;strcmp(b1,s[i].en)!=0;z=z)
		{   if(c!=0) 
		    {
		     printf("\n");
			 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:");  //对错误的单词进行重复记忆 (完善功能)
		     printf("\n英文形式:       中文形式:        ");
	         printf("\n   %-12s%12s",s[i].en,s[i].ch);
	         printf("\n");
			 } 
			printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1; 
		}    //错误加一 
		printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;              //正确加一 
		printf("\n继续测试请按任意键,返回上一级请选0:");
		choose=panduan();
		if(choose==0) return;	
	}
}
//英译中测试
void yztest()
{
	char b1[20];
	int z;
	int choose=1;
	int  i;
	srand(time(NULL));
	while(choose)
	{ 
	    i = rand()%num;
    	printf("【%s】的中文意思:",s[i].en);
    	scanf("%s",b1);
    	for(z=0;strcmp(b1,s[i].ch)!=0;z=z)
		{   if(c!=0) 
		    {
		     printf("\n");
			 printf("少年请重新来过吧!请记住它!错了2遍以上的单词:");  //对错误的单词进行重复记忆 (完善功能)
		     printf("\n英文形式:       中文形式:        ");
	         printf("\n   %-12s%12s",s[i].en,s[i].ch);
	         printf("\n");
			 } 
			printf("\n输入错误!!请重新输入:");scanf("%s",b1);c=c+1;
		}    //错误加一 
	    printf("\n恭喜你,回答正确,加10分!\n\n");d=d+1;
	    printf("\n继续测试请按任意键,返回上一级请选0:");
	    choose=panduan();  
	    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("   ------------------\n"); 
   	while(1)
	{  
		printf(" \n请输入维护功能编号(按5退出):");
		choose=panduan();
		switch(choose)
		{
		 case 1:
			    system("cls");add();writefile();break;
		 case 2:
			    system("cls");modify();writefile();break;
		 case 3:
			    system("cls");del();writefile();break;
		 case 4:
		 	    system("cls");selectword();break;
	 	 case 5:  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("#                     (1)词库维护                     #\n");
	printf("#        (2)单词预览            (3)单词背诵(中译英) #\n");
	printf("#                                                       #\n");
	printf("#        (4)单词背诵(英译中)    (5)查询成绩         #\n");
	printf("#                                                       #\n");
	printf("#        (6)帮助                (7)排行榜           #\n");
	printf("#                     (8)退出系统                     #\n");
	printf("#                                                       #\n");
	printf("#                      单词旅行开始                     #\n");
	printf("#                                                       #\n");
	printf(" **********************************************************\n");  
	printf("\n");
	printf("           请选择您需要的操作序号(1-8)按回车确认:");
	
	item=panduan(); 
	printf("\n");
    readfile();     //打开文件好进行下一步操作 
	switch(item)
	{
	 case 1:
		    system("cls");maintain();break;    //单词维护 
	 case 2: 
		    system("cls");show();break;        //单词预览 
	 case 3:
		    system("cls");zytest();writeuser();break;      //中译英 
	 case 4:
		    system("cls");yztest();writeuser();break;     //英译中 
     case 5:
		    system("cls");list();break;        //查成绩 
	 case 6:
		    system("cls");help();break;        //帮助 
	 case 7:
	        system("cls");readuser();showrank();break;
  	 case 8:
		    select =0;break;
	 default:
		printf("请在1-8之间选择\n");
	 }
}
int main()
{ 
    system("color FA");
  	while(select)
	{
		menu();
	}
	system("pause");
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42419462/article/details/89004211