【id:126】【20分】C. 三、加密模板(期末模拟)

题目描述

加密机制包括明文、密文、密钥。用密钥对明文进行加密后就得到密文。

在古典加密机制中,偏离值是一种常见的方法,加密过程为

1、在已知数据中找出最大值

2、用最大值减去各个数值,得到相应的偏离值

3、偏离值加上密钥就得到密文

例如明文为1 2 3 4 5,密钥是10,加密过程为:

1、找出明文的最大值是5

2、用5减去明文的各个数值,得到偏离值4 3 2 1 0

3、用偏离值加上密钥,得到密文14 13 12 11 10

定义一个函数模板,名为max,参数包括数组和数组长度,返回值是数组中的最大值,要求支持整数、浮点数和字符三种类型。

用类模板定义一个加密类,包含四个属性:明文、密文、密钥、长度,前三个属性都是同一种类型,长度是整数。长度是指明文的长度。

类模板包含操作构造、加密、打印,说明如下:

1、加密是调用函数模板max得到数组最大值,按照前面的方法使用最大值和密钥进行加密,得到密文

2、打印是输出密文

要求类模板支持整数、浮点数和字符三种类型。

参考代码给出了加密类界面(只支持整数类型)、主函数(支持三种数据类型),程序要求

1、根据要求编写函数模板max

2、使用类模板方法改造加密类界面,不能增加任何属性和操作,必须在类外实现构造函数和加密方法

3、主函数不能有任何修改

上述所有类属性都不是public,用面向对象思想和C++语言实现上述要求

----参考代码----

//只支持整数类型的加密类界面class Cryption
{private:
	int ptxt[100]; //明文
	int ctxt[100]; //密文
	int key; //密钥
	int len; //长度public:
	Cryption(int tk, int tt[], int n); //参数依次对应密钥、明文、长度
	void encrypt(); //加密
	void print() //打印,无需改造
	{
		int i;
		for (i = 0; i < len - 1; i++)
		{
			cout << ctxt[i] << " ";
		}
		cout << ctxt[i] << endl;
	}
};

//支持三种类型的主函数int main()
{
	int i;
	int length; //长度
	int ik, itxt[100];
	double dk, dtxt[100];
	char ck, ctxt[100];
	//整数加密
	cin >> ik >> length;
	for (i = 0; i < length; i++)
	{
		cin >> itxt[i];
	}
	Cryption<int> ic(ik, itxt, length);
	ic.encrypt();
	ic.print();
	//浮点数加密
	cin >> dk >> length;
	for (i = 0; i < length; i++)
	{
		cin >> dtxt[i];
	}
	Cryption<double> dc(dk, dtxt, length);
	dc.encrypt();
	dc.print();
	//字符加密
	cin >> ck >> length;
	for (i = 0; i < length; i++)
	{
		cin >> ctxt[i];
	}
	Cryption<char> cc(ck, ctxt, length);
	cc.encrypt();
	cc.print();

	return0;
}

输入

第一行输入整数类型的信息,包括密钥、长度、明文

第二行输入浮点数类型的信息,包括密钥、长度、明文

第三行输入字符类型的信息,包括密钥、长度、明文

输出

三行分别输出三种类型的密文

样例查看模式

正常显示查看格式

输入样例1 <-复制

输出样例1

#include<iostream>
using namespace std;
//只支持整数类型的加密类界面
template<class t>
t max(t* a, int b)
{
    t max = a[0];
    for (int i = 0; i < b; i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }
    return max;
}
template<typename T>
class Cryption
{
private:
    T ptxt[100]; //明文
    T ctxt[100]; //密文
    T key; //密钥
    int len; //长度
public:
    Cryption(T tk, T tt[], int n)//参数依次对应密钥、明文、长度
    {
        key = tk;
        for (int i = 0; i < n; i++)
        {
            ptxt[i] = tt[i];
        }
        len = n;
    }
    void encrypt() //加密
    {
        T Max1 = max(ptxt, len);//得到最大的数
        for (int i = 0; i < len; i++)
        {
            ctxt[i] = Max1 - ptxt[i] + key;
        }
    }
    void print() //打印,无需改造
    {
        int i;
        for (i = 0; i < len - 1; i++)
        {
            cout << ctxt[i] << " ";
        }
        cout << ctxt[i] << endl;
    }
};

//支持三种类型的主函数
int main()
{
    int i;
    int length; //长度
    int ik, itxt[100];
    double dk, dtxt[100];
    char ck, ctxt[100];
    //整数加密
    cin >> ik >> length;
    for (i = 0; i < length; i++)
    {
        cin >> itxt[i];
    }
    Cryption<int> ic(ik, itxt, length);
    ic.encrypt();
    ic.print();
    //浮点数加密
    cin >> dk >> length;
    for (i = 0; i < length; i++)
    {
        cin >> dtxt[i];
    }
    Cryption<double> dc(dk, dtxt, length);
    dc.encrypt();
    dc.print();
    //字符加密
    cin >> ck >> length;
    for (i = 0; i < length; i++)
    {
        cin >> ctxt[i];
    }
    Cryption<char> cc(ck, ctxt, length);
    cc.encrypt();
    cc.print();

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值