1ˎ问题描述
设计一个程序,能实现将单词存入文件,并能随机及顺序显示英文或汉语意思,能判断回答的正确与否,并统计个数,可以利用英文或汉语意思查找。
2ˎ功能要求
1).录入单词
China 中国
Japan 日本
…….
使用文件存放。
2).随机测试
系统随机显示单词(用户可以选择中译英,或英译中),对回答错误的单词应该可再回答一次。能够统计回答的正确单词的个数。
3). 顺序测验
4).查找单词的汉语或英语意思
(输入中文查对应的英语意思,输入英文查对应汉语意思)
3ˎ功能实现
1)
struct word //定义结构体
{ char Chinese[20];
char English[20];
}; word w[N]; //结构体数组
定义结构体数组,每个结构体分为w[i].English与w[i].Chinese两部分,并且在每个函数中定义FILE类型指针变量fp,fp=fopen(“word.dat”,“wb+” )通过fp指向结构体变量w[i]而访问定义的文件word.dat。
2)录入函数
{ cout<<"请输入英语单词:"<<endl;
cin>>w[i].English;
cout<<"请输入相应的汉语意思:"<<endl;
cin>>w[i].Chinese;
i++;}
重新录入以wb+方式打开文件,分别将英语及汉语意思赋值给结构体数组;
for(q=0;q<i;q++)
{ fwrite(&w[q],sizeof(word),1,fp);}
再将结构体数组内容用一个for循环顺序写入文件,并替换原有文件。
而继续录入以ab+方式打开fp=fopen(“word.dat”,“ab+” ),将结构体数组顺序写入原有内容的后边。
3)测试函数
以只读的方式打开文件,用while循环实现持续的测试,若选择退出测试,则break推出循环。以j记录共答题个数,m与s分别记录汉译英与英译汉答对个数,(以选择英译汉为例)
srand(time(0));
k=rand()%(q+1);
cout<<w[k].Chinese<<"的英文单词是:"<<endl;
随机测试利用time函数作为rand()的种子值,随机产生一个不大于结构体个数的整数k,输出w[k].English;
{K1=0;
cout<<w[k1].English<<"的中文意思是:"<<endl;
K1++;}
顺序测试则是从第一个开始输出w[k1].English,并指向下一个结构体。待用户输入之后利用strcmp比较输入字符与所产生单词对应汉语意思比较,相同strcmp(w[k].Chinese,c)==0回答正确,两次未答对输出w[k2].Chinese。
4)查找函数
cin>>c;
for(k=0;k<=q;k++)
{if(strcmp(c,w[k].English)==0)
{cout<<"相应的汉语意思是:"<<w[k].Chinese<<endl;
break;} }
if(k>q) //将输入字符与每个w[k].English比较过后没有相同的
{cout<<"你要查找的单词不存在!"<<endl;}
以只读方式打开文件,(以英译汉为例)输入单词,用for循环strcmp函数将w[i].English与输入单词比较,若相同输出对应的w[i].Chinese,利用一个if语句判断查找次数大于单词个数显示没有找到。
4ˎ源代码及注释说明
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 100
char c[20];
struct word //定义结构体
{
char Chinese[20];
char English[20];
}; word w[N]; //定义结构体数组
void luru1() //重新录入函数
{
FILE *fp;
int i=0,n,q;
if((fp=fopen("word.dat","wb+"))==NULL) //可读可写方式打开
{
cout<<"此文件打不开"<<endl;
exit(0);
}
while(1)
{
cout<<"请输入英语单词:"<<endl;
cin>>w[i].English;
cout<<"请输入相应的汉语意思:"<<endl;
cin>>w[i].Chinese;
i++;
cout<<"继续录入请按1,退出录入请按0"<<endl;
cin>>n;
if(n==0)
{cout<<"请选择:0-退出系统;1-重新录入;2-随机测试;3-顺序测试;4-查找单词;5-继续录入;"<<endl;
break;}
}
for(q=0;q<i;q++)
{ fwrite(&w[q],sizeof(word),1,fp);} //将数组数据写入文件
fclose(fp);
}
void luru2() //继续录入函数
{
FILE *fp;
int i=0,n,q;
if((fp=fopen("word.dat","ab+"))==NULL)
{
cout<<"此文件打不开"<<endl;
exit(0);
}
while(1)
{
cout<<"请输入英语单词:"<<endl;
cin>>w[i].English;
cout<<"请输入相应的汉语意思:"<<endl;
cin>>w[i].Chinese;
i++;
cout<<"继续录入请按1,退出录入请按0"<<endl;
cin>>n;
if(n==0)
{cout<<"请选择:0-退出系统;1-重新录入;2-随机测试;3-顺序测试;4-查找单词;5-继续录入;"<<endl;
break;}
}
for(q=0;q<i;q++)
{ fwrite(&w[q],sizeof(word),1,fp);}
fclose(fp);
}
void suiji() //随机测试函数
{
int i,n,q,k,m=0,j=0,s=0;
FILE *fp;
if((fp=fopen("word.dat","rb"))==NULL) //以只读方式打开文件
{
cout<<"此文件打不开"<<endl;
exit(0);
}
for(i=0;fread(&w[i],sizeof(word),1,fp)!=0;i++)
q=i; //结构体个数
while(1)
{
cout<<"请选择测试方式:1 英译汉 2 汉译英 0 退出测试"<<endl;
cin>>n;
if(n==0)
{cout<<"共做了"<<j<<"道题,"<<"答对"<<m+s<<"道"<<endl;
cout<<"请选择:0-退出系统;1-重新录入;2-随机测试;3-顺序测试;4-查找单词;5-继续录入;"<<endl;
break;}
else if(n==1)
{
srand(time(0)); //时间函数
k=rand()%(q+1); //随机产生一个0-q的整数
cout<<w[k].English<<"的中文意思是:";
cin>>c;
J++;
if(strcmp(w[k].Chinese,c)==0) //字符比较
{ m++;
cout<<"回答正确"<<endl;
}
else
{
cout<<"回答错误!再试一次"<<endl;
cin>>c;
if(strcmp(w[k].Chinese,c)==0)
{ m++;
cout<<"回答正确"<<endl;
}
else
cout<<"回答错误!正确答案是"<<w[k].Chinese<<endl;
}
}
else if(n==2)
{
srand(time(0));
k=rand()%(q+1);
cout<<w[k].Chinese<<"的英文单词是:"<<endl;
cin>>c;
J++;
if(strcmp(w[k].English,c)==0)
{ s++;
cout<<"回答正确"<<endl;
}
else
{
cout<<"回答错误!再试一次"<<endl;
cin>>c;
if(strcmp(w[k].English,c)==0)
{
cout<<"回答正确"<<endl;
S++;
}
else
cout<<"回答错误,正确答案是"<<w[k].English<<endl;
}
}
}
}
void shunxu() //顺序测试函数
{
int i,n,q,m=0,k1=0,k2=0,j=0,s=0;
FILE*fp;
if((fp=fopen("word.dat","rb"))==NULL)
{
cout<<"此文件打不开"<<endl;
exit(0);
}
for(i=0;fread(&w[i],sizeof(word),1,fp)!=0;i++)
q=i;
while(1)
{
cout<<"1英译汉 2 汉译英 0退出测试"<<endl;
cin>>n;
if(n==0)
{cout<<"共做了"<<j<<"道题,"<<"答对"<<m+s<<"道"<<endl;
cout<<"请选择:0-退出系统;1-重新录入;2-随机测试;3-顺序测试;4-查找单词;5-继续录入;"<<endl;
break;}
else if(n==1)
{
cout<<w[k1].English<<"的中文意思是:"<<endl;
cin>>c;
J++;
if(strcmp(w[k1].Chinese,c)==0)
{ s++;
cout<<"回答正确"<<endl;
}
else
{
cout<<"回答错误,再试一次"<<endl;
cin>>c;
if(strcmp(w[k1].Chinese,c)==0)
{ s++;
cout<<"回答正确!"<<endl;
}
else
cout<<"回答错误!正确答案是"<<w[k1].Chinese<<endl;
}
k1++;
if(k1>q) //测试到最后一个
k1=0; //返回第一个单词
}
else if(n==2)
{
cout<<w[k2].Chinese<<"的英文单词是:"<<endl;
cin>>c;
J++;
if(strcmp(w[k2].English,c)==0)
{ m++;
cout<<"回答正确"<<endl;
}
else
{
cout<<"回答错误,再试一次"<<endl;
cin>>c;
if(strcmp(w[k2].English,c)==0)
{ m++;
cout<<"回答正确"<<endl;
}
else
cout<<"回答错误!正确答案是"<<w[k2].English<<endl;
}
k2++;
if(k2>q)
k2=0;
}
}
}
void chazhao() //查找函数
{
int i,n,q,k=0;
FILE*fp;
if((fp=fopen("word.dat","rb"))==NULL)
{
cout<<"此文件打不开"<<endl;
exit(0);
}
for(i=0;fread(&w[i],sizeof(word),1,fp)!=0;i++)
q=i;
while(1)
{
cout<<"请选择查找方式:1 英译汉 2 汉译英 0 退出查找"<<endl;
cin>>n;
if(n==0)
{cout<<"请选择:0-退出系统;1-重新录入;2-随机测试;3-顺序测试;4-查找单词;5-继续录入;"<<endl;
break;}
else if(n==1)
{
cout<<"请输入英语单词:"<<endl;
cin>>c;
for(k=0;k<=q;k++)
{
if(strcmp(c,w[k].English)==0)
{
cout<<"相应的汉语意思是:"<<w[k].Chinese<<endl;
break;
}
}
if(k>q) //将输入字符与每个w[k].English比较过后没有相同的
{cout<<"你要查找的单词不存在!"<<endl;}
}
else if(n==2)
{
cout<<"请输入汉语意思:"<<endl;
cin>>c;
for(k=0;k<=q;k++)
{
if(strcmp(c,w[k].Chinese)==0)
{
cout<<"相应的英语单词是:"<<w[k].English<<endl;
break;
}
}
if(k>q)
{cout<<"你要查找的单词不存在!"<<endl;}
}
}
}
int main()
{
int a;
cout<<"******欢迎进入背单词系统,请选择操作******"<<endl;
cout<<" "<<endl;
cout<<" 1.重新录入"<<endl;
cout<<" 2.随机测试"<<endl;
cout<<" 3.顺序测试"<<endl;
cout<<" 4.查找单词"<<endl;
cout<<" 5.继续录入"<<endl;
cout<<" 0.退出系统"<<endl;
while(1)
{
while(1) //函数选项
{cin>>a;
if(a>=0&&a<=5)
{break;
cout<<"输入错误,请重新输入"<<endl;
}
}
if(a==0)
break;
else if(a==1)
luru1();
else if(a==2)
suiji();
else if(a==3)
shunxu();
else if(a==4)
chazhao();
else if(a==5)
luru2();
}
cout<<"<<谢谢使用本系统!>>"<<endl;
return 0;
}