原创
题目内容:
编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第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>
#include <string.h>
using namespace std;
void caesar(char s[])
{
int i=0;
cin>>s;
while(s[i]!='\0'){
if (s[i]>='a'&&s[i]<='w') {
s[i]=s[i]-29;
}
else if (s[i]>='A'&&s[i]<='W'){
s[i]=s[i]+35;
}
if (s[i]=='x'){
s[i]='A';
}
if (s[i]=='y'){
s[i]='B';
}
if (s[i]=='z'){
s[i]='C';
}
if (s[i]=='X'){
s[i]='a';
}
if (s[i]=='Y'){
s[i]='b';
}
if (s[i]=='Z'){
s[i]='c';
}
i++;
}
cout<<s<<endl;
}
void oddeven(char s[])
{
int n;
int j=0;
int k;
char b[50];
n=strlen(s);
for(int i=0;i<n;i++){
if((i+1)%2==1){
b[j]=s[i];
j++;
}
}
k=j;
for(int i=0;i<n;i++){
if((i+1)%2==0){
b[k]=s[i];
k++;
}
}
b[k]='\0';
cout<<b<<endl;
}
void cipher(void (*f)(char s[]),char s[])
{
(*f)(s);
}
int main()
{
char a[20];
int k;
cin>>a;
cin>>k;
switch(k){
case 1:cipher(caesar,a);break;
case 2:cipher(oddeven,a);break;
}
return 0;
}