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

目录

  • 计算机辅助教学(CAI)软件开发:教小学生学英语。
  • 1 课程目的
  • 2 课题题目
  • 3 设计要求
    • 3.1 功能:
    • 3.2 要求:
  • 4 总体设计
    • 4.1 管理员模块
    • 4.2 学生端学习模块
  • 5 详细设计
    • 5.1 管理员模块
      • 5.1.1 密码登录
      • 5.1.2 词汇的添加
      • 5.1.3 词汇修改
      • 5.1.4 词汇查找
      • 5.1.5 词汇删除
      • 5.1.6 查看词库
    • 5.2 学生端学习模块
      • 5.2.1 答题
    • 5.3 附加音乐模块
  • 6 调试分析
  • 7附录
    • **main.cpp**
    • **word.cpp**
    • **word.h**
  • Ps:[完整代码及资源包 `资源下载` 下载压缩包即可](https://download.csdn.net/download/qq_43589790/20419895)

1 课程目的

     通过本学习课程更进一步理解C++的基础知识和面向对象的思想。
训练用系统的观点和软件开发一般规范进行软件开发,并在此过程中培养严谨的科学态度和良好的工作作风。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
熟练掌握C++中类及模板在程序中的应用,并熟练了解类中函数的调用。
进一步提高上机动手能力,培养使用计算机解决实际问题的能力,为后继课程和毕业设计打下扎实的基础

2 课题题目

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

3 设计要求

3.1 功能:

屏幕上随机出现一个汉语单词,英语单词,汉语词组,英语词组或一短 句提示小学生给出相应答案,
答错了要提示要求重新输入,直到答对为止。
要统计给分,且累计,够一定分数后可进级,即从单词到词组,从 词组到短句。同样,也可降级。
起步阶段可各选 30 个,软件可扩充,即 扩大词库的容量。
(rand(),#include 结构体、文件或数组)

3.2 要求:

 1、用 C++语言实现程序设计;2、利用结构体数组实现信息的数据结构设计;3、系统的各个功能模块要求用函数的形式实现;4、界面友好(良好的人机交互),程序加必要的注释。

4 总体设计

设计分为两个主要的模块:管理员模块和学生端学习模块

4.1 管理员模块

主要负责:词汇的添加、修改、查找、删除,查看词库

4.2 学生端学习模块

主要是:答题

5 详细设计

5.1 管理员模块

5.1.1 密码登录

首次登录密码默认为空,所以直接进入管理界面。
进入管理界面后通过修改密码的来设置管理员的密码,从而进行管理员权限的操作。
为了能使密码下次登录有效就不可以写在磁盘中,需要写在文件或者数据库中,实现密码的读写。
由于时间有限,经小组讨论,本程序采用文件存储词汇。

定义一个文件存account.txt储密码
#define FILENAME3 "account.txt"//存储密码

设置完密码,保存密码到account.txt,退出程序,再次登录则需要密码验证。
定义一个密码判断函数
string Judge_Acc();//判断密码
bool Judge_Pass=false;//判读之前是否登录成功

定义一个密码判断次数的函数
int Acc_Num=3;//次数判断

锁定判断函数
bool Acc_Flag = false;//锁定判断
当密码进行3次错误后,将直接进行账号锁定,无法再次登录

5.1.2 词汇的添加

定义一个词汇添加函数
void Add_Words();//添加

在词汇添加的操作中同密码一样需要把添加的词汇,保存到文件中。
定义一个文件存储词汇
#define FILENAME1 "words.txt"//存储词汇

确定词汇的添加方式

添加的形式以及一次添加个数


在添加时增加一个重复判断,如果单词已存在,则输出"已经存在此词汇,请重新输入…"

当添加完之前要添加的个数后,显示添加完成保存到”words.txt”,并询问是否要继续添加

5.1.3 词汇修改

定义一个词汇修改函数
void Mod_Words();//修改

选择修改词汇的方式

如果想直接根据词汇单词或者词意修改,可以选择1,再选择具体的操作选择是根据单词还是词意修改

1、修改单词   //根据单词英文查询修改
2、修改词组   //根据汉语意思查询修改

如果检测到词库的没有的单词\词组,则输出查无此词汇,然后按任意键,

也可以选则2,直接打开词库,通过词汇的序号选择直接修改。
如果选择超出的序号则无法修改。再次重新选择序号,直至修改成功

5.1.4 词汇查找

定义一个词汇查找函数
void Que_Words();//查找

选择修改词汇的方式
如果检测到词库的没有的单词\词组,则输出查无此词汇,然后按任意键

5.1.5 词汇删除

定义一个词汇删除函数
void Del_Words();//删除

选择删除的方式
如果想直接根据词汇单词或者词意删除,可以选择1,再选择具体的操作选择是根据单词还是词意删除

如果检测到词库的没有的词汇,则输出查无此词汇,然后按任意键,输入y/n选择是否要重新删除

也可以选则2,直接打开词库,通过词汇的序号选择直接删除。

如果选择超出的序号则无法删除

5.1.6 查看词库

定义一个查看词库函数
void word::Show_Words()//显示
按照下表的格式显示词汇

5.2 学生端学习模块

5.2.1 答题

定义函数
void Start_Game();//开始学习
void Save_Game();//保存学习
void Ope_Game();//操作
void Menu_Game();//学习界
void Continue_Init();//获取等级
void random(int a[]);//随机函数
word **Grade_Words;//按等级存储词汇
void Init_Grade_Num();//数量
void Start_Game_Words(int a[]);//单词
void Start_Game_Mean(int a[]);//意思
int grade;//等级

创建一个保存等级的文件
#define FILENAME2 "grade.txt"//存储等级

设置答题升级过关的相关参数
#define object1 10//每一关的单词数量
#define object2 0.9//过关率 升级
#define object3 0.5//降级

开始答题
等级:1即第一关,第一关是随机单词,填写词意(每次只能填一个)
随机出题

答案提示

输入错误的答案

正确率大于90

50<=正确率<90

正确率小于50%

等级:2即第二关,第二关是随机词意,填写单词(每次只能填一个)

关卡设置
等级:3即第三关,第三关是随机单词或词意,填写单词或词意(每次只能填一个)
等级:4即第四关,第四关是随机词组,填写词意!(每次只能填一个)
等级:5即第五关,第五关是随机词组词意,填写词组!(每次只能填一个)
等级:6即第六关,第六关是随机词组或词意,填写词组或词意!(每次只能填一个)

5.3 附加音乐模块

音乐模块直接调用的第三方winmm库
//音乐的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")

在程序的一开始添加了背景BGM
随机出题的时候触发题目弹出的clock音效
当正确率低于90无法通关时发出call警告音效
当正确率高于90,通关升级时发出cheer胜利的欢呼音效

6 调试分析

  1. 在调试时由于查看词库的代码的逻辑出现了bug,导致出现了无法查看词库内容和异常死循环,词库一直刷新的问题。
    解决方案:初始化以及错误打印输出报告,查看是否成功链入文件,并是否能对其读写
f.open(FILENAME1, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}Init_Grade_Num();if (Grade_Num == 0){cout << "文件为空..." << endl;return;}

2.一开设计在词库删除时忘记设置词汇序号的减少导致,序号出现空缺的问题。
解决方案:删除词汇后,当前词汇后的单词全部在序号上减一

//全部移动
for (int i = j; i < Num; i++)
{CE_Words[i] = CE_Words[i + 1];
}
//数量减一
Num--;
  1. 由于使用的codeblocks在导入第三方winmm库时出现失败,因为是是第三方库不是codeblocks内置的库,需要手动添加。
    解决方案:手动添加方法。
Setting → Compiler settings → Linker settings → 在link libraries中add自己第三方库即可。

7附录

main.cpp

#include"word.h"
//声音的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
int main()
{system("color  6");system("title 英语学习");//播放mciSendString("open bgBGM.mp3", NULL, 0, 0);mciSendString("play bgBGM.mp3", NULL, 0, 0);srand(time(NULL));word CE;while (1){CE.Acc_Game();}return 0;
}

word.cpp

#include"word.h"
//局部颜色变化
void color(unsigned short color_index)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_index);
}
//初始化总单词
word::word()
{Init_Word();
}word::~word() {}//构造函数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)){//分三行   一行为单词  一行为词意  一行为判断//   if (!(f >> a[k++]))//   break;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");//n_flag = false;break;}}if (j != Num + i) {i--;}else{cout << "输入你想添加的第" << i + 1 << "个词汇的词意" << endl;//   cin.get();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 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;word *rd;cout << "输入修改后的词汇单词:" << endl;cin.get();getline(cin, w);w += '.';cout << "输入修改后的词汇词意:" << endl;//cin.get();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(n_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;//cin.get();getline(cin, w);w += '.';cout << "输入修改后的词汇词意:" << endl;//cin.get();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 (n_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");//system("cls");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");//  system("cls");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){Set_Show();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::Set_Show()//设置界面
{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";
}//第一次继续初始化
void word::Continue_Init()
{fstream f;f.open(FILENAME2, ios::in | ios::out);if (!f.is_open()){cout << "文件打开失败..." << endl;return;}
//  judge = true;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;//string转intint 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()//显示
{color(1);cout << "\t等级:" << grade << endl;switch (grade) {case 1:cout << "\t随机单词,填写词意(每次只能填一个)!" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 2:cout << "\t随机词意,填写单词(每次只能填一个)" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 3:cout << "\t随机单词或词意,填写单词或词意(每次只能填一个)" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 4:cout <<"\t随机词组,填写词意!(每次只能填一个)" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 5:cout << "\t随机词组词意,填写词组!(每次只能填一个)" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 6:cout << "\t随机词组或词意,填写词组或词意!(每次只能填一个)" << endl;cout << "\t正确率达到90%或以上晋级....." << endl << endl;break;case 7:cout << "\t所有词汇随机出现" << endl;cout << "\t进行分数记录(一次答对得一分,否则减一分)" << endl << endl;break;}color(6);
}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++){//背景音乐mciSendString("open clock.mp3", NULL, 0, 0);mciSendString("play clock.mp3", NULL, 0, 0);bool hint = true;//判断是否需要提示color(6);Show_Game();cout << "\n\n\t\t需要提示输入1(提示后视为回答错误)!" << endl;cout << "\t\t单词:" << Grade_Words[a[i]]->Word  << endl << "\t\t词意:";color(7);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;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;color(4);cout << "\n\n\t\t错误!请重新输入....\n" << endl;_getch();system("cls");}}else{flag = 0;i--;_getch();system("cls");}//关掉音乐mciSendString("close clock.mp3", NULL, 0, 0);}if (float(corret / object1) > object2) {mciSendString("open cheer.mp3", NULL, 0, 0);mciSendString("play cheer.mp3", NULL, 0, 0);grade++;color(1);float choose = (corret / object1) * 100;cout << "\n\n\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();//system("cls");mciSendString("close cheer.mp3", NULL, 0, 0);}else{mciSendString("open call.mp3", NULL, 0, 0);mciSendString("play call.mp3", NULL, 0, 0);color(3);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";//system("pause>nu");_getch();}mciSendString("close call.mp3", NULL, 0, 0);}
}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++){mciSendString("open clock.mp3", NULL, 0, 0);mciSendString("play clock.mp3", NULL, 0, 0);color(6);bool hint = true;Show_Game();cout << "\n\n\t\t需要提示输入1(提示后视为回答错误)!" << endl;cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl<<"\t\t单词:";color(7);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;color(2);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;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;color(4);cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}}else{i--;flag = 0;_getch();system("cls");}mciSendString("close clock.mp3", NULL, 0, 0);}if (float(corret / object1) > object2) {mciSendString("open cheer.mp3", NULL, 0, 0);mciSendString("play cheer.mp3", NULL, 0, 0);grade++;color(1);float choose = (corret / object1) * 100;cout << "\n\n\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();mciSendString("close cheer.mp3", NULL, 0, 0);}else{color(3);float choose = (corret / object1);mciSendString("open call.mp3", NULL, 0, 0);mciSendString("play call.mp3", NULL, 0, 0);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();}mciSendString("close call.mp3", NULL, 0, 0);}
}void word::Start_Game()//开始学习
{color(6);judge = true;cout << "\t\t初始等级为:1" << endl;cout << "\t\t一级:随机单词,填写词意。" << endl;cout << "\t\t正确率达到90%或以上晋级....." << endl;cout << "\t\tNow,English Word Study .... " << endl << "\t\t";grade = 1;Grade_Words = new word*[2];string wm;cout << "\n\t\t现在是否开始答题...(输入n退出,其他继续)" << endl << "\t\t";cin.get();//getline(cin, wm);if (wm == "n") {system("cls");return;}else{system("cls");}int i;while (1){mciSendString("open bgBGM.mp3", NULL, 0, 0);mciSendString("play bgBGM.mp3", NULL, 0, 0);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++){mciSendString("open clock.mp3", NULL, 0, 0);mciSendString("play clock.mp3", NULL, 0, 0);color(6);Show_Game();int j = rand() % 2;if (j == 1){cout << "\t\t单词:" << Grade_Words[a[i]]->Word << endl<<"\t\t词意:";color(7);getline(cin, wm);wm += ";";if (Grade_Words[a[i]]->Meaning.find(wm) != -1 && wm != ";;"&&wm != ";") {corret += flag;flag = 1;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;color(4);cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}else{cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl << "\t\t单词:";color(7);getline(cin, wm);wm += ".";if (Grade_Words[a[i]]->Word==wm) {corret += flag;flag = 1;color(2);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;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;color(4);cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}}mciSendString("close clock.mp3", NULL, 0, 0);}if (float(corret / object1) > object2 && grade<7) {mciSendString("open cheer.mp3", NULL, 0, 0);mciSendString("play cheer.mp3", NULL, 0, 0);grade++;color(1);float choose = (corret / object1) * 100;cout << "\t\t正确率为:" << choose << "%" << endl;cout << "\t\t等级加一..." << endl;cout << "\t\t现在等级为:" << grade << "级" << endl << "\t\t";_getch();system("cls");//关闭mciSendString("close cheer.mp3", NULL, 0, 0);}else if(grade<7){mciSendString("open call.mp3", NULL, 0, 0);mciSendString("play call.mp3", NULL, 0, 0);color(3);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();}mciSendString("open call.mp3", NULL, 0, 0);}else{color(7);cout << "\n\n\t\t恭喜通关....." << endl << "\t\t";_getch();}break;}color(6);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");}mciSendString("close bgBGM.mp3", NULL, 0, 0);}}void word::Continue_Game()//继续学习
{color(6);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++){color(6);Show_Game();int j = rand() % 2;if (j == 1){cout << "\t\t单词:" << Grade_Words[a[i]]->Word << endl << "\t\t词意:";color(7);getline(cin, wm);wm += ";";if (Grade_Words[a[i]]->Meaning.find(wm) != -1 && wm != ";;"&&wm != ";") {corret += flag;flag = 1;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");}else{flag = 0;i--;color(4);cout << "\t\t错误!请重新输入...." << endl;_getch();system("cls");}}else{cout << "\t\t词意:" << Grade_Words[a[i]]->Meaning << endl << "\t\t单词:";color(7);getline(cin, wm);wm += ".";if (Grade_Words[a[i]]->Word == wm) {corret += flag;flag = 1;color(2);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;color(2);cout << "\t\t正确!" << endl;_getch();system("cls");break;}}if (st == Grade_Num) {flag = 0;i--;color(4);cout << "\t\t错误!请重新输入...." << endl << "\t\t";_getch();system("cls");}}}}if (float(corret / object1) > object2 && grade<7) {grade++;color(1);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");color(6);}else if (grade<7){color(3);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");color(6);}else{color(7);cout << "\n\n\t\t恭喜通关....." << endl << "\t\t";//system("pause");_getch();color(6);}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()//操作
{Menu_Game();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;}
}void word::Menu_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";
}void word::Acc_Game()
{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";Acc_Init();int t;int flag = 0;cin >> t;if (t == 0) {cout << "\n\n\t\t谢谢使用" << endl << "\t\t";_getch();exit(0);}else if (t == 2) {cout << "\n\n\t\t进入学习" << endl << "\t\t";_getch();system("cls");Ope_Game();}elseif (t == 1){while (1){if (!Acc_Flag){if (!Judge_Pass){cout << "\t\t请输入密码:" << endl;if (Judge_Acc() != Password) {Acc_Num--;if (Acc_Num == 0) {Acc_Flag = true;}cout << "\n\n\t\t密码或账号错误,是否重新输入(y/n)...." << endl << "\t\t";char ch;cin >> ch;if (ch == 'n') {system("cls");return;}}else{cout << "\n\n\t\t登录成功!" << endl << "\t\t";Judge_Pass = true;_getch();}}else{system("cls");int t;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";cin >> t;switch (t){case 1:system("cls");Ope_Words();break;case 2:system("cls");Mod_Acc();break;case 3:system("cls");return;break;case 0:system("cls");cout << "\n\n\t\t谢谢使用" << endl << "\t\t";_getch();exit(0);return;}}}else{cout << "\n\n\t\t三次输入错误,进行账号锁定,无法再次登录...." << endl<<"\t\t";_getch();system("cls");return;}}}elseif (t == 3) {system("cls");Exp_Game();_getch();system("cls");}
}void word::Acc_Save()//保存
{fstream f;f.open(FILENAME3, ios::out);if (!f) {cout << "保存失败,文件不存在!" << endl;return;}f << Password;f.close();
}void word::Acc_Init()//初始化
{fstream f;f.open(FILENAME3, ios::in);if (!f) {cout << "初始化,文件不存在!" << endl;return;}f >> Password;f.close();
}void word::Mod_Acc()//修改密码
{cout << "\n\n\t\t输入新密码:" << endl << "\t\t";string str;cin >> str;Password = str;Acc_Save();cout << "\n\n\t\t修改成功!" << endl << "\t\t";_getch();system("cls");
}string word::Judge_Acc()
{char buf[1024];int index = 0;string str;cout << "\t\t";while (1){char ch;ch = getch();if (ch == 8) {if (index > 0){index--;cout << char(8) << " " << char(8);}}else if (ch == '\r'){buf[index] = '\0';cout << endl;break;}else{cout << "*";buf[index++] = ch;}}for (int i = 0; i < index; i++) {str += buf[i];}return str;
}void word::Exp_Game()//使用说明
{cout << "\t\t      欢迎进入使用说明界面" << endl<<endl;cout << "\t\t         管理员操作说明        " << endl;cout << "\t\t(1)、添加词汇时,应注意输入词汇的正确。" << endl;cout << "\t\t(2)、添加单个单词时,词汇意思由中文分号隔开末尾不能有其他字符 如:老板;雇主" << endl;cout << "\t\t(3)、添加短语时,注意中间空格只能有一个末尾不能有其他字符 如: ask to do" << endl<<endl;cout << "\t\t         答题操作说明        " << endl;cout << "\t\t(1)、回答中文时只允许输入一个中文意思且末尾不允许有任何字符 如: word.       单词" << endl;cout << "\t\t(2)、回答单词时只允许输入一个单词且末尾不允许有任何字符     如: 单词;        word" << endl;cout << "\t\t(3)、回答短语时注意中间空格且末尾不允许有任何字符           如: 要求做某事; ask to do sth" << endl;
}

