本程序具有单词词库管理、单词词库预览、单词背诵、背诵成绩查询功能,目前版本仍然存在众多问题。
程序代码如下:
/*
作者: Key-不会挖洞的猫鼬
版本: 20170317.5.07
文件名:wordaide
创建时间: 2017.3.17
主要功能: 单词词库管理,单词背诵,单词预览,单词背诵成绩展示
修改日期:2017.3.19
修改内容:单词强化记忆
问题漏洞:本版仍存在不少问题,单词强化功能不达标,单词背诵(中英)存在漏洞,同一中文意思的单词
测试过程中,必须输入对应下标的英文形式,否则判断为错误,另外,通过修改单词信息功能可使
词库出现英文相同的单词。
*/
#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]; //单词数组
int num; //单词个数
int select = 1; //select 为是否退出系统的标记
int wordture = 0,wordfalse = 0; //wordture、wordfalse为正确、错误次数
//帮助
void help()
{
printf ("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
printf ("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
}
//从文件中读取单词的信息(只读)
void readfile()
{
FILE *fp; //用于打开文件
int i = 0;
fp = fopen("data.txt","r"); //打开data.txt文档(只读方式打开)
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); //关闭data.txt文档
}
//从文件中读取单词的信息
void writefile()
{
FILE *fp;
int i = 0;
fp = fopen("data.txt","w"); //打开data.txt文档(打开只写文件)
if(!fp)
{
printf ("\n打开文件data.txt失败!");
}
for(i = 0;i < num;i ++) //i<单词个数(num)
{
fprintf (fp,"\n%s %s ",s[i].en,s[i].ch); //读取单词中英文
}
printf ("\n");
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);
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 searchch()
{
int i = 0, choose = 0, flag = 1,x=0;
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)
{
if (x == 0) //x用于判断是否输出 “英文形式 中文形式 ”
{
printf ("\n英文形式 中文形式 ");
x = 1 ;
}
printf ("\n %-12s%12s",s[i].en,s[i].ch);
}
}
flag = 0;
if (!flag && x == 0)
{
printf ("\n没有这个单词!");
}
printf ("\n继续查询请选1,返回上一级请选0:");
scanf ("%d",&choose);
if (choose == 0)
{
return;
}
else
{
x = 0; //继续查询时让x值返回0
}
}
}
//英文形式查询
void searchen()
{
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;
int test;
while (choose)
{
i = rand() % num;
printf ("\n【%s】请输入英文单词:",s[i].ch);
scanf ("%s",b1);
for (z = 0;strcmp(b1,s[i].en) != 0;z ++)
{
printf ("\n输入错误!!请重新输入:");
scanf ("%s",b1);
wordfalse += 1;
test = i;
}
printf ("\n恭喜你,回答正确,加10分!\n\n");
wordture += 1;
printf ("\n继续测试请选1,返回上一级请选0:");
scanf ("%d",&choose);
if (choose==0)
{
i = test ;
printf ("\n【%s】请输入英文单词:",s[i].ch);
scanf ("%s",b1);
for (z = 0;strcmp(b1,s[i].en) != 0;z ++)
{
printf ("\n输入错误!!请重新输入:");
scanf ("%s",b1);
wordfalse += 1;
test = i;
}
printf ("\n恭喜你,回答正确,加10分!\n\n");
wordture += 1;
printf ("\n继续测试请选1,返回上一级请选0:");
scanf ("%d",&choose);
return;
}
}
}
//英译中测试
void yztest()
{
char b1[20]; //用户输入的中文
int z,x = 41;
int choose = 1;
int i;
while (choose)
{
i = rand()%num;
printf ("【%s】请输入中文意思:",s[i].en);
scanf ("%s",b1);
for (z = 0;strcmp(b1,s[i].ch) != 0;z = z)
{
printf ("输入错误!!请重新输入:");
scanf ("%s",b1);
wordfalse += 1;
}
printf ("\n恭喜你,回答正确,加10分!\n\n");
wordture += 1;
printf ("\n继续测试请选1,返回上一级请选0:");
scanf ("%d",&choose);
if (choose == 0)
{
return;
}
}
}
//成绩列表
void list()
{
printf ("\n 共计输入错误:%d次 **每次扣10分**\n",wordfalse); //wordfalse为错误次数
printf (" 共计输入正确:%d次 **每次加10分**\n",wordture); //wordture为正确次数
printf (" 你的总得分为:%d分\n\n",10 * wordture - 10 * wordfalse);
}
//词典维护
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:
searchch(); //查询单词函数
break;
case 5:
searchen(); //查询单词函数
break;
case 6: return; //返回用户界面
default:
printf ("\n请在1-5之间选择");
}
}
}
//用户界面
void menu()
{
int item;
printf ("\n");
printf (" *********************************************************\n");
printf (" # #\n");
printf (" # 英语单词小助手 #\n");
printf (" # #\n");
printf (" # 版本 : 20170317.5.07 #\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.退出系统 #\n");
printf (" # #\n");
printf (" **********************************************************\n");
printf ("\n");
printf (" 请选择您需要的操作序号(0-5)按回车确认:");
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:
select = 0; //用于退出系统, select为0时,退出循环
break;
default:
printf("请在0-6之间选择\n");
}
}
int main()
{
while (select) //select为0时,退出循环
{
menu(); //用户界面函数
}
system ("pause");
return 0;
}
实际运行截图及说明:
下图为相同中文意思的不同单词查询功能的实现。
由于词库存在中文意思相同的单词,在查询时应完成词库所有单词的比对。
编程思路:利用循环把词库中的单词的中文形式与用户要查找的中文一一比对;若未发现用户查询的单词则输出
“没有这个单词!”,然后询问是否继续查询;发现用户查询的单词则按照相应的格式进行输出。
其中x用于判断是否输出“英文形式 中文形式”,如果有多个单词意思相同,x的存在保证了只有一次输出,该行输出过后则需要改变x的值,保证只输出一次,但为了避免用户继续查询单词时该行不输出,所以在选择是否查询单词之前应把x的值返回初值0。
以(!flag && x == 0)作为是否输出“没有这个单词!”的做法保证了不会出现在找到多个同一中文意思的单词之后还输出没有这个单词!”。
中文形式查询函数如下:
//中文形式查询
void searchch()
{
int i = 0, choose = 0, flag = 1,x=0;
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)
{
if (x == 0) //x用于判断是否输出 “英文形式 中文形式 ”
{
printf ("\n英文形式 中文形式 ");
x = 1 ;
}
printf ("\n %-12s%12s",s[i].en,s[i].ch);
}
}
flag = 0;
if (!flag && x == 0)
{
printf ("\n没有这个单词!");
}
printf ("\n继续查询请选1,返回上一级请选0:");
scanf ("%d",&choose);
if (choose == 0)
{
return;
}
else
{
x = 0; //继续查询时让x值返回0
}
}
}
下图为强化记忆背诵错误的单词:
如图所示,当用户单词背诵有错误时,是无法直接返回上一级的,用户必须完成该错误单词的再一次测试才可成功返回。但是目前仍无法同时记录用户所有错误的单词。故而,单词背诵(英中)仍然未添加此项功能。