一、题目分析
(1)题目描述:
单词小助手,要求完成以下任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将单词测试中的功能完善,可针对做错的单词重复记忆。
3.查询单词的功能添加英文词查询,中文查询的功能完善(考虑如何显示同样中文意义,不同的英文单词)
提高要求:可将程序中的不足(如数据验证,排名功能)等根据自己的能力与理解完成。
(2)分析:
单词小助手:首先题目已经给出了基本的代码,也实现了基本的功能,比如说添加单词,修改,删除,查询,以及单词小测试等功能,还需要做的就是改善其中的功能,更进一步添加新的功能,比如说改善其中的数据验证,添加排行功能,错词重复记忆功能。
数据验证:
数据验证就是进行输入检查,包括进行输入菜单选择时的验证和输入单词的正确性检查。输入菜单选择时,用户选错的提示,因为scanf指定输入格式后,只能输入固定的格式,否则就会出现报错现象。当输入英文的时候,我们需要判断用户输入的是否为英文字母,如果是数字或者其他的什么字符就应该提醒,在此处我们需要加入一个判断函数--------if(a[i]>='a'&&a[i]<='z'||a[i]=='\0||a[i]==' ')
,专门判断英文输入正确性。
排行功能:
这里,可以添加一个专门存放排行榜用户信息的文件,建立一个用户的结构体,在单词小测试后输入用户名,将用户的错词,答对的词数以及成绩存入一个文件,并进行排序和显示出来。
错词记忆:
用户答错词时,用户需根据提示,重新输入词,直到输入正确为止。
二、算法构造
添加单词算法的流程图:
N–S盒图
排行榜的流程图:
排行榜的盒图:
三、算法实现
#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