《C程序设计教程(第四版)——谭浩强》
题目:
例题4.11 译密码。为使电文保密,往往按一定规律将其转换为密码,收报人再按约定的规律将其译回原文。
例如,可以按以下规律将电文变为密码:
将字母A变成字母E,a变为e,即变成其后的第4个字母,W变为A,X变为B,Z变为D
代码:
//《C程序设计教程(第四版)——谭浩强》
//例题4.11 译密码。为使电文保密,往往按一定规律将其转换为密码,收报人再按约定的规律将其译回原文。
//例如,可以按以下规律将电文变为密码:
//将字母A变成字母E,a变为e,即变成其后的第4个字母,W变为A,X变为B,Z变为D
#include <stdio.h>
#include <stdlib.h>
int bianyi(char arr1[]);//将密码编译为原文
int main()
{
char arr[100];//充足的原文空间
int size=0;
int panduan=0;
char arr1[]={};
char arr1_1[]={};
int ch='a';
printf("请输入你的编译原文:\n");
scanf("%99s",&arr);// 限制输入字符的数量,防止溢出,最多99个字符 + '\0'
// printf("%s\n",arr);
size=sizeof(arr)/sizeof(arr[0]);
// printf("%d\n",size);
int i=0;
for(i=0;i<=size;i++)
{
if(arr[i]=='\0')
{
break;
}
if((arr[i]>=65 && arr[i]<=90)||(arr[i]>=97 && arr[i]<=122))
{
panduan=1;
if((arr[i]>=65 && arr[i]<=86)||(arr[i]>=97 && arr[i]<=118))
{
arr1[i]=arr[i]+4;
}
else
{
if(arr[i]>=87 && arr[i]<=90)
{
arr1_1[i]=90-arr[i]-3;
arr1[i]=65+abs(arr1_1[i]);
}
else
{
arr1_1[i]=122-arr[i]-3;
arr1[i]=97+abs(arr1_1[i]);
}
}
}
else
{
panduan=0;
break;
}
}
//判断密码是否接受,是否无效,当panduan为1时,接受密码;当panduan为0时,输出无效!!!
if(panduan==1)
{
printf("将译文转化为密码的内容是:%s\n",arr1);
}
else
{
printf("!!!您的原文输入无效,请重新输入!!!\n");
}
printf("\n");
printf("**********************************************\n");
printf("你是否为收报人,是否想对接受到的密码进行编译!\n");
printf("********************注意**********************\n");
printf("******编译请按y键,不想编译为原文请按n键******\n");
printf("**********************************************\n");
printf("\n");
getchar();
ch=getchar();
if(ch=='y')
{
printf("编译的原文:\n");
bianyi(arr1);
}
else
{
printf("结束程序\n");
}
return 0;
}
int bianyi(char arr1[])//将密码编译为原文
{
int panduan1=0;
// char arr1_2[];
// printf("%s",arr1);
int j=0;
for(j=0;j<=100;j++)
{
if(arr1[j]=='\0')
{
break;
}
if((arr1[j]>=65 && arr1[j]<=90)||(arr1[j]>=97 && arr1[j]<=122))
{
panduan1=1;
if((arr1[j]>=69 && arr1[j]<=90)||(arr1[j]>=101 && arr1[j]<=122))
{
arr1[j]=arr1[j]-4;
}
else
{
if(arr1[j]>=65 && arr1[j]<=68)
{
arr1[j]=arr1[j]+22;
}
else
{
arr1[j]=arr1[j]+22;
}
}
}
}
//判断密码是否接受,是否无效,当panduan1为1时,接受密码;当panduan1为0时,输出无效!!!
if(panduan1==1)
{
printf("将译文重新转化为密码:%s\n",arr1);
}
return 0;
}
运行结果:
编写代码中遇到的问题:
数组名本身就是地址,不需要使用取地址符&。
【错误做法】
【正确做法】