C++ Vigenere 和 Caesar 密码在同一个程序中使用 switch case

如何解决C++ Vigenere 和 Caesar 密码在同一个程序中使用 switch case

在第一个代码中,我做了一个凯撒密码,它运行良好。但是,我不能添加 Vigenere。有一个类和一些指针,但它们在 like "###_#" | 0 Results not like "###_#" | 3 Results -switch 语句中不起作用,所以我需要帮助。

  • 加密部分是 switch case :3
  • 解密部分是 switch case :4

case

Vigenere 部分:

#include <iostream>
#include <string.h>
#include <string>

using namespace std;
char message[200],ch;
int i,key;
string k,output,messageV;

int menu(int answer);

int main()
{
int answer;
bool keepLooping = true;

while (keepLooping)
{
    cout << "Pick a Choice from the List:  \n(1)Caesar \n(2)Vigenere \n ";
    cin >> answer;

    if (answer == 1)
    {
        while(keepLooping)
         {
         cout << "Pick a Choice from the List:  \n(1)Encryption\n(2)Decryption \n ";
         cin >> answer;
            if (answer == 1)
            {
                answer = 1;
                keepLooping = false ;
            }
            else if(answer == 2)
            {
                answer = 2;
                keepLooping = false;
            }
            else
            {
                keepLooping = true;
            }
         }
    }
    else if(answer == 2) 
    {
        while(keepLooping)
         {
         cout << "Pick a Choice from the List:  \n(1)Encryption\n(2)Decryption \n ";
         cin >> answer;
            if (answer == 1)
            {
                answer = 3;
                keepLooping = false ;
            }
            else if(answer == 2)
            {
                answer = 4;
                keepLooping = false;
            }
            else
            {
                keepLooping = true;
            }
         }
    }
    else
    {
        keepLooping = true;
    }
    
}

menu(answer);
}

int menu(int answer)
{
switch (answer)
{
    case 1://Caesar Cipher Encryption
        cout << "Enter a message to encrypt: ";
        cin.ignore();
        cin.getline(message,200);
        cout << "Enter key: ";
        cin >> key;
        
        for(i = 0; message[i] != '\0'; ++i){
            ch = message[i];
            
            if(ch >= 'a' && ch <= 'z'){
                ch = ch + key;
                
                if(ch > 'z'){
                    ch = ch - 'z' + 'a' - 1;
                }
                
                message[i] = ch;
            }
            else if(ch >= 'A' && ch <= 'Z'){
                ch = ch + key;
                
                if(ch > 'Z'){
                    ch = ch - 'Z' + 'A' - 1;
                }
                
                message[i] = ch;
            }
        }
        cout << "Encrypted message: " << message;

        break;

    case 2://Caesar Cipher Decryption
        cout << "Enter a message to decrypt: ";
        cin.ignore();
        cin.getline(message,200);
        cout << "Enter key: ";
        cin >> key;
        
        for(i = 0; message[i] != '\0'; ++i){
            ch = message[i];
            
            if(ch >= 'a' && ch <= 'z'){
                ch = ch - key;
                
                if(ch < 'a'){
                    ch = ch + 'z' - 'a' + 1;
                }
                
                message[i] = ch;
            }
            else if(ch >= 'A' && ch <= 'Z'){
                ch = ch - key;
                
                if(ch > 'a'){
                    ch = ch + 'Z' - 'A' + 1;
                }
                
                message[i] = ch;
            }
        }
        cout << "Decrypted message: " << message;
        
        break;

    case 3:
        cout << "CASE 3";
        break;
    case 4:
        cout << "CASE 4";
        break;

    default:
        cout << "There is no choices." << endl;
}
return answer;
}

解决方法

我的建议是你试着在你的两个程序中找到共同的模式。例如,您必须使用加密解密的方法。可以将其抽象为两个不同的类,也许使用一个定义接口的公共基类(允许多态之类的东西):

struct Cipher
{
    virtual std::string encryption(std::string const&) = 0;
    virtual std::string decryption(std::string const&) = 0;
};

class Caesar : public Cipher
{
public:
    std::string encryption(std::string const& s) override
    {
        // TODO: Implement Caesar cipher encryption
    }

    std::string decryption(std::string const& s) override
    {
        // TODO: Implement Caesar cipher decryption
    }
};

class Vigenere : public Cipher
{
public:
    std::string encryption(std::string const& s) override
    {
        // TODO: Implement Vigenere cipher encryption
    }

    std::string decryption(std::string const& s) override
    {
        // TODO: Implement Vigenere cipher decryption
    }
};

由此我们可以创建一组函数来使用任何密码(通过指向基 Cipher 类的指针)。让我们从选择要使用的密码开始:

Cipher* select_cipher()
{
    std::cout << "Please select cipher to use:\n";
    std::cout << "1) Caesar\n";
    std::cout << "2) Vigenere\n";

    int selection;
    std::cin >> selection;

    if (selection == 1)
    {
        return new Caesar;
    }
    else if (selection == 2)
    {
        return new Vigenere;
    }
    else
    {
        return nullptr;
    }
}

现在我们有一个密码可以使用,然后选择要做什么:

int select_method()
{
    std::cout << "Do you want to encrypt or decrypt?\n";
    std::cout << "1) Encrypt\n";
    std::cout << "2) Decrypt\n";

    int method;
    std::cin >> method;

    return method;
}

现在我们真的拥有了使用任何支持的密码和方法所需的一切:

