BUAA(2021春)加密檔案——分步驟一步一步有邏輯性完成
阿新 • • 發佈:2021-05-01
BUAA資料結構第二次程式設計題——加密檔案
看前須知
第二次上機題彙總
題目內容
問題描述
有一種加密方法為:其使用一個字母串(可以含重複字母,字母個數不超過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