1.题目分析
单词小助手,要求完成以下任务:
- 改写程序为良好程序风格(文档注释,函数注释,语句注释)。
- 将单词测试中的功能完善,可针对做错的单词重复记忆。
- 查询单词的功能添加英文词查询,中文查询的功能完善(考虑如何显示同样中文意义,不同的英文单词)
提高要求: - 可将程序中的不足(如数据验证,排名功能)等根据自己的能力与理解完成。
2.关键算法构造
程序流程总图
用户分数排序盒图
判断是否输入是汉字盒图(其他判断类似)
3.程序实现
#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]; //单词数组
struct sco//用户的结构体
{
char id[MAX_CHAR]; // id
int sc; //成绩
} user[MAX_CHAR]; //用户
struct word w[MAX_NUM];//定义一个错误单词的结构体数组
int m;
int num; //单词个数
int wnum;//记录错误单词的总数
int unum;//记录用户的个数
int select = 1;//select 为是否退出系统的标记
int d = 0, c = 0;//声明全局变量,记录用户答对以及回答错误的单词个数,以便计算分数
//帮助查询函数
void help()
{
printf("\n本系统主要实现英语单词学习的功能。用户可对词典文件中的单词进行预览,增删改查。");
printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
printf("\n主要功能:。");
printf("\n1.词库维护:可以增加、删除、修改和中文查询单词,英文查询单词。");
printf("\n2.单词预览:将文件中的单词在屏幕上显示中英文词义。");
printf("\n3.单词背诵(中英):随机显示中文,用户需输入英文,正确得十分,错误扣十分。");
printf("\n4.单词背诵(英中):随机显示英文,用户需输入中文,正确可得十分,错误扣十分。");
printf("\n5.成绩查询:显示中英、英中单词检测的成绩与总成绩。");
printf("\n6.写错的词存入错词本,用户可以查看加强记忆,也可以将答错的词可以从单词本删除");
printf("\n同时还可进行中英、英中测试。本系统还提供了测试成绩的显示功能。");
printf("\n");
printf("\n");
}
int getRealInput() {
char c;
int flag = 0;
do
{
scanf("%c", &c);
if (c == '1' || c == '0')
{
flag = 0;
}
else
{
flag = 1;
}
} while (flag);
return c - 48;
}
//从单词库文件中读取单词的信息
void readfile()
{
FILE *fp;//声明文件
int i = 0;//定义变量
fp = fopen("data.txt", "r");//打开存放单词的·文件库
if (!fp)//如果文件不存在
{
printf("\n打开文件data.txt失败!");
}
while (fscanf(fp, "%s %s ", s[i].en, s[i].ch) == 2)//读取下一个单词
{
i++;//计数器+1
}
num = i;//记录单词总数
if (0 == i)
printf("\n文件为空,请选择词典维护增加词条!");
else
printf("\n");
fclose(fp);//关闭文件
}
//向文件写入单词的函数
void writefile()
{
FILE *fp;//声明文件
int i = 0;//定义变量
fp = fopen("data.txt", "w");//打开文件
if (!fp)//如果文件不存在
{
printf("\n打开文件data.txt失败!");
}
for (i = 0; i < num; i++)//循环遍历写入单词
{
fprintf(fp, "\n%s %s ", s[i].en, s[i].ch);//fprintf(可以从一个文件流中格式化写入数据)
}
printf("\n");
fclose(fp);//关闭文件
}
//读取错题库文件
void readwrongfile()
{
FILE *fp;//声明文件
int i = 0;//定义变量
fp = fopen("wrongword.txt", "r");//打开存放记错单词文件库
if (!fp)//如果文件不存在
{
printf("\n打开文件wrongword.txt失败!");
}
while (fscanf(fp, "%s %s ", w[i].en, w[i].ch) == 2)//读取下一个单词
{
i++;//计数器+1
}
wnum = i;//记录单词总数
if (0 == i)
// printf("\n文件为空,棒棒哒,你还没有记错单词哟");
printf("\n");
else
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);