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

开源学开源 2017-03-31 10:56:09
题目内容:
编写两个加密函数,第一个函数使用凯撒加密法,即将将原来的小写字母用字母表中其后面的第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[])
{
for(int i=0;s[i]!='\0';i++)
{
if(s[i]>='A'&&s[i]<='Z')
if((s[i]+3)<='Z')
s[i]=s[i]+35;
else
s[i]=s[i]+9;
else if((s[i]+3)<='z')
s[i]=s[i]-29;
else
s[i]=s[i]-55;
}
}

void oddeven(char s[])
{
char a[20];
int i,k;
for(i=0;s[i]!='\0';i++)
{
if(i%2==0)
s[i/2]=s[i];
else
a[i/2]=s[i];
}
for(k=0;k<=i/2;k++)
if(i%2==0)
s[i/2+k]=a[k];
else
s[i/2+k+1]=a[k];
s[i]='\0';

}

void cipher(void (*f)(char s[]),char s[])
{
(*f)(s);
}

int main()
{
char a[100];
int n;
cin.getline(a,99);
cin>>n;
switch(n)
{
case 1:
cipher(caesar,a);
break;
case 2:
cipher(oddeven,a);
break;
}
cout<<a<<endl;
return 0;
}
...全文
131 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
开源学开源 2017-04-01
  • 打赏
  • 举报
回复
还是要谢谢您的帮助哟!
赵4老师 2017-03-31
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
double A[300][100];
double valuex[300];
double valuey[300];
int i;
double fun00(double x,double y) {return x  +   y  ;};
double fun01(double x,double y) {return x*x+ 3*y  ;};
double fun02(double x,double y) {return x  + 2*y*x;};
//...  fun03(double x,double y) {return ...+...   ;};
//...
//...  fun98(double x,double y) {return ...+...   ;};
double fun99(double x,double y) {return x/2+20*y  ;};
double (*funNN[100])(double,double)={
    fun00,
    fun01,
    fun02,
//  fun03,
//  ...
//  fun98,
    fun99,
};
int main() {
    double x,y;
    int f,FN;

    for (i=0;i<300;i++) {
        valuex[i]=(double)i;
        valuey[i]=(double)i;
    }
    FN=3;
    for (i=0;i<300;i++) {
         x=valuex[i];
         y=valuey[i];
         for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);
    }
    for (i=0;i<3;i++) {
        for (f=0;f<FN;f++) printf("%lg ",A[i][f]);
        printf("\n");
    }
	return 0;
}
//0 0 0
//2 4 3
//4 10 10
开源学开源 2017-03-31
  • 打赏
  • 举报
回复
请求优化代码
赵4老师 2017-03-31
  • 打赏
  • 举报
回复
函数指针例子代码而已。参考不了我也没办法。
开源学开源 2017-03-31
  • 打赏
  • 举报
回复
冒昧的请问一下,我该怎么参考你的代码!我并没有发现二楼的代码能解决题目的要求,也没有发现是代码的优化哟!

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