阅读量:0
功能分析
- 生词本管理:
- 创建生词本文件:在构造函数中创建了“生词本.txt”“背词历史.log”“历史记录.txt”三个文件。
- 添加单词:用户可以输入单词、词性和解释,将其添加到生词本中。
- 查询所有单词:展示生词本中所有的单词、词性和翻译。
- 精确查词:用户可以选择按照单词、词性或中文解释进行查词,并显示查询结果。
- 删除单词:根据用户输入删除生词本中的特定单词。
- 背词功能:
- 背生词:从生词本中读取单词进行背诵,背诵完成后将生词从生词本中删除,并将相关信息添加到背词历史中。
- 历史记录查询:
- 根据时间查历史记录:用户输入年月日,查询该日期的背词历史记录,并将其保存到历史记录文件中。
- 查询历史背词:展示历史记录文件中的内容。
- 其他功能:
- 更新日志:输出新增功能的说明。
- 总的服务界面:提供菜单界面,用户根据序号选择相应的服务。
详细代码
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <iomanip> //输出控制头文件1 #include <time.h> #include <windows.h> using namespace std; class Recite { fstream file; fstream file1; public: Recite(); //创建生词本文件 void insert_word(); //添加单词 void query_all(); //查询所有单词 void query_by_time();//根据时间查历史记录 void query_history();//查询历史背词 void query_exact(); //精确查词 void delete_word(); //删除单词 int get_num(); //返回生词本中单词的数量 void recite_word(); //背生词 void update_log(); //更新日志 void run(); //总的服务界面 }; Recite::Recite() { file.open("生词本.txt"); file.close(); file.open("背词历史.log"); file.close(); file.open("历史记录.txt"); file.close(); } void Recite::insert_word() { clock_t startTime, endTime; file.open("生词本.txt", ios::out | ios::app); //在文件末尾处写入 if (file.is_open() == 1) { //打开成功的话 startTime = clock(); char word[20], cha[5], trans[20]; //单词 词性 解释 cout << "请输入要写入错题本的单词:"; cin >> word; cout << "请输入单词的词性:"; cin >> cha; cout << "请输入单词的解释:"; cin >> trans; file << word << " " << cha << " " << trans << endl; //1就代表没有被删除的单词 file.close(); endTime = clock(); cout << "写入成功,总共用时" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; } else { cout << "打开文件失败" << endl; system("pause"); } } void Recite::query_all() { clock_t startTime, endTime; startTime = clock(); char buffer[100]; int number = 0; //记录记录的条数 cout << " --------+----+---------" << endl; cout << "|" << setw(8) << "单词"; cout << "|" << setw(4) << "词性"; cout << "|" << setw(8) << "翻译"; cout << "|" << endl; cout << " --------+----+---------" << endl; file.open("生词本.txt", ios::in | ios::app); while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3, s4; is >> s1 >> s2 >> s3 >> s4; if (s1 != "" && s2 != "" && s3 != "") { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "总共有" << number << "条记录,总共用时" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); } void Recite::query_by_time() { file.open("背词历史.log", ios::in | ios::out | ios::app); if (file.is_open()) { string time; cout << "请输入要查询的历史记录的年月日,格式为年-月-日:"; cin >> time; string word[100], cha[100], trans[100]; int i = 0; char buffer[100]; while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string t1, t2; is >> t1 >> t2; if (t1 == time) { while (!file.eof()) { file.getline(buffer, 100); istringstream input(buffer); string s1, s2, s3; input >> s1 >> s2 >> s3; if (s1 != "" && s2 != "" && s3 != "") { word[i] = s1; cha[i] = s2; trans[i] = s3; i++; } else { if (s1 == time) continue; else break; } } } } file.close(); file.open("历史记录.txt", ios::in | ios::out | ios::trunc); for (int j = 0; j < i; j++) file << word[j] << " " << cha[j] << " " << trans[j] << endl; file.close(); query_history(); } else { cout << "文件打开失败" << endl; return; } } void Recite::query_history() { clock_t startTime, endTime; startTime = clock(); char buffer[100]; int number = 0; //记录记录的条数 cout << " --------+----+---------" << endl; cout << "|" << setw(8) << "单词"; cout << "|" << setw(4) << "词性"; cout << "|" << setw(8) << "翻译"; cout << "|" << endl; cout << " --------+----+---------" << endl; file.open("历史记录.txt", ios::in | ios::app); while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3, s4; is >> s1 >> s2 >> s3 >> s4; if (s1 != "" && s2 != "" && s3 != "") { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "总共有" << number << "条记录,总共用时" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); } void Recite::query_exact() { clock_t startTime, endTime; char buffer[100]; int i, number = 0; cout << "1.按照单词查词" << endl; cout << "2.按照词性查词" << endl; cout << "3.按照中文解释查词" << endl; cout << "请输入需要确定查词方式:"; cin >> i; startTime = clock(); string word; cout << "请输入要查的单词:"; cin >> word; cout << " --------+----+---------" << endl; cout << "|" << setw(8) << "单词"; cout << "|" << setw(4) << "词性"; cout << "|" << setw(8) << "翻译"; cout << "|" << endl; cout << " --------+----+---------" << endl; file.open("生词本.txt", ios::in); switch (i) { case 1: while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s1 == word) { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "查询成功,一共有" << number << "条记录,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); break; case 2: while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s2 == word) { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "查询成功,一共有" << number << "条记录,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); break; case 3: while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s3 == word) { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "查询成功,一共有" << number << "条记录,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); break; default: //默认用单词查询 while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s1 == word) { number++; cout << "|" << setw(8) << s1; cout << "|" << setw(4) << s2; cout << "|" << setw(8) << s3; cout << "|" << endl; cout << " --------+----+---------" << endl; } } endTime = clock(); cout << "查询成功,一共有" << number << "条记录,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; file.close(); break; } } int Recite::get_num() { file1.open("生词本.txt", ios::in); //以只读方式打开生词本 char buffer[100]; int number = 0; while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s1 != " " && s2 != " " && s3 != " ") number++; } file1.close(); return number; } void Recite::delete_word() { query_all(); //显示所有的记录 string str; clock_t startTime, endTime; cout << "请输入想要删除的单词:"; cin >> str; startTime = clock(); file.open("生词本.txt", ios::in); char buffer[100]; string str1[100], str2[100], str3[100]; int i = 0; while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s1 != str && s1 != "" && s2 != "" && s3 != "") { str1[i] = s1; str2[i] = s2; str3[i] = s3; i++; } } file.close(); file.open("生词本.txt", ios::out | ios::trunc); //以截断方式打开文件,清空所有内容 for (int j = 0; j < i; j++) { file << str1[j] << " " << str2[j] << " " << str3[j] << " " << endl; } file.close(); endTime = clock(); cout << "删除成功,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; } void Recite::recite_word() { file.open("生词本.txt", ios::in | ios::out); if (file.is_open() == 1) { clock_t startTime, endTime; //遍历后将单词拷贝至内存 string word[100], cha[100], trans[100], str; char buffer[100]; int i = 0; while (!file.eof()) { file.getline(buffer, 100); istringstream is(buffer); string s1, s2, s3; is >> s1 >> s2 >> s3; if (s1 != "" && s2 != "" && s3 != "") { word[i] = s1; cha[i] = s2; trans[i] = s3; i++; } } int number = i; cout << "本次需要复习的单词数量是:" << number << endl; system("pause"); system("cls"); int num_of_recite[100]; //记录需要背诵单词的次数,一开始都是1 for (int k = 0; k < 100; k++) num_of_recite[k] = 1; int sucessful = 0; //判断单词是否背完了,背完了就是1,没有背完就是0 if (number == 0) sucessful = 1; int num = 0; startTime = clock(); while (sucessful == 0) { for (int j = 0; j < i; j++) { if (num_of_recite[j] != 0) { cout << "中文意思:" << trans[j] << " " << cha[j] << endl; cout << "请输入单词:"; cin >> str; if (str == word[j]) { cout << "正确!"; num_of_recite[j]--; system("pause"); system("cls"); num++; if (num == number) sucessful = 1; } else { cout << "错误,正确答案是:" << word[j]; num_of_recite[j]++; system("pause"); system("cls"); } } } } endTime = clock(); cout << "恭喜你背完啦~~,用时:" << (double) (endTime - startTime) / CLOCKS_PER_SEC << " s" << endl; //背完单词后清空单词表 file.close(); file.open("生词本.txt", ios::out | ios::trunc); file.close(); //然后写入日志 file.open("背词历史.log", ios::out | ios::app); SYSTEMTIME st = {0}; GetLocalTime(&st); file << st.wYear << "-" << st.wMonth << "-" << st.wDay << " " << st.wHour << ":" << st.wMinute << ":" << st.wSecond << endl; for (int j = 0; j < i; j++) { file << word[j] << " " << cha[j] << " " << trans[j] << endl; } file.close(); } else { cout << "生词表为空,先加入生词再背诵吧" << endl; return; } } void Recite::update_log() { cout << "新增的内容:" << endl; cout << "1.新增背词功能,在背诵完生词后生词会自动从生词表删除,并且添加到背词历史中" << endl; cout << "2.新增历史生词查询功能,可以根据当天的年与日查询背诵完的生词" << endl; } void Recite::run() { cout << "------------------------------" << endl; cout << "|欢迎使用大家一起背单词 |" << endl; cout << "|1.添加生词 |" << endl; cout << "|2.显示所有生词 |" << endl; cout << "|3.精确查词 |" << endl; cout << "|4.删除生词表中的词 |" << endl; cout << "|5.背生词 |" << endl; cout << "|6.查询背诵历史 |" << endl; cout << "|7.更新日志 |" << endl; cout << "|8.退出 |" << endl; cout << "------------------------------" << endl; cout << "请输入需要服务的序号:"; int i; cin >> i; while (i != 8) { switch (i) { case 1: system("cls"); insert_word(); break; case 2: system("cls"); query_all(); break; case 3: system("cls"); query_exact(); break; case 4: system("cls"); delete_word(); break; case 5: system("cls"); recite_word(); break; case 6: system("cls"); query_by_time(); break; case 7: system("cls"); update_log(); break; case 8: break; default: cout << "对应数字的服务不存在,请重新输入" << endl; break; } system("pause"); system("cls"); cout << "------------------------------" << endl; cout << "|欢迎使用背词宝version1.1 |" << endl; cout << "|1.添加生词 |" << endl; cout << "|2.显示所有生词 |" << endl; cout << "|3.精确查词 |" << endl; cout << "|4.删除生词表中的词 |" << endl; cout << "|5.背生词 |" << endl; cout << "|6.查询背诵历史 |" << endl; cout << "|7.更新日志 |" << endl; cout << "|8.退出 |" << endl; cout << "------------------------------" << endl; cout << "请输入需要服务的序号:"; cin >> i; } } int main() { Recite r; r.run(); return 0; }