题目内容:
编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第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;
}