/***************************/
名称:单词小助手(稍微改善版)
编程语言: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;
}