字符型数据的运算:如何实现循环加密

目录

要求:

相关知识

字符类型

三目运算符

编程要求

程序实现


要求:

对 26 个大写英文字母进行循环加密,输入一个大写英文字母(明文)和一个整数秘钥,输出用秘钥对该大写英文字母加密后的结果(密文)。

相关知识

存储英文字母需要用到字符型变量。C 和 C++ 将字符类型看成是一种短整型,每个字符数据对应一个整数值。如 Microsoft C++ 中的字符类型的取值集合为 ASCII 字符集, ASCII 为每个合法的字符定义了一个整数,该整数就是该字符在字符类型中的数值表示。

C 和 C++ 中有3种字符类型:char 、signed char 和 unsigned char。

字符类型

类型名名称存储长度表示范围
char字符型1 字节-128 ~ 127
signed char有符号字符型1 字节-128 ~ 127
unsigned char无符号字符型1 字节0 ~ 255

由于 C 和 C++ 将字符类型作为小整数处理,所以可以通过修改一个字符变量中的整数值来修改其中的字符。

在 ASCII 码表中26个大写英文字母是连续顺序排列的,也就是说字符‘B’代表的整数比字符‘A’代表的整数值大1,…… ,字符‘Z’代表的整数值比字符‘Y’代表的整数值大1,所以可以有下面的程序:

char ch = 'B'; // 定义字符变量 ch 并初始化为字符 B ,ch中存储的是 B 对应的整数
ch = ch + 3; // 将 ch 中的整数加 3
cout << ch << endl;
输出结果为:E

输出结果为:E

但是需要注意的是修改字符变量里面的值可能使它对应的字符不再是大写字母(可能是 ASCII 码表中排在大写字母后面的其它字符),这时候我们需要根据条件去完成不同的操作(例如使字符 Z 加1后变成字符 A 和使字符 A 加1后变成字符 B 需要执行不同的操作)。

三目运算符

C 和 C++ 有一个三目运算符,它的一般形式为:

<表达式1> ? <表达式2> : <表达式3> ;

其含义是先计算<表达式1>的值,如果为 true(非0),则计算<表达式2>的值,并把该值作为整个表达式的值;如果为 false(为0),则计算<表达式3>的值,并把它作为整个表达式的值。更直观的表示如下:

if(表达式1)
    表达式2
else
    表达式3

例如,下面的表达式中,如果 ch 是大写字母,则把 ch 赋值给 x,否则把字符 A 赋值给 x:

cin >> ch ;
char x=(ch>='A' && ch<='Z') ? ch : 'A';

其计算过程为:先计算条件表达式ch>='A' && ch<='Z'的值(由于 ACSII 码表中大写字母都是连续排列的,如果满足该条件,则 ch 必然是某一个大写字母)。如果结果为真,则将 ch 的值作为右边表达式的值赋值给 x ;如果为假,则将字符 A 作为右边表达式的值赋值给 x。

编程要求

将26个大写英文字母组成一个圆环(‘A’后面是‘B’,…… ,‘Z’后面是‘A’),将明文字母往前走秘钥设定的步数就得到了密文。例如:秘钥是2时,‘A’加密后得到‘C’,‘Z’加密后得到‘B’。

程序实现

// 包含两种I/O库,可以使用任一种输入输出方式
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
    // c-存储输入的大写字母,d-存储加密后的大写字母
    char c, d;
    // step-秘钥,往前走的步数,大于等于 1,小于 26
    int step;
    // 请在Begin-End之间添加代码,计算密文存入 d 中
    /********** Begin *********/
    cin>>c>>step;
    if(c + step >= 'Z')
    {
        d='A' + (c + step) % 'Z' - 1;
    }
    else{
        d= c + step ;
    }

    //方法2
    //d = (c + step >= 'Z') ? 'A' + (c + step) % 'Z' - 1 : c + step ;
    /********** End **********/
    // 输出密文
    cout << d;
    return 0;
}
输入:S 5 
输出:X

输入:V 15 
输出:K

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XJSFDX_Ali

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值