资源描述
课程设计报告
需求分析:
题目:单词学习软件
单词(中英文)录入、修改、删除管理、提供多种(至少三种、例如,给出英文选中文,给出中文写英文等)单词学习方法以,对出错单词能够进行查询、统计、排序。
首先它是个软件要有登入用户,其次要有对单词的操作(增删改),再是单词学习方法三种以上以及对学习方法过程中出错的单词能够进行存储查询、统计、排序等。
概要设计:
整个系统分为三大模块,先是用户登入模块供用户登入还包括了整个系统的界面的设计,这里设了一个用户类class user{
public:
char username[20];
char password[20];
user(char name[],char mm[]);
int find(char name[]);
void userregister();
void userjudge();
char custom();
char server1();
char server2();
friend char continueif();
friend int user_long(long ,char );
};
主要有用户注册userregister()、用户判断userjudge(),第一个主菜单界面custom()、二个子菜单界面server1()\server2()等成员函数;
再是对单词的一系列操作增删改及额外添加的翻译模块,这里设计了一个单词类class words{
public:
char english[20];
char chinese[40];
void words_get(char en[],char ch[]);
void words_add();
void words_delete();
void words_revise();
void words_translate();
friend int words_long(long ,char aa[]);
friend long words_seek(char ch[]);
friend int words_long2(long ,char aa[]); //倒数
friend struct word * creat();
friend void writefile(struct word * );
};
主要有单词增加words_add()、单词删除words_delete()、单词修改words_revise()、单 词翻译words_translate()等成员函数及一些友元函数;
最后一个模块是单词学习方法,这里设计了个单词游戏类class wordsgame{
public:
void game_get(char en[]);
int game_abc();
int game_tran();
void game_judge();
void wrongwords_add();
void wrongwords_examine();
void wordsgame::wrongwords_search();
struct wrongword *wrongwords_creat();
friend long wrongwords_seek(char en[]);
friend int words_long(long ,char );
friend int wrongwords_long(long ,char aa);
friend struct word *creat();
friend void print(struct word * );
friend int suiji(int num);
};
主要有给出英文单词选中文(三选一)game_abc()、给出中文写英文(对中文单词进行翻译)game_tran()、增加错误单词wrongwords_add()、查看错词本(里面全是game_tran()过程中翻译错了的单词记录在里面)wrongwords_examine()、在错词本中查找出错单词并统记出错次数wrongwords_search()等成员函数及一些友元供调用的函数。
详细设计:
描述系统各模块的实现方法,程序流程、系统界面等。(重点叙述自己的详细设计)
首先用户登入及系统界面模块通过类user来实现的,用户先通过成员函数
void user::userregister()
{
ofstream llw;
llw.open("f:\\user.txt",ios::app);
if(find(username)==1)
{
cout<<"用户名已存在"<<endl;
exit(-1);
}
else
{
llw.write(username,strlen(username));
llw.put(' ');
llw.write(password,strlen(password));
llw.put('\n');
system("cls");
cout<<"\n\n\t\t\t\t注册成功!"<<endl;
}
}
注册一个自己的号其中用户注册的账号和密码用了一个txt格式的文件user.txt来存储的,然后输入注册了的帐号和密码通过成员函数
void user::userjudge()
{
if(find(username)!=1)
{
cout<<"用户名不存在!"<<endl;
exit(-1);
}
else if(find(username)==1&&find(password)!=2)
{
cout<<"用户密码错误!"<<endl;
exit(-1);
}
else
{
system("cls");
for(int i=10;i>=1;i--)
{
cout<<"\n\n\t\t\t欢迎您使用该软件"<<'\n'<<"\t\t\t 制作人:llw"<<endl;
cout<<"\n\n\n\n\n\t\t\t 初始化中......"<<i<<endl;
_sleep(500);
system("cls");
}
system("color 2b");
//system("cls");
//system("color 2b");
cout<<"\n\n\n\n\n\n\n\n\t\t\t初始化成功...!"<<endl;
_sleep(3000);
//system("pause");
}
}
来判定用户是否可以继续下面的操作,如果判定通过则跳入到第一个主菜单custom()
char user::custom() //主菜单界面
{
char A[10];
char b;char i;
int k=0;
system("cls");
cout<<"\n \n"
<<"\t\t#####################################\n"
<<"\t\t# 学习方式: #\n"
<<"\t\t# 1.单词操作 #\n"
<<"\t\t# 2.单词游戏 #\n"
<<"\t\t# 0.退出系统 #\n"
<<"\t\t#####################################\n"<<endl;
while(1)
{
cout<<"\t\t请选择学习方式:";
cin>>A;
if(strlen(A)==1)
{
for(i='0';i<='2';i++)
{
b=i;
if(b==A[0])
return b;
}
}
cout<<"\n\t\t\t输入有误!\n"<<endl;
k++;
if(k>4)
{
system("cls");
cout<<"\n\n\t\t\t提示:错误输入超过5次!您将被强制退出!!\n"<<endl;
//cout<<"\t\t按任意键继续"<<endl;
exit(-1);
}
}
}
有二个选项分通向二个子菜单server1()
char user::server1()
{
Char A[10];
Char b;
char i;
int k=0;
system("cls");
cout<<"\n \n"
<<"\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"
<<"\t\t$ $\n"
<<"\t\t$ 功能 $\n"
<<"\t\t$ 1.中英文的录入 $\n"
<<"\t\t$ 2.中英文的删除 $\n"
<<"\t\t$ 3.中英文的修改 $\n"
<<"\t\t$ 4.中英文的翻译 $\n"
<<"\t\t$ 5.返回上一层菜单 $\n"
<<"\t\t$ 0.退出 $\n"
<<"\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"<<endl;
while(1)
{
cout<<"\t\t 请选择操作方式:";
cin>>A;
if(strlen(A)==1)
{
for(i='0';i<='5';i++)
{
b=i;
if(b==A[0])
return b;
}
}
cout<<"\n\t\t\t\t输入有误!\n"<<endl;
k++;
}
if(k>4)
{
cout<<"错误输入超过5次!\n";
exit(-1);
}
}
和server2()
Char user::server2()
{
char A[10];
char b;
char i;
int k=0;
system("cls");
cout<<" \n"
<<"\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"
<<"\t\t$ 单词游戏 $\n"
<<"\t\t$ 1.给出英文选中文 $\n"
<<"\t\t$ 2.给出中文写英文 $\n"
<<"\t\t$ 3.查看错词本 $\n"
<<"\t\t$ 4.查找错误单词 $\n"
<<"\t\t$ 5.返回上一层菜单 $\n"
<<"\t\t$ 0.退出 $\n"
<<"\t\t$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n"<<endl;
while(1)
{
cout<<"\t\t 请选择操作方式:";
cin>>A;
if(strlen(A)==1)
{
for(i='0';i<='5';i++)
{
b=i;
if(b==A[0])
return b;
}
}
cout<<"\n\t\t\t\t输入有误!\n"<<endl;
k++;
}
if(k>4)
{
cout<<"错误输入超过5次!\n";
exit(-1);
}
}
分别对应着其他二个模块;server1()界面对应着单词的增删改及翻译模块通过类words来实现,有单词的增加、单词的删除、单词的修改及单词的翻译功能;单词的增加通过words_add()
void words::words_add()
{
char en[20],ch[40];
cout<<"请输入要添加的英文单词和中文意思"<<endl;
cin>>en>>ch;
words_get(en,ch);
ofstream llw;
if(words_seek(english)==-1)
{
llw.open("f:\\ciku.txt",ios::app,0);
llw.write(english,strlen(english));
llw.put(' ');
llw.write(chinese,strlen(chinese));
llw.put('\n');
llw.close();
cout<<"单词添加成功"<<endl;
}
else
cout<<"要添加的英文单词已存在,单词添加失败!"<<endl;
}
把用户输入的要添加的英文单词及中文意思存入ciku.txt文件中,单词的删除通过words_delete()
void words::words_delete() //删除单词
{
//long z=0;
//int j=0;
char ch[40];
struct word *head,*p1,*p2;
cout<<"请输入要删除的中英文单词"<<endl;
cin>>ch;
head=creat();
p2=p1=head;
if(strcmp(p1->yw,ch)==0||strcmp(p1->zw,ch)==0)
head=p1->next;
while(p1!=NULL)
{
if(strcmp(p1->yw,ch)==0||strcmp(p1->zw,ch)==0)
{
cout<<p1->yw<<":"<<p1->zw<<endl;
p2->next=p1->next;
cout<<"单词删除成功!"<<endl;
writefile(head);
break;
}
else
{
p2=p1;
p1=p1->next;
}
}
if(p1==NULL)
cout<<"您要删除的单词找不到!"<<endl;
}
把用户要删除的单词先通过调用友元函数creat()
struct word *creat()//创建链表并把单词放入链表中
{
int i=0;
long z=0;
char ch;
n=0;
struct word *head;
word *p1=new struct word;
p1->next=NULL;
struct word *p2;
p2=p1;
fstream llw;
llw.open("f:\\ciku.txt",ios::in|ios::out);
if(!llw)
cout<<"cannot open output";
i=words_long(z,' ');
llw.read(p1->yw,i);
p1->yw[i]='\0';
z=z+i+1;
i=words_long(z,'\n');
llw.seekg(z,ios::beg);
llw.read(p1->zw,i);
p1->zw[i]='\0';
z=z+i+1;
z++;
while(llw.get(ch))
{
n++;
if(n==1)head=p1;
else
p2->next=p1;
word *p1=new struct word;
p1->next=NULL;
p2->next=p1;
p2=p1;
i=words_long(z,' ');
llw.seekg(z,ios::beg);
llw.read(p1->yw,i);
p1->yw[i]='\0';
z=z+i+1;
i=words_long(z,'\n');
llw.seekg(z,ios::beg);
llw.read(p1->zw,i);
p1->zw[i]='\0';
z=z+i+1;
z++;
llw.seekg(z,ios::beg);
}
p2->next=NULL;
return head;
}
创建一个链表并把ciku.txt文件里的数据全存进链表里再从表里找到它删除该单词所在结点最后再通过调用writefile(struct word * )
void writefile(struct word *head)
{
struct word *p;
ofstream llw("f:\\ciku.txt");
p=head;
while(p!=NULL)
{
llw.write(p->yw,strlen(p->yw));
llw.put(' ');
llw.write(p->zw,strlen(p->zw));
llw.put('\n');
p=p->next;
}
delete p,head;
}
把新链表写入ciku.txt文件中保存来完成,单词的修改通过成员函数words_revise()
void words::words_revise()
{
long z=0;
int k=0;
char en[40],ch[40];
struct word *head,*p1;
cout<<"请先输入要修改的单词再输入要改为的单词"<<endl;
cin>>en>>ch;
//words_get(en,ch);
head=creat();
p1=head;
while(p1!=NULL)
{
if(strcmp(p1->yw,en)==0||strcmp(p1->zw,en)==0)
{
if(strcmp(p1->yw,en)==0)
{
cout<<p1->yw<<"->"<<ch<<endl;
strcpy(p1->yw,ch);
cout<<"单词修改成功!"<<endl;
}
else
{
cout<<p1->zw<<"->"<<ch<<endl;
strcpy(p1->zw,ch);
cout<<"中文单词修改成功!"<<endl;
}
writefile(head);
break;
}
else p1=p1->next;
}
if(p1==NULL) cout<<"您要修改的单词找不到!"<<endl;
}
把用户输入的要修改的单词通过调用友元创建链表把ciku.txt里的数据存进链表中再通过对链表的操作查找找到它并把它改为用户需要改为的单词再通过调用友元函数writefile()再把链表写回ciku.txt文件中来完成;单词翻译words_translate()
int wordsgame::game_tran()
{
int i=0,k,m;
char en[20];
struct word *p;
char abc[2][40];
p=creat();
m=n+1;
k=suiji(m);
while(p!=NULL)
{
i++;
if(i==k)
{
strcpy(abc[0],p->yw);
strcpy(abc[1],p->zw);
break;
p=p->next;
}
else
p=p->next;
}
cout<<abc[1]<<'\n'<<"请翻译"<<endl;
cin>>en;
//game_get(en);
if(strcmp(abc[0],en)==0)
cout<<"翻译正确"<<endl;
else
{
cout<<"翻译错误"<<endl;
ofstream llw("f:\\wrongwords.txt",ios::app);
llw.write(abc[0],strlen(abc[0]));
llw.put(' ');
llw.write(abc[1],strlen(abc[1]));
llw.put(' ');
llw.write(en,strlen(en));
llw.put('\n');
cout<<"错误的单词已加入到错词本中"<<endl;
}
delete p;
return 0;
}
有三种翻译方式:中英文单词一翻译、单独翻译中文单词和单独翻译英文单词。它根据用户的选择和输入通过调用友元words_seek()直接在文件ciku.txt中寻找用户输入的单词,再根据word_seek()的返回值输出用户需要的翻译来实现单词的翻译
等功能的;
Server2()界面对应着单词游戏模块通过类wordsgame来实现,有单词选择题(给出英文选中文)game_abc()
int wordsgame::game_abc()
{
int k;
int en;
char abczw[3][40],abcyw[3][20];
struct word *p;
int i=1,j=0,l=0;
p=creat();
n=n+1;
k=suiji(n-2);
while(i<=k+2)
{
if(i<k)
p=p->next;
else
{
strcpy(abczw[j],p->zw);
strcpy(abcyw[j],p->yw);
j++;
p=p->next;
}
i++;
}
l=suiji(3);
cout<<abcyw[l-1]<<endl;
for(int t=0;t<3;t++)
cout<<t+1<<"."<<abczw[t]<<' ';
cout<<"请输入你的选择"<<endl;
cin>>en;
if(en>=1&&en<=3)
{
if(en==l)
cout<<"选择正确"<<endl;
else cout<<"选择错误!"<<endl;
}
else
cout<<"输入错误";
delete p;
return l;
}
通过调用随机函数产生随机数来输出随机数在链表结点中对应的三个单词再根据判断用户输入的正确与否来实现单词的选择,给出中文写英文game_tran()
int wordsgame::game_tran()
{
int i=0,k,m;
char en[20];
struct word *p;
char abc[2][40];
p=creat();
m=n+1;
k=suiji(m);
while(p!=NULL)
{
i++;
if(i==k)
{
strcpy(abc[0],p->yw);
strcpy(abc[1],p->zw);
break;
p=p->next;
}
else
p=p->next;
}
cout<<abc[1]<<'\n'<<"请翻译"<<endl;
cin>>en;
//game_get(en);
if(strcmp(abc[0],en)==0)
cout<<"翻译正确"<<endl;
else
{
cout<<"翻译错误"<<endl;
ofstream llw("f:\\wrongwords.txt",ios::app);
llw.write(abc[0],strlen(abc[0]));
llw.put(' ');
llw.write(abc[1],strlen(abc[1]));
llw.put(' ');
llw.write(en,strlen(en));
llw.put('\n');
cout<<"错误的单词已加入到错词本中"<<endl;
}
delete p;
return 0;
}
通过调用随机函数来随机的读取链表结点中的中文单词再判断用户的输入与否,若否则把错误和对应的正确中英文单词一起存入错词本wrongwords.txt中,查看错词本game_examine()
void wordsgame::wrongwords_examine()
{
struct wrongword *p;
p=wrongwords_creat();
while(p!=NULL)
{
cout<<p->en<<":"<<p->ch<<" "<<"wrongwords:"<<p->wrong<<endl;
p=p->next;
}
delete p;
}
通调用wrongwords_creat()
struct wrongword * wordsgame::wrongwords_creat()
{
char hh;
long z=0;
int r=0,k=0;
wrongword *p1=new struct wrongword;
struct wrongword *head,*p2;
p2=p1;
ifstream llw("f:\\wrongwords.txt");
if(!llw) cout<<"cannot open the file"<<endl;
llw.seekg(z,ios::beg);
k=wrongwords_long(z,' ');
llw.read(p1->en,k);
p1->en[k]='\0';
z=z+k+1;
llw.seekg(z,ios::beg);
k=wrongwords_long(z,' ');
llw.read(p1->ch,k);
p1->ch[k]='\0';
z=z+k+1;
llw.seekg(z,ios::beg);
k=wrongwords_long(z,'\n');
llw.read(p1->wrong,k);
p1->wrong[k]='\0';
z=z+k+2;
while(llw.get(hh))
{
r++;
llw.seekg(z,ios::beg);
if(r==1) head=p1;
wrongword *p1=new struct wrongword;
p1->next=NULL;
p2->next=p1;
p2=p1;
k=wrongwords_long(z,' ');
llw.read(p1->en,k);
p1->en[k]='\0';
z=z+k+1;
llw.seekg(z,ios::beg);
k=wrongwords_long(z,' ');
llw.read(p1->ch,k);
p1->ch[k]='\0';
z=z+k+1;
llw.seekg(z,ios::beg);
k=wrongwords_long(z,'\n');
llw.read(p1->wrong,k);
p1->wrong[k]='\0';
z=z+k+2;
llw.seekg(z,ios::beg);
}
p2->next=NULL;
llw.close();
return head;
}
创建一个链表并把错词本中的数据存入其中再读取链表中的数据输出到屏幕上,查找错误单词wrongwords_serach()
void wordsgame::wrongwords_search()
{
char en[20];
char ch[40];
char wr[20][20];
long z=0;
struct wrongword *p;
p=wrongwords_creat();
cout<<"请输入要差找的单词"<<endl;
cin>>en;
while(p!=NULL)
{
if(strcmp(p->en,en)==0)
{
strcpy(ch,p->ch);
strcpy(wr[z],p->wrong);
z++;
}
p=p->next;
}
cout<<"查找完毕!"<<endl;
if(z!=0)
{
cout<<en<<":"<<ch<<endl;
cout<<"wrongnum:"<<z<<endl;
//cout<<"\t wrongwords:";
cout<<"wrongword:";
for(;z>=1;z--) cout<<wr[z-1]<<" ";
}
else cout<<"\n您要查找的单词找不到!"<<endl;
cout<<endl;
delete p;
//delete []wr;
}
通过调用wrongwords_creat()创建链表读取错词本wrongwords.txt中全部数据根据用户的输入单词与链表中的每个结点中的英文单词一个个对比是否相同,是就输出该结点等功能。
调试分析:
调试过程中经常会应为程序太长,找不出错误在哪里,后我我学会了把程序分割成成一个个小函数再调出来调试,虽然可能你觉得这方法很复杂化,但是只要你掌握了分割技巧就会觉得简单而且效率高,百分百的能找到出错的地方。
用户使用说明:
先在f:\目录下创建三个txt文件分别为user.txt、ciku.txt、wrongwords.txt 至于内容可以把附录里面的内容输进去,注意:内容末尾必须有且只有一个换行不然查找会出错,然后可以打开exe应用程序先注册再登入,进入后自然会用。
测试结果:
附录:
源代码
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
#include<ctype.h>
#define NULL 0
int n;
struct word
{
char yw[20];
char zw[80];
struct word *next;
};
struct wrongword
{
char en[20];
char ch[40];
char wrong[20];
struct wrongword *next;
};
class user{
public:
char username[20];
char password[20];
user(char name[],char mm[]);
int find(char name[]);
void userregister();
void userjudge();
char custom();
char server1();
char server2();
friend char continueif();
friend int user_long(long ,char );
};
class words{
public:
char english[20];
char chinese[40];
void words_get(char en[],char ch[]);
void words_add();
void words_delete();
void words_revise();
void word
展开阅读全文