2J出席番号の正統性検査の考え方

1.大きな流れについての考え方

(1)まず,やることの流れを書いてみると,いつ終わるかわからない流れを書くことができる.
検査文字列を入力してもらう
検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう
検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう
検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう
検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
  :
  :

(2)終了判定のあるところの直前で分ける
検査文字列を入力してもらう

検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう

検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう

検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
検査文字列を入力してもらう

検査文字列が"zzzz"なら終了
検査文字列について出席番号かどうかの検査と結果表示
  :
  :

(3)while構文で作りなおす
検査文字列を入力してもらう
while(検査文字列が"zzzz"でない) {
  検査文字列について出席番号かどうかの検査と結果表示
  検査文字列を入力してもらう
}

(4)もう少しCらしくすると
あらかじめ文字列変数を作っておく char str[100];
(4.1)「検査文字列を入力してもらう」(2か所ある)は次の2行で
printf("2Jの出席番号を入力してください >>");
gets(str);

(4.2)「検査文字列が"zzzz"でない」(while文の条件)を考える

「検査文字列が"zzzz"である」は
 str[0]=='z' && str[1]=='z' && str[2]=='z' && str[3]=='z' && str[4]=='\0'
なので「検査文字列が"zzzz"でない」は
!( str[0]=='z' && str[1]=='z' && str[2]=='z' && str[3]=='z' && str[4]=='\0' )
となる。これは次と同じである。
str[0]!='z' || str[1]!='z' && str[2]!='z' || str[3]!='z' || str[4]!='\0'


    補足
    関数strcmp()を使うと,「検査文字列が"zzzz"でない」(while文の条件)は
    while (strcmp(str,"zzzz")!=0)
    となる。
    関数strcmp()は2つの文字列を引数に取り,等しかったら0を返す。
    「#include <string.h>」が必要


2.検査文字列について出席番号かどうかの検査と結果表示
(1)2Jの出席番号のチェックは次の6点である
str[0]は'2'でなければならない
str[1]は'J'でなければならない
str[2]は'0'以上,'4'以下でなければならない
str[3]は'0'以上,'9'以下でなければならない
str[2]とstr[3]で作られる2桁の値は1以上49以下でなければならない.
str[4]は'\0'でなければならない

(2)str[2]とstr[3]で作られる2桁の値
'6'-'0'=0x36-0x30=6,
'7'-'0'=0x37-0x30=7,
'8'-'0'=0x38-0x30=8,
のように考えられるので,数字を表す文字コードから'0'を表す文字コードを引くと
対象数字文字に対応した数値になる.
そこで,int num;を宣言しておいて,「str[2]とstr[3]で作られる2桁の値」は
num=(str[2]-'0')*10+(str[3]-'0');
であらわされる.

3.正当性を表す変数checkを導入
checkは0か1の2つの値しかとらず,1なら正当,0なら不当状態を表す。
「 int check; /*検査状況 1:正当,0:不当*/ 」このように定義

検査を開始する前にcheck=1にしておく。
検査を開始して,不当が見つかったら,check=0にする。
先頭文字が'2'でなかったら,
check=0にする。
2番目の文字が'J'でなかったら,
check=0にする。
     :
   (ここを自分で考える)

checkを1に戻す手段はないようにしておく。

検査が終了したら,checkの値に従って,"correct" または "incorrect" を表示する。