-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathenv.cpp
110 lines (94 loc) · 2.94 KB
/
env.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "env.h"
Env::Env(const string& userName) : userName(userName) {
fsbDef = new FileStrBridge("./vocabulary/def.dat");
fsbSent = new FileStrBridge("./user/" + userName + "/sentences.dat");
fsbProg = new FileStrBridge("./user/" + userName + "/progress.dat");
string staName = "./user/" + userName + "/stats.dat";
fsbSta = new FileStrBridge(staName);
FileStrBridge* fsbVoc;
for (int i = 0;; ++i) {
string vocName = "./user/" + userName + "/" + str::intToStr(i) + ".dat";
ifstream ifs(vocName.c_str());
if (!ifs) break;
fsbVoc = new FileStrBridge(vocName);
fsbVocList.push_back(fsbVoc);
SimpleInfo* spi = new SimpleInfo(fsbVoc);
vocList.push_back(spi);
Stats* sta = new Stats(fsbSta, str::intToStr(i));
statList.push_back(sta);
}
fsbMast = new FileStrBridge("./user/" + userName + "/mastered.dat");
masteredVoc = new SimpleInfo(fsbMast);
fsbHist = new FileStrBridge("./user/" + userName + "/history.dat");
history = new SimpleInfo(fsbHist);
fsbBasic = new FileStrBridge("./user/" + userName + "/basic.dat");
basic = new Basic(fsbBasic);
}
Env::~Env() {
delete fsbDef;
delete fsbSent;
delete fsbProg;
delete masteredVoc;
delete history;
delete basic;
delete fsbMast;
delete fsbHist;
delete fsbBasic;
for (vector <SimpleInfo*>::iterator it = vocList.begin();
it != vocList.end(); ++it) {
delete (*it);
}
for (vector <Stats*>::iterator it = statList.begin();
it != statList.end(); ++it) {
delete (*it);
}
for (vector <FileStrBridge*>::iterator it = fsbVocList.begin();
it != fsbVocList.end(); ++it) {
delete (*it);
}
delete fsbSta;
}
string Env::getUserName() {
return userName;
}
void Env::setUserName(const string& newUserName) {
userName = newUserName;
}
void Env::pass(const string& word, int diffi, bool ok) {
statList[diffi]->setTotal(statList[diffi]->getTotal() + 1);
Progress prog(fsbProg, word);
prog.setTimestamp(basic->getTimestamp());
if (ok) {
statList[diffi]->setKnown(statList[diffi]->getKnown() + 1);
prog.setFamilarity(prog.getFamilarity() + 1);
if (prog.getFamilarity() == NEED_TIME) {
vocList[diffi]->del(word);
masteredVoc->add(word);
prog.suicide();
}
}
calcLevel();
basic->setTimestamp(basic->getTimestamp() + 1);
}
void Env::calcLevel() {
// TODO: calc more accurately
for (int i = DIFFI_NUM - 1; i >= 0; --i) {
double ratio;
if (statList[i]->getTotal() == 0) {
ratio = 0.5;
}
else {
ratio = (double)statList[i]->getKnown() / statList[i]->getTotal();
}
if (ratio > 0.9) {
basic->setLevel((i + 1) * (LEVEL_MAX / DIFFI_NUM)
+ (LEVEL_MAX / DIFFI_NUM) * ratio * 0.8);
if (basic->getLevel() > LEVEL_MAX) {
basic->setLevel(LEVEL_MAX);
}
return;
}
}
double ratio = (double)statList[0]->getKnown() / statList[0]->getTotal();
basic->setLevel((LEVEL_MAX / DIFFI_NUM) * ratio);
}