問 9(提出プログラム名:ex0909a.c)
※上級クラスは必須(中級クラスはできる人だけでよい)
(いずれも加点対象)
このプログラム(ex0909a.c)をダウンロードし,この中の関数 encode と decode を完成させなさい.
このプログラムでは,最初に 1 行の文を読み込み,関数 encode によってその内容を暗号化する.
その後,別の関数 decode によって暗号文を復号化して元の文に戻す.
なお,この問題では単純なシーザー暗号を利用することとし,以下のルールで暗号化する(復号化は逆となるだけなので説明は省略):
●アルファベット大文字の場合:
文字をアルファベット順で 3 つ後ろの文字に置き換える.ただし,Z の後ろは A と見なす.
(例)B → E, X → A
●アルファベット小文字の場合:
大文字の場合と同様であるが,アルファベット順で 4 つ後ろの文字に置き換える.
(例) b → f, x → b
●アルファベット以外の場合:
元のままとする.
ただし,この問題では encode と decode のみを編集することとし,それ以外の部分は変更してはいけません.
【注意】
ctype.h で定義されている文字判定の関数(isupper 等)は使ってよいが,その他の文字列関連のライブラリ関数(strlen 等)は使ってはいけません.
ただし,自分で文字列の長さを調べる関数を自作するのは構いません.
【ヒント】
ヒントとしてアルファベット大文字に対する暗号化・復号化について説明します.
いま,char 変数 ch にアルファベット大文字が格納されているとします.
これをアルファベット順で 3 つ後ろの文字に置き換えるには,単純には
ch = ch + 3;
で済みます.なぜなら,文字コードは連続しているので,アルファベットは順番に並んでいるからです.
しかしながら,これだけではアルファベット X, Y, Z についてはうまくいきません.
そこで,いったん ch が表す文字が A から数えて何番目なのかに注目します.
ch - 'A'
により,A が 0, B が 1,…, Y が 24,Z が 25 となります.
そして,これに 3 を加えるわけですが,そのままでは 25 を超えてしまうため 26 で割った余りを使います.つまり,
ch = (ch - 'A' + 3) % 26 + 'A';
とやればアルファベット大文字の暗号化が可能です.
一方,復号化は 3 を引くことになりますが,そのままではマイナスの数になる可能性があります.
そこで,26 で割った余りを使っていることを考慮して,3 を引く代わりに (26-3) を足すということで復号化が可能です.
- 【プログラムの実行結果】(その1)※赤字は実行時にキーボードから入力する内容
英文を入力してください(最大 255 文字):⏎ This is a sample input ⏎ [入力された英文]⏎ This is a sample input⏎ ⏎ [暗号化後]⏎ Wlmw mw e weqtpi mrtyx⏎ ⏎ [復号化後]⏎ This is a sample input⏎
- 【プログラムの実行結果】(その2)※赤字は実行時にキーボードから入力する内容
英文を入力してください(最大 255 文字):⏎ C Programming Exercise Lesson 09 ⏎ [入力された英文]⏎ C Programming Exercise Lesson 09⏎ ⏎ [暗号化後]⏎ F Svskveqqmrk Hbivgmwi Oiwwsr 09⏎ ⏎ [復号化後]⏎ C Programming Exercise Lesson 09⏎
【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
■ 上の実行例と出力が違っていることを見落としている.
■ インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).
問 4 ~問 9 は 6/18(火)12:00 までに提出を済ませてください.※23:59 ではないので注意!
(ex0904a.c ~ ex0909a.c を Moodle から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.
← [ 問 7 (ex0907a.c) ]
← [ 問 8 (ex0908a.c) ]