资源描述
课程设计汇报
需求分析:
题目:单词学习软件
单词(中英文)录入、修改、删除管理、提供多个(最少三种、比如,给出英文选汉字,给出汉字写英文等)单词学习方法以,对犯错单词能够进行查询、统计、排序。
首先它是个软件要有登入用户,其次要有对单词操作(增删改),再是单词学习方法三种以上和对学习方法过程中犯错单词能够进行存放查询、统计、排序等。
概要设计:
整个系统分为三大模块,先是用户登入模块供用户登入还包含了整个系统界面设计,这里设了一个用户类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 words_translate();
friend int words_long(long ,char aa[]);
friend lon
展开阅读全文