課題 [9] 文字列(9/9)

問 9(提出プログラム名:ex0909a.c)
※上級クラスは必須(中級クラスはできる人だけでよい)
(いずれも加点対象)

このプログラム(ex0909a.c)をダウンロードし,この中の関数 encodedecode を完成させなさい.

このプログラムでは,最初に 1 行の文を読み込み,関数 encode によってその内容を暗号化する.
その後,別の関数 decode によって暗号文を復号化して元の文に戻す.
なお,この問題では単純なシーザー暗号を利用することとし,以下のルールで暗号化する(復号化は逆となるだけなので説明は省略):
 ●アルファベット大文字の場合:
  文字をアルファベット順で 3 つ後ろの文字に置き換える.ただし,Z の後ろは A と見なす.
  (例)B → E, X → A
 ●アルファベット小文字の場合:
  大文字の場合と同様であるが,アルファベット順で 4 つ後ろの文字に置き換える.
  (例) b → f, x → b
 ●アルファベット以外の場合:
  元のままとする.

ただし,この問題では encodedecode のみを編集することとし,それ以外の部分は変更してはいけません.

【注意】
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 から提出してください.)
くれぐれも各問題で記載されている注意事項や「過去にあったミス」を見落とさないようにしてください.
なお,提出後に間違いに気付いた場合,〆切前であれば差し替え(上書き)は可能です.