帮我背单词

要学习焚化课了,为了帮助自己背单词特地写了个代码

目前支持的功能

  • 单词导入

  • 单词听写

  • 单词修改

  • 单词查找

  • tps:如果有人想用的话,在代码编译出的程序的文件夹内新建一个 "sjk.in" 并在里面输入 "0" 就可以了,只支持Windows

\(code\)

#include<bits/stdc++.h>
using namespace std;
#define rg register
#define gc getchar
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#include <windows.h>
inline int read(){
	rg char ch = gc();
	rg int x = 0, f = 0;
	while(!isdigit(ch)) f |= (ch == '-'), ch = gc();
	while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
	return f ? -x : x;
}
namespace tx{
	
const int N = 1005;
struct Node{
	string word, part, name;
	int value;// 默写正确次数,使用小根堆 
	inline bool operator < (const Node &rhs) const {
		return value < rhs.value;
	}
	inline void output(){ // 自带换行 
		cout << word << " " << part << " " << name << " " << value << endl;
	}
	inline void put(){
		cout << word << " " << part << " " << name << endl;
	}
	Node(){}
	Node(string word, string part, string name, int value): word(word), part(part), name(name), value(value) {}
//	1,名词,Nouns (n.) 表示人或事物的名称 box,pen,tree,apple 
//	2,代词,Pronouns (pron.)代替名词、数词、形容词We,this,them,myself 
//	3,形容词,Adjectives(adj.) 用来修饰名词,表示人或事物的特征 good,sad,high,short 
//	4,数词,Numerals(num.)表示数目或顺序 one,two,first 
//	5,动词,Verb (v.) 表示动作或状态 Jump,sing,visit 
//	6,副词,Adverbs(adv.) 修饰动、形、副等词,表示动作特征 there,widely,suddenly 
//	7,冠词,Articles (art.) 用在名词前,帮助说明名词所指的范围 a,an,the 
//	8,介词,Prepositions (prep.) 用在名词或代词前,说明它与别的词的关系 in,on,down,up 
//	9,连词,Conjunctions (conj.) 表示人或事物的名称if,because,but 
//	10,感叹词,Interjections (int.) 代替名词、数词、形容词等 oh,hello,hi,yeah 
//	vt.是及物动词,vt.后必须跟宾语:sing a song 
//	vi.是不及物动词,vi.后不直接带宾语或不带宾语:jump high
} tmp;
struct Tf{
	int st, id;
	Tf(){}
	Tf(int st, int id): st(st), id(id) {}
}to_find[1000005];
vector<Node> word[N], insert, all_word;
// priority_queue<Node, vector<Node>, greater<Node> > Rand_que; //随机抽查 
int len[N], n, m, infact_word_cnt;// n -> 天数 
int cnt; // 总id
int Time; // 听写时间 
string test, wd, pt, nm;
map<string, int> st;
inline void init(int falg = 0){
	freopen("sjk.in", "r", stdin);
	n = read();
	int vl, id;
	rep(i, 1, n){
		len[i] = read();
		rep(j, 0, len[i]){
			cin >> wd >> pt >> nm >> vl;
			tmp =  Node(wd, pt, nm, vl);
			word[i].push_back(tmp);
			all_word.push_back(tmp); 
			++cnt;
			to_find[cnt] = Tf(i, j);
			st[wd] = cnt;
		}
	}
	if(falg == 1) cout << "导入完成,总计 " << cnt << " 个单词" << endl; 
}
inline void output(){
	freopen("sjk.in", "w", stdout);
	printf("%d\n", n);
	rep(i, 1, n){
		printf("%d\n", len[i]);
		for(vector<Node>:: iterator it = word[i].begin(); it != word[i].end(); ++it)
			it -> output();
	}
}
inline void hyy(int n){
	rep(i, 0, len[n]){
		cout << "第 " << i + 1 << " 个 " << word[n][i].name << endl;
	}
	Sleep(Time);
	cout << "答案:" << endl; 
	rep(i, 0, len[n]){
		cout << "第 " << i + 1 << " 个 "; word[n][i].put();
	}
	freopen("CON", "r", stdin);
	cout << "请输入错误单词编号, 输入 0 结束" << endl;
	int now_worn_id;
	while((now_worn_id = read()) != 0){
		--now_worn_id;
		--word[n][now_worn_id].value;
	}
	rep(i, 0, len[n]){
		++word[n][i].value;
	}
}
inline void yyh(int n){
	rep(i, 0, len[n]){
		cout << "第 " << i + 1 << " 个 " << word[n][i].word << endl;
	}
	Sleep(Time);
	cout << "答案:" << endl; 
	rep(i, 0, len[n]){
		cout << "第 " << i + 1 << " 个 "; word[n][i].put();
	}
	cout << "请输入错误单词编号, 输入 0 结束" << endl;
	int now_worn_id;
	while((now_worn_id = read()) != 0){
		--now_worn_id; 
		--word[n][now_worn_id].value;
	}
	rep(i, 0, len[n]){
		++word[n][i].value;
	}
}
inline void brtx_hyy(){
	sort(all_word.begin(), all_word.end(), less<Node>());
	int to = min(19, cnt - 1);
	rep(i, 0, to){
		cout << "第 " << i + 1 << " 个 " << all_word[i].name << endl;
	}
	Sleep(Time);
	cout << "答案:" << endl; 
	rep(i, 0, to){
		cout << "第 " << i + 1 << " 个 "; all_word[i].put();
	}
	cout << "请输入错误单词编号, 输入 0 结束" << endl;
	int now_worn_id;
	while((now_worn_id = read()) != 0){
		if(now_worn_id > to + 1){
			cout << "编号错误,请从新输入" << endl;
			continue;
		}
		--now_worn_id;
		--word[to_find[st[all_word[now_worn_id].word]].st][to_find[st[all_word[now_worn_id].word]].id].value;
	}
	rep(i, 0, to){
		++word[to_find[st[all_word[i].word]].st][to_find[st[all_word[i].word]].id].value;
	}
}
inline void brtx_yyh(){
	sort(all_word.begin(), all_word.end(), less<Node>());
	int to = min(19, cnt - 1);
	rep(i, 0, to){
		cout << "第 " << i + 1 << " 个 " << all_word[i].word << endl;
	}
	Sleep(Time);
	cout << "答案:" << endl; 
	rep(i, 0, to){
		cout << "第 " << i + 1 << " 个 "; all_word[i].put();
	}
	cout << "请输入错误单词编号, 输入 0 结束" << endl;
	int now_worn_id;
	while((now_worn_id = read()) != 0){
		if(now_worn_id > to + 1){
			cout << "编号错误,请从新输入" << endl;
			continue;
		}
		--now_worn_id;
		--word[to_find[st[all_word[now_worn_id].word]].st][to_find[st[all_word[now_worn_id].word]].id].value;
	}
	rep(i, 0, to){
		++word[to_find[st[all_word[i].word]].st][to_find[st[all_word[i].word]].id].value;
	}
}
inline void start_tx(){
	cout << "请输入听写模式编号(1/2){\n    1 -> 汉译英\n    2 -> 英译汉\n}" << endl;
	int now_mode_id;
	while(true){ 
		now_mode_id = read(); 
		if(now_mode_id < 1 || now_mode_id > 2){
			cout << "格式不满足要求,请输入 \"1\" 或 \"2\"" << endl;
		}else break;
	}
	if(now_mode_id == 1){
		cout << "请输入听写内容编号 (1/2/3/4){\n    1 -> 今日单词\n    2 -> 昨日单词\n    3 -> 前日单词\n    4 -> 薄弱单词\n}" << endl;	
		while((now_mode_id = read()) < 1 || now_mode_id > 4) cout << "格式不符合要求,请从新输入" << endl;
		cout << "请输入听写时间(秒),五分钟为 300 秒" << endl;
		Time = read() * 1000;
		switch(now_mode_id){
			case 1:
				hyy(n); break;
			case 2:
				if(n > 1) hyy(n - 1);
				else cout << "并无昨日单词,已跳过" << endl; 
				break;
			case 3:
				if(n > 2) hyy(n - 2);
				else cout << "并无前日单词,已跳过" << endl; 
				break;
			case 4:
				brtx_hyy(); break;
		}
	}else if(now_mode_id == 2){
		cout << "请输入听写内容编号 (1/2/3/4){\n    1 -> 今日单词\n    2 -> 昨日单词\n    3 -> 前日单词\n    4 -> 薄弱单词\n}" << endl;	
		while((now_mode_id = read()) < 1 || now_mode_id > 4) cout << "格式不符合要求,请从新输入" << endl;
		cout << "请输入听写时间(秒),五分钟为 300 秒" << endl;
		Time = read() * 1000;
		switch(now_mode_id){
			case 1:
				if(n) yyh(n);
				else cout << "并无今日单词,已跳过" << endl;
				break;
			case 2:
				if(n > 1) yyh(n - 1);
				else cout << "并无昨日单词,已跳过" << endl;
				break;
			case 3:
				if(n > 2) yyh(n - 2);
				else cout << "并无前日单词,已跳过" << endl;
				break;
			case 4:
				brtx_yyh(); break;
		}
	}
}
//inline void start_tx(){
//	cout << "请输入听写时间(秒),五分钟为 300 秒" << endl;
//	Time = read() * 1000;
//	init(1);
//	cout << "当前为汉语听写英语" << endl;
//	cout << "今日新背单词:" << endl;
//	hyy(n);
//	if(n > 1){
//		cout << "昨日单词:" << endl;
//		hyy(n - 1);
//	}
//	if(n > 2){
//		cout << "前日单词:" << endl;
//		hyy(n - 2);
//	}
//	cout << "薄弱单词:" << endl;
//	brtx_hyy();
//
//	cout << "当前为英语听写汉语" << endl;
//	cout << "今日新背单词:" << endl;
//	yyh(n);
//	if(n > 1){
//		cout << "昨日单词:" << endl;
//		yyh(n - 1);
//	}
//	if(n > 2){
//		cout << "前日单词:" << endl;
//		yyh(n - 2);
//	}
//	cout << "薄弱单词:" << endl;
//	brtx_yyh();
//}
inline void all_out(){
	for(Node x : all_word) x.output();	
}
inline void solve(string test){
	if(test == "add"){
		cout << "输入待添加单词个数 m " << endl; 
		m = read() - 1;
		cout << "输入 " << m + 1 <<" 个单词,以 \"单词\",\"词性\",\"翻译\" 为标准" << endl; 
		rep(i, 0, m){
			cin >> wd >> pt >> nm;
			tmp = Node(wd, pt, nm, 0);
			insert.push_back(tmp); 
		}
		init();
		// cout << n << endl;
		++n; len[n] = m;
		word[n].swap(insert);
//		for(vector<Node>:: iterator it = insert.begin(); it != insert.end(); ++it){
//			word[n].push_back(*it);
//			it -> id = ++cnt;
//			all_word.push_back(*it); Not Need 
//		}
		cout << "添加完毕,三秒后结束" << endl;
	}else if(test == "change"){
		cout << "重新输入 \"待修改单词\",\"新词性\",\"新翻译\"" << endl;
		string wd, pt, nm;
		cin >> wd >> pt >> nm;
		init();
		if(!st.count(wd)){
			cout << "词库中并无此单词,未做任何修改,三秒后结束" << endl; 
			return;
		}
		word[to_find[st[wd]].st][to_find[st[wd]].id] = Node(wd, pt, nm, 0);
		cout << "修改完毕,三秒后结束" << endl;
	}else if(test == "start"){
		init(1);
		freopen("CON", "r", stdin); 
		while(true){
			start_tx();
			cout <<"输入 \"END\" 结束听写,否则输入任意内容继续听写" << endl;
			cin >> test;
			if(test == "END") break; 
		}
		cout << "听写完毕,三秒后结束" << endl;
	}else if(test == "find"){
		init(1);
		freopen("CON", "r", stdin); 
		cout << "输入单词查找,输入大写 \"END\" 结束" << endl;
		while(true){
			cin >> wd;
			if(wd == "END") break;
			if(st.count(wd)){
				word[to_find[st[wd]].st][to_find[st[wd]].id].put();
			}else{
				cout << "查无此词" << endl;	
			}
		}
		cout << "查找完毕, 三秒后结束" << endl;
		fclose(stdin);
		Sleep(3000);
		exit(0); 
	}else{
		cout << "命令无效,三秒后结束" << endl;
	}
}
signed main(){
	cout << "输入功能{\n    1 -> \"add\" 添加今日单词\n    2 -> \"change\" 修改错误单词\n    3 -> \"start\" 开始今日听写\n    4 -> \"find\" 查找已学词汇\n}" << endl;  
	cin >> test;
	solve(test);
	output();
	fclose(stdin); fclose(stdout);
	Sleep(3000); 
	return 0;
}
}
signed main(){
	return tx :: main();
}
posted @ 2020-06-06 11:27  __int256  阅读(84)  评论(0编辑  收藏  举报