プログラミングについておききしたいのですが、
ライントレースで左右のカーブを曲がる際に
変数を使って、「さっきは右に曲がったので次は右から曲がる」や
「さっきは左に曲がったから左から曲がる」といったプログラムは
どのようにつくったらいいのでしょうか?
まだ初心者なので変数をうまく使えなくて悩んでいます。
よろしくお願いします。
今のところ下記のような感じにできているのですが
修正点や加えた方がいい点、省略できる点はありますでしょうか?
よろしくお願いします。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# 現在プログラムを作っているのですが、実行したときに写真のように結果が表示されるのですが、これを CH 2 2023/01/18 16:22
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- 大学受験 高校化学の有機分野です。 この構造式で表される立体異性体は3種類ですが この場合ってc=cに結合して 3 2022/09/28 11:14
- Ruby power BI クエリエディター 〇〇を含む文字列置換 1 2022/10/16 17:34
- 化学 応えを教えてください 1 2023/08/06 17:39
- YouTube YouTubeの映画解説ch等で出現する映画のワンシーンの映像は違法ですか? 3 2023/01/10 04:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
if文でスキップしたい場合は?
-
入力した文字列から母音だけを...
-
プログラミングC言語についての...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語のwhile()文での大括弧の...
-
C言語forループが完結した場合...
-
C言語初心者です。このプログラ...
-
C言語 数字を削除する関数
-
getchar()の記述
-
無限ループ対策
-
独習C 素数テスタ・・・分から...
-
C言語 while文 無限ループ 不可...
-
ループの特定入力終了
-
C言語について
-
COBOLのEVALUATE文
-
H8/3048マイコンAD/DA変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報