int main()
{
    Cipher* cipher = select_cipher();
    int method = select_method();

    std::string input;
    std::string result;

    // TODO: Read input string to encrypt or decrypt

    if (method == 1)
    {
        result = cipher->encryption(input);
    }
    else if (method == 2)
    {
        result = cipher->decryption(input);
    }

    std::cout << "Result = " << result << '\n';
}

请注意,这只是一个非常粗略的概述,还有很多部分缺失(例如实际的加密和解密算法)。这些留给读者作为练习。

您当然可以使用 if ... else if ... 代替 switch。但对于这些简单的情况,这并不重要,而且 if ... else if ... 是 IMO,更易于阅读。

,

我已经编码了,你也可以检查一下吗?

#include <iostream>
#include <string>
using namespace std;
class Vig {
   public:
      string k;
   Vig(string k) {
      for (int i = 0; i < k.size(); ++i) {
         if (k[i] >= 'A' && k[i] <= 'Z')
            this->k += k[i];
         else if (k[i] >= 'a' && k[i] <= 'z')
            this->k += k[i] + 'A' - 'a';
      }
   }
   string Vegencryption(string t) {
      string output;
      for (int i = 0,j = 0; i < t.length(); ++i) {
         char c = t[i];
         if (c >= 'a' && c <= 'z')
            c += 'A' - 'a';
         else if (c < 'A' || c > 'Z')
            continue;
         output += (c + k[j] - 2 * 'A') % 26 + 'A'; //added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ]
         j = (j + 1) % k.length();
      }
      return output;
   }
   string Vegdecryption(string t) {
      string output;
      for (int i = 0,j = 0; i < t.length(); ++i) {
         char c = t[i];
         if (c >= 'a' && c <= 'z')
            c += 'A' - 'a';
         else if (c < 'A' || c > 'Z')
            continue;
         output += (c - k[j] + 26) % 26 + 'A';//added 'A' to bring it in range of ASCII alphabet [ 65-90 | A-Z ]
         j = (j + 1) % k.length();
      }
      return output;
   }
   string Cesencryption(string t,int key){
      string output;
      char ch;
      for(int i = 0; t[i] != '\0'; ++i){
                ch = t[i];
                
                if(ch >= 'a' && ch <= 'z'){
                    ch = ch + key;
                    
                    if(ch > 'z'){
                        ch = ch - 'z' + 'a' - 1;
                    }
                    
                    t[i] = ch;
                }
                else if(ch >= 'A' && ch <= 'Z'){
                    ch = ch + key;
                    
                    if(ch > 'Z'){
                        ch = ch - 'Z' + 'A' - 1;
                    }
                    
                    t[i] = ch;
                }
            }
           output = t;
      return output;
   }
   string Cesdencryption(string t,int key){
      string output;
      char ch;
      for(int i = 0; t[i] != '\0'; ++i){
        ch = t[i];
                if(ch >= 'a' && ch <= 'z'){
                    ch = ch - key;
                    
                    if(ch < 'a'){
                        ch = ch + 'z' - 'a' + 1;
                    }
                    
                    t[i] = ch;
                }
                else if(ch >= 'A' && ch <= 'Z'){
                    ch = ch - key;
                    
                    if(ch > 'a'){
                        ch = ch + 'Z' - 'A' + 1;
                    }
                    
                    t[i] = ch;
                }
            }
           output = t;
      return output;
   }
};
int main() {
    char message[200];
    string key;
   int choice;

    cout << "Pick a Choice from the List:  \n(1)Caesar \n(2)Vigenere \n ";
    cin >> choice;
    if(choice == 2) //Vigenere
    {
        cout << "Pick a Choice from the List:  \n(1)Encryption\n(2)Decryption \n ";
        cin >> choice;
            if (choice == 1) 
            {
                cout << "Key: ";
                cin >> key;
                cin.ignore();
                Vig v(key);
                cout << "Enter a message to encrypt: ";
                cin.getline(message,200);
                string ori = message;
                string encrypt = v.Vegencryption(ori);
                cout << "Encrypted Message: " << encrypt << endl;

            }
            else if (choice == 2)
            {
                cout << "Key: ";
                cin >> key;
                cin.ignore();
                Vig v(key);
                cout << "Enter a message to encrypt: ";
                cin.getline(message,200);
                string ori = message;
                string decrypt = v.Vegdecryption(ori);
                cout << "Decrypted Message: " << decrypt << endl;
            }
            else
            {
                cout << "You Exit the Program.";
            }
    }
    else if (choice == 1) //Ceaser
    {
         cout << "Pick a Choice from the List:  \n(1)Encryption\n(2)Decryption \n ";
         cin >> choice;
            if (choice == 1)
            {
               int key;
               cout << "Enter a message to encrypt: ";
               cin.ignore();
               cin.getline(message,200);
               cout << "Enter key: ";
               cin >> key;
               Vig v(message);
               string ori = message;
               string decrypt = v.Cesencryption(ori,key);
               cout << "Decrypted Message: " << decrypt << endl;

            }
            else if (choice == 2)
            {
               int key;
               cout << "Enter a message to dencrypt: ";
               cin.ignore();
               cin.getline(message,200);
               cout << "Enter key: ";
               cin >> key;
               Vig v(message);
               string ori = message;
               string encryption = v.Cesdencryption(ori,key);
               cout << "Decrypted Message: " << encryption << endl;
            }
            else
            {
                cout << "You Exit the Program.";
            }
    }
    else
    {
       cout << "You Exit the Program.";
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res