目录
要求:
对 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