C语言典型例题59

《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;
}

运行结果:

编写代码中遇到的问题:

数组名本身就是地址,不需要使用取地址符&

【错误做法】

【正确做法】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值