使用函数指针切换加密方法

题目内容:

编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第3个字母的大写形式来替换,大写字母按同样规则用小写字母替换,可将字母表看成是首末衔接的。例如"AMDxyzXYZ" 加密为 “dpgABCabc”。第二个函数使用单双号加密法,即将字符串"abcde",根据单双号区分为两个字符串"ace"和"bd",再连接在一起成为密文"acebd"。

用户输入一个字符串作为明文,再输入数字1或2,输入1使用第一个函数加密并输出密文,输入2使用第二个函数加密并输出密文。要求使用函数指针来切换加密函数。

提示:三个函数的原型可设为:

void caesar(char s[]);

void oddeven(char s[]);

void cipher(void (*f)(char s[]),char s[]);//形参为指向函数的指针,对应实参可为相应格式的函数名。

输入格式:

一个字符串作为明文,再输入数字1或2,输入1使用第一个函数加密并输出密文,输入2使用第二个函数加密并输出密文。

输出格式:

加密后的密文

输入样例:

jacky

2

输出样例:

jcyak

#include <iostream>
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;
}
发布了4 篇原创文章 · 获赞 0 · 访问量 88

猜你喜欢

转载自blog.csdn.net/qiankendeNMY/article/details/105174638