C++ 轻松背单词 源代码

来源:互联网 发布:朴树生如夏花知乎 编辑:程序博客网 时间:2024/06/17 00:05

本来是1月20号以后提交的,所以我想把它做成图形界面,可是老师突然把截止日期提前到了1月初……为了赶工,只好写成Console的了,毕竟还有好多科目要复习><

所有的源代码加报告是一晚上搞定的,凑活着看吧。。。源代码和报告分在两篇不同的博客发吧,否则比较混乱。

字典库是一个事先处理过的文本文件(原始文本是从网上下载的),都是“英文 中文释义”的格式,9000多条,我就不贴出来了。

下面是源代码:

Main.cpp

/***Author: lwfcgz*Student ID: it is secret, haha~~*Date: 2012-12-27*Environment: Microsoft Visual Studio 2008**/#include<iostream>#include<string>#include<vector>#include "DataBase.h"#include "WordNode.h"#include "MyFrame.h"using namespace std;//主函数int main(){//生成一个界面对象MyFrame frame;//初始化界面并将控制转移到该对象内部frame.initialize();return 0;}

WordNode.h

#ifndef WORDNODE_H#define WORDNODE_H#include<iostream>#include<string>#include<vector>using namespace std;class WordNode{public://默认空构造函数WordNode();//给出英文单词和中文解释的构造函数WordNode(string english, string chinese);//获取英文内容string getEnglish();//获取中文内容string getChinese();//重新设置英文内容void setEnglish(string english);//重新设置中文内容void setChinese(string chinese);private://英文单词string english;//对应的中文语义string chinese;};#endif


WordNode.cpp

#include<iostream>#include<string>#include<vector>#include "WordNode.h"using namespace std;//默认空构造函数WordNode::WordNode(){}//给出英文单词和中文解释的构造函数WordNode::WordNode(string english, string chinese){this->english=english;this->chinese=chinese;}//获取英文内容string WordNode::getEnglish(){return this->english;}//获取中文内容string WordNode::getChinese(){return this->chinese;}//重新设置英文内容void WordNode::setEnglish(string english){this->english=english;}//重新设置中文内容void WordNode::setChinese(string chinese){this->chinese=chinese;}


DataBase.h

#ifndef DATABASE_H#define DATABASE_H#include<iostream>#include<string>#include<vector>#include<algorithm>#include "WordNode.h"using namespace std;//存放与单词相关的数据class DataBase{public://默认构造函数DataBase();//返回单词的总数目int getDicSize();//判断字典是否为空bool isEmpty();//返回下标为i的单词,i不合法则返回空WordNode getWordNode(int i);//修改第i个WordNode节点,失败则返回值为负数int setWordNode(int i,WordNode newWordNode);//添加一个新单词int addWordNode(WordNode wordNode);//删除第i个WordNode节点,失败则返回值为负数int deleteWordNode(int i);//根据单词二分查找相应的条目,查找失败返回负数int binarySearch(string word);//重新对单词按字典序进行排序void sortWords();private://存放单词,向量内的元素为WordNode类对象vector<WordNode> words;WordNode wordNode;};#endif

DataBase.cpp

