- 追加された行はこの色です。
- 削除された行はこの色です。
*switch文を用いたプログラム [#l6b4bfcd]
**プログラム内容 [#e231c46d]
#define LB 42 // 閾値を42にするつもりで、LBと設定
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT);
int pt = 0;
while(1){
if((SENSOR_1 >= LB) && (SENSOR_3 >= LB)){
pt = 1; // センサーがどちらも白と判断している場合モード1に移行
}else if((SENSOR_1 < LB) && (SENSOR_3 >= LB)){
pt = 2; // センサーの左側が黒と判断されている場合モード2に移行
}else if((SENSOR_1 >= LB) && (SENSOR_3 < LB)){
pt = 3; // センサーの右側が黒と判断されている場合モード3に移行
}else if((SENSOR_1 < LB) && (SENSOR_3 < LB)){
pt = 4; // センサーがどちらも黒と判断している場合モード4に移行
}
if(SENSOR_2 == 1){
pt = 5; // タッチセンサーが押された場合モード5に移行
}
switch(pt){
case 0:
case 1: // モード1
OnFwd(OUT_A+OUT_C);
break;
case 2: // モード2
OnFwd(OUT_C);
OnRev(OUT_A);
break;
case 3: // モード3
OnFwd(OUT_A);
OnRev(OUT_C);
break;
case 4: // モード4
OnFwd(OUT_A);
OnRev(OUT_C);
break;
case 5: // モード5
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(175);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(175);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(50);
OnFwd(OUT_A+OUT_C);
break;
}
}
}
***プログラムの説明 [#y2ebeff1]
-こちらのプログラムは少し嗜好をこらしてみました。(ただ単プログラムを書いた人が、昔やっていたC言語の名残でついこうなってしまったというのもありますが、これはこれでおもしろいからいいのかな、と思っています。だからプログラム設計者は全く後悔していませんよ、えぇそうですとも!!)
-まず、define文で閾値を設定した後、各センサータイプの定義をそれぞれ行い、while(1)で無限ループを構築しています。
-次からが問題です。上のプログラム内でもコメントで書いてありますが、ptという関数にそれぞれの状態の時に各数値を代入します。この行動自体はごく普通なのですが。
-その後、switch文を用いて各モードに移行するようになっています。
-switch文というのは、switchの意味を考えて頂ければ分かるとおり、ある場所からスイッチが入ると入ったスイッチの番号のところに書いてある処理を行います。上のプログラムの場合、switch(pt)となっており、この『pt』がスイッチの働きをしています。プログラム内ではif文を用いて『pt』にある条件のときに各数値を代入しスイッチとしての役割を行っています。
-例えば光センサーがどちらも白と判断していた場合、if文では『pt』に『1』を代入しています。そして、switch文を見ると、『pt=1』の場合どちらのモーターも正転しており、光センサーがどちらも白判定をしている場合、『直進しろ』という命令を出しているわけです。