練習問題解答例

情報理論 第 13 回
暗号(1)
2015/1/13
練習問題 1
鍵を 0~25 として暗号文" aopz pz h wlu"を復号した結果を表示する Processing のプログラムを
完成させよ。
void setup(){
size(250, 350);
}
void draw(){
background(255);
fill(0);
for (int i=0;i<26;i++){
text(i+":"+shiftedString("aopz pz h wlu", i),
20+(i/13)*100, (i%13+1)*25);
}
}
String shiftedString(String str, int key){
char s[]=str.toCharArray(); // 文字列を文字の配列に変換
for (int j=0;j<s.length;j++){
for (int i=0;i<key;i++){
if (s[j]>='a' && s[j]<='z'){
s[j]++;
if (s[j]>'z')
s[j]='a';
}
}
}
return new String(s); // s を文字列に変換して返す
}
実行結果
1
情報理論 第 13 回
暗号(1)
2015/1/13
練習問題 2
暗号文の書かれたテキストファイルから文字を読み込んで、その出現頻度を表示する Processing のプ
ログラムを完成させよ。
float ratio[]=new float[26];
void setup(){
size(250, 350);
calcRatio("text.txt");
}
void draw(){
background(255);
fill(0);
for (int i=0;i<ratio.length;i++){
text((char)('A'+i)+":"+ratio[i]*100,
20+(i/13)*100, (i%13+1)*25);
}
}
void calcRatio(String filename){
for (int i=0;i<ratio.length;i++){
ratio[i]=0;
}
BufferedReader br=createReader(filename);
try{
int n=0;
String temp;
while((temp=br.readLine())!=null){
println(n);
char s[]=temp.toCharArray();
for (int i=0;i<s.length;i++){
if (s[i]>='a' && s[i]<='z'){
ratio[s[i]-'a']++;
n++;
}
if (s[i]>='A' && s[i]<='Z'){
ratio[s[i]-'A']++;
n++;
}
}
}
br.close();
for (int i=0;i<ratio.length;i++){
ratio[i]/=n;
}
}catch(Exception e){
println("file not found");
}
}
2
情報理論 第 13 回
暗号(1)
2015/1/13
実行結果
3