计算机辅助教学(CAI)软件开发:教学生学英语

  • 一、课程设计目的
    • 1.1 前言
    • 1.2 需求分析
  • 二、课程设计题目描述和要求
    • 2.1 概要设计
    • 2.2 程序设计组成框图
    • 2.3 流程图
  • 三、课程设计报告内容
    • 3.1 详细设计
    • 3.2 源代码程序清单
    • 3.3 程序运行的操作界面
  • 四、总结
  • 五、附录及参考资料

我是一名普普通通的大四待实习生,这里是我的知识总结笔记,其中存在我自己的理解,也有部分内容来自网络,可能存在错误,请勿轻易引用,仅供参考。如果存在版权问题,实在抱歉。请后台私信我,我立马修改、删除。

一、课程设计目的

1.1 前言

计算机辅助教学(Computer Assisted Instruction)简称CAI,是将计算机作为数字媒体,为学生提供一个良好的学习环境,使学生通过与计算机的对话来进行学习的一种新型教学形式。

作为教学媒体,计算机能帮助教师改善教学效果,扩大教学范围,延伸教师的教育功能,而且,计算机具有交互性,具有快速存取和自动处理等功能,它不仅能够呈现教学信息,还能接收学生回答问题并进行判断,对学生进行指导。

总之,计算机具有许多其他教学媒体所不具备的功能。一方面是计算机设备本身具有的能力,另一方面就是计算机只是当作工具来执行教师事先编制好的具有各种功能的CAI课件。

当今时代,计算机辅助教学已经成为教育改革的重要切入点,这种教学方式给现代教育思想的实现提供更加有力的支持。计算机辅助教学这个理念正开启了教育的新篇章。

1.2 需求分析

现在中国英语学习者的数量每年都在不断增加,英语在各种场合的重要性也与日俱增,出现了很多英语学习软件。

一个基本的英语学习软件要求能够方便学习者学习,测试来考查自己当前的水平,同时还应该根据特定的需求对英语词汇进行增删改查,界面也应当足够简洁友好。

因此我尝试设计了一个简单的教小学生背英语的程序,基本可以实现词汇的增删改查,以及使用者英语水平的测试。

可以有效地将学习英语碎片化,有效地缩短学习时间,提高教学质量和教学效率,实现最优化的教学目标。

二、课程设计题目描述和要求

2.1 概要设计

题目:
计算机辅助教学(CAI)软件开发:教学生学英语。

功能:
屏幕上随机出现一个汉语单词,英语单词,汉语词组,英语词组或一短句提示学生给出相应答案,答错了要提示要求重新输入,直到答对为止。

要统计给分,且累计,够一定分数后可进级,即从单词到词组,从词组到短句。同样,也可降级。

起步阶段可各选30个,软件可扩充,即扩大词库的容量。
    
步骤:
1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;    
2、完成最低要求:能教单词,并有统计功能,一次答对的成功率为90%以上 后可晋级; 
3、进一步要求:完成词组和短语的问答,也有晋级功能。

要求:
1、用C++语言实现程序设计;

2、利用结构体数组实现信息的数据结构设计;

3、系统的各个功能模块要求用函数的形式实现;

4、界面友好(良好的人机交互),程序加必要的注释。

课程设计实验报告要求: 
1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分 。 
2、实验总结报告:流程图、主要源程序代码、测试情况及调试中问题与解决方案、小结等。

开发设计思路:
首先应当弄清楚程序所要实现的基本功能,也就是上面列出来的随机出现一个单词或词组,提示学生给出相应的答案,答错后提示要求重新作答,直到答对为止,并且要统计给分,且累计,够一定分数后可进级,即从单词到词组,从词组到短句。同样,也可降级。起步阶段可各选30个,软件可扩充,即扩大词库的容量。
    
其次要设计针对特定功能的数据结构,算法设计,模块划分。在这次设计中,单词采用了双指针word** CE_Words;//存储所有单词、短语,整个词库则运用了C++对数据文件的操作。程序的算法包括线性查找单词,srand(time(NULL));设置时间种子生成随机数取出相应单词呈现给用户。

2.2 程序设计组成框图

2.3 流程图

图2.2主要操作界面流程图

图2.3开始学习功能操作流程

图2.4继续学习功能操作流程

三、课程设计报告内容

3.1 详细设计

针对本设计的特点,可以用两个界面来实现,分别为词汇操作与英语测试,下面分别说明这两个界面介绍的具体功能:

词汇操作界面:该界面总共实现六个功能,添加词汇,修改词汇,查找词汇,删除词汇,显示词汇,以及返回上一级功能。

word类用来表示一条单词记录。对于词典中的每条单词记录,有英语单词,中文解释和词汇类型三种数据,因此可用三个私有数据成员来进行表示:

string Word;//单词
string Meaning;//词义
string Type;//1  代表单词  2 代表词组

