
プログラミングについておききしたいのですが、
ライントレースで左右のカーブを曲がる際に
変数を使って、「さっきは右に曲がったので次は右から曲がる」や
「さっきは左に曲がったから左から曲がる」といったプログラムは
どのようにつくったらいいのでしょうか?
まだ初心者なので変数をうまく使えなくて悩んでいます。
よろしくお願いします。
今のところ下記のような感じにできているのですが
修正点や加えた方がいい点、省略できる点はありますでしょうか?
よろしくお願いします。
mainの上は省略させて頂きました。
int main(void)
{
int R = 0;
while(1) {
if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです
while(GetTouch(CH_2) == 0);
MotorPower(CH_B|CH_C, 0);
while(GetTouch(CH_2) == 1);
while(GetTouch(CH_2) == 0);
MotorPower(CH_B|CH_C, 40);
while(GetTouch(CH_2) == 1);
}else{ //ここからライントレースの内容です
clock_t start,end;
clock_t start2,end2;
if (GetSensor(CH_3) > kuro && R == 0) {
start = clock();
migi(CH_B|CH_C);
while(GetSensor(CH_3) > kuro){
end = clock();
start2 = clock();
if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){
hidari(CH_B|CH_C);
while(GetSensor(CH_3) > kuro);
end2 = clock();
MotorPower(CH_B|CH_C,40);
R = 1;
break;
}
while( R == 1 ){
if(GetSensor(CH_3) > kuro){
hidari(CH_B|CH_C);
while(GetSensor(CH_3) > kuro);
MotorPower(CH_B|CH_C,40);
R = 0;
break;
}else {
if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){
migi(CH_B|CH_C);
while(GetSensor(CH_3) > kuro);
MotorPower(CH_B|CH_C,40);
}//ifのカッコ
}//whileのカッコ
}//elseのカッコ
}//whileのカッコ
}//ifのカッコ
}//elseのカッコ
}//whileのカッコ
}//mainのカッコ
No.1ベストアンサー
- 回答日時:
○コメントが少ない
何が目的で、どんな考えでこう書いてあるのか、よくわかりません。
よくわからないので、改善点の提案もできません。
例えば if(GetSensor(CH_3) > kuro){ ですが。
kuro と判定してるので、黒かどうかを判定していることは予想できます。
ですが、この判定は 黒のときTrueなのか、黒でないときTrueなのか、どちらの意味かがわかりません。
○同じ処理を何度も書いている
「同じことを3度書いたら、マクロか関数にしろ」という格言があります。
例えば、何度も出てくる GetSensor(CH_3) > kuro)ですが、この判定をマクロや関数にして
if ( isBlack() ) (もしかしたらはisWhite?) 等と書けば、次のメリットがあります。
・文字が減らせる。
・意味がわかる。→コメント代りになる
さらに抽象的にして onLine() (線上にいる) 等とすると、何を意味するかがはっきりする
・判定方法が変わっても、一箇所直すだけで全体に反映させることができる
例えば、 精度向上のためにセンサーを増やして、複合的に判定させようとします。
「CH_3のセンサーが>kuro かつ CH_4のセンサーが<kuro」になったとして現状どこを変更すればいいか、わかりますか?
○main関数に全部の処理を書く
mainプログラムには、全体の流れだけを書くようにします。
int main(){
while(1) { // メインループ
動作スイッチ待ち();
if ( 交差点 ) {
前回曲った方向記録 = 曲がる(前回曲った方向記録) ;
} else {
直進する();
}
}
}
// さっき曲がった方向を指定→実際に曲った方向を返す関数
左右記録型 曲がる(さっき曲がった方向) {
if ( さっき曲がった方向=左 ) {
左に曲がる();
return 左;
} else {
右に曲がる();
return 左;
}
}
あってるかどうかわかりませんが、例えば、こんな感じになると思います。
これだと、何をしているか、よくわかるのではないでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングC言語についての...
-
このC#プログラムの1〜11を埋め...
-
ループを途中で抜けたいのですが。
-
Delphiで・・・
-
do-while文が禁止される理由
-
プログラムで関数は使わない方...
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
プログラミング python
-
EXCEL AVEREGE関数について
-
C言語の問題です。 標準入力 (...
-
入力された数字を大きい順に並...
-
画面上をクリックするとクリッ...
-
プログラム作成教えてください...
-
Excelで1つしかない値だけを抽...
-
プロセシングの質問です。
-
Excelセルに入力された文字の色...
-
このプログラミングの問題の2つ...
-
C言語の課題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
C言語forループが完結した場合...
-
ループを途中で抜けたいのですが。
-
入力した数値を倍々するプログラム
-
エクセルVBAで Do While (1)って?
-
UWSCにてある一定の動作を無限...
-
break文でループを一気に抜ける...
-
Excel VBAで年度をまたぐ期間の...
-
プログラムで関数は使わない方...
-
PAD図の書き方
-
C言語、whileループを抜け出す...
-
VBScriptでSQLに接続し、CSV出...
-
プログラムの解説をお願いします。
-
Delphiで・・・
-
clock関数を利用した時間計測法...
-
__asm int 3でのブレイクポイン...
-
入力した文字列から母音だけを...
-
ループの特定入力終了
-
Cプログラムが終了しない
-
if文の中にfor文なのか、for文...
おすすめ情報