C++ 轻松背单词 源代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwfcgz/article/details/8449237

本来是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--;
		else
			number[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;
		}
		else
			continue;
	}
	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,欢迎指出。

阅读更多
换一批

没有更多推荐了,返回首页