word.h

#pragma once
#include<iostream>
#include<fstream>
#include<string>
#include<ctime>
#include<conio.h>
#include<Windows.h>
#define FILENAME1 "words.txt"//存储词汇
#define FILENAME2 "grade.txt"//存储等级
#define FILENAME3 "account.txt"//存储密码#define object1 5//每一关的单词数量
#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 Set_Show();//设置界面void Save_Words();//保存void Show_Words();//显示public://学习操作void Start_Game();//开始学习void Continue_Game();//继续学习void Save_Game();//保存学习void Ope_Game();//操作void Menu_Game();//学习界面void Continue_Init();//获取等级void random(int a[]);//随机函数word **Grade_Words;//按等级存储词汇void Init_Grade_Num();//数量int Grade_Num;//等级词汇数量void Init_Game(int);//初始化void Show_Game();//显示void Start_Game_Words(int a[]);//单词void Start_Game_Mean(int a[]);//意思int grade;//等级bool judge = false;//判断是否是开始之后的继续学习public://登录void Acc_Game();//登录界面void Acc_Save();//保存void Acc_Init();//初始化string Password;//密码void Mod_Acc();//修改密码string Judge_Acc();//判断密码bool Acc_Flag = false;//锁定判断int Acc_Num=3;//次数判断bool Judge_Pass=false;//判读之前是否登录成功void Exp_Game();//使用说明};

