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" を表示する。