Jacob Lee 有部分想對您請教(迴圈)

2010-05-28 7:16 pm
您好有部份程式想請教:
疑問在程式的注解裡

程式:
//程式功能:
//撞到障礙物後會後退右轉20次然後反向在執行
//遇到踩空也會後退右轉

#include <ICCI-RV10.H>
//增加2個全域變數和一個函數
short direction = 1;
short hitCount = 1;
void turn(int tolerance, int hitPower);
int turnCount=0;

/*下面是我對於turn的定義*/
void turn(int tolerance, int hitPower)
{
hitCount += hitPower;
if (hitCount > tolerance)
{
direction = 1 - direction;
hitCount = 0;
}
if(hitCount==0)turnCount++;
if (direction)
RIGHT();
else
LEFT();
}

main()
{
while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(13);
//RIGHT();
turn(20, 1);
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(5);
//RIGHT();
turn(20, 1);
delay_100m(5);
}
if(turnCount==1&&hitCount==19)break;
/*這邊我讓他轉向1次加上碰撞19次則跳脫制下一指令!!!*/
else
FORWARD();
}
/*以下即為跳脫迴圈後得下一指令,如果我想讓下面的迴圈BUMPER+FALL的次數到達27次左右(或者28.29次)轉向為RIGHT,不管撞到或掉落,就是將下面的迴圈在達27次後,變為(2)*/
while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
LEFT();
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
LEFT();
delay_100m(2);
}
else
FORWARD();
}
}


while(1)
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
RIGHT();
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
RIGHT();
delay_100m(2);
}
else
FORWARD();
}
}
更新1:

最後一段即為 (2) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } else FORWARD(); } }

更新2:

我在想如果要讓第2個迴圈到達27次左右再跳至下一迴圈 是否還要再定義一個像turn的數值? 然後再用GOTO或者 BRAKE 去跳脫。。。WHILE 還是有更簡單的辦法- -

更新3:

如果東邪大大 有空不知是否可以幫忙解答 我真的超崇拜你們兩位-/- 當時的幫忙 Jacob Lee之前先謝謝你的提醒 應該要提交投票而非刪除

更新4:

東邪 謝謝你的回覆 : 首先我在統整一下 怕大大看不懂我表達很爛= . = 我先分3個部份的迴圈 (1).(2)這邊是在一起的 我要加進去的是(3) 下面我再解釋的更加清楚...以免誤會(上面我所發表的參考就好) --------------------------------------------------------------------------------------------------------

更新5:

#include short direction = 1; short hitCount = 1; void turn(int tolerance, int hitPower); int turnCount=0;

更新6:

void turn(int tolerance, int hitPower) { hitCount += hitPower; if (hitCount > tolerance) { direction = 1 - direction; hitCount = 0; } if(hitCount==0)turnCount++; if (direction) RIGHT(); else LEFT(); }

更新7:

(1) main() { while(1) { if(BUMPER_IN()) { BACK(); delay_100m(13); //RIGHT(); turn(20, 1); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(5); //RIGHT(); turn(20, 1); delay_100m(5); } if(turnCount==1&&hitCount==19)break; else FORWARD(); }

更新8:

(2) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); LEFT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); LEFT(); delay_100m(2); } else FORWARD(); } } -------------------------------------------------------------------------------------------------------

更新9:

(3) while(1) { if(BUMPER_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } if(FALL_IN()) { BACK(); delay_100m(2); RIGHT(); delay_100m(2); } else FORWARD(); } } (這邊和(2)只插在轉的方向left=>right)

更新10:

一. (1) 20個障礙右轉 20個障礙左轉 二. (2) 25個障礙左轉 三. 二結束後跳脫(2)迴圈至(3)一直到結束

更新11:

ANS. turn(20, 1); delay_100m(2); 這個delay的時間,是否剛好控制轉向90度? 若是如此,那麼delay_100m(4);時間拉長一些,是否等同轉了180度? 在第一個迴圈的 delay_100m(5) ,時間較長是故意安排的? 1. (1)部分執行20次會讓int turnCount=0; 變1做記數 delay 0.2秒是代表退後或者是轉向的時間 我的策略是讓它撞到牆就退後1.3秒右(左)轉0.2秒 讓他連中間區塊都可以清理到

更新12:

例如: BACK(); delay_100m(2); 代表說他會退後0.2秒 RIGHT(); delay_100m(2); 右轉0.2秒

更新13:

抱歉耽誤你的時間 因為下午我去觀看場地看是否和我所寫的程式是相符的 很抱歉耽誤到你||| 拍謝惹~

更新14:

三. 我想讓(2)這邊25個障礙然後跳到(3)

更新15:

(1)if(turnCount==1&&hitCount==19)break; 這個地方我是讓他共20+19=39個障礙後跳至(2) (2)功用:延著牆壁走,撞到障礙後退後0.2 秒左轉0.2秒 執行25次後跳脫至(3) 變成撞到障礙後退後0.2秒又轉0.2秒 (原本是說27次 現在我更正為25次)

更新16:

先跟你說抱歉 讓你等這麼久 我數十分鐘後才做補充 sor~ 真的非常謝謝 東邪 我等等吃完飯會在馬上衝去學校 晚上要把這個寫好 弄懂 我會一直到明天早上我都會一直在學校 我大概快20:00會到學校測試 如果正常我會在告訴你 或者我對程式有疑問 想再請教你 因為老師都不太會交 只好求助你和Jacob 先前你有回答過我想說你應該會比較清楚 不然我PO出來都不大有人會回復! 謝謝\~

更新17:

目前 測試一切OK 謝謝ˇ~ 我正再看一下大大的程式 等等沒問題我就選最佳解答惹~ ""完全有點傻眼 和原先寫的東西有一段差距 差真多-.-""

回答 (4)

2010-05-29 1:43 am
✔ 最佳答案
你的程式流程大概如下:
一、
20個障礙右轉
20個障礙左轉

二、
27個障礙左轉

三、(即是(2))
維持障礙右轉?

以上歸納是否正確?若有誤,請述明。

最好把問題需求儘量具體述明,如此才能較完備的答覆。
(這個問答平台對「程式類」的貼文存在太多不合理的限制)

2010-05-28 14:40:23 補充:
一個疑問:
turn(20, 1);
delay_100m(2);

這個delay的時間,是否剛好控制轉向90度?
若是如此,那麼delay_100m(4);時間拉長一些,是否等同轉了180度?

在第一個迴圈的 delay_100m(5) ,時間較長是故意安排的?

2010-05-28 16:26:06 補充:
請儘速回應我上述的問題。
再遲,我另有要事!

2010-05-28 17:43:25 補充:
//程式功能:
//撞到障礙物後會後退右轉20次然後反向在執行
//遇到踩空也會後退右轉

#include <ICCI-RV10.H>

short direction = 1; //turn right
short hitCount = 0;
short turnCount = 0;
void turn(int tolerance, int hitPower);

void turn(int tolerance, int hitPower)
{
hitCount += hitPower;
if (hitCount > tolerance)
{
direction = 1 - direction;
hitCount = 0;
turnCount++;
}
if (direction)
RIGHT();
else
LEFT();
}

main()
{
//(1)
do
{
if(BUMPER_IN())
{
BACK();
delay_100m(13);
turn(20, 1);
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(5);
turn(20, 1);
delay_100m(5);
}
else
FORWARD();
} while (turnCount < 2);

//(2)
//下面的迴圈 BUMPER + FALL 的次數到達 25次,轉向為 RIGHT,
direction = 0; //turn left
hitCount = 0;
turnCount = 0;
do
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
turn(25, 1);
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
turn(25, 1);
delay_100m(2);
}
else
FORWARD();
} while (turnCount < 1);


//(3)
direction = 1; //turn right
hitCount = 0;
turnCount = 0;
do
{
if(BUMPER_IN())
{
BACK();
delay_100m(2);
turn(20, 0); //0: hitCount不遞增,意謂不會改變轉向
delay_100m(2);
}
if(FALL_IN())
{
BACK();
delay_100m(2);
turn(20, 0); //不改變轉向
delay_100m(2);
}
else
FORWARD();
} while (turnCount < 1);
//由於迴圈內永遠不會改變轉向,所以 (3)將是無窮迴圈

}


2010-05-28 18:22:24 補充:
超級爛的「滋事痂」,
竟以字數超過為由,不許再補充內容!

while (1) printf("爛");

2010-05-28 18:33:21 補充:
為了程式的完整性,請略作修飾:

1.
整體變數宣告就好
short direction , hitCount , turnCount ;

2.在main內才定義其值:
在 //(1)之下加這三行
direction = 1; //turn right
hitCount = 0;
turnCount = 0;

這樣做,程式段落分明,有助於日後維護程式。

2010-05-28 18:38:26 補充:
我不用即時通,以表達對「滋事痂」的不滿!

2010-05-28 19:37:16 補充:
迴圈(1)若碰到障礙時的後退不是固定的1.3秒,
而是 .2開始,每撞一次,便延長.2 秒,
那麼機器人的行徑是否會會更廣?

若要改成這功能,是舉手之勞般的容易!

2010-05-28 22:34:01 補充:
剛外出採購今晚的能源--台啤。

do ...while 是後測型的迴圈,至少會執行一次,再視while的條件來決定是否重複。
(條件成立,重覆;不成立,結束)

(1)
direction = 1 右轉
→ 右20 →
direction =1-1=0, 左轉, turnCount=0+1=1
→ 左20 →
direction =1-0=1 右轉, turnCount=1+1=2
此時,while (turnCount < 2) 條件不成立,結束迴圈(1)

2010-05-28 22:41:22 補充:
(2)
direction = 0 左轉
→ 左25 →
direction =1-0=1 右轉, turnCount=0+1=1
此時,while (turnCount < 1) 條件不成立,結束迴圈(2)

(3)
direction = 1 右轉
→ 右 →
由於呼叫 turn 時,hitPower為0,故永遠不會轉向,turnCount 也無遞增的機會,一直保持是0,
因此,while (turnCount < 1) 條件永遠成立,迴圈(3)不斷重覆。

2010-05-28 22:51:23 補充:
>最後這邊while (turnCount < 1);是否可加可不加反正不再會轉向

不能省略,迴圈3 的條件雖也可用 while (1)取代,
但就程式的擴充性而言,用while (turnCount < 1) 較佳。

我把程式調整成如此的段落分明,是為了讓易於瞭解其運作,更重要的是讓你比較容易去調整關鍵的一些數據。

2010-05-30 18:04:02 補充:
老J,巷裡人講內行話!

君隱桃花島,虛無又漂渺,
生平無所傲,唯佑台灣好。
2010-05-31 12:05 am
我看你向東邪要個地址,空運三千箱台啤去好了!

我只知道他住桃花島!

2010-05-30 16:32:59 補充:
對了,東邪:

品陳 2010-05-28 11:23:01 寄來的信,
我在 2010-05-30 07:19 收到了!
計:43小時55分59秒!

email 若以光速發送,我住的地方約距地球 316.95 AU,
約冥王星的八倍遠!

看來,email 不是用光速發送的!好險!
無論如何,證實了一件事:
 老邪,您住的桃花島應該比我住的地方靠近台灣!
2010-05-29 2:29 am
ㄏ 東邪 好有趣

while (1) printf("爛");

我的即時通 :kill22890z
MAIL:[email protected]
這個問題結束我不會在即時通麻煩你
或者你說要刪除我會刪除
看你覺得是否妥當這樣比較方便跟你做交談

這個問題結束後決不會麻煩你

2010-05-28 18:29:58 補充:
還是要我在另外開1個問題 ? 不知你的意見

2010-05-28 18:32:13 補充:
我7:20左右會在學校我會立即做回復

2010-05-28 18:34:40 補充:
恩 謝謝 你的提醒
2010-05-29 12:39 am
大大請等等我整理在po上 大約數分鐘

2010-05-28 16:39:48 補充:
東邪 謝謝你的回覆 :
首先我在統整一下
怕大大看不懂我表達很爛= . =
我先分3個部份的迴圈
(1).(2)這邊是在一起的 我要加進去的是(3)
下面我再解釋的更加清楚...以免誤會(上面我所發表的參考就好)

2010-05-28 20:19:13 補充:
迴圈(1)是會退後1.3秒
迴圈(2)是會退後0.2秒
迴圈2我要讓他貼著牆壁走

2010-05-28 21:43:53 補充:
冏rz 了 真的是爛爛爛.....|||
我有些部分看不懂不知是否可以解釋一下 謝囉~

do是做什麼用的?
也算是迴圈嗎?
也是迴圈只是他會考慮到下面的迴圈指令嗎?
(2)while (turnCount < 2);
(3)while (turnCount < 1);
這邊我不太懂事怎麼定義得
最後這邊while (turnCount < 1);是否可加可不加反正不再會轉向

2010-05-28 21:52:18 補充:
turnCount++;他是什麼意思? 他是怎麼做記數的
我大略知道大大寫的程式了
我想:一開始do(1) turnCount轉向1次 turnCount=1
執行完後判斷到(2) 確實符合turnCount=2則執行(2)
turn(25,1)
因為這邊將
direction = 0; //turn left
hitCount = 0;
turnCount = 0;

然後do完1次後確實符合(3 則執行最後一段
我有哪裡說錯嗎? 請幫我糾正
PS.有點不懂do的意義和while插在哪

2010-05-28 22:54:47 補充:
不過真的分析的很清楚 程式的各段落只能用兩字形容"清楚!!"

2010-05-31 20:14:01 補充:
請問桃花島? 是大陸那邊的桃花島嗎?
3000箱台啤馬上幫您運到請留下您的地址:
_____________________________________
謝謝您的幫助~也謝 謝J哥 -u-


收錄日期: 2021-04-26 21:08:18
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20100528000010KK02340

檢視 Wayback Machine 備份