Ps:完整代码及资源包 资源下载 下载压缩包即可

免费下载地址:https://download.csdn.net/download/qq_43589790/20419895

计算机辅助教学(CAI)软件开发:教小学生学英语相关推荐

  1. 自动语音识别技术(ASR)在聋哑儿童计算机辅助教学中的开发与应用

    自动语音识别技术(ASR)在聋哑儿童计算机辅助教学中的开发与应用 RDTE OF CAI FOR THE DEAF&DUMB CHILDREN BASED ON ASR   一.        ...

  2. 如何用c语言教小学生学英语,家长怎么教小学生学英语

    很多家长都没有注意到从小学英语的重要性,从而小时候忽视对孩子的教育,当孩子的年龄逐渐变大时,学习英语就会越来越困难,所以想学好英语就要从娃娃抓起,接下来小编就为大家讲讲如何从小培养孩子学好英语.以下是 ...

  3. 软件开发教父与国内高手论道实录全文

    新浪科技讯 2005年6月2日,来自信息产业部.北京市科委.中国软件行业协会的领导,北大.北邮软件学院的院长们齐聚一堂,和世界五大软件开发教父之一的matin(马丁-福勒)先生一起,就目前西方软件开发 ...

  4. 计算机辅助教学系统论文,计算机应用论文计算机辅助教学系统的开发与应用

    <计算机应用论文计算机辅助教学系统的开发与应用>由会员分享,可在线阅读,更多相关<计算机应用论文计算机辅助教学系统的开发与应用(2页珍藏版)>请在人人文库网上搜索. 1.计算机 ...

  5. “软件开发教父” Martin Fowler 从业 40 年最想说这两个字!

    作者 | 异步社区 本文经授权转载自异步社区(ID:epubit) Martin Fowler,世界级软件开发大师,敏捷开发的开拓者和创始人全球知名的面向对象分析设计.UML.模式等专业领域的领头羊, ...

  6. 如何运用计算机辅助英语教学,浅谈计算机辅助教学(CAI)在英语教学中的应用

    浅谈 计算机辅助教学 )在英语教学 中的应用 口江西省南昌市二十一中 万娟 "电脑和英语 "被喻 为打开 世纪大 容 ,既弥补 了教师单 一描述 的缺陷又增 强了 中,教师是 关键 ...

  7. 教小学生学英语系统(一次课设项目)

    md每次都烦csdn下资源,本着开源知识共享原则,本文全部代码.文件已上传GitHub,点此获取 设计要求: 屏幕上随机出现一个汉语单词,英语单词,汉语词组,英语词组或一短句提示小学生给出相应答案,答 ...

  8. 计算机助学教学软件cai是,小学语文教学设计 [用教学设计理论指导CAI软件设计]...

    摘要:计算机辅助教学活动的开展关键在于教学软件,教学软件的质量和实用价值直接影响到教学效果.本文在对当前CAI软件中存在的一些问题进行分析的基础上,指出问题的根源在于没有注重前期分析,并从教学设计的前 ...

  9. 有关计算机辅助教学方面的问题,浅析高校计算机辅助教学应用的有关问题

    摘 要 21世纪是全面进入信息化社会的世纪.作为最基本的信息工具,计算机在教学中所起的作用也越来越重要.以计算机为主体的计算机辅助教学技术迅速发展,其应用已遍及我国各个高校,并作为一项重要的教学手段, ...