针对词汇操作提供了下列一系列的相关功能,列表如下:

void Add_Words();//添加
void Del_Words();//删除
void Mod_Words();//修改
void Que_Words();//查找
void Ope_Words();//操作设置
void Save_Words();//保存
void Show_Words();//显示

针对学习操作提供了下列一系列的相关功能,列表如下:

void Start_Game();//开始学习
void Continue_Game();//继续学习
void Save_Game();//保存学习进度
void Ope_Game();//学习系统操作界面
void Continue_Init();//获取等级
void random(int a[]);//随机函数
void Show_Game();//显示

增、删、改功能的实现:
一般说来使用者并不经常需要对词典本身进行修改,但在个别情况下用户可能需要把自己平时碰到的词典中又没有的生词加进去,或者删去一些已经熟练掌握的单词,这种情况下增、删、改的功能就很有用处。

增加单词节点对应于词汇操作中的Add_Words()函数,是通过对文件操作实现的;

删除节点首先需要根据给出的单词进行线性查找,然后通过词汇操作中的Que_Words()函数实现,线性查找的基本原理是利用序列的有序性,逐一进行匹配,直到确定找到目标或者目标不存在。

线性查找的实现如下:

void word::Que_Words()//查找
{while (1){cout << "1、按单词查找...." << endl;cout << "2、按词意查找...." << endl;cout << "0、返回...." << endl;int number;string wm;cin >> number;if (number == 0){return;}if (number == 1){cout << "输入你想查找的单词..." << endl;cin.get();getline(cin, wm);wm += ".";int j = -1;for (int i = 0; i < Num; i++){if (CE_Words[i]->Word == wm){j = i;}}if (j == -1) {cout << "无此词汇..." << endl;system("pause");system("cls");cout << endl << endl;cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{//system("cls");}}else{cout << "单词为:" << CE_Words[j]->Word << endl;cout << "词意为:" << CE_Words[j]->Meaning << endl;system("pause");cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{system("cls");}}}elseif (number == 2){cout << "输入你想查找的单词词意..." << endl;cin.get();getline(cin, wm);wm += ";";int j = -1;int k = 0;int a[1024] = { 0 };for (int i = 0; i < Num; i++){j = CE_Words[i]->Meaning.find(wm);if (j != -1 && wm != ";;"){a[k++] = i;}}if (k == 0) {cout << "无此词汇..." << endl;system("pause");cout << endl << endl;cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{system("cls");}}else{for (int i = 0; i < k; i++){cout << "单词为:" << CE_Words[a[i]]->Word << endl;cout << "词意为:" << CE_Words[a[i]]->Meaning << endl;}system("pause");cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;}}else{cout << "输入错误 ..." << endl;system("pause");system("cls");}}

修改单词的功能只需要找到对应的节点,然后修改解释部分的内容即可,由于单词内容并没有发生变化,因此也不需要重新排序。

学习功能的实现:
学习功能是最为常见的使用方式,练习的目标在于通过浏览单词来进行记忆;本设计中学习的功能是通过随机从数据库中选择1个单词来测试,考试结束之后会给出一个简单的反馈,帮助使用者的学习。

在模拟练习的功能中,通过srand(time(NULL));设置时间种子,然后生成随机数取出相应单词呈现给用户。

void word::random(int a[])
{int k = rand() % Grade_Num;a[0] = k;for (int i = 1; i < object1; ){int flag = 0;int k = rand() % Grade_Num;//去掉重复的数for (int j = 0; j < i; j++){flag = 1;if (a[j] == k) {flag = 0;i--;break;}}if (flag) {a[i] = k;}i++;}
}

同时为了方便用户进行随时学习,即为该程序设计提供了存储功能。通过对文件的操作对学生的学习进度进行保存。

void word::Save_Game()
{fstream f;f.open(FILENAME2, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}f << grade;f.close()}

3.2 源代码程序清单

#include<iostream>
#include<fstream>
#include<string>
#include<ctime>
#include<conio.h>
#include<Windows.h>
#define FILENAME1 "words.txt"//存储词汇
#define FILENAME2 "grade.txt"//存储等级
#define object1 30//每一关的单词数量
#define object2 0.9//过关率 升级
#define object3 0.5//降级
using namespace std;
class word
{public://显示单词word(string a, string b, string c) {//单词 词意 类别Word = a;Meaning = b;Type = c;}word();word** CE_Words;//存储所有单词、短语int Num;//词汇数量(包括 单词 短语)~word();
public:void Init_Word();//初始化void Init_Num();//词汇的数量
private:string Word;//单词string Meaning;//词义string Type;//1  代表单词  2 代表词组
public://词汇设置void Add_Words();//添加void Del_Words();//删除void Mod_Words();//修改void Que_Words();//查找void Ope_Words();//操作设置void Save_Words();//保存void Show_Words();//显示
public://学习操作word** Grade_Words;//按等级存储词汇int Grade_Num;//等级词汇数量int grade;//等级bool judge = false;//判断是否是开始之后的继续学习void Start_Game();//开始学习void Continue_Game();//继续学习void Save_Game();//保存学习进度void Ope_Game();//学习系统操作界面void Continue_Init();//获取等级void random(int a[]);//随机函数void Init_Grade_Num();//数量void Init_Game(int);//初始化void Show_Game();//显示void Start_Game_Words(int a[]);//单词void Start_Game_Mean(int a[]);//意思
public:void Acc_Game();//主菜单界面void Exp_Game();//使用说明
};
//初始化总单词
word::word()
{Init_Word();
}word::~word() {}//构造函数

//主菜单界面

void word::Acc_Game()
{cout << "\t\t------------------" << endl;cout << "\t\t|  教学生学英语  |" << endl;cout << "\t\t------------------" << endl;cout << "\t\t|  1、词汇操作   |" << endl;cout << "\t\t------------------" << endl;cout << "\t\t|  2、英语学习   |" << endl;cout << "\t\t------------------" << endl;cout << "\t\t|  3、使用说明   |" << endl;cout << "\t\t------------------" << endl;cout << "\t\t|  0、退出系统   |" << endl;cout << "\t\t------------------" << endl;cout << "\n\t\t输入你的选择:" << endl << "\t\t";int t;int flag = 0;cin >> t;if (t == 0) {cout << "\n\n\t\t谢谢使用" << endl << "\t\t";_getch();exit(0);}else if (t == 1){system("cls");Ope_Words();_getch();system("cls");}else if (t == 2) {cout << "\n\n\t\t进入学习" << endl << "\t\t";_getch();system("cls");Ope_Game();_getch();system("cls");}if (t == 3) {system("cls");Exp_Game();_getch();system("cls");}
}

//使用说明

void word::Exp_Game()
{cout << "\t\t                   欢迎进入使用说明界面" << endl << endl;cout << "\t\t                  词汇操作说明        " << endl;cout << "\t\t1、添加词汇时,应注意输入词汇的正确。" << endl;cout << "\t\t2、添加单个单词时,词汇意思由中文分号隔开末尾不能有其他字符 如:老板;雇主" << endl;cout << "\t\t3、添加短语时,注意中间空格只能有一个末尾不能有其他字符     如: ask to do" << endl << endl;cout << "\t\t                  答题操作说明        " << endl;cout << "\t\t1、回答中文时只允许输入一个中文意思且末尾不允许有任何字符 如: word:单词" << endl;cout << "\t\t2、回答单词时只允许输入一个单词且末尾不允许有任何字符     如: 单词:word" << endl;cout << "\t\t3、回答短语时注意中间空格且末尾不允许有任何字符           如: 要求做某事:ask to do sth" << endl;
}

//初始化单词

void word::Init_Word()
{fstream f;f.open(FILENAME1, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}Init_Num();CE_Words = NULL;if (Num == 0){cout << "文件为空...." << endl;return;}CE_Words = new word * [Num];//开辟大小为Num的空间word* rd;string w;string m;string a;int k = 0;int flag = 0;while (getline(f, w) && getline(f, m) && getline(f, a)){//分三行   一行为单词  一行为词意  一行为判断rd = new word(w, m, a);//存入rd中CE_Words[k] = rd;//把rd中的值存入CE_Words中k++;}f.close();
}

//初始化单词数量

void word::Init_Num()//词汇的数量
{fstream f;f.open(FILENAME1, ios::in | ios::out);if (!f){cout << "文件打开失败..." << endl;return;}string w;string m;string a;int k = 0;while (getline(f, w) && getline(f, m) && getline(f, a)){k++;}Num = k;f.close();
}

//添加

void word::Add_Words()//添加
{while (1){cout << "1、添加单词" << endl;cout << "2、添加词组" << endl;cout << "0、返回" << endl;cout << "输入你的选择:" << endl;string type;cin >> type;if (type == "0"){return;}if (type == "1"){cout << "添加形式如单词:empleeyer " << endl;cout << "词意:老板;雇主 (加分号为一个意思)" << endl;}cout << "输入你想填加的数量:" << endl;int number;cin >> number;word** Add_CE_Words = new word * [Num + number];for (int i = 0; i < Num; i++){Add_CE_Words[i] = CE_Words[i];}word* rd;string w;string m;int j;for (int i = 0; i < number; i++){bool n_flag = true;cout << "输入你想添加的第" << i + 1 << "个词汇的单词" << endl;if (i == 0)cin.get();getline(cin, w);w += ".";if (w == ".") {cout << "请输入单词..." << endl;_getch();i--;n_flag = false;}if (n_flag){for (j = 0; j < Num + i; j++){if (Add_CE_Words[j]->Word == w){cout << "已经存在此词汇,请重新输入..." << endl;_getch();system("cls");break;}}if (j != Num + i) {i--;}else{cout << "输入你想添加的第" << i + 1 << "个词汇的词意" << endl;getline(cin, m);m += ";";rd = new word(w, m, type);Add_CE_Words[Num + i] = rd;cout << "添加成功!" << endl << endl;}}}//删掉开辟的空间delete[]CE_Words;//重新赋值CE_Words = Add_CE_Words;Num += number;cout << "是否继续添加....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n'){Save_Words();break;}}
}

//保存

void word::Save_Words()
{fstream f;f.open(FILENAME1, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}//存入for (int i = 0; i < Num; i++){f << CE_Words[i]->Word << endl;f << CE_Words[i]->Meaning << endl;f << CE_Words[i]->Type << endl;}f.close();
}

//删除

void word::Del_Words()//删除
{while (1){string w;string m;string type;int n_t;cout << "1、输入你想删除的具体词汇的单词(注意中间空格):" << endl;cout << "2、从词汇表中选择删除的词汇:" << endl;cout << "0、返回" << endl;cin >> n_t;if (n_t == 2) {while (1){system("cls");Show_Words();int t;cout << "输入你想选择删除的序号:" << endl;cin >> t;if (t > Num || t < 0) {cout << "选择超出范围!" << endl;cout << "请重新选择!" << endl;_getch();}else{cout << "原单词:" << CE_Words[t - 1]->Word << endl;cout << "原词意:" << CE_Words[t - 1]->Meaning << endl;cout << "原编号:" << CE_Words[t - 1]->Type << endl;//全部后移for (int i = t - 1; i < Num; i++){CE_Words[i] = CE_Words[i + 1];}//数量减一Num--;cout << "删除成功!" << endl;system("pause");cout << "是否继续删除....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n'){Save_Words();system("cls");break;}}}}else if (n_t == 1){cout << "1、删除单词" << endl;cout << "2、删除词组" << endl;cout << "输入你的选择:" << endl;cin >> type;cout << "输入你想要修改的单词:" << endl;cin.get();getline(cin, w);w += ".";int j = -1;for (int i = 0; i < Num; i++){if (CE_Words[i]->Word == w){j = i;}}if (j == -1) {cout << "无此词汇..." << endl;system("pause");cout << endl << endl;cout << "是否重新删除...(y/n)" << endl;char ch;cin >> ch;if (ch == 'n')break;elsesystem("cls");}else{//全部后移for (int i = j; i < Num; i++){CE_Words[i] = CE_Words[i + 1];}//数量减一Num--;cout << "删除成功!" << endl;system("pause");cout << "是否继续删除....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n'){Save_Words();break;}}}elseif (n_t == 0) {system("cls");return;}else{cout << "输入有误..." << endl;cout << "请重新输入..." << endl;_getch();system("cls");}}
}

//修改

void word::Mod_Words()//修改
{while (1){string w;string m;string type;int t;cout << "1、输入你想修改的具体词汇的单词(注意中间空格):" << endl;cout << "2、从词汇表中选择修改的词汇:" << endl;cout << "0、返回" << endl;cin >> t;if (t == 2) {while (1){system("cls");Show_Words();int t;cout << "输入你想选择修改的序号:" << endl;cin >> t;if (t > Num || t < 0) {cout << "选择超出范围!" << endl;cout << "请重新选择!" << endl;_getch();}else{cout << "原单词:" << CE_Words[t - 1]->Word << endl;cout << "原词意:" << CE_Words[t - 1]->Meaning << endl;cout << "原编号:" << CE_Words[t - 1]->Type << endl;word* rd;cout << "输入修改后的词汇单词:" << endl;cin.get();getline(cin, w);w += '.';cout << "输入修改后的词汇词意:" << endl;getline(cin, m);m += ';';cout << "输入修改后的词汇编号:" << endl;cin >> type;rd = new word(w, m, type);CE_Words[t - 1] = rd;cout << "修改成功!" << endl;system("pause");cout << "是否继续修改....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n'){Save_Words();//保存system("cls");break;}}}}else if (t== 1){cout << "1、修改单词" << endl;cout << "2、修改词组" << endl;cout << "输入你的选择:" << endl;cin >> type;if (type == "0"){return;}cout << "输入你想要修改的单词:" << endl;cin.get();getline(cin, w);w += ".";int j = -1;for (int i = 0; i < Num; i++){if (CE_Words[i]->Word == w){j = i;}}if (j == -1) {cout << "无此词汇..." << endl;system("pause");cout << endl << endl;cout << "是否重新修改....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n')break;elsesystem("cls");}else{cout << "原单词:" << CE_Words[j]->Word << endl;cout << "原词意:" << CE_Words[j]->Meaning << endl;cout << "原编号:" << CE_Words[j]->Type << endl;word* rd;cout << "输入修改后的词汇单词:" << endl;getline(cin, w);w += '.';cout << "输入修改后的词汇词意:" << endl;getline(cin, m);cout << "输入修改后的词汇编号:" << endl;cin >> type;m += ';';rd = new word(w, m, type);CE_Words[j] = rd;cout << "修改成功!" << endl;system("pause");cout << "是否继续修改....(y/n)" << endl;char ch;cin >> ch;if (ch == 'n'){Save_Words();break;}}}else if (t == 0) {system("cls");return;}}
}

//查找

void word::Que_Words()//查找
{while (1){cout << "1、按单词查找...." << endl;cout << "2、按词意查找...." << endl;cout << "0、返回...." << endl;int number;string wm;cin >> number;if (number == 0){return;}if (number == 1){cout << "输入你想查找的单词..." << endl;cin.get();getline(cin, wm);wm += ".";int j = -1;for (int i = 0; i < Num; i++){if (CE_Words[i]->Word == wm){j = i;}}if (j == -1) {cout << "无此词汇..." << endl;system("pause");system("cls");cout << endl << endl;cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{//system("cls");}}else{cout << "单词为:" << CE_Words[j]->Word << endl;cout << "词意为:" << CE_Words[j]->Meaning << endl;system("pause");cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{system("cls");}}}elseif (number == 2){cout << "输入你想查找的单词词意..." << endl;cin.get();getline(cin, wm);wm += ";";int j = -1;int k = 0;int a[1024] = { 0 };for (int i = 0; i < Num; i++){j = CE_Words[i]->Meaning.find(wm);if (j != -1 && wm != ";;"){a[k++] = i;}}if (k == 0) {cout << "无此词汇..." << endl;system("pause");cout << endl << endl;cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;else{system("cls");}}else{for (int i = 0; i < k; i++){cout << "单词为:" << CE_Words[a[i]]->Word << endl;cout << "词意为:" << CE_Words[a[i]]->Meaning << endl;}system("pause");cout << "是否继续查找(y/n)..." << endl;char ch;cin >> ch;if (ch == 'n')break;}}else{cout << "输入错误 ..." << endl;system("pause");system("cls");}}
}

//显示

void word::Show_Words()//显示
{for (int i = 0; i < Num; i++){cout << "序号:" << i + 1 << endl;cout << "单词:" << CE_Words[i]->Word << endl;cout << "词意:" << CE_Words[i]->Meaning << endl;cout << "编号:" << CE_Words[i]->Type << endl << endl;}
}

//词汇操作界面

void word::Ope_Words()
{while (1){cout << "\t\t------------------------" << endl;cout << "\t\t|       词汇操作      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     1、添加词汇      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     2、修改词汇      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     3、查找词汇      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     4、删除词汇      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     5、显示词汇      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     0、返回          |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t输入你的选择操作:" << endl << "\t\t";int t;cin >> t;switch (t){case 1:Add_Words();system("pause");system("cls");break;case 2:Mod_Words();system("pause");system("cls");break;case 3:Que_Words();system("pause");system("cls");break;case 4:Del_Words();system("pause");system("cls");break;case 5:Show_Words();system("pause");system("cls");break;case 0:system("cls");return;default:cout << "无此选项,请重新输入..." << endl;system("pause");system("cls");break;}}
}

//初始化等级

void word::Continue_Init()
{fstream f;f.open(FILENAME2, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}f >> grade;f.close();
}

//初始化数量

void word::Init_Grade_Num()
{fstream f;f.open(FILENAME1, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}string w;string m;string a;int k = 0;while (getline(f, w) && getline(f, m) && getline(f, a)){int s = atoi(a.c_str());switch (grade){case 1:case 2:case 3:if (s == 1)k++;break;case 4:case 5:case 6:if (s == 2)k++;break;case 7:k++;break;}}Grade_Num = k;f.close();
}

//初始化词汇

void word::Init_Game(int index)
{fstream f;f.open(FILENAME1, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}Init_Grade_Num();if (Grade_Num == 0){cout << "文件为空..." << endl;return;}delete[] Grade_Words;Grade_Words = new word * [Grade_Num];string w;string m;string a;int k = 0;while (getline(f, w) && getline(f, m) && getline(f, a)){word* rd;int s = atoi(a.c_str());if (index == s || index == 3) {rd = new word(w, m, a);Grade_Words[k] = rd;k++;}}f.close();
}

//随机词汇(函数)

void word::random(int a[])
{int k = rand() % Grade_Num;a[0] = k;for (int i = 1; i < object1; ){int flag = 0;int k = rand() % Grade_Num;//去掉重复的数for (int j = 0; j < i; j++){flag = 1;if (a[j] == k) {flag = 0;i--;break;}}if (flag) {a[i] = k;}i++;}
}

//显示

void word::Show_Game()//显示
{cout << "等级:" << grade << endl;switch (grade) {case 1:cout << "随机单词,填写词意(每次只能填一个)!" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 2:cout << "随机词意,填写单词(每次只能填一个)" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 3:cout << "随机单词或词意,填写单词或词意(每次只能填一个)" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 4:cout << "随机词组,填写词意!(每次只能填一个)" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 5:cout << "随机词组词意,填写词组!(每次只能填一个)" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 6:cout << "随机词组或词意,填写词组或词意!(每次只能填一个)" << endl;cout << "正确率达到90%或以上晋级....." << endl << endl;break;case 7:cout << "所有词汇随机出现" << endl;cout << "进行分数记录(一次答对得一分,否则减一分)" << endl << endl;break;}
}

//单词

void word::Start_Game_Words(int a[])//单词
{string wm;random(a);int i;int flag = 1;float corret = 0;for (i = 0; i < object1; i++){bool hint = true;//判断是否需要提示Show_Game();cout << "需要提示输入1(提示后视为回答错误)!" << endl;cout << "单词:" << Grade_Words[a[i]]->Word << endl << "词意:";getline(cin, wm);wm += ";";if (wm == "1;") {hint = false;cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl;}if (hint){if (Grade_Words[a[i]]->Meaning.find(wm) != -1 && wm != ";;" && wm != ";"){corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;cout << "\n\n\t\t错误!请重新输入....\n" << endl;_getch();system("cls");}}else{flag = 0;i--;_getch();system("cls");}}if (float(corret / object1) > object2) {grade++;float choose = (corret / object1) * 100;cout << "\n\n\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();}else{float choose = (corret / object1);if (choose <= object3) {cout << "\n\n\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t等级减一:" << endl;grade--;if (grade < 1) {grade = 1;}cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();}else{cout << "\n\n\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t未达到标准!(继续加油)" << endl;cout << "\t\t请再接再厉!(等级不变)" << endl << "\t\t";_getch();}}
}

//意思

void word::Start_Game_Mean(int a[])//意思
{string wm;random(a);int i;int flag = 1;float corret = 0;for (i = 0; i < object1; i++){bool hint = true;Show_Game();cout << "\n\n\t\t需要提示输入1(提示后视为回答错误)!" << endl;cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl << "\t\t单词:";getline(cin, wm);wm += ".";if (wm == "1.") {hint = false;cout << "\t\t单词:" << Grade_Words[a[i]]->Word << endl;}if (hint){if (wm == Grade_Words[a[i]]->Word) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else if (wm != Grade_Words[a[i]]->Word){int st = 0;for (; st < Grade_Num; st++) {if (wm == Grade_Words[st]->Word) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}}else{i--;flag = 0;_getch();system("cls");}}if (float(corret / object1) > object2) {grade++;float choose = (corret / object1) * 100;cout << "\n\n\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();}else{float choose = (corret / object1);if (choose <= object3) {cout << "\n\n\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t等级减一:" << endl;grade--;if (grade < 1) {grade = 1;}cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();}else{cout << "\n\n\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t未达到标准!(继续加油)" << endl;cout << "\t\t请再接再厉!(等级不变)" << endl << "\t\t";_getch();}}
}

//开始学习

void word::Start_Game()//开始学习
{judge = true;cout << "初始等级为:1" << endl;cout << "一级:随机单词,填写词意。" << endl;cout << "正确率达到90%或以上晋级....." << endl;grade = 1;Grade_Words = new word * [2];string wm; char n;cout << "现在是否开始答题...(输入n退出,其他继续)" << endl;//getline(cin, wm);cin >> n;if (n == 'n') {system("cls");return;}while (1){float corret = 0;//第一次正确的个数int flag = 1;if (grade == 1) {Init_Game(1);}elseif (grade == 4) {Init_Game(2);}elseif (grade == 7){Init_Game(3);}int a[object1];random(a);switch (grade){case 1:case 4:Start_Game_Words(a);break;case 2:case 5:Start_Game_Mean(a);break;case 3:case 6:case 7:for (int i = 0; i < object1; i++){Show_Game();int j = rand() % 2;if (j == 1){cout << "单词:" << Grade_Words[a[i]]->Word << endl << "词意:";getline(cin, wm);wm += ";";if (Grade_Words[a[i]]->Meaning.find(wm) != -1 && wm != ";;" && wm != ";") {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}else{cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl << "\t\t单词:";getline(cin, wm);wm += ".";if (Grade_Words[a[i]]->Word == wm) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else if (wm != Grade_Words[a[i]]->Word){int st = 0;for (; st < Grade_Num; st++) {if (wm == Grade_Words[st]->Word) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}}}if (float(corret / object1) > object2 && grade < 7) {grade++;float choose = (corret / object1) * 100;cout << "\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();system("cls");//关闭}else if (grade < 7){float choose = (corret / object1);if (choose <= object3) {cout << "\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t等级减一:" << endl;grade--;if (grade < 1) {grade = 1;}cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();}else{cout << "\t\t正确率为:" << choose * 100 << "%" << endl;cout << "\t\t未达到标准!(继续加油)" << endl;cout << "\t\t请再接再厉!(等级不变)" << endl << "\t\t";_getch();}}else{cout << "\n\n\t\t恭喜通关....." << endl << "\t\t";_getch();}break;}cout << "\n\n\t\t现在是否继续答题...(输入n退出,其他继续)" << endl << "\t\t";getline(cin, wm);if (wm == "n") {cout << "\t\t是否进行保存...(y/n)" << endl << "\t\t";getline(cin, wm);if (wm == "y"){Save_Game();cout << "\t\t保存成功!" << endl;_getch();}system("cls");return;}else{system("cls");}}
}

//继续学习

void word::Continue_Game()//继续学习
{if (!judge){Continue_Init();Grade_Words = new word * [2];}judge = true;string wm;cout << "\n\t\t现在等级为" << grade << "级" << endl;cout << "\n\t\t现在是否继续答题...(输入n退出,其他继续)" << endl << "\t\t";cin.get();getline(cin, wm);if (wm == "n") {system("cls");return;}else{system("cls");}int i;if (grade >= 1 && grade <= 3) {Init_Game(1);}elseif (grade >= 4 && grade <= 6) {Init_Game(2);}elseif (grade >= 7){Init_Game(3);}while (1){float corret = 0;//第一次正确的个数int flag = 1;if (grade == 1) {Init_Game(1);}elseif (grade == 4) {Init_Game(2);}elseif (grade == 7){Init_Game(3);}int a[object1];random(a);switch (grade){case 1:case 4:Start_Game_Words(a);break;case 2:case 5:Start_Game_Mean(a);break;case 3:case 6:case 7:for (i = 0; i < object1; i++){Show_Game();int j = rand() % 2;if (j == 1){cout << "\t\t单词:" << Grade_Words[a[i]]->Word << endl << "\t\t词意:";getline(cin, wm);wm += ";";if (Grade_Words[a[i]]->Meaning.find(wm) != -1 && wm != ";;" && wm != ";") {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}else{cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl << "\t\t单词:";getline(cin, wm);wm += ".";if (Grade_Words[a[i]]->Word == wm) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");}else if (wm != Grade_Words[a[i]]->Word){int st = 0;for (; st < Grade_Num; st++) {if (wm == Grade_Words[st]->Word) {corret += flag;flag = 1;cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;cout << "\t\t错误!请重新输入...." << endl << "\t\t";_getch();system("cls");}}}}if (float(corret / object1) > object2 && grade < 7) {grade++;float choose = (corret / object1) * 100;cout << "\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";//system("pause");_getch();system("cls");}else if (grade < 7){float choose = (corret / object1) * 100;cout << "\t\t正确率为:" << choose << "%" << endl;cout << "\t\t未达到标准!" << endl;cout << "\t\t请再接再厉!" << endl << "\t\t";//system("pause");_getch();system("cls");}else{cout << "\n\n\t\t恭喜通关....." << endl << "\t\t";//system("pause");_getch();}break;}cout << "\n\n\t\t现在是否继续答题...(输入n退出,其他继续)" << endl << "\t\t";getline(cin, wm);if (wm == "n") {cout << "\n\n\t\t是否进行保存...(y/n)" << endl;getline(cin, wm);if (wm == "y") {Save_Game();cout << "\t\t保存成功!" << endl;_getch();}system("cls");return;}else{system("cls");}}
}

//保存学习

void word::Save_Game()
{fstream f;f.open(FILENAME2, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}f << grade;f.close();
}

//英语学习功能

void word::Ope_Game()
{cout << "\t\t------------------------" << endl;cout << "\t\t|欢迎进入英语学习系统!|" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     1、开始练习      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     2、继续练习      |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     3、返回          |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t|     0、退出          |" << endl;cout << "\t\t------------------------" << endl;cout << "\t\t输入你的选择:" << endl << "\t\t";int t;cin >> t;switch (t){case 1:system("cls");Start_Game();break;case 2:system("cls");Continue_Game();break;case 3:system("cls");return;case 0:system("cls");cout << "\n\n\t\t欢迎下次使用..." << endl << "\t\t";system("pause");exit(0);break;}
}

//主函数

int main()
{system("title 英语学习");srand(time(NULL));word CE;while (1){CE.Acc_Game();}return 0;
}

3.3 程序运行的操作界面

初始化界面:

词汇操作界面:
英语学习界面:

四、总结

通过本次C++课程设计实践,一方面锻炼了需求分析、程序设计的能力,另一方面对于C++对文件操作的使用有了更深的了解。英语学习的软件有很多,其中不乏非常出色地软件,本设计基本实现了背单词的功能,但仍然还有很多改进的余地。比如设计成友好的图形界面、提供多种考试模式等。总体来说,收获还是比较大的,进一步体会到了C++作为一门程序设计语言在较大项目管理中的优势,清晰地组织结构非常有助于提高系统的可扩展性,也能够大大增强代码的易读性。

五、附录及参考资料

[1] 谭浩强.C++面向对象程序设计(第三版)[M].北京:清华大学出版社,2020.11
[2] 夏容,邹小花,李经亮,等.C语言程序设计教程[M].北京:人名邮电出版社,2016.2

【课程设计】基于C++的计算机辅助教学(CAI)软件开发:教学生学英语相关推荐

  1. 课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统

    课程设计-基于SSM的在线课程教学系统代码-基于java的线上课程资源共享论坛系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SSM 前端框架 ...

  2. 自控matlab设计,自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真

    自动控制原理课程设计--基于MATLAB软件的自动控制系统仿真 < 自动控制原理 >课程设计说 明 书日期: 2012.5.21-2012.6.1 自动控制原理 课程设计评阅书题目 基于 ...

  3. 计算机组成原理认识fpga,计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品.doc...

    计算机组成原理课程设计-基于EDA和FPGA技术的8位模型计算机的设计与实现_精品 目录 前言2 第一章 课程设计内容2 1.1 实验要求2 1.2 实验目的2 第二章 实验原理及方案2 2.1 实验 ...

  4. Java课程设计基于ssm的微信小程序

    Java课程设计, 基于ssm的微信小程序 后端涉及技术spring.mysql等 效果查看请扫一扫 喜欢可以点赞哟

  5. 单片机课程设计数字心率计_课程设计-基于单片机的数字人体心率计设计.doc

    课程设计-基于单片机的数字人体心率计设计 中北大学 基于单片机的心率计设计 课 程 设 计 说 明 书 2017年 6月30日 课 程 设 计 任 务 书 1.设计目的:通过本课程设计的学习,学生将复 ...

  6. dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

    DSP课程设计-基于C语言实现256点的FFT精选 XX 大学 J1111111 UNIVERSITY DSP 课 程 设 计 基于CCS 的FFT 算法的C 语言实现和验证 学院名称: 专业班级: ...

  7. 工厂供电MATLAB仿真,工厂供电课程设计---基于MATLAB的电力电子系统仿真

    工厂供电课程设计---基于MATLAB的电力电子系统仿真 课题名称基于 MATLAB 的电力电子系统仿真 ((一一)) 交流交流.直流变流器直流变流器 交流-直流变流器又称整流器.AC-DC 变流器, ...

  8. matlab音乐信号处理,数字信号处理课程设计---基于 MATLAB 的音乐信号处理和分析...

    数字信号处理课程设计---基于 MATLAB 的音乐信号处理和分析 1<数字信号处理>课程设计设计题目:基于 MATLAB 的音乐信号处理和分析一.课程设计的目的本课程设计通过对音乐信号的 ...

  9. 计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码

    计算机课程设计-基于ssm+vue的物资管理系统(前后端分离)-物资出库入库管理系统java代码 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 作者:IT跃迁谷 1.开发环境 开发语言:Ja ...

最新文章

  1. Mysql Cluster 集群 windows版本
  2. 基于深度学习的特征提取和匹配
  3. ViewPager实现翻页步骤
  4. svn 合并分支 等
  5. JavaScript框架
  6. Kafka设计解析(三):Kafka High Availability (下)--转
  7. neo4j设置节点或者边的显示,包括颜色、属性、大小
  8. windows远程桌面超出最大连接数强制登录命令
  9. nodejs中处理回调函数的异常
  10. C/C++ 进程的探索(fork函数)
  11. jQuery多选插件
  12. Linux eBPF和XDP高速处理数据包;使用EBPF编写XDP网络过滤器;高性能ACL
  13. c语言编译软件容错策略,软件容错方法之——软件冗余
  14. Star Schema完全参考手册读书笔记八
  15. c语言程序实验报告范文,C语言实验报告范文
  16. python小游戏:添加武器,查看武器,删除武器
  17. 企业网站制作多少钱、企业网站需要多少钱、建立网站需要花多少钱
  18. H5-农阳历日期互转并对应
  19. JavaWeb(狂神老师上课笔记)
  20. 用js写卡牌游戏(五)

热门文章

  1. ibm相关产品的好地方
  2. Nodejs入门(一)
  3. 美国高防服务器和香港高防服务器的区别是什么
  4. linux 拷贝xlsx_linux 查看xlsx文件
  5. mongodb配置文件常用配置项
  6. HTML常见英语单词
  7. FFMPEG录屏(13)---- WGC 捕获桌面(一) 改造官网Demo
  8. 浅析SSR(服务端渲染)和SPA(客户端渲染)
  9. 【STM32Cube HAL】SPI(十)
  10. IBM SPSS Modeler通过数据挖掘我们能从股市数据得到什么