CS50--Week2:Encrypt
1.通过将其中的每个字母都移动相同的位置来“加密”,要求大写字母还是大写,小写还是小写,其他字符保持不变。
示例如下:
c中没有字符串变量,利用字符数组,再针对大小写分别加密设置即可。
#include//加密 void main() { int total_c = 30; char str1[30]; char str2[30]; int cipher = 13;//密码 //初始化 cipher = cipher % 26; for (int k = 0; k < total_c; k++) { str1[k] = '\0'; str2[k] = '\0'; } gets(str1); for (int i = 0; i < total_c; i++) { if (str1[i] >= 65 && str1[i] <= 90)//大写字母 { if ((int)str1[i] + (int)cipher < 65 || (int)str1[i] + (int)cipher > 90)//判断是否超出字母限制 str2[i] = str1[i] + cipher - 'Z' + 'A' - 1; else str2[i] = (char)((int)str1[i] + (int)cipher); } else if (str1[i] >= 97 && str1[i] <= 122)//小写 { if ((int)str1[i] + (int)cipher < 97 || (int)str1[i] + (int)cipher > 122) str2[i] = (char)((int)str1[i] + (int)cipher - (int)'z' + (int)'a' - 1); else str2[i] = (char)((int)str1[i] + (int)cipher); } else str2[i] = str1[i]; printf("%c", str2[i]); } }
运行结果:
2.根据上面进一步拓展,如果每位字母移动不同的位数时如何?如下图,假设输入明文为HELLO,密码输入ABC(或abc),ABC.....Z(或abc.....z)分别代表0,1,2.....25,则可以得到密文为HFNLP。
这可以在1中的程序上拓展,这时的密码不能再设成int型,需要利用字符数组来存放。由于密码位数不知道因此需要获取密码的位数及每位对应的值,这里每位对应的值还是如上面一样ABC.....Z分别代表0,1,2.....25,依次循环对明文进行加密,这里需要注意只对大小写字母加密,而不对空格或者标点等其他进行加密。
#include//加密2.0 int main() { int total_c = 30;//数组位数 char str1[30]; char str2[30]; char cipher[30];//密码 int cipher_after[30];//类推后的密码 //初始化 for (int k = 0; k < total_c; k++) { str1[k] = '\0'; str2[k] = '\0'; cipher[k] = '\0'; } printf("plaintext:");//明文 gets(str1); printf("cipher:");//密码 gets(cipher); //获取密码位数n int n = 0; while (cipher[n] != '\0') { n++; } //获取每位密码:a/A=0;b/B=1;以此类推; for (int i = 0; i < total_c; i++) { if (cipher[i] >= 65 && cipher[i] <= 90)//大写65--90 cipher_after[i] = (int)cipher[i] - 65; else cipher_after[i] = (int)cipher[i] - 97; } int k = 0;//表示第几位密码 for (int i = 0; i < total_c; i++) { if (str1[i] >= 65 && str1[i] <= 90)//大写字母 { if ((int)str1[i] + (int)cipher_after[k] < 65 || (int)str1[i] + (int)cipher_after[k] > 90)//判断是否超出母限制 str2[i] = str1[i] + cipher_after[k] - 'Z' + 'A' - 1;//超过则进行修改 else str2[i] = (char)((int)str1[i] + (int)cipher_after[k]);//不超过就直接输出 //对k进行修改 if (k < n - 1) k++; else k = 0; } else if (str1[i] >= 97 && str1[i] <= 122)//小写 { if ((int)str1[i] + (int)cipher_after[k] < 97 || (int)str1[i] + (int)cipher_after[k] > 122) str2[i] = (char)((int)str1[i] + (int)cipher_after[k] - (int)'z' + (int)'a' - 1); else str2[i] = (char)((int)str1[i] + (int)cipher_after[k]); //对k进行修改 if (k < n - 1) k++; else k = 0; } else str2[i] = str1[i]; printf("%c", str2[i]); } return 0; }
运行结果:
题目来源:https://docs.cs50.net/2019/x/psets/2/index.html