最新文章

  1. 广告小程序后端开发(4.导入地区数据,修改adminx,修改models,手动添加模拟数据)...
  2. android考试编程题,30道android笔试题及答案
  3. codeforces E. Game with String 概率
  4. 设计: 未来Web设计的7大趋势
  5. 栈和队列之栈的定义和实现
  6. 最新三网免挂码支付系统源码+免授权版
  7. idea使用maven私服时下载源码
  8. 城市规划图例符号_城市规划图例符号精编版
  9. 制作删不掉的php唯读档,ppt母版logo删除不了怎么办
  10. 宏碁服务器u盘装系统,宏基u盘装系统教程图解
  11. 软件工程师为什么单身的六宗罪
  12. 深信服AC1000路由部署模式怎么配置线路负载均衡
  13. ES搜索特殊字符异常Encountered: <EOF> after
  14. win10自动更新后打开系统应用提示文件系统错误(-2147219196)
  15. Selenium(一)12.Actions的常用方法
  16. bandwagonhost.com (***)机房网速比较
  17. 困在双11“流量仓”的小红书,能否撑起200亿美元估值?
  18. 如何用python编写程序打开csv格式文件
  19. 药品市场信息查询-药品数据库(全面)
  20. 日本经验丨被忽视的老年玩具市场需求潜力巨大,独家解析产品创新三大方向

热门文章

  1. Android智能手机 各版本区别
  2. 多种虚拟机环境下安装Oracle11g RAC
  3. 中国最新一批太行发动机成功
  4. 被逼无赖从一个月薪15K的销售转行软件测试我到底是为了什么?我到底经历了什么?...
  5. 神器来了,终于能轻松打造机器学习App!
  6. Dirichlet Process
  7. matlab错位相减,在非节奏流水施工中,通常用来计算流水步距的方法是()。A.累加数列错位相减取大差值B.累加数列错...
  8. 【记录】ChatGPT使用记录
  9. 华为模拟器配置OSPF基础
  10. HBuilderX快捷键设置