忍者ブログ
日々の記録
[870] [869] [888] [885] [884] [883] [882] [895] [904] [903] [902]
カレンダー
03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
ブログ内検索
最新コメント
[01/22 皇子]
[11/07 雨昼 塵]
[10/31 BlogPetのくっぴー2号]
[09/01 BlogPetのくっぴー2号]
[08/24 BlogPetのくっぴー2号]
[12/24 BlogPetのくっぴー2号]
[12/17 BlogPetのくっぴー2号]
[12/17 はるな]
[08/25 BlogPetのくっぴー2号]
[08/18 BlogPetのくっぴー2号]
最新トラックバック
プロフィール
HN:
えぞ
年齢:
45
HP:
性別:
男性
誕生日:
1978/06/23
職業:
SE
趣味:
いろいろ
自己紹介:
頭を使うことを比較的好むが、難しいことは不得手。
博覧強記を目指すが、底は浅い。
凝り性な反面、飽きっぽい。
ゲーム好きで、ギャンブル嫌い。
座右の銘
「なるようになる」
「明日できることは今日しない」
カウンター
広告
アクセス解析
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

朝から頭の体操。
問題はこちら。
シーザー暗号

仕様:ファイル1に書かれている文字列を読み込み,シーザー暗号化処理(*)を行い,ファイル2に書き出すプログラムと,ファイル2に書かれた「暗号」を復号してファイル3に出力するプログラム.

(*)シーザー暗号化処理
規則:特定の文字をそれよりも辞書順に特定の数だけ後ろ(もしくは前)にある文字と置き換える.
鍵:辞書順にずらす数値のこと.(正なら後,負なら前とする.
ファイル1を暗号化した時にできるファイル(ファイル2)の名前は,enc_ファイル1とする
ファイル3の名前は,任意につけてよい.
ただし,ファイル1,ファイル2とは重複しないこと.
暗号化プログラムは,ファイル1の名前と「ずらす数」を表している「鍵」をコマンドライン引数としてとる.
例)ファイル1=dat1.txt,鍵=3

復号化プログラムは,ファイル2の名前,ファイル3の名前,鍵をコマンドライン引数としてとる.
例)ファイル2= enc_dat1.txt,ファイル3=dec_dat1.txt,鍵=3
辞書順はASCIIコードを参照すること.
ASCIIコード表は,たとえばこちら.
例)
(平文)This is a pen.
(暗号文:key=1)Uijt!jt!b!qfo/

コード番号32(SPACE)から126(~)までを使用し,加算(減算)することでこの範囲を超える場合は,先頭(SPACE)あるいは最後尾(~)から再計算する.
例1)keyが2のとき,「~(126)」は「! (33)」となる.
例2)keyが-2のとき,「!(33)」は「~ (126)」となる.
ただし,改行コード('\n'=10)は変換しないでそのまま出力する.


暗号
#include <stdio.h>
#include <string.h>
int main(int c,char **v){FILE *i,*o;char l[256],f[256]="enc_";
int j,a,k;if(c!=3)return 1;i=fopen(v[1],"r");strncat(f,v[1],251);
o= fopen(f,"w");if(sscanf(v[2],"%d",&k)!=1)return 1;
while(fgets(l,256,i)!=NULL)for(j=0;l[j]!=0;j++){
a=((l[j]<32)||(l[j]>126))?l[j]:(l[j]-32+k+95)%95+32;
putc(a,o);}fclose(i);fclose(o);return 0;}

復号
#include <stdio.h>
int main(int c,char **v){FILE *i,*o;char l[256];int j,a,k;
if(c!=4)return 1;i=fopen(v[1],"r");o= fopen(v[2],"w");
if(sscanf(v[3],"%d",&k)!=1)return 1;while(fgets(l,256,i)!=NULL)
for(j=0;l[j]!=0;j++){a=((l[j]<32)||(l[j]>126))?l[j]:(l[j]-32-k+95)%95+32;
putc(a,o);}fclose(i);fclose(o);return 0;}

詰めて書いてるけど非常に素直。

拍手[0回]

PR
この記事にコメントする
NAME:
SUBJECT:
COLOR:
MAIL:
URL:
COMMENT:
PASS:
この記事へのトラックバック
この記事にトラックバックする:
忍者ブログ [PR]