C++课程设计

您所在的位置:网站首页 适合设计的英文单词 C++课程设计

C++课程设计

2024-03-03 08:43| 来源: 网络整理| 查看: 265

C++课程设计——背单词程序

设计要求 设计一背单词程序,程序以菜单方式工作,字典使用文本文件存放就可以了。使之能提供以下功能:添加新词 支持顺序测验和随机测验 记录没背过的单词 查找单词的汉语或英语意思(输入中文查对应的英语意思,输入英文查对应的汉语意思)

目录 1.课程设计目的1.1 前言1.2功能性需求分析1.3 非功能性需求分析 2.课程设计题目描述和要求2.1概要设计2.2程序设计组成框图2.3 背单词程序流程图2.4类图 3.课程设计报告内容3.1详细设计3.2执行结果3.3调试与测试 4.总结5.附录及参考资料5.1 vector容器5.2 rand()函数和srand()函数5.3 二分法查找5.4 getline()函数 6.代码WordS.hWordS.cppdata.hdata.cppMyFrame.hMyFrame.cppmyless.cppmain.cpp

1.课程设计目的 1.1 前言

背英语单词是最令人头疼的事儿,如果能选择一套适合的背单词软件,对于单词记忆会有事半功倍的效果,然而目前市场上背单词软件到处都是,我们应该选择什么软件呢,这确实是件另人头疼的事,选到好的,对我们的学习也许有很大帮助。因此,设计了一款针对性的背单词程序,用户使用时可以根据自己的水平构造适合自己的词库。该程序设计了基本的增、删、改、查功能,在查询部分细分了4大类——英译汉、汉译英、浏览没背过的生词、浏览整个词典。

值得注意的是,该程序会按照英语词典顺序对用户录入的单词和翻译进行重新排列。比如:录入时的顺序时d,c,a,e。而用户再次浏览时的顺序是a,b,c,d。此外,用户可以利用程序的顺序测验功能进一步按照词典顺序进行背单词。用户可以利用随机测验功能进行单词考试(出题是系统随机出不同的题)。

1.2功能性需求分析

背单词程序包含了许多C++知识点,C++的特色就是类的运用。首先是先定义一个类来进行对数据成员和一系列成员函数进行声明定义,然后以菜单界面的方式来进行调用成员函数进行功能的实现。我对于这个项目构造了以下功能: (1)添加单词 用户在输入英文后,还需要输入对应的翻译

(2)删除单词 用户输入想删除的英文,系统会把这个单词从文件里删除

(3)修改单词 当英文和对应的汉语不相符时,用户可以先输入该英文,再输入正确的其汉语

(4)顺序测验 用户进入该界面后,会按照词典的顺序进行记忆背诵单词,同时系统还会统计用户记忆了多少个单词

(5)随机测验 用户进入该界面后,会按照系统随机给出的5个选择题进行作答。用户需要对每道题进行选择A或B或C或D,答题完毕后,系统会给出分数和评估用户的成绩是否合格,是否优秀。

(6)查看词典 用户如果选择5,会进入二级菜单(1.英译汉 2.汉译英3.浏览全部4.查看未背过的单词)。针对英译汉,用户输入英文,系统会自动给出该英文对应的汉语意思,汉译英同理。当用户查看未背过的单词时,需要用户输入已经记住的单词个数,再输入想查看的生单词个数。

(7)退出系统 当用户输入7,就会退出背单词程序

1.3 非功能性需求分析

为用户提供更好的使用感受,对程序进行美化: (1)调用了EaxyX图形库,创建了一个窗口,同时显示它的控制台。 (2)使用了system(“color F5”);显示颜色控制函数,设置字体(前景色)和背景颜色,详细颜色设置说明如图1-1。F代表背景色黑色,5代表字体颜色。

图1-1 图1-1 详细颜色设置说明

(3)运行界面友好,易于操作,输入方式简单明了易于操作、安全可靠。 (4)对输入错误的情况进行提示。 (5)背单词针对的是英语,所以单词信息包括英文和对应的翻译 string english; string chinese;

2.课程设计题目描述和要求 2.1概要设计

1.本程序所要实现的基本功能有添加单词、查看生词、英译汉、汉译英、顺序测验、随机测验。另外设计了删除单词、修改单词、浏览全部单词便于对文件里的数据进行完善。

