实现对26个英文字母的编码和译码,设计完成以下功能:
1.能够对27个字符进行编码、并存储;
2.利用编码能够实现任意英文句子的编码操作,并存储编码;
3.能够将二进制的密码翻译成句子,并将译文存储;
4.能随时查看字母的编码;
5.有能力的同学尽可能使用文件去存储相关内容。
基于new bing的编写:
输入字母大写才行,因为我只是针对大写的字母编码和解码
【思路】:
显示字母编码
在 show_map() 函数中,遍历字母到编码映射表 code_map,输出所有字母和空格对应的编码。
#include <iostream>
#include <fstream>
#include <string> // 使用 string 类
#include <map> // 使用 map 容器
using namespace std;
// 定义字母映射表
map<char, string> code_map; // 存放字母到编码的映射
map<string, char> decode_map; // 存放编码到字母的映射
// 将字符转换为二进制编码
string to_binary(char c) {
/**
* 使用 string 类型保存二进制字符串,返回 string 类型。
* to_binary() 函数将一个字符转换为其二进制编码。
*/
string binary;
for (int i = 7; i >= 0; --i) {
binary.push_back((c & (1 << i)) ? '1' : '0');
}
return binary;
}
// 将二进制编码转换为字符
char to_char(string binary) {
/**
* 将一个 8 位二进制字符串转换为一个字符,返回 char 类型。
* to_char() 函数将一个二进制编码转换为对应的字符。
*/
char c = 0;
for (int i = 0; i < 8; ++i) {
c |= (binary[i] - '0') << (7 - i);
}
return c;
}
// 编码字符串并保存
void encode(string str) {
/**
* 将字符串进行编码,并将编码后的结果写入 code.txt 文件中。
* encode() 函数将一个字符串编码后写入文件中。
*/
ofstream fout("code.txt"); // 打开输出文件流
for (char c : str) {
if (c == ' ') {
fout << code_map['-']; // 空格的编码为 -
} else {
fout << code_map[c]; // 将字母映射为其二进制编码
}
}
fout.close();
}
// 解码字符串并保存
void decode(string str) {
/**
* 将一段编码的字符串进行解码,并将结果写入 decode.txt 文件中。
* decode() 函数将一个编码后的字符串解码后写入文件中。
*/
ofstream fout("decode.txt"); // 打开输出文件流
string binary;
for (char c : str) {
binary += c;
if (decode_map.count(binary)) {
fout << decode_map[binary]; // 将编码映射为对应的字符
binary = "";
}
}
fout.close();
}
// 初始化字母映射表
void init_map() {
/**
* 初始化字母映射表,将英文字母和空格的编码进行预设。
* init_map() 函数初始化字母到编码和编码到字母的映射表。
*/
for (char c = 'A'; c <= 'Z'; ++c) {
code_map[c] = to_binary(c);
decode_map[to_binary(c)] = c;
}
code_map[' '] = "00000000";
decode_map["00000000"] = ' ';
}
// 显示字母编码
void show_map() {
/**
* 显示所有字母和空格的编码。
* show_map() 函数遍历字母到编码映射表,输出所有字母和空格的编码。
*/
for (auto& kv : code_map) {
cout << kv.first << " : " << kv.second << endl;
}
cout << "- : " << code_map['-'] << endl;
}
int main() {
init_map(); // 初始化字母映射表
string str;
cout << "请输入一段英文:" << endl;
getline(cin, str);
// 编码并保存
encode(str);
// 显示编码结果
ifstream fin("code.txt"); // 打开输入文件流
cout << "编码结果:" << endl;
char c;
while (fin.get(c)) { // 从文件中读取每个字符
cout << c;
}
fin.close();
cout << endl;
// 解码并保存
fin.open("code.txt");
getline(fin, str);
decode(str);
// 显示解码结果
fin.close();
fin.open("decode.txt");
cout << "解码结果:" << endl;
while (fin.get(c)) { // 从文件中读取每个字符
cout << c;
}
fin.close();
cout << endl;
// 显示字母编码
cout << "字母编码:" << endl;
show_map();
return 0;
}
首先,我们需要定义一个包含26个英文字母的字符数组,用于存储我们编写的程序要用到的字母。
char letters[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
接着,我们可以定义一个结构体,用于存储每个字母的编码。
struct code {
char letter;
string binary;
};
然后,我们可以设计一个函数,用于对26个字母进行编码。该函数将会返回一个包含所有字母编码的数组。
code* encode() {
code* codes = new code[26];
for (int i = 0; i < 26; i++) {
codes[i].letter = letters[i];
codes[i].binary = bitset<5>(i).to_string(); // 将字母的索引转换成5位二进制数
}
return codes;
}
接着,我们可以设计一个函数,用于将任意英文句子编码。该函数将会调用之前定义的encode
函数,获取所有字母的编码。然后,它将使用这些编码将每个字符转换为二进制字符串,并将所有的二进制字符串拼接成一个完整的编码字符串。
string encode_sentence(string sentence) {
code* codes = encode();
string encoded = "";
for (char& c : sentence) {
if (isalpha(c)) {
int index = tolower(c) - 'a'; // 获得字母的索引
encoded += codes[index].binary; // 将字母的二进制字符串添加到编码中
}
}
return encoded;
}
接着,我们可以设计一个函数,用于将二进制的密码翻译成句子。该函数将会调用之前定义的encode
函数,获取所有字母的编码。然后,它将从左到右扫描二进制字符串,将每个5位的二进制字符串转换为对应的字母,并将它们拼接成一个完整的句子。
string decode_sentence(string binary) {
code* codes = encode();
string decoded = "";
for (int i = 0; i < binary.length(); i += 5) {
string chunk = binary.substr(i, 5); // 获得5位二进制字符串
int index = stoi(chunk, nullptr, 2); // 将二进制字符串转换成整数
decoded += codes[index].letter; // 将字母添加到译文中
}
return decoded;
}
最后,我们可以设计一个用户交互循环,让用户可以随时进行编码、解码和查看字母的编码。循环将会不断提示用户输入指令,并根据指令执行对应的操作。
int main() {
code* codes = encode();
while (true) {
string command;
cout << "Enter a command (encode, decode, view, or quit): ";
getline(cin, command);
if (command == "encode") {
string sentence;
cout << "Enter a sentence to encode: ";
getline(cin, sentence);
string encoded = encode_sentence(sentence);
cout << "Encoded password: " << encoded << endl;
}
else if (command == "decode") {
string binary;
cout << "Enter a binary password to decode: ";
getline(cin, binary);
string decoded = decode_sentence(binary);
cout << "Decoded sentence: " << decoded << endl;
}
else if (command == "view") {
for (int i = 0; i < 26; i++) {
cout << codes[i].letter << ": " << codes[i].binary << endl;
}
}
else if (command == "quit")
{
break;
}
else {
cout << “Invalid command. Try again.” << endl;
}
}
return 0;
}
创建一个名为coding_map.txt
的文本文件,用于存储字母的编码映射表。
map存储
可参考
#include <iostream>
#include <fstream>
#include <map>
using namespace std;
map<char, string> codingMap; // 存储字母编码的映射表
void initializeCodingMap() {
// 初始化字母编码映射表
codingMap['A'] = "00001";
codingMap['B'] = "00010";
codingMap['C'] = "00011";
codingMap['D'] = "00100";
codingMap['E'] = "00101";
codingMap['F'] = "00110";
codingMap['G'] = "00111";
codingMap['H'] = "01000";
codingMap['I'] = "01001";
codingMap['J'] = "01010";
codingMap['K'] = "01011";
codingMap['L'] = "01100";
codingMap['M'] = "01101";
codingMap['N'] = "01110";
codingMap['O'] = "01111";
codingMap['P'] = "10000";
codingMap['Q'] = "10001";
codingMap['R'] = "10010";
codingMap['S'] = "10011";
codingMap['T'] = "10100";
codingMap['U'] = "10101";
codingMap['V'] = "10110";
codingMap['W'] = "10111";
codingMap['X'] = "11000";
codingMap['Y'] = "11001";
codingMap['Z'] = "11010";
}
// 对英文句子进行编码
string encodeSentence(string sentence) {
string encodedText = "";
for (char c : sentence) {
if (isalpha(c)) {
c = toupper(c);
encodedText += codingMap[c];
} else {
if (c == ' ') {
encodedText += "11111"; // 使用"11111"表示空格
}
// 其他非字母字符忽略不编码
}
}
return encodedText;
}
// 将二进制密码翻译成句子
string decodeBinary(string binary) {
string decodedSentence = "";
string currentBit;
for (int i = 0; i < binary.size(); i++) {
currentBit += binary[i];
if (currentBit == "11111") { // 遇到"11111"表示空格
decodedSentence += " ";
currentBit = "";
} else {
for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
if (it->second == currentBit) {
decodedSentence += it->first;
currentBit = "";
break;
}
}
}
}
return decodedSentence;
}
// 保存字母编码到文件
void saveCodingMapToFile() {
ofstream file("coding_map.txt");
for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
file << it->first << ":" << it->second << endl;
}
file.close();
}
// 从文件加载字母编码
void loadCodingMapFromFile() {
ifstream file("coding_map.txt");
string line;
char letter;
string code;
while (getline(file, line)) {
letter = line[0];
code = line.substr(2);
codingMap[letter] = code;
}
file.close();
}
int main() {
initializeCodingMap(); // 初始化字母编码映射表
// 以下为功能示例
string sentence = "Hello World!";
string encodedText = encodeSentence(sentence);
cout << "Encoded Text: " << encodedText << endl;
string decodedSentence = decodeBinary(encodedText);
cout << "Decoded Sentence: " << decodedSentence << endl;
// 保存字母编码到文件
saveCodingMapToFile();
// 加载字母编码
loadCodingMapFromFile();
// 查看字母的编码
for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
cout << it->first << ":" << it->second << endl;
}
return 0;
}
随着程序的持续运行,日志文件会越来越多,我们要及时地将不要的老旧日志给清理掉,将占用的磁盘给及时地释放掉。此处的清理机制是建立在日志文件自动切换到(自动切换到新的文件中)的基础上的。
我们可以遍历日志路径下的所有文件,获取这些文件的最后修改时间,与当前时间点做比较,将若干天之前的日志文件都删除掉,只保留最近若干天的日志。当然,这也要求我们出问题时要及时地去拿日志文件,时间拖久了,日志可能就被删除了。
我们可以在软件启动时开启一个新的线程,去做日志的检测和清理工作,完成后就退出线程。那对于电脑一直没关机、软件一直运行的场景呢?我们可以开启一个定时,如果持续运行了一段时间后,自动开启新的线程去做日志检测与清理工作。