#include<iostream>#include<string>#include<vector>#include<algorithm>#include<fstream>#include "DataBase.h"#include "WordNode.h"#include "myless.cpp"using namespace std;//默认构造函数DataBase::DataBase(){string english;string chinese;//打开词典文件ifstream file("dic.txt");while(file>>english>>chinese){this->wordNode.setChinese(chinese);this->wordNode.setEnglish(english);//将相应节点插入数据库中(this->words).push_back(this->wordNode);}//关闭文件file.close();}//返回单词的总数目int DataBase::getDicSize(){return this->words.size();}//判断字典是否为空bool DataBase::isEmpty(){if((this->getDicSize())<=0)return true;return false;}//返回下标为i的单词,i不合法则返回空WordNode DataBase::getWordNode(int i){if(i<0 || (i>= (this->getDicSize()))){cout<<"下标不合法!"<<endl;return *(new WordNode());}return this->words[i];}//修改第i个WordNode节点,失败则返回值为负数int DataBase::setWordNode(int i,WordNode newWordNode){if((i<0) || (i>=this->getDicSize())){//cout<<"下标不合法!"<<endl;return -1;}this->words[i]=newWordNode;this->sortWords();return 1;}//添加一个新单词int DataBase::addWordNode(WordNode wordNode){this->words.push_back(wordNode);this->sortWords();return 0;}//删除第i个WordNode节点,失败则返回值为负数int DataBase::deleteWordNode(int i){if((i<0) || (i>=(int)(this->words.size()))){//cout<<"下标不合法!"<<endl;return -1;}this->words.erase((this->words.begin())+i);return 1;}//根据单词二分查找相应的条目,查找失败返回空int DataBase::binarySearch(string word){int left=0;int right=this->getDicSize()-1;//进行二分查找while(left<=right){//中间元素int middle=(left+right)/2;//找到目标if(this->words[middle].getEnglish() == word)return middle;//目标在左半部分else if(this->words[middle].getEnglish() > word)right=middle-1;//目标在右半部分else left=middle+1;}return -1;//cout<<"查找失败!"<<endl;//return *(new WordNode());}//重新对单词按字典序进行排序void DataBase::sortWords(){sort(this->words.begin(), this->words.end(), myless());return;}


MyFrame.h

#ifndef MYFRAME_H#define MYFRAME_H#include<iostream>#include<string>#include<vector>#include<iomanip>#include "DataBase.h"#include "WordNode.h"using namespace std;//与前台显示有关的功能在该类中声明并实现class MyFrame{public://空构造函数MyFrame();//初始化整个界面void initialize();//添加新单词void addWord();//删除已有的单词void deleteWord();//修改现有的单词void modifyWord();//浏览词典void browseDic();//退出系统void exitSystem();//模拟考试void exam();//背单词练习void exercise();//控制格式,输出一些空行void printBlankLines(int n);private://相关的内容数据库DataBase dataBase;};#endif


MyFrame.cpp

