背单词工具(C++)

功能分析

  1. 生词本管理
    • 创建生词本文件:在构造函数中创建了"生词本.txt""背词历史.log""历史记录.txt"三个文件。
    • 添加单词:用户可以输入单词、词性和解释,将其添加到生词本中。
    • 查询所有单词:展示生词本中所有的单词、词性和翻译。
    • 精确查词:用户可以选择按照单词、词性或中文解释进行查词,并显示查询结果。
    • 删除单词:根据用户输入删除生词本中的特定单词。
  2. 背词功能
    • 背生词:从生词本中读取单词进行背诵,背诵完成后将生词从生词本中删除,并将相关信息添加到背词历史中。
  3. 历史记录查询
    • 根据时间查历史记录:用户输入年月日,查询该日期的背词历史记录,并将其保存到历史记录文件中。
    • 查询历史背词:展示历史记录文件中的内容。
  4. 其他功能
    • 更新日志:输出新增功能的说明。
    • 总的服务界面:提供菜单界面,用户根据序号选择相应的服务。

详细代码

cpp 复制代码
#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;
}
相关推荐
ephemerals__2 分钟前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞6 分钟前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货8 分钟前
Rust 的简介
开发语言·后端·rust
湫ccc15 分钟前
《Python基础》之基本数据类型
开发语言·python
Matlab精灵16 分钟前
Matlab函数中的隐马尔可夫模型
开发语言·matlab·统计学习
Microsoft Word17 分钟前
c++基础语法
开发语言·c++·算法
数据小爬虫@20 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
qq_1728055927 分钟前
RUST学习教程-安装教程
开发语言·学习·rust·安装
wjs202435 分钟前
MongoDB 更新集合名
开发语言
monkey_meng38 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust