1. 程式人生 > 其它 >BUAA(2021春)加密檔案——分步驟一步一步有邏輯性完成

BUAA(2021春)加密檔案——分步驟一步一步有邏輯性完成

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