#include<iostream>#include<string>#include<vector>#include<ctime>#include<cstring>#include<iomanip>#include "MyFrame.h"using namespace std;//空构造函数MyFrame::MyFrame(){}//初始化整个界面void MyFrame::initialize(){int order;bool valid=true;system("title 轻松背单词by lwfcgz");//循环执行while(1){system("cls");this->printBlankLines(5);cout<<"********************************轻松背单词************************************"<<endl;this->printBlankLines(5);cout<<"                                1.添加单词                                     "<<endl;cout<<"                                2.删除单词                                     "<<endl;cout<<"                                3.修改单词                                     "<<endl;cout<<"                                4.单词练习                                     "<<endl;cout<<"                                5.模拟考试                                     "<<endl;cout<<"                                6.查看词典                                     "<<endl;cout<<"                                7.退出系统                                     "<<endl;this->printBlankLines(2);//判断上次输入是否有效if(valid == true)cout<<"请输入您的选择:";else cout<<"输入无效,请重新输入:";cin>>order;//判断输入是否有效 if((order>0) && (order<8)) valid=true; //无效则需要重新输入 else{ valid=false; system("cls"); continue; }//根据用户输入选择不同功能if(order == 1)this->addWord();else if(order == 2)this->deleteWord();else if(order == 3)this->modifyWord();else if(order == 4)this->exercise();else if(order == 5)this->exam();else if(order == 6)this->browseDic();else if(order == 7)this->exitSystem();}}//添加新单词void MyFrame::addWord(){string english;string chinese;system("cls");this->printBlankLines(3);cout<<"请输入待添加的新单词:";cin>>english;//查找该单词是否已经存在if(this->dataBase.binarySearch(english)>=0){cout<<"单词"<<english<<"已经存在!"<<endl;cout<<"添加失败"<<endl;system("pause");return;}cout<<"请输入单词的中文解释:";cin>>chinese;WordNode wordNode(english,chinese);this->dataBase.addWordNode(wordNode);cout<<"成功添加单词!"<<endl;//重新对单词进行排序//this->dataBase.sortWords();system("pause");return;}//删除已有的单词void MyFrame::deleteWord(){string english;string chinese;system("cls");this->printBlankLines(3);cout<<"请输入要删除的单词:";cin>>english;//查找相应的单词是否存在int number=this->dataBase.binarySearch(english);//单词不存在if(number<0){cout<<"单词"<<english<<"不存在!"<<endl;cout<<"删除失败!"<<endl;system("pause");return;}//查找到了相应单词else{this->dataBase.deleteWordNode(number);cout<<"成功删除单词!"<<endl;system("pause");return;}return;}//修改现有的单词void MyFrame::modifyWord(){string english;string chinese;system("cls");this->printBlankLines(3);cout<<"请输入要修改的单词:";cin>>english;//二分查找相应的单词int number=this->dataBase.binarySearch(english);//未找到输入的单词if(number<0){cout<<"单词"<<english<<"不存在!"<<endl;cout<<"修改单词失败!"<<endl;system("pause");return;}//找到单词else{cout<<"请输入新的解释:";cin>>chinese;WordNode wordNode(english,chinese);//修改相应的单词this->dataBase.setWordNode(number,wordNode);cout<<"成功修改单词!"<<endl;system("pause");return;}return;}//浏览词典void MyFrame::browseDic(){int order;system("cls");this->printBlankLines(5);//输出提示信息cout<<"********************************请选择查看方式*********************************"<<endl;this->printBlankLines(5);cout<<"                                1.单个查询                                     "<<endl;cout<<"                                2.多个浏览                                     "<<endl;cout<<"                                3.浏览全部(单屏无法容纳)                     "<<endl;this->printBlankLines(3);cout<<"请选择浏览方式:";cin>>order;//检查输入的有效性if(!(order>=1 && order<=3)){cout<<"输入无效!"<<endl;system("pause");return;}//分不同输入提供不同功能if(order == 1){system("cls");cout<<"请输入要查询的单词:";string english;int number;cin>>english;//未找到相应单词number=this->dataBase.binarySearch(english);if(number < 0){cout<<"找不到单词"<<english<<endl;system("pause");return;}//找到了相应的单词else{cout<<endl;cout<<"释义:"<<this->dataBase.getWordNode(number).getChinese()<<endl;system("pause");return;}}//浏览部分单词else if(order == 2){int begin;int length;cout<<"请输入要查看单词的起始位置:";cin>>begin;cout<<"请输入要查看的单词个数:";cin>>length;if((begin<0) || (length<=0) || (begin+length)>this->dataBase.getDicSize()){cout<<"输入无效!无法满足查看要求!"<<endl;system("pause");return;}system("cls");for(int i=0;i<length;i++){cout<<this->dataBase.getWordNode(begin+i).getEnglish()<<"   "<<this->dataBase.getWordNode(begin+i).getChinese()<<endl;}system("pause");return;}//浏览全部单词else if(order == 3){int length=this->dataBase.getDicSize();for(int i=0;i<length;i++){cout<<this->dataBase.getWordNode(i).getEnglish()<<"   "<<this->dataBase.getWordNode(i).getChinese()<<endl;}system("pause");return;}return;}//退出系统void MyFrame::exitSystem(){exit(0);}//模拟考试void MyFrame::exam(){system("cls");this->printBlankLines(3);cout<<"********************************考试说明************************************"<<endl;this->printBlankLines(3);cout<<"  本考试共有20题,全部为选择题,每题5分。选择你认为正确的答案并输入,回车确认之后即可进入下一题"<<endl;cout<<"                                Good Luck!                                  "<<endl;this->printBlankLines(10);system("pause");//system("cls");//存放单词所对应的编号int number[20];//记录得分int score;srand(unsigned(time(0)));//随机选取20个单词for(int i=0;i<20;i++){int tmp=rand()%(this->dataBase.getDicSize());bool repeat=false;//检查随机生成的单词是否重复for(int j=0;j<i;j++){if(number[j] == tmp)repeat=true;}if(repeat == true)i--;elsenumber[i]=tmp;}score=0;//开始考试for(int i=0;i<20;i++){system("cls");this->printBlankLines(1);int meaning[4];//随机生成错误答案for(int j=0;j<4;j++){int tmp=rand()%(this->dataBase.getDicSize());bool repeat=false;//检查是否有重复的情况for(int k=0;k<j;k++){if(meaning[k] == tmp)repeat=true;}if((repeat == true) || (tmp == number[i]))j--;else meaning[j]=tmp;}//生成正确答案int ans=rand()%4;meaning[ans]=number[i];cout<<"第"<<(i+1)<<"题:"<<endl<<endl;cout<<"单词"<<this->dataBase.getWordNode(number[i]).getEnglish()<<"的意思与下列那个选项符合?"<<endl;this->printBlankLines(2);for(int j=0;j<4;j++){cout<<(char)(j+'A')<<"  "<<this->dataBase.getWordNode(meaning[j]).getChinese()<<endl;}this->printBlankLines(8);cout<<"请输入你的答案:";while(1){string yourAns;cin>>yourAns;//输入的答案无效if( (yourAns.size()!=1) || (yourAns!="A" && yourAns!="B" && yourAns!="C" && yourAns!="D")){cout<<"输入无效,请重新输入:";continue;}else{//答案正确if(yourAns[0] == (ans+'A'))score+=5;break;}}//结束while循环}// 结束for循环system("cls");this->printBlankLines(3);if(score < 60){cout<<"您只得了"<<score<<"分><, 尚需努力!"<<endl;}else if((score>=60) && (score<85)){cout<<"您得了"<<score<<"分, 及格颇有余,优秀尚不足,加油!"<<endl;}else if((score>=85) && (score<100)){cout<<"您得了"<<score<<"分, 非常优秀,加油!"<<endl;}else if(score==100){cout<<"您得了满分100! 膜拜神牛!"<<endl;}cout<<endl<<"下面是所有正确答案:"<<endl;for(int i=0;i<20;i++){cout<<i+1<<": "<<this->dataBase.getWordNode(number[i]).getEnglish()<<"   "<<this->dataBase.getWordNode(number[i]).getChinese()<<endl;}system("pause");return;}//背单词练习void MyFrame::exercise(){srand(unsigned(time(0)));while(1){char cmd[100];system("cls");this->printBlankLines(5);int number=rand()%(this->dataBase.getDicSize());cout<<"单词:   "<<this->dataBase.getWordNode(number).getEnglish()<<endl;cout<<endl;cout<<"解释:   "<<this->dataBase.getWordNode(number).getChinese()<<endl;this->printBlankLines(15);cout<<"输入quit退出练习,按回车键可查看下一个单词";cin.getline(cmd,100);//退出背单词的模式if(strcmp(cmd,"quit")==0){system("cls");return;}elsecontinue;}return;}//控制格式,输出一些空行void MyFrame::printBlankLines(int n){//输出空行for(int i=0;i<n;i++)cout<<endl;return;}


myless.cpp

#include<iostream>#include<string>#include "WordNode.h"using namespace std;//用来辅助排序class myless{public://重载运算符,为排序做准备    bool operator()(WordNode a, WordNode b) {  //按照字典序排列  return a.getEnglish() < b.getEnglish();    }};

看不懂的地方可以看一下报告,在下一篇博客。。。

如果有bug,欢迎指出。