BUAA(2021春)加密文件——分步骤一步一步有逻辑性完成

48 篇文章 154 订阅

看前须知

要点介绍和简要声明.

第二次上机题汇总

五子棋危险判断——简单的搜索算法.

字符串替换(新)——朴素的查找和替换.

加密文件——分步骤一步一步有逻辑性完成.

通讯录整理——结构体一级排序.

小型图书管理系统.

题目内容

问题描述

有一种加密方法为:其使用一个字母串(可以含重复字母,字母个数不超过50)作为密钥。假定密钥单词串为feather,则先去掉密钥单词中的重复字母得到单词串feathr,然后再将字母表中的其它字母以反序追加到feathr的后面:
在这里插入图片描述
加密字母的对应关系如下:
在这里插入图片描述
其中第一行为原始英文字母,第二行为对应加密字母。其它字符不进行加密。编写一个程序,用这种密码加密文件。假定要加密的文件名为encrypt.txt及加密后的文件名为output.txt,并假定输入文件中字母全为小写字母,并且输入密钥也全为小写字母

输入形式

从标准输入中输入密钥串,并从文件encrypt.txt中读入要加密的内容。

输出形式

加密后结果输出到文件output.txt中。

样例

【样例输入】

feather
和文件encrypt.txt中内容,例如被加密的文件encrypt.txt中内容为:
c language is wonderful.

【样例输出】加密后output.txt文件中内容为:

a ufqzjfzh xl gpqthmrju.

样例说明

本题只要分模块完成就不是特别难。首先是去重操作,本题由于对时间复杂都要求不高,所以可以采用朴素的时间复杂度为O(N2)的查找去重,先选一个字母,然后把该字母后面的相同的元素全部变为0,之后在遍历一遍,输出非零字母。然后是反序追加,同样也是采用朴素的算法,在去重数组里出现过的字母就不追加,否则就追加,追加完成后变成加密数组。最后是加密,通过加密数组实现就行了。

题解

易错点和难点

参考代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{	
	char s[100];
	char tmp[100];
	char enc[100];
	int i=0,j=0,k=0;
	scanf("%s",s);

	FILE *fp1 = fopen("encrypt.txt","r");
	FILE *fp2 = fopen("output.txt","w");
	if(fp1==NULL||fp2==NULL)
	{
		printf("Can nou find this file");
	}
	else
	{
		//去重 
		int n=strlen(s);
		for(i=0;i<n;i++)
		{
			for(j=i+1;j<n;j++)
			{
				if(s[j]==s[i])//重复设为 0 
				{
					s[j]='0';
				}
			}
		}
		j=0;
		for(i=0;i<n;i++)
		{
			if(s[i]!='0')//重复不输出 
			{
				tmp[j]=s[i];
				j++;
			}
		}  // tmp为去重数组
	
	
		//反序追加 
		n=strlen(tmp);
		memset(s,0,sizeof(s));
		int flag=0;
		for(i=25;i>=0;i--)
		{
			flag=0;
			for(j=0;j<n;j++)
			{
				if(tmp[j]==i+'a')//判断去重数组里面有没有该字母 
				{
					flag=1;
				}
			}
			if(flag==0)
			{
				s[k]=i+'a';
				k++;
			}
		}
		strcat(tmp,s);
		//puts(tmp);
	
		//加密 
		getchar();
		fgets(enc,100,fp1);
		for(i=0;i<strlen(enc);i++)
		{
			if(enc[i]>='a' && enc[i]<='z')
			{
				fprintf(fp2,"%c",tmp[enc[i]-'a']);
			}
			else//**********只对英文字母加密 
			{
				fprintf(fp2,"%c",enc[i]);
			}
		}
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}

补充测试的数据

【样例输入】

uhdhuhdh
和文件encrypt.txt中内容,例如被加密的文件encrypt.txt中内容为:
fclose fprintf fgets getchar

【样例输出】加密后output.txt文件中内容为:

xdqnjy xmktoix xwyij wyidvuk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值