z178608 2022-06-07 09:01 采纳率: 100%
浏览 47
已结题

求个代码,C++,qaq

实现对26个英文字母的编码和译码,设计完成以下功能:1.能够对27个字符进行编码、并存储。

2.利用编码能够实现任意英文句子的编码操作,并存储编码。3.能够将二进制的密码翻译成句子,并将译文存储。

4.能随时查看字母的编码。

5.有能力的同学尽可能使用文件去存储相关内容。

  • 写回答

3条回答 默认 最新

  • qfl_sdu 2022-06-07 09:24
    关注

    可以给26个字母对应一个密码表,用这个密码表来编码和解码。
    运行结果及代码如下:

    img

    img

    img

    img

    代码:

    #include <iostream>
    #include <cstring>
    #include <fstream>
    using namespace std;
    
    //定义编码表
    const char g_code[] = { 'U','>','<','[',']','x','K','c',
                            'q','=','/','d','y','a','V','b',
                            'W','T','h','j','|','{','}','^',
                            'P','R' };
    //对英文句子加密,buf是需要编码的字符串,dst是编码后的字符串
    void encode(char buf[], char dst[])
    {
        int i = 0;
        int index;
        while (buf[i] != '\0')
        {
            index = buf[i] - 'a';
            if (index >= 0 && index <= 25)
                dst[i] = g_code[index];
            else
                dst[i] = buf[i];
            i++;
        }
        dst[i] = 0;//结尾
    }
    
    //翻译句子,buf是需要解码的字符串,dst是阶码后的字符串
    void decode(char buf[], char dst[])
    {
        int i = 0, j;
        int index = -1;
        while (buf[i] != '\0')
        {
            for (j = 0; j < 26; j++)
            {
                if (buf[i] == g_code[j])
                    break;
            }
            if (j < 26)
                dst[i] = 'a' + j;
            else
                dst[i] = buf[i];
            i++;
        }
        dst[i] = 0; //结尾
    }
    //写文件
    void write2file(char buf[],const char* filename)
    {
        ofstream os;
        os.open(filename, ios::binary);
        os.write(buf, strlen(buf));
        os.close();
    }
    //读文件
    void readFile(char buf[], const char* filename)
    {
        ifstream is;
        is.open(filename, ios::binary);
        if (is.is_open())
        {
            is.read(buf, 1000);
            is.close();
        }
        else
            buf[0] = 0; //字符串结尾
    }
    
    int main()
    {
        int op,i;
        char filename[100] = { 0 };
        char buf[1000] = { 0 };
        char dst[1000] = { 0 };
        char zm[27]={0};
        //26个英文字母
        for (i = 0; i < 26; i++)
            zm[i] = 'a' + i;
    
        while (1)
        {
            system("cls"); //清屏
            cout << "1.对26个英文字母编码并存储" << endl;
            cout << "2.对任意英文句子进行编码并存储" << endl;
            cout << "3.将二进制的密码翻译成句子,并将译文存储" << endl;
            cout << "4.查看字母的编码" << endl;
            cout << "0.退出" << endl;
            cout << "请选择:";
            cin >> op;
            cin.get(); //吸收回车符
            switch (op)
            {
            case 0:return 0;
            case 1:
                cout << "请输入存储文件名称:";
                cin >> filename;
                encode(zm, buf);
                write2file(buf, filename);
                cout << "已将26个英文字母的编码存储到" << filename << "文件(二进制文件)" << endl;
                break;
            case 2:
                cout << "请输入一条英文句子:" << endl;
                cin.getline(buf, 1000); //读取一行
                encode(buf, dst);//编码
                cout <<"编码后的:" << dst << endl;
                cout << "请输入编码保存的文件名:";
                cin >> filename;
                write2file(dst, filename);
                cout <<"已将句子的编码存储到" << filename << "文件(二进制文件)" << endl;
                break;
            case 3:
                cout << "请输入需要译码的文件名(从文件中读取密码):";
                cin >> filename;
                readFile(buf, filename);
                decode(buf, dst); //译码
                cout << "译码后的:" << dst << endl;
                cout << "请输入需要保存译码的文件名:";
                cin >> filename;
                write2file(dst, filename); //将译码存储到文件
                break;
            case 4:
                cout << "26个字母对应的编码表为:" << endl;
                for (i = 0; i < 26; i++)
                {
                    cout << (char)zm[i] << " ";
                }
                cout << endl;
                for (i = 0; i < 26; i++)
                {
                    cout << (char)g_code[i] << " ";
                }
                cout << endl;
                break;
            }
            system("pause");
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月7日