C++関数ポインタによる暗号化方法の切り替え

12217 ワード

タイトル内容:
2つの暗号化関数を作成し、最初の関数はシーザー暗号化法を使用して、元の小文字をアルファベット表の後ろの3番目のアルファベットの大文字で置き換え、大文字は同じ規則で小文字で置き換えられ、アルファベット表を最初と最後の接続と見なすことができます.例えば「AMDxyzXYZ」は「dpgABCabc」と暗号化される.2番目の関数は、文字列「abcde」を単一の2つの文字列「ace」と「bd」に区別し、暗号文「acebd」に接続する単一の2つの2つの文字列暗号化法を使用します.
ユーザは明文として文字列を入力し,数字1または2を入力し,入力1は第1の関数を用いて暗号化して暗号文を出力し,入力2は第2の関数を用いて暗号化して暗号文を出力する.関数ポインタを使用して暗号化関数を切り替える必要があります.
ヒント:3つの関数のプロトタイプは次のように設定できます.
void caesar(char s[]);
void oddeven(char s[]);
void cipher(void (*f)(char s[]),char s[]);//パラメータは関数を指すポインタであり、対応する実パラメータは対応するフォーマットの関数名であってもよい.
入力形式:
1つの文字列を明文として、数字1または2を入力し、入力1は最初の関数を使用して暗号化され、出力され、入力2は2番目の関数を使用して暗号化され、出力されます.
出力フォーマット:
暗号化された暗号文
サンプルを入力:
jacky
2
出力サンプル:
jcyak
#include 
using namespace std;

void caesar(char s[])
{/*                  3           ,
                ,         */
    for(int i=0;s[i]!='\0';i++)
    {
        if(s[i]>='a'&&s[i]<='z')
        {
            s[i]-=32;
            s[i]=(s[i]+3-'A')%26+'A';
        }
        else if(s[i]>='A'&&s[i]<='Z')
        {
           s[i]+=32;
           s[i]=(s[i]+3-'a')%26+'a';
        }
    }
    cout<<s;
}

void oddeven(char s[])
{//      
    int n=0;char x[100];
    while(s[n]!='\0')
    {
        n++;
    }
    for(int i=0,j=0,k=(1+n)/2;i<n;i++)
    {
        if(i%2==0)//     ,      
        {
            x[j]=s[i];
            j++;
        }
        else if(i%2!=0)//     ,      
        {
            x[k]=s[i];
            k++;
        }
    }
    x[n]='\0';
    cout<<x;
}

void cipher(void (*f)(char s[]),char s[])
{//          ,             
    (*f)(s);
}
int main()
{
    char a[100];
    cin.getline(a,99);
    int m;cin>>m;
    if(m==1)
          cipher(caesar,a);
    else if(m==2)
           cipher(oddeven,a);

    return 0;
}