2.设计针对特定功能的数据结构和类: WordS类存放单词的英文和中文,整个词库则使用STL中的vector向量来存储,即将存在文件里的单词数据转存到vector容器中。 Data类中声明和实现对单词的操作——增、删、改、查、统计、判断是否合规。 MyFrame类中声明和实现在菜单中的功能。 Myless类实现辅助排序功能。 在本设计中为了保持每个类的功能清晰、简洁,在单个类内部实现的功能应当有一定的联系,非对外的接口设置为private属性;

3.程序的具体实现,涉及的算法主要包括二分法查找单词、词库排序

2.2程序设计组成框图

程序设计组成框图如图2-1所示 在这里插入图片描述 图2-1背单词程序组成框图

2.3 背单词程序流程图

背单词流程图,如图2-2所示 在这里插入图片描述 图2-2 背单词流程图

2.4类图

1.Data类图如图2-4-1所示在这里插入图片描述 图2-4-1 Data类图 2.MyFrame类图如图2-4-2所示 在这里插入图片描述 图2-4-2 MyFrame类图 3.WordS类图如图2-4-3所示 在这里插入图片描述 图2-4-3 WordS类图

4.myless类图如图2-4-4所示 在这里插入图片描述 图2-4-4 myless类图

3.课程设计报告内容 3.1详细设计

3.1.1定义一个WordS类

WordS类用来表示每一个单词的信息内容——有英语单词和对应的中文翻译两个内容,用两个私有数据成员来进行表示: private: string english; //英文单词 string chinese; //对应的中文翻译 同时为了方便其他类对单词的内容进行操作,还提供了一系列比较简单基础的公有操作: public: WordS();//默认空构造函数 WordS(string english, string chinese); //给出英文单词和中文解释的构造函数 string getEnglish();//获取英文内容 string getChinese();//获取中文内容 void setEnglish(string english); //重新设置英文内容 void setChinese(string chinese); //重新设置中文内容

3.1.2定义一个Data类

Data类是一个存放数据的类,用来储存录入的单词的信息内容,并把所有单词包含的内容放在一个vector中(Vector容器的详细解释见附录),该数据段被定义为private。 private: vector words; //存放单词,向量内的元素为WordS类对象 WordS wordNode;//vector是向量类型,可以容纳许多类型的数据,因此也被称为容器 //(可以理解为动态数组,是封装好了的类) //进行vector操作前应添加头文件#include //定义具有10个WordS元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定//vectora(10); 另外提供对外的接口,可以对单词表进行一系列操作: public: Data();//默认构造函数 int getDicSize();//返回单词的总数目 bool isEmpty();//判断字典是否为空 WordS getWordNode(int i); //返回下标为i的单词,i不合法则返回空 int setWordNode(int i, WordS newWordNode); //修改第i个WordS节点,失败则返回值为负数 int addWordNode(WordS wordNode); //添加一个新单词 int deleteWordNode(int i); //删除第i个WordS节点,失败则返回值为负数 int binarySearch(string word); //根据单词二分查找相应的条目,查找失败返回负数 int binarySearchr(string word); //根据单词二分查找相应的条目,查找失败返回负数 void sortWords(); //重新对单词按字典序进行排序

3.1.3定义一个myless类

myless类是为了方便调用sort()函数,重载()运算符,保证录入文件里的单词是按照词典顺序来排列的,参数是两个WordS类的对象。 public: bool operator()(WordS a, WordS b) {//重载运算符,为排序做准备 return a.getEnglish() 2; 返回false } 3.1.4定义一个MyFrame类 MyFrame类主要控制系统的界面,有一个Date类的实例dateBase作为私有的数据成员,用来保存所有单词的内容数据。 private: Data dataBase; //相关的内容数据库 同时MyFrame类提供了一系列公有方法来实现与背单词相关的功能。如下: public: MyFrame();//空构造函数 void initialize();//初始化整个界面 void addWord();//添加新单词 void deleteWord();//删除已有的单词 void modifyWord();//修改现有的单词 void browseDic(); //浏览词典 void exitSystem();//退出系统 void exam();//模拟考试 void exercise();//背单词练习 void konghang(int n); //控制格式,输出一些空行

3.1.4 main()函数

在main()函数里面主要调用了EaxyX库用来对程序进行美化,如下: initgraph(640,450,SHOWCONSOLE);//创建一个窗口 显示控制台 setbkcolor(BROWN);//背景颜色为棕色1 cleardevice();//清屏2 settextstyle(50,0,L"楷体");//设置文字样式,大小,字体 setbkmode(TRANSPARENT);//设置背景模式trans parent透明 settextcolor(RGB(34,633,82)); outtextxy(50, 50, L"欢迎使用背单词小程序"); MyFrame frame;//生成一个界面对象 frame.initialize();//初始化界面并将控制转移到该对象内部 getchar();//使窗口停留 closegraph();//关闭窗口

3.1.6主要功能

1.单词表的实现 在Data类的构造函数中借助ifstream实现构建单词表的功能。首先实例化一个ifstream类,然后打开文件,读入相应的单词记录同时实例化一个WordS类,最后将该对象放入vector容器中并关闭文件: ifstream file("dicA.txt");//打开文件 while (file >> english >> chinese) { this->wordNode.setChinese(chinese); this->wordNode.setEnglish(english); (this->words).push_back(this->wordNode); //words表示实例化一个WordS类,wordNode表示单词信息(英文+中文) } file.close();//关闭文件 2.增、删、改功能的实现 增加单词由Data类中的addWordNode(WordS wordNode)函数实现,首先放到容器vector中,再进行重新排序: int Data::addWordNode(WordS wordNode) { this->words.push_back(wordNode); //在 words尾部添加wordNode //vector words; // words.push_back(wordNode); this->sortWords(); return 0; } 删除节点,首先需要根据给出的单词进行二分查找,然后通过Data类中的deleteWordNode(int i)函数来实现,二分查找的基本原理是利用序列的有序性,每次将查找范围折半,直到确定找到目标或者目标不存在: //删除第i个WordNode节点,失败则返回值为负数 int Data::deleteWordNode(int i) { if ((i = (int)(this->words.size()))) { //cout 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 //cout//修改练习题目,随机选取5个单词 int tmp = rand() % (this->dataBase.getDicSize()); bool repeat = false; for (int j = 0; j int begin; int length; cout begin; cout length; if ((begin dataBase.getDicSize()) { cout public: //默认空构造函数 WordS(); //给出英文单词和中文解释的构造函数 WordS(string english, string chinese); //获取英文内容 string getEnglish(); //获取中文内容 string getChinese(); //重新设置英文内容 void setEnglish(string english); //重新设置中文内容 void setChinese(string chinese); private: //英文单词 string english; //对应的中文语义 string chinese; }; #endif WordS.cpp #include #include #include #include "WordS.h" using namespace std; //默认空构造函数 WordS::WordS() { } //给出英文单词和中文解释的构造函数 WordS::WordS(string english, string chinese) { this->english = english; this->chinese = chinese; } //获取英文内容 string WordS::getEnglish() { return this->english; } //获取中文内容 string WordS::getChinese() { return this->chinese; } //重新设置英文内容 void WordS::setEnglish(string english) { this->english = english; } //重新设置中文内容 void WordS::setChinese(string chinese) { this->chinese = chinese; } data.h #pragma once #ifndef DATABASE_H #define DATABASE_H #include #include #include #include #include "WordS.h" using namespace std; //存放与单词相关的数据 class Data { public: //默认构造函数 Data(); //返回单词的总数目 int getDicSize(); //判断字典是否为空 bool isEmpty(); //返回下标为i的单词,i不合法则返回空 WordS getWordNode(int i); //修改第i个WordS节点,失败则返回值为负数 int setWordNode(int i, WordS newWordNode); //添加一个新单词 int addWordNode(WordS wordNode); //删除第i个WordS节点,失败则返回值为负数 int deleteWordNode(int i); //根据单词二分查找相应的条目,查找失败返回负数 int binarySearch(string word); //根据单词二分查找相应的条目,查找失败返回负数 int binarySearchr(string word); //重新对单词按字典序进行排序 void sortWords(); private: //存放单词,向量内的元素为WordS类对象 //vector是向量类型,可以容纳许多类型的数据,因此也被称为容器 //(可以理解为动态数组,是封装好了的类) //进行vector操作前应添加头文件#include //定义具有10个WordS元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 //vectora(10); vector words; WordS wordNode; }; #endif data.cpp #include #include #include #include #include #include "data.h" #include "WordS.h" #include "myless.cpp" using namespace std; //默认构造函数 Data::Data() { string english; string chinese; //打开词典文件 ifstream file("dicA.txt"); while (file >> english >> chinese) { this->wordNode.setChinese(chinese); this->wordNode.setEnglish(english); (this->words).push_back(this->wordNode);//将相应节点插入数据库中 } //关闭文件 file.close(); } //返回单词的总数目 int Data::getDicSize() { return this->words.size(); } //判断字典是否为空 bool Data::isEmpty() { if ((this->getDicSize()) cout //cout if ((i = (int)(this->words.size()))) { //cout //中间元素 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 //中间元素 int middle = (left + right) / 2; //找到目标 if (this->words[middle].getChinese() == word) return middle; //目标在左半部分 else if (this->words[middle].getChinese() > word) right = middle - 1; //目标在右半部分 else left = middle + 1; } return -1; //cout //fstream file; //fstream file1; public: //空构造函数 MyFrame(); //初始化整个界面 void initialize(); //添加新单词 void addWord(); //删除已有的单词 void deleteWord(); //修改现有的单词 void modifyWord(); //浏览词典 void browseDic(); //退出系统 void exitSystem(); //模拟考试 void exam(); //背单词练习 void exercise(); //控制格式,输出一些空行 void konghang(int n); private: //相关的内容数据库 Data dataBase; }; #endif MyFrame.cpp #include #include #include #include #include #include #include #include "MyFrame.h" using namespace std; //空构造函数 MyFrame::MyFrame() { } //初始化整个界面 void MyFrame::initialize() { int order; bool valid = true; system("title 背单词小程序控制台"); //循环执行 while (1) { system("cls"); this->konghang(5);//打印空行 cout string english; string chinese; system("cls"); this->konghang(3);//空格 cout english; //查找该单词是否已经存在 if (this->dataBase.binarySearch(english) >= 0) {//dataBase 私有 头文件中 相关内容的数据库 //binarySearch二分法查找 //this指向Myframe中的私有数据 cout cout string english; string chinese; system("cls"); this->konghang(3); cout english; //二分查找相应的单词 int number = this->dataBase.binarySearch(english); //未找到输入的单词 if (number cout chinese; WordS wordNode(english, chinese); //修改相应的单词 this->dataBase.setWordNode(number, wordNode); cout cout cout system("cls"); cout chinese; //未找到相应单词 number = this->dataBase.binarySearchr(chinese); if (number cout int length = this->dataBase.getDicSize(); for (int i = 0; i int begin; int length; cout begin; cout length; if ((begin dataBase.getDicSize()) { cout exit(0); } //模拟考试 void MyFrame::exam() { system("cls"); this->konghang(3); cout if (number[j] == tmp) repeat = true; } if (repeat == true) i--; else number[i] = tmp; } score = 0; //开始考试 for (int i = 0; i int tmp = rand() % (this->dataBase.getDicSize()); bool repeat = false; //检查是否有重复的情况 for (int k = 0; k cout cout cout cout //修改练习题目 cout char cmd[100]; system("cls"); this->konghang(5); int number = this->dataBase.getDicSize(); for (int i = 0; i system("cls"); return; } else continue; } } return; } //控制格式,输出一些空行 void MyFrame::konghang(int n) { //输出空行 for (int i = 0; i //按照字典序排列 按照字母顺序 return a.getEnglish() 2; 返回false } }; main.cpp /* * *Author: lwfcgz *Student ID: it is secret, haha~~ *Date: 2012-12-27 *Environment: Microsoft Visual Studio 2008 * */ #include #include #include #include #include #include//包含图形库头文件, #include "data.h" #include "WordS.h" #include "MyFrame.h" using namespace std; //主函数 int main() { system("color F5"); initgraph(640,450,SHOWCONSOLE);//创建一个窗口 显示控制台 setbkcolor(BROWN);//背景颜色为棕色1 cleardevice();//清屏2 //参数错误,找不到对应的函数,error C2665: “settextstyle”: 4 个重载中没有一个可以转换所有参数类型 //是由于字符集导致食物,解决方案 //1.在字符串前面加上大写的L //2.用TEXT()把字符串包起来,_T(),原理同上 //3.不需要添加任何代码,进项目->属性->配置属性->常规->字符集->改为多字节字符集,推荐使用 settextstyle(50,0,L"楷体");//设置文字样式,大小,字体 setbkmode(TRANSPARENT);//设置背景模式trans parent透明 settextcolor(RGB(34,633,82)); outtextxy(50, 50, L"欢迎使用背单词小程序"); MyFrame frame;//生成一个界面对象 frame.initialize();//初始化界面并将控制转移到该对象内部 getchar();//使窗口停留 closegraph();//关闭窗口 return 0; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3