說明: 為確保傳輸資料的安全,常將資料編碼加密後傳輸。以偏移與置換二種方式編碼,
本題採偏移與置換編碼規則如下:(每次編碼加密以一個句子或一個單字為主。位移
值為N,傳輸資料只有大寫A-Z 共26 個英文字母與”*”表示空白,”**”表示開始
碼,”***” 表示結束碼,每次編碼需要有開始碼與結束碼。)
1. 偏移量:以 A、B、C、D、E、F……X、Y、Z、A、B…..循環方式,A 偏移量2
則為C,A 偏移量3 則為D,Y 偏移量2 則為A。如BOOK(明碼)經偏移量值4 處
理後為FSSO。偏移量為編碼句子(單字)的字母數除以10 之餘數。如編碼句子(單
字)為BOOK 有4 個字母則偏移量是4,編碼句子(單字)為THIS IS A BOOK 有11
個字母則偏移量是1。
2. 加密編碼步驟如下:
2-1.編碼1:轉換成”偏移編碼值”, 如下表1,A 為65。則FSSO 為70838379。
2-2.編碼2:阿拉伯數字轉成小寫英文字,a 為0,b 為1,餘如下表2。如70838379
為 haididhj 為 BOOK 偏移量4 的加密編碼結果。
3. 編碼字母數:此次編碼偏移量。編碼最後加入所編碼的字母個數,並加上#。如編
碼句子(單字)BOOK 有4 個字母,依下表2 則為#e。
表 1 偏移編碼值
A B C D E F G H I J K L M
65 66 67 68 69 70 71 72 73 74 75 76 77
N O P Q R S T U V W X Y Z
78 79 80 81 82 83 84 85 86 87 88 89 90
表 2 阿拉伯數字0-9 對應表
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j
輸入格式:明碼文字(大寫英文字母)。
輸出格式:加密編碼結果。
輸入範例 1:BOOK
輸出範例1:**haididhj#e***
輸入範例 2: BOOKS
輸出範例2:
**hbieieiaii#f***
輸入範例 3: THIS IS A BOOK
輸出範例3:
**ifhdheie*heie*gg*ghiaiahg#bb***
Private Sub Form_Load()
回覆刪除Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Input #1, x
a = Replace(x, " ", "*")
b = Replace(x, " ", "")
n = Len(a): r = Len(b)
m = r Mod 10
txt = "abcdefghij"
For i = 1 To n
k = Mid(a, i, 1)
If k <> "*" Then k = Asc(k) + m
Max = Max & k
Next i
For i = 1 To n + r
p = Mid(Max, i, 1)
If p <> "*" Then
ans = ans & Mid(txt, p + 1, 1)
Else
ans = ans & p
End If
Next i
For i = 1 To Len(r)
k = r Mod 10
ans2 = Mid(txt, k + 1, 1) & ans2
r = r \ 10
Next i
Print #2, "**" & ans & "#" & ans2 & "***"
Close #1
Close #2
End Sub
阿瑋好,
回覆刪除起先以為
for i = 1 to n+r
這一行怪怪的,後來仔細想想,是對的。
但是,似乎還是要將Max整個字串給處理完,直接用
for i = 1 to len(Max)
不是比較單純嗎。
Dim St As String
回覆刪除Private Sub Form_Load()
Open App.Path & "\in.txt" For Input As #1
Open App.Path & "\out.txt" For Output As #2
Do While Not EOF(1)
ans = "**"
Input #1, St
ct = Len(St)
For i = 1 To Len(St)
If Mid(St, i, 1) = " " Then ct = ct - 1
s = Right(ct, 1)
Next i
For i = 1 To Len(St)
strin = "abcdefghij"
If Mid(St, i, 1) = " " Then
ans = ans & "*"
Else
C = Asc(Mid(St, i, 1)) + s
If C > 90 Then C = C - 26
C1 = Left(C, 1) + 1
C2 = Right(C, 1) + 1
If C1 > 10 Then C1 = C1 - 10
If C2 > 10 Then C2 = C2 - 10
ans = ans & Mid(strin, C1, 1) & Mid(strin, C2, 1)
End If
Next i
ans = ans & "#"
For i = 1 To Len(ct)
k = Mid(ct, i, 1) + 1
ans = ans & Mid(strin, k, 1)
Next i
Print #2, ans & "***"
Loop
Close #2
Close #1
End Sub