在索引文章中我们提到过,单词本程序中的单词学习功能,包含单词预览、选择题背诵、拼写背诵功能,其中拼写背诵功能又可以选择看中文写英文、看英文写中文两种背诵形式,具体代码如下:
printf("1.进行单词预览\n2.进行单词学习\n"); //让用户进行功能选择
scanf("%d",&ch);
if(ch==1) //若用户选择单词预览,则执行此步骤
{
printf("进行单词预览\n");
while((dcsj[i].j)!=0) //输出用于存储单词信息的结构体的内容
{
printf("%d %s %s\n",dcsj[i].j,dcsj[i].px,dcsj[i].zw);
i++;
}
printf("单词预览结束,按任意键(除空格键)进入单词学习!\n");
scanf("%s",&dy); //将用户输入的任意内容存储到字符变量里,并执行下一步
system("cls"); //清屏
if(a1==1) //若用户选择选择题背诵,则执行此步骤
{
printf("进行选择题背诵,请输入单词背诵个数:\n");
scanf("%d",&c1);
srand(time(NULL)); //产生随机数,用于确定用户需背的单词
for(i=0;i<c1;i++) //随机数总数为用户想背的单词数“c1”
{
sjs1[i]=rand()%count+1; //“count”为单词总数
}
for(b1=0;b1<c1;b1++) //进行c1次循环,共背c1个单词
{
do{
for(i=0;i<3;i++)
{
sjs2[i]=rand()%count+1; //产生3个随机数,用于确定每次背诵的干扰选项
}
}while(sjs2[0]==sjs2[1]||sjs2[0]==sjs2[2]||sjs2[0]==sjs2[3]||sjs2[0]==sjs1[b1]||sjs2[1]
==sjs2[2]||sjs2[1]==sjs2[3]||sjs2[1]==sjs1[b1]||sjs2[2]==sjs2[3]||sjs2[2]==sjs1[b1]||sjs2[3]==sjs1[b1]);
//若四个选项中的单词有重复,则重新执行此步骤,直至四个选项内无重复单词
do{
for(i=0;i<4;i++)
{
sjs3[i]=rand()%4+1; //产生[1-4]四个随机数,用于随机确定正确选项
}
}while(sjs3[0]==sjs3[1]||sjs3[0]==sjs3[2]||sjs3[0]==sjs3[3]||sjs3[0]==sjs3[4]||sjs3[1]
==sjs3[2]||sjs3[1]==sjs3[3]||sjs3[1]==sjs3[4]||sjs3[2]==sjs3[3]||sjs3[2]==sjs3[4]||sjs3[3]==sjs3[4]);
//确保数组内的随机数没有重复
strcpy(dadj[sjs3[0]-1],dcsj[sjs2[0]].zw); //将干扰项及正确答案复制到dadj数组中
strcpy(dadj[sjs3[1]-1],dcsj[sjs1[b1]].zw);//dadj[sjs3[1]-1]固定为正确选项
strcpy(dadj[sjs3[2]-1],dcsj[sjs2[1]].zw);
strcpy(dadj[sjs3[3]-1],dcsj[sjs2[2]].zw);
printf("单词:\t%s\n选项:\nA.\t%s\nB.\t%s\nC.\t%s\nD.\t%s\n请输入您的选项(A/B/C/D):\t",
dcsj[sjs1[b1]].px,dadj[0],dadj[1],dadj[2],dadj[3]);
//将单词及选项输出,引导用户进行选择
t=sjs3[1]-1; //用于确定此次循环正确选项在数组中的位置
switch(t) //用于确定此次循环正确选项对应的选择(A/B/C/D)
{
case 0:zq='A';break;
case 1:zq='B';break;
case 2:zq='C';break;
case 3:zq='D';break;
}
scanf("%s",&yhxz); //将用户输入的选项存储到字符变量中
if(yhxz!=zq) //判断此次用户是否选择正确
{
printf("背诵错误,已计入错题本!\n");
ct[h]=dcsj[sjs1[b1]]; //若用户输入错误,则将该单词存入错题本
score-=10; //用户总得分“-10”
h++; //错题本数组指针移动
}
else
{
printf("背诵正确,请继续答题!\n");
score+=10; //若用户选择正确,则得分“+10”
}
}
printf("错题如下:\n"); //当用户单词全部背诵完毕时,输出错题本及总得分
for(i=0;i<h;i++)
{
printf("%d %s %s\n",ct[i].j,ct[i].px,ct[i].zw);
}
printf("您错误的题数为: %d\n您的得分为:%d\n",h,score);
上述代码效果图如下:
注:
(1)上述代码实现正确选项随机出现的思路是先产生1-4内的4个随机数,虽然1,2,3,4四个数字是固定不变的,但每个数字出现的顺序随机,再通过switch语句判断每次正确的选项标号,以此来实现既能确定正确选项标号,又能使正确选项随机出现的功能。
(2)由于篇幅原因,笔者只贴出了较为核心的部分代码,并没有贴出变量定义、文件相关操作部分的代码,读者们可以自行完善,我也会将代码打包上传,有兴趣的伙伴可以自行下载。
if(xz1==1) //若用户选择“看中文写英文”,则执行此步骤
{
printf("进行拼写单词背诵,请输入单词背诵个数:\n");
scanf("%d",&c1);
srand(time(NULL)); //产生随机数
for(i=0;i<c1;i++)
{
sjs1[i]=rand()%count+1; //count为单词总数
}
for(b1=0;b1<c1;b1++) //总的进行c1次循环,“c1”为用户想背的单词总数
{
printf("%s\n请输入中文:",dcsj[sjs1[b1]].px); //输出单词,并引导用户进行回答
scanf("%s",zwsr); //将用户输入的答案存储到“zwsr”中
if(strcmp(zwsr,dcsj[sjs1[b1]].zw)!=0) //将用户的输入与正确答案进行比对,若错误则执行此步骤
{
printf("背诵错误,已计入错题本!\n");
ct[h]=dcsj[sjs1[b1]]; //将该单词记入错题本
score-=10; //总得分“-10”
h++;
}
else
{
printf("背诵正确,请继续答题!\n");
score+=10; //若回答正确,则总得分“+10”
}
}
printf("错题如下:\n"); //全部背诵完毕,输出错题本及总得分
for(i=0;i<h;i++)
{
printf("%d %s %s\n",ct[i].j,ct[i].px,ct[i].zw);
}
printf("您错误的题数为: %d\n您的得分为:%d\n",h,score);
}
上述代码效果图如下:
注:
(1)上述代码只实现了“看英文写中文”的功能,“看中文写英文”功能的代码与上述代码十分相似,读者们稍加修改上述就能实现该功能。
在单词学习模块中,还有一个重要的功能模块,就是在用户选择退出此功能模块时询问用户是否将此次错题保存到错题本,并根据用户的选择实现相关操作,具体代码如下:
else if(a1==4) //若用户选择退出此程序,则执行此步骤
{
printf("请选择是否保存错题本:\n1.保存\n2.不保存\n"); //引导用户进行功能选择
scanf("%d",&xz2);
if(xz2==1) //若用户选择保存错题本,则执行此程序
{
FILE *fp; //定义文件指针
fp=fopen("D:\\Ctext\\cuotiben.txt","a+"); //以追加的形式打开错题本文件
if(!fp) //判断文件是否成功打开
{
printf("file error!\n");
exit(1);
}
for(i=0;i<h;i++) //将此次错题本数组中的内容写入错题本文件中
{
fprintf(fp,"%d %s %s\n",i+1,ct[i].px,ct[i].zw);
}
fclose(fp); //关闭文件
system("cls"); //清屏
Menu();
}
else if(xz2==2) //若用户选择直接退出此程序,则直接清屏后退出
{
system("cls");
Menu();
}
}
上述代码效果图如下:
(1)选择保存错题:
按回车键后,错题自动保存,并返回主菜单:
至此,单词学习模块基本编写完成了。单词学习模块是单词本程序中相对较复杂的一块,也是代码量最多的一块。由于篇幅原因,我只贴出了各个功能中较为核心的代码,变量定义、文件操作等代码并没有贴上去,伙伴们可以自行完善上述代码,稍后我也会将完整的代码打包上传,有需要的伙伴可以自行下载。