それでは問題11の解答例「password.c」の解説をしましょう。問題11で定めるキーワードには、英小文字、英大文字、数字を含む約束になっています。このような問題を解決するテクニックにフラグ(Flag:旗)があります。
ここでは、英小文字、英大文字、数字のフラグを用意して、もし英小文字を発見したら英小文字のフラグを立てます。同様に英大文字のフラグと数字のフラグを機能させて、最後に3つのフラグが立っていたらパスワードとしての条件は満たされることになります。
各フラグは旗が立っているか寝ているかの2値ですから、ビットで割り当てることができます。password.cでは、変数flgの各ビットを、下図のように割り当てています。
さてCプログラムでビットを立てるために、ビット毎の論理OR演算子(|)を使います。
password.cの4行目から7行目の
#define CH_LOWER 1 #define CH_UPPER 2 #define CH_NUMBER 4 #define CH_OTHER 8
で、各ビットがセットされた(フラグが立っている)数値を定義して、20行目から23行目
if (islower(ch)) flg |= CH_LOWER; else if (isupper(ch)) flg |= CH_UPPER; else if (isdigit(ch)) flg |= CH_NUMBER; else flg |= CH_OTHER;
で、chが英小文字だったらビット0をセットし、英大文字だったらビット1を、数字だったらビット2をセットします。
問題11では英小文字、英大文字、数字以外の文字は含まない約束になっているので、それ以外の文字ではビット3をセットし、もしビット3が立っていたらパスワードとは認めません。
26行目のif文
if ((flg == CH_WORD) && (len >= 6 && len <= 12))
がその判定で、問題11のパスワードの条件である
を一度に判断しています。
それでは、次回の宿題です。
2つの引数の最大公約数を返す関数 gcd(Greatest Common Divisor)を作り、それを使ってキーボードから入力した2数の最大公約数を表示します。
⇒解答と解説は次回
Copyright © ITmedia, Inc. All Rights Reserved.