作者maxcsh (ㄚ翰)
看板b97902HW
標題[心得] 鋼彈HW6-The mission
時間Wed Nov 19 00:21:20 2008
呼呼!
在廢掉了一整個晚上,從下課後一直到十點,都宅在219被鋼彈屠宰、
費盡了九牛二虎之力、晚餐都沒吃的弱者我,終於把它解決了!
所以就在此提供一些小小心得啦!
(先聲明我不是強者,我也是跟大家一樣剛接觸C語言的新手,所以如果
有方法比較笨或打錯,請多多包涵,以下給各位參考看看)
---------------------------廢話分隔線-----------------------------
----------------------------以下正題------------------------------
首先,是第一個步驟,也就是分析字串,一開始的測資有兩行,
分別是
[IDENTIFIER_LR NUM]+
以及
[IDENTIFIER_ST IDENTFIER_LR INDEX]+
其中[...]+的意思是指,每個[]為一組,[]可以重複出現;
Ex.
Left 5 Right 5 Left 5 Right 5 Left 4
Start Right 4 Start Left 3 Target Right 4
像這樣子的input。
0.前置動作;
我們必需做的,就是
把它們切開,切開的方法有很多,
像sscanf(),strtok(),for loop...等等,課本或投影片裡應該找得到,
/*sscanf()已經可以用了,之前用它寫然後傳上去拿零分
的同學們可以不用像我一樣砍掉重練,直接用就行了。
建議是用sscanf()寫會比較方便,for loop也OK,
用strtok()的話要小心會當掉。 */
然後把切開的東西存起來,
一組一組來判斷,
比方說,
"Left 5",
"Right 5",
"Left 5",
"Right 5",
"Right 4"
"Start Right 4",
"Start Left 3",
"Target Right 3"
這樣分組判斷。
原則上只要for加上一堆if,else if,else等等就可以解決。
重要的是,只要判斷出現
Error的話,就立刻把它印出來,
所以
Error Message可以不只一個!
1.有關(MSG1)的部分:
分析
兩行測資,
//是兩行喔!
第一行主要就是
判斷有沒有重複定義的 Left || Right,
(redifined)
/*注意:出現
Left 5 Left 5 Right 3這種狀況時,並
不算redifined,
要
Left 5 Left 6 Right 3這樣才算。
//Error at line1; Left entry redifined. */
或者是
判斷 Left || Right 的輸入有沒有錯,
(unknown identifier)
例如我打
XD 5 HAHA 5,理論上程式看不懂
XD跟
HAHA,
理所當然就要print出Error啦!
//Error at line1 : unknown identifier XD(LR).
//Error at line1 : unknown identifier HAHA(LR).
第二行的部分則是
確認Start || Target有沒有重複出現,
(mutiple point)
/*注意:出現
Start Left 5 Start Left 5 Target Right 3這種狀況時,
,
算mutiple start point,所以請記得要輸出Warning喔!
*/
以及
確認輸入的東西有沒有錯,這部分就跟第一行的差不多囉。
//提示:助教的程式是先判斷Start || Target,再判斷Left || Right
/*注意:當print這個;
Error at line1: unknown identfier STRING(LR).
或 Error at line2: unknown identfier STRING(LR).
或 Error at line2: unknown identfier STRING(ST).
的時候,
請記得在STRING後面加上(LR) ||
(ST)。
不要像我呆呆的只印STRING出來.
還有STRING是input進去的錯誤訊息!也別呆呆的就印"STRING"出來
另外請注意輸出的順序! */
(MSG1)處理完畢後,
if 出現Error,你就可以return拿分數(結束程式),
else 請繼續處理(MSG2)的部分。
/*提醒:如果只有出現Warning的話,請不要終止程式!,繼續(MSG2)!*/
2.有關(MSG2)的部分;
主要是
判斷Start point以及Target point存不存在,
還有
判斷它們究竟有沒有效。
所以如果說有mutiple point的話是算它存在的喔!(這也是為什麼Warning可以繼續)
當你在處理完(MSG1)之後,
應該可以確認有沒有輸入Start point || Target point,
例如說
Start Left 5 Start Left 5
這樣就沒有Target point,所以請print
No target point!
又比方說
Left 3 Right 3
Target Left 3 這種狀況,
就要輸出
No start point!
Invalid target point!
//因為左邊只有三間,編號為0,1,2,所以Target Left 3是invalid。
//同樣也要注意輸出順序喔!
(MSG2)處理完了之後,
if 這兩個point其中一個無效或不存在,也無法繼續下去,所以一樣return拿分數。
else 就是要按照 Left X 跟 Right Y 中的 X 及 Y
來讀進最後的測資(theta,d,a,alpha)。
(先Left的部分,再Right的部分喔)
3.有關矩陣的部分:
先讀進X行的(theta,d,a,alpha)
//先Left的部分
以及Y行的(theta,d,a,alpha)
//再Right的部分
讀完之後,就可以
用助教提供的Source code,也就是
DHMatrix(double T[][4],double theta,double d,double a,double alpha);
這個function,讓各位
把每一組(theta,d,a,alpha)轉成T[4][4]的矩陣,
也就是說,丟(T[][4],theta,d,a,alpha)給DHMatrix就會跑出一個T[4][4]的矩陣。
因為最終目的是把起始的(x1,y1,z1)以及終止的(x2,y2,z2)找出來,
所以可以先把所有的4*4矩陣都先乘起來後,再用(0,0,0,1)去乘它。
(不要問我最後那個1怎麼來的,我也不知道,有興趣請找助教謝謝)
例如說:
Left 6 Right 6
Start Right 5 Target Left 1
則
M_Start [4][4]=R5*R4*R3*R2*R1*R0;
M_Target[4][4]=L1*L0;
/*注意:是從最後乘回來喔!矩陣乘法沒有交換律的!*/
其中
LX RX 都是4*4的矩陣(從DHMatrix得到),
也就是說
我們必須寫個程式把所有的矩陣乘起來。
最後的結果則存在M_Start [4][4]
及M_Target[4][4],
然後
R_Start [4]=point[4]*M_Start[4][4];
R_Target[4]=point[4]*M_Target[4];
其中point[4]={0,0,0,1}
//point為1*4矩陣[0,0,0,1]
//這部分助教的Source code中的main function的最後面有,可以參考看看,
最後我們要取的就是
R_Target[4]-R_Start[4]的前三碼,也就是最後的答案。
/*請記得加上0.000000001,不然會出現-0.00喔!*/
助教已經把最新的Test2.exe檔放上去了,請大家多多利用它吧!
(因為之前舊的Test.exe有些電腦不能用,像我的就是。
它對寫這隻鋼彈的幫助可是非常大的喔!)
/*
(MSG1)指的是;
Error at line1: Left entry redefined.
Error at line1: Right entry redefined.
Error at line1: unknown identifier STRING(LR).
Warning at line2: multiple start point.
Warning at line2: multiple target point.
Error at line2: unknown identifier STRING(LR).
Error at line2: unknown identifier STRING(ST).
這七行的相關部分。
而(MSG2)指的是:
No start point!
No target point!
Invalid start point!
Invalid target point!
這四行的相關部分。
*/
最後,如果你覺得你的程式怎麼跑明明都正確,卻拿不到分,
請檢查看看你print出來的MSG部分有沒有拼錯,還有大小寫正不正確喔!
---------------------------以上正題------------------------------
--------------------------廢話又來了-----------------------------
呼呼!終於打完了!
難得PO一次文,有什麼不詳盡或錯的地方,請強者們多多指正!
我還不太會排版,排得不好讓大家看得很累,請多多見諒。
是說一開始助教的測資Output部分Key錯了,還一次四個,
所以傳過的可以再傳一次,說不定就多四分了唷!
測資部分據說挺善良的,沒什麼太畸型的測資,所以不用像我一樣
絞盡腦汁猜測資,多拿點正常測資跟助教的程式比對吧!
謝謝觀賞!
-----------------------------------------------------------------
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.242.90
1F:推 jackwhitekim:第一個滿分!! 是今天上助教課的同伴XD 11/19 00:26
2F:推 martinku:推原PO是暗黑神手 11/19 00:27
3F:推 humanlin:原po高手 11/19 00:29
4F:→ maxcsh:哪有= =,比較瘋狂而已,纏著助教纏到他們發現測資錯誤XD 11/19 00:30
5F:推 sn6783:原PO,神人也 11/19 00:37
6F:推 dennis2030:推原PO是頭香強者! 有這篇幫助太棒了! 11/19 00:40
7F:推 jimmyken793:有強者快拜 11/19 00:51
8F:推 purplebleed:可以說一下哪幾個錯嗎XD~~有怪怪的事情發生了~~ 11/19 01:04
9F:→ maxcsh:本來是1,2,3,10錯啊,現在都修正了 11/19 01:05
10F:→ maxcsh:不過有被測資害到的應該只有我吧= =,多卡了一個半小時 11/19 01:13
11F:→ maxcsh:多補充一點東西,各位看看吧! 11/19 17:14
※ 編輯: maxcsh 來自: 140.112.242.90 (11/19 17:33)
12F:推 dennis2030:太專業了 補充過後又變得更強大了!! 11/19 17:33
13F:推 benck: 原PO是隱.強者 11/19 22:26
14F:推 fereshte: 原PO是隱.強者 11/19 22:48
15F:→ maxcsh:其實樓上兩位才是真正的強者啊= =(修掉XD) 11/19 23:05
16F:推 chenaren:欸 那我的也要修(通通修掉XD) 11/19 23:40
※ 編輯: maxcsh 來自: 140.112.242.90 (11/19 23:43)
17F:推 purplebleed:有人可以提示一下4&&14的狀況嗎??(卡題了= =) 11/20 00:20
18F:→ maxcsh:Left 5 Right 5\ Start Left 5 Start Left 4 Target Left 3 11/20 00:33
19F:推 purplebleed:呵呵~~這種情形你早上跟我說過了XD 11/20 00:36
20F:→ maxcsh:哪有,不一樣喔,拿去跑助教程式試試,會有warning, 11/20 00:37
21F:→ maxcsh:但還是要丟link code(那一串數字)進去喔! 11/20 00:38
※ 編輯: maxcsh 來自: 140.112.242.90 (11/20 00:40)
22F:推 purplebleed:哭~~~還是不給我過~~測資好陰= =||| <-標準耍無賴XXD 11/20 01:08
23F:推 purplebleed:喔YA~AC了!原來是1e-9~跟使徒三一樣= =~~要記得呦 11/20 01:16
24F:→ purplebleed:花了好多時間呦= =~都在找白痴錯誤?(其實是我太笨了) 11/20 01:17
25F:→ maxcsh:啊我忘記講了= =,我以為大家被唬過幾次之後會自動加上去的 11/20 01:23
26F:→ maxcsh:很抱歉,補上了。 11/20 01:23
※ 編輯: maxcsh 來自: 140.112.242.90 (11/20 01:33)
27F:推 godgunman:欸欸你忘記感謝我啦XD 11/20 02:37
28F:→ maxcsh:感謝樓上在我不能用sscanf的時候教我用for loop切開XD 11/20 02:43
29F:推 purplebleed:呵呵~~樓上兩位都是好人耶~~太感謝了XXD 11/20 09:34
30F:推 LoganChien:第 14 除了 1e-9 好像有和 13 一樣的陷阱。(供參考) 11/20 18:34
31F:→ LoganChien:還有,我不太喜歡這一題的題目「說明」,太模糊了... 11/20 18:35
32F:→ LoganChien:還要從 test.exe/test2.exe 去猜題意...。 11/20 18:36
33F:推 LoganChien:有一些狀況(不違反說明),也可以把 test.exe 玩壞。 11/20 18:40
34F:推 chenaren:我看不懂題目耶 @@ 11/20 19:11
35F:→ ewan7954:4*4矩陣目的==>旋轉需要3*3 平移需要3*1 11/20 20:21
36F:→ ewan7954:所以為了使用上方便 將兩個合併成4*4 11/20 20:22
37F:→ ewan7954:所以最下面那一行沒用到 乘出來才變成 X Y Z 1 11/20 20:24
38F:→ ewan7954:今天助教課問的XD 11/20 20:31
39F:推 martinku:卡13、14呢...我有修正浮點數了說@@ 11/20 21:38
40F:推 LoganChien:樓上,你的 Warning 有問題 11/20 21:48
41F:推 LoganChien: 更正:MSG 11/20 22:04
42F:推 AfrikaBoi:請問測資4跟5還是字串的部分嗎? 卡住了 :-( 11/22 01:29
43F:推 purplebleed:是矩陣運算~~~ 11/22 22:02
44F:推 AfrikaBoi:阿 OK 謝謝! 11/23 02:24
※ 編輯: maxcsh 來自: 140.112.242.90 (11/23 16:53)
45F:推 sn6783:感謝強者提醒~~ 我把0.000000001加上去之後馬上多一分XD 11/23 16:58
46F:推 qq123789:請問 Left 0 Left 1 Left 1 算重複幾次啊 總覺得答案有錯 11/23 17:57
47F:推 qq123789:個人認為是一次 助教的 test2 檔 是print 兩次 11/23 18:00
48F:→ maxcsh:兩次,接到Left 0的時候Left就已經被define了,所以是兩次 11/23 18:08
49F:推 qq123789:了解 謝謝啦:) 11/23 18:10
50F:→ maxcsh:小提醒,矩陣做乘法前可能有需要改成單位矩陣, 11/23 18:12
51F:→ maxcsh:還有做乘法暫存的矩陣要記得歸零喔! 11/23 18:12
52F:推 AfrikaBoi:卡11and13的人!第二行有複數歐! 11/24 14:03
53F:推 lch16:幫樓上更正一下..... 有負數 11/24 22:14
54F:推 rppo888:有複數也太驚悚....XDD 11